# Mastermind for the TI-95 # black if same digit at same position # white if same digit at different positions # register 000 has guessed four digit number # register 001 has random four digit number # register 002 is digit loop counter # register 003 is digit decomposition intermediate number # register 004 is random number digit pointer # register 005 is guessed number digit pointer # register 006 is set flag for correct random digit pointer # register 007 is second digit loop counter # register 008 is black digits # register 009 is white digits # register 010 is total tries # register 011 is first digit of random number # register 015 is first digit of guessed number # register 020 is set flag for correct guess digit pointer # register 100 is comparison value (1000) # define menu to display last guess, last black digits, last white digits, and number of tries # initialize CMS # set comparison value 1000 STO 100 # initialize digit register 11 # start putting random number digits in register 11 STO 004 # make up four digit random number LBL AA ( R# * 10000 # make four digit ) INT # eliminate decimal STO 001 # if 1000 or more, store in register 1 IF< 100 # if less than 1000 do next instruction GTL AA SBL AB # call digit decomposition subroutine 'Mastermind' # print opening message PAU # pause CLR # clear display LBL AD # set register counter to 15 for guess decomposition 15 STO 004 # input four digit number from user 'Guess?' # guess prompt BRK # wait until guess entered and GO pressed STO 000 # store guess in register 000 # decompose and store digits SBL AB # clear flags and set black/white CFG # clear flags 0 STO 008 # no black 0 STO 009 # no white # check guess against random number SBL AE # check for black SBL AG # check for white # set flag for each matched digit # check first for black, then leave white # print black/white LBL AJ "Black: " COL 16 MRG 008 PAU CLR "White: " COL 16 MRG 009 PAU CLR # return to prompt until four black present 4 IF= 008 # 4 black digits? GTL AK # if win goto label AK # otherwise, increase total tries INC 010 GTL AD # go to guess prompt # if you win LBL AK "You win!" PAU CLR "Tries:" COL 16 MRG 010 PAU CLR HLT # end program # digit decomposition subroutine LBL AB x~t # put input number in t register 4 STO 002 # set loop counter to 4 for 4 digits x~t # restore input number to x register LBL AC # main loop / 10 = STO 003 # intermediate calculation FRAC * 10 = STO IND 004 # store digit in register specified in register 004 INC 004 # increment 004 contents to point to next register RCL 003 INT DSZ 002 # Decrement and Stop on Zero based on register 002 GTL AC RTN # exit subroutine # check for black (same digit at same position) LBL AE 4 # set AF loop counter STO 002 0 # set random digit flag counter STO 006 4 # set guess digit flag counter STO 020 11 # first register with unknown number digits STO 004 15 # first register with guess number digits STO 005 LBL AF RCL IND 004 # recall what is in register pointed to by 004 IF= IND 005 # check if equal to what is in register pointed to by 005 GTL CC # if so, go to label CC GTL DD # if not, go to label DD LBL CC SF IND 006 # if so, set flag number defined in register 006 SF IND 020 # if so, set flag number defined in register 020 INC 008 # if so, add 1 to black digit count LBL DD INC 004 # increase unknown number digit pointer INC 005 # increase guess number digit pointer INC 006 # increase 006 flag number INC 020 # increase 020 flag number DSZ 002 # Decrement and Stop on Zero based on register 002 GTL AF RTN # now check for white (same digit at different position, if neither digit is marked black already) LBL AG 4 # AH loop counter STO 002 4 # AI loop counter STO 007 0 # set random digit flag counter STO 006 4 # set guess digit flag counter STO 020 11 # first register with unknown number digits STO 004 15 # first register with known number digits STO 005 LBL AH 11 STO 004 # set known number digit pointer before each loop 0 STO 006 # set flag pointer before each loop 4 STO 007 LBL AI RCL IND 004 # recall what is in register pointed to by 004 IF= IND 005 # check if equal to what is in register pointed to by 005 GTL EE # if so, go to label EE GTL FF # if not, go to label FF - skip LBL EE # check if flagged as black already INV TF IND 006 # test if flag number defined in register 006 unset GTL GG # if so, go to label GG GTL FF # if not, go to label FF (stop if black) LBL GG INV TF IND 020 # test if flag number defined in register 020 unset GTL HH # if so, go to label HH GTL FF # if not, go to label FF (stop if black) LBL HH SF IND 006 # if so, set flag number defined in register 006 SF IND 020 # if so, set flag number defined in register 020 INC 009 # if so, increase white digits LBL FF # either digits are unequal or flag is set (black) INC 004 # increment pointer in register 004 INC 006 # increment pointer in register 006 DSZ 007 # decrement and stop on zero based on register 007 GTL AI # if not zero, go to label AI INC 005 # increment pointer in register 005 INC 020 # increment pointer in register 020 DSZ 002 # decrement and stop on zero based on register 002 GTL AH # if not zero, go to label AH RTN