base:launching_long_tasks_from_irq_handler
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
base:launching_long_tasks_from_irq_handler [2016-03-15 12:31] – bitbreaker | base:launching_long_tasks_from_irq_handler [2016-11-23 10:54] (current) – bitbreaker | ||
---|---|---|---|
Line 17: | Line 17: | ||
;... your desired irq handler code goes here | ;... your desired irq handler code goes here | ||
+ | lda some_condition | ||
beq skip_long | beq skip_long | ||
Line 27: | Line 28: | ||
lda #$00 | lda #$00 | ||
pha | pha | ||
- | |||
skip_long | skip_long | ||
Line 41: | Line 41: | ||
| | ||
task | task | ||
+ | ; | ||
sta reg_a_ | sta reg_a_ | ||
- | sta reg_x_ | + | stx reg_x_ |
- | sta reg_y_ | + | sty reg_y_ |
; | ; | ||
| | ||
- | ; | + | ; |
lda reg_a_ | lda reg_a_ | ||
ldx reg_x_ | ldx reg_x_ | ||
Line 75: | Line 76: | ||
sta $d012 | sta $d012 | ||
| | ||
- | ;now allow irq2 happen on top of this task and return to this task when done | + | ;now allow irq2 to happen on top of this task and return to this task when done |
cli | cli | ||
| | ||
Line 109: | Line 110: | ||
rti | rti | ||
</ | </ | ||
+ | |||
+ | A even more convenient variant is to use the stack for register saving: | ||
+ | |||
+ | < | ||
+ | irq1 | ||
+ | pha | ||
+ | txa | ||
+ | pha | ||
+ | tya | ||
+ | pha | ||
+ | dec $d019 | ||
+ | | ||
+ | dec counter | ||
+ | bne + | ||
+ | | ||
+ | lda #$08 | ||
+ | sta counter | ||
+ | cli | ||
+ | jsr long_task | ||
+ | + | ||
+ | pla | ||
+ | tay | ||
+ | pla | ||
+ | tax | ||
+ | pla | ||
+ | rti | ||
+ | </ | ||
+ | |||
+ | Now you can run a long task that can finish somewhen between the next 8 interrupts. |
base/launching_long_tasks_from_irq_handler.1458041471.txt.gz · Last modified: 2016-03-15 12:31 by bitbreaker