123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662 |
- ;init variables:
- ;a(8bit) is index into bgmode 2byte pointertable
- SetBGMode:
- php
- rep #$31 ;accu 16bit
- and.w #$000f ;16 valid entries
- asl a
- tax
- lda.l BgModeLut+BaseAdress,x
- ; lda.b UploadBackgroundPointer+1 ;get source bank of tilemap
- sta.b SetBGThreeBytePointerLo ;
- sep #$20
- lda.b #(:BgModeLut+BaseAdress>>16)
- sta.b SetBGThreeBytePointerBank ;
- ldy.w #$0000
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b SetIni
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b ScreenMode
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b MainScreen
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b SubScreen
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b CGWsel
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b CgadsubConfig
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b BGTilesVram12
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b BGTilesVram34
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b BG1TilemapVram
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b BG2TilemapVram
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b BG3TilemapVram
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b BG4TilemapVram
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b ObjSel
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- jsr IrqInit
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b W12SEL
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b W34SEL
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b WOBJSEL
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b W1L
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b W1R
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b W2L
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b W2R
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b WBGLOG
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b WOBJLOG
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b WMS
- iny
- lda.b [SetBGThreeBytePointerLo],y ;load byte from table
- sta.b WSS
-
- ;init vram locations
- rep #$31
- lda.b BGTilesVram12
- pha
- and.w #$00f0
- xba
- sta.b VramBg2Tiles
-
- pla
- and.w #$000f
- xba
- clc
- asl a
- asl a
- asl a
- asl a
- sta.b VramBg1Tiles
- lda.b BGTilesVram34
- pha
- and.w #$00f0
- xba
- sta.b VramBg4Tiles
-
- pla
- and.w #$000f
- xba
- clc
- asl a
- asl a
- asl a
- asl a
- sta.b VramBg3Tiles
-
- lda.b BG1TilemapVram
- and.w #$00fc
- xba
- sta.b VramBg1Tilemap
- lda.b BG2TilemapVram
- and.w #$00fc
- xba
- sta.b VramBg2Tilemap
- lda.b BG3TilemapVram
- and.w #$00fc
- xba
- sta.b VramBg3Tilemap
- lda.b BG4TilemapVram
- and.w #$00fc
- xba
- sta.b VramBg4Tilemap
-
- lda.b ObjSel
- and.w #%111 ;get spritetile base adress
- asl a ;shift left by 5
- asl a
- asl a
- asl a
- asl a
- xba ;shift left by 8
- sta.b SpriteTileOffsetVram
-
- plp
- rts
- ;**********************************
- ;Simple Background loader for bg1 and 2
- ;in: a,8bit: bit0,1: bg number, 0-3
- ; bit2-4: palette to use
- ; bit5: priority bit
- ;in: x,16bit: pointernumber of background
- ;
- ;every background consists of 1.tiles,2.tilemap,3.pal+header(relative pointers to all 3 files+eof)
- ;
- ;uses: TempBuffer0-8
- ;**********************************
- UploadBackgroundFile:
- php
- sep #$20
- sta.b TempBuffer+2
- rep #$31
- ; and.w #$ff
- txa
- sta.b TempBuffer+4 ;multiply background number by 3
- asl a
- adc.b TempBuffer+4
- tax
- lda.l UploadBackgroundFileLUT+BaseAdress,x ;get pointer low byte to background
- sta.b TempBuffer+4
- inx
- lda.l UploadBackgroundFileLUT+BaseAdress,x ;get pointer high word to background
- sta.b TempBuffer+5
- sep #$20
-
- sei
- jsr UploadTiles
- jsr UploadTilemap
- cli
- plp
- rts
-
- UploadTiles:
- sep #$20
- ldx.b DmaFifoPointer
- lda #1 ;transfer type
- sta.l DmaFifoEntryType,x
-
- lda.b TempBuffer+6 ;get source bank
- sta.l DmaFifoEntrySrcBank,x ;source 4304
-
- rep #$31
- ldy.w #$0000
- lda.b [TempBuffer+4],y ;get relative pointer to tiles
- sta.b TempBuffer+7
- adc.b TempBuffer+4 ;add file offset
- sta.l DmaFifoEntrySrcLo,x ;source 4302
-
- sec
- iny
- iny
- lda.b [TempBuffer+4],y ;get relative pointer to tilemap
- sbc.b TempBuffer+7 ;substract tile position to get tile length
- sta.l DmaFifoEntryCount,x ;length 4305
-
- lda.b TempBuffer+2
- and.w #%11
- asl a
- tay
- lda.w VramBg1Tiles,y ;get vram destination
- sta.l DmaFifoEntryTarget,x ;vram target 2116
- txa ;update fifo entry pointer
- clc
- adc.w #DmaFifoEntryLength
- sta.b DmaFifoPointer
- rts
- BgMapBufferLUT:
- .dw Bg1MapBuffer&$ffff
- .dw Bg2MapBuffer&$ffff
- .dw Bg3MapBuffer&$ffff
- .dw Bg4MapBuffer&$ffff
- UploadTilemap:
- ;copy tilemap to wram buffer:
- php
- sep #$20
- phb
- lda.b #$81
- pha
- plb
- lda.b #Bg1MapBuffer >> 16 ;store target adress(map buffer) in ram port.
- and.b #$01 ;only 1 or 0 valid for banks $7e or $7f
- sta.w $2183
- rep #$31
- lda.b TempBuffer+2
- and.w #%11
- asl a
- tax
- lda.l (BgMapBufferLUT+BaseAdress),x
-
- sta.w $2181
- sep #$20
- lda.b TempBuffer+2 ;save layer bit
- ; pha
-
- and.b #$3c ;mask off everything but palette and priority bit
- sta.b TempBuffer+3
- rep #$31 ;accu 16bit
- lda.b TempBuffer+5 ;get source bank of tilemap
- sta.b ThreeBytePointerHi ;
- ldy.w #$0002
- lda.b [TempBuffer+4],y ;get relative pointer to tilemap
- sta.b TempBuffer+7
- adc.b TempBuffer+4
- sta.b ThreeBytePointerLo
- iny
- iny
- lda.b [TempBuffer+4],y ;get relative pointer to palette(in order to calculate tilemap length)
-
- sec
- sbc.b TempBuffer+7
- sta.b TempBuffer ;store total length for dma transfer
- and.w #$fffe ;mask off bit0 so the next loop never hangs
-
- tax ;get length, store in x
-
- ldy.w #$0000
- sep #$20
-
- DMAUploadTilemapLoop:
- lda.b [ThreeBytePointerLo],y ;load word from ThreeBytePointer
- sta.w $2180 ;store in bg1 map buffer, low byte
- iny
- lda.b [ThreeBytePointerLo],y ;load word from ThreeBytePointer
- and.b #$c3
- ora.b TempBuffer+3 ;or with priority and palette
- sta.w $2180 ;store in bg1 map buffer, low byte
- iny
- dex ;word-dec length counter
- dex
- bne DMAUploadTilemapLoop ;done if length counter = 0
- ; pla
- ; sta.b UploadBackgroundLayer
- ; jsr DMAUploadBgTilemap
- rep #$31
- lda.b TempBuffer+2
- and.w #%11
- tax
- inc.b NMIBg1UploadFlag,x ;set corresponding bg tilemap update flag
- sep #$20
- DMAUploadPaletteBG1:
- lda.b #PaletteBuffer >> 16 ;store target adress(palette buffer) in ram port.
- and.b #$01 ;only 1 or 0 valid for banks $7e or $7f
-
- lda.b TempBuffer+2
- bit.b #%10 ;do an extra shift if this is bg0 or 1(bg0,1:always 16 color palettes /bg2,3: always 4 colors)
- beq DMAUploadPaletteBG1jaja
- and.b #%00011100 ;mask off everything but palette number
- asl a ;multiply by 8(2bytes per color x 4 colors per palette)
- bra DMAUploadPaletteBGSelectDone
- DMAUploadPaletteBG1jaja:
- and.b #%00011100 ;mask off everything but palette number
- asl a
- asl a
- asl a ;multiply by 32(2bytes per color x 16 colors per palette)
-
- DMAUploadPaletteBGSelectDone:
- rep #$31
- and.w #$00ff
- tax
- lda.b TempBuffer+5 ;get source bank of palette
- sta.b ThreeBytePointerHi ;
- ldy.w #$0004
- lda.b [TempBuffer+4],y ;get relative pointer to palette
- sta.b TempBuffer+7
- adc.b TempBuffer+4
- sta.b ThreeBytePointerLo
- iny
- iny
- lda.b [TempBuffer+4],y ;get relative pointer to EOF(in order to calculate tilemap length)
-
- sec
- sbc.b TempBuffer+7
- sta.b TempBuffer
- ldy.w #$0000 ;clear target/source counter
- DMAUploadPaletteBG1Loop:
- sep #$20
- lda.b [ThreeBytePointerLo],y ;load word from ThreeBytePointer
- sta.l PaletteBuffer,x ;store in bg1 map buffer
- rep #$31
- iny
- inx
- dec.b TempBuffer ;word-dec length counter
- bne DMAUploadPaletteBG1Loop ;done if length counter = 0
-
- sep #$20
- inc.b NMIPaletteUploadFlag
- plb
- plp
- rts
-
- ClearPalette:
- PHX
- PHP
- REP #$30 ; mem/A = 8 bit, X/Y = 16 bit
- SEP #$20
- STZ $2121
- LDX #$0100
- ClearPaletteLoop:
- STZ $2122
- DEX
- BNE ClearPaletteLoop
- PLP
- PLX
- RTS
-
- ClearPaletteBuffer:
- php
- rep #$31
- sep #$20
- lda.b #0 ;clear word: $0000
- ldy.w #$200
- ldx.w #PaletteBuffer&$ffff
- jsr ClearWRAM
-
-
- plp
- rts
- /*
- ldx.w #$0200
- ClearPaletteBufferLoop:
- dex
- stz.w PaletteBuffer&$ffff,x
- cpx.w #$0000
- bne ClearPaletteBufferLoop
- rts
- */
- ClearBg1TilemapBuffer:
- php
- rep #$31
- sep #$20
- lda.b #0 ;clear word: $0000
- ldy.w #$800
- ldx.w #Bg1MapBuffer&$ffff
- jsr ClearWRAM
- plp
- rts
-
- /*
- php
- rep #$30
- lda.w #$0000
- ldx.w #$0800
- ClearBg1TilemapBufferLoop:
- sta.l Bg1MapBuffer,x
- dex
- dex
- bne ClearBg1TilemapBufferLoop
- plp
- rts
- */
- ClearBg2TilemapBuffer:
- php
- rep #$31
- sep #$20
- lda.b #0 ;clear word: $0000
- ldy.w #$800
- ldx.w #Bg2MapBuffer&$ffff
- jsr ClearWRAM
- plp
- rts
- /*
- php
- rep #$30
- lda.w #$0000
- ldx.w #$0800
- ClearBg2TilemapBufferLoop:
- sta.l Bg2MapBuffer,x
- dex
- dex
- bne ClearBg2TilemapBufferLoop
- plp
- rts
- */
- ClearBg3TilemapBuffer:
- php
- rep #$31
- sep #$20
- lda.b #2 ;clear word: $2480
- ldy.w #$800
- ldx.w #Bg3MapBuffer&$ffff
- jsr ClearWRAM
- plp
- rts
- /*
- php
- rep #$30
- lda.w #$2480 ;bg3 tilemap clearing tile, priority set
- ldx.w #$0800
- ClearBg3TilemapBufferLoop:
- sta.l Bg3Buffer-2,x
- dex
- dex
- bne ClearBg3TilemapBufferLoop
- plp
- rts
- */
- ;uploades any otherwise unfitting piece of gfx-tiles to vram
- ;in:a,8bit: tileset number
- ; y,16bit: vram target
- ; transfer length is determined by tileset
- ;uses TempBuffer, TempBuffer+1
- GeneralVramUploader:
- ; lda.w #(TabTestTile8x8TilesEnd-TabTestTile8x8Tiles)
- php
- sep #$20
- sta.b TempBuffer
- phb
- lda.b #$7e
- pha
- plb
- rep #$31
- sei
- tya
- ldy.b DmaFifoPointer
- sta.w DmaFifoEntryTarget&$ffff,y ;vram target 2116
- lda.b TempBuffer ;multiply by 5
- and.w #$ff
- sta.b TempBuffer
- asl a
- asl a
- clc
- adc.b TempBuffer
- tax
- lda.l (GeneralTilesetsLUT+BaseAdress),x ;get source adress
- sta.b TempBuffer
-
- sta.w DmaFifoEntrySrcLo&$ffff,y ;source 4302
- inx
- lda.l (GeneralTilesetsLUT+BaseAdress),x ;get source adress
-
- sta.w DmaFifoEntrySrcHi&$ffff,y ;source 4303
-
- inx
- inx
- lda.l (GeneralTilesetsLUT+BaseAdress),x ;get source length
- sta.w DmaFifoEntryCount&$ffff,y
- sep #$20
- lda #1 ;transfer type normal dma
- sta.w DmaFifoEntryType&$ffff,y
-
- rep #$31
- tya ;update fifo entry pointer
- clc
- adc.w #DmaFifoEntryLength
- sta.b DmaFifoPointer
- cli
-
-
- plb
- plp
- rts
- IncBrightness:
- php
- rep #$30
- sep #$20
- lda FrameCounterLo ;load current frame
- and BrightnessSpeed ;and check selected bits(the more, the slower)
- bne DontIncBrightness ;only change brightness every second frame
- lda ScreenBrightness
- and #$0f ;and only brightness regs
- cmp #$0f ;skip increase
- beq DoneIncBrightness ;if maximum brightness is reached
- inc ScreenBrightness ;change brightness
- plp
- rts
- DontIncBrightness:
- plp
- rts ;do nothing
- DoneIncBrightness
- plp
- rts ;and return
- DecBrightness:
- lda FrameCounterLo ;load current frame
- and BrightnessSpeed ;and check selected bits(the more, the slower)
- bne DontDecBrightness ;only change brightness every second frame
- lda ScreenBrightness
- and #$0f ;and only brightness regs
- beq DoneDecBrightness
- dec ScreenBrightness ;change brightness
- rts
- DontDecBrightness:
- rts ;do nothing
- DoneDecBrightness:
- inc CurrentEvent ;go to next event if done with brightness change
- rts ;and return
- DisableScreen:
- php
- sep #$20
- lda.b #%10000000 ;force blanking
- sta $2100 ;
- plp
- rts
-
- EnableScreen:
- php
- sep #$20
- LDA $4210 ;reg $4210 - NMI status, reading resets
- cli
- lda ScreenBrightness ;setup screen brightness
- and #$7f ;screen always on and enabled
- sta $2100
- plp
- rts
- ResetScrollOffsets:
- php
- rep #$31
- lda.w #$3ff
- sta.w BG1VOfLo ;
- sta.w BG2VOfLo ;
- stz.w BG1HOfLo
- stz.w BG2HOfLo ;reset all bg1/bg2 offsets
- stz.w BG2VOfLo ;
- stz.w ScreenPixelPositionX
- stz.w ScreenPixelPositionY
- plp
- rts
- ;**********************************
- ;fade in/fade out
- ;in: a/8bit: number of sample when fadeout should start
- ;event is incremented automatically once fadeout is complete
- ;**********************************
- FadeInFadeOut:
- cpx.w FrameCounterLo
- bpl EventRoutineContinue
- lda #$03
- sta BrightnessSpeed
- jsr DecBrightness
- rts
- EventRoutineContinue:
- lda #$03
- sta BrightnessSpeed
- jsr IncBrightness
- rts
-
|