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