User Tools

Site Tools


base:double_irq

Differences

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

Link to this comparison view

base:double_irq [2015-04-17 04:31] (current)
Line 1: Line 1:
 +====== Double IRQ stable interrupt ======
 +Sourcecode by Fungus
  
 +<​code>​
 +         *= $2000    ;Assemble to $2000
 + 
 +         ​sei ​        ;​Disable IRQ's
 +         lda #$7f    ;Disable CIA IRQ's
 +         sta $dc0d
 +         sta $dd0d
 +
 +         lda #$35    ;Bank out kernal and basic
 +         sta $01     ;​$e000-$ffff
 + 
 +         lda #<​irq1 ​ ;Install RASTER IRQ
 +         ldx #>​irq1 ​ ;into Hardware
 +         sta $fffe   ;​Interrupt Vector
 +         stx $ffff
 + 
 + 
 +         lda #$01    ;Enable RASTER IRQs
 +         sta $d01a
 +         lda #$34    ;IRQ on line 52
 +         sta $d012
 +         lda #$1b    ;High bit (lines 256-311)
 +         sta $d011
 +                     ;NOTE double IRQ
 +                     ;​cannot be on or
 +                     ;​around a BAD LINE!
 +                     ;​(Fast Line)
 + 
 +         lda #$0e    ;Set Background
 +         sta $d020   ;and Border colors
 +         lda #$06
 +         sta $d021
 +         lda #$00
 +         sta $d015   ;turn off sprites
 + 
 +         jsr clrscreen
 +         jsr clrcolor
 +         jsr printtext
 + 
 +         asl $d019   ;Ack any previous
 +         bit $dc0d   ;​IRQ'​s
 +         bit $dd0d
 + 
 +         ​cli ​        ;​Allow IRQ's
 + 
 +         jmp *       ;​Endless Loop
 + 
 + 
 +irq1
 +         sta reseta1 ;Preserve A,X and Y
 +         stx resetx1 ;Registers
 +         sty resety1 ;VIA self modifying
 +                     ;code
 +                     ;​(Faster than the
 +                     ;​STACK is!)
 + 
 +         lda #<​irq2 ​ ;Set IRQ Vector
 +         ldx #>​irq2 ​ ;to point to the
 +                     ;next part of the
 +         sta $fffe   ;​Stable IRQ
 +         stx $ffff   ;ON NEXT LINE!
 +         inc $d012
 +         asl $d019   ;Ack RASTER IRQ
 +         ​tsx ​        ;We want the IRQ
 +         ​cli ​        ;To return to our
 +         ​nop ​        ;​endless loop
 +         ​nop ​        ;NOT THE END OF
 +         ​nop ​        ;THIS IRQ!
 +         nop
 +         ​nop ​        ;​Execute nop's
 +         ​nop ​        ;​until next RASTER
 +         ​nop ​        ;IRQ Triggers
 +         nop
 +         ​nop ​        ;2 cycles per
 +         ​nop ​        ;​instruction so
 +         ​nop ​        ;we will be within
 +         ​nop ​        ;1 cycle of RASTER
 +         ​nop ​        ;​Register change
 +         nop
 +irq2
 +         ​txs ​        ;​Restore STACK
 +                     ;​Pointer
 +         ldx #$08    ;Wait exactly 1
 +         ​dex ​        ;​lines worth of
 +         bne *-1     ;​cycles for compare
 +         bit $ea     ;​Minus compare
 +         ​nop ​        ;​cycles
 + 
 +         ​nop ​ ;<--- remove 1 NOP for PAL
 + 
 +         lda #$35    ;RASTER change yet?
 +         cmp $d012
 +         beq start   ;If no waste 1 more
 +                     ;​cycle
 +start
 +         ​nop ​        ;Some delay
 +         ​nop ​        ;So stable can be
 +         ​nop ​        ;seen
 + 
 +         lda #$0e    ;Colors
 +         ldx #$06
 + 
 +         sta $d021   ;Here is the proof
 +         stx $d021
 + 
 +         lda #<​irq3 ​ ;Set IRQ to point
 +         ldx #>​irq3 ​ ;to subsequent IRQ
 +         ldy #$68    ;at line $68
 +         sta $fffe
 +         stx $ffff
 +         sty $d012
 +         asl $d019   ;Ack RASTER IRQ
 + 
 +         lda #$00    ;Reload A,X,and Y
 +reseta1 ​ = *-1       ;​registers
 +         ldx #$00
 +resetx1 ​ = *-1
 +         ldy #$00
 +resety1 ​ = *-1
 + 
 +         ​rti ​        ;​Return from IRQ
 + 
 +irq3
 +         sta reseta2 ;Preserve A,X,and Y
 +         stx resetx2 ;Registers
 +         sty resety2
 + 
 +         ldx #$0a    ;Waste some more
 +         ​dex ​        ;time so effect
 +         bne *-1     ;can be seen
 +         nop
 + 
 +         lda #$0e    ;More colors
 +         ldx #$06
 + 
 +         sta $d021   ;​Cool! subsequent
 +         stx $d021   ;​IRQ'​s are also
 +                     ;​stable :-)
 +                     ;​Unless you are
 +                     ;​running realtime
 +                     ;code :-)
 + 
 +         ldy #$13    ;Waste time so this
 +         ​dey ​        ;IRQ does not try
 +         bne *-1     ;to reoccur on the
 +                     ;same line!
 + 
 +         lda #<​irq1 ​ ;Reset Vectors to
 +         ldx #>​irq1 ​ ;first IRQ again
 +         ldy #$34    ;at line $34
 +         sta $fffe
 +         stx $ffff
 +         sty $d012
 +         asl $d019   ;Ack RASTER IRQ
 + 
 +         lda #$00    ;Reload A,X,and Y
 +reseta2 ​ = *-1       ;​registers
 +         ldx #$00
 +resetx2 ​ = *-1
 +         ldy #$00
 +resety2 ​ = *-1
 + 
 +         ​rti ​        ;​Return from IRQ
 + 
 +                     ;​Pound RESTORE to
 +                     ;get back to Turbo
 +nmi
 +         asl $d019   ;Ack all IRQ's
 +         lda $dc0d
 +         lda $dd0d
 +         lda #$81    ;reset CIA 1 IRQ
 +         ldx #$00    ;remove raster IRQ
 +         ldy #$37    ;reset MMU to roms
 +         sta $dc0d
 +         stx $d01a
 +         sty $01
 +         ldx #$ff    ;clear the stack
 +         txs
 +         ​cli ​        ;​reenable IRQ's
 +         jmp $9000   ;back to Turbo
 + 
 +clrscreen
 +         lda #$20    ;Clear the screen
 +         ldx #$00
 +clrscr ​  sta $0400,x
 +         sta $0500,x
 +         sta $0600,x
 +         sta $0700,x
 +         dex
 +         bne clrscr
 +         rts
 +clrcolor
 +         lda #$03    ;Clear color memory
 +         ldx #$00
 +clrcol ​  sta $d800,x
 +         sta $d900,x
 +         sta $da00,x
 +         sta $db00,x
 +         dex
 +         bne clrcol
 +         rts
 + 
 +printtext
 +         lda #$16    ;C-set = lower case
 +         sta $d018
 + 
 +         ldx #$00
 +moretext lda text1,x
 + 
 +         bpl lower   ;​upper case ?
 +         eor #$80    ;yes
 + 
 +         bne lower+2
 + 
 +lower    and #$3f    ;lower case
 +         sta $0450,x
 +         inx
 +         cpx #$78
 +         bne moretext
 +exit     rts
 + 
 +text1
 +         .text "​Stable Raster IRQ sourc"
 +         .text "e (PAL/​NTSC) ​    "​
 +         .text "All Code by Fungus 1996"
 +         .text " ​                "​
 +         .text "Feel free to use and mo"
 +         .text "dify this code :)"
 +</​code>​
base/double_irq.txt ยท Last modified: 2015-04-17 04:31 (external edit)