

       NAM MSTRMD   "MASTERMIND"
*      WRITTEN BY STEVE BARRY
*      REVISED 5/78 - DLJ/MOTOROLA MICROSYSTEMS
*      ENTER AT: 0000G
*      OBJECT OF GAME: A 4-DIGIT COMBINATION
*        OF LETTERS A-F MUST BE DECODED IN 10
*        TRIES OR LESS.  IF UNSUCCESSFUL, THE
*        CODE IS DISPLAYED IN DIGITS 1-4 AND
*        00 IS DISPLAYED IN DIGITS 5-6.  IF THE
*        10TH OR EARLIER TRY IS SUCCESSFUL,
*        THE CODE IS DISPLAYED IN
*        DIGITS 1-4, A "4" IS DISPLAYED
*        IN DIGIT 5 (WIN), AND NUMBER OF
*        TRIES DISPLAYED IN DIGIT 6.
*      TO PLAY:
*      -M- SELECTS RANDOM LETTERS A-F
*        AND PLACES THEM IN DIGIT SHOWN BY
*        DISPLAY 5-6.  THIS BUTTON SHOULD BE
*        PRESSED A MINIMUM OF 4 TIMES.
*      -P- ENABLES THE INPUT OF TRY.  PRESS
*        A NUMBER 1-4, THEN PRESS A LETTER
*        A-F.  THE LETTER IS
*        PLACED IN THE SELECTED DIGIT (1-4).
*        CONTINUE UNTIL ALL 4 DIGITS ARE
*        FILLED.  ANY DIGIT MAY BE CHANGED.
*      -G- CAUSES THE TRY PATTERN TO BE STORED
*        AND NUMBER OF CORRECT ANSWERS TO BE
*        CALCULATED.  THE NUMBER OF LETTERS
*        IN THE TRY PATTERN THAT MATCHED THE
*        CODE LETTERS IS DISPLAYED IN
*        DIGIT 6.  THE NUMBER OF LETTERS THAT
*        BOTH MATCHED THE CODE LETTERS AND WERE
*        IN THE SAME COLUMN IS DISPLAYED
*        IN DIGIT 5.  A WIN IS INDICATED BY
*        A "4" IN DIGIT 5.
*      -R- ENABLES REVIEW FUNCTION.  PRESS
*        1-9 TO REVIEW PAST TRIES AND RESULTS.
*      -L- RESETS REGISTERS & RESTARTS GAME.
*      -E- EXITS PROGRAM BACK TO JBUG.
*      -N- RESETS ANY ACTIVE FUNCTION.
*      -V- RESETS FUNCTION & CLEARS DISPLAY.
       SPC 1
DISREG EQU $8020
SCNREG EQU $8022
SCNCTR EQU $8023
STOP   EQU $E08D BACK TO JBUG
DLY1   EQU $E0E0 DELAY SUBROUTINE
DIGTBL EQU $E3CA
KEYTBL EQU $E3DC
KYTBLE EQU $E3F3 END OF TABLE
       PAGE
       ORG $0000
ENTER  JMP START
*      WORKING STORAGE
TRYREG RMB 60 TRY REGISTERS
TRYCNT RMB 1
LETFLG RMB 1
STKSAV RMB 2
TRYPTR RMB 2
PPTR   RMB 2
ZEROS  RMB 2
CODE   RMB 4
CDECNT RMB 2
FCTPTR RMB 2
RANUM  RMB 1
ROWSEL RMB 1
XDSBUF RMB 2
DISBUF RMB 6
SCNCNT RMB 1
       SPC 1
*      P FUNCTION
P      DECB
       CMPB #$0E
       BHI RETRN1
       CMPB #$08 LETTER?
       BHI LETR YES
       CMPB #$03 VALID NUMBER?
       BHI RETRN1 NO, RETURN
       STAB PPTR+1 STORE NEW POINTER
       LDX PPTR
       CLR DISBUF,X PUT 0 IN DISBUF
       BRA RETRN
       SPC 1
LETR   LDX PPTR
       INCB
       STAB DISBUF,X PUT LETTER IN DISBUF
RETRN  JMP DISP
       SPC 1
RETRN1 JMP BUF
       SPC 1
*      G FUNCTION
G      INC TRYCNT
       LDX #DISBUF+4
       CLR 0,X CLEAR COL REG
       CLR 1,X CLEAR LET REG
       STS STKSAV SAVE STACK
       LDS TRYPTR
       DES
       DES
       CLR LETFLG CLEAR FLAG
STTRY  DEX
       LDAA 0,X GET DIGIT
       PSHA STORE IT
       CPX #DISBUF LAST DIGIT?
       BNE STTRY NO, DO NEXT
       TST LETFLG LET OR COL?
       BNE CMRES NO-CK RES
       STS TRYPTR
       LDX #CODE-1
CMCOL1 INX
       PULA GET FIRST TRY DIS
       CMPA 0,X =CODE?
       BEQ INCOL YES, INC COL.
CMCOL2 CPX #CODE+3 LAST ONE?
       BNE CMCOL1 NO, NEXT
       LDX #CODE-1
CMLTR1 LDAA #$04
       INX
       LDS TRYPTR
CMLTR2 PULB
       CMPB 0,X
       BEQ INLTR
       DECA LAST TRY DIGIT?
       BNE CMLTR2
CMLTR3 CPX #CODE+3 LAST CODE?
       BNE CMLTR1
       INS
       INS
       LDX #DISBUF+6
       INC LETFLG
       BRA STTRY
       SPC 1
