***************** * 18 WITH A DIE * * R.YOST 790718 * * BYTE V05 N01 * ***************** CONTRL EQU $C000 RETURN TO MONITOR INEEE EQU $C006 INPUT CHAR FROM CONSOLE AND ECHO PDATA EQU $C009 PRINT TEXT STRING @ X ENDED BY $04 OUTHR EQU $C00C PRINT RIGHT HEX CHAR @ X OUT2HS EQU $C012 PRINT 2 HEX CHARS @ X * VARIABLES AND TABLES ORG $20 MSKTBL RMB 7 LEGAL RESPONSES MASKS WINTBL RMB 18 TABLE OF WINNING PLAY BIT PATTERNS RMB 7 SPACE FOR END GAME MARKERS MPTPAT RMB 1 M. TRIAL PLAY PATTERN SCOREH RMB 1 H. AND M. BCD SCORES SCOREM RMB 1 TOTAL RMB 1 BINARY TOTAL OF ALL PLAYS TOTBCD RMB 1 DITTO, BCD HPLAY RMB 1 VALID, LEAGAL, H. PLAY LSTPLA RMB 1 OPPONENT'S PREV. PLAY HTURN RMB 1 H. TIRN FLAG SCNFLG RMB 1 SCAN WITH TABLE FLAG. 1 MEANS * BEFORE M'S PLAY * 0 MEANS AFTER M'S PLAY. ENDGAM RMB 1 END GAME FLAG. SET IF TOTAL > 17 LTSTIN RMB 2 DUMMY INPUT VARIABLE FOR LEGAL TEST * 2 BYTES ACCOMODATE X REG. WHRF RMB 6 TABLE STORES WINNING HUMAN RESPONSES * TO TRIAL M PLAYS. MPLAY RMB 1 TRIAL M PLAY. MPLAW RMB 1 WINNING PLAY DETECTED IN REVISING * WIN TABLE. SSTO RMB 2 TEMP. STK. PNTR STORAGE WTBLRP RMB 2 WINTABLE ROW POINTER RANUM RMB 2 RANDOM NUMBER SHIFT REGISTERS. * MAIN PROGRAM ORG $100 * LDS #$A047 PRESERVE STRT ADDR @ $A048,9. JSR INITLZ LDX #MES1 PRINT INSTRUCTIONS AND JSR TXTOUT ASK "READY TO PLAY". JSR INEEE GET RESPONSE ANDA #$DF TO UPPER CASE CMPA #'Y IF NOT 'Y' THEN BEQ M2 M1 LDX #MES5 PRINT "THANKS, GOOD BYE", BSR TXTOUT JMP CONTRL AND EXIT TO MIKBUG. M2 CLRA ELSE, INITIALIZE VARS. FOR STAA TOTAL NEW GAME. STAA TOTBCD STAA LSTPLA LDX #MES2 PRINT NEW GAME HEADER. BSR TXTOUT LDX #SCOREH PRINT SCORES. JSR OUT2HS LDX #SCOREM JSR OUT2HS LDX #MES3 PRINT "YOUR 1ST PLAY?" BSR TXTOUT M3 JSR GTVLHP GET VALID LEGAL H. PLAY. LDAA HPLAY PUT I HPLAY AND LAST PLAY. STAA LSTPLA LDAA #1 STAA HTURN SET H. TURN FLAG, STAA SCNFLG AND SCAN FLAG, TO DENOTE WIN TABLE M4 JSR AVAZTO REVISION BEFORE M. PLAY. ADD PLAY * TO TOTALS. SET END GAME FLG. IF * TOTAL > 17, AND CALC. SCORES. TST ENDGAM BEQ M5 LDX #SCOREH IF GAME OVER, PRINT SCORES. JSR OUT2HS LDX #SCOREM JSR OUT2HS LDX #MES4 PRINT "NEW GAME?" BSR TXTOUT JSR INEEE ANDA #$DF CMPA #'N IF RESPONSE = 'N', PRINT THANKS, ETC, BEQ M1 AND EXIT. BRA M2 ELSE, SET UP NEW GAME. M5 JSR RVSTBW IF GAME NOT OVER, LOOK AHEAD FOR * H RESPONSES TO M TRIAL PLAYS * AND REVERSE WIN TABLE. TST SCNFLG IF SCAN FLAG CLEAR, THEN BEQ M6 GET NEXT H. PLAY JSR SELMPL ELSE, SELECT M. PLAY. LDAA MPLAY STAA LSTPLA CLRA CLEAR SCAN FLAG TO REVISE WIN TABLE BY * LOOKING AHEAD AFTER M'S PLAY. STAA SCNFLG STAA HTURN CLEAR H. TURN FLAG. LDX #MES6 ANNOUNSE M'S PLAY, BSR TXTOUT LDAA MPLAY JSR OUTHR BRA M4 AND PROCESS IT. M6 LDX #MES7 IF SCAN FLAG WAS RESET, REQUEST BSR TXTOUT NEXT H. PLAY. BRA M3 AND GET IT. TXTOUT JMP PDATA TARGET FOR MIKBUG STRING PRINT * SUBROUTINE INITIALIZE - INITLZ * ORG $5D ORG * INITLZ LDX #MSKTBL INITIALIZE MASK TABLE WHIT LDAA #$3F LEGAL RESPONSE PATTERNS STAA 0,X IN 6 LEAST SIG. BITS LDAA #$1E STAA 1,X STAA 6,X LDAA #$2D STAA 2,X STAA 5,X LDAA #$33 STAA 3,X STAA 4,X CLRA CLEAR WIN TABLE BEFORE LDX #1 FIRST GAME. I1 STAA WINTBL-1,X INX CPX #$13 BNE I1 LDAA #3 STORE DUMMY H WIN PLAY I2 STAA WINTBL-1,X BITS BEYOND END OF WINTABLE INX SO MACHINE CAN SEE END OF CPX #$19 GAME COMING. BNE I2 STAA RANUM+1 INITIALIZE RANDOM NUMBER GENERATOR CLRA SEED. STAA LTSTIN CLEAR HIGH BYTE OF L. TEST, ALSO STAA SCOREH DIMMY VAR. AND SCORES. STAA SCOREM RTS * SUBROUTINE GTVLHP - GET VALID LEGAL H. PLAY. * ORG $1A0 GTVLHP JSR INEEE GET H. KEYBOARD INPUT. SUBA #$30 CONVERT TO HEX BLE G1 OF LESS THAN 1, CMPA #6 BLE G2 OR GREATER THAN 6. G1 LDX #MES8 PRINT "INVALID" BSR TXTOUT BRA GTVLHP AND TRY AGAIN. G2 STAA LTSTIN+1 CHECK H. PLAY FOR LEGALITY JSR LGLTST ZERO (Z) BIT OF C REG=0 IF BNE G3 PLAY IS LEGAL. LDX #MES9 IF NOT, PRINT "ILLEGAL" BSR TXTOUT BRA GTVLHP AND TRY AGAIN. G3 LDAA LTSTIN+1 STORE VALID LEGAL H. PLAY. STAA HPLAY RTS * LEGAL TEST S.R., LGLTST * ORG $1C8 LGLTST LDAA LTSTIN+1 0 AND 7 INPUTS BEQ L1 FROM RAND. NO. GEN. ARE TREATED AS CMPA #7 ILLEGAL. BEQ L1 CMPA LSTPLA IF TEST PLAY = LAST PLAY, BEQ L1 ADDA LSTPLA OR IF SUM = 7, THEN CMPA #7 TEST PLAY IS ILLEGAL. L1 RTS 'Z' BIT OF COND'N (C) REG. RETURNS * RETURN OF TEST. * S.R. ADVANCE AND ANALYZE TOTAL - AVAZTO * ORG $1E0 AVAZTO CLR ENDGAM INILZ END GAME FLAG LDX #MESA PRINT "TOTAL IS " BSR TXTOUT LDAA LSTPLA GET LAST PLAY LDAB HTURN AND H TURN FLAG * IN 'A' AND 'B' REGS. ADDA TOTBCD ADD LAST PLAY TO BCD TOTAL. DAA STAA TOTBCD LDX #TOTBCD SET 'X' AS PNTR FOR MKBG S.R. JSR OUT2HS PRINT TOTAL. LDAA LSTPLA NOW, ADD LAST PLAY TO ADDA TOTAL BINARY TOTAL. STAA TOTAL SUBA #18 IF TOTAL < 18, THEN RETURN. BLT A2 INC ENDGAM ELSE, SET END GAME FLAG. TSTA IF TOTAL NOT IS, BEQ A4 TSTB AND IF H'S TURN, THEN BEQ A3 A1 LDX #MESB PRINT "I WIN", JSR TXTOUT LDAA #1 AND INCREMENT M'S SCORE IN BCD. ADDA SCOREM DAA STAA SCOREM A2 RTS A3 LDX #MESC IF TOTAL IS 18, AND IF M'S TURN JSR TXTOUT PRINT "YOU WIN" LDAA #1 AND INCREMENT H'S SCORE IN BCD. ADDA SCOREH DAA STAA SCOREH RTS A4 TSTB ELSE, IF TOTAL IS 18 * AND IF M'S TURN, THEN BEQ A1 AWARD WIN TO MACHINE. BRA A3 ELSE, IF H'S TURN, AWARD * WIN TO HUMAN * SUBROUTINE REVERSE WINTABLE - RVSTBW * ORG $230 RVSTBW CLRA STAA MPLAW RESET WINNING PLAY REG. TO 'NONE' STATE. STAA WTBLRP CLEAR W. TABLE PTR. HIGH * BYTE FOR PAGE 0 USE. STS SSTO SAVE STACK POINTER. LDX #1 LOAD TABLE POINTER WITH TRIAL * PLAY OF 1. LDAA #WINTBL-1 INLZ W TABLE PNTR LOW BYTE TO ADDA TOTAL CORRESPOND TO CURRENT TOTAL. STAA WTBLRP+1 LDS WTBLRP SET STK POINTER TO NEXT ROW OF W. TABLE R1 PULA GET W. TABLE ROW (BYTE) IN 'A'. * ( THIS IS THE ROW CORRESPONTING TO * THE CURRENT TOTAL PLUS THE TRIAL * MACHINES PLAY.) ANDA MSKTBL,X MASK WITH THE LEGAL RESPONSES * TO M'S TRIAL PLAY. STAA WHRF-1,X STORE RESULT IN TBL. OF WINNING * H. RESPONSES TO M TRIAL PLAYS. INX GET NEXT TRIAL M PLAY. CPX #7 IF < 7, REPEAT SCAN FOR LEGAL WINNING BNE R1 H RESPONSES. * NOW, ADD WINNING M PLAYS FOUND ABOVE TO THE WIN TABLE * IN THE ROW CORRESPONDING TO THE CURRENT TOTAL. LIKE- * WIZE, DELETE ANY PREVIOUSLY INCORRECTLY DEFINED WIN- * ING PLAYS FROM THE SAME ROW. LDAA #$20 SET 6TH BIT OF TRIAL PLAY PATTERN. STAA MPTPAT LDX #6 SELECT M TRIAL PLAY OF 6. * (BY COUNTING DOWN, GET SMALLEST * WINNING PLAY IN MPLAW.) R2 LDS WTBLRP SET STK PTR TO CURRENT DES TOTAL ROE (BYTE) OF W. TABLE. TST WHRF-1,X DID PREVIOUS SCAN DETECT ANY WINNING * LEGAL H RESPONSES TO TRIAL M PLAY? BNE R3 IF NOT, TRIAL M PLAY IS A WINNING PLAY, PULA SO 'OR' THE TRIAL M PLAY BIT PATTERN INTO THE ORAA MPTPAT CURRENT TOTAL ROW OF THE W. TABLE. PSHA STX LTSTIN TEST TRIAL PLAY FOR LEGALITY, LDS SSTO AFTER RESTORING STACK POINTER. JSR LGLTST BEQ R4 IF LEAGAL, STORE TRIAL PLAY IN LDAA LTSTIN+1 MPLAW, OVER ANY PREVIOUS LARGER PLAYS. STAA MPLAW BRA R4 SELECT NEXT TRIAL PLAY. * R3 COM MPTPAT IF LEGAL WINNING H RESPONSES TRO TRIAL PULA PLAY WERE DETECTED IN PREVIOUS SCAN, ANDA MPTPAT CLEAR TEH BIT (IN CURRENT W. TABLE PSHA ROW) CORRESPONDING TO M TRIAL PLAY. COM MPTPAT R4 DEX SELECT NEXT (LOWER) M. TRIAL PLAY LSR MPTPAT MOVE TRIAL PLAY PATTERN ONE BIT TO * CORRESPOND TO NEXT M. TRIAL PLAY. BNE R2 IF PATTERN NOT NULL, REPEAT * W. TABLE REVISION FOR NEXT M. TRIAL PLAY. LDS SSTO RESTORE STACK POINTER. RTS * SUBROUTINE SELECT M. PLAY - SELMPL * ORG $290 SELMPL JSR GNRNPL GET RANDOM NUMBER 0 THRU 7, * FOR GOOF DECISION. BEQ SP1 IF = 0, GOOF. (WITH SP1, THIS IS * TURNED OFF. USE SP2 HERE TO TURN ON.) SP1 LDAA MPLAW IF NOT GOOFING, GET WINNING M PLAY. BEQ SP2 IF THERE WAS NONE, GET RANDOM PLAY BRA SP3 AND STORE IN M PLAY REG. SP2 JSR GNRNPL GET RANDOM PLAY, 0 THRU 7 STAA LTSTIN+1 TEST SELECTED PLAY FOR GELALITY. JSR LGLTST BEQ SP2 IF ILLEGAL, TRY ANOTHER. LDAA LTSTIN+1 ELSE, TRANSFER THE SELECTED PLAY SP3 STAA MPLAY TO THE M PLAY REG. RTS * SUBROUTINE GENERATE RANDOM PLAY - GNRNPL * ORG $2B0 GNRNPL LDX #3 COUNT 3 SHIFTS, SO 3 'NEW' BITS WILL * BE GENERATED. GR1 LDAB #9 MASK BIT PATTERN TO IMPLEMENT * BIT-3 EXOR BIT-0 = 1? ANDB RANUM+1 APPLY MASK TO LOW BYTE OF R.N. CMPB #1 TEST TRUE, SO SET CARRY. BEQ GR2 CMPB #8 TEST FALSE, SO CLEAR CARRY. CLC BNE GR3 GR2 SEC GR3 ROR RANUM ROTATE CARRY INTO MSB OF 2 BYTE R.N. ROR RANUM+1 DEX DECREMENT SHIFT COUNTER. BNE GR1 LDAA RANUM+1 STORE 3 LSB'S OF R.N. IN 'A', AS ANDA #7 RANDOM NUMBER 0 THRU 7. RTS * STRING CONSTANTS CRLF EQU $D0A CARRIAGE RETURN, LINE FEED ENDST EQU 4 STRING END SYMBOL FOR MIKBUG PDATA1 LNFD EQU $A LINE FEED LNFDS EQU $A0A TWO LINE FEEDS * INSTUCTIONS - MES1 * ORG $2D0 MES1 FCB $1B,$5B,$32,$4A CLEAR SCREEN * FDB CHMEOF * FDB 0 * FCB 0 FCC "HI! LET'S PLAY '18 WITH A DIE'!" FDB CRLF FCC "YOU START. CHOOSE ANY NUMBER," FDB CRLF FCC "1 THRU 6. I DO LIKEWISE, BUT WE" FDB CRLF FCC "CAN'T PLAY THE NUMBER THE OTHER" FDB CRLF FCC "JUST PLAYED, NOR ITS DIFFERENCE" FDB CRLF FCC "FROM 7. TRY TO MAKE THE TOTAL" FDB CRLF FCC "OF ALL YOUR PLAYS HIT 18 ON" FDB CRLF FCC "YOUR PLAY." FDB CRLF FCB LNFD FCC "READY TO START? (TYPE Y OR N.)" FCB ENDST * NEW GAME HEADER - MES2 * ORG $3F0 MES2 FCB $1B,$5B,$32,$4A FCC " EIGHTEEN WITH A DIE" FDB CRLF FCB LNFD FCC " GAMES WON" FDB CRLF FCC " YOU ME" FDB CRLF FCC "TOTAL IS 00 " FCB ENDST * YOUE FIRST PLAY? MES3 * ORG $465 MES3 FDB CRLF FCB LNFD FCC " YOUR FIRST PLAY? " FCB ENDST * ILLEGAL PLAY - MES9 * ORG $482 MES9 FDB CRLF FCC "ILLEGAL PLAY! TRY ANOTHER." FCB ENDST * INVALID PLAY - MED 8 * ORG $4A2 MES8 FDB CRLF FCC "INVALID PLAY! PLAY 1 THRU 6." FCB ENDST * TOTAL IS - MESA * ORG $4CE MESA FCB $1B,$5B,$48 CURSOR HOME FDB LNFDS FDB LNFDS FCC "TOTAL IS " FCB ENDST * YOU WIN! - MESC * ORG $4DD MESC FCC " YOU WIN! " FCB ENDST * I WIN! - MESB * ORG $4EA MESB FCC " I WIN! " FCB ENDST * NEW GAME? - MES4 * ORG $4F6 MES4 FCB LNFD FDB CRLF FCB $1B,$5B,$4A CLEAR TO END OF SCREEN FCC "NEW GAME? ('Y' OR 'N')" FCB ENDST * THANKS, ETC. - MES5 * ORG $512 MES5 FDB CRLF FCC "THANKS FOR PLAYING. HOPE YOU" FDB CRLF FCC "ENJOYED IT AS MUCH AS I." FDB CRLF FCC "SEE YOU LATER!" FCB ENDST * MY PLAY IS - MES6 * ORG $55A MES6 FCB LNFD FDB CRLF FCB $1B,$5B,$4A CLEAR TO END OF SCREEN FCC "MY PLAY IS " FCB ENDST * YOUR PLAY? - MES7 * ORG $56E MES7 FDB LNFDS FCC ". YOUR PLAY? " FCB ENDST END