;; Read the banner string from flash and output it over the serial port. Since
;; we are running from RAM, we can read from the flash directly without having
;; to use the Utility ROM data transfer functions (moveDP0inc, etc...).
move SC.4, #0
move DPC, #0 ; Set pointers to byte mode.
move DP[0], #(stringData * 2) ; Point to byte address of string data.
stringLoop:
move Acc, @DP[0]++
sjump Z, stringEnd
lcall #TxChar
sjump stringLoop
stringEnd:
move DPC, #1Ch ; Set pointers to word mode.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; This portion of the code (addresses 200h and higher) will remain in flash.
org 0200h
stringData:
db 0Dh, 0Ah, "Executing code from RAM....", 00h
scall printVar
scall incrVar
scall printVar
scall incrVar
scall printVar
scall incrVar
move Acc, #0Dh
lcall #TxChar
move Acc, #0Ah
lcall #TxChar
sjump $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Variables stored in RAM (program) space. They can be read using the
;; Utility ROM data transfer functions (such as UROM_moveDP0) and written
;; using the writeDP0 function which remains in flash.
;;
varA:
dw 'A'
;==============================================================================
;=
;= printVar
;=
;= Reads the varA RAM variable value and sends it over the serial port.
;=
printVar:
move DPC, #1Ch ; Word mode
move DP[0], #varA ; Variable's location in UROM data space
lcall UROM_moveDP0 ; Moves variable value into GR.
move Acc, GR
lcall #TxChar
ret
;==============================================================================
;=
;= incrVar
;=
;= Reads the varA RAM variable value, adds 1 to it, and stores it back in RAM.
;=
incrVar:
move DPC, #1Ch ; Word mode
move DP[0], #varA ; Variable's location in UROM data space
lcall UROM_moveDP0 ; Moves variable value into GR.
move Acc, GR
add #1
move GR, Acc
lcall writeDP0
ret
;==============================================================================
;=
;= TxChar
;=
;= Outputs a character to the serial port.
;=
;= Inputs : Acc.L - Character to send.
;=
org 01F0h
move SBUF, Acc ; Send character.
TxChar_Loop:
move C, SCON.1 ; Check transmit flag.
sjump NC, TxChar_Loop ; Stall until last transmit has completed.
move SCON.1, #0 ; Clear the transmit flag.
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; This portion of the code (addresses 200h and higher) will remain in flash.
org 0200h
stringData:
db 0Dh, 0Ah, "Executing code from RAM....", 00h
;==============================================================================
;=
;= WriteRAM
;=
;= This is a routine that can be called by code running in the RAM to load
;= a new value into a byte or word location in the RAM.
;=
;= Inputs : DP[0] - Location to write (absolute starting at 0000h) in RAM.
;= GR - Value to write to the RAM location.
;=
;= Notes : DP[0] must be configured to operate in word or byte mode as
;= desired before calling this function. Following a call to this
;= function, DP[0] must be refreshed before it is used to read data.
;=
writeDP0:
move @DP[0], GR
ret