diff --git a/images/font.aseprite b/images/font.aseprite index 5009687..5ecfcd8 100644 Binary files a/images/font.aseprite and b/images/font.aseprite differ diff --git a/images/font.bmp b/images/font.bmp index c007184..a51af4b 100644 Binary files a/images/font.bmp and b/images/font.bmp differ diff --git a/main.asm b/main.asm index 3659f3b..ed39580 100644 --- a/main.asm +++ b/main.asm @@ -125,6 +125,10 @@ CHUNK_DONE = 0 ; no more chunks ; Arguments: [start PPU address] [text] $00 DrawTextFromTable + ; Clears out two full rows of tiles. Takes two + ; arguments, one for each tile ID to start from. + ClearText + ; Turn off the PPU and enable commands to draw ; to the screen outside of NMI TurnOffPPU @@ -149,8 +153,8 @@ CHUNK_DONE = 0 ; no more chunks SetPalette ; TODO: rewrite these functions - TvAttr - StaticAttr + ;TvAttr + ;StaticAttr ; Clear an attribute table to $00 ClearAttr0 @@ -219,6 +223,7 @@ sf_ExitRoutine: .res 1 sf_TextStartTiles: .res 2 ; Tile IDs where the two text areas start sf_DialogueTable: .res 2 sf_DialogueSwitch: .res 1 ; used in sf_DrawText and sf_DrawTextFromTable +sf_LiveSwitch: .res 1 ; Only draw text in NMI Sleeping: .res 1 diff --git a/maps/main-boards.tmx b/maps/main-boards.tmx index 1c3c946..b618b38 100644 --- a/maps/main-boards.tmx +++ b/maps/main-boards.tmx @@ -1,7 +1,7 @@ - + - + @@ -20,7 +20,7 @@ 23,0,23,0,23,0,23,0,23,0,0,0,23,0,23,0,23,0,23,0,23,0,23,0, 23,0,23,0,23,0,23,0,23,0,0,0,23,0,23,0,23,0,23,0,23,0,23,0, 23,0,23,0,23,0,23,0,23,0,0,0,23,0,23,0,23,0,23,0,23,0,23,0, -23,0,23,0,23,0,23,0,23,0,0,0,23,0,23,0,23,0,23,0,23,0,23,0 +23,0,23,0,23,0,23,0,3,0,0,0,4,0,23,0,23,0,23,0,23,0,23,0 @@ -275,7 +275,7 @@ 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38 - + diff --git a/scene-data.asm b/scene-data.asm index a177608..5eb34b5 100644 --- a/scene-data.asm +++ b/scene-data.asm @@ -199,6 +199,12 @@ Scene_Intro: .byte 2 .byte SceneCmd::TurnOffPPU + + ; Clear out the text from before + .byte SceneCmd::ClearText + .byte $90 ; start tile ID + .byte $A0 ; start tile ID + .byte SceneCmd::SetNametable0 .byte SceneCmd::DrawFullScene @@ -233,8 +239,37 @@ Scene_Intro: .byte SceneCmd::SetFramePointer .word $0000 + .byte SceneCmd::PrepareText + .word $22A8 ; NT address + .byte 0 ; ID + .byte $90 ; start tile ID + + .byte SceneCmd::PrepareText + .word $22C8 ; NT address + .byte 1 ; ID + .byte $A0 ; start tile ID + + .byte SceneCmd::DrawTextFromTable + .byte 0 | $80 + .byte Dialogue::CyberPiss_1 + + .byte SceneCmd::DrawTextFromTable + .byte 1 | $80 + .byte Dialogue::CyberPiss_2 + + .byte SceneCmd::WaitSeconds + .byte 3 + + .byte SceneCmd::DrawTextFromTable + .byte 0 | $80 + .byte Dialogue::CyberPiss_3 + + .byte SceneCmd::DrawTextFromTable + .byte 1 | $80 + .byte Dialogue::CyberPiss_4 + .byte SceneCmd::WaitSeconds - .byte 10 + .byte 5 .byte SceneCmd::GotoInit diff --git a/scene-engine.asm b/scene-engine.asm index af1747e..1b85816 100644 --- a/scene-engine.asm +++ b/scene-engine.asm @@ -63,14 +63,15 @@ scene_Functions: .word sf_SetUnskippable-1 .word sf_DrawText-1 .word sf_DrawTextFromTable-1 + .word sf_ClearText-1 .word sf_TurnOffPPU-1 .word sf_TurnOnPPU-1 .word sf_FillNametable-1 .word sf_LoadChr-1 .word sf_PadSprites-1 .word sf_SetPalette-1 - .word WriteNewsAttr-1 - .word WriteStaticAttributes-1 + ;.word WriteNewsAttr-1 + ;.word WriteStaticAttributes-1 .word ClearAttrTable0-1 .word ClearAttrTable1-1 .word ClearAttrTable2-1 @@ -243,7 +244,10 @@ sf_SetUnskippable: rts sf_TurnOffPPU: - .Disable_Drawing + ;.Disable_Drawing + lda #0 + sta sf_PpuOn + jsr WaitForNMI rts sf_TurnOnPPU: @@ -409,6 +413,48 @@ sf_SetExitRoutine: sta sf_ExitRoutine rts +sf_ClearText: + ; Get the CHR start tile ID + lda (AddressPointer3), y + iny + tax + + ; TileID -> CHR Address + lda data_Mult16_A, x + sta AddressPointer0+0 + lda data_Mult16_B, x + sta AddressPointer0+1 + + ; Clear all the CHR tiles in PPU RAM + ;jsr WriteBufferUnrolled + ldx #$FF + lda #$00 + jsr ClearTileRow + + ; Do it again, lmao + + ; Get the CHR start tile ID + lda (AddressPointer3), y + iny + tax + + ; TileID -> CHR Address + lda data_Mult16_A, x + sta AddressPointer0+0 + lda data_Mult16_B, x + sta AddressPointer0+1 + + ; Clear all the CHR tiles in PPU RAM + ;jsr WriteBufferUnrolled + ldx #$FF + lda #$00 + jsr ClearTileRow + + jsr TextClearStringBuffer + jsr TextClearBuffer + + rts + sf_DrawText: ;bit $2002 lda #$00 @@ -440,25 +486,26 @@ sf_DrawText: lda sf_DialogueSwitch beq :+ - ; Backup pointer - lda AddressPointer3+0 - pha - lda AddressPointer3+1 - pha - ; Lookup pointer to text + iny lda (AddressPointer3), y + asl a tax lda DialogueIndex+0, x sta AddressPointer4+0 lda DialogueIndex+1, x sta AddressPointer4+1 + ; Backup pointer + lda AddressPointer3+0 + pha + lda AddressPointer3+1 + pha + ; Backup Y - iny tya pha - ldy #0 + ldy #$FF ; Grab pointer to text lda AddressPointer4+0 @@ -501,16 +548,33 @@ sf_DrawText: ;jsr TextPrepare_v2 jsr TextPrepare_v3 + ;lda #16 ; number of chars + ldx #0 + ;ldx #$FF + + lda sf_PpuOn + beq @fulldraw + lda #16 ; CHR count + + jsr PreparePartialTextWrite + +@partial: + jsr WaitForNMI + jsr WritePartialTextBuffer + dec ChrCount + bne @partial + jmp @drawdone + +@fulldraw: lda AddressPointer6+0 sta AddressPointer0+0 lda AddressPointer6+1 sta AddressPointer0+1 - lda #16 ; number of chars - ldx #0 - ;ldx #$FF + lda #16 ; CHR count jsr WriteTextBuffer +@drawdone: jsr TextClearBuffer pla @@ -582,7 +646,7 @@ sf_GotoInit: NMI_Scene: pha lda sf_PpuOn - beq :+ + beq @ppuoff ;lda #0 ;sta sf_PpuOn @@ -602,7 +666,13 @@ NMI_Scene: lda #0 sta $2005 sta $2005 -: + dec Sleeping + pla + rti + +@ppuoff: + lda #0 + sta $2001 dec Sleeping pla rti diff --git a/screen-decode.asm b/screen-decode.asm index afe069a..4c3bbc5 100644 --- a/screen-decode.asm +++ b/screen-decode.asm @@ -280,6 +280,7 @@ WriteTvAttr: sta $2007 sta $2007 rts + WriteNewsAttr: ; 23CA lda #$23 diff --git a/text-engine-ram.asm b/text-engine-ram.asm index 629334c..e97dcd7 100644 --- a/text-engine-ram.asm +++ b/text-engine-ram.asm @@ -22,6 +22,8 @@ WorkingRuneB: .res 8 .segment "MAINRAM" +BgTextPal: .res 1 + ;ChrAddr: .res 2 ChrCount: .res 1 ; Tile count, not byte count diff --git a/text-engine.asm b/text-engine.asm index 07f025c..db40761 100644 --- a/text-engine.asm +++ b/text-engine.asm @@ -8,6 +8,28 @@ SPACE_WIDTH = 5 +; Clear a set of 16 tiles, starting at the address in AddressPointer0 +; X holds values for first bit plane +; A holds values for second bit plane +ClearTileRow: + pha + bit $2002 + lda AddressPointer0+1 + sta $2006 + lda AddressPointer0+0 + sta $2006 + pla + + .repeat 16 + .repeat 8 + stx $2007 + .endrepeat + .repeat 8 + sta $2007 + .endrepeat + .endrepeat + rts + WriteBufferUnrolled: bit $2002 lda AddressPointer0+1 @@ -15,7 +37,7 @@ WriteBufferUnrolled: lda AddressPointer0+0 sta $2006 - .repeat 21, B + .repeat 16, B .repeat 8, C lda ChrBuffer + ((B*8) + C) sta $2007 @@ -250,6 +272,58 @@ WriteTextBuffer_LevelSelect: sta TextEor rts +; A has count +; X has the BG palette value thing in it +PreparePartialTextWrite: + sta ChrCount + txa + sta BgTextPal + lda #0 + sta TextIdx + lda #$FF + sta TextEor + rts + +; Similar to WriteTextBuffer, but only +; writes a few tiles. (one for now) +WritePartialTextBuffer: + bit $2002 + lda AddressPointer6+1 + sta $2006 + lda AddressPointer6+0 + sta $2006 + + ldx TextIdx + + .repeat 8,i + lda ChrBuffer+i, x + eor TextEor + sta $2007 + .endrepeat + + txa + clc + adc #8 + sta TextIdx + + ; Second plane + lda BgTextPal + .repeat 8 + sta $2007 + .endrepeat + + clc + lda #16 + adc AddressPointer6+0 + sta AddressPointer6+0 + bcc :+ + inc AddressPointer6+1 +: + lda #0 + sta $2005 + sta $2005 + rts + ; A has count ; X has the BG palette value thing in it WriteTextBuffer: