;----------------------------------------------------------------- ; EX71.ASM SUBROUTINE or PROCEDURE CALL TO void DELAY(unsigned T) ; Parameter Passing via Register ; ; C.P. Diduch 2001 ; ; The main program toggles the state of an LED every N ms. The ; procedure, void DELAY(unsigned N), is called to implement a ; software delay of N milliseconds. The parameter, N, is passed ; via register R0. ; ; Author(s): ; Signature(s): Date: ;----------------------------------------------------------------- ; PROGRAM CONSTANTS ; .EQU TS 50 ; #define TS 50 ; ; ; PROGRAM STACK ; .ORG 0x0000 ; "reserve space for stack in RAM" .DS 5 ; TOS: .DS 1 ; ; ;----------------------------------------------------------------- ; MAIN PROGRAM ; void main(void) { ; .ORG 0x8000 ; "assign the following to ROM" ; ADDL SP, NULL, TOS ; "initialize stack pointer" XOR R2, R2, R2 ; X = 0 ; // Reg. var. in R2. ; ; do { M0: STOREP 0x0002, R2 ; outport(0x0002, X) ; ADDL R0, NULL, 1000 ; T = 1000 ; // Reg. var. in R0. CALL DELAY, RA ; DELAY(T) ; XORL R2, R2, 0x0001 ; X = X ^ 0x0001 ; JMP M0 ; } ; } M1: JMP M1 ; do {} End of Program. ; ;----------------------------------------------------------------- ; PROCEDURE DELAY ; ; Implements a software delay of N milliseconds by invoking a ; delay of 1 ms, N times. The 1 ms delay is implemented by ; decrementing register R1 from TS to 0. TS is a constant chosen ; such that it takes 1 ms to decrement the register to 0. ; Parameter, N, is passed in register, R0. ; ; Registers affected : R0, R1, FL. ; Calls : no procedures. ; Called by : main(). ; Stack depth : 1 word. ; ; Call/linkage sequence : ADDL R0, NULL, 5 ; R0 = 5 ; ; CALL RA, DELAY ; DELAY(R0) ; ; DELAY: ; void DELAY(unsigned N) { SUBL SP, SP, 1 ; DSTOREM (SP), RA ; "save status" : push RA ; D0: SUBL NULL, R0, 0 ; while (N != 0) { JMPZ D3 ; ADDL R1, NULL, TS ; R1 = TS ; ; D1: SUBL NULL, R1, 0 ; while (R1 != 0) { JMPZ D2 ; SUBL R1, R1, 1 ; R1 = R1 - 1 ; JMP D1 ; } ; D2: SUBL R0, R0, 1 ; N = N - 1 ; JMP D0 ; } ; D3: DLOADM RA, (SP) ; "restore status" : pop RA ADDL SP, SP, 1 ; DJMP (RA) ; }