User Tools

Site Tools


base:timerinterrupts

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:timerinterrupts [2015-04-17 04:34] (current)
Line 1: Line 1:
 +A sourcecode for doing a CIA IRQ Timer A interrupt
 +Example: If you want to play a music file with init at $1000 and play at $1003
 +Add jsr $1000 at "​Initcode"​ comment and jsr $1003 at "add code here"
 +<​code>​
 +;Cia Timer B interrupt example by Terric(Anders L) in 2011
 +;This example shows a stable one frame CIA Timer B interrupt.
 +;This piece of code fires of at same cycle on PAL, NTSC, NTSCOLD, DREAN
 +;Revision 4, Compiled with 64tass 1.46
  
 +        *=$0801
 + .byte $0a,​$08,​$0a,​$00,​$9e,​$32,​$30,​$36,​$32
 + .byte $00,​$00,​$00,​$00 ; a BASIC SYS LINE FOR STARTING CODE AT $080E   
 + *=$080e
 + sei
 +
 +         
 + jsr $e544 ;​Clear screen with a kernel call
 +
 +
 +
 + lda #$35
 + sta $01
 +;cia detection routine begins, do not touch if you want cycle perfect timing.
 + lda #$00
 + sta $d011
 + sta $d015
 + lda #<fdcia
 + sta $fffa
 + lda #>fdcia
 + sta $fffb
 + lda #4
 + sta $dd04
 + lda #$00
 + sta $dd05
 + sta $40
 + lda #$81
 + sta $dd0d
 + lda $dd0e
 + ora #%00011001
 + sta $dd0e
 +
 + lda $dd0d
 + lda $dd0d
 + inc $40
 + jmp *
 +fdcia
 + lda $dd0d
 + pla
 + pla
 + pla
 + sei
 + lda #<fdcia2
 + sta $fffe
 + lda #>fdcia2
 + sta $ffff
 + lda #4
 + sta $dc04
 + lda #$00
 + sta $dc05
 + sta $44
 + lda #$7f
 + sta $dc0d
 + lda #$81
 + sta $dc0d
 + lda $dc0e
 + ora #%00011001
 + sta $dc0e
 + lda $dc0d
 + cli
 + nop
 + inc $44
 + jmp *
 +fdcia2
 + lda $dc0d
 + pla
 + pla
 + pla
 +
 +; Determine PAL/​NTSC/​NTSCOLD and store in $42, 1 ntscold, 3 pal , 6 ntsc, 7 drean
 +- lda $d011
 + bpl -
 +- lda $d012
 +- cmp $d012
 + beq -
 + bmi --
 + and #$03
 + sta $42
 + lsr a
 + sta $41
 +; Is it the DREAN
 + lda #$ff
 + sta $dc04
 + sta $dc05
 +- lda $d011
 + bpl -
 +- lda $d011
 + bmi -
 + lda $dc0e
 + ora #%00011001
 + sta $dc0e
 + lda #$f0
 +- cmp $d012
 + bne -
 + lda $dc05
 + cmp #$c4
 + beq +
 + bcs +
 +; Yes, it is the drean
 + lda #$04
 + clc
 + adc $42
 + sta $42
 ++
 +here
 + sei
 + lda #$35
 + sta $01
 + 
 + lda $dc0e
 + and #$fe
 + sta $dc0e
 + lda $dc0f
 + and #$fe
 + sta $dc0f
 + lda $dd0e
 + and #$fe
 + sta $dd0e
 + lda $dd0f
 + and #$fe
 + sta $dd0f
 + lda $dc0d
 + lda $dd0d
 + lda #$37 ; Select big bank without roms
 + sta $01 ; Change to big bank
 +
 + ldx $42
 + lda timerlo,​x ;​ cia (6526) 63 cycles per line * 312 lines - 1 
 + sta $04
 + clc
 + sbc #44 ; 28 +16 cycles when the sprites are enabled
 + sta gnurka+1
 + lda timerhi,x
 + sta $05
 +; beginning of stabirq
 + cli
 + lda #$60
 +- cmp $d012
 + bne -
 +- lda $d011
 + bpl -
 + ldx #15
 +- dex
 + bne -
 +- lda $d011
 + bmi -
 + sei
 + lda #$00
 + sta $d011
 +
 + lda #<​stabirq
 + sta $0314
 + lda #>​stabirq
 + sta $0315
 + lda #$02
 + sta $d012
 + sta $1f 
 + lda $d011
 + and #$7f
 + sta $d011
 + lda #$01
 + sta $d01a
 + sta $d019
 + cli
 + ldx #$04
 +- dex
 + bne -
 + .for a=0,​a<​40,​a=a+1
 + nop
 + .next
 +
 +
 +stabirq
 + lda $42 ;3 cycles
 + cmp #$03 ;2 cycles
 + beq pal ; on jmp 3 cycles else 2 cycles
 + cmp #$06 ; 2
 + beq ntsc ; 2 or 3
 + cmp #$07 ; 2
 + bne ntscold ; 2 or 3
 + nop ; 2
 + jmp drean ; 3
 +pal nop ; 2
 +
 +ntsc nop
 + lda $1f ; 3
 +ntscold
 + lda $1f ;3
 +drean
 + lda $1f ;3-2
 + cmp $d012
 + beq +
 ++
 + lda $04
 + sta $dc06
 + lda $05
 + sta $dc07
 +
 + lda $dc0f
 + ora #%00011001
 + and #%11110111
 + sta $dc0f ; count o2 pulses and forceload and continious and start
 + lda #$01
 + sta $d019
 + pla
 + pla
 + pla
 + lda #$ff
 + txs
 +
 + lda #$35
 + sta $01
 + lda #<irq
 + sta $fffe ; Set low IRQ adress in selected bank
 + lda #>irq
 + sta $ffff ; Set high IRQ adress in selected bank
 + lda #$7f
 + sta $dc0d ; Clear IRQ interruptmask for CIA
 + lda #$00
 + sta $d01a ; Clear VIC interruptmask
 + lda $d019
 + and #$81
 + sta $d019
 + and #0
 + sta $d019
 + lda $d011
 + and #$7f
 + sta $d011
 + lda #$1b
 + sta $d011
 + lda #$82
 + sta $dc0d ; Activate CIA timer B irq
 + lda #$7f
 + sta $dd0d
 +;INITCODE
 +;You could add init for music here or at the beginning
 + cli
 + jmp * ; do nothing while no IRQ, just jump to this line
 +irq
 +
 + pha ; 3 cycles
 + lda $dc0d ; 4 cycles ;​Acknowledge CIA timer a interrupt
 +
 + tya ; 2 cycles
 + pha ; 4 cycles
 + txa ; 2 cycles
 + pha ; 4 cycles
 + lda $dc06; 4 cycles
 + clc
 +gnurka sbc #$c7;set according to system, see above when setting timers
 + clc   
 + eor #$ff
 + adc #$01
 +
 + lsr a
 + bcc +
 ++
 +
 + clc
 + sta fakejmp+1
 +fakejmp bcc fakelocation
 +fakelocation ;​ and accu=7 wait 0 cycles etc.
 + .for a=0,​a<​128,​a=a+1
 + nop
 + .next
 + ; Here you can add code
 +
 + inc $d020
 +
 + dec $d020
 +
 + ; End of adding code
 + pla
 + tax
 + pla
 + tay
 + pla
 + rti
 +
 +
 +timerlo .byte 0,​$7f,​0,​$c7,​0,​0,​$c6,​$37
 +timerhi .byte 0,​$41,​0,​$4c,​0,​0,​$42,​$4f
 +
 +</​code>​
base/timerinterrupts.txt ยท Last modified: 2015-04-17 04:34 (external edit)