NSSE5  PLT1 C PLT2 GD PLT3 D PLT4 @ PLT5 & PILOT 5* REMARKS R  70001 ; P I L O T 8080 V E R S I O N 1.1 0002 ; 50003 ENTRY EQU 40H ;NORMAL ENTRY ADDRESS ;0004 STKPR EQU 100H ;STACK POINTER & JUMP TABLE ;0005 PSTRT EQU 2E0H ;START OF PILOT INTERPRETER <0006 PBUFB EQU 1000H ;BEGINNING OF PROGRAM BUFFER 60007 PBUFE EQU 1FFFH ;END OF PROGRAM BUFFER :0008 LINE EQU 72 ;MAX INPUT LINE AT STARTUP <0009 VIDEO EQU 0FE77H ;EXTERNAL VIDEO DISPLAY ADDR 90010 MNTR EQU 0E060H ;EXTERNAL MONITOR ADDRESS 0011 ; /0012 ORG ENTRY ;NORMAL STARTUP 60013 JMP START ;ENTRY SETS NORMAL I/O 0014 ; 30015 LXI H,CTV ;ENTRY TO USE VIDEO 50016 SHLD CO+1 ; FOR CONSOLE OUTPUT 20017 SHLD LO+1 ; FOR LIST OUTPUT 30018 SHLD PO+1 ; FOR PUNCH OUTPUT :0019 JMP RSTRT ;AVOID RESET OF JUMP TABLE 80020 CTV: PUSH B ;CALL VIDEO ROUTINE THAT 90021 MOV B,C ; EXPECTS CHAR IN B-REG. 0022 CALL VIDEO 0023 POP B 0024 RET 0025 ; $0026 ; JUMP TABLE FOR I/O ROUTINES 40027 ; ONLY TTY ROUTINES ARE PROVIDED INTERNALLY 0028 ; 00029 ORG STKPR ;TOP OF STACK ;0030 CI: JMP CHI ;CHAR INPUT TO A REG. ;0031 CO: JMP CHO ;CHAR OUTPUT FROM C REG. ;0032 RI: JMP CHI ;READER INPUT TO A REG. ;0033 LO: JMP CHO ;LIST OUTPUT FROM C REG. <0034 PO: JMP CHO ;PUNCH OUTPUT FROM C REG. 50035 EXIT: JMP MNTR ;RETURN TO MONITOR 20036 EDIT: JMP MNTR ;CALL TO EDITOR 60037 ASCAN: JMP BASIC ;ALTERN INTERPRETER 0038 ; 0039 ; DATA AREAS :0040 TOPP: DW 0 ;TOP OF PROGRAM STORAGE :0041 HLSAV: DW 0 ;TEMPORARY POINTER (HL) :0042 HLLSAV: DW 0 ;TEMPORARY POINTER (HL) :0043 HL2SAV: DW 0 ;TEMPORARY POINTER (HL) :0044 DESAV: DW 0 ;TEMPORARY POINTER (DE) 50045 LLSAV: DW 0 ;LAST LINE POINTER 70046 RETSAV: DW 0 ;ZERO LEVEL OF STACK +0047 DW 0 ;LEVEL 1 +0048 DW 0 ;LEVEL 2 +0049 DW 0 ;LEVEL 3 +0050 DW 0 ;LEVEL 4 +0051 DW 0 ;LEVEL 5 +0052 DW 0 ;LEVEL 6 20053 DW 0 ;LEVEL 7 (TOP) 20054 APTR: DW 0 ;A STMT POINTER 10055 EPTR: DW 0 ;ENTRY POINTER 00056 CPTR: DW 0 ;CHAR POINTER 80057 IPTR: DW 0 ;INPUT BUFFER POINTER 20058 MPTR: DW 0 ;M-STMT POINTER 80059 MEMTP: DW 0 ;LAST MEMORY LOCATION :0060 OUTADR: DW 0 ;CO,LO,PO OUTPUT VECTOR 70061 SCANB: DW 0 ;SCAN BEGINNING ADDR 60062 CHMAX: DS 1 ;MAX CHARS ACCEPTED 80063 LEVEL: DS 1 ;CURRENT RETURN LEVEL 90064 LNSKP: DS 1 ;SKIP FOR DIFF EDITORS 00065 MBRCH: DS 1 ;M-BREAK CHAR 00066 SCNT: DS 1 ;STRING COUNT :0067 TEMP: DS 1 ;TEMPORARY BINARY VALUE 20068 VARSAV: DS 1 ;VARIABLE SAVED <0069 YNSW: DS 1 ;YN-SWITCH, 000: NO MATCH /0070 TSAVE: DS 81 ;T-TEXT AREA 50071 EBUFF: DS 81 ;ENTRY BUFFER AREA /0072 MSAVE: DS 81 ;M LIST AREA 30073 LABSAV: DS 12 ;LABEL SAVE AREA 00074 LASTOP: DS 11 ;LAST OP CODE <0075 NVAR: DS 53 ;NUMERIC VARIABLE STORAGE -0076 WORD: DS 81 ;WORD AREA 0077 ; .0078 ; START AND TERMINATION OF MAIN PROGRAM 10079 ; ORG HERE CAN SET BEGINNING OF ROM AREA 0080 ; 0081 ORG PSTRT <0082 START: LXI SP,STKPR ;INITIALIZE STACK POINTER 30083 LXI H,PBUFE-1 ;INITIALIZE APTR 0084 SHLD APTR :0085 LXI H,IOJMP ;SET NORMAL I/O VECTORS 0086 LXI D,CI 0087 MVI C,24 0088 CALL BLKTFR 0089 JMP RSTRT 90090 IOJMP: JMP CHI ;COPY OF STD JMP TABLE 0091 JMP CHO 0092 JMP CHI 0093 JMP CHO 0094 JMP CHO 0095 JMP MNTR 0096 JMP MNTR 0097 JMP BASIC 0098 ; 90099 RSTRT: LXI SP,STKPR ;INIT STACK ON RESTART 70100 CALL INIT ;INITIALIZE THE REST 30101 CALL SCAN ;SCAN THE BUFFER .0102 JMP RSTRT ;START OVER 0103 ; !0104 DB '020677',0DH 0105 ; *0106 DB 'PILOT-8080, 1.1',0DH 0107 ; >0108 DB 'COPYRIGHT (C) 1977,J.A.STARKWEATHER',0DH 0109 ; 0110 ; (0111 ; INITIALIZE DATA FOR NEW PROGRAM 0112 ; 70113 INIT: LXI H,IBUFF ;RESET INPUT POINTER 80114 SHLD IPTR ; TO FRONT OF BUFFER 60115 SHLD SCANB ;SET SCAN BEGINNING 70116 LXI H,PBUFE ;SET LAST MEMORY LOC 0117 SHLD MEMTP 10118 CALL NEWN ;SET A-POINTER 80119 CALL INITV ;INITIALIZE VARIABLES 00120 MVI M,1 ; SET STOP 70121 MVI A,LINE ;RESET INMAX TO LINE 0122 STA CHMAX 50123 XRA A ;ZERO RETURN LEVEL 0124 STA LEVEL 40125 STA LNSKP ;ZERO LN NO. SKIP 80126 LXI H,CO ;RESET CONSOLE OUTPUT 0127 SHLD OUTADR 0128 RET 0129 ; 0130 ; SCAN OF INPUT BUFFER "0131 ; ENTER: HL=BUFFER ADDR 20132 ; RETURNS: HL=LAST ADDR, B=LAST CHAR (01) 0133 ; /0134 SCAN: LHLD IPTR ;GET POINTER 20135 MOV A,M ;GET FIRST CHAR 10136 CPI 1 ;IF END MARKER 10137 RZ ; THEN RETURN 60138 CPI 0DH ;IF NOT END OF LINE <0139 JNZ CKEND ; THEN CK FOR SOURCE END 70140 INX H ; ELSE BUMP POINTER 20141 JMP SCAN+3 ; AND CONTINUE 50142 CKEND: CALL CNTLN ;HL=EOL, A=BR CHAR 10143 CPI 1 ;IF END MARKER 10144 RZ ; THEN RETURN 90145 INX H ;HL=START OF NEXT LINE 20146 SHLD IPTR ;SAVE THAT ADDR 10147 DCX H ;HL=BREAK CHAR <0148 CALL BACKUP ;RESET HL TO CURRENT LINE :0149 CALL SKLN ;SKIP ANY LN NOS., ETC. :0150 CALL GETCH ; GET FIRST TEXT CHAR ,0151 CPI ':' ;IF COLON ;0152 CZ CONTIN ; THEN CONTINUE SAME OP >0153 JZ SCAN ; IF CALLED THEN NEXT SCAN /0154 CPI '*' ;IF ASTERISK 50155 CZ GETWD ; THEN SKIP LABEL 90156 JZ SCAN+3 ;IF CALLED THEN RESCAN 60157 CALL OPS ;PROCESS OPERATIONS 0158 JMP SCAN 0159 ; 20160 CONTIN: INX H ;COLON ADDR + 1 +0161 SHLD HLSAV ;SAVE IT 70162 LXI H,LASTOP ; ADDR LAST OP CODE 50163 SHLD LLSAV ;SAVE OP CODE ADDR 0164 MVI B,':' 20165 CALL INDX ;ADDR COLON POS 30166 CALL OLDOP ;USE PART OF OPS 40167 XRA A ; SET RETURN FLAG 0168 RET 0169 ; '0170 ; OP CODES-- INTERPRET OPERATION 30171 ; ENTER: HL = FIRST NON-BLANK CHAR IN LINE *0172 ; RETURNS: RETURN (ZERO) FLAG SET 0173 ; 50174 OPS: SHLD LLSAV ;SAVE OP CODE ADDR 00175 CALL SAVOP ;SAVE OP CODE 00176 LHLD LLSAV ;ADDR OP CODE 40177 MVI B,':' ; LOOK FOR COLON 00178 CALL INDX ;IF NOT FOUND 0179 MOV A,C 0180 ORA A :0181 JZ ALTSC ; THEN TRY ALTERN SCAN 20182 INX H ;COLON ADDR + 1 +0183 SHLD HLSAV ;SAVE IT 50184 DCX H ;ADDR POS OF COLON 90185 OLDOP: DCX H ;ADDR POS BEFORE COLON <0186 CALL YNCHK ;IF YN-SW OFF(Y) OR ON(N) .0187 ORA A ; (A=000) 10188 RZ ; THEN RETURN ;0189 CALL VARCHK ;IF VARIABLE PRESENT < 1 10190 RZ ; THEN RETURN 00191 LHLD LLSAV ;ADDR OP CODE 80192 CALL GETCTL ;GET THE CONTROL WORD 90193 CALL CTLMCH ;CALL SPECIFIC CONTROL 40194 CPI 1 ;IF CONTROL FOUND 10195 RNZ ; THEN RETURN 30196 ALTSC: LHLD LLSAV ;ADDR FIRST CHAR 30197 CALL ASCAN ;TRY ALTERN SCAN 60198 RZ ;IF OK, THEN RETURN 80199 LHLD LLSAV ;ELSE ADDR FIRST CHAR /0200 SHLD HLSAV ;SET POINTER 00201 CALL TOP ;DISPLAY TEXT 0202 RET 0203 ; /0204 ; TEXT CHECK FOR PRESENCE OF LINE FEEDS, (0205 ; LINE COUNTS, OR LINE NUMBERS. 70206 ; SETS LNSKP TO NO. OF CHARS TO SKIP BEFORE TEXT 0207 ; 50208 TXTCK: LXI H,PBUFF ;ADDR PROGRAM TEXT +0209 CALL CNTLN ;ADDR CR 0210 INX H 10211 MOV A,M ;GET NEXT CHAR -0212 CPI 0AH ;IF NOT LF <0213 JNZ CKLC ; THEN CK FOR LINE COUNT 80214 CALL CNTLN ;ELSE CK ANOTHER LINE 0215 INX H 0216 MOV A,M -0217 CPI 0AH ;IF NOT LF <0218 JNZ CKLC ; THEN CK FOR LINE COUNT 70219 LDA LNSKP ;ELSE ADD 1 TO LNSKP 0220 ADI 1 0221 STA LNSKP 50222 CKLC: LXI H,PBUFF ;CK FOR LINE COUNT +0223 CALL CNTLN ;ADDR CR /0224 INX H ; NEXT CHAR /0225 CALL SKLN ;SKIP ANY LF ;0226 MOV E,M ;GET POSSIBLE LINE COUNT 0227 MVI D,0 +0228 DCX D ;DECR IT 10229 DAD D ;ADDR LINE END ,0230 MOV A,M ;GET CHAR -0231 CPI 0DH ;IF NOT CR :0232 JNZ CKLN ; THEN CK FOR LINE NO. 80233 INX H ;ELSE CK ANOTHER LINE 0234 CALL SKLN 0235 MOV E,M 0236 DCX D 0237 DAD D 0238 MOV A,M -0239 CPI 0DH ;IF NOT CR ;0240 JNZ CKLN ; THEN CK FOR LINE NOS. 70241 LDA LNSKP ;ELSE ADD 1 TO LNSKP 0242 ADI 1 0243 STA LNSKP 80244 CKLN: LXI H,PBUFF+1 ;NOW LOOK FOR LN NOS. +0245 CALL CNTLN ;ADDR CR /0246 INX H ; NEXT CHAR 50247 CALL SKLN ;SKIP LF OR LN CNT 80248 MOV A,M ;GET CHAR AFTER LN CT 70249 CALL NUM ;IF NOT ASCII NUMBER /0250 RNZ ; THEN QUIT 70251 LDA LNSKP ;ELSE ADD 4 TO LNSKP 0252 ADI 4 0253 STA LNSKP 0254 RET 0255 ; :0256 NUM: CPI '0' ;CHECK FOR ASCII NUMBER +0257 RM ;TOO LOW 0258 CPI '9'+1 0259 JM YNUM ,0260 ORA H ;TOO HIGH 0261 RET &0262 YNUM: XRA A ;OK 0263 RET 0264 ; (0265 ; SKIP LINE NUMBER AND LINE COUNT #0266 ; BASED ON VALUE OF LNSKP 0267 ; 20268 SKLN: LDA LNSKP ;GET SKIP COUNT +0269 ORA A ;IF ZERO 10270 RZ ; THEN RETURN 40271 INX H ;SKIP A CHARACTER .0272 DCR A ;DECR COUNT (0273 JMP SKLN+3 ;MORE 0274 ; '0275 ; CHECK FOR Y OR N CONDITIONS "0276 ; Y AND N FOLLOWING OP CODE 20277 ; ACT AS A SWITCH ALONG WITH YN-SWITCH &0278 ; ENTER: HL = ADDR OF COLON 10279 ; RETURNS: A = 000 IF NO ACTION REQUIRED 20280 ; ELSE A = CHAR BEFORE COLON 70281 ; HL = ADDR OF LAST CHAR BEFORE COLON 0282 ; 60283 YNCHK: CALL GETLCH ;GET LAST CHARACTER (0284 CPI 'Y' ;IF Y 0285 JZ YCHK (0286 CPI 'N' ;IF N 0287 JZ NCHK 70288 ORA A ; ELSE SET SWITCH ON :0289 RET ; AND RETURN WITH CHAR 00290 YCHK: LDA YNSW ;IF YN-SWITCH 30291 ORA A ; SHOWS MATCH /0292 JZ DONT ; THEN QUIT 70293 ORA H ; ELSE SET SWITCH ON 00294 RET ; AND RETURN 0295 NCHK: LDA YNSW 60296 ORA A ; SHOWS NO MATCH /0297 JNZ DONT ; THEN QUIT 70298 ORA H ; ELSE SET SWITCH ON 00299 RET ; AND RETURN 30300 DONT: XRA A ; SET SWITCH OFF 00301 RET ; AND RETURN 0302 ; 20303 ; CHECK FOR NUMERIC VARIABLE CONDITIONS .0304 ; VARIABLE IN PARENTHESES AFTER OP CODE /0305 ; CAUSES EXECUTION IF VALUE +1 OR MORE /0306 ; ENTER: A = LAST CHAR BEFORE COLON 80307 ; RETURNS: ZERO FLAG OFF IF NO ACTION REQUIRED 0308 ; 70309 VARCHK: CPI ')' ;IF VARIABLE PRESENT 30310 JZ VCHK ; THEN CHECK IT 70311 ORA H ; ELSE SET SWITCH ON 00312 RET ; AND RETURN 00313 VCHK: DCX H ;DECR POINTER +0314 DCX H ; TWICE /0315 MOV A,M ; GET CHAR 80316 CPI '(' ;IF PAREN NOT PRESENT 30317 JNZ BADFRM ; THEN COMPLAIN 00318 INX H ;BUMP POINTER 50319 MOV B,M ; SAVE CHAR IN B .0320 CALL VARMCH ;LOOK IT UP 10321 CPI 1 ;IF END MARKER 30322 JZ BADFRM ; THEN COMPLAIN 90323 INX H ; ELSE POINT AT VALUE 00324 MOV A,M ; GET VALUE 0325 CPI 01 /0326 JM VOFF ; THEN QUIT 70327 ORA H ; ELSE SET SWITCH ON 00328 RET ; AND RETURN 30329 VOFF: XRA A ; SET SWITCH OFF 00330 RET ; AND RETURN 0331 ; 10332 BADFRM: LHLD LLSAV ;SHOW THE LINE 0333 CALL TOP+3 0334 LXI H,EXPMSG 0335 CALL ERROR 0336 RET 0337 ; <0338 ; VARIABLE MATCH - LOOKUP OF VARIABLE NAME/VALUE LIST 50339 ; ENTER: VARIABLE NAME CHAR IN B REGISTER .0340 ; RETURNS: HL = ADDR OF MATCHED NAME 30341 ; IF VAR NOT IN LIST THEN A = 01 0342 ; 0343 VARMCH: LXI H,NVAR 0344 MOV A,M /0345 CPI 1 ;IF LIST END 10346 RZ ; THEN RETURN ,0347 CMP B ;IF MATCH 10348 RZ ; THEN RETURN 50349 INX H ; ELSE LOOK AGAIN 0350 INX H 0351 JMP VARMCH+3 0352 ; 90353 ; CONTROL MATCH- CALLS SPECIFIC CONTROL OPERATIONS '0354 ; ENTER: 'WORD':CONTROL WORD 90355 ; RETURNS: IF WORD NOT IN LIST, THEN 01 RETURNED *0356 ; HL: START OF NEXT WORD 0357 ; :0358 CTLMCH: LXI D,CTLST ; DE=CONTROL LIST ADDR 10359 CALL LSTMCH ;LOOK FOR WORD 00360 CPI 1 ;IF NOT FOUND 10361 RZ ; THEN RETURN 0362 XCHG 0363 INX H 70364 LXI D,RTRN ;PUT RETURN ON STACK 0365 PUSH D 0366 MOV E,M 0367 INX H 0368 MOV D,M 60369 PUSH D ;CALL ADDR ON STACK 0370 RET 0371 RTRN: XRA A 0372 RET 0373 ; 10374 ; LIST MATCH - LOOKUP OF WORD/ADDRESS LIST -0375 ; ENTER: 'WORD' = WORD TO BE FOUND 20376 ; DE = ADDR OF BEGINNING OF LIST 10377 ; RETURNS: DE = ADDR OF POINTER (L BYTE) 30378 ; IF WORD NOT IN LIST THEN A = 01 0379 ; 30380 LSTMCH: LXI H,WORD ; HL=INPUT WORD :0381 CALL CMPR ;COMPARE WORD WITH LIST -0382 ORA A ; IF MATCH 10383 RNZ ; THEN RETURN 00384 INX H ;ELSE HL = DE 0385 XCHG 20386 INX H ;AND INCR HL TO 20387 INX H ;NEXT LIST ADDR 0388 INX H 90389 MOV A,M ; GET NEXT LIST CHAR 10390 CPI 1 ;IF END MARKER 10391 RZ ; THEN RETURN >0392 XCHG ;ELSE RESET DE TO NEXT ITEM 00393 JMP LSTMCH ; AND TRY IT 0394 ; -0395 ; CONTROL LIST - OP CODES AND KEYWORDS 0396 ; 0397 CTLST: DB 'T',0DH 0398 DW TOP 0399 DB 'A',0DH 0400 DW AOP 0401 DB 'M',0DH 0402 DW MOP 0403 DB 'MC',0DH 0404 DW MC 0405 DB 'J',0DH 0406 DW JOP 0407 DB 'R',0DH 0408 DW ROP 0409 DB 'C',0DH 0410 DW COP 0411 DB 'U',0DH 0412 DW UOP 0413 DB 'E',0DH 0414 DW EOP 0415 DB 'Y',0DH 0416 DW TOP 0417 DB 'N',0DH 0418 DW TOP b`-0419 DB 'SAVE',0DH ;SAVE PROGRAM 0420 DW SPRG 40421 DB 'IEP',0DH ;INTERPRET EXIST PROG 0422 DW IEP 0423 DB 'BYE',0DH 0424 DW EXIT 0425 DB 'EDIT',0DH 0426 DW EDIT 0427 DB 1 0428 ; 50429 ;COMMON DATAPOINT PILOT CODES NOT IN OPERATION 0430 ; DB 'CA',0DH 0431 ; DW CURSR 0432 ; DB 'CE',0DH 0433 ; DW CLRE 0434 ; DB 'CL',0DH 0435 ; DW CLRL 0436 ; DB 'CH',0DH 0437 ; DW CLRH 0438 ; DB 'RL',0DH 0439 ; DW ROLL 0440 ; DB 'WA',0DH 0441 ; DW WAIT 0442 ; 0443 ;CURSR: RET 0444 ;CLRE: RET 0445 ;CLRL: RET 0446 ;CLRH: RET 0447 ;ROLL: RET 0448 ;WAIT: RET 0449 ; #0450 ; INTERPRET EXISTING PROGRAM )0451 ; STARTS SCAN OF PROGRAM BUFFER 0452 ; 0453 IEP: LXI H,PBUFF /0454 SHLD IPTR ;SET POINTER 80455 SHLD SCANB ; AND SCAN BEGINNING 80456 CALL TXTCK ;CK FOR CHARS TO SKIP 0457 RET 0458 ; 60459 INMAX: CALL NMCTL ;E = NUMBER CONTROL 0460 MOV A,E /0461 CPI 73 ;LIMIT TO 72 0462 JM INMX2 0463 MVI A,72 0464 MOV E,A 80465 INMX2: LXI H,CHMAX ; SET INPUT CHAR MAX 0466 MOV M,E 0467 RET 0468 ; 80469 ; CHAR TO BINARY CONVERSION FOR CONTROL ARGUMENTS ;0470 ; NUMBER CONTROL - FINDS 1 OR 2 DIGIT NUMBER OR NAME @0471 ; OF VARIABLE IN NEXT WORD. NEGATIVE VALUES SET TO ZERO. /0472 ; ENTER: HLSAV = EXPRESSION ADDRESS 50473 ; RETURNS: E = BINARY VERSION OF THE NUMBER 60474 ; A = 0DH IF ALREADY AT END OF LINE +0475 ; HLSAV = BR CHAR ADDR 0476 ; 30477 NMCTL: LHLD HLSAV ;EXPRESSION ADDR ,0478 CALL GETCH ;GET CHAR *0479 CPI 0DH ; IF CR 10480 RZ ; THEN RETURN 10481 CALL GETWD ;GET NEXT WORD 60482 DCX H ;BACK UP TO BR CHAR 00483 SHLD HLSAV ;SAVE POINTER 10484 LXI H,WORD ; IN 'WORD' 10485 CALL LETTER ;IF NOT LETTER ;0486 JNZ CVNUM ; THEN CONVERT A NUMBER :0487 MOV B,M ; ELSE SAVE CHAR IN B .0488 CALL VARMCH ;LOOK IT UP 10489 CPI 1 ;IF END MARKER 30490 CZ BADFRM ; THEN COMPLAIN 00491 RZ ; AND RETURN 70492 INX H ;ELSE POINT AT VALUE 50493 MOV E,M ; PUT VALUE IN E .0494 JMP CVNUM+3 ; AND QUIT 20495 CVNUM: CALL GETNM ;CONVERT NUMBER 30496 MOV A,E ; GET VALUE 0497 ORA A 60498 RP ;RETURN IF POSITIVE 60499 MVI E,0 ; ELSE SET TO ZERO 0500 RET 0501 ; 0502 ; JUMP TO LABEL NAME ,0503 ; ENTER: HLSAV = EXPRESSION FIELD '0504 ; RETURNS: HL RESET OR MESSAGE 0505 ; 30506 JOP: LHLD HLSAV ;ADDR EXPRESSION 20507 CALL GETCH ;GET FIRST CHAR (0508 CPI '*' ;IF * 40509 JZ JOP2 ; THEN MOVE WORD 0510 MVI A,'*' .0511 STA WORD ;ELSE ADD * 40512 LXI D,WORD+1 ; THEN MOVE WORD 0513 LHLD HLSAV 0514 CALL WDTFR 00515 JMP JOP2+3 ;AND CONTINUE 10516 JOP2: CALL GETWD ;GET NEXT WORD 80517 LHLD SCANB ; START OF SCAN AREA /0518 CALL LOOKL ;LOOK FOR IT 60519 CPI 1 ;IF LABEL NOT FOUND 30520 CZ NTFND ; THEN COMPLAIN 00521 RZ ; AND RETURN 0522 INX H 50523 SHLD IPTR ;NEW SCAN POSITION 00524 RET ;RESTART SCAN 0525 ; 0526 ; 40527 NTFND: LXI H,WORD ; SHOW THE LABEL 0528 CALL DSPLY 0529 LXI H,BLMSG 0530 CALL ERROR 0531 RET 0532 ; 70533 UOP: CALL SAVRET ;SAVE RETURN POINTER 0534 JMP JOP 0535 ; *0536 ; SET A BLOCK OF LENGTH C TO CHAR B 0537 ; 50538 BLKSET: MOV M,B ; STORE ONE CHAR -0539 INX H ;BUMP ADDR 10540 MOV A,C ; DECR COUNT 0541 SUI 1 ;0542 MOV C,A ; IF COUNT NOT ZERO 80543 JNZ BLKSET ; THEN STORE ANOTHER 0544 RET 0545 ; 0546 ; BLANK THE INPUT BUFFER 0547 ; 40548 BLKBF: LHLD APTR ;DE=TOP OF BUFFER 0549 XCHG 70550 LXI H,PBUFF ;HL=BOTTOM OF BUFFER 0551 MVI B,' ' 0552 BLKB2: MOV M,B 0553 INX H 0554 CALL ADRCMP 0555 JNZ BLKB2 0556 RET 0557 ; .0558 ; ADDRESS COMPARISON - COMPARES HL + DE 60559 ; RETURNS: ZERO AND SIGN FLAGS SET AS THOUGH 70560 ; A CONTAINED HL AND DE WAS COMPARED 0561 ; CALLED BY BLKBF 0562 ; /0563 ADRCMP: MOV A,H ; GET H -0564 CMP D ;COMPARE D 80565 RM ;IF D > H THEN RETURN <0566 RNZ ;IF D NOT = H THEN RETURN /0567 MOV A,L ; GET L -0568 CMP E ;COMPARE E 00569 RET ; AND RETURN 0570 ; *0571 ; CHARACTER TO BINARY CONVERSION (0572 ; GET A DECIMAL NUMBER-- UP TO 99 <0573 ; ENTER: HL= CHAR ADDR OF ONE OR TWO DIGIT NUMBER &0574 ; RETURNS: BINARY NUMBER IN E .0575 ; IF INPUT NOT NUMERIC, THEN E = 0 0576 ; 80577 GETNM: MVI E,0 ; INIT. OUTPUT VALUE 50578 INX H ;LOOK AT NEXT CHAR 10579 CALL BRCHAR ;IF BREAK CHAR 70580 JZ SDIG ; THEN SINGLE DIGIT 0581 CPI '+' 0582 JZ SDIG 0583 CPI '-' 0584 JZ SDIG 00585 DCX H ;ELSE BACK UP 50586 MOV A,M ; GET FIRST CHAR /0587 CPI '0' ;LIMIT RANGE 10588 RM ; TO NUMERALS 0589 CPI '9'+1 0590 RP 50591 SUI '0' ;REMOVE ASCII BIAS /0592 ADD A ;MULT. BY 10 10593 MOV E,A ; E=A*2 )0594 ADD A ; A*4 )0595 ADD A ; A*8 .0596 ADD E ; A+E=A*10 10597 MOV E,A ; SAVE IT +0598 INX H ;HL=HL+1 60599 UNITS: MOV A,M ; GET SECOND CHAR /0600 CPI '0' ;LIMIT RANGE 10601 RM ; TO NUMERALS 0602 CPI '9'+1 0603 RP 50604 SUI '0' ;REMOVE ASCII BIAS 10605 ADD E ;ADD NEW DIGIT 00606 MOV E,A ; TO E 0607 RET 30608 SDIG: DCX H ;BACK UP POINTER :0609 JMP UNITS ;CONVERT UNITS POSITION 0610 ; *0611 ; BINARY TO CHARACTER CONVERSION 60612 ; PUT BINARY NUMBER IN DECIMAL CHARS -99 TO +99 '0613 ; ENTER: BINARY NUMBER IN E (0614 ; HL = CHARACTER AREA 70615 ; RETURNS: HL = ADDR OF 0DH AFTER RIGHT DIGIT 0616 ; 20617 PUTNM: MVI C,0 ; INITIALIZE C ;0618 MOV A,E ; GET BINARY NUMBER 00619 ORA A ; IF NEGATIVE :0620 CM NEG ; THEN SHOW MINUS SIGN +0621 CPI 10 ;IF < 10 40622 JM FRMCH ; THEN FORM CHAR 30623 SUI 10 ; ELSE SUBTR 10 50624 MOV E,A ; SAVE IN E 60625 MOV A,C ; INCR TENS COUNT 0626 ADI 1 0627 MOV C,A .0628 JMP PUTNM+2 ; AND LOOP 50629 FRMCH: MOV A,C ; GET TENS COUNT 20630 ADI '0' ;ADD ASCII BIAS 00631 CPI '0' ;IF CHAR IS 0 50632 JZ FRMU ; THEN FORM UNITS 50633 MOV M,A ; STORE THE CHAR 20634 INX H ;BUMP CHAR ADDR 70635 FRMU: MOV A,E ; GET THE UNITS 20636 ADI '0' ;ADD ASCII BIAS 50637 MOV M,A ; STORE THE CHAR 00638 INX H ;BUMP POINTER 00639 MVI A,0DH ; STORE EOL 0640 MOV M,A 0641 RET 0642 ; 60643 NEG: MVI A,'-' ; STORE MINUS SIGN 0644 MOV M,A 50645 INX H ;BUMP CHAR ADDRESS 90646 XRA A ; MAKE BINARY POSITIVE 0647 SUB E 30648 MOV E,A ; SAVE IN E 0649 RET 0650 ; 40651 ; LOOK FOR *LABEL OR $NAME OF STRING VARIABLE 0652 ; (LOOKL OR LOOKS) 80653 ; ENTER: 'WORD'=LABEL TO BE FOUND, HL=SCAN ADDR 20654 ; RETURNS: HL = ADDR OF BLANK AFTER LABEL 20655 ; IF LABEL NOT FOUND THEN A = 01 0656 ; 90657 LOOKS: XRA A ;SET TEMP FOR NO SKIPS 0658 STA TEMP 0659 JMP LOOK 90660 LOOKL: ORA H ;SET TEMP ON FOR SKIPS 0661 STA TEMP 60662 CALL SKLN ;SKIP ANY LINE NOS. -0663 LOOK: CALL GETCH ;NEXT CHAR /0664 CPI 1 ;IF DATA END 10665 RZ ; THEN RETURN (0666 CPI '*' ;IF * :0667 JZ CHK ; THEN CHECK THE LABEL (0668 CPI '$' ;IF $ <0669 JZ CHK ; THEN CHECK STRING NAME 80670 CALL CNTLN ;ELSE GO TO NEXT LINE 0671 INX H -0672 LDA TEMP ;IF TEMP=0 0673 ORA A 30674 JZ LOOK ; THEN NO SKIPS 50675 JMP LOOK-3 ;ELSE SKIP LN NOS. 00676 CHK: SHLD HLSAV ;SAVE POINTER 30677 CALL CNTWD ;C = WORD LENGTH 0678 MOV A,C 50679 CPI 13 ;LIMIT TO 12 CHARS 0680 JM MVLAB 0681 MVI C,12 40682 MVLAB: LHLD HLSAV ;RETRIEVE POINTER 10683 LXI D,LABSAV ; DESTIN ADDR 60684 CALL BLKTFR ;MOV A,BSAV=LABEL 70685 XCHG ;HL:DESTIN BR CHAR+1 50686 DCX H ; DESTIN BR CHAR 70687 MVI A,0DH ; REPLACE WITH 0DH 0688 MOV M,A 0689 LXI H,LABSAV 10690 LXI D,WORD ; WORD ADDR 00691 CALL CMPR ;COMPARE THEM 70692 ORA A ; LOOK AT A REGISTER =0693 JNZ LFND ;IF MATCH THEN LABEL FOUND 90694 LHLD HLSAV ;ELSE RETRIEVE POINTER .0695 CALL CNTWD ;SKIP LABEL 20696 JMP LOOK ; AND CONTINUE 40697 LFND: LHLD HLSAV ;RETRIEVE POINTER .0698 CALL CNTWD ;SKIP LABEL 00699 RET ; AND RETURN 0700 ; 0701 ; COMPARE STRINGS X AND Y 40702 ; ENTER: HL= X ITEM ADDR, DE= Y ITEM ADDR /0703 ; BOTH ITEMS TERMINATE IN 0DH %0704 ; RETURNS: A=0 FOR NO MATCH, ,0705 ; HL AND DE AT 0DH ADDRESS 0706 ; 10707 CMPR: MOV A,M ; GET X CHAR 30708 CPI 0DH ; IF END OF LINE 80709 JZ XEND ; THEN END OF X ITEM :0710 MOV C,A ; SAVE X CHAR IN C /0711 INX H ;ADDR Y ITEM 0712 XCHG 10713 MOV A,M ; GET Y CHAR 30714 CPI 0DH ; IF END OF LINE 80715 JZ YENDB ; THEN END OF Y ITEM 50716 CMP C ;IF A(Y) NOT= C(X) 10717 JNZ NOMCH ;THEN NO MATCH 40718 INX H ;ADDR NEXT X ITEM 0719 XCHG .0720 JMP CMPR ;START OVER /0721 XEND: XCHG ;ADDR Y ITEM 10722 MOV A,M ; GET Y CHAR 30723 CPI 0DH ; IF END OF LINE 60724 JZ MCH ; THEN MATCH FOUND 20725 CALL CNTWD ;ADDR Y BR CHAR *0726 XCHG ;SET DE -0727 XRA A ; NOMATCH 0728 RET 20729 NOMCH: CALL CNTWD ;ADDR Y BR CHAR ,0730 YENDB: XCHG ; SET DE 20731 CALL CNTWD ;ADDR X BR CHAR -0732 XRA A ; NO MATCH 0733 RET /0734 MCH: XCHG ;SET DE & HL *0735 ORA H ; MATCH 0736 RET 0737 ; -0738 ; GET CHARACTER-- SKIPS LEADING BLANKS "0739 ; ENTER: HL=SOURCE ADDR 20740 ; RETURNS: HL=NEXT NON-BLANK ADDR, A=CHAR 0741 ; 40742 GETCH: MOV A,M ; GET CHARACTER 00743 CPI 20H ;IF NOT BLANK 10744 RNZ ; THEN RETURN 80745 INX H ; ELSE GET NEXT CHAR 0746 JMP GETCH 0747 ; >0748 ; GET LAST CHAR - SCANS BACKWARD, SKIPS BLANKS AND CR'S $0749 ; ENTER: HL = STRING ADDR 60750 ; RETURNS: HL = LAST NON-BLANK CHAR, A = CHAR 0751 ; 40752 GETLCH: MOV A,M ; GET CHARACTER 00753 CPI 20H ;IF NOT BLANK 10754 RNZ ; THEN RETURN 60755 DCX H ;ELSE GET NEXT CHAR 0756 JMP GETLCH 0757 ; 00758 ; GET WORD -- UP TO FIRST BREAK CHARACTER *0759 ; IGNORES LEADING BLANKS "0760 ; ENTER: HL=SOURCE ADDR .0761 ; RETURNS: 'WORD'=SOURCE STRING + 0DH 20762 ; HL= BR CHAR+1 ADDR, B= BR CHAR -0763 ; DE= 'WORD' ADDR AFTER 0DH 60764 ; C = NO OF CHARS MOVED INCL BR CHAR 0765 ; 90766 GETWD: CALL GETCH ;IGNORE LEADING BLANKS 10767 LXI D,WORD ; DESTIN ADDR +0768 CALL WDTFR ;MOVE IT 0769 RET 0770 ; 0771 ; COUNT WORD "0772 ; ENTER: HL=SOURCE ADDR #0773 ; RETURNS: HL=BR CHAR ADDR 50774 ; A,B=BR CHAR, C=COUNT INCL BR CHAR 0775 ; -0776 CNTWD: MVI C,1 ; COUNT=1 10777 CALL BRCHAR ;IF CHAR=BREAK 20778 RZ ; C=CHAR COUNT 00779 MOV A,C ; GET COUNT )0780 ADI 1 ;C=C+1 20781 MOV C,A ; STORE IT +0782 INX H ;HL=NEXT -0783 JMP CNTWD+2 ;NEXT CHAR 0784 ; 0785 ; WORD TRANSFER 10786 ; MOVES STRING FROM HL TO DE + 0DH ADDED 40787 ; ENTER: HL= SOURCE ADDR, DE= DESTIN ADDR 10788 ; RETURNS: HL= SOURCE ADDR AFTER BR CHAR -0789 ; DE= DESTIN ADDR AFTER 0DH 0790 ; B= BR CHAR 50791 ; C= NO OF CHARS MOVED INCL BR CHAR 0792 ; 00793 WDTFR: MVI C,1 ; INIT COUNT 10794 CALL BRCHAR ;IF BREAK CHAR 80795 JZ MVBR ; THEN END OF SOURCE 30796 INX H ;HL= DESTIN ADDR 0797 XCHG 50798 MOV M,B ; MOVE CHARACTER 10799 MOV A,C ; INCR COUNT 0800 ADI 1 0801 MOV C,A 80802 INX H ;HL= NEXT SOURCE ADDR 0803 XCHG 0804 JMP WDTFR+2 ;0805 MVBR: INX H ;HL= DESTIN BR CHAR ADDR 0806 XCHG 70807 MVI A,0DH ; REPLACE WITH 0DH 0808 MOV M,A =0809 INX H ;HL= SOURCE BR CHAR ADDR+1 0810 XCHG 40811 XRA A ; SET RETURN FLAG 0812 RET 0813 ; #0814 ; GET CONTROL WORD IN 'WORD' )0815 ; REPLACES FINAL Y OR N WITH 0DH $0816 ; ENTER: HL = SOURCE ADDR 0817 ; 10818 GETCTL: LXI D,WORD ; DESTIN ADDR -0819 CALL WDTFR ;MOVE WORD 00820 MOV A,C ; GET COUNT 60821 CPI 3 ;IF < 3 CHARS MOVED 10822 RM ; THEN RETURN 00823 MOV H,D ; ADDR WORD 0824 MOV L,E /0825 DCX H ;AVOID COLON 0826 DCX H 10827 CALL GETLCH ;GET LAST CHAR (0828 CPI 'Y' ;IF Y 40829 JZ YNOUT ; THEN REMOVE IT ,0830 CPI 'N' ;IF NOT N 10831 RNZ ; THEN RETURN 50832 YNOUT: MVI A,0DH ; REPLACE Y OR N 10833 MOV M,A ; WITH 0DH 0834 RET 0835 ; -0836 ; SAVE OP CODE THROUGH COLON IN LASTOP 0837 ; 0838 SAVOP: MVI B,':' 80839 CALL INDX ;COUNT CHARS TO COLON 00840 LHLD LLSAV ;ADDR OP CODE 0841 LXI D,LASTOP 40842 CALL BLKTFR ;MOVE CHAR STRING 0843 RET 0844 ; 0845 ; COUNT LINE "0846 ; ENTER: HL=SOURCE ADDR /0847 ; RETURNS: C=CHAR COUNT INCL 0DH OR 01 ,0848 ; HL=BREAK POS., A=BR CHAR 0849 ; -0850 CNTLN: MVI C,1 ; COUNT=1 40851 MOV A,M ; GET CHARACTER +0852 CPI 0DH ; IF 0DH 30853 RZ ; C=CHAR COUNT )0854 CPI 1 ;IF 01 20855 RZ ; C=CHAR COUNT 00856 MOV A,C ; GET COUNT )0857 ADI 1 ;C=C+1 20858 MOV C,A ; STORE IT +0859 INX H ;HL=NEXT -0860 JMP CNTLN+2 ;NEXT CHAR bb~bbbbfbfjbbbbbbbbbbBbbbbbbBbBBBBB0861 ; /0862 ; BACKUP-- DECREMENTS HL BY VALUE OF C-1 +0863 ; ENTER: HL START VALUE, C=COUNT 0864 ; RETURNS: NEW HL VALUE 0865 ; 00866 BACKUP: MOV A,C ; GET COUNT .0867 CPI 1 ;IF COUNT=1 10868 RZ ; THEN RETURN )0869 SUI 1 ;C=C-1 10870 MOV C,A ; STORE C +0871 DCX H ;HL=HL-1 0872 JMP BACKUP 0873 ; 0874 ; BREAK CHARACTER SEARCH 0875 ; ENTER: HL=CHAR ADDR $0876 ; RETURNS: A, B = CHARACTER /0877 ; IF BR CHAR THEN Z FLAG TRUE 0878 ; /0879 BRCHAR: MOV A,M ; GET CHAR 20880 MOV B,A ; AND SAVE IT 50881 CPI ' ' ;CHECK FOR VARIOUS 40882 RZ ;BREAK CHARACTERS 20883 CPI 0DH ; END OF LINE 0884 RZ 0885 CPI ',' 0886 RZ 0887 CPI ';' 0888 RZ 0889 CPI ':' 0890 RZ 0891 CPI '.' 0892 RZ 0893 CPI '?' 0894 RZ /0895 CPI 21H ;EXCLAMATION 0896 RZ 00897 CPI '"' ;DOUBLE QUOTE 0898 RZ ,0899 CPI '(' ;L PARENS 0900 RZ ,0901 CPI ')' ;R PARENS 0902 RZ .0903 CPI 27H ;APOSTROPHE 0904 RZ /0905 CPI 1 ;END OF LIST 50906 RET ;BR CHAR NOT FOUND 0907 ; 50908 ; INDEX - FIND CHAR POSITION OF MATCHED STRING =0909 ; ENTER: HLSAV = STRING ADDR, HLLSAVE = SUBSTR ADDR ;0910 ; RETURNS: C = CHAR POS OF MATCH, IF NOMATCH, C=0 >0911 ; HLSAV = STRING ADDR OF FIRST MATCHED CHAR 90912 ; EPTR = ADDR OF NEXT CHAR AFTER MATCH 0913 ; 0914 INDEX: XRA A 50915 STA SCNT ;INIT STRING COUNT /0916 INDE2: LHLD HLSAV ;ADDR STRING 40917 XCHG ;DE = STRING ADDR 20918 LHLD HLLSAV ;ADDR SUBSTRING :0919 MOV B,M ;FIRST SUBSTR CHAR IN B /0920 INX H ;ADDR STRING 0921 XCHG 70922 CALL INDX ;LOOK FOR FIRST CHAR 0923 MOV A,C 10924 ORA A ; IF NOT FOUND 10925 RZ ; THEN RETURN 70926 SHLD HLSAV ; ELSE SAVE POINTER 80927 LDA SCNT ;GET OLD STRING COUNT 10928 ADD C ;ADD NEW COUNT -0929 STA SCNT ; IN SCNT /0930 LHLD HLLSAV ;ADDR SUBSTR 60931 CALL CNTLN ;COUNT SUBSTR CHARS 60932 MOV A,C ; REDUCE COUNT TO 10933 SUI 1 ; ALPHA CHARS 0934 MOV C,A 90935 LXI D,WORD ; MOVE SAME NUMBER OF 70936 LHLD HLSAV ; CHARS FROM STRING /0937 CALL BLKTFR ; TO 'WORD' 70938 SHLD EPTR ;SAVE NEXT CHAR ADDR 60939 XCHG ;ADDR END OF 'WORD' 90940 MVI A,0DH ; TERMINATE WITH 0DH 0941 MOV M,A /0942 LHLD HLLSAV ;ADDR SUBSTR 40943 XCHG ;DE = SUBSTR ADDR <0944 LXI H,WORD ; ADDR PORTION OF STRING 00945 CALL CMPR ;COMPARE THEM -0946 ORA A ; IF FOUND =0947 JNZ SETCNT ; THEN SET POSITION COUNT =0948 LHLD HLSAV ; ELSE GET STRING POINTER -0949 INX H ; BUMP IT -0950 SHLD HLSAV ; SAVE IT 30951 JMP INDE2 ; AND TRY AGAIN ;0952 SETCNT: LXI H,SCNT ; PUT STRING COUNT IN C 0953 MOV C,M 20954 RET ; AND RETURN 0955 ; 80956 ; INDX - FIND CHARACTER POSITION OF SINGLE LETTER /0957 ; ENTER: HL = STRING ADDR, B= CHAR <0958 ; RETURNS: C = CHAR POS OF MATCH, IF NOMATCH, C=0 60959 ; HL = ADDR OF MATCHED CHAR OR EOL 0960 ; 50961 INDX: MVI C,1 ; INIT C REGISTER /0962 MOV A,M ; GET CHAR 30963 CMP B ;IF B-CHAR FOUND 10964 RZ ; THEN RETURN 30965 CPI 0DH ; IF END OF LINE 50966 JZ ZC ; THEN ZERO COUNT -0967 MOV A,C ; ELSE 00968 ADI 1 ; BUMP COUNT 0969 MOV C,A /0970 INX H ; BUMP ADDR 00971 JMP INDX+2 ; GO TO NEXT 00972 ZC: XRA A ; RETURN WITH 10973 MOV C,A ; C = 0 0974 RET 0975 ; 50976 ; SINDX - SPECIAL INDEX FOR POSITION OF $ OR # (0977 ; ENTER: HL = STRING ADDRESS 50978 ; RETURNS: BA = $, #, OR 0DH; C = CHAR POS .0979 ; HL = ADDR OF MATCHED CHAR 0980 ; 50981 SINDX: MVI C,1 ; INIT C REGISTER /0982 MOV A,M ; GET CHAR (0983 CPI '$' ;IF $ 10984 RZ ; THEN RETURN (0985 CPI 043O ;IF # 10986 RZ ; THEN RETURN +0987 CPI 0DH ; IF EOL 10988 RZ ; THEN RETURN +0989 MOV A,C ; ELSE .0990 ADI 1 ;BUMP COUNT 0991 MOV C,A -0992 INX H ;BUMP ADDR .0993 JMP SINDX+2 ;GO TO NEXT 0994 ; 50995 ; LETTER TESTS WHETHER CHARACTER IS UPCASE A-Z &0996 ; ENTER: HL = ADDR OF CHAR ,0997 ; RETURNS: ZERO FLAG TRUE IF IT IS "0998 ; B = CHARACTER 0999 ; /1000 LETTER: MOV A,M ; GET CHAR 01001 MOV B,M ; SAVE IN B /1002 CPI 41H ;CHECK RANGE ,1003 JM NOTL ;TOO LOW? 1004 CPI 5AH -1005 JP NOTL ;TOO HIGH? ;1006 XRA A ; ELSE RESET ZERO FLAG :1007 RET ; AND RETURN IF LETTER 91008 NOTL: ORA H ; RETURN IF NOT LETTER 1009 RET 1010 ; ;1011 ; SETUP GETS CHAR COUNT AND SETS ADDR FOR TEXT MOVES 1012 ; 01013 SETUP: CALL CNTLN ;C=CHAR COUNT 11014 MOV B,C ; SAVE COUNT ,1015 CALL BACKUP ;RESET HL 21016 MOV C,B ; RESET COUNT 1017 RET 1018 ; +1019 ; T OPERATION--DISPLAY 'T' STATEMENT ;1020 ; ENTER: HLSAV= FIRST CHAR OF T EXPRESSION FIELD 1021 ; 41022 TOP: LHLD HLSAV ;RETRIEVE POINTER 51023 SHLD CPTR ;SAVE CHAR POINTER 81024 SHLD LLSAV ;SAVE FIRST CHAR ADDR 71025 LXI H,TSAVE ; DESTIN START ADDR 41026 SHLD DESAV ;SAVE DESTIN ADDR 21027 XCHG ;AND KEEP IN DE 41028 TMORE: LHLD CPTR ;GET CHAR POINTER 31029 CALL SINDX ;LOOK FOR $ OR # .1030 CPI '$' ;IF $ FOUND ;1031 JZ GETXT ; THEN GET LABELED TEXT .1032 CPI 043O ;IF # FOUND 51033 JZ GETNUM ; THEN GET NUMBER :1034 JMP TMOVE ;ELSE MOVE REST OF TEXT /1035 GETXT: CALL INSERT ;INSERT TEXT 71036 CPI 1 ;IF FOUND (A NOT 01) 31037 JNZ TMORE ; THEN CONTINUE ;1038 LXI D,TSAVE ; ELSE DISPLAY THE LINE 1039 LHLD LLSAV 1040 JMP TALL 11041 GETNUM: CALL INSNUM ;INSERT NUMBER 61042 JMP GETXT+3 ; AND SEE IF FOUND /1043 TMOVE: LHLD DESAV ;DESTIN ADDR 1044 XCHG 11045 LHLD CPTR ;ADDRESS INPUT 21046 TALL: CALL SETUP ;C = CHAR COUNT /1047 CALL BLKTFR ;MOVE T-TEXT 01048 MVI A,0DH ; TERMINATE 1049 XCHG 1050 MOV M,A 21051 LXI H,TSAVE ; ADDRESS TEXT 71052 CALL DSPLY ;DISPLAY T STATEMENT 41053 XRA A ; SET RETURN FLAG 1054 RET 1055 ; .1056 ; INSERT NUMERIC VALUE INTO T-STATEMENT (1057 ; ENTER: C = POSITION OF '#' 41058 ; RETURNS: TSAVE CONTAINS ASSEMBLED T-TEXT 41059 ; IF LABEL NOT FOUND, THEN A = 01 1060 ; 81061 INSNUM: MOV A,C ; GET POSITION OF # 51062 SUI 1 ;REDUCE COUNT BY 1 :1063 JZ VBL ;IF 0 THEN GET VARIABLE 1064 MOV C,A /1065 LHLD DESAV ;DESTIN ADDR 1066 XCHG 41067 LHLD CPTR ;GET CHAR POINTER 61068 CALL BLKTFR ;MOVE FRONT OF TEXT 1069 VBL: MOV B,H 1070 MOV C,L 1071 XCHG 71072 SHLD DESAV ;SAVE DESTIN POINTER 71073 MOV H,B ; GET CHAR POINTER 1074 MOV L,C 41075 INX H ;BUMP TO VAR NAME 51076 MOV C,M ; SAVE NAME IN C -1077 INX H ;BUMP ADDR 51078 SHLD CPTR ;SAVE CHAR POINTER 81079 MOV B,C ; PUT VAR NAME IN B 41080 CALL VARMCH ;LOOK UP VAR NAME 91081 CPI 1 ;IF NOT FOUND (A = 01) 11082 RZ ; THEN RETURN 71083 INX H ;ELSE POINT AT VALUE 51084 MOV E,M ; GET VALUE IN E 81085 LXI H,WORD ; PUT DIGITS IN WORD 1086 CALL PUTNM /1087 LHLD DESAV ;DESTIN ADDR 1088 XCHG 51089 LXI H,WORD ; DIGIT CHAR ADDR 41090 CALL SETUP ;C = CHAR COUNT+1 1091 MOV A,C 1092 SUI 1 81093 MOV C,A ; C = CHAR COUNT /1094 CALL BLKTFR ;MOVE DIGITS 1095 XCHG 41096 SHLD DESAV ;SAVE DESTIN ADDR 41097 XRA A ; SET RETURN FLAG 1098 RET 1099 ; -1100 ; INSERT LABELED TEXT INTO T-STATEMENT (1101 ; ENTER: C = POSITION OF '$' 41102 ; RETURNS: TSAVE CONTAINS ASSEMBLED T-TEXT 41103 ; IF LABEL NOT FOUND, THEN A = 01 1104 ; 91105 INSERT: MOV A,C ; GET POSITION COUNT 51106 SUI 1 ;REDUCE COUNT BY 1 <1107 JZ LBL ;IF 0 THEN POINT TO LABEL 1108 MOV C,A /1109 LHLD DESAV ;DESTIN ADDR 1110 XCHG 41111 LHLD CPTR ;GET CHAR POINTER 61112 CALL BLKTFR ;MOVE FRONT OF TEXT <1113 LBL: MOV B,H ; SAVE CHAR POINTER IN BC 1114 MOV C,L 1115 XCHG 71116 SHLD DESAV ;SAVE DESTIN POINTER 71117 MOV H,B ; GET CHAR POINTER 1118 MOV L,C -1119 CALL GETWD ;GET LABEL 01120 DCX H ;ADDR BR CHAR 51121 SHLD CPTR ;SAVE CHAR POINTER 61122 LHLD APTR ;HL = START OF LIST 1123 INX H 81124 CALL LOOKS ;LOOK FOR STRING NAME 91125 CPI 1 ;IF NOT FOUND (A = 01) 11126 RZ ; THEN RETURN 51127 CALL GETA ; ELSE GET A-TEXT 1128 RET 1129 ; /1130 ; GET A-TEXT POINTED TO BY MATCHED LABEL 31131 ; ENTER: HL = BLANK AFTER MATCHED LABEL +1132 ; DESAV = DESTIN ADDRESS 01133 ; RETURNS: A-TEXT MOVED TO DESTINATION 01134 ; DESAV = NEXT DESTIN ADDRESS 1135 ; 51136 GETA: INX H ;ADDR FIRST A-CHAR 71137 MOV B,H ; BC = A-TEXT ADDR 1138 MOV C,L /1139 LHLD DESAV ;DESTIN ADDR 1140 XCHG 71141 MOV H,B ; HL = A-TEXT ADDR 1142 MOV L,C 21143 CALL SETUP ;C = CHAR COUNT 61144 MOV A,C ; REDUCE COUNT TO 91145 SUI 1 ; EXCLUDE MOVE OF 0DH 1146 MOV C,A /1147 CALL BLKTFR ;MOVE A-TEXT 1148 XCHG 71149 SHLD DESAV ;SAVE DESTIN POINTER 41150 XRA A ; SET RETURN FLAG 1151 RET 1152 ; #1153 ; A OPERATION-- ACCEPT INPUT -1154 ; ENTER: HLSAV = ADDR AFTER COLON #1155 ; RETURNS: INPUT IN EBUFF <1156 ; 'CTL Z' ALLOWS SINGLE STATEMENT EXECUTION OR QUIT 1157 ; 31158 AOP: LHLD HLSAV ;ADDR EXPRESSION 21159 CALL GETCH ;GET FIRST CHAR ,1160 CPI '$' ;IF NOT $ 51161 JNZ NIN ; THEN LOOK FOR # 61162 LXI D,LABSAV ; ELSE ADDR DESTIN 41163 CALL WDTFR ; SAVE THE LABEL 11164 CALL ENTR ;GET THE ENTRY .1165 CALL ASTORE ; STORE IT /1166 RET ; THEN EXIT ,1167 NIN: CPI 043O ;IF NOT # 51168 JNZ CENT ; THEN CALL ENTRY 61169 INX H ;ELSE ADDR VARIABLE 31170 MOV A,M ; GET THE NAME /1171 STA VARSAV ;AND SAVE IT 11172 CALL ENTR ;GET THE ENTRY 31173 CALL CKNUM ;REQUIRE NUMERIC 61174 CALL NSTORE ; STORE THE NUMBER -1175 RET ;THEN EXIT 1176 CENT: CALL ENTR 1177 RET 1178 ; 91179 ENTR: CALL KEYIN ;GET ONE LINE IN EBUFF 61180 LXI H,EBUFF ;IF ENTRY NOT CTL Z 1181 MOV A,M 1182 CPI 1AH /1183 RNZ ;THEN RETURN 51184 INX H ;ELSE BUMP POINTER ,1185 MOV A,M ;GET CHAR )1186 CPI 0DH ;IF CR 21187 JZ RSTRT ; THEN RESTART 41188 CALL OPS ;ELSE DO IMMED OP ;1189 JMP ENTR ; AND ACCEPT MORE INPUT 1190 ; 41191 CKNUM: CPI '0' ;CHECK FOR NUMBER +1192 JM NERR ;TOO LOW 1193 CPI '9'+1 21194 RM ;MUST BE NUMBER 01195 NERR: LXI H,NMSG ;OUT OF RANGE 01196 CALL ERROR ;SEND MESSAGE -1197 CALL ENTR ;TRY AGAIN 1198 JMP CKNUM 1199 ; :1200 ; A ITEM STORE - STORAGE OF LABELED TEXT FROM ENTRY :1201 ; FROM TOP OF INPUT BUFFER AREA AND SETS POINTER 1202 ; 11203 ASTORE: LXI H,EBUFF ; SOURCE ADDR 21204 CALL CNTLN ;C = CHAR COUNT 61205 MOV B,C ; DUPL COUNT IN B /1206 LHLD APTR ;LAST A-ADDR :1207 CALL DECA ;BACK UP DESTIN ADDRESS 81208 MOV A,C ; IF CHAR COUNT = 0 1209 ORA A 11210 RZ ; THEN RETURN 11211 LXI H,EBUFF ; SOURCE ADDR -1212 CALL BLKTFR ;MOVE TEXT 01213 LXI H,LABSAV ; ADDR LABEL 21214 CALL CNTLN ;C = CHAR COUNT 61215 MOV B,C ; DUPL COUNT IN B 11216 LHLD APTR ;GET A-POINTER 01217 CALL DECA ;BACK UP ADDR 81218 MOV A,C ; IF CHAR COUNT = 0 1219 ORA A 11220 RZ ; THEN RETURN 11221 LXI H,LABSAV ; SOURCE ADDR 21222 CALL BLKTFR ;MOVE THE LABEL 21223 MOV L,E ; ADDR A-TEXT 1224 MOV H,D 41225 DCX H ;BACK UP ONE CHAR /1226 MVI A,' ' ; AND SET 41227 MOV M,A ; BLANK THERE 1228 RET 1229 ; +1230 ; DECREMENT ADDRESS FOR TEXT STORAGE 81231 ; ENTER: HL = LAST (LOWEST) ADDRESS USED (01) :1232 ; B & C = CHAR COUNT IN WORD TO BE MOVED 51233 ; RETURNS:DE = DESTIN ADDR, C = CHAR COUNT 11234 ; APTR POINTS AT STOP(01) BELOW LIST 1235 ; 51236 DECA: MOV E,L ;DESTIN ADDR IN DE 1237 MOV D,H 01238 DCX H ;DECR POINTER 41239 MOV A,M ; GET CHARACTER 81240 CPI 1 ;IF 01 (END OF SPACE) ;1241 JZ STOVF ; THEN STORAGE OVERFLOW 41242 MOV A,B ; DECR COUNT 1243 SUI 1 1244 MOV B,A 21245 JNZ DECA ;BACK UP AGAIN? 21246 SHLD APTR ;SAVE A-POINTER ,1247 MVI M,1 ;SET STOP 1248 RET 1249 ; :1250 STOVF: LXI H,NRMSG ; COMPLAIN OF OVERFLOW 1251 CALL ERROR 81252 MVI C,0 ; SET CHAR COUNT = 0 1253 RET 1254 ; =1255 ; NUMBER STORAGE - STORAGE OF NUMERIC VALUE FROM ENTRY =1256 ; AS VALUE OF VARIABLE NAME IN A-STATEMENT 1257 ; 11258 NSTORE: LXI H,EBUFF ; SOURCE ADDR 11259 CALL GETCH ;ADDR 1ST CHAR 21260 CALL GETNM ;GET THE NUMBER 71261 LXI H,VARSAV ; GET THE NAME IN B 1262 MOV B,M .1263 CALL VARMCH ;LOOK IT UP 11264 CPI 1 ;IF END MARKER 11265 CZ BADFRM ;THEN COMPLAIN 01266 RZ ; AND RETURN 71267 INX H ; ELSE BUMP TO NEXT 1268 MOV M,E 1269 RET  ; C=CHAR COUNT 00856 MOV A,C ; GET COUNT )0857 ADI 1 ;C=C+1 20858 MOV C,A ; STORE IT +0859 INX H ;HL=NEXT -0860 JMP CNTLN+2 ;NEXT CHAR bb~bbbbfbfjbbbbbbbbbbBbbbbbbBbBBBBB1270 ; 11271 ; M OPERATION - MOVING WINDOW STRING MATCH 11272 ; COMPARE ITEMS IN LIST WITH LAST INPUT 91273 ; M-ITEMS HAVE MULTIPLE BLANKS REDUCED TO ONE 31274 ; INPUT HAS BLANK ADDED AT EACH END AND -1275 ; MULTIPLE BLANKS REDUCED TO ONE. =1276 ; ENTER: HLSAV = ADDR AFTER LAST COLON, INPUT IN EBUFF =1277 ; RETURNS: YNSW = 0 IF MATCH NOT FOUND WITH LAST ENTRY 1278 ; /1279 MC: LXI H,MBRCH ;SET BR CHAR 81280 MVI M,'^' ; TO CARET (SHIFT N) 1281 JMP MOP1 81282 MOP: LXI H,MBRCH ;SET BR CHAR TO COMMA 1283 MVI M,',' 91284 MOP1: LHLD HLSAV ;ADDR EXPRESSION FIELD 21285 SHLD MPTR ;INIT M-POINTER 21286 NEXTM: CALL MMOV ;MSAVE = M-ITEM /1287 LHLD MPTR ;ADDR M-ITEM 1288 SHLD HLSAV :1289 CALL SQUEZ ;REDUCE MULTIPLE BLANKS 1290 LXI H,EBUFF 71291 SHLD HLSAV ;HLSAV = STRING ADDR :1292 CALL PAD ;ADD BLANKS AT EACH END :1293 CALL SQUEZ ;REDUCE MULTIPLE BLANKS 41294 LXI H,EBUFF ; PUT EBUFF ADDR .1295 SHLD HLSAV ; IN HLSAV 41296 LXI H,MSAVE ; PUT MSAVE ADDR .1297 SHLD HLLSAV ; IN HLLSAV 31298 CALL INDEX ;LOOK FOR M-ITEM 1299 MOV A,C 21300 ORA A ; IF ITEM FOUND 91301 CNZ SWY ; THEN SET SWITCH YES 01302 RNZ ; AND RETURN 61303 LHLD MPTR ;RETRIEVE M-POINTER 01304 DCX H ;ADDR BR CHAR 51305 MOV A,M ; IF END OF LINE 1306 CPI 0DH /1307 JZ MDONE ; THEN QUIT 21308 INX H ;ADDR NEXT CHAR 51309 MOV A,M ; IF END OF LINE 1310 CPI 0DH /1311 JZ MDONE ; THEN QUIT 51312 JMP NEXTM ;ELSE MORE M-ITEMS 11313 MDONE: CALL SWN ;SET SWITCH NO 1314 RET 1315 ; 61316 SWY: ORA H ; SET YN SWITCH YES 1317 STA YNSW 1318 RET 1319 ; 51320 SWN: XRA A ; SET YN SWITCH NO 1321 STA YNSW 1322 RET 1323 ; %1324 ; M-MOVE: MOVE M-ITEM TO MSAVE <1325 ; ITEMS ARE SEPARATED BY COMMA OR TERMINATED BY 0DH )1326 ; ENTER: MPTR = M-ITEM ADDRESS 01327 ; RETURNS: HL & MPTR = NEXT M-ITEM ADDR 1328 ; B = BR CHAR 1329 ; 11330 MMOV: LHLD MPTR ;GET M-POINTER 11331 LXI D,MSAVE ; DESTIN ADDR 51332 MMOV2: CALL MBR ;IF BR CHAR OR EOL 81333 JZ SMOV ; THEN STOP THE MOVE 1334 INX H 41335 XCHG ;HL = DESTIN ADDR 01336 MOV M,B ; MOVE CHAR 1337 INX H 91338 XCHG ;HL = NEXT SOURCE ADDR 71339 JMP MMOV2 ;CHECK THE NEXT CHAR 1340 SMOV: INX H <1341 XCHG ;HL = DESTIN BR CHAR ADDR 71342 MVI A,0DH ; PUT AN 0DH THERE 1343 MOV M,A 1344 INX H 91345 XCHG ;HL = NEXT M-ITEM ADDR 21346 SHLD MPTR ;SAVE M-POINTER 1347 RET 1348 ; #1349 ; M-BREAK CHAR BETWEEN ITEMS #1350 ; ENTER: HL = CHAR ADDR =1351 ; RETURNS: A,B = CHAR. IF BR CHAR THEN Z FLAG TRUE 1352 ; /1353 MBR: MOV A,M ; GET CHAR .1354 MOV B,A ; SAVE IT +1355 CPI 0DH ; IF EOL 11356 RZ ; THEN RETURN 71357 LDA MBRCH ;GET CURRENT BR CHAR 1358 CMP B 1359 RET 1360 ; 11361 ; PAD ADDS A BLANK TO EACH END OF A STRING *1362 ; ENTER: HLSAV = STRING ADDRESS 1363 ; 1364 PAD: LXI H,WORD ;1365 MVI A,' ' ; SET BLANK AT FRONT OF 1366 MOV M,A 41367 INX H ;DE = DESTIN ADDR 1368 XCHG 31369 LHLD HLSAV ;GET SOURCE ADDR 21370 CALL CNTLN ;C = CHAR COUNT 31371 LHLD HLSAV ;GET SOURCE ADDR -1372 CALL BLKTFR ;MOVE TEXT 51373 XCHG ;ADDR NEW TEXT END 01374 DCX H ;SET BLANK AT .1375 MVI A,' ' ; END OF 41376 MOV M,A ; TEMP STRING +1377 INX H ;SET EOL 1378 MVI A,0DH 1379 MOV M,A 31380 LHLD HLSAV ;MOVE NEW STRING 11381 XCHG ; TO ORIGINAL 01382 LXI H,WORD ; LOCATION 1383 CALL CNTLN 1384 LXI H,WORD 1385 CALL BLKTFR 1386 RET 1387 ; 81388 ; SQUEZ REDUCES MULTIPLE BLANKS TO A SINGLE BLANK *1389 ; ENTER: HLSAV = STRING ADDRESS 1390 ; /1391 SQUEZ: LHLD HLSAV ;ADDR STRING 01392 SHLD HLLSAV ;SAVE POINTER /1393 MOV A,M ; GET CHAR +1394 CKEOL: CPI 0DH ; IF EOL 11395 RZ ; THEN RETURN ,1396 CPI ' ' ;IF BLANK :1397 JZ CKNC ; THEN CHECK NEXT CHAR 21398 INX H ;ELSE BUMP ADDR 21399 JMP SQUEZ+3 ; AND CONTINUE 31400 CKNC: INX H ;IF NEXT CHAR IS 21401 CKNC1: MOV A,M ; NOT BLANK 71402 CPI ' ' ; THEN CHECK IF EOL 1403 JNZ CKEOL 51404 SHLD HLLSAV ;ELSE SAVE ADDRESS 41405 CALL SHIFT ; REMOVE A BLANK 61406 LHLD HLLSAV ; RETRIEVE ADDRESS 21407 JMP CKNC1 ; AND CONTINUE 1408 ; 81409 ; SHIFT STRING CHARS LEFT WITH LOSS OF FIRST CHAR '1410 ; ENTER: HL = ADDR OF STRING $1411 ; RETURNS: HL = ADDR OF 0DH 1412 ; 21413 SHIFT: INX H ;ADDR NEXT CHAR 21414 MOV B,M ; GET IT IN B +1415 DCX H ;MOVE IT 1416 MOV M,B 1417 MOV A,M 21418 CPI 0DH ; IF IT WAS EOL 11419 RZ ; THEN RETURN 71420 INX H ; ELSE MOVE ANOTHER 1421 JMP SHIFT 1422 ; 51423 ; C OPERATION: COMPUTE WITH TEXT OF STATEMENT 91424 ; LIMITED TO: X = NN (NN = INTEGER -99 TO +99) 41425 ; OR X = X + NN OR X = X - NN 31426 ; OR X = X + X OR X = X - X 71427 ; WHERE X = SINGLE LETTER VARIABLE NAME A-Z =1428 ; FIRST LETTER ONLY OF LONGER NAME GETS USED 51429 ; ENTER: HLSAV = ADDR OF EXPRESSION FIELD 1430 ; 91431 COP: LHLD HLSAV ;ADDR EXPRESSION FIELD 91432 MVI B,'=' ; LOOK FOR EQUAL SIGN 1433 CALL INDX 1434 MOV A,C 31435 ORA A ; IF NOT PRESENT 31436 JZ EXMSG ; THEN COMPLAIN 01437 INX H ;BUMP POINTER 01438 CALL GETCH ;GET THE CHAR 51439 CPI '-' ;IF NOT MINUS SIGN 81440 JNZ CGVAL ; THEN GET THE VALUE 41441 SHLD HLLSAV ;SAVE THE POINTER 1442 XRA A 01443 STA TEMP ;SET TEMP = 0 41444 LHLD HLLSAV ;RETRIEVE POINTER 21445 JMP SUBV ; AND SUBTRACT 11446 CGVAL: CALL GVALUE ;GET THE VALUE -1447 LXI H,TEMP ; SAVE IT 1448 MOV M,E 91449 LHLD CPTR ;RETRIEVE CHAR POINTER 01450 INX H ;BUMP POINTER ,1451 CALL GETCH ;GET CHAR 31452 CPI 0DH ; IF END OF LINE 71453 JZ AVAL ; THEN ASSIGN VALUE ,1454 CPI '-' ;IF MINUS 91455 JZ SUBV ; THEN SUBTRACT VALUE +1456 CPI '+' ;IF PLUS 41457 JZ ADDV ; THEN ADD VALUE 21458 CALL GVALUE ;ELSE GET VALUE 01459 JMP AVAL ;ASSIGN VALUE 01460 ADDV: INX H ;BUMP POINTER 11461 CALL GVALUE ;GET THE VALUE 11462 LDA TEMP ;GET OLD VALUE .1463 ADD E ;ADD VALUES +1464 CPI 100 ;IF > 99 31465 JP OVMSG ; THEN COMPLAIN =1466 MOV E,A ; ELSE FORM NEW VALUE 01467 JMP AVAL ;ASSIGN VALUE 01468 SUBV: INX H ;BUMP POINTER 11469 CALL GVALUE ;GET THE VALUE 11470 LDA TEMP ;GET OLD VALUE 31471 SUB E ;SUBTRACT VALUES -1472 CPI 9DH ;IF >= -99 31473 JP AVAL-1 ; THEN CONTINUE +1474 CPI 100 ;IF > 99 31475 JP UNMSG ; THEN COMPLAIN 1476 MOV E,A 1477 AVAL: CALL ASSIGN 1478 RET 1479 ; 51480 EXMSG: CALL TOP ;SHOW THE BAD EXPR 1481 LXI H,EXPMSG 1482 CALL ERROR 1483 RET 1484 ; 51485 OVMSG: MVI E,99 ; SET VALUE TO 99 1486 CALL ASSIGN 11487 CALL TOP ;SHOW THE EXPR 1488 LXI H,OVFMSG 1489 CALL ERROR 1490 RET 1491 ; 61492 UNMSG: MVI E,-99 ; SET VALUE TO -99 1493 CALL ASSIGN 1494 CALL TOP 1495 LXI H,UNFMSG 1496 CALL ERROR 1497 RET 1498 ; 41499 ; GVALUE - GETS VALUE OF CONSTANT OR VARIABLE =1500 ; ENTER: HL = ADDRESS OF CHAR NAMING THE VARIABLE +1501 ; CPTR = ADDRESS OF CHAR 1502 ; RETURNS: E = VALUE 41503 ; CPTR = ADDRESS OF THE CHARACTER 1504 ; ,1505 GVALUE: CALL GETCH ;GET CHAR 31506 MOV E,A ; SAVE IN E -1507 CALL LETTER ;IF LETTER 21508 JZ LTR ; THEN PROCEED 61509 CALL GETNM ;ELSE EXPECT NUMBER 51510 SHLD CPTR ;SAVE CHAR POINTER 1511 RET 51512 LTR: SHLD CPTR ;SAVE CHAR POINTER 51513 CONV: MOV B,M ; SAVE CHAR IN B .1514 CALL VARMCH ;LOOK IT UP 11515 CPI 1 ;IF END MARKER 31516 CZ BADFRM ; THEN COMPLAIN 01517 RZ ; AND RETURN 71518 INX H ;ELSE POINT AT VALUE 61519 MOV E,M ; SAVE VALUE IN E 1520 RET 1521 ; :1522 ; ASSIGN SETS A NEW VALUE TO AN OLD OR NEW VARIABLE 51523 ; ENTER: HLSAV = ADDR OF EXPRESSION FIELD &1524 ; BINARY VALUE IN E 1525 ; 91526 ASSIGN: LHLD HLSAV ;ADDR EXPRESSION FIELD 21527 CALL GETCH ;GET FIRST CHAR 31528 CALL LETTER ;IF NOT A LETTER 31529 JNZ EXMSG ; THEN COMPLAIN 41530 MOV B,M ; GET CHAR IN B .1531 CALL VARMCH ;LOOK IT UP 11532 CPI 1 ;IF END MARKER 31533 CZ BADFRM ; THEN COMPLAIN 01534 RZ ; AND RETURN =1535 INX H ; ELSE BUMP TO VALUE ADDR 1536 MOV M,E 01537 RET ; AND RETURN 1538 ; 1539 ; BASIC INTERPRETATION - 31540 ; IF PROGRAM TEXT IS NOT LEGAL PILOT, THEN 81541 ; AN ALTERNATE INTERPRETER SUCH AS BASIC CAN BE 71542 ; SUPPLIED TO BE TRIED BEFORE PILOT COMPLAINS. 1543 ; 81544 BASIC: ORA H ;DUMMY ILLEGAL RETURN 1545 RET 1546 ; 1547 ; R OPERATION - 01548 ; ENTER: HLSAV = R-STATEMENT ADDRESS 1549 ; 1550 ROP: RET 1551 ; 81552 ; E OPERATION - RETURNS FROM CALL OR ENDS PROGRAM 1553 ; 71554 EOP: LDA LEVEL ;IF RETURN LEVEL = 0 01555 ORA A ; THEN QUIT 1556 JZ RSTRT :1557 CALL RESRET ; ELSE SET RETURN FROM 01558 RET ; PILOT CALL 1559 ; 1560 LOAD: LXI H,PBUFF 1561 CALL INPUT 1562 RET 1563 ; 31564 ; NEW$ DELETES $NAMES BY RESETTING A-POINTER 1565 ; 41566 NEWN: LHLD APTR ;REMOVE STOP CHAR 1567 MVI M,20H .1568 LHLD MEMTP ;ADDR MEMTP 31569 MVI M,1 ;PLACE STOP CHAR 1570 DCX H 91571 SHLD APTR ;STORE MEMTP-1 ADDRESS 1572 RET 1573 ; %1574 ; INITIALIZE NUMERIC VARIABLES !1575 ; SETS A-Z TO ZERO VALUE 1576 ; :1577 INITV: LXI H,NVAR ;ADDR FRONT OF VAR LIST 21578 MVI B,'A' ;START WITH 'A' 1579 MOV A,B 81580 NV: CPI 'Z'+1 ;IF ALPHABET COMPLETE 01581 RZ ;THEN RETURN 71582 MOV M,A ; STORE THE LETTER 01583 INX H ;BUMP ADDRESS 1584 MVI A,0 11585 MOV M,A ; STORE ZERO 41586 INX H ;BUMP THE ADDRESS 41587 MOV A,B ; GET LETTER 91588 ADI 1 ;CHANGE TO NEXT LETTER 01589 MOV B,A ; SAVE IN B 11590 JMP NV ;NEXT VARIABLE 1591 ; %1592 ; SAVE RETURN POINTER IN STACK 51593 ; ENTER: IPTR = START OF NEXT SOURCE LINE ,1594 ; RETURNS: LEVEL BUMPED ONE HIGHER 21595 ; IPTR COPIED AT LEVEL POSITION 1596 ; 51597 SAVRET: LXI H,LEVEL ;GET CURRENT LEVEL 1598 MOV A,M 61599 ADI 1 ;BUMP TO NEXT LEVEL *1600 CPI 8 ;IF < 8 31601 JM SAV2 ; THEN CONTINUE 71602 LXI H,STMSG ;ELSE STACK OVERFLOW 1603 CALL ERROR 1604 RET /1605 SAV2: MOV M,A ; STORE IT -1606 ADD A ;DOUBLE IT 31607 MOV C,A ; SAVE IN C 21608 LHLD IPTR ;PUT IPTR IN DE 1609 XCHG 31610 LXI H,RETSAV ; GET BASE ADDR 1611 MOV A,L 41612 ADD C ;BASE + 2 X LEVEL 91613 MOV L,A ; HL = STACK ADDR 01614 MOV M,D ; SAVE IPTR 1615 ADI 1 ;1616 MOV L,A ; HL = STACK ADDR+1 1617 MOV M,E 1618 RET 1619 ; (1620 ; RESET RETURN POINTER FROM STACK 21621 ; RETURNS: IPTR SET TO LAST SAVED RETURN )1622 ; LEVEL REDUCED BY ONE 1623 ; 41624 RESRET: LDA LEVEL ;GET RETURN LEVEL -1625 ADD A ;DOUBLE IT 31626 MOV C,A ; SAVE IN C 31627 LXI H,RETSAV ; GET BASE ADDR 1628 MOV A,L 41629 ADD C ;BASE + 2 X LEVEL 91630 MOV L,A ; HL = STACK ADDR 91631 MOV D,M ; SAVE POINTER IN DE 1632 ADI 1 ;1633 MOV L,A ; HL = STACK ADDR+1 1634 MOV E,M 1635 XCHG .1636 SHLD IPTR ;RESET IPTR 01637 LXI H,LEVEL ;REDUCE LEVEL 1638 MOV A,M 1639 SUI 1 1640 MOV M,A 1641 RET 1642 ; 31643 ; BLOCK TRANSFER FROM HL TO DE, C CHARACTERS 11644 ; RETURNS: HL AND DE AT LAST CHAR+1 ADDR 1645 ; 01646 BLKTFR: MOV A,C ; GET COUNT 11647 ORA A ; IF COUNT = 0 11648 RZ ; THEN RETURN =1649 MOV B,M ; GET A SOURCE CHARACTER 61650 INX H ;GET NEXT DEST ADDR 1651 XCHG >1652 MOV M,B ; PUT IT IN DEST LOCATION 81653 INX H ;GET NEXT SOURCE ADDR 1654 XCHG 61655 MOV A,C ; DECREMENT COUNT 1656 SUI 1 1657 MOV C,A 81658 JNZ BLKTFR ;IF NONZERO THEN NEXT 1659 RET 1235 ; 51236 DECA: MOV E,L ;DESTIN ADDR IN DE 1237 MOV D,H 01238 DCX H ;DECR POINTER 41239 MOV A,M ; GET CHARACTER 81240 CPI 1 ;IF 01 (END OF SPACE) ;1241 JZ STOVF ; THEN STORAGE OVERFLOW 41242 MOV A,B ; DECR COUNT 1243 SUI 1 1244 MOV B,A 21245 JNZ DECA ;BACK UP AGAIN? 21246 SHLD APTR ;SAVE A-POINTER ,1247 MVI M,1 ;SET STOP 1248 RET 1249 ; :1250 STOVF: LXI H,NRMSG ; COMPLAIN OF OVERFLOW 1251 CALL ERROR 81252 MVI C,0 ; SET CHAR COUNT = 0 1253 RET 1254 ; =1255 ; NUMBER STORAGE - STORAGE OF NUMERIC VALUE FROM ENTRY =1256 ; AS VALUE OF VARIAB1660 ; 1661 ; KEYBOARD INPUT TO EBUFF 71662 ; ENTER: CHMAX= MAXIMUM CHARS ALLOWED IN LINE 41663 ; DEL (SHIFT O) OR RUBOUT CANCELS LAST CHAR %1664 ; CTL/U CANCELS CURRENT LINE .1665 ; USES B FOR CHAR COUNT, C FOR OUTPUT 1666 ; 21667 KEYIN: LXI H,EBUFF ;POINT AT EBUFF 01668 SHLD EPTR ;SAVE POINTER 11669 LXI H,CHMAX ;GET MAX COUNT 1670 MOV B,M 41671 KIN2: LHLD EPTR ;RETRIEVE POINTER 51672 CALL CI ;GET CHAR AND ECHO *1673 CPI 5FH ;IF DEL ;1674 JZ CANC ; THEN CANCEL LAST CHAR -1675 CPI 7FH ;IF RUBOUT ;1676 JZ CANC ; THEN CANCEL LAST CHAR ,1677 CPI 15H ;IF CTL/U 61678 JZ CANL ; THEN CANCEL LINE 41679 CPI 61H ;FORCE UPPER CASE 1680 JM NTR 1681 XRI 20H 21682 NTR: MOV M,A ;STORE THE CHAR 01683 INX H ;INCR POINTER +1684 SHLD EPTR ;SAVE IT )1685 CPI 0DH ;IF CR 51686 JZ KOUT ; THEN STOP ENTRY 81687 DCR B ;ELSE DECR CHAR COUNT 1688 MOV A,B 21689 ORA A ;IF COUNT NOT 0 41690 JNZ KIN2 ; THEN NEXT CHAR 41691 MVI C,0DH ;ELSE END WITH CR 1692 MOV M,C 11693 CALL CO ; AND SEND IT 21694 KOUT: CALL LF ;SEND LINE FEED 01695 RET ; AND RETURN *1696 CANL: MVI C,3CH ;SEND < 1697 CALL CO -1698 CALL CRLF ;SEND CRLF 01699 JMP KEYIN ; START OVER 31700 CANC: MOV A,B ;INCR CHAR COUNT 91701 LXI H,CHMAX ; UNLESS AT BEGINNING 1702 MOV C,M 1703 CMP C 1704 JZ KIN2 1705 INR B 1706 LHLD EPTR 01707 DCX H ;DECR POINTER 1708 SHLD EPTR 1709 JMP KIN2+3 1710 ; 1711 CRLF: MVI C,0DH 1712 CALL CO 1713 LF: MVI C,0AH 1714 CALL CO 1715 RET 1716 ; %1717 ; INPUT PROGRAM TO BUFFER AREA >1718 ; DEL (SHIFT O) CANCELS LAST CHAR, CTL/U CANCELS LINE &1719 ; TERMINATES WITH CTL/Z (1AH) 1720 ; 41721 INPUT: CALL BLKBF ;BLANK THE BUFFER /1722 LXI H,PBUFF ;SET POINTER 51723 INPT1: MOV A,M ;GET EXISTING CHAR 81724 SHLD LLSAV ;SAVE FIRST CHAR ADDR /1725 CPI 1 ;IF END MARK 51726 JZ CHOP ; THEN CHOP ENTRY ,1727 CALL RI ;GET CHAR 01728 CPI ' ' ;IF NOT BLANK 31729 JNZ INPT3+3 ; THEN CONTINUE ;1730 JMP INPT1 ;ELSE SKIP LEADING BLANK 51731 INPT2: MOV A,M ;GET EXISTING CHAR /1732 CPI 1 ;IF END MARK 51733 JZ CHOP ; THEN CHOP ENTRY 11734 INPT3: CALL RI ;GET CHARACTER 01735 CPI 0 ;IGNORE NULLS 1736 JZ INPT3 21737 CPI 7FH ;IGNORE RUBOUTS 1738 JZ INPT3 61739 CPI 1AH ;IF TERM CHAR CTL/Z 71740 JZ INEND ; THEN END OF INPUT ,1741 CPI 15H ;IF CTL/U 81742 JZ KLN ; THEN KILL THE LINE *1743 CPI 5FH ;IF DEL ;1744 JZ CLC ; THEN CANCEL LAST CHAR 71745 MOV M,A ;ELSE STORE THE CHAR 81746 INX H ;AND INCR THE POINTER -1747 CPI 0DH ;IF NOT CR 81748 JNZ INPT2 ; THEN GET NEXT CHAR 01749 CALL LF ;ELSE SEND LF 91750 JMP INPT1 ;AND GET NEXT NEW LINE .1751 INPT4: MOV M,A ;STORE CHAR 01752 INX H ;INCR POINTER 1753 JMP INPT2 41754 CLC: DCX H ;CANCEL LAST CHAR 1755 JMP INPT3 *1756 KLN: MVI C,3CH ;SEND < 1757 CALL CO -1758 CALL CRLF ;SEND CRLF 61759 LHLD LLSAV ;ADDR FRONT OF LINE 1760 JMP INPT3 61761 CHOP: LHLD LLSAV ;ADDR FRONT OF LINE 1762 CALL DSPLY 1763 LXI H,IOVMSG 1764 CALL ERROR 21765 INEND: MVI M,1 ;STORE END MARK 11766 SHLD TOPP ;STORE ADDRESS -1767 CALL CRLF ;SEND CRLF 51768 LXI H,LEVEL ;ZERO RETURN LEVEL 1769 MVI M,0 1770 RET 1771 ; /1772 ; DISPLAY A CHARACTER STRING TO CR OR 01 (1773 ; ENTER: HL = STARTING ADDRESS 31774 ; OUTADR CONTAINS ADDRESS OF CO, LO, OR PO 1775 ; 31776 DSPLY: MOV A,M ;GET A CHARACTER 01777 INX H ;BUMP POINTER +1778 MOV D,H ;SAVE IT 1779 MOV E,L )1780 CPI 1 ;IF 01 11781 RZ ; THEN RETURN 11782 MOV C,A ;PUT CHAR IN C 91783 LHLD OUTADR ;MAKE AN INDIRECT CALL 61784 CALL OVCTR ; TO SEND THE CHAR )1785 CPI 0DH ;IF CR .1786 JZ ENDOL ; THEN EOL 91787 XCHG ;ELSE RETRIEVE POINTER 41788 JMP DSPLY ;AND DISPLAY MORE 21789 ENDOL: MVI C,0AH ;SEND LINE FEED 91790 LHLD OUTADR ;MAKE AN INDIRECT CALL 01791 CALL OVCTR ; TO SEND IT 41792 XCHG ;RETRIEVE POINTER 71793 CALL SKLN ;SKIP ANY LINE NOS. 1794 RET 1795 OVCTR: PCHL 1796 ; 01797 ; OUTPUT PROGRAM IN MEMORY TO 01 END MARK 1798 ; 31799 PRGOUT: LXI H,PBUFF ;PGM START ADDR 51800 CALL DSPLY ;DISPLAY ONE LINE 41801 CPI 1 ;IF NOT END MARK 01802 JNZ PRGOUT+3 ; THEN MORE 1803 RET 1804 ; >1805 DPRG: LXI H,CO ;DISPLAY PROGRAM IN MEMORY 1806 SHLD OUTADR 1807 CALL PRGOUT 1808 RET 1809 ; ;1810 LPRG: LXI H,LO ;LIST PROGRAM IN MEMORY 1811 SHLD OUTADR 1812 CALL PRGOUT 51813 LXI H,CO ;RESET TO CONSOLE 1814 SHLD OUTADR 1815 RET 1816 ; 11817 SPRG: LXI H,PO ;SAVE PROGRAM 1818 SHLD OUTADR 1819 CALL PRGOUT 51820 LXI H,CO ;RESET TO CONSOLE 1821 SHLD OUTADR 1822 RET 1823 ; 1824 ; I/O ROUTINES 31825 ; USE PORT 0 FOR STATUS, PORT 1 FOR DATA 91826 ; STATUS BIT 6 (40H) FOR READ DATA AVAIL (RDA) 81827 ; BIT 7 (80H) FOR TRANSMIT BUFFER EMPTY (TBE) 1828 ; 1829 ; OUTPUT CHAR FROM C /1830 ; LOOKS FOR CTL/Z INPUT FOR PANIC EXIT 1831 ; +1832 CHO: IN 0 ;GET STATUS ,1833 ANI 40H ;IF NO INPUT 01834 JZ CHO1 ; THEN CONTINUE 41835 CALL CI ;ELSE SEE WHAT IT IS )1836 CPI 1AH ;IF CTL/Z 11837 JZ INTR ; THEN INTERRUPT 81838 CHO1: IN 0 ;NOW FOR STANDARD OUTPUT 1839 ANI 80H 1840 JZ CHO1 1841 MOV A,C 1842 OUT 1 1843 RET 1844 ; /1845 INTR: PUSH H ;SAVE REGISTERS 1846 PUSH D 1847 PUSH B 21848 LXI H,INTMSG ;INTERRUPT MESSAGE 1849 CALL ERROR .1850 CALL ENTR ;ALLOW RESTART .1851 POP B ;ELSE CONTINUE 1852 POP D 1853 POP H 1854 RET 1855 ; !1856 ; INPUT CHAR TO A AND ECHO 1857 ; -1858 CHI: IN 0 ;NORMAL INPUT 1859 ANI 40H 1860 JZ CHI 1861 IN 1 1862 ANI 7FH 1863 MOV C,A 1864 CALL CO 1865 RET 1866 ; '1867 ; ERROR - DISPLAYS ERROR MESSAGE +1868 ; ENTER: HL = ADDRESS OF MESSAGE "1869 ; RETURNS: ZERO FLAG SET 1870 ; 1871 ERROR: CALL DSPLY 1872 XRA A 1873 RET 1874 ; 1875 ; ERROR MESSAGES 1876 ; ,1877 BLMSG: DB '- LABEL NOT FOUND',0DH 1878 ; $1879 IOVMSG: DB '/OVERFLOW',0DH 1880 ; #1881 NRMSG: DB '*NO ROOM',0DH 1882 ; .1883 EXPMSG: DB '*ILLEGAL EXPRESSION',0DH 1884 ; '1885 OVFMSG: DB '*VALUE > 99',0DH 1886 ; '1887 UNFMSG: DB '*VALUE < -99',0DH 1888 ; .1889 STMSG: DB '*USE DEPTH EXCEEDED',0DH 1890 ; 51891 NMSG: DB '*NUMERIC RESPONSE REQUIRED',0DH 1892 ; '1893 INTMSG: DB '*INTERRUPTED',0DH 1894 ; 1895 IBUFF: DB 'T:',0DH ,1896 DB 'T:PILOT-8080, 1.1',0DH 1897 ; /1898 DB ':LOAD A NEW PROGRAM?',0DH 1899 ; 1900 DB 'A:',0DH 1901 ; 1902 DB 'M: Y',0DH 1903 ; 1904 DB 'JN:*%',0DH 1905 ; 01906 DB 'T:ENTER PILOT PROGRAM',0DH 1907 ; 61908 DB ':TERMINATE INPUT WITH CTL/Z',0DH 1909 ; 1910 DB 'LOAD:',0DH 1911 ; "1912 DB '*% IEP:',0DH 1913 ; ;1914 ; ORG HERE CAN SET START OF RAM PROGRAM BUFFER SPACE 1915 ; 1916 ORG PBUFB 1917 PBUFF: DB 1 1918 ; 91919 ; SOURCE PROGRAM AND $STRING STORAGE HERE TO MEMTP 1920 END  ; SET VALUE TO -99 1493 CALL ASSIGN 1494 CALL TOP 1495 LXI H,UNFMSG 1496 CALL ERROR 1497 RET 1498 ; 41499 ; GVALUE - GETS VALUE OF CONSTANT OR VARIABLE =1500 ; ENTER: HL = ADDRESS OF CHAR NAMING THE VARIABLE +1501 ; CPTR = ADDRESS OF CHAR 1502 ; RETURNS: E = VALUE 41503 ; CPTR = ADDRESS OF THE CHARACTER 1504 ; ,1505 GVALUE: CALL GETCH ;GET CHAR 31506 MOV E,A ; SAVE IN E -1507 CALL LETTER ;IF LETTER 21508 JZ LTR ; THE,-7ê77ö7ð7( ( 51,**+"<*!,*Z6-7ê77ê7ê7( ( 51,\-͆--020677 PILOT-8080, 1.1 COPYRIGHT (C) 1977,J.A.STARKWEATHER !z8"B*"J***"F*566>H2L*2M*2N*! *"H**B*~ –-#É-ͣ1#"B*+ʹ1̀.21:-ʆ-*B1ʉ--Æ-#""*!S+"**:=2-"**͔1***:=2y.#""*++͊.ͭ.***w1.*******""*2!8ͣ1#~ 2.ͣ1#~ 2.:N*2N*!8ͣ1#̀.^~ \.#̀.^~ \.:N*2N*!8ͣ1#̀.~t.:N*2N*0:~.ɯ:N*#=Ã.:1Yʙ.Nʢ.:S*ʫ.:S*«.ɯ)ʴ.++~(.#F..#~.ɯ***͂2!87!^+~ȸ##.//#/^#Vɯ!+1####~/T 2A ^3M ,4MC $4J /R 5C 5U 0E 5Y 2N 2LOAD 5INMAX /NEW$ 5DP 7PRINT 7SAVE 7IEP /BYE *EDIT *!8"B*"J*.͠/{I/>H_!L*s*"*21 B1+""*!+f2/F..#^/70{*"*21*/>*2++*"*Z1/B1*J*ͣ00#"B*!+O7!776/p#yO0*<*!8 p#00'0|}#Ϳ1g0+g0-g0+~0:0__#~0:0_+[0{0 0 _yOm0y00ʋ0w#{0w#> w>-w#_ɯ2Q*ê02Q*̀.21*0$0ͣ1#:Q*ʪ0ç0""*L1y 0 *"*G+Z6+> w!G++10*"*L1ê0*"*L1~ 1O#~ )1&1#1~ /1L1L1L1~ #21~ +:121+Z1Ϳ1yO#N1Ϳ1n1#pyO#\1#> w#+Z1ybk++:1Yʐ1N> w:=2***S+Z6~ yO#å1yO+ô1~G ,;:.?!"()'ɯ2P**"**$*F#=2y""*:P*2P**$*ͣ1yO+*"*Z6">*> w*$*!+182*"*#""*1!P*N~ O2yO#?2O~$# yO#T2~FAt2Zt2ɴͣ1Aʹ1H*"*"@*"**!T*"(**@*R2$ʢ2#ʳ2ù232T****22å2*(**@*v2Z6> w!T*O7y2O*(**@*Z6DM"(*`i#N#"@*A.#^!+k0*(*!+v2yOZ6"(*y(3O*(**@*Z6DM"(*`iB1+"@**<*#͜0E3#DM*(*`iv2yOZ6"(**"*21$v3G+Z1͎3͹3#Š3#~2R*͎3ͥ3 4͎3k6!*~#~ --Î303:!R87͎3å3!*ͣ1A*<*3y!*Z6!G+ͣ1A*<*3y!G+Z6kb+> w]T+~4xG3"<*6!87!*2170!R*F..#s!O*6^14!O*6,*"*"D*͆4*D*""*4!*""*ͯ44!*""*!*"$*1y|4*D*+~ x4#~ x474́4ɴ2S*ɯ2S**D**ͥ4ʚ4#p#Ì4#> w#"D*~G :O*!+> w#*"*ͣ1*"*Z6+> w#> w*"*!+ͣ1!+Z6*"*"$*~ 4#4#~ 4"$*5*$*4#F+p~ #5*"*==2y}5#21-25"$*2Q**$*f5ͥ5!Q*s*@*#21 y5-f5+U5ͥ5y5#ͥ5:Q*d5_y5#ͥ5:Q*x5d5_52!87c52!$8752!18721_f2ʶ570"@*"@*F..#^*"*21f2}5F..#sɴ:M*->6!86*<*6 *F*6+"<*!^+Ax[w#>w#xG 6!M*~+6!>87wO*B*!,*}oros:M*O!,*}oVo^"B*!M*~wyF#p#yOZ6!*">*!L*F*>**_ʶ6ʶ6ʫ6a6 w#">* ʧ6xu6 q *6< *6k6x!L*Nu6*>*+">*x6 * *0!8~"**57 * 66~57 *66A7'7_#7w# 666w#6+6< *6***6***O7!776" *6!M*6~#T]O*H*s7 f7O7 *H*s7̀.!8O7w7! *"H*t7!*"H*t7! *"H*!*"H*t7! *"H*ù7ù7 7Az !m87͎3ɯ O *> O7- LABEL NOT FOUND /OVERFLOW *NO ROOM *ILLEGAL EXPRESSION *VALUE > 99 *VALUE < -99 *USE DEPTH EXCEEDED *NUMERIC RESPONSE REQUIRED *INTERRUPTED T: T:PILOT-8080, 1.1 :LOAD A NEW PROGRAM? A: M: Y JN:*% T:ENTER PILOT PROGRAM :TERMINATE INPUT WITH CTL/Z LOAD: *% IEP: T: T:TEST PROGRAM FOR PILOT-8080 FUNCTIONS T: T:YOU CAN TRY PILOT CORE INSTRUCTIONS : T: TO PRESENT TEXT : A: TO ACCEPT AN ANSWER : M: TO MATCH ELEMENTS OF AN ANSWER : J: TO JUMP TO A LABELLED PLACE : U: TO USE A SUBROUTINE : E: TO END A SUBROUTINE : C: FOR LIMITED COMPUTATION : R: TO INSERT A REMARK WITHOUT OPERATIONAL EFFECT : :BEGIN BY TYPING ANYTHING, THEN TYPE 'RETURN' : USE 'DELETE' TO ERASE THE LAST LETTER AND : CTL-U TO KILL THE CURRENT LINE A:$WHAT T:YOU TYPED $WHAT. T:$WHAT IS WHAT YOU TYPED T: TYPE RETURN TO CONTINUE A: T: :Y OR N APPENDED TO ANY INSTRUCTION MAKES ITS USE CONDITIONAL : UPON THE LAST ATTEMPTED MATCH :Y: OR N: ALONE ARE SHORTHAND VERSIONS OF TY: AND TN: T: *TESTM T:I WILL LOOK FOR 'ABC', ' DEF', 'GHI ', OR ' JKL ' T:NOTE THE SPACES; THEY ARE IMPORTANT IF THE LETTERS WE ARE T:TRYING TO MATCH ARE NOT AT EITHER END OF A LINE A: M:ABC, DEF,GHI , JKL , TY:MATCH TN:NO MATCH U:*ASK JY:*TESTM J:*TESTC *ASK T:AGAIN A: M: Y E: *TESTC T:TYPE A NUMBER FROM 1 TO 99 T:I USE THE FIRST TWO DIGITS ENTERED A:#A T:ANOTHER NUMBER PLEASE A:#B T:YOUR NUMBERS ARE #A AND #B T:I WILL SUBTRACT THEM C:C=A-B T:#A - #B = #C T: T: TYPE 'NEXT' TO GO ON A: M:NEXT JN:*TESTC T: *TESTPLUS C:A=0 C:B=0 T: TESTS CAN BE CONDITIONAL ON A NUMERIC VALUE > 0 T:A NUMERIC VARIABLE IS APPENDED AS IN 'J(X):*LABEL' T:TYPE 'ABC' OR 'DEF' A: M:ABC CY:A=1 M:DEF CY:B=1 T(A):ABC FOUND T(B):DEF FOUND C:C=A+B J(C):*END T:NO MATCH OF EITHER ABC OR DEF *END T:END OF TEST U:*ASK JY:*TESTPLUS T: :NINE OTHER INSTRUCTIONS ARE AVAILABLE IN THIS SYSTEM: : MC: TO LOOK FOR TEXT WITH COMMAS IN IT. : INMAX: TO LIMIT THE NUMBER OF CHARACTERS ACCEPTED. : NEW$: TO ERASE STORED $TEXT (STRING VARIABLES). : DP: TO DISPLAY THE PROGRAM AT THE CONSOLE. : LOAD: TO LOAD A NEW PROGRAM ($TEXT REMAINS). : SAVE: TO SEND THE PROGRAM TO A STORAGE DEVICE. : PRINT: TO TO SEND THE PROGRAM TO A LISTING DEVICE. : EDIT: TO LEAVE PILOT AND USE AN EDITOR. : BYE: TO LEAVE PILOT AND RETURN TODOS T: T:YOU CAN LOOK FOR TEXT WITH COMMAS IN IT T:A CARET '^' IS USED AS A SEPARATOR FOR MC: *TESTMC T:I WILL LOOK FOR 'ABC,D' OR 'A,BC ' A:$ENTRY MC:ABC,D^A,BC Y:YES, $ENTRY IS OK N:NO, YOU TYPED $ENTRY INSTEAD OF THE ABOVE U:*ASK JY:*TESTMC T: *TESTIN T:INMAX:1 WILL BE USED TO LOOK FOR 'A' T:PRESS ONLY A SINGLE KEY (DO NOT PRESS RETURN). T: ---- --- INMAX:1 A: M:A Y:YOU TYPED 'A' N:THAT WASN'T 'A' T:AGAIN? (Y OR N) A: INMAX:72 M:Y JY:*TESTIN T: *ERRORS T:I WILL SHOW SOME ERROR MESSAGES. AFTER EACH, PRESS RETURN. T:I WILL TRY TO JUMP TO AN UNKNOWN LABEL '*HERE" T:PRESS RETURN A: J:*HERE T: T:A C: INSTRUCTION HAS BAD SYNTAX T:PRESS RETURN A: C:X NOT Y T:THE EXPRESSION FIELD IS DISPLAYED PLUS THE ERROR MESSAGE. T:PRESS RETURN A: T: T:THE VALUE OF X WILL BECOME GREATER THAN 99 T:PRESS RETURN A: C:X=99 C:X=X+10 T:THE STATEMENT CAUSING OVERFLOW IS DISPLAYED T:THE VALUE OF X WAS LEFT AT #X T:A SIMILAR MESSAGE APPEARS WHEN X BECOMES SMALLER THAN -99 T:PRESS RETURN A: T:TYPE 'R' TO REPEAT ERROR MESSAGES INMAX:1 A: INMAX:72 M:R JY:*ERRORS T: T:AN ILLEGAL STATEMENT IS SIMPLY DISPLAYED MW:* T:MW: IS NOT LEGAL IN THIS SYSTEM T: T:YOU CAN OBTAIN IMMEDIATE OPERATION OF ANY INSTRUCTION BY T:PRECEDING IT WITH CTL-Z. FOR EXAMPLE: T: 'CTL-Z DP:' WILL DISPLAY THE CURRENT PROGRAM IN MEMORY T: 'CTL-Z J:*LABEL' WILL JUMP IMMEDIATELY TO *LABEL T:CTL-Z BY ITSELF WILL RETURN PILOT TO ITS STARTUP POINT T: TESTS ARE NOW COMPLETE. A:  1d THIS DISK AINS THE COMPE SOURCE CODE OF 8n PILOT8080 PROGRAMMED BY DR. JOHN A. STARKWEATHER 8x OF THE UNIVERSITY OF CALNIA SAN FRANCISCO UNDER / RACT FROM THE ER HILL NATIAL CENTER = BIOMEDICAL COMMUNICATIS, NATIAL LIBRARY OF MEDICINE,  BETHESDA, MARYL. : THE FILES PLT1 THROUGH PLT5 AIN THE SOURCE CODE IN 6 THE MAT USED BY THE PROCESS TECHNOY SOFTWARE 8 NUMBER E MANY RELATED ASSEMBLERS. THE FILES DO 3 CSTITUTE INDEPENT SEGMENTS BUT ARE BE 0 IY CCATENATED M THE SOURCE A GLE  ASSEMBLY. 6 THE SOURCE CODE ING OTHER DOCUMENTATI HAVE : BEEN PUBLISHED BY PEOPLE'S COMPUTER COMPANY, BOX E, = MENLO PARK, CA 94025 IN DR. DOBB'S JOURNAL OF COMPUTER ) CAHENICS THODTIA, VOLUME TWO. 6 FURTHER INMATI AB PILOT MAY BE OBTAINED FROM ; THE PILOT EXCHANGE, P.O. BOX 354, PALO AL, CA 94301 5 THE "PILOT" AINS A PRELIMINARY ADAPTATI OF :" THIS PROGRAM UNDER NTH STAR DOS. THE FOLLOWING 8, ARKS DEIBE ITS OPERATIE THAT BASIC WILL HAVE ,6 CVERTED COLS BACKSLASHES BELOW)\ 5@ ERRUPT IS PERMED BY UG ROLC INSTEAD OF )J ROLZ AS INDIED IN DR. DOBBS. T THE COMMS $^ : SAVE: EDIT: 4h ARE COMPELY IMPLEMENTED. AS IT STS : 9r JUST REQUESTS CHARACTERS FROM THE DOS CIN RINE 8| WITH A DEVICE NUMBER OF SEVEN. SIMILARLY, : 9 JUST TRANSMITS THE DOS C RINE WITH A DEVICE 2 NUMBER OF SEVEN. THE \ COMM JUST S  ROL THE DOS. / THE \ COMM SS ITS PUT THE DOS . C RINE WITH A DEVICE NUMBER OF E. @ ALL IO OTHER THAN THE ABOVE IS DIRECTED THE CSOLE. ; THE "PILOT" INCLUDES THE STARD PILOT LANGUAGE ; DEMSTRATI PROGRAM ACCOUNTING AB HALF THE ) 9 WHICH WILL BE EXECUTED MATIY YOU REPLY NO 5 THE INITIAL QUESTI AB ING A NEW PROGRAM. > YOU MAY PERM AND SAVE FUNCTIONS BY GIVING CONTROL 7 DOS UG LF SF OPERATIS AT IGIN 38F2H. ; "PILOT" IS SET UP USE MEMY FROM 2A00H 7FFFH.  D`D`7DaDaDaDc Dc@DcQDdDdDd0DduDeDeDeDeDeDeDe%De%DfDfDfDgDgDgDgpDgDhDhDhDhDh DhSDhTDhwDhwDiDiDpDp0Dp0Dp0Dp0DpBDpTDpTDp`DppDppDpDpDpDpDrDsDsDtDt0DtXDvDv1DvIDvPDvRDvuDwDw$Dw(Dw(Dw3Dw3Dw3Dw3Dw