0000 * THE MIND 0002 * Robot Control Language 0004 * by Lichen Wang, DR.DOBBS, Sept,77 0006 * rev. Ken Anderson, DR.DOBBS, May,78 0010 * typed 6/13-15/78 by Earl Herr 0012 * * * * * * * * * * * * * * * * * * * * 0014 * ORG 0000H 0032 LXI SP,STACK+2 * set SP 1BFC 0034 XRA A * 0036 OUT DSTAT * zero VDM scroll reg 0038 CALL INIT * 0040 LXI H,SCREEN 0042 MVI A,SCREEN+1024/256 0044 I1 MVI M,' ' 0046 INX H 0048 CMP H 0050 JNZ I1 0052 LXI H,'=A' put A=0000 0054 SHLD SCREEN+122 in top rt.corner 0056 LXI H,'00' 0058 SHLD SCREEN+124 0060 SHLD SCREEN+126 0062 * 0064 DIRECT LXI SP,STACK * 0066 D1 LXI H,SCREEN 0068 D2 MVI B,58 0070 D3 MVI M,' ' 0072 INX H 0074 DCR B 0076 JNZ D3 0078 MVI C,07FH 0080 CALL FIND 0082 JZ D2 0084 MOV H,B 0086 MOV L,B 0088 LXI D,SCREEN 0090 CALL RCMD 0092 LXI H,SCREEN 0094 MOV D,B 0096 MOV E,B 0098 MVI B,0FFH 0100 CALL RCMD 0102 JMP D1 0104 * 0106 RCMD CALL GETCH 0108 CMD CALL KINP * 0110 NOP * 0112 JNZ DIRECT 0114 PUSH H 0116 CALL RESRV 0118 MOV A,B 0120 JNZ C1 0122 ORA A 0124 XTHL 0126 RET 0128 C1 ORA A 0130 POP H 0132 RZ 0134 PUSH H 0136 CALL FIND 0138 JNZ C2 0140 PUSH H 0142 LXI H,-DANGER * 0144 DAD SP 0146 MOV A,H 0148 ORA A 0150 JM DIRECT 0152 POP H 0154 INX H 0156 INX H 0158 CALL RCMD 0160 C2 POP H 0162 RET 0164 * 0166 GETCH MOV A,E 0168 ANI 63 0170 CPI 57 0172 JNC DIRECT 0174 ORA D 0176 JZ G1 0178 MVI A,07FH 0180 STAX D 0182 G1 MOV A,H 0184 ORA L 0186 JNZ G3 0188 CALL MDUMP * 0192 G2 CALL RNDB * 0194 CALL KINP * 0196 JZ G2 * 0198 MOV C,A 0200 JMP G4 0202 G3 MOV C,M 0204 INX H 0206 G4 MOV A,D 0208 ORA E 0210 RZ 0212 MOV A,C 0214 JMP BACKUP * 0220 * 0222 FIND PUSH D 0224 PUSH B 0226 LXI H,SCREEN+64 0228 LXI D,64 0230 MVI B,15 0232 MOV A,C 0234 F1 CMP M 0236 JZ F2 0238 DAD D 0240 DCR B 0242 JNZ F1 0244 INR B 0246 F2 POP B 0248 POP D 0250 RET 0251 * 0252 RESRV PUSH B 0254 MVI B,20 * TABLSZ 0256 LXI H,TABL 0258 MOV A,C 0260 V1 CMP M 0262 INX H 0264 JZ V2 0266 INX H 0268 INX H 0270 DCR B 0272 JNZ V1 0274 POP B 0276 LXI H,CMD09 0278 DIGIT MVI A,'9' 0280 CMP C 0282 RC 0284 MOV A,C 0286 SUI '0' 0288 RC 0290 CMP A 0292 RET 0294 V2 MOV A,M 0296 INX H 0298 MOV H,M 0300 MOV L,A 0302 POP B 0304 RET 0306 * 0308 CMDBL RET 0310 * 0312 CMDD CALL GETCH 0314 PUSH H 0316 CALL RESRV 0318 JZ DIRECT 0320 MOV A,B 0322 ORA A 0324 JNZ CD1 0326 POP H 0328 JMP RCMD 0330 CD1 CALL FIND 0332 JNZ CD2 0334 MVI M,07FH 0336 CD2 PUSH B 0338 MVI C,' ' 0340 CALL FIND 0342 JNZ DIRECT 0344 POP B 0346 MOV M,C 0348 INX H 0350 MVI M,'=' 0352 INX H 0354 XCHG 0356 XTHL 0358 MVI B,0 0360 CALL GETCH 0362 MVI A,' ' 0364 CMP C 0366 JNZ CD3 0368 DCX D 0370 DCX D 0372 STAX D 0374 DCX D 0376 STAX D 0378 CD3 CALL CMD 0380 POP D 0382 MVI B,0FFH 0384 RET 0386 * 0388 CMDLP CALL GETCH 0390 MOV A,C 0392 CPI ')' 0394 RZ 0396 CALL CMD 0398 JMP CMDLP 0400 * 0402 CMDQM JZ SKIP 0404 CALL RNDB 0406 JMP TEST 0408 RNDB PUSH H 0410 LHLD SEED 0412 DAD H 0414 MOV A,L 0416 JNC CQ1 0418 XRI 02DH 0420 MOV L,A 0422 CQ1 SHLD SEED 0424 POP H 0426 ANI 1 0428 RET 0430 * 0432 CMDT JNZ CT1 0434 SKIP CALL RCMD 0436 JMP RCMD 0438 CT1 PUSH H 0440 LHLD SCREEN+60 0442 MOV A,H 0444 ORA L 0446 LHLD SCREEN+62 0448 ORA H 0450 ORA L 0452 POP H 0454 CPI '0' 0456 TEST JZ T1 0458 CALL RCMD 0460 MVI B,0 0462 CALL RCMD 0464 MVI B,0FFH 0466 RET 0468 T1 MVI B,0 0470 CALL RCMD 0472 MVI B,0FFH 0474 JMP RCMD 0476 * 0478 CMDPS RZ 0480 PUSH H 0482 CALL GETA 0484 POP H 0486 MVI A,9999/256 0488 CMP H 0490 JNZ CPS1 0492 MVI A,0FH 9999 MOD 256 ?? 0494 CMP L 0496 JNZ CPS1 0498 POP H 0500 RET 0502 CPS1 INX H 0504 PUTA MVI C,8 0506 P1 DAD H 0508 MOV A,H 0510 SUI 100 0512 JC P2 0514 MOV H,A 0516 INX H 0518 P2 DCR C 0520 JNZ P1 0522 MOV C,H 0524 MOV A,L 0536 LXI H,SCREEN+60 0538 CALL TWOD 0540 INX H 0542 MOV A,C 0544 CALL TWOD 0546 POP H 0548 RET 0550 TWOD MVI M,'0'-1 0552 P3 INR M 0554 SUI 10 0556 JNC P3 0558 ADI '0'+10 0560 INX H 0562 MOV M,A 0564 RET 0566 CMDMS RZ 0568 PUSH H 0570 CALL GETA 0572 POP H 0574 MOV A,H 0576 ORA L 0578 DCX H 0580 JNZ PUTA 0582 POP H 0584 RET 0586 * 0588 CMDA JZ RCMD 0590 PUSH H 0592 CALL GETA 0594 POP H 0596 XTHL 0598 CALL GETCH 0600 JMP ITER 0602 * 0604 GETA LXI H,SCREEN+60 0606 CALL GETCH 0608 NUMB PUSH H 0610 LXI H,0 0612 N1 PUSH D 0614 MVI A,24 0616 CMP H 0618 JNC N2 0620 MOV H,A 0622 N2 MOV D,H 0624 MOV E,L 0626 DAD H 0628 DAD H 0630 DAD D 0632 DAD H 0634 MVI D,0 0636 MOV A,C 0638 SUI '0' 0640 MOV E,A 0642 DAD D 0644 POP D 0646 XTHL 0648 CALL GETCH 0650 CALL DIGIT 0652 XTHL 0654 JZ N1 0656 INX SP 0658 INX SP 0660 XTHL 0662 DCX SP 0664 DCX SP 0666 XTHL 0668 RET 0670 * 0672 CMD09 CALL NUMB 0674 MOV A,B 0676 ORA A 0678 JNZ ITER 0680 POP PSW 0682 JMP CMD 0684 ITER XTHL 0686 MOV A,H 0688 ORA L 0690 DCX H 0692 JNZ IT1 0694 POP H 0696 MVI B,0 0698 CALL CMD 0700 MVI B,0FFH 0702 RET 0704 IT1 XTHL 0706 PUSH H 0708 PUSH B 0710 CALL CMD 0712 POP B 0714 POP H 0716 JMP ITER 0718 * 0720 TABL DB ' ' 0722 DW CMDBL 0724 DB 'D' 0726 DW CMDD 0728 DB '(' 0730 DW CMDLP 0732 DB ')' 0734 DW DIRECT 0736 DB 07FH 0738 DW DIRECT 0740 DB '?' 0742 DW CMDQM 0744 DB 'T' 0746 DW CMDT 0748 DB '+' 0750 DW CMDPS 0752 DB '-' 0754 DW CMDMS 0756 DB 'A' 0758 DW CMDA 0759 * * tabl addn 0760 DB 'C' 0762 DW CLEAR 0764 DB 1BH 0766 DW EXIT 0768 DB 'H' 0780 DW HOME 0782 DB 'N' 0784 DW NORTH 0786 DB 'F' 0788 DW FORWD 0790 DB 'R' 0792 DW RIGHT 0794 DB 'B'-40H 0796 DW WASH 0798 DB 'B' 0800 DW BLK 0802 DB 'W' 0804 DW WHT 0806 DB 'S' 0808 DW SWITCH 0810 * * BODY * * 0812 CLEAR RZ 0814 CDISP PUSH H ** 0816 LXI H,VDMEM ** 0818 MVI A,VDMH+4 0820 CDI MVI M,20H 0822 INX H 0824 CMP H 0826 JNZ CDI 0828 POP H 0830 RET 0832 * 0834 HOME RZ 0836 PUSH H 0838 PUSH D 0840 LXI H,4840H 0842 JMP DISP 0844 * face north 0846 NORTH RZ 0848 XRA A 0850 STA DX 0852 INR A 0854 STA DY 0856 RET 0858 * rotate rt 45 deg 0860 RIGHT RZ 0862 PUSH H 0864 LHLD DX 0866 MOV A,H 0868 ADD L 0870 CALL R1 0872 MOV C,A 0874 MOV A,H 0876 SUB L 0878 CALL R1 0880 MOV H,A 0882 MOV L,C 0884 SHLD DX 0886 POP H 0888 RET 0890 R1 CPI 2 0892 JNZ R2 0894 DCR A 0896 R2 CPI -2 0898 RNZ 0900 INR A 0902 RET 0904 * * mind dump * * 0906 MDUMP LDA MINDF 0908 ORA A 0910 RZ 0912 PUSH H 0914 PUSH D 0916 LXI H,SCREEN 0918 LXI D,VDMEM 0920 MOVE MOV A,M 0922 STAX D 0924 MOV INX D 0926 INX H 0928 MVI A,SCREH+4 0930 CMP H 0932 JNZ MOVE 0934 POP D 0936 POP H 0938 RET 0940 * 0942 KINP IN KSTAT 0944 CMA 0946 ANI 1 0948 RZ 0950 IN KDATA 0952 ANI 7FH 0954 CPI ';' 0956 JNZ K1 0958 ORA A 0960 MVI A,'+' 0962 K1 STA MINDF 0964 RET 0966 * initialization 0968 INIT LDA MSGF 0970 ORA A 0972 CZ MSG 0974 CPI 'Y' 0976 JNZ INIT1 0978 MVI A,10H 0980 OUT DSTAT 0982 * test cortex 0984 INIT1 LXI D,-'=A' 0986 LHLD SCREEN+58 0988 DAD D 0990 MOV A,H 0992 ORA L 0994 RNZ 0996 JMP 24H 0998 * wht trace, blk bkgd 1000 WHT RZ 1002 MVI A,0C0H 1004 STA CDI+1 1006 PUSH H 1008 LXI H,0B6H 1010 SHLD BORW 1012 POP H 1014 RET 1016 * blk trace, wht bkgd 1018 BLK RZ 1020 MVI A,0FFH 1022 STA CDI+1 1024 PUSH H 1026 LXI H,0AEB6H 1028 SHLD BORW 1030 POP H 1032 RET 1034 * switch trace state 1036 SWITC RZ 1038 PUSH H 1040 LXI H,0AEH 1042 SHLD BORW 1044 POP H 1046 RET 1048 * 1050 BACKU CPI 1 1052 JNZ SAVE 1054 MVI A,20H 1056 STAX D 1058 DCX D 1060 LDAX D 1062 CPI '(' 1064 JZ NO 1066 CPI ')' 1068 JZ NO 1070 RET 1072 SAVE STAX D 1074 NO INX D 1076 RET 1078 FORWD RZ 1080 PUSH H 1082 PUSH D 1084 LHLD X 1086 XCHG 1088 LHLD DX 1090 MOV A,L 1092 ADD E 1094 ANI 7FH 1096 MOV L,A 1098 MOV A,H 1100 ADD D 1102 MVI E,30H 1104 SUBT SUB E 1106 JNC SUBT 1108 ADD E 1110 ADD E 1112 MOV H,A 1114 DISP SHLD X 1116 MVI E,30H 1118 SUB E 1120 SUB E 1122 PUSH B 1124 LXI B,0FF03H 1126 CMA 1128 DIVID INR B 1130 SUB C 1132 JNC DIVID 1134 ADD C 1136 MOV C,A 1138 MOV A,L 1140 MOV L,B 1142 MVI H,0 1144 DAD H 1146 DAD H 1148 DAD H 1150 DAD H 1152 DAD H 1154 DAD H 1156 MOV B,A 1158 RAR 1160 MVI D,VDMH 1162 MOV E,A 1164 DAD D 1166 XCHG 1168 MOV A,B 1170 RAR 1172 MOV A,C 1174 RAL 1176 LXI H,MTABLE 1178 MVI B,0 1180 MOV C,A 1182 DAD B 1184 LDAX D 1186 ANI 0C0H 1188 CPI 0C0H 1190 JZ GCHAR 1192 MVI A,0C0H 1194 DB 0EH 1196 GCHAR LDAX D 1198 ORA M 1200 BORW NOP 1202 STAX D 1204 XRA A 1206 STA MINDF 1208 POP B 1210 POP D 1212 POP H 1214 RET 1216 * cell mask table 1218 MTABL DB 1 * cell 1 1220 DB 8 * cell 4 1222 DB 2 * cell 2 1224 DB 10H * cell 5 1226 DB 4 * cell 3 1228 DB 20H * cell 6 1230 MINDF DB 1 1232 MSGF DB 0 1234 * 1236 MSG CALL CDISP 1238 LXI H,0CD00H 1240 LXI D,MSGG 1242 MVI C,MSGL 1244 MSG1 LDAX D 1246 MOV M,A 1248 INX H 1250 INX D 1252 DCR C 1254 JNZ MSG1 1256 YES CALL KINP 1258 JZ YES 1260 STA MSGF 1262 RET 1264 MSGG DW 'RA' 1266 DW ' E' 1268 DW 'YM' 1270 DW 'G ' 1272 DW 'AR' 1274 DW 'HP' 1276 DW 'CI' 1278 DB 'S' 1280 DW 'S ' 1282 DW 'FO' 1284 DW 'WT' 1286 DW 'RA' 1288 DW ' E' 1290 DW 'ES' 1292 DW 'EL' 1294 DW 'TC' 1296 DW 'BA' 1298 DW 'EL' 1300 DW ' ?' 1302 STACK ORG 1BFAH 1304 SEED DS 2 1306 X DB 1 1308 Y DB 1 1310 DX DB 1 1312 DY DB 1 1314 DANGE EQU MSGG+64 1316 MSGL EQU 38 1318 WASH EQU 9 1320 EXIT EQU 0C001H 1322 SCREE EQU 1C00H 1324 SCREH EQU 1CH 1326 VDMEM EQU 0CC00H 1328 VDMH EQU 0CCH 1330 DSTAT EQU 0FEH 1332 KSTAT EQU 0FAH 1334 KDATA EQU 0FCH 1336 * 1340 PSW EQU 6 1342 SP EQU 6 1344 *