MEISTERMIND number guessing game for the COSMAC ELF written in 1977 by Klaus Ernst REGISTERS R0 program counter R1 memory pointer R2 number of random digits (5) R3 paritytest turn counter R4 store for number of digits played R5 random # generator counter R6 random # store 2 R7 random # store 1 R8 right # , right place counter R9 right # , wrong place counter RA number of digits selected by player RB store for guessed digit RC RD number of digits entered RE RF LABELS STUP 00 setup NDIG 0F next digit CONT 18 countdown RND 12 random # generator PAR1 2E parity test 1 PAR2 3C parity test 2 PAR3 4C parity test 3 SAME 62 2 digits same GAME 65 ready for game NTRY 77 next try GNDG 79 guess next digit ADV 85 advance right/right counter RWR 8C right/wrong test RPT 92 repeat right/wrong test INCR 99 increment right/wrong counter DSPL A0 display note1 : | is used for 'not equal' (e.g. if D|0 branch to 79) note2 : this listing using mnemonics and labels was NOT written with an assembler ( I followed the program listing conventions I found in the book "PROGRAMMER'S GUIDE TO THE 1802 ( with an assembler for your machine ) by Tom Swan, HAYDEN 1981" ) 00 STUP F8 LDI ; load 05 into D 01 05 02 A2 PLO R2 ; put D in R2.0 03 F8 LDI ; load E0 into D 04 E0 05 A7 PLO R7 ; put D in R7.0 06 F8 LDI ; load E8 into D 07 E8 08 A6 PLO R6 ; put D in R6.0 09 F8 LDI ; load A0 into D 0A A0 0B A8 PLO R8 ; put D in R8.0 0C F8 LDI ; load B0 intoD 0D B0 0E A9 PLO R9 ; put D in R9.0 0F NDIG F8 LDI ; load 0Ainto D 10 0A 11 A5 PLO R5 ; put D in R5.0 12 RND 85 GLO R5 ; getR5.0 13 3A BNZ ; if D|0 branch to 18 14 18 CONT 15 F8 LDI ; load 0A into D 16 0A 17 A5 PLO R5 ; put D in R5.0 18 CONT 25 DEC R5 ; decrement R5 19 3F BN4 ; if EF4=0 (INPUT button up)branch to 12 1A 12 RND 1B 37 B4 ; if EF4=1 (INPUT button down) branch to 1B 1C 1B 1D 7A REQ ; reset Q (LED off) 1E 85 GLO R5 ; get R5.0 1F 57 STR R5 ; store value of D at location addressed by R7 20 17 INC R7 ; increment R7 21 56 STR R6 ; store value of D at location addressed by R6 22 16 INC R6 ; increment R6 23 22 Dec R2 ; decrement R2 24 82 GLO R2 ; get R2.0 25 3A BNZ ; if D|0 branch to 0F 26 0F NDIG 27 F8 LDI ; load E0 into D 28 E0 29 A7 PLO R7 ; put D to R7.0 2A E7 SEX R7 ; set X=7 2B F8 LDI ; load 04 into D 2C 04 2D A3 PLO R3 ; put in R3.0 2E PAR1 47 LDA ; get byte from location addressed by R7 2F F5 SD ; subtract D 30 32 BZ ; if D=0 branch to 62 31 62 SAME 32 23 DEC R3 ; decrement R3 33 83 GLO R3 ; get R3.0 34 3A BNZ ; if D|0 branch to 2E 35 2E PAR1 36 F8 LDI ;load E0 into D 37 E0 38 A7 PLO R7 ; put in R7.0 39 F8 LDI ; load 03 into D 3A 03 3B A3 PLO R3 ; put in R3.0 3C PAR2 47 LDA ; get byte from location addressed by R7 3D 17 INC R7 ;increment R7 3E F5 SD ; subtract D 3F 32 BZ ; if D=0 branch to 62 40 62 SAME 41 27 DEC R7 ; decrement R7 42 23 DEC R3 ; decrement R3 43 83 GLO R3 ; get R3.0 44 3A BNZ ; if D|0 branch to 3C 45 3C PAR2 46 F8 LDI ; load E0 into D 47 E0 48 A7 PLO R7 ; put in R7.0 49 F8 LDI ; load 02 into D 4A 02 4B A3 PLO R3 ; put in R3.0 4C PAR3 47 LDA ; get byte from location addressed by R7 4D 17 INC R7 ; increment R7 4E 17 INC R7 ; increment R7 4F F5 SD ; subtract D 50 32 BZ ; ifD=0 branch to 62 51 62 SAME 52 27 DEC R7 ; decrement R7 53 27 DEC R7 ; decrement R7 54 23 DEC R3 ; decrement R3 55 83 GLO R3 ; get R3.0 56 3A BNZ ; if D|0 branch to 4C 57 4C PAR3 58 F8 LDI ; load E0 into D 59 E0 5A A7 PLO R7 ; put in R7.0 5B 47 LDA ; get byte from location addressed by R7 5C 17 INC R7 ; increment R7 5D 17 INC R7 ; increment R7 5E 17 INC R7 ; increment R7 5F F5 SD ; subtract D 60 3A BNZ ; if D|0 branch to 65 61 65 GAME 62 SAME 7B SEQ ; set Q (LED on) 63 30 BR ; branch to 00 64 00 STUP 65 GAME F8 LDI ; load F0 into D 66 F0 67 A1 PLO R1 ; put in R1.0 68 F8 LDI ; load EE into D 69 EE 6A 51 STR R1 ; store value of D at location addressed by R1 6B E1 SEX R1 ; set X=1 6C 64 OUT ; put memory byte addressed by register designated by X 6D F8 LDI ; load E0 into D on bus (display shows EE) 6E E0 6F A7 PLO R7 ; put in R7.0 70 3F BN4 ; if EF4=0 (INPUT button up) branch to 70 71 70 72 37 B4 ; if EF4=1 (INPUT button down) branch to 72 73 72 74 6C INP ; store byte on bus in D and in mem. loc. addressed by 75 A4 PLO R4 ; put D in R4.0 register designated by X 76 64 OUT ; put mem. byte addressed by register designated by X on 77 NTRY 84 GLO R4 ; get R4.0 bus 78 AA PLO RA ; put in RA.0 79 GNDG E1 SEX R1 ; set X=1 7A 3F BN4 ; if EF4=0 (INPUT button up) branch to 7A 7B 7A 7C 37 B4 ; if EF4=1 (INPUT button down) branch to 7C 7D 7C 7E 6C INP ; store byte on bus in D and in mem. loc. addressed by 7F AB PLO RB ; put D in RB.0 register designated by X 80 E7 SEX R7 ; set X=7 81 F5 SD ; subtract D 82 3A BNZ ; if D|0 branch to 8C 83 8C RWR 84 18 INC R8 ; increment R8 85 ADV 17 INC R7 ; increment R7 86 2A DEC RA ; decrement RA 87 8A GLO RA ; get RA.0 88 3A BNZ ; if D|0 branch to 79 89 79 GNDG 8A 30 BR ; branch to A0 8B A0 DSPL 8C RWR F8 LDI ; load E8 into D 8D E8 8E A6 PLO R6 ; put in R6.0 8F E6 SEX R6 ; set X=6 90 84 GLO R4 ; get R4.0 91 AD PLO RD ; put in RD.0 92 RPT 8B GLO RB ; get RB.0 93 F5 SD ; subtract D 94 3A BNZ ; if D|0 branch to 99 95 99 INCR 96 19 INC R9 ; increment R9 97 30 BR ; branch to 85 98 85 ADV 99 INCR 16 INC R6 ; increment R6 9A 2D DEC RD ; decrement RD 9B 8D GLO RD ; get RD.0 9C 3A BNZ ; if D|0 branch to 92 9D 92 RPT 9E 30 BR ; branch to 85 9F 85 ADV A0 DSPL E1 SEX R1 ; set X=1 A1 F8 LDI ; load F0 into D A2 F0 A3 A1 PLO R1 ; put in R1.0 A4 88 GLO R8 ; get R8.0 A5 51 STR R1 ; store value of D at location addressed by R1 A6 64 OUT ; put mem. byte addressed by register designated by X on A7 F8 LDI ; load A0 into D bus A8 A0 A9 A8 PLO R8 ; put in R8.0 AA 89 GLO R9 ; get R9.0 AB 51 STR R1 ; store value of D at location addressed by R1 AC 3F BN4 ; if EF4=0 (INPUT button up) branch to AC AD AC AE 37 B4 ; if EF4=1 (INPUT button down) branch to AE AF AE B0 64 OUT ; put mem. byte addressed by register designated by X on B1 F8 LDI ; load B0 into D bus B2 B0 B3 A9 PLO R9 ; put in R9.0 B4 C4 NOP ; no operation B5 F8 LDI ; load F0 into D B6 F0 B7 A1 PLO R1 ; put in R1.0 B8 E1 SEX R1 ; set X=1 B9 F8 LDI ; load E0 into D BA E0 BB A7 PLO R7 ; put in R7.0 BC 30 BR ; branch to 77 BD 77 NTRY