summaryrefslogtreecommitdiff
path: root/roms/7seg_counter_reset_on_irq_delay.asm
diff options
context:
space:
mode:
Diffstat (limited to 'roms/7seg_counter_reset_on_irq_delay.asm')
-rw-r--r--roms/7seg_counter_reset_on_irq_delay.asm106
1 files changed, 106 insertions, 0 deletions
diff --git a/roms/7seg_counter_reset_on_irq_delay.asm b/roms/7seg_counter_reset_on_irq_delay.asm
new file mode 100644
index 0000000..007402e
--- /dev/null
+++ b/roms/7seg_counter_reset_on_irq_delay.asm
@@ -0,0 +1,106 @@
+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
+ jsr print7seg
+ ldx #0 ; ca 500'000 cycles, at 1 Mhz 2 ticks per second
+ ldy #0
+ lda #150
+ jsr delay
+ inc COUNTER
+ lda COUNTER
+ 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
+
+; delay 18+13(65536Y+256A+X) cycles
+delay:
+ iny
+delay1:
+ nop
+ nop
+delay2:
+ cpx #$1
+ dex
+ sbc #$0
+ bcs delay1
+ dey
+ bne delay2
+ 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