362 lines
7.4 KiB
NASM
362 lines
7.4 KiB
NASM
/*
|
|
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
|
|
|