David Voswinkel a7270acdf1 o add monitor
2009-07-20 19:05:40 +02:00

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