123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- ;this nmi uses a maximum of 20 scanlines while streaming brr frames to the spc
- NMI:
- php
- rep #$39
- pha
- phb
- phd
- phx
- phy
- lda.w #$0000
- tcd
- sep #$20
-
- lda.l $004210 ;reset nmi flag
- lda #$81
- pha
- plb
- stz.w $4201 ;clear iobit
- lda.b HdmaFlags ;check which hdma channels need to be activated
- and #$fc ;exclude channel #0,1(reserved for normal dma)
- sta.w $420C ;set hdma channels and disable dma channel
- rep #$31
- lda W12SEL
- sta $2123
- lda W1L
- sta $2126
- lda W2L
- sta $2128
- lda WBGLOG
- sta $212a
- lda WMS
- sta $212e
- sep #$20
- lda WOBJSEL
- sta $2125
- lda.b Mosaic
- sta.w $2106
- sep #$20
- ldx FrameCounterLo ;increment word framecounter
- inx ;
- stx FrameCounterLo ;
- lda ScreenMode ;set screenmode and bg sizes
- sta $2105 ;
- lda MainScreen ;setup main and subscreen
- sta $212c ;
- lda SubScreen ;setup main and subscreen
- sta $212d ;
- ;
- lda BGTilesVram12 ;set offsets in vram for tiles
- sta $210B ;of bg1 and bg2
- lda BGTilesVram34 ;set offsets in vram for tiles
- sta $210C ;of bg1 and bg2
- lda BG1TilemapVram ;set offset of bg1 tilemap in vram
- sta $2107 ;
- lda BG2TilemapVram ;set offset of bg2 tilemap in vram
- sta $2108 ;
- lda BG3TilemapVram ;set offset of bg3 tilemap in vram
- sta $2109 ;
- lda BG4TilemapVram ;set offset of bg3 tilemap in vram
- sta $210a ;
- lda.w CGWsel ;colour add/sub config
- sta $2130
- lda.w CgadsubConfig
- sta $2131
- lda.w FixedColourB
- and.b #%00011111
- ora.b #%10000000
- sta $2132
- lda.w FixedColourG
- and.b #%00011111
- ora.b #%01000000
- sta $2132
- lda.w FixedColourR
- and.b #%00011111
- ora.b #%00100000
- sta $2132
- lda BG1HOfLo ;set bg1 h-offset
- sta $210d ;
- lda BG1HOfHi ;
- sta $210d ;
- lda BG1VOfLo ;set bg1 v-offset
- sta $210e ;
- lda BG1VOfHi ;
- sta $210e ;
- lda BG2HOfLo ;set bg2 h-offset
- sta $210f ;
- lda BG2HOfHi ;
- sta $210f ;
- lda BG2VOfLo ;set bg2 v-offset
- sta $2110 ;
- lda BG2VOfHi ;
- sta $2110 ;
- lda ObjSel
- sta $2101
- ;this (writing to regs $4209,$4207,$4200) somehow breaks vblank flag setting in reg $4210,$4200)
- lda.b IrqRoutineNumberBuffer
- sta.b IrqRoutineNumber ;if this is zero, irqs are disabled
- beq NmiDisableHIrq
- rep #$31 ;store current h-counter in reg
- lda.b IrqVCounter
- sta.w $4209 ;v
- lda.b IrqHCounter
- sta.w $4207 ;h
- sep #$20
- lda.b InterruptEnableFlags
- ora.b #%00110000 ;enable v and h irq, will take effect next frame. irq is only triggered if both positions match
- sta.b InterruptEnableFlags
- sta.w $4200 ;should be ok. hope it breaks nothing
- bra NmiHIrqDone
- NmiDisableHIrq:
- sep #$20
- lda.b InterruptEnableFlags
- and.b #%11001111 ;disable h-irq
- sta.b InterruptEnableFlags
- sta.w $4200
- NmiHIrqDone:
- sep #$20
- lda.b #$80
- sta.w $2100
-
-
-
- ; jsr ProcessHdmaList
- jsr IrqCheckTilemapFlags
- jsr ProcessDmaFifo
- jsr IrqBrightness
- ; jsr DMATileMapToVramBG3
- ;moved to irq. that way, screen might turn black during long transfers, but at least the data gets uploaded reliably
- lda ScreenBrightness ;setup screen brightness
- and.b #$7f
- sta $2100
-
- jsr Random ;update random numbers
- jsr SpcHandlerMain
- rep #$31
- lda.b CheckJoypadMode
- and.w #%11
- asl a
- tax
- sep #$20
- jsr (CheckJoypadModeLUT,x)
-
- rep #$39
- ply
- plx
- pld
- plb
- pla
- plp
- rts
- rti ;return from nmi
-
|