Subroutines |
|
To gain access to revision questions, please sign up and log in.
Subroutines are small programs inside the main program performing a well-defined self-contained task.
Use several NOP commands to create the delay.
CTRL+Click here to run the simulator.
; ===== MAIN PROGRAM ===== START: NOP NOP NOP CALL DELAY NOP NOP JMP START ; ===== TIME DELAY ======= DELAY: NOP NOP NOP NOP RET ; ========================
START: | This labels address zero. |
NOP | This does nothing for one clock cycle. |
CALL DELAY | This copies 7 (the address labelled by DELAY) into the program counter.
This also copies 4 (the return address) onto the stack. |
DELAY: | This labels address seven. |
RET | This copies 4 (the address saved on the stack) into the program counter. |
JMP START | This copies 0 (the address labelled by START) into the program counter. |
CTRL+Click here to run the simulator.
; ===== MAIN PROGRAM ===== START: NOP NOP NOP CALL DELAY NOP NOP JMP START ; ===== TIME DELAY ======= DELAY: MOVW 0x10 REP: SUBW 0x1 JPZ DONE JMP REP DONE: RET ; ========================
START: | This labels address zero. |
NOP | This does nothing for one clock cycle. |
CALL DELAY | This copies 7 (the address labelled by DELAY) into the program counter.
This also copies 4 (the return address) onto the stack. |
DELAY: | This labels address seven. |
MOVW 0x10 | This copies hexadecimal 10 into W, the working register. This sets the delay. |
REP: | This labels address eight. |
SUBW 0x1 | This subtracts one from W and stores the answer back into W. |
JPZ DONE | If the status register (SR) zero flag is set, this will jump to address 0xB.
The zero flag will be set when W has finally counted down to zero. |
JMP REP | This will set the program counter to the address labelled by REP (address eight). |
DONE: | This labels address 0xB. |
RET | This copies 4 (the address saved on the stack) into the program counter. |
JMP START | This copies 0 (the address labelled by START) into the program counter. |
CTRL+Click here to run the simulator.
; ===== MAIN PROGRAM ===== START: NOP NOP MOVW 0x15 ; Set the delay CALL DELAY NOP NOP JMP START ; ===== TIME DELAY ======= DELAY: SUBW 0x1 JPZ DONE JMP DELAY DONE: RET ; ========================
START: | This labels address zero. |
NOP | This does nothing for one clock cycle. |
MOVW 0x15 | This copies hexadecimal 15 into W, the working register. This sets the delay. |
CALL DELAY | This copies 7 (the address labelled by DELAY) into the program counter.
This also copies 4 (the return address) onto the stack. |
DELAY: | This labels address seven. |
SUBW 0x1 | This subtracts one from W and stores the answer back into W. |
JPZ DONE | If the status register (SR) zero flag is set, this will jump to address 0xA.
The zero flag will be set when W has finally counted down to zero. |
JMP DELAY | This will set the program counter to the address labelled by REP (address eight). |
DONE: | This labels address 0xA. |
RET | This copies 4 (the address saved on the stack) into the program counter. |
JMP START | This copies 0 (the address labelled by START) into the program counter. |
Full details are on the Timers and Interrupts page.
reviseOmatic V3 Contacts, ©, Cookies, Data Protection and Disclaimers Hosted at linode.com, London