* PUTCHAR.S THIS PROVIDES ROUTINES FOR MODIFYING THE SCREEN * THIS ROUTINE PUTS UP A SET OF CHARACTERS IN A BLOCK ON THE SCREEN. IT'S * PARAMETERS ARE: * TEMP0 THE NUMBER OF LINES TO BE CHANGED * TEMP1 THE NUMBER OF COLUMNS TO BE CHANGED * TEMP2 WHAT CHARACTER IN THE FONT TO START WITH (THIS IS INCREMENTED) * TEMP3 WHAT ZONE THE MODIFICATION STARTS IN * TEMP4 WHAT COLUMN IN THE ZONE IT STARTS IN * TEMP5, 6, AND 7 ARE USED FOR INTERNAL USE PUTCHARS LDA #$01 STA TEMP5 JMP PCHAR * THIS ROUTINE IS THE SAME AS PUTCHARS, BUT THE CHARACTER USED FOR MODIFICATION * DOES NOT CHANGE. PUTCHAR LDA #$00 STA TEMP5 JMP PCHAR * THIS ROUTINE DOES THE WORK FOR PUTCHARS AND PUTCHAR PCHAR LDX TEMP3 ;THE ZONE LDA SCRLOW,X ;LOW BYTE OF ADDRESS FOR ZONE STA TEMP6 ;TEMP LOCATION LDA SCRHI,X ;HI BYTE OF ADDRESS FOR ZONE STA TEMP7 LDX TEMP1 ;NUMBER OF COLUMNS LDY TEMP4 ;STARTING COLUMN PLOOP LDA TEMP2 ;STARTING CHAR STA (TEMP6),Y LDA TEMP5 ;SEE IF STARTING CHAR IS INCREMENTED BEQ PJMP0 INC TEMP2 ;NEXT CHAR PJMP0 INY DEX BNE PLOOP INC TEMP3 ;NEXT ZONE DEC TEMP0 ;ONE LESS LINE BNE PCHAR ;DO IT AGAIN IF MORE LINES RTS * THIS ROUTINE PUTS A SINGLE CHARACTER INTO A SINGLE PLACE ON THE SCREEN. * PARAMETERS: * TEMP0 ZONE * TEMP1 COLUMN * X CHARACTER * TEMP2-3 ARE USED. PLOPCHAR STY TEMP23 LDY TEMP0 ;THE ZONE LDA SCRLOW,Y ;LOW BYTE OF ADDRESS FOR ZONE STA TEMP2 ;TEMP LOCATION LDA SCRHI,Y ;HI BYTE OF ADDRESS FOR ZONE STA TEMP3 LDY TEMP1 TXA STA (TEMP2),Y LDY TEMP23 RTS * THIS RETURNS (IN A) THE CONTENTS OF A CHARACTER. * PARAMETERS: TEMP0 - ZONE, TEMP1 - COL * TEMPS: TEMP2-3 GETCHAR STY TEMP23 LDY TEMP0 ;THE ZONE LDA SCRLOW,Y ;LOW BYTE OF ADDRESS FOR ZONE STA TEMP2 ;TEMP LOCATION LDA SCRHI,Y ;HI BYTE OF ADDRESS FOR ZONE STA TEMP3 LDY TEMP1 ;STARTING COLUMN LDA (TEMP2),Y LDY TEMP23 RTS * THIS ROUTINE ADDS THE ACCUMULATOR TO THE PRESENT SCORE. NOTE THAT THE * ACCUMULATOR SHOULD HAVE A DECIMAL NUMBER, THIS WILL BE MULTIPLIED BY 10 * TEMP 8-12 ARE USED. REGISTERS ARE PRESERVED. TEMP 6-7 ARE USED BY WRTSCORE * IF ADDTOTAL IS CALLED, THE USER SETS UP TEMP11-12 TO THE ADDED SCORE ADDSCORE STA TEMP12 LDA #$00 STA TEMP11 ADDTOTAL TXA ;STACK REGISTERS PHA TYA PHA LDA #$00 ;CLEAR TOP TWO BYTES OF ADDED VALUE STA TEMP9 STA TEMP10 LDX AUTOPLAY BNE ADSOUT LDY PLAYER ;SEE WHICH PLAYER IS ACTIVE BNE ADSP2 LDY #$03 SED ;DECIMAL MODE ON CLC ADS1LOOP LDA TEMP9,Y ADC P1SCORE,Y STA P1SCORE,Y LDA #$00 DEY BPL ADS1LOOP CLD ;DECIMAL MODE OFF JSR CHKSCOR1 JMP ADSOUT ADSP2 LDY #$03 SED ;DECIMAL MODE ON CLC ADS2LOOP LDA TEMP9,Y ADC P2SCORE,Y STA P2SCORE,Y LDA #$00 DEY BPL ADS2LOOP CLD ;DECIMAL MODE OFF JSR CHKSCOR2 ADSOUT JSR WRTSCORE PLA ;UNSTACK REGISTERS TAY PLA TAX RTS * THIS ROUTINE CHECKS TO SEE IF PLAYER 1 HAS A BONUS LIFE COMING CHKSCOR1 LDA P1BONUS ;MAKE SURE BONUS IS ENABLED BMI CKS1OUT SED SEC ;DECIMAL MODE ON LDA P1BONUS+1 SBC TEMP12 STA P1BONUS+1 LDA P1BONUS SBC TEMP11 STA P1BONUS CLD ;DECIMAL MODE OFF LDA P1BONUS ;COMPENSATE FOR 6502 BUG BPL CKS1OUT JSR INCLIVES CKS1OUT RTS * THIS ROUTINE CHECKS TO SEE IF PLAYER 2 HAS A BONUS LIFE COMING CHKSCOR2 LDA P2BONUS ;MAKE SURE BONUS IS ENABLED BMI CKS2OUT SED SEC ;DECIMAL MODE ON LDA P2BONUS+1 SBC TEMP12 STA P2BONUS+1 LDA P2BONUS SBC TEMP11 STA P2BONUS CLD ;DECIMAL MODE OFF LDA P2BONUS ;COMPENSATE FOR 6502 BUG BPL CKS2OUT JSR INCLIVES CKS2OUT RTS * THIS ROUTINE INITIALIZES THE LIVES INITLIV LDA #$04 STA LIVES STA TOTLIVES LDX TWOPLAYR BEQ ILOUT STA BAKLIVES ;FOR THE OTHER PLAYER LDA #$09 STA TOTLIVES ILOUT RTS * THIS ROUTINE DECREMENTS THE LIVES. DECLIVES LDA AUTOPLAY BNE DECALT JSR CLEARTUN JSR WAIT DEC LIVES JSR WRTLIVES LDA LIVES BPL DLCONT JSR OVER ;PUT GAME OVER UP JSR WAIT JSR WCLEAR DLCONT DEC TOTLIVES BMI DLDEAD LDA TWOPLAYR BNE DLSWITCH JSR LIFEINIT DLREADY JSR READY ;PUT PLAYER READY UP JSR WAIT JMP WCLEAR DLSWITCH JSR OTHRINIT ;SWITCH TO OTHER PLAYER JMP DLREADY DLDEAD LDA #$01 ;GAME OVER STA GAMEOVER RTS DECALT JMP NEXTRACK ;IF AUTOPLAY - SWITCH RACKS INSTEAD * THIS ROUTINE INCREMENTS THE LIVES. INCLIVES INC LIVES INC TOTLIVES LDA #$14 JSR DOTUNE JMP WRTLIVES * THIS ROUTINE WRITES THE SCORES OF THE PLAYERS ON THE SCREEN * TEMPS 6-7 AND 10 ARE USED * NOTE: SCORE+1 IS USED SINCE THE HI BYTE IS ONLY MAINTAINED FOR THE HIGH * SCORE CART WRTSCORE LDX #$1E LDA SCRLOW,X ;LOW BYTE OF ADDRESS FOR ZONE STA TEMP6 ;TEMP LOCATION LDA SCRHI,X ;HI BYTE OF ADDRESS FOR ZONE STA TEMP7 ;NOW - ZONE LINE IS SET UP LDY #P1SCRCOL ;STARTING COLUMN LDX PLAYER LDA NUMCHAR,X STA TEMP10 ;SET STARTING CHARACTER FOR ZERO LDX #$00 WRSALOOP LDA P1SCORE+1,X ;ELIMINATE LEADING ZEROS LSR A LSR A LSR A LSR A BNE WRS1JMP0 JSR WRTBLANK LDA P1SCORE+1,X AND #$0F BNE WRS1JMP1 JSR WRTBLANK INX CPX #$03 BMI WRSALOOP JMP WRS1JMP2 WRS1LOOP LDA P1SCORE+1,X ;WRITE SCORE FOR PLAYER 1 LSR A LSR A LSR A LSR A WRS1JMP0 JSR WRTDIGIT LDA P1SCORE+1,X AND #$0F WRS1JMP1 JSR WRTDIGIT INX CPX #$03 BMI WRS1LOOP WRS1JMP2 LDA #$00 ;TRAILING ZERO JSR WRTDIGIT WRSB LDA TWOPLAYR ;DON'T DO SECOND IF ONE-PLAYER BEQ WRS2NONE LDX PLAYER LDA NUMCHAR2,X STA TEMP10 ;SET STARTING CHARACTER FOR ZERO LDX #$00 ;START WITH HIGH BYTE LDY #P2SCRCOL ;STARTING COLUMN WRSBLOOP LDA P2SCORE+1,X ;ELIMINATE LEADING ZEROS LSR A LSR A LSR A LSR A BNE WRS2JMP0 JSR WRTBLANK LDA P2SCORE+1,X AND #$0F BNE WRS2JMP1 JSR WRTBLANK INX CPX #$03 BMI WRSBLOOP JMP WRS2JMP2 WRS2LOOP LDA P2SCORE+1,X ;WRITE SCORE FOR PLAYER 2 LSR A LSR A LSR A LSR A WRS2JMP0 JSR WRTDIGIT LDA P2SCORE+1,X AND #$0F WRS2JMP1 JSR WRTDIGIT INX CPX #$03 BMI WRS2LOOP WRS2JMP2 LDA #$00 ;TRAILING ZERO JMP WRTDIGIT ;ALL DONE WRS2NONE LDY #P2SCRCOL ;CLEAR OUT PLAYER 2 (JUST IN CASE) LDX #$06 WRS2NLP JSR WRTBLANK DEX BPL WRS2NLP RTS * THIS ROUTINE WRITES A DIGIT (IN THE ACCUMULATOR) TO THE NEXT SPOT ON THE * SCREEN (TEMP6). TEMP10 IS ADDED (TO GIVE OFFSET INTO FONT). WRTDIGIT CLC ADC TEMP10 STA (TEMP6),Y INY RTS * THIS ROUTINE WRITES A BKANK TO THE NEXT SPOT ON THE SCREEN (TEMP6). WRTBLANK LDA #BLNKCHAR STA (TEMP6),Y INY RTS * THIS ROUTINE WRITES THE LIVES ON THE SCREEN WRTLIVES LDA LIVES ;GET NUMBER OF LIVES CMP #$05 ;MAKE SURE NOT TOO BIG BMI WLJMP0 LDA #$05 WLJMP0 ASL A ;TURN IT INTO AN INDEX INTO DLISTS ASL A STA TEMP16 LDX #$10 ;NOW, GO THROUGH THE INDICATORS WLLOOP CPX TEMP16 BPL WLBLANK LDA #$28 ;TURN ON AN INDICATOR STA BDLIST0,X LDA #$2A STA BDLIST1,X JMP WLNEXT WLBLANK LDA #$00 ;TURN ON A BLANK STA BDLIST0,X STA BDLIST1,X WLNEXT DEX ;NEXT ONE IS 4 LESS DEX DEX DEX BPL WLLOOP RTS * FLASH THE POWER DOTS FLASHDOT JSR SETFLSH ;SET NEXT FLASH LDY RACK LDA EDZONE0,Y STA TEMP0 LDA EDCOL0,Y STA TEMP1 JSR SWTCHDOT ;SWITCH ZONE 0 COLUMN 0 LDA EDCOL1,Y STA TEMP1 JSR SWTCHDOT ;SWITCH ZONE 0 COLUMN 1 LDA EDZONE1,Y STA TEMP0 JSR SWTCHDOT ;SWITCH ZONE 1 COLUMN 1 LDA EDCOL0,Y STA TEMP1 JMP SWTCHDOT ;SWITCH ZONE 1 COLUMN 0 * SWITCH A SINGLE POWER DOT - ZONE AND COL IN TEMP0 AND 1 SWTCHDOT JSR GETCHAR CMP #BLNKCHAR BEQ SDOUT EOR #$01 TAX JMP PLOPCHAR SDOUT RTS * MAKE THE POWER DOTS WHITE FOR END OF RACK FINALDOT LDY RACK LDA EDZONE0,Y STA TEMP0 LDA EDCOL0,Y STA TEMP1 JSR ONDOT ;TURN ON ZONE 0 COLUMN 0 LDA EDCOL1,Y STA TEMP1 JSR ONDOT ;TURN ON ZONE 0 COLUMN 1 LDA EDZONE1,Y STA TEMP0 JSR ONDOT ;TURN ON ZONE 1 COLUMN 1 LDA EDCOL0,Y STA TEMP1 JMP ONDOT ;TURN ON ZONE 1 COLUMN 0 * TURN ON SINGLE POWER DOT - ZONE AND COL IN TEMP0 AND 1 ONDOT JSR GETCHAR AND #$FE TAX JMP PLOPCHAR * SET THE NEXT FLASH MOVE SETFLSH LDA RTLOCAL+1 CLC ADC #WAITFLSH STA FLSHWAIT RTS * THIS JUST SETS TEMP0 AND TEMP1 TO HAVE THE SCREEN LOCATION FOR ZONE Y SETSCRN LDA SCRLOW,Y ;LOW BYTE OF ADDRESS FOR ZONE STA TEMP0 ;TEMP LOCATION LDA SCRHI,Y ;HI BYTE OF ADDRESS FOR ZONE STA TEMP1 RTS * PUT THE READY MESSAGE UP READY JSR WPLAYR ;WRITE THE PLAYER LDY #$21 JMP WRTMESG ;WRITE READY * PUT THE GAME OVER MESSAGE UP OVER JSR WPLAYR ;WRITE THE PLAYER ALLOVER LDY #$22 JMP WRTMESG ;WRITE GAME OVER * PUT A PLAYER UP ON THE SCREEN WPLAYR LDA TWOPLAYR BEQ WPLOUT LDA #OFFSCRN ;MOVE THE RED GUY AWAY STA HPLIST+1 STA DOLIST+1 LDA PLAYER ;WRITE THE PLAYER CLC ADC #$0F TAY JSR WRTMESG WPLOUT RTS * ERASE ALL THE MESSAGES ON THE SCREEN WCLEAR JSR WCSETUP LDA #MESHZONE STA TEMP3 ;ZONE JSR PUTCHAR JSR WCSETUP LDA #MESLZONE STA TEMP3 ;ZONE JMP PUTCHAR * PREPARE THE TEMPS FOR WCLEAR WCSETUP LDA #$01 STA TEMP0 ;ONE LINE LDA #$0A STA TEMP1 ;10 COLUMNS LDA #BLNKCHAR STA TEMP2 ;CHARACTER LDA #MESCOL STA TEMP4 ;COLUMN RTS * THIS ROUTINE WRITES ONE OF THE TITLE PAGE MESSAGES ON THE SCREEN * INPUT: MESSAGE IN Y (SMASHES Y) WRTMESG STX TEMP5 ;SAVE X LDA TMLENGTH,Y ;SET LENGTH OF MESSAGE STA TEMP4 LDA TMZONE,Y ;SET STARTING ZONE AND COLUMN STA TEMP0 LDA TMCOL,Y STA TEMP1 TYA ;TEMP 6 NON ZERO IF MESSAGE $10 OR OVER SEC SBC #$13 STA TEMP6 LDA TMOFFSET,Y ;SET Y TO OFFSET TAY WMLOOP LDA TEMP6 BPL WMLJMP0 LDA TMESSAGE,Y ;DO IT JMP WMLJMP1 WMLJMP0 LDA TMESSAG2,Y ;DO IT - SECOND BANK OF MESSAGES WMLJMP1 TAX JSR PLOPCHAR INY ;NEXT INPUT CHAR INC TEMP1 ;NEXT OUTPUT CHAR DEC TEMP4 ;SEE IF DONE BPL WMLOOP LDX TEMP5 ;RESTORE X RTS * DATA FOR MESSAGES. NOTE - MESSAGES OVER $13 COME FROM TMESSAG2, OTHERS COME * FROM TMESSAGE. * THESE ARE OFFSETS INTO THE MESSAGE TABLE TMOFFSET DB $00,$06,$0C,$12,$18,$22,$36,$3A ;OFFSETS INTO TMESSAGE DB $42,$52,$62,$72,$82,$92,$A1,$BF DB $B4,$B0,$BB HSCOFF DB $00,$0A,$14,$1E,$28,$32,$3C,$46 DB $50,$55,$5A,$5F,$68,$71,$7A,$84 TMLENGTH DB $05,$05,$05,$05,$09,$13,$03,$07 ;LENGTH (-1) DB $0F,$0F,$0F,$0F,$0F,$0E,$0E,$09 DB $09,$09,$09 DB $09,$09,$09,$09,$09,$09,$09,$09 DB $04,$04,$04,$08,$08,$08,$09,$09 TMZONE DB $0F,$0F,$0F,$0F,$0F,$1C,$0C,$0C ;ZONE MESSAGE APPEARS DB $02,$03,$04,$05,$06,$16,$18,$0A DB $0A,$0C,$0C DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F DB $0F,$0F,$0F,$0E,$0E,$0E,$10,$10 TMCOL DB $0A,$0A,$0A,$0A,$0A,$04,$08,$08 ;COLUMN FOR MESSAGE DB $06,$06,$06,$06,$06,$06,$06,$09 DB $09,$09,$09 DB $09,$09,$09,$09,$09,$09,$09,$09 DB $04,$04,$04,$0C,$0C,$0C,$09,$09 * THESE ARE THE MESSAGES FOR THE TITLE PAGE TMESSAGE DB $5F,$69,$66,$6B,$68,$76 ;0 - BLINKY DB $6D,$66,$6B,$68,$76,$50 ;1 - PINKY DB $66,$6B,$68,$76,$50,$50 ;2 - INKY DB $70,$72,$62,$50,$50,$50 ;3 - SUE DB $6A,$70,$50,$6D,$5E,$60,$7A,$6A,$5E,$6B ;4 - MS PAC-MAN DB $60,$6C,$6D,$76,$6F,$66,$64,$65,$71,$00 ;5 - COPYRIGHT DB $5E,$71,$5E,$6F,$66,$00,$55,$5D,$5C,$58 ; ATARI 1984 DB $74,$66,$71,$65 ;6 - WITH DB $70,$71,$5E,$6F,$6F,$66,$6B,$64 ;7 - STARRING DB $83,$88,$8D,$92,$97,$00,$00,$00 ;8 - LINE 1 - MS PAC LO DB $00,$00,$00,$00,$00,$00,$00,$00 DB $84,$89,$8E,$93,$98,$9C,$00,$00 ;9 - LINE 2 DB $00,$00,$00,$00,$00,$00,$00,$00 DB $85,$8A,$8F,$94,$99,$9D,$A0,$00 ;A - LINE 3 DB $A4,$A7,$AA,$AD,$AF,$A4,$B2,$B3 DB $86,$8B,$90,$95,$9A,$9E,$A1,$A3 ;B - LINE 4 DB $A5,$A8,$AB,$AE,$95,$B0,$A8,$AB DB $87,$8C,$91,$96,$9B,$9F,$A2,$00 ;C - LINE 5 DB $A6,$A9,$AC,$91,$96,$B1,$A9,$AC DB $72,$70,$62,$00,$67,$6C,$76,$70 ;D - USE JOYS DB $71,$66,$60,$68,$00,$71,$6C ; TICK TO DB $60,$65,$5E,$6B,$64,$62,$00,$70 ;E - CHANGE S DB $62,$71,$71,$66,$6B,$64,$70 ; ETTINGS DB $6C,$6B,$62,$00,$6D,$69,$5E,$76,$62,$6F ;11 - ONE PLAYER DB $00 ;10 - PLAYER TWO DB $71,$74,$6C,$00,$6D,$69,$5E,$76,$62,$6F ;12 - TWO PLAYER DB $00,$6C,$6B,$62 ;F - PLAYER ONE TMESSAG2 DB $71,$62,$61,$61,$76,$00,$5F,$62,$5E,$6F ;13 - TEDDY BEAR DB $00,$60,$65,$62,$6F,$6F,$66,$62,$70,$00 ;14 - CHERRIES DB $70,$71,$6F,$5E,$74,$5F,$62,$6F,$6F,$76 ;15 - STRAWBERRY DB $00,$00,$6C,$6F,$5E,$6B,$64,$62,$00,$00 ;16 - ORANGE DB $00,$6D,$6F,$62,$71,$77,$62,$69,$00,$00 ;17 - PRETZEL DB $00,$00,$5E,$6D,$6D,$69,$62,$00,$00,$00 ;18 - APPLE DB $00,$00,$00,$6D,$62,$5E,$6F,$00,$00,$00 ;19 - PEAR DB $00,$00,$5F,$5E,$6B,$5E,$6B,$5E,$00,$00 ;1A - BANANA DB $5E,$60,$71,$50,$55 ;1B - ACT 1 DB $5E,$60,$71,$50,$56 ;1C - ACT 2 DB $5E,$60,$71,$50,$57 ;1D - ACT 3 DB $71,$65,$62,$76,$50,$6A,$62,$62,$71 ;1E - THEY MEET DB $71,$65,$62,$50,$60,$65,$5E,$70,$62 ;1F - THE CHASE DB $67,$72,$6B,$66,$6C,$6F,$50,$50,$50 ;20 - JUNIOR DB $00,$00,$6F,$62,$5E,$61,$76,$78,$00,$00 ;21 - READY DB $64,$5E,$6A,$62,$00,$00,$6C,$73,$62,$6F ;22 - GAME OVER * START OF DIGITS FOR CURRENT AND NON-CURRENT PLAYERS NUMCHAR DB $54,$46 NUMCHAR2 DB $46,$54 * ZONES AND COLUMNS FOR MESSAGES MESHZONE EQU $0A MESLZONE EQU $10 MESCOL EQU $09