User Tools

Site Tools


base:timerinterrupts

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”

;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
base/timerinterrupts.txt · Last modified: 2015-04-17 04:34 (external edit)