0

It is a long time ago when I used assembly code the last time and I need it now to modify some loader file for a microcontroller.

The file looks like this at the moment:

WD_DISABLE  .set  1    ;set to 1 to disable WD, else set to 0

    .ref _c_int00
    .ref main
    .global code_start
    .global ExitBoot

***********************************************************************
* Function: codestart section
*
* Description: Branch to code starting point
***********************************************************************

    .sect "codestart"
    .retain

code_start:
    .if WD_DISABLE == 1
        LB wd_disable       ;Branch to watchdog disable code
    .else
        LB _c_int00         ;Branch to start of boot._asm in RTS library
        ;LCR main
    .endif

;end codestart section

***********************************************************************
* Function: wd_disable
*
* Description: Disables the watchdog timer
***********************************************************************
    .if WD_DISABLE == 1

    .text
wd_disable:
    SETC OBJMODE        ;Set OBJMODE for 28x object code
    EALLOW              ;Enable EALLOW protected register access
    MOVZ DP, #7029h>>6  ;Set data page for WDCR register
    MOV @7029h, #0068h  ;Set WDDIS bit in WDCR to disable WD
    EDIS                ;Disable EALLOW protected register access
    LB _c_int00         ;Branch to start of boot._asm in RTS library
    ;LCR main

; Cleanup and exit.  At this point the EntryAddr
; is located in the ACC register
    BF ExitBoot, UNC

    .endif

;end wd_disable

;loadApplication:

    ; Cleanup and exit.  At this point the EntryAddr
    ; is located in the ACC register
    ;BF ExitBoot, UNC

;-----------------------------------------------
; ExitBoot
;-----------------------------------------------
;-----------------------------------------------
;This module cleans up after the boot loader
;
; 1) Make sure the stack is deallocated.
;    SP = 0x400 after exiting the boot
;    loader
; 2) Push 0 onto the stack so RPC will be
;    0 after using LRETR to jump to the
;    entry point
; 2) Load RPC with the entry point
; 3) Clear all XARn registers
; 4) Clear ACC, P and XT registers
; 5) LRETR - this will also clear the RPC
;    register since 0 was on the stack
;-----------------------------------------------

ExitBoot:

__stack:    .usect ".stack",0

;-----------------------------------------------
;   Insure that the stack is deallocated
;-----------------------------------------------

    MOV SP,#__stack

;-----------------------------------------------
; Clear the bottom of the stack.  This will endup
; in RPC when we are finished
;-----------------------------------------------

    MOV  *SP++,#0
    MOV  *SP++,#0

;-----------------------------------------------
; Load RPC with the entry point as determined
; by the boot mode.  This address will be returned
; in the ACC register.
;-----------------------------------------------

    PUSH ACC
    POP  RPC

;-----------------------------------------------
; Put registers back in their reset state.
;
; Clear all the XARn, ACC, XT, and P and DP
; registers
;
; NOTE: Leave the device in C28x operating mode
;       (OBJMODE = 1, AMODE = 0)
;-----------------------------------------------
    ZAPA
    MOVL  XT,ACC
    MOVZ  AR0,AL
    MOVZ  AR1,AL
    MOVZ  AR2,AL
    MOVZ  AR3,AL
    MOVZ  AR4,AL
    MOVZ  AR5,AL
    MOVZ  AR6,AL
    MOVZ  AR7,AL
    MOVW  DP, #0

;------------------------------------------------
;   Restore ST0 and ST1.  Note OBJMODE is
;   the only bit not restored to its reset state.
;   OBJMODE is left set for C28x object operating
;   mode.
;
;  ST0 = 0x0000     ST1 = 0x0A0B
;  15:10 OVC = 0    15:13      ARP = 0
;   9: 7  PM = 0       12       XF = 0
;      6   V = 0       11  M0M1MAP = 1
;      5   N = 0       10  reserved
;      4   Z = 0        9  OBJMODE = 1
;      3   C = 0        8    AMODE = 0
;      2  TC = 0        7 IDLESTAT = 0
;      1 OVM = 0        6   EALLOW = 0
;      0 SXM = 0        5     LOOP = 0
;                       4      SPA = 0
;                       3     VMAP = 1
;                       2    PAGE0 = 0
;                       1     DBGM = 1
;                       0     INTM = 1
;-----------------------------------------------

    MOV  *SP++,#0
    MOV  *SP++,#0x0A0B
    POP  ST1
    POP  ST0

;------------------------------------------------
;   Jump to the EntryAddr as defined by the
;   boot mode selected and continue execution
;-----------------------------------------------

    LRETR

;eof ----------

    .end

There is the "LCR main" command, that actually loads an address to the stack and gets it back again in the ExitBoot function. Since I somehow have corrupt data when I use the "LCR main" to boot the application, I would like to use "LB _c_int00" and then somehow push the address in the stack, such that the ExitBoot function can load it, but I'm unsure how I can achieve this.

How can I push the address in the ACC register (since I think this is loaded in the ExitBoot) from a C function?

Edit: The architecture is a TMS320C28x 32-bit fixed-point CPU: https://www.ti.com/lit/ug/spru430f/spru430f.pdf?ts=1656867024651&ref_url=https%253A%252F%252Fsoftware-dl.ti.com%252FC2000%252Fdocs%252Foptimization_guide%252Fintro.html

Peter Cordes
  • 328,167
  • 45
  • 605
  • 847
HansPeterLoft
  • 489
  • 1
  • 9
  • 28
  • 1
    What architecture is this for? There are many different CPUs and microcontrollers, each with their own set of instructions and registers. There are tags for most ISAs, edit to add one. – Peter Cordes Jul 04 '22 at 08:58
  • It is for a TMS320C28x 32-bit fixed-point CPU: https://www.ti.com/lit/ug/spru430f/spru430f.pdf?ts=1656867024651&ref_url=https%253A%252F%252Fsoftware-dl.ti.com%252FC2000%252Fdocs%252Foptimization_guide%252Fintro.html – HansPeterLoft Jul 04 '22 at 09:51
  • What I further found is, that "LB _c_int00" does some essential stuff for the global variables etc., so a call to this function seems to be essential for proper working of everything: https://downloads.ti.com/docs/esd/SPRUI03/the--c-int00-function-slau1312470.html. So somehow I need to be able to call this function and then still call the exit function with the correct jump such that the bootloader can call the application – HansPeterLoft Jul 04 '22 at 10:35

0 Answers0