Penetrator-apple2/src/apple2/text.inc

389 lines
15 KiB
PHP

;-----------------------------------------------------------------------------
; text.inc
; Part of penetrator, the zx spectrum game, made for Apple II
;
; Stefan Wessels, 2019
; This is free and unencumbered software released into the public domain.
;-----------------------------------------------------------------------------
.segment "RODATA"
.feature string_escapes
; In game text
textTopLine: .asciiz "Stage . Player - - Score 0"
textDanger: .asciiz "Danger"
textShips: .asciiz "Ships"
textTrainer: .asciiz "Trainer"
textPlayer: .asciiz "P L A Y E R "
; title screen
textHighScores: .asciiz "High Scores"
textPhilip: .asciiz " Written by - Philip Mitchell - "
textCopyright: .asciiz "** Copyright \"Beam Software\" **"
textApple2: .asciiz " Apple II version by "
textStefan: .asciiz " Stefan Wessels, Dec 2019 "
textSupport: .asciiz " Lots of great Apple II "
textOliver: .asciiz " Support from Oliver Schmidt "
textSource: .asciiz " Source on GitHub: "
textGitHub: .asciiz " StewBC/penetrator-apple2 "
textGameOver: .asciiz "********** GAME OVER **********"
; main menu
textInstructions: .asciiz "INSTRUCTIONS"
textPress: .asciiz "PRESS"
textUnderline: .asciiz "-----"
textOneTwo: .asciiz "\"1\" OR \"2\" FOR NUMBER OF PLAYERS"
textTrain: .asciiz "\"T\" FOR TRAINING CONTROL CENTER"
textEdit: .asciiz "\"E\" FOR THE LANDSCAPE EDITOR"
textLoad: .asciiz "\"L\" TO LOAD ANOTHER LANDSCAPE"
textSirens: .asciiz "\"S\" SET AUDIO: "
textQuit: .asciiz "\"Q\" QUIT"
; main menu audio options
textAudio1: .asciiz "ENGINE, SFX"
textAudio2: .asciiz "SFX "
textAudio3: .asciiz "NONE "
; training mode menu
textTrainingMode: .asciiz "TRAINING MODE"
textPressStage: .asciiz "PRESS NUMBER OF DESIRED STAGE"
textOneToFour: .asciiz "(1 - 4) TO START."
textBackup: .asciiz "ESC to back up or exit mode"
; edit mode screen
textEditStage: .asciiz "STAGE"
textEditHelp: .byte "PRESS 'C' FOR ",$86," COMMAND SUMMARY", $00
textEditBrush: .asciiz "BRUSH: "
textEditTerrain: .asciiz "TERRAIN"
textEditEnemies: .asciiz "ENEMIES"
textEditDnArrow: .byte $85, $00
; edit help screen
textEdtHlp01: .asciiz "LANDSCAPE EDITOR COMMANDS"
textEdtHlp02: .asciiz "--------- ------ --------"
textEdtHlp03: .asciiz "JOYSTICK- MOVE THE CURSOR"
textEdtHlp04: .asciiz "KBD-B - TOGGLE BETWEEN TERRAIN"
textEdtHlp05: .asciiz " AND ENEMY BRUSHES"
textEdtHlp06: .asciiz "SPACE - CONTINIOUS MOVEMENT"
textEdtHlp07: .asciiz ""
textEdtHlp08: .asciiz "JOYBTN1 - SET TERRAIN TOP"
textEdtHlp09: .asciiz " OR PLACE A MISSILE"
textEdtHlp10: .asciiz "JOYBTN0 - SET TERRAIN BOTTOM OR"
textEdtHlp11: .asciiz " PLACE A RADAR"
textEdtHlp12: .asciiz "1 - 5 - SKIP TO STAGE"
textEdtHlp13: .asciiz "S - SAVE THIS WORLD"
textEdtHlp14: .asciiz "L - LOAD A WORLD"
textEdtHlp15: .asciiz "ERASE ENEMIES USING A/B"
textEdtHlp16: .asciiz "WITH THE ENEMIES BRUSH"
textEdtHlp17: .asciiz "ESC - END THE EDIT SESSION"
; win screen
textBonus: .asciiz "BONUS"
textPoints: .asciiz "POINTS"
text1000: .asciiz "1000"
textWow: .asciiz "WOW"
textHome: .asciiz "HOME"
; high score name entry
textCongrats: .asciiz "***** CONGRATULATIONS *****"
textHSPlayer: .asciiz "PLAYER -- "
textTop5: .asciiz "Your score is in the top 5"
textTypeName: .asciiz "Please type in your name"
; file name entry
textFileLoad: .asciiz "FILE LOAD"
textFileSave: .asciiz "FILE SAVE"
textFileLines: .asciiz "---------"
textFileInfoL: .asciiz "Load"
textFileInfoS: .asciiz "Save"
textFileInfo: .asciiz "world data"
textFileEnter: .asciiz "Please enter a file name"
textFileSuccess: .asciiz "SUCCESS."
textFileThe: .asciiz "The"
textFileFailed: .asciiz "Failed. Error Code"
hihgScoreFileName:.asciiz "PENSCORES"
;-----------------------------------------------------------------------------
.segment "CODE"
;-----------------------------------------------------------------------------
; Use the print macro to call this code
; Writes a null-terminated string to the back buffer
; temp1/2 Ptr to the string
; textX - the string draw X position (in col coords)
; textY - the string draw Y position
.proc textOut
textX = tempBlock + 10
textY = tempBlock + 11
xPos = tempBlock + 12
yPos = tempBlock + 13
zaStrL = tempBlock + 1 ; parameter - string lo
zaStrH = tempBlock + 2 ; parameter - string hi
zaFontL = tempBlock + 4 ; internal - point at the character memory Lo
zaFontH = tempBlock + 5 ; internal - point at the character memory Hi
zaFontOffset = tempBlock + 6 ; 0-15 - index from zaFont
loop:
ldy #0
lda (zaStrL), y ; get the character in the string
bne :+ ; if non-null process it
rts ; exit on 0 terminator
:
jsr setFont
lda textY ; get the screen Y for text
sta yPos ; init the row working buffer
plotLoop:
ldy yPos ; at the working row offset
lda rowL, y ; get the memory address
adc textX ; add in column (x pos of text)
sta write + 1 ; point lo at memory
lda rowH, y
adc zVramH
sta write + 2
ldy zaFontOffset ; get the offset into the font
lda (zaFontL), y ; get the actual left character byte
write:
sta PLACEHOLDER ; plot the left hand side
cpy #7
bcs nextChar ; 0-7 then done with this character (bottom always blank)
inc zaFontOffset ; move a byte for last row plotted
inc yPos ; move down a row on screen
bne plotLoop ; always take this branch
nextChar:
inc textX ; character column
inc zaStrL ; next character in string
bne loop
inc zaStrH
bne loop ; always branch back
.endproc
;-----------------------------------------------------------------------------
; Like textOut but uses drawPoltXY to plot each pixel in the text
; so you can write big strings using width and height.
; a setting of width and height both 1 results in a character that's
; 32x32 on-screen
.proc textBigPrint
zaStrL = tempBlock + 1 ; parameter - string lo
zaStrH = tempBlock + 2 ; parameter - string hi
zaBitCnt = tempBlock + 3 ; internal - how many bits to process for a byte to write
zaFontL = tempBlock + 4 ; internal - point at the character memory Lo
zaFontH = tempBlock + 5 ; internal - point at the character memory Hi
zaFontOffset = tempBlock + 6 ; internal - 0-15 - index from zaFont
width = tempBlock + 14 ; shared with drawPlotXY
height = tempBlock + 15
textX = tempBlock + 12
textY = tempBlock + 13
xPos = tempBlock + 7
yPos = tempBlock + 8
loop:
ldy #0
lda (zaStrL), y ; get the character in the string
bne :+ ; if non-null process it
rts ; exit on 0 terminator
:
jsr setFont
lda textY ; get the screen Y for text
sta yPos
inc zaFontOffset
plotLoop:
lda textX
sta xPos
ldx #6 ; each font character byte uses 7 pixels
stx zaBitCnt
ldy zaFontOffset ; get the offset into the font
lda (zaFontL), y ; get the actual left character byte
lsr
jsr drawBits
inc zaFontOffset ; go to the next line
ldy zaFontOffset
cpy #7 ; characters are 8 bytes long, care about 7
bcs nextChar ; if 16 then done with this character
lda yPos ; adjust the "plot" down a line
clc
adc height
sta yPos
bne plotLoop ; always take this branch
nextChar:
lda width ; move along in X to the next character
asl ; 6x the width + 2
asl
adc width
adc width
adc #2
adc textX ; add to current "plot" position
sta textX
inc zaStrL ; next character in string
bne loop
inc zaStrH
bne loop ; always branch back
drawBits:
lsr ; shift a bit into carry
pha ; save the shifted byte
bcc :+ ; if carry is set, need to plot a pixel
clc
ldx xPos ; get the x and y of where to plot
ldy yPos
jsr drawPlotXY ; draw the pixel
:
lda xPos ; move along one "pixel"
clc
adc width
sta xPos
pla ; restore the shifted character
dec zaBitCnt ; see if all bytes were handled
ldx zaBitCnt
bne drawBits
rts
.endproc
;-----------------------------------------------------------------------------
; Point zaFont(H|L) at the character definition for the character in the accumulator
; y register must be 0 when calling this routine
.proc setFont
zaFontL = tempBlock + 4 ; internal - point at the character memory Lo
zaFontH = tempBlock + 5 ; internal - point at the character memory Hi
zaFontOffset = tempBlock + 6 ; internal - 0-15 - index from zaFont
sty zaFontOffset ; start at 0th byte in font
sty zaFontH
sty zaFontL
sec ; subtract 32 as font starts at char 32 (space)
sbc #$20
asl ; mult 8 as that's how many bytes per char
rol zaFontH
asl
rol zaFontH
asl
rol zaFontH
adc #<font ; add in the memory location
sta zaFontL
lda #>font
adc zaFontH
sta zaFontH ; now font points at the character data
rts
.endproc
;-----------------------------------------------------------------------------
; Turns a BCD number into a text string at textNumber.
; zaStr is a ptr to the number in BCD
; y reg is the number of bytes to convert
; x reg <> 0 means print at least one digit, even if 0
.proc textBCDtoSZ
zaStrL = tempBlock + 1
zaStrH = tempBlock + 2
zaForce = tempBlock + 3
stx zaForce
dey ; zero based so -1
ldx #0
leading: ; skip leading 0's with spaces
lda #' ' ; prep buffer with two spaces
sta textNumber, x ; if the byte to output is $00
sta textNumber + 1, x ; so leading 0's are skipped
lda (zaStrL), y ; get the high byte
bit Bit8765Mask ; check 1st digit
bne loop1 ; if not zero - start printing
inx ; skip the zero by accepting the space
and #$0f ; check the 2nd digit
beq :+ ; go skip if zero
jsr digit ; print the digit
bne loop2 ; and join the main print loop
:
inx ; skip the next char in the output string
dey ; go to next byte in the BCD number
bpl leading ; keep going till all bytes done
ldy zaForce ; nothing printed - see if at least 1 digit
beq done ; needs to be printed and if no - then done
dex ; step back one digit in the string
lda #'0' ; get a zero
sta textNumber, x ; put it in the string
inx
bne done ; JuMP to done
loop: ; main loop once a digit is found
lda (zaStrL), y ; get the 2 decimal digits
loop1:
jsr both ; print them both starting with left
loop2:
dey ; next score part
bpl loop ; keep going while there are score parts
done:
lda #0 ; load a null-terminator
sta textNumber, x ; store it in the output string
rts
both:
pha ; save the 2 digits
lsr ; shift right down
lsr
lsr
lsr
jsr digit ; go print it
pla ; restore both
and #$0f ; mask off the right leaving left
digit: ; print the digit
ora #$30 ; add "0" to the decimal
sta textNumber, x ; put it in the string
inx ; advance the string pointer
rts
.endproc
;-----------------------------------------------------------------------------
; Prints the accumulator to the szHez text as 2 hex bytes
.proc toHex
ldx #0 ; offset into the szHex buffer
pha ; save a for lower 4 bits
lsr ; move upper 4 bits to lo
lsr
lsr
lsr
jsr :+ ; process upper 4 bits
pla ; restore a to process lower 4 bits
:
and #$0f ; mask to only the 4 bits now in lo
cmp #10 ; see if it's > 9
bcc :+
adc #6 ; move from 10+ to a+
:
adc #$30 ; and move to '0' and beyond
sta szHex, x ; save this in the buffer
inx ; go to next buffer location
rts ; and return to self or caller
.endproc