diff options
Diffstat (limited to 'roms/7seg_counter_reset_on_irq.asm')
-rw-r--r-- | roms/7seg_counter_reset_on_irq.asm | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/roms/7seg_counter_reset_on_irq.asm b/roms/7seg_counter_reset_on_irq.asm new file mode 100644 index 0000000..b7581e8 --- /dev/null +++ b/roms/7seg_counter_reset_on_irq.asm @@ -0,0 +1,89 @@ +PORTA = $6001 +DDRA = $6003 +PCR = $600c +IER = $600e + +SER = %00000001 +RCLK = %00000010 +SRCLK = %00000100 + +COUNTER = $0 + + .org #$f800 + +reset: + sei ; disallow interrupts during initialization + + ldx #$FF ; initialize call stack to $1FF + txs + + lda #%10000010 ; enable CA1 interrupt + sta IER + lda #$0 ; negative edge triggering + sta PCR + + ldx #%00000111 ; set output on 7seg control pins of PORTA + stx DDRA + + ldx $0 ; initialize 8-bit counter + stx COUNTER + + cli ; allow interrupts now + +mainloop: ; main loop, load counter and print it + sei + inc COUNTER + lda COUNTER + cli + jsr print7seg + jmp mainloop + +print7seg: + ldy #$8 ; 8 bits to shift +loop7seg: + rol a + bcc zerobit ; C=0, bang a zero to SER +onebit: + ldx #(SER) ; C=1, bang a one to SER + stx PORTA + ldx #(SER | SRCLK) + stx PORTA + ldx #(SER) + stx PORTA + jmp next +zerobit: + ldx #$0 ; C=0, bang a zero to SER + stx PORTA + ldx #SRCLK + stx PORTA + ldx #$0 + stx PORTA + jmp next +next: + dey + bne loop7seg + rol a ; restore A register +output: + ldx #0 ; bang RCLK to store output in latch + stx PORTA + ldx #RCLK + stx PORTA + ldx #0 + stx PORTA + rts + +nmi: + rti + +irq: + pha + bit PORTA ; clear interrupt on port A + lda #$0 + sta COUNTER ; reset counter + pla + rti + + .org #$fffa + .word nmi + .word reset + .word irq |