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