;****************************************************************************** ; ; Tomcat C16 (c) 1989 Players Software. ; ; Written by Darron M Broad. ; ; Revised by Darron M Broad for ACME assembler June, 2007. ; ;****************************************************************************** ;!source !convtab raw ;****************************************************************************** ; loader loads in at $1000..$17ff then relocates main code to $200..$7ff ; loader constants OBJSRC = $1200 ; source OBJDEST = $0200 ; destination OBJDIFF = OBJSRC-OBJDEST ; difference SHIFTDATA = $1316 ; fixed address for some reason SHIFTCHARSET = $1750 ; skip over graphics at $1600..$174f CHARBASE = $04 ; loader character set CLEARCHAR = $5D ; BLANK LOADBACKGNDCOL = $7E ; color memory colour (loader) GAMEBACKGNDCOL = $49 ; color memory colour (game) ; screen locations for messages SCNADDRERR = 3162 ; $0c5a SCNADDRREWIND = SCNADDRERR SCNADDRLOAD = 3403 ; $0d46 SCNADDRLEVBOX = 3645 ; $0e3d SCNADDRLEVEL = 3889 ; $0f31 ; temporary storage T0 = $02 TA = $03 TB = $04 ; temporary storage (shared with game) T1 = $92 T2 = $93 T3 = $94 T4 = $95 T5 = $96 T6 = $97 T7 = $98 ; turbo tape loader vars FILEADDRSTART = $03 ; 2 bytes FILEADDREND = $05 ; 2 bytes FILENAMELEN = $07 FILEADDRTEST = $08 FILECHKSUM = $09 TEMP = $0A DATA = $0B FILENAME = $0100 ; game vars LEVEL = $0C LEVELOADED = $0D SCORE = $17 HIGHSCORE = $0E PLAYERLIVES = $1A PREVSCORE = $23FD ; stored just below level data ;****************************************************************************** ; ; relocate low memory code downloads ($1200..$17ff => $200..$7ff) ; ;****************************************************************************** * = $1000 BRK BRK BRK BRK BRK BRK BRK BRK BEGIN: SEI LDX #0 BEGIN1: LDA OBJSRC,X STA OBJDEST,X LDA OBJSRC+256,X STA OBJDEST+256,X LDA OBJSRC+512,X STA OBJDEST+512,X LDA OBJSRC+768,X STA OBJDEST+768,X LDA OBJSRC+1024,X STA OBJDEST+1024,X LDA OBJSRC+1280,X STA OBJDEST+1280,X INX BNE BEGIN1 JMP BEGINLOW - OBJDIFF ;****************************************************************************** ; ; low memory code ; ;****************************************************************************** * = OBJSRC ;****************************************************************************** ; ; LEVEL CONTROL. entry point from game. ; ;****************************************************************************** JSR SCREENINIT - OBJDIFF LDA LEVEL CMP LEVELOADED BEQ LEVELCTRL4 CMP #3 BCC LEVELCTRL1 LDA #<3526 ; game over, lame success message STA TA LDA #>3526 STA TB LDX #10 LDY #MSGWELLDONE - MSGADDR JSR DRAWFLASH - OBJDIFF LDA #1 ; back to level 1 STA LEVEL JMP OBJSRC - OBJDIFF LEVELCTRL1: ORA #$30 STA FILENAME LDA #1 STA FILENAMELEN LDA LEVEL CMP LEVELOADED BCS LEVELCTRL3 JSR REWIND - OBJDIFF LEVELCTRL2: JSR SCREENINIT - OBJDIFF LEVELCTRL3: JSR LOADLEVELMSG - OBJDIFF JSR READFILE - OBJDIFF TXA BEQ LEVELCTRL4 JSR ERRORMSG - OBJDIFF JMP LEVELCTRL2 - OBJDIFF LEVELCTRL4: LDA LEVEL STA LEVELOADED JSR DRAWTITLESCN - OBJDIFF JMP SCREEN - OBJDIFF ;****************************************************************************** ; ; copy text onto screen ; ;****************************************************************************** PRINT: LDY #0 PRI1: LDA MSGADDR - OBJDIFF,X BEQ PRT2 STA (T1),Y INX INY BNE PRI1 PRT2: RTS ;****************************************************************************** ; ; ; ;****************************************************************************** ERRORMSG: LDA #SCNADDRERR STA TB LDX #9 LDY #MSGERROR - MSGADDR JSR DRAWFLASH - OBJDIFF ;****************************************************************************** ; ; ; ;****************************************************************************** REWIND: LDA #SCNADDRREWIND STA TB LDX #9 LDY #MSGREWIND - MSGADDR JMP DRAWFLASH - OBJDIFF ;****************************************************************************** ; ; ; ;****************************************************************************** LOADLEVELMSG: LDA #SCNADDRLEVBOX STA T2 LDX #6 LDA #$40 JSR DRAWBOX - OBJDIFF LDX #MSGLEVEL - MSGADDR JSR PRINT - OBJDIFF LDA #SCNADDRLEVEL STA T2 LDX #2 LDA #$5F JSR DRAWBOX - OBJDIFF LDY #0 LDA LEVEL ORA #$60 STA (T1),Y LOADINGMSG: LDA #SCNADDRLOAD STA T2 LDX #8 LDA #$40 JSR DRAWBOX - OBJDIFF LDX #MSGLOADING - MSGADDR JMP PRINT - OBJDIFF ;****************************************************************************** ; ; load first level and init game ; ;****************************************************************************** BEGINLOW: JSR SCREENINIT - OBJDIFF JSR LOADINGMSG - OBJDIFF LDX #0 STX FILENAMELEN STX LEVELOADED STX HIGHSCORE STX HIGHSCORE+1 STX HIGHSCORE+2 INX STX LEVEL JSR READFILE - OBJDIFF TXA BNE BEGINLOWERROR JSR READFILE - OBJDIFF TXA BNE BEGINLOWERROR JMP $1000 ; init game BEGINLOWERROR: JSR ERRORMSG - OBJDIFF JMP BEGINLOW - OBJDIFF ;****************************************************************************** ; ; ; ;****************************************************************************** SCREENINIT: LDX #19 SETV1: LDA TEDD - OBJDIFF,X STA $FF06,X DEX BPL SETV1 LDX #0 SETV2: LDA #CLEARCHAR STA $C00,X STA $D00,X STA $E00,X STA $F00,X LDA #LOADBACKGNDCOL STA $800,X STA $900,X STA $A00,X STA $B00,X INX BNE SETV2 RTS ; skips 3 bytes here * = SHIFTDATA ; fixed section address TEDD: !byte $1B,$18,0,0,2,200 !byte 255,255;CURSOR !byte 0,0,0,0;SOUND !byte $C8,CHARBASE,8 !byte 6,$36,$16,$00,6 MSGADDR: MSGLOADING: !raw "LOADING",$00 MSGLEVEL: !raw "LEVEL",$40,$00 MSGERROR: !raw "ERROR",$40,"IN",0 MSGREWIND: !raw $40,"REWIND",$40,0 MSGTOMCAT: !raw "TOMCAT",0 MSGCOPY: !raw "COPYRIGHT",$40,"PLAYERS",$40,$61,$69,$68,$69,0 MSGDMB: !raw "THIS",$40,"VERSION",$40,"CODED",$40,"BY",$40,"DARRON",$40 !raw "M",$40,"BROAD",0 MSGSCORE: !raw "SCORE",0 MSGHI: !raw "HI",0 MSGLINE: !word $6060,$6060,$6060 !byte $60,0 MSGPRESSSPACE: !raw "PRESS",$40,"SPACE",$40,"FOR",$40,$40,"LEVEL",$40,0 MSGWELLDONE: !raw "WELL",$40,"DONE",0 ;****************************************************************************** ; ; cassette turbo loader ; ;****************************************************************************** TEDTMR2 = $FF02 TINT = $FF09 SYNC = $16 PIO = 1 READFILE: LDA $FF19 PHA LDX #1 RETRY: LDA #0 STA $FF19 STA FILECHKSUM STA PIO LDY #255 SYNCT: JSR READBYTE - OBJDIFF CMP #SYNC BEQ GOTSYN STX DATA JSR SKIPB - OBJDIFF BCC SYNCT GOTSYN: JSR READBYTE - OBJDIFF CMP #SYNC BEQ GOTSYN CMP FILENAMELEN BNE RETRY NAMCHK: INY CPY FILENAMELEN BCS NMEND JSR READCHECK - OBJDIFF CMP FILENAME,Y BEQ NAMCHK BNE RETRY NMEND: LDY #3 GADDR: JSR READCHECK - OBJDIFF STA FILEADDRSTART,Y DEY BPL GADDR JSR READCHECK - OBJDIFF CMP FILECHKSUM BNE ERROR LDY FILEADDRSTART LDA #0 STA FILEADDRSTART STA FILEADDRTEST RBLOCK: LDA FILEADDRSTART+1 CMP FILEADDREND +1 PHP BCC NOTYT LDA FILEADDREND BEQ RDONE STA FILEADDRTEST NOTYT: JSR READCHECK - OBJDIFF STA (FILEADDRSTART),Y INY CPY FILEADDRTEST BNE NOTYT JSR READCHECK - OBJDIFF CMP FILECHKSUM BNE ERROR INC FILEADDRSTART+1 PLP BNE RBLOCK PHA ; DUMMY RDONE: LDX #0 !byte $2C ERROR: LDX #$80 PLA ; DUMMY OR STATUS LDA #$88 STA PIO PLA STA $FF19 RTS ;****************************************************************************** ; ; read byte from tape ; ;****************************************************************************** READCHECK: LDA DATA EOR FILECHKSUM STA FILECHKSUM READBYTE: LDA #$FE STA DATA SKIPB: STY TEMP LDY #$38 ; $e8 used by game READ0: INC $FF19 LDA #$10 READ1: BIT PIO BNE READ1 STY TEDTMR2 STX TEDTMR2+1 READ2: BIT PIO BEQ READ2 LDA TEDTMR2+1 ASL ROL DATA BCS READ0 LDY TEMP LDA DATA RTS ;****************************************************************************** ; ; draw game right panel? ; ;****************************************************************************** SCREEN: LDA #$B ; blank screen STA $FF06 LDX #0 SCR1: LDA #0 STA $C00,X ; screen memory STA $D00,X STA $E00,X STA $F00,X LDA #GAMEBACKGNDCOL STA $800,X ; color memory STA $900,X STA $A00,X STA $B00,X INX BNE SCR1 LDA #<$846 STA T1 STA T3 LDA #>$846 STA T2 EOR #4 STA T4 LDA #BDAT - OBJDIFF STA T6 LDA #0 STA T0 LDX #11 BORDER: LDA #$37 LDY #9 BORD1: STA (T1),Y DEY BPL BORD1 LDY #49 BORD2: STA (T1),Y DEY CPY #40 BCS BORD2 LDA #0 STA T7 ZEROIZ: LDY T0 LDA (T5),Y INC T0 CMP #1 BEQ ZESKIP LDY T7 STA (T3),Y INC T7 PHA TYA CLC ADC #40 TAY PLA ORA #1 STA (T3),Y LDY T7 CPY #10 BCC ZEROIZ ZESKIP: LDA T1 CLC ADC #80 STA T1 STA T3 LDA T2 ADC #0 STA T2 EOR #4 STA T4 DEX BPL BORDER LDA LEVEL ASL CLC ADC #$D0 STA 3706 ADC #1 STA 3746 LDY PLAYERLIVES CPY #5 BCC LIFPUT LDY #4 STY PLAYERLIVES LIFPUT: LDA TABE - OBJDIFF,Y TAX LDA #$F4 STA 3462,X LDA #$F5 STA 3502,X DEY BPL LIFPUT RTS ; panel data BDAT: !byte 0,0,$E4,$E6,$E8,$EA,$EC,1 !byte 0,$D0,$D0,$D0,$D0,$D0,$D0,$D0,1 !byte 1 !byte 0,0,$EE,$F0,$F2,$EC,$E4,1 !byte 1 !byte 1 !byte 0,0,$EE,$EC,$F2,$EC,$EE,1 !byte 1 !byte 1 !byte 1 !byte 0,$F6,$E8,$F8,$E6,$FA,$F6,1 !byte 1 TABE: !byte 4,2,6,0,8 ;****************************************************************************** ; ; draw a box ; ;****************************************************************************** DRAWBOX: LDY #0 STY T3 STA T4 DRAWBOX1: STA (T1),Y TYA CLC ADC #80 TAY LDA T4 STA (T1),Y INC T3 LDY T3 DEX BPL DRAWBOX1 TYA CLC ADC #39 TAY LDA T4 STA (T1),Y LDY #40 STA (T1),Y LDA T1 CLC ADC #41 STA T1 LDA T2 ADC #0 STA T2 RTS ;****************************************************************************** ; ; draw flashing box with flashing text ; ;****************************************************************************** DRAWFLASH: STX T5 STY T6 LDA #8 STA T7 DRAWFLASH1: LDA TA STA T1 LDA TB STA T2 LDX T5 LDA #$5B JSR DRAWBOX - OBJDIFF LDX T6 JSR PRINT - OBJDIFF JSR DELAY - OBJDIFF LDA TA STA T1 LDA TB STA T2 LDX T5 LDA #$40 JSR DRAWBOX - OBJDIFF JSR DELAY - OBJDIFF DEC T7 BNE DRAWFLASH1 RTS ;****************************************************************************** ; ; delay for some time ; ;****************************************************************************** DELAY: LDX #0 LDY #0 DELAY1: DEY BNE DELAY1 DEX BNE DELAY1 RTS ;****************************************************************************** ; ; draw title screen - wait for space bar to play ; ;****************************************************************************** * = SHIFTCHARSET ; fixed section address DRAWTITLESCN: JSR SCREENINIT - OBJDIFF LDY #0 STY TA DRAWTITLESCN1: LDA TITLESCREEN - OBJDIFF,Y STA T1 LDA TITLESCREEN+1 - OBJDIFF,Y STA T2 LDA TITLESCREEN+2 - OBJDIFF,Y TAX LDA #$40 JSR DRAWBOX - OBJDIFF LDY TA LDA TITLESCREEN+3 - OBJDIFF,Y TAX JSR PRINT - OBJDIFF LDA TA CLC ADC #4 STA TA TAY CPY #32 BCC DRAWTITLESCN1 LDA LEVEL ORA #$60 STA 4023 LDA #<3126 STA T1 LDA #>3126 STA T2 LDA PREVSCORE + 2 LDX PREVSCORE + 1 LDY PREVSCORE JSR PRINTBCD - OBJDIFF LDA #<3137 STA T1 LDA #>3137 STA T2 LDA HIGHSCORE + 2 LDX HIGHSCORE + 1 LDY HIGHSCORE JSR PRINTBCD - OBJDIFF ; wait for space bar press WAITSPACE: LDA #$7F STA $FD30 STA $FF08 LDA $FF08 AND #16 BNE WAITSPACE RTS ;****************************************************************************** ; ; title scren layout ; ;****************************************************************************** TITLESCREEN: !word 3408 !byte 7, MSGTOMCAT - MSGADDR !word 3480 !byte 23, MSGCOPY - MSGADDR !word 3593 !byte 37, MSGDMB - MSGADDR !word 3079 !byte 6, MSGSCORE - MSGADDR !word 3093 !byte 3, MSGHI - MSGADDR !word 3085 !byte 8, MSGLINE - MSGADDR !word 3096 !byte 8, MSGLINE - MSGADDR !word 3959 !byte 25, MSGPRESSSPACE - MSGADDR ;****************************************************************************** ; ; write 24 bit BCD on screen ; ;****************************************************************************** PRINTBCD: STY T7 LDY #0 JSR PRINTBCD1 - OBJDIFF TXA JSR PRINTBCD1 - OBJDIFF LDA T7 PRINTBCD1: PHA LSR LSR LSR LSR ORA #$60 STA (T1),Y INY PLA AND #15 ORA #$60 STA (T1),Y INY RTS END: