123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- /*
- IRQ Routine
- Features: jumps to different Irq routines depending on variable
- Variables needed:
- IrqRoutineNumber db ;
- IrqVCounter dw
- if IrqRoutineNumber=0, irq is disabled
- irqloader:
- actual irq routine
- irqinit:
- this must be called whenever a different irq is asserted
- */
- ;in: a,8bit=number of irq routine to set,0 is disable
- IrqInit:
- php
- sep #$20
- sta.b IrqRoutineNumber
- sta.b IrqRoutineNumberBuffer
- ;get initial latch value
- rep #$31
- and.w #%00000111 ;maximum number of routines: 8
- asl a ;word pointer
- sta.b TempBufferIrq
- asl a ;h/v latch values, multiply by 6
- clc
- adc.b TempBufferIrq
-
- tax
-
- lda.l (IrqRoutineLUT+BaseAdress+2),x
- sta.b IrqVCounter
- lda.l (IrqRoutineLUT+BaseAdress+4),x
- sta.b IrqHCounter
-
- ; sta.w $2109
- ; stz.w $2107
-
- plp
- rts
- IrqLoader:
- ; php ;backup status, then switch to 16bit a/x in order to preserve everything and not just 8bit of the accu
- rep #$39
- pha
- phx
- phy
- phd
- phb
-
-
- lda.w #$0000
- tcd
- ; jml (IrqLoaderHirom + BaseAdress)
- IrqLoaderHirom:
- sep #$20
- lda.b #$81
- pha
- plb
-
- rep #$31
- lda.b IrqRoutineNumber
- and.w #%00000111 ;maximum number of routines: 8
- asl a ;word pointer
- sta.b TempBufferIrq
- asl a ;h/v latch values, multiply by 6
- clc
- adc.b TempBufferIrq
- tax
- ; php
- jsr (IrqRoutineLUT,x)
- ; plp
-
- rep #$39
- lda.w $4211 ;clear irq flag
- plb
- pld
- ply
- plx
- pla
- ; plp
- rti
- IrqRoutineLUT:
- .dw IrqRoutine0 ;pointer to routine
- .dw 200 ;v-counter for this irq
- .dw 130 ;h-counter for this irq
- .dw IrqRoutine1
- .dw 200
- .dw 130
- .dw IrqRoutine2
- .dw 143 ;v-counter for this irq
- .dw 130 ;h-counter for this irq
- .dw IrqRoutine3
- .dw 0 ;v-counter for this irq
- .dw 0 ;h-counter for this irq
- .dw IrqRoutine4
- .dw 0 ;v-counter for this irq
- .dw 0 ;h-counter for this irq
- .dw IrqRoutine5
- .dw 0 ;v-counter for this irq
- .dw 0 ;h-counter for this irq
- .dw IrqRoutine6
- .dw 0 ;v-counter for this irq
- .dw 0 ;h-counter for this irq
- .dw IrqRoutine7
- .dw 0 ;v-counter for this irq
- .dw 0 ;h-counter for this irq
- IrqRoutine0:
- sep #$20
- lda.b #$2f ;set bg color to red
- sta.w $2132
- rep #$31
- inc.w ExtIrqCounter
- rts
- IrqRoutine1:
- sep #$20 ;enable forced blank
- lda.b #$8f ;set bg color to blue
- sta.w $2132
- rep #$31
- inc.w VIrqCounter
- rts
-
-
- IrqRoutine2:
- sep #$20
- /*
- lda.b MainScreen ;disable sprites below textbox top
- and.b #%01111
- sta.w $212c
- */
- lda.b #$40
- dec.b IrqRoutineNumber ;set up dma fifo irq below
- stz.w $210f ;reset bg2 scrolling
- stz.w $210f
- stz.w $2110
- stz.w $2110
-
- lda.b BGTilesVram12 ;set bg2 new tile adress
- and.b #$0f
- ora.b #$70
- sta.w $210B
- lda.b BG3TilemapVram ;use bg3 map buffer for bg2 textbox after irq split
- and.b #%11111100 ;mask off bg size bits
- sta.w $2108
-
- rep #$31
- lda.w #200 ;set up irq counter for dma fifo
- sta.w $4209
- lda.w #130
- sta.w $4207
-
-
-
- rts
-
- IrqRoutine3:
- IrqRoutine4:
- IrqRoutine5:
- IrqRoutine6:
- IrqRoutine7:
- rts
- ;checks if tilemap upload flags are set and issues one transfer per bg neccessary
- ;in: 8bit accu
- IrqCheckTilemapFlags:
- lda.b NMIPaletteUploadFlag
- beq IrqDontUploadPal
- stz.w $2121 ;upload colour-palette buffer at $7e:0e00 to cg-ram every frame
- ldx #PaletteBuffer&$ffff ;start at color 0
- stx.w $4302 ;Store the data offset into DMA source offset
- ldx #$0200
- stx.w $4305 ;Store the size of the data block
- lda.b #$7e
- sta.w $4304 ;Store the data bank holding the tile data
- lda.b #$00 ;Set the DMA mode (byte, normal increment)
- sta.w $4300
- lda.b #$22 ;Set the destination register ( $2122: CG-RAM Write )
- sta.w $4301
- lda.b #$01 ;Initiate the DMA transfer
- sta.w $420B
- stz.b NMIPaletteUploadFlag
-
-
- IrqDontUploadPal:
- lda.b NMIOamUploadFlag
- beq IrqDontUploadOAM
-
- stz.w $2102 ;upload to oam adress 0
- stz.w $2103
- ldx.w #OamBuffer&$ffff ;start at color 0
- stx.w $4302 ;Store the data offset into DMA source offset
- ldx.w #$0220
- stx.w $4305 ;Store the size of the data block
- lda.b #$7e
- sta.w $4304 ;Store the data bank holding the tile data
- lda.b #$00 ;Set the DMA mode (byte, normal increment)
- sta.w $4300
- lda.b #$04 ;Set the destination register ( $2122: CG-RAM Write )
- sta.w $4301
- lda.b #$01 ;Initiate the DMA transfer
- sta.w $420B
-
- stz.b NMIOamUploadFlag
-
-
- IrqDontUploadOAM:
- lda.b NMIBg1UploadFlag
- beq IrqDontUploadBg1
- rep #$31
- lda.b BG1TilemapVram
- and.w #%11 ;get tilemap size
- asl a
- tax
- lda.l (BgTilemapSizeLUT+BaseAdress),x
- sta.w $4305 ;Store the size of the data block
- ;transfer bg1 tilemap to vram if needed:
- sep #$20
- ldx.b VramBg1Tilemap
- stx.w $2116 ;vram adress $0000
- ldx.w #Bg1MapBuffer & $ffff
- stx.w $4302 ;Store the data offset into DMA source offset
-
- lda.b #(Bg1MapBuffer >> 16)
- sta.w $4304 ;Store the data bank of the source data
- lda.b #$80
- sta.w $2115 ;set VRAM transfer mode to word-access, increment by 1
- lda.b #$01 ;Set the DMA mode (word, normal increment)
- sta.w $4300
- lda.b #$18 ;Set the destination register (VRAM gate)
- sta.w $4301
- lda.b #$01 ;Initiate the DMA transfer
- sta.w $420B
- stz.b NMIBg1UploadFlag
- IrqDontUploadBg1:
- lda.b NMIBg2UploadFlag
- beq IrqDontUploadBg2
- rep #$31
- lda.b BG2TilemapVram
- and.w #%11 ;get tilemap size
- asl a
- tax
- lda.l (BgTilemapSizeLUT+BaseAdress),x
- sta.w $4305 ;Store the size of the data block
- sep #$20
- ldx.b VramBg2Tilemap
- stx.w $2116 ;vram adress $0000
- ldx.w #Bg2MapBuffer & $ffff
- stx.w $4302 ;Store the data offset into DMA source offset
- ; ldx.w #$800
- ; stx.w $4305 ;Store the size of the data block
- lda.b #(Bg2MapBuffer >> 16)
- sta.w $4304 ;Store the data bank of the source data
- lda.b #$80
- sta.w $2115 ;set VRAM transfer mode to word-access, increment by 1
- lda.b #$01 ;Set the DMA mode (word, normal increment)
- sta.w $4300
- lda.b #$18 ;Set the destination register (VRAM gate)
- sta.w $4301
- lda.b #$01 ;Initiate the DMA transfer
- sta.w $420B
- stz.b NMIBg2UploadFlag
- IrqDontUploadBg2:
- lda.b NMIBg3UploadFlag
- beq IrqDontUploadBg3
- ldx.b DmaFifoPointer
- lda.b #9 ;transfer type bg3 tilemap
- sta.l DmaFifoEntryType,x
- rep #$31
- txa ;update fifo entry pointer
- clc
- adc.w #DmaFifoEntryLength
- sta.b DmaFifoPointer
- sep #$20
- stz.b NMIBg3UploadFlag
- IrqDontUploadBg3:
- rts
- IrqBrightness:
- sep #$20
- lda.w IrqBrightnessIncDec ;if "done"-flag is set, do nothing
- bmi IrqBrightnessExit
- lsr a ;increase or decrease?
- bcc IrqBrightnessDec
- lda.b ScreenBrightness ;done with increasing?
- cmp.b #$f
- beq IrqBrightnessDone
- lda.b ScreenBrightness
- inc a ;decrease
- sta.b ScreenBrightness
-
- IrqBrightnessExit:
- rts
-
- IrqBrightnessDec:
- lda.b ScreenBrightness ;done with decreasing?
- beq IrqBrightnessDone
-
- lda.b ScreenBrightness
- dec a ;decrease
- sta.b ScreenBrightness
- rts
- IrqBrightnessDone:
- lda.w IrqBrightnessIncDec
- ora.b #$80 ;set "done"-flag
- sta.w IrqBrightnessIncDec
- rts
-
-
- WaitBrightnessDone:
- php
- sep #$20
-
- WaitBrightnessLoop:
- lda.w IrqBrightnessIncDec ;wait for irq to finish brightness inc/dec
- bpl WaitBrightnessLoop
-
-
- plp
- rts
-
|