diff --git a/Art/Assets/Font8x8.gif b/Art/Assets/Font8x8.gif new file mode 100644 index 0000000..7037dfa Binary files /dev/null and b/Art/Assets/Font8x8.gif differ diff --git a/Art/Assets/Font8x8.xcf b/Art/Assets/Font8x8.xcf new file mode 100644 index 0000000..19f81ac Binary files /dev/null and b/Art/Assets/Font8x8.xcf differ diff --git a/GSCats.xcodeproj/project.pbxproj b/GSCats.xcodeproj/project.pbxproj index a2407e4..ac9a61f 100644 --- a/GSCats.xcodeproj/project.pbxproj +++ b/GSCats.xcodeproj/project.pbxproj @@ -22,6 +22,8 @@ 705C54E62124B7F300515A6B /* fan.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = fan.s; sourceTree = ""; }; 706DF1641F2D39F700AA6680 /* loader.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = loader.s; sourceTree = ""; }; 706DF1651F2D4A8100AA6680 /* terrain.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = terrain.s; sourceTree = ""; }; + 7076E9222A57AED90006E295 /* GenerateFont.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GenerateFont.py; sourceTree = ""; }; + 7076E9232A59113F0006E295 /* font8x8.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = font8x8.s; sourceTree = ""; }; 7088096D1F2ECE8D00D4C950 /* GenerateRenderSpans.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GenerateRenderSpans.py; sourceTree = ""; }; 708D1B1E27B9A1A600909AFC /* crosshair.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = crosshair.s; sourceTree = ""; }; 709175C01F60D263008FAFAB /* GenerateCircles.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GenerateCircles.py; sourceTree = ""; }; @@ -83,6 +85,8 @@ 70BDCBC92006AD5F00CB51F1 /* linkerConfig */, 70FE79D21F8814A600E0095C /* MerlinToCA65.sh */, 700F72872112428D00225B17 /* RenumberSpriteFiles.sh */, + 7076E9222A57AED90006E295 /* GenerateFont.py */, + 7076E9232A59113F0006E295 /* font8x8.s */, 7088096D1F2ECE8D00D4C950 /* GenerateRenderSpans.py */, 7059502B1F37A0BE00BBE90F /* GenerateVRAMTable.py */, 7099E3851F4107B100182A82 /* GenerateVRAMYOffset.py */, diff --git a/GenerateFont.py b/GenerateFont.py new file mode 100755 index 0000000..e4b713d --- /dev/null +++ b/GenerateFont.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 + +import sys +import PIL +from PIL import Image +from numpy import asarray + +CHAR_WIDTH = 8 +CHAR_HEIGHT = 8 +CHAR_FIRST = 32 +CHROMA = 14 + +def main(argv): + image = Image.open('Art/Assets/Font8x8.gif') + pixels = asarray(image) + numCharX = (int)(image.size[0]/CHAR_WIDTH) + numCharY = (int)(image.size[1]/CHAR_HEIGHT) + + for charY in range(0,1): #numCharY): + for charX in range(1,2): #numCharX): + charIndex = charY*numCharX + charX + currChar = chr(charIndex+CHAR_FIRST) + + print ("char%d:\n" % ord(currChar), end="") + + # Header for each rendering operation + print ("\ttya") # Transfer character VRAM position from Y to stack pointer + print ("\ttcs") + + # Iteratre through all the pixels + charOriginX = charX*CHAR_WIDTH + charOriginY = charY*CHAR_HEIGHT + + for charRow in reversed(range(0,CHAR_HEIGHT)): + print ("\t; Line %d" % charRow) + nextRowDelta = 160 + for charCol in reversed(range(0,CHAR_WIDTH,4)): + nibbles = [pixels[charOriginY+charRow][charOriginX+charCol], + pixels[charOriginY+charRow][charOriginX+charCol+1], + pixels[charOriginY+charRow][charOriginX+charCol+2], + pixels[charOriginY+charRow][charOriginX+charCol+3]] + + word = nibbles[2]<<12 | nibbles[3]<<8 | nibbles[0]<<4 | nibbles[1] + + if (nibbles[0]==CHROMA and nibbles[1]==CHROMA and nibbles[2]==CHROMA and nibbles[3]==CHROMA): + pass # Case 1 : All chroma, so let stack advance with no work + elif (nibbles[0]!=CHROMA and nibbles[1]!=CHROMA and nibbles[2]!=CHROMA and nibbles[3]!=CHROMA): + print ("\tpea $%04x" % word) # Case 2 : No chroma, so fast push + nextRowDelta -= 2 + else: + mask = 0 # Case 3 : Mixed chroma, so mask and or + if (nibbles[0]!=CHROMA): + mask = mask | 0xFF0F + if (nibbles[1]!=CHROMA): + mask = mask | 0xFFF0 + if (nibbles[2]!=CHROMA): + mask = mask | 0x0FFF + if (nibbles[3]!=CHROMA): + mask = mask | 0xF0FF + + sprite = word + if (nibbles[0]==CHROMA): + sprite = sprite & 0xFF0F + if (nibbles[1]==CHROMA): + sprite = sprite & 0xFFF0 + if (nibbles[2]==CHROMA): + sprite = sprite & 0x0FFF + if (nibbles[3]==CHROMA): + sprite = sprite & 0xF0FF + + print ("\ttsc") # Keep stack moving, even though we didn't use it + print ("\tdec") + print ("\tdec") + print ("\ttcs") + print ("\tlda 0,S") # Blend mask, sprite, and background + print ("\tand #$%04x" % mask) + print ("\tora #$%04x" % sprite) + print ("\tsta 0,S") + nextRowDelta -= 2 + + # Advance stack pointer to next row + print ("\ttsc") + print ("\tsec") + print ("\tsbc #%d" % nextRowDelta) + print ("\ttcs") + + # Footer for each rendering operation + print ("\tjmp returnFromTest") + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/font8x8.s b/font8x8.s new file mode 100644 index 0000000..7337d72 --- /dev/null +++ b/font8x8.s @@ -0,0 +1,140 @@ +char33: + tya + tcs + ; Line 7 + tsc + sec + sbc #160 + tcs + ; Line 6 + tsc + dec + dec + tcs + lda 0,S + and #$ff0f + ora #$00d0 + sta 0,S + tsc + dec + dec + tcs + lda 0,S + and #$f0ff + ora #$0d00 + sta 0,S + tsc + sec + sbc #156 + tcs + ; Line 5 + tsc + dec + dec + tcs + lda 0,S + and #$ff0f + ora #$00d0 + sta 0,S + tsc + dec + dec + tcs + lda 0,S + and #$f0ff + ora #$0d00 + sta 0,S + tsc + sec + sbc #156 + tcs + ; Line 4 + tsc + sec + sbc #160 + tcs + ; Line 3 + tsc + dec + dec + tcs + lda 0,S + and #$ff0f + ora #$00d0 + sta 0,S + tsc + dec + dec + tcs + lda 0,S + and #$f0ff + ora #$0a00 + sta 0,S + tsc + sec + sbc #156 + tcs + ; Line 2 + tsc + dec + dec + tcs + lda 0,S + and #$ff0f + ora #$00a0 + sta 0,S + tsc + dec + dec + tcs + lda 0,S + and #$f0ff + ora #$0a00 + sta 0,S + tsc + sec + sbc #156 + tcs + ; Line 1 + tsc + dec + dec + tcs + lda 0,S + and #$ff0f + ora #$00b0 + sta 0,S + tsc + dec + dec + tcs + lda 0,S + and #$f0ff + ora #$0b00 + sta 0,S + tsc + sec + sbc #156 + tcs + ; Line 0 + tsc + dec + dec + tcs + lda 0,S + and #$ff0f + ora #$00f0 + sta 0,S + tsc + dec + dec + tcs + lda 0,S + and #$f0ff + ora #$0f00 + sta 0,S + tsc + sec + sbc #156 + tcs + jmp returnFromTest diff --git a/gamemanager.s b/gamemanager.s index 0cc9dfe..acc41e4 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -67,16 +67,14 @@ beginGameplay: jsr compileTerrain jsr clipTerrain -; jsl renderTerrainSpans ; Part of the now disabled fill-mode renderer -; lda #7 -; sta PARAML0 -; lda #50 -; sta PARAML1 -; ldy #3 -; jsr craterTerrain -; jsr compileTerrain -; jsr clipTerrain + ; Test font renderer +; FASTGRAPHICS +; ldy #$3000 ;#$2504 +; jmp char33 +returnFromTest: +; SLOWGRAPHICS +; ;HARDBRK gameplayLoop: lda projectileActive @@ -417,7 +415,7 @@ fire: basePalette: - .word $0aef,$0080,$0080,$0861,$0c93,$0eb4,$0d66,$0f9a,$0777,$0f00,$0bbb,$ddd,$007b,$0ff0,$0000,$0fff + .word $0aef,$0080,$0080,$0861,$0c93,$0eb4,$0d66,$0f9a,$0777,$0f00,$0bbb,$ddd,$007b,$0a5b,$0000,$0fff statusBarPalette: .word $0aef,$0fff,$0aef,$0aef,$0aef,$0aef,$0d66,$0aef,$0aef,$0aef,$0aef,$0aef,$0aef,$0aef,$0aef,$0000 diff --git a/gscats.s b/gscats.s index b93f075..7484454 100644 --- a/gscats.s +++ b/gscats.s @@ -54,6 +54,7 @@ quitGame: .include "inventory.s" .include "dirt.s" .include "crosshair.s" +.include "font8x8.s" endMainBank2: