;----------------------------------------------------------------- ; EX72.ASM PROCEDURE CALL TO DELAY() C.P. Diduch 2001 ; Parameter Passing via Reserved Memory (i.e., a Global Variable) ; ; The main program toggles the state of an LED every T ms. The ; procedure, void DELAY(void), is called to implement a software ; delay of T milliseconds. The parameter, T, is passed via ; a (global) memory variable, T. ; ; Author(s): ; Signature(s): Date: ;----------------------------------------------------------------- ; PROGRAM CONSTANTS ; .EQU TS 100 ; #define TS 100 ; ; ; STACK and VARIABLES ; ; ; .ORG 0x0000 ; "assign following to RAM" .DS 5 ; "reserve space for stack" TOS: .DS 1 ; ; T: .DS 1 ; unsigned T ; // Global ;----------------------------------------------------------------- ; 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 ; STOREM T, R0 ; T = 1000 ; // Global variable. CALL DELAY, RA ; DELAY() ; XORL R2, R2, 0x0001 ; X = X ^ 0x0001 ; JMP M0 ; } ; } ;----------------------------------------------------------------- ; PROCEDURE void DELAY() ; ; Implements a software delay of T milliseconds by invoking a ; delay of 1 ms, T 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 R1 to 0. Parameter, T, ; is passed as a variable in reserved memory (also called a ; global variable). ; ; Registers affected : R0, R1, FL. ; Calls : no procedures. ; Called by : main(). ; Stack depth : 1 word. ; ; Call/linkage sequence : ADDL R0, NULL, 5 ; ; STORE T, R0 ; T = 5 ; ; CALL RA, DELAY ; DELAY() ; ; DELAY: ; void DELAY(unsigned T) { SUBL SP, SP, 1 ; DSTOREM (SP), RA ; "save status" : push RA LOADM R0, T ; "retrieve parameter, T" ; D0: SUBL NULL, R0, 0 ; while (T != 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 ; T = T - 1 ; JMP D0 ; } ; D3: DLOADM RA, (SP) ; "restore status" : pop RA ADDL SP, SP, 1 ; DJMP (RA) ; }