; Test the 6522 on a Mockingboard running in interrupt mode ; Trying to set it to 50Hz .include "zp.inc" ;============================= ; Print message ;============================= jsr HOME jsr TEXT lda #0 sta DRAW_PAGE sta CH sta CV lda #mocking_message sta OUTH jsr move_and_print jsr mockingboard_detect_slot4 cpx #$1 beq mockingboard_found lda #not_message sta OUTH inc CV jsr move_and_print jmp forever_loop mockingboard_found: lda #found_message sta OUTH inc CV jsr move_and_print ;========================= ; Setup Interrupt Handler ;========================= ; Vector address goes to 0x3fe/0x3ff ; FIXME: should chain any existing handler lda #interrupt_handler sta $03ff ;============================ ; Enable 50Hz clock on 6522 ;============================ lda #$40 ; Generate continuous interrupts, don't touch PB7 sta $C40B ; ACR register lda #$7F ; clear all interrupt flags sta $C40E ; IER register (interrupt enable) lda #$C0 sta $C40D ; IFR: 1100, enable interrupt on timer one oflow sta $C40E ; IER: 1100, enable timer one interrupt lda #$E7 sta $C404 ; write into low-order latch lda #$4f sta $C405 ; write into high-order latch, ; load both values into counter ; clear interrupt and start counting ; 4fe7 / 1e6 = .020s, 50Hz ;============================ ; Enable 6502 interrupts ;============================ ; cli ; clear interrupt mask ;============================ ; Loop forever ;============================ lda #64 forever_loop: ; clc ; adc #1 sta $0401 jmp forever_loop ;============================= ; simple interrupt handler ;============================= ; On Apple II/6502 the interrupt handler jumps to address in 0xfffe ; This is in the ROM, which saves the registers ; on older IIe it saved A to $45 (which could mess with DISK II) ; newer IIe doesn't do that. ; It then calculates if it is a BRK or not (which trashes A) ; Then it sets up the stack like an interrupt and calls 0x3fe interrupt_handler: pha ; save A bit $C404 ; can clear interrupt by reading T1C-L inc $0410 ; increment text char on screen pla ; restore A rti ;========= ;routines ;========= .include "../../asm_routines/gr_offsets.s" .include "../../asm_routines/text_print.s" .include "../../asm_routines/mockingboard.s" ;========= ; strings ;========= mocking_message: .asciiz "LOOKING FOR MOCKINGBOARD IN SLOT #4" not_message: .byte "NOT " found_message: .asciiz "FOUND" done_message: .asciiz "DONE PLAYING"