CMRES  LDAA 4,X CHECK COL RESULT
       LDS STKSAV RECOVER STACK
       LDAB TRYCNT
       CMPA #$04 WINNER?
       BNE LSTRY
       STAB 5,X PUT TRYCNT IN
       JMP LOSE2
       SPC 1
LSTRY  CMPB #$0A
       BLT RETRN
       JMP LOSE
       SPC 1
INCOL  INC DISBUF+4
       BRA CMCOL2
       SPC 1
INLTR  INC DISBUF+5
       CLRB
       PSHB
INLTR1 INS
       DECA
       BNE INLTR1
       BRA CMLTR3
       SPC 1
*      MAIN CONTROL
START  DEC SCNCTR DISABLE NMI
CLRGS  LDX #TRYREG-1 GET START OF REG
       CLRA
CLRGS1 INX
       STAA 0,X
       CPX #SCNCNT LAST?
       BNE CLRGS1 NO
       LDAA #$0A PRESET RANUM
       STAA RANUM
       LDX #TRYREG+59
       STX TRYPTR PRESET
BUF    LDX #DISBUF-1
       LDAA #$10
BUF1   INX
       STAA 0,X STORE "-"
       CPX #DISBUF+5 LAST?
       BNE BUF1 NO
*      SUBROUTINE TO DISPLAY DISBUF
DISP   LDAA #$20
       STAA SCNCNT
       LDX #DISBUF GET START ADR
OUTDS1 LDAA 0,X GET FIRST DIGIT
       INCA
       INX
       STX XDSBUF SAVE POINTER
       LDX #DIGTBL-1
OUTDS2 INX
       DECA POINT TO PATTERN
       BNE OUTDS2
       CLR SCNREG BLANK DISPLAY
       LDAA 0,X GET PATTERN
       STAA DISREG SET UP SEGMENTS
       LDAA SCNCNT
       STAA SCNREG SELECT DIGIT
       LDX #$004D 1MS TIME DELAY
       JSR DLY1
       LDX XDSBUF RECOVER POINTER
       CPX #DISBUF+6 END?
       BEQ OUTDS3 YES
       LSR SCNCNT NO, NEXT DIGIT
       BRA OUTDS1
       SPC 1
OUTDS3 LDAA #$FF
       STAA DISREG
*      KEYBOARD SCAN AND DECODE SUBROUTINE
       CLR ROWSEL
       CLRB
NXCOL1 SEC
NXROW  ROL ROWSEL
       TBA
       ORAA ROWSEL
       STAA SCNREG
       TST DISREG
       BPL DECDE KEY FOUND
       BITA #$1F
       BEQ CKCOL
       CLC
       BRA NXROW
       SPC 1
CKCOL  CMPB #$C0 LAST COLUMN?
       BNE NXCOL NO, CK NEXT
       CLRA YES
       BRA RETURN
       SPC 1
NXCOL  ADDB #$40
       CLR ROWSEL
       BRA NXCOL1
       SPC 1
DECDE  LDX #$3000 160MS DELAY
       JSR DLY1
       LDX #KEYTBL
       CLRB
DECDE1 CMPA 0,X
       BEQ RETURN
       INCB
       INX
       CPX #KYTBLE+1 END OF TABLE?
       BNE DECDE1 NO,TRY NEXT
       CLRA
RETURN TSTA KEY FOUND?
       BNE KYFND YES
       LDAA RANUM
       CMPA #$0F RANUM MAX?
       BNE INRNBR NO
       LDAA #$09
       STAA RANUM
INRNBR INC RANUM
DISPRR JMP DISP
       SPC 1
KYFND  LDAA #$0F
       CBA FUNCTION?
       BCC CKPTR NO
       LDX #FCTTBL-2 FIND FUNC PTR
FNBRA1 INCA
       INX
       INX
       CBA
       BNE FNBRA1
       LDX 0,X GET ADR
       STX FCTPTR
       JMP 0,X
       SPC 1
FCTTBL FDB P P
       FDB CLRGS L
       FDB DISP N
       FDB BUF V
       FDB M M
       FDB STOP E
       FDB R R
       FDB G G
       SPC 1
CKPTR  TST FCTPTR+1
       BEQ DISPRR NO FUNCTION
       CLRA
       LDX FCTPTR GOTO ACTIVE FUNCTION
       JMP 0,X
       SPC 1
*      M FUNCTION
M      LDX CDECNT
       LDAA RANUM
       STAA CODE,X
       INX
       STX DISBUF+4
       CPX #$0004
       BNE M1
       LDX ZEROS
M1     STX CDECNT
       BRA DISPRR
       SPC 1
       ORG $A033
LOSE   LDX #CODE-1
LOSE1  INX PUT CODE IN DISBUF
       LDAA 0,X
       STAA $0C,X
       CPX #CODE+3 LAST CODE DIGIT?
       BNE LOSE1 NO
       CLR $0D,X
       CLR $0E,X
LOSE2  LDX #TRYREG+59
       STX TRYPTR
DISPR  JMP DISP
       SPC 1
*      R FUNCTION
R      CMPB #$09 LEGAL NUMBER?
       BHI DISPR NO, RETURN
       ASLB TIMES 2
       STS STKSAV
       LDS #TRYREG+59
       LDX #DISBUF-1
R2     DES
       DES
       DES
       DECB
       BNE R2
R3     INX
       PULA
       STAA 0,X
       CPX #DISBUF+5 DONE?
       BNE R3 NO
       LDS STKSAV
       BRA DISPR
       SPC 1
       END
