; ; 8 0 8 0 M I L M O N I T O R ; ORG 0 ; L0: MVI A,1 ;IDLE TTY OUT 24Q JMP LA0 ;CONTINUE ELSEWHERE NOP PUSH H ;SAVE H,L RST 010-BRK PT EXEC LXI H,LA023 ;SET TO PRINT BUFFER(PB) MOV M,A ;ACC TO PB JMP L3160 ;CONT ELSEWHERE CALL L357 ;SAVE RST 020 LHLD LA100 ;INDIRECT JUMP TO LOC POINTER PCHL ;BY CONTENT OF LA100,LA101 NOP CALL L357 ; RST 030 LHLD LA102 ;IND. JMP POINTED BY PCHL ;LA102,LA103 NOP CALL L357 ; RST 040 LHLD LA104 PCHL NOP CALL L357 ; RST 050 LHLD LA106 PCHL NOP CALL L357 ; RST 060 LHLD LA110 PCHL NOP CALL L357 ; RST 070 LHLD LA112 PCHL NOP LA0: OUT 26Q ;DISABLE R.C., STOP PROGRAMMER LXI H,LA100 ;SET SP SPHL MVI A,0 ;CLEAR TTY I/O PRG. STA LA010 ;EXCEPTION FLAGS STA LA011 STA LA016 MVI A,'-' ;O/P ------ MVI B,6 CALL L3260 CALL L1355 ;CR/LF L133: CALL L3277 ;I/P NONBLANK, FIRST LETTER JZ L133 ANI 77Q ;MASK MOV C,A ;STORE IN C CALL L3277 ;I/P ALPHABETIC, SECOND LETTER JNC L6070 ANI 77Q ;MASK MOV D,A ;STORE IN D CALL L3277 ;I/P ALHPABETIC, THIRD LETTER JNC L250 ANI 77Q MOV E,A ;STORE IN E CALL L3277 ;I/P ALPHABETIC, FOURTH LETTER JNC L221 CALL L3277 ;I/P NON-ALPHABETIC JC L6070 LXI H,L3321 ;SET H,L TO 4 LET. TABLE 4 LETTER MVI B,13Q ;INSTR COUNT DEC L207: CALL L5166 ;SWEEP 4 LETTER TABLE CONTROLLER INX H ;NO MATCH, GO TO NEXT JNZ L207 ;SET OF BYTES JMP L6070 ;END OF 4 LET TABLE, ERROR L221: LXI H,L4111 ;SET H,L TO BEG OF COMMAND TABLE MVI B,16Q ;SET UP COUNT L226: CALL L270 ;CALL 3 LET MATCH INX H ;IF NO MATCH GO TO NEXT BYTE JNZ L226 ;NOT END OF TABLE, TRY AGAIN MVI B,65Q ;NOT COMMAND, SET COUNT TO 3 LET INST L237: CALL L300 ;CALL 3 LET INST MATCH JNZ L237 ;NOT END, TRY AGAIN JMP L6070 ;END OF TABLE, ERROR L250: LXI H,L4010 ;SET H,L TO 2 LET TABLE MVI B,17Q ;SET UP COUNT MOV E,D ;SHIFT MOV D,C L257: CALL L306 ;CALL 2 LET MATCH JNZ L257 ;NO MATCH, TRY AGAIN JMP L6070 ;END OF TABLE, ERROR L270: CALL L314 ;CALL 3 LET MATCH EXECUTE MOV E,M ;MATCH FOUND, LOAD GIVEN INX H ;JUMP ADDR TO D,E COMMAND MOV D,M XCHG ;INDIRECT JUMP PCHL L300: CALL L314 ;CALL 3 LET MATCH JMP L5143 ;MATCH FOUND, CONT ELSEWHERE L306: CALL L323 ;2 LET MATCH JMP L5175 ;MATCH FOUND, CONT ELSEWHERE L314: CALL L352 ;MASK, INCREMENT H,L CMP C ;THIRD LETTER EQUAL TO TAB? JNZ L343 ;NO, JUMP L323: CALL L352 ;YES, GO TO SECOND LETTER CMP D ;SECOND LETTER EQUAL? JNZ L344 ;NO CALL L352 ;YES, GO TO FIRST LETTER CMP E ;LAST LETTER EQUAL? JNZ L345 ;NO MOV E,M ;YES, MOVE CODE TO E RET L343: INX H L344: INX H L345: INX H INX SP ;SET SP INX SP DCR B ;COUNT INSTR RET L352: MVI A,77Q ; MASK ANA M ; SUBROUTINE INX H RET L357: SHLD LA014 ;SAVE H,L TEMPORARILY XTHL ;EXCH H,L AND TOP OF STACK PUSH PSW ;SAVE REGISTERS PUSH B PUSH D PUSH H LHLD LA014 ;RESTORE H,L RET L373: POP H ; RESTORE POP D ; SUBROUTINE POP B POP PSW XTHL RET LA01: CALL L357 ;SAVE REG I/P TTY LDA LA010 ;TTY I/P? SUBR CPI 0 JNZ L0 MVI C,-9 ;BIT COUNT INR A ;ENABLE R.C. OUT 26Q LA21: IN 0 ;WAIT FOR START PULSE RRC JNC LA21 MVI A,0 ;DISABLE R.C. OUT 26Q LXI H,1040Q ;SET TIME CONSTANT (T.C.) CALL L1117 ;TIMEOUT 4.05 MSEC DAD H ;DOUBLE T.C. LA42: IN 0 ;I/P BIT CMA OUT 24Q ;ECHO RAR ;ROTATE INTO POSITION MOV A,B RAR MOV B,A CALL L1117 ;TIMEOUT 9.1 MSEC INR C ;COUNT BIT JNZ LA42 ;NOT LAST, LOOP MVI A,1 ;IDLE TTY OUT 24Q DAD H ;DOUBLE TC CALL L1117 ;TIMEOUT 18.2 MSEC MOV A,B ;MASK PARITY ANI 177Q STA LA013 ;PUT INTO TEMP STORE CALL L373 ;RESTORE REG LDA LA013 ;TEST FOR TAPE LEADER CPI 0 JZ LA01 CPI 1 ;TEST FOR CTRL A RNZ RST 0 ;IF CTRL A, GO TO BEG OF MONITOR L1117: PUSH H ; TIMING INR H ; LOOP L1121: DCR L JNZ L1121 DCR H JNZ L1121 POP H RET L1133: CALL L357 ;SAVE REG TTY O/P MVI C,-8 ;COUNTER STA LA013 ;MOVE TO I/O BUFFER LDA LA010 ;TTY I/P TEST CPI 0 JNZ L0 OUT 24Q ;START TTY LXI H,1040Q ;SET TC DAD H ;DOUBLE TC LDA LA013 ;RESTORE ACC L1164: CALL L1117 ;TIMEOUT 9.1 MSEC OUT 24Q ;O/P BIT RAR ;ROTATE INR C ;COUNT JNZ L1164 ;CONTINUE OUTPUTTING CALL L1117 ;TIMEOUT 9.1 MSEC MVI A,1 ;IDLE TTY OUT 24Q DAD H ;TIMEOUT 18.2 MSEC CALL L1117 CALL L373 ;RESTORE REG RET L1215: CALL LA01 ; I/P WITH L1220: MOV B,A ; OCTAL TEST ANI 370Q ; INTO B CPI '0' RET L1226: CALL LA01 ; I/P WITH CPI 177Q ; RUBOUT RNZ ; TEST MVI A,'_' ;PRINT _ JMP L1133 L1241: CALL L357 ;SAVE REG I/P BYTE L1244: CALL L1215 ;I/P OCTAL TO MEMORY L1247: JNZ L1244 L1252: MOV A,B ;ROTATE, SAVE IN B RRC RRC ANI 300Q MOV B,A L1260: CALL L1226 ;I/P ASCII WITH RUBOUT TEST JZ L1244 ANI 7 ;MASK, ROTATE, SAVE IN C RLC RLC RLC MOV C,A CALL L1226 ;I/P ASCII WITH RUBOUT TEST JZ L1260 ANI 7 ;MASK, COMBINE ORA B ORA C MOV M,A ;MOVE TO MEMORY CALL L373 ;RESTORE REG RET L1313: PUSH PSW ; O/P BLANK MVI A,' ' CALL L1133 POP PSW RET L1323: CALL L1313 ;O/P BLANK O/P MEMORY L1326: MOV A,M ;O/P FIRST DIGIT BYTE RLC RLC ANI 3 CALL L1350 MOV A,M ;O/P SECOND DIGIT RRC RRC RRC CALL L1346 MOV A,M ;O/P LAST DIGIT L1346: ANI 7 L1350: ORI '0' JMP L1133 L1355: PUSH PSW ; O/P CRLF MVI A,15Q ;CR CALL L1133 MVI A,12Q ;LF CALL L1133 POP PSW RET L1372: PUSH PSW ; O/P /(SLASH) MVI A,'/' CALL L1133 POP PSW RET LB02: LHLD LA000 ;SET TO CLP SET H,L TO CLP LDA LA016 ;TEST FOR PRG. CPI 1 RNZ MOV A,L ;YES, PRG SET TO PRG BUFFER LXI H,LA007 OUT 20Q ;O/P ADDRESS IN 2 ;I/P BYTE MOV M,A ;MOVE TO BUFFER RET LB25: CALL LB02 ;SET H,L TO CLP O/P CLP LXI H,LA001 ;SET TO MS BYTE OF CLP JNZ LB46 ;NOT PRG, JUMP MVI A,120Q ;O/P P (PROGRAMMER) CALL L1133 JMP LB51 LB46: CALL L1323 ;PRINT MS BYTE OF ADDRESS LB51: DCX H JMP L1326 ;PRINT LS BYTE OF ADDRESS LB55: CALL L1355 ; O/P CLP/ CALL LB25 JMP L1372 LB66: CALL LB02 ; O/P MEMORY AT CLP JMP L1323 LB74: LHLD LA000 ; INCREMENT CLP INX H SHLD LA000 JMP LB02 LC06: LHLD LA000 ; DECREMENT CLP DCX H SHLD LA000 JMP LB02 LC20: LHLD LA000 ; COMPARE CLP XCHG ; AND UPPER LIMIT LHLD LA002 MOV A,D CMP H RNZ MOV A,E CMP L RET LC35: CALL LC20 ;COMPARE CLP AND UL RANGE CONTROL JNZ LB74 ;NOT ZERO, INCR CLP RST 0 ;END OF PROGRAM, GO TO BEG LC44: CALL L1355 ; O/P CLP* MVI A,'*' CALL L1133 LC54: CALL L1313 ;O/P BLANK I/P ADDR CALL LA01 ;I/P ASCII TO MEMORY CPI 'P' ;=P? JZ L2210 ;YES, SET PRG FLAG LXI B,L2204 ;NO, SET UP NEXT ADDR-I/P MS BYTE PUSH B CALL L357 ;SAVE REG CALL L1220 ;I/P OCTAL JMP L1247 L2204: DCX H ;I/P BYTE TO MEM-I/P LS BYTE JMP L1241 L2210: MVI A,1 ;SET PROGRAMMER FLAG STA LA016 MOV M,A ;STORE P JMP L2204 ;I/P WORD L2221: LXI H,LA007 ;I/P LOC WHERE PROG I/P LIMITS CALL LC44 ;IS NOW L2227: LXI H,LA005 ;I/P NEW LOC CALL LC44 L2235: CALL L2251 ;O/P CRLF*, I/P NEW CLP LXI H,LA003 ;O/P BL, I/P UPPER L. CALL LC54 JMP L1355 ;O/P CRLF, RET L2251: LXI H,LA001 ;SET H,L TO CLP JMP LC44 ;O/P CRLF*,I/P CLP DPO: CALL L2235 ;I/P UPPER L., O/P CRLF L2262: MVI C,8 ;SET UP COUNT CALL LB55 ;O/P CLP/ CALL LB02 ;SET H,L TO CLP L2272: CALL L1323 ;O/P MEMORY BYTE CALL LC35 ;INCR CLP DCR C ;COUNT JNZ L2272 ;LOOP JMP L2262 ;NEW LINE LDO: CALL L2235 ;I/P CLP, UPPER L., O/P CRLF L2312: CALL LA01 ;I/P ASCII, TEST CPI '/' ;WAIT FOR / JNZ L2312 CALL LB02 ;SET H,L TO CLP L2325: CALL LA01 ;I/P ASCII, TEST CPI 15Q ;FOR CRLF JZ L2312 CALL L1241 ;I/P BYTE TO MEM CALL LC35 ;RANGE CONTROL (END?) JMP L2325 ;LOOP EDT: CALL L2251 ;I/P CLP OCTAL L2351: CALL LB55 ;O/P CLP EDITOR CALL LB02 ;SET H,L TO CLP CALL L2365 ;PROCESS LINE JMP L2351 ;LOOP L2365: CALL LA01 ;I/P ASCII EDITING L2370: CPI 'R' ;R? ROUTINES JZ L0 ;YES, GO TO BEG CPI '*' JZ L2251 ;YES, GO TO I/P CLP ROUTINE CPI '@' JZ L3073 ;YES, GO TO XQT CPI '^' JZ LC06 ;YES, GO TO DECR CLP CPI ' ' JZ L3042 ;YES, PRINT OCTAL BYTE CALL L1220 ;TEST FOR OCTAL RNZ ;NOT OCTAL LXI D,L3037 ;I/P BYTE TO MEM PUSH D CALL L357 JMP L1252 L3037: JMP L3045 L3042: CALL LB66 ;O/P MEM AT CLP L3045: CALL LA01 ;I/P ASCII CPI '_' ;BACK ARROW? JNZ L3063 ;NO, JUMP CALL L1241 ;YES, I/P ANOTHER BYTE JMP L3045 ;LOOP L3063: CPI ' ' JZ LB74 ;YES, INCR CLP AND RET JMP L2370 ;NO, LOOP XQT: L3073: CALL L1355 ;CRLF XQT CALL L2251 ;I/P ADDRESS TO H,L LHLD LA000 PCHL ;INDIRECT JUMP SBP: CALL L3135 ;CLEAR BKPT SET BREAKPOINT LXI H,LA020 ;SET H,L TO BKPT ADDR BUFFER CALL LC44 ;I/P BKPT ADDR TO MEMORY LHLD LA017 ;SAVE PROG BYTE MOV A,M STA LA021 MVI M,317Q ;INSERT RST 010 INTO PROG MVI A,1 ;SET BKPT FLAG STA LA022 RST 0 L3135: LDA LA022 ;TEST FOR BKPT CLEAR BKPT CPI 1 RNZ LHLD LA017 ;LOAD H,L WITH BKPT ADDR LDA LA021 ;MOV PROG BYTE TO ACC MOV M,A ;MOV BACK INTO PROG MVI A,0 ;CLEAR BKPT FLAG STA LA022 RET L3160: PUSH PSW ;SAVE ACC, FLAGS EXECUTE BKPT CALL L1323 ;O/P ACC MOV M,B CALL L1323 ;O/P B MOV M,C CALL L1323 ;O/P C MOV M,D CALL L1323 ;O/P D MOV M,E CALL L1323 ;O/P E POP B ;RESTORE FLAGS, ACC TO B,C POP D ;RESTORE H,L TO D,E MOV M,D CALL L1323 ;O/P H MOV M,E CALL L1323 ;O/P L XCHG CALL L1323 ;O/P MEM MOV A,C ;FLAGS TO ACC CALL L3250 ;O/P CARRY CALL L3244 ;O/P PARITY CALL L3244 ;O/P CY1 (CARRY BETWEEN D3,D4) CALL L3244 ;O/P ZERO MOV A,C CALL L3246 ;O/P SIGN RST 0 L3244: MOV A,C ; SHIFT AROUND RRC ; FLAG BYTE L3246: RRC MOV C,A L3250: ANI 1 CALL L1313 JMP L1346 L3260: CALL L1355 ;CRLF O/P WITH L3263: CALL L1133 ;O/P ASCII COUNT LOOP DCR B ;COUNT RZ JMP L3263 ;LOOP CBP: CALL L3135 ;CLEAR BKPT RST 0 L3277: CALL LA01 ;I/P ASCII I/P NUMERIC CPI ' ' ;BLANK? ALPHABETIC,BLANK PUSH B ;SAVE B,C TEST MOV B,A RLC ;ROTATE MS BIT INTO CARRY RLC MOV A,B POP B ;RESTORE B,C RET L3313: MVI A,77Q ; ERROR,O/P ? CALL L1133 ; AND RESTART RST 0 ; L5143: MOV A,M ;RST? RST TEST FOR CPI 377Q ; LOAD SYMBOLIC JNZ L5174 ;NO, GO TO ARG I/P LXI H,LA024 ;YES, SET H,L TO RST BUFFER CALL L1241 ;I/P MOV A,M ;MASK INTO 377 ORI 307Q MOV E,A JMP L5354 ;CONTINUE IN ARG I/P L5166: CALL L314 ;CALL 3 LETTER MATCH LOAD SYMB. INX H ;LOAD MASKED INSTR ROUTINES (CONT) MOV E,M ;CODE INTO E DCX H ;GO TO FIRST BYTE L5174: DCX H L5175: DCX H DCX H MOV A,M ;MASK, ROTATE, TO GET ARG BITS ANI 300Q RLC RLC INX H ;GO TO SECOND BYTE JZ L5302 ;NO ARG, GO TO INP DATA DCR A ;1 ARG DEST, GO TO I/P JZ L5271 DCR A ;2 ARG, GO TO I/P JZ L5255 L5220: CALL L5371 ;ASSUME 1 ARG SOURCE ANA E ;MASK ARG INTO INSTR BYTE MOV E,A JMP L5274 ;GO TO DATA I/P L5230: INX H ; DEST. SUBSTITUTE CALL L5371 ;I/P ARG MOV B,A ;EXCEPTION TEST MOV A,M ANI 100Q MOV A,B JZ L5246 ORI 1 L5246: RLC ;ROTATE MASK INTO BYTE RLC RLC ANA E MOV E,A DCX H ;SET H,L TO BYTE WITH DATA CODE RET L5255: CALL L5230 ;I/P DEST ARG I/P DEST, L5260: CALL L3277 ;WAIT FOR NON-ALPHABETIC SOURCE ARG JC L5260 JMP L5220 ;I/P SOURCE L5271: CALL L5230 ;I/P DEST I/P DEST ARG L5274: CALL L3277 ;WAIT FOR NON-ALPHABETIC JC L5274 L5302: MOV A,M ;I/P BYTE WITH DATA CODE I/P DATA LXI H,LA023 ;SET H,L TO DATA I/P BUFFER ANI 300Q ;MASK JZ L5354 ;NO DATA JUMP RLC ;1 DATA JUMP JNC L5362 CALL L5335 ;ASSUME 2 DATA BYTES MOV M,D ;I/P MS BYTE CALL LB74 L5326: MOV M,C ;I/P LS BYTE CALL LB74 JMP L6041 ;GO TO NEXT LINE L5335: CALL L1241 ;I/P BYTE TO BUFFER 2 DATA I/P MOV C,M ;MOVE TO C SUBR L5341: CALL L1241 ;I/P BYTE TO D MOV D,M L5345: CALL LB02 ;SET H,L TO CLP MOV M,E ;MOVE INSTR BYTE TO MEM JMP LB74 ;INCR CLP, RET L5354: CALL L5345 ;NO DATA, MOVE INSTR JMP L6041 ;BYTE TO MEM, GO TO NEXT LINE L5362: CALL L5341 ;1 DATA BYTE MOV C,D JMP L5326 L5371: CALL L3277 ;WAIT FOR MATCH ARG JNC L5371 ;ALPHABETIC LETTER PUSH B ;SAVE B,C LXI B,L4065 ;SET TO ARG TABLE CALL L6012 ;SWEEP TABLE TO FIND CODE INX B ;GO TO ARG CODE BYTE LDAX B ;MOVE TO ACC POP B ;RESTORE B,C RET L6012: PUSH D ;SAVE D,E SWEEP ARG MVI E,10 ;SET COUNT TABLE SUBR MOV D,A ;SAVE ACC IN D L6016: LDAX B ;COMPARE BYTES CMP D JNZ L6025 ;NO GOOD, JUMP POP D ;FOUND, RESTORE D,E RET L6025: DCR E JZ L6067 ;END OF TABLE, ERROR INX B ;GO TO NEXT ARG INX B JMP L6016 ;LOOP LOC: CALL L2251 ;LOC PRINT CLP/ L6041: CALL L1355 ;CRLF LXI H,LA000 ;O/P LS BYTE OF CLP AND / CALL L1323 CALL L1372 POP PSW ;RESET STACK JMP L133 ;GO TO BEG OF LOAD SYMBOLIC DLP: CALL LB25 ;O/P CLP JMP L6041 L6067: POP PSW ;RESET STACK ERROR ROUTINE L6070: MVI A,77Q ;O/P CALL L1133 JMP L133 ;GO TO BEG OF LOAD SYMBOLIC DPS: CALL L2235 ;I/P RANGE DPS ROUTINE L6103: SUB A ;CLEAR EXCEPTION FLAG MAIN PROG STA LA011 CALL LB55 ;O/P CLP/ CALL LB66 ;O/P MEM AT CLP CALL L7062 ;MATCH TEST PLUS RST TEST CALL L7310 ;EXCEPTION TEST CALL L1313 ;O/P BLANK MVI B,6 ;SET MNEMONIC FIELD CALL L7010 ;O/P MNEMONIC MVI A,' ' ;FINISH MNEM. FIELD CALL L3263 ;WITH BLANK MVI B,3 ;SET ARG FIELD CALL L7107 ;O/P ARG CALL LC35 ;PRINTING FINISHED? IF NO, INCR CLP LDA LA026 ;DATA BYTE TEST ANA A JZ L6103 PUSH PSW ;SAVE ACC DATA O/P MVI A,' ' ;FINISH ARG FIELD CALL L3263 ;WITH BLANK POP PSW ;RESTORE ACC DCR A ;1,2 DATA BYTE TEST JZ L6217 CALL LB74 ;INCR CLP CALL L1323 ;O/P MEM AT CLP CALL LC06 ;DCR CLP CALL L1326 ;O/P MEM AT CLP CALL LB74 ;INCR CLP L6211: CALL LC35 ;FINISHED? INCR CLP JMP L6103 ;NEW LINE L6217: CALL L1313 ;O/P BLANK CALL L1326 ;O/P MEM AT CLP JMP L6211 ;NEW LINE L6230: LXI D,L4010 ;SET D,E TO BET FOR 2 BYTE TABLE MATCH MVI A,2 ;SET TABLE FLAG (T.F.) TEST L6235: STA LA030 MOV B,A ;SAVE ACC CALL L6333 ;ARG TEST MOV A,B ;RESTORE ACC ADD E ;INCR D,E MOV E,A JNC L6253 INR D L6253: LDAX D ;LOAD CODE INTO ACC CMP C ;COMPARE WITH MEM RZ CALL L6265 ;END OF TABLE? MOV A,B ;LOAD ACC WITH T.F. JMP L6235 ;LOOP L6265: CPI 363Q ;2 LETTER END END OF TABLE TEST JZ L6325 CPI 351Q ;4 LETTER END JZ L6320 CPI 377Q ;3 LETTER END JZ L6313 CPI 343Q ;4 LETTER SECOND HALF JZ L3313 ;ERROR, CODE NOT FOUND INX D RET L6313: INR B ;SET T.F. TO 4 LXI D,L3321 ;D,E TO BEGINNING OF 4 LET TABLE RET L6320: DCR B ;SET T.F. TO 3 LXI D,L4217 ;SET D,E TO BEG OF 3 LET TABLE RET L6325: INR B ;SET T.F. TO 4 INR B LXI D,L3376 ;SET D,E TO SEC HALF OF 4 LET TABLE RET L6333: LDAX D ;1 LET TO ACC ARG TEST RLC ;ARG FLAG RLC ;INTO LA027 ANI 3 STA LA027 JNZ L6350 MOV C,M ;NO ARG, C HOLDS INSTR RET L6350: DCR A ;1 OR 2 ARG JNZ L6361 MOV A,M ;1 ARG DEST ORI 70Q ;MODIFY INSTR MOV C,A RET L6361: DCR A ;2 ARG OR 1 ARG SOURCE JNZ L6372 MOV A,M ;2 ARG; MODIFY INSTR ORI 77Q MOV C,A RET L6372: MOV A,M ;1 ARG SOURCE ORI 7 MOV C,A RET L6377: LDA LA030 ;T.F. TO ACC GO TO 1 LET SUBR L7002: DCX D ;LOOP UNTIL D,E DCR A ;POINT TO 1 LETTER JNZ L7002 RET L7010: CALL L6377 ;GO TO FIRST LETTER PRINT LDA LA030 ;T.F. TO C MNEM. FIELD MOV C,A CALL L7050 ;PRINT FIRST LETTER INX D ;SET CONDITION FOR SECOND LETTER DCR C LDAX D ;GENERATE DATA FLAG ANI 300Q ;AND STORE AT LA026 RLC RLC STA LA026 CALL L7050 ;PRINT SECOND LETTER L7037: DCR C ;END? RZ INX D ;NO, PRINT THE REST CALL L7050 JMP L7037 L7050: LDAX D ;LOAD LET TO ACC PRINT ROUT ANI 77Q ;CONVERT TO ASCII ORI 100Q L7055: CALL L1133 ;O/P DCR B ;FIELD COUNT RET L7062: MOV A,M ;CHECK RST TEST ANI 307Q ;FOR RST CPI 307Q JNZ L6230 ;NO LXI D,L5142 ;YES, SET D,E AND TF MVI A,3 STA LA030 RAR ;SET ARG FLAG STA LA027 RET L7107: LDA LA027 ;TEST FOR ARG PRINT ARG ANA A RZ ;NO DCR A ;1 ARG DEST JZ L7144 DCR A ;2 ARG JZ L7243 L7124: MOV A,M ;ASSUME 1 ARG SOURCE ORI 370Q L7127: PUSH B ;SAVE B,C LXI B,L4066 ;B,C POINT TO BEG OF ARG TABLE CALL L6012 ;SWEEP ARG TABLE DCX B ;LOAD ACC WITH LETTER IN ARG TABLE LDAX B POP B ;RESTORE B,C JMP L7055 ;PRINT CONTENTS OF ACC L7144: MOV A,M ;1 ARG DEST ANI 307Q ;RST? CPI 307Q JNZ L7176 ;NO MVI A,' ' ;YES, FINISH ARG FIELD MVI B,4 ;WITH BLANK CALL L3263 MOV A,M ;INSTR INTO ACC ANI 70Q ;CONVERT TO OCTAL AND LXI H,LA027 ;SEND TO MEM MOV M,A CALL L1326 ;PRINT OCTAL BYTE RET L7176: MOV A,M ;SP TEST ANI 365Q CPI 61Q JZ L7255 ;PRINT SP ANI 361Q ;PSW TEST CPI 361Q JZ L7270 ;PRINT PSW MOV C,M ;EXCEPTION TEST LDA LA011 CPI 367Q JNZ L7230 ;NO EXCEPTION ANA C ;YES, EXCEPT DECR ARG CODE BY 1 MOV C,A L7230: MVI A,70Q ;GENERATE ARG CODE ANA C RRC RRC RRC ORI 370Q JMP L7127 ;GO TO PRINT L7243: CALL L7176 ;DEST 2 ARG PRINT CALL L1313 ;PRINT BLANK DCR B ;FIELD COUNT JMP L7124 ;SOURCE L7255: MVI A,'S' ; PRINT "SP" CALL L1133 MVI A,'P' CALL L1133 RET L7270: MVI A,'P' ; PRINT "PSW" CALL L1133 MVI A,'S' CALL L1133 MVI A,'W' CALL L1133 RET L7310: ADI 305Q ;EXCEPT EXCEPTION TEST JZ L7325 ;SUSPECT INR A JZ L7325 INR A JNZ L7350 ;NO EXCEPT. HALT TEST L7325: MOV A,M ;NO EXCEPT CPI 72Q RZ ANI 10Q ;NO EXCEPT RZ MVI A,367Q ;YES,EXCEPT. STA LA011 ;SET EXECPT. FLAG L7341: LDA LA030 ;INCR D,E TO ADD E ;NEXT INSTR IN TABLE MOV E,A INX D RET L7350: MOV A,M ;HLT TEST CPI 166Q RNZ SUB A ;HLT, SET ARG FLAG STA LA027 ;AND INCR D,E TO NEXT INSTR JMP L7341 ; LB000: CALL L2227 ;FORMAT CPY ROUT LDA LA016 ;PROGRAMMER? CPI 1 JNZ LB051 ;NO LDA LA000 ;YES, LOWER LIMIT TO ACC MOV D,A ;L.L TO D LDA LA002 ;UPPER LIMIT TO ACC SUB D ;UL-LL TO ACC MOV C,A ;(UL-LL) TO C LHLD LA004 ;NEW RANGE TO H,L LB027: MOV A,D ;LL TO ACC OUT 20Q ;DATA TO ACC IN 2 MOV M,A ;DATA TO MEM INX H ;INCR H,L INR D ;LL=LL+1 DCR C ;COUNT MVI A,377Q ;TEST CMP C JZ L0 ;FINISHED JMP LB027 ;REPEAT LB051: LHLD LA004 ;NO PRG, NEW RANGE TO H,L LDA LA000 ;(LL-NR) TO B,C SUB L MOV C,A LDA LA001 SBB H MOV B,A RET LB067: JNC LB104 ;(LL-NR) > 0? MOV A,C ;MOVES UP; TWO'S COMPL OF (LL-NR) CMA MOV C,A MOV A,B CMA MOV B,A INX B JMP LB146 LB104: LXI H,LA000 ;MOVES DOWN MOV A,M ;SUBTRACT (LL-NR) FROM LL SUB C MOV E,A INR L MOV A,M SBB B MOV D,A LHLD LA000 ;COPY DATA LB121: MOV A,M ;TO NEW LOCATION STAX D INX H INX D LDA LA002 CMP L JNZ LB121 MOV A,M STAX D LDA LA003 CMP H JNZ LB121 RET LB146: LXI H,LA002 ;MOVES UP; (LL-NR) PLUS MOV A,M ;UL INTO D,E ADD C MOV E,A INR L MOV A,M ADC B MOV D,A LHLD LA002 ;COPY DATA TO NEW LOC LB163: MOV A,M STAX D DCX H DCX D LDA LA000 CMP L JNZ LB163 MOV A,M STAX D LDA LA001 CMP H JNZ LB163 RET CPY: CALL LB000 ;CPY ROUTINE STARTS HERE CALL LB067 RST 0 ; ; TABLE CONTAINING CODES FOR ; SHLD LHLD STA LDA LXI ; LB217: DB 042Q,052Q,062Q,072Q,071Q ; LB224: LHLD LA000 ;LL INTO H,L CALL LB246 ;CALCULATION RM LHLD LA002 ;UL INTO H,L CALL LB246 ;CALCULATION RP POP H ;MOVE UP STACK JMP LC024 ;CHANGE THE ADDRESS LB246: XCHG ;CALCULATE; SUBTRACT LL, UL LHLD LA023 ;FROM JMP ADDRESS INX H MOV A,M SUB E INX H MOV A,M SBB D RET LB261: LHLD LA012 ;MMM PLUS (UL-LL) END XCHG ;INTO D,E OF PROG? LHLD LA023 ;POINTER INTO H,L MOV A,L ;POINTER-[MMM-(UL-LL)]>0? SUB E MOV A,H SBB D RET TRN: CALL L2221 ;TRN ROUTINE STARTS HERE TRN ROUT CALL LB051 ;UP OR DOWN? JNC LB324 ;MOVES UP MOV A,C ;TWO'S COMPL OF LL-NR CMA MOV C,A MOV A,B CMA MOV B,A INX B SUB A ;MOVES UP FLAG STA LA014 JMP LB331 LB324: MVI A,1 ;MOVES DOWN STA LA014 LB331: CALL LC103 ;CALCULATE MMM + (UL-LL) LB334: SHLD LA023 ;POINTER INTO H,L PUSH B ;SAVE B CALL L6230 ;MATCH ROUT CALL L7310 ;EXCEPTION ROUT POP B LDAX D ;CODE TO LA016 STA LA016 CALL L6377 ;FIRST LETTER SUBR INR E ;SECOND LETTER LDAX D ;DATA BYTE TEST MVI E,300Q ANA E CPI 0 ;NO DATA BYTE JZ LC100 CPI 100Q ;1 DATA BYTE JZ LC077 LDA LA016 ;ASSUME 2 DATA BYTES LXI H,LB217 ;IS IT SHLD,LHLD,STA,LDA,LXI? MVI E,5 LC005: CMP M JZ LC073 ;YES, NO CHANGE INR L DCR E JNZ LC005 CALL LB224 ;OUT OF RANGE? JMP LC073 ;YES, NO CHANGE LC024: LHLD LA023 ;CHANGE INX H LDA LA014 ;MOVES DOWN? ANA A JNZ LC061 MOV A,M ;MOVES UP; ADD(LL-NR) ADD C ;TO ADDR OF JUMP MOV M,A INX H MOV A,M ADC B MOV M,A LC046: INX H SHLD LA023 ;INCREMENTED POINTER TO LA023 CALL LB261 ;END OF PROG? JM LB334 ;NO, NEW LINE RST 0 LC061: MOV A,M ;MOVES DOWN; SUBTRACT SUB C ;(LL-NR) FROM ADDR MOV M,A INX H MOV A,M SBB B MOV M,A JMP LC046 ;NEW LINE LC073: LHLD LA023 ;NO CHANGE INX H LC077: INX H LC100: JMP LC046 LC103: PUSH B ;SAVE B,C LHLD LA002 ;UL-LL XCHG LHLD LA000 MOV A,E SUB L MOV E,A MOV A,D SBB H MOV D,A LHLD LA006 ;MMM PLUS (UL-LL) MOV A,E ADD L MOV L,A MOV A,D ADC H MOV H,A SHLD LA012 LHLD LA006 POP B ;RESTORE B,C RET PRG: CALL L2235 ;I/P LL, UL PRG ROUTINE CALL L1355 ;CRLF MVI A,'%' ;O/P % CALL L1133 CALL LA01 ;I/P LETTER RLC RLC MOV E,A LHLD LA000 ;LL INTO H,L LC166: MOV A,L ;COMPARE ROM WITH MEM OUT 20Q IN 2 CMP M CNZ LC225 ;PROGR IF NOT EQUAL LDA LA002 ;END OF PROGRAM? CMP L JNZ LC221 LDA LA003 CMP H JNZ LC221 CALL LC225 ;YES, PROGR LAST RST 0 LC221: INX H ;NEW BYTE JMP LC166 LC225: MVI B,1 ;PROGR 4 TIMES LONGER CALL LC252 MOV A,B RLC RLC MOV B,A LC236: CALL LC252 DCR B JNZ LC236 MOV A,B ;OUTPUT NULL CHAR CALL L1133 RET LC252: MOV A,M ;PROGRAM UNTIL ROM CMA ;BYTE HOLDS DESIRED OUT 22Q ;DATA; MAX 255 PULSES MVI A,4 OUT 26Q XRA A OUT 26Q MOV C,E LC266: MVI D,350Q LC270: DCR D JNZ LC270 DCR C JNZ LC266 IN 2 CMP M RZ INR B JNZ LC252 CALL LB25 MVI A,77Q CALL L1133 RST 0 ; L3321: DB 003Q,201Q,214Q,014Q,315Q,120Q,025Q,223Q DB 010Q,375Q,030Q,003Q,210Q,007Q,353Q,023Q DB 210Q,214Q,004Q,042Q,014Q,210Q,214Q,004Q DB 052Q,123Q,024Q,201Q,030Q,072Q,114Q,004Q DB 301Q,030Q,072Q,030Q,003Q,210Q,007Q,353Q DB 030Q,024Q,210Q,014Q,343Q L3376: DB 023Q,020Q,210Q DB 014Q,371Q,020Q,003Q,210Q,014Q,351Q L4010: DB 012Q DB 203Q,332Q,012Q,232Q,312Q,012Q,220Q,362Q DB 012Q,215Q,372Q,003Q,203Q,334Q,003Q,232Q DB 314Q,003Q,220Q,364Q,003Q,215Q,374Q,022Q DB 003Q,330Q,022Q,032Q,310Q,022Q,020Q,360Q DB 022Q,015Q,370Q,011Q,116Q,333Q,005Q,011Q DB 373Q,004Q,011Q,363Q L4065: DB 102Q L4066: DB 370Q,103Q,371Q DB 104Q,372Q,105Q,373Q,110Q,374Q,114Q,375Q DB 115Q,376Q,123Q,376Q,120Q,376Q,101Q,377Q L4111: DB 'XQT' DW XQT DB 'LOC' DW LOC DB 'DPO' DW DPO DB 'LDO' DW LDO DB 'DLP' DW DLP DB 'EDT' DW EDT DB 'SBP' DW SBP DB 'CBP' DW CBP DB 'DPS' DW DPS DB 'CPY' DW CPY DB 'TRN' DW TRN DB 'PRG' DW PRG DB 0,0,0 DW 0 DB 0,0,0 DW 0 L4217: DB 003Q,015Q DB 003Q,077Q,215Q,017Q,026Q,177Q,010Q,014Q DB 024Q,166Q,115Q,126Q,011Q,076Q,111Q,016Q DB 022Q,074Q,104Q,003Q,022Q,075Q,301Q,004Q DB 004Q,207Q,301Q,004Q,003Q,217Q,323Q,025Q DB 002Q,227Q,323Q,002Q,002Q,237Q,301Q,016Q DB 001Q,247Q,330Q,022Q,001Q,257Q,317Q,022Q DB 001Q,267Q,303Q,015Q,020Q,277Q,001Q,104Q DB 011Q,306Q,001Q,103Q,011Q,316Q,023Q,125Q DB 011Q,326Q,023Q,102Q,011Q,336Q,001Q,116Q DB 011Q,346Q,030Q,122Q,011Q,356Q,017Q,122Q DB 011Q,366Q,003Q,120Q,011Q,376Q,022Q,014Q DB 003Q,007Q,022Q,022Q,003Q,017Q,022Q,001Q DB 014Q,027Q,022Q,001Q,022Q,037Q,012Q,215Q DB 020Q,303Q,012Q,216Q,003Q,322Q,012Q,216Q DB 032Q,302Q,012Q,220Q,005Q,352Q,012Q,220Q DB 017Q,342Q,003Q,216Q,003Q,324Q,003Q,216Q DB 032Q,304Q,003Q,220Q,005Q,354Q,003Q,220Q DB 017Q,344Q,022Q,005Q,024Q,311Q,022Q,016Q DB 003Q,320Q,022Q,016Q,032Q,300Q,022Q,020Q DB 005Q,350Q,022Q,020Q,017Q,340Q,017Q,125Q DB 024Q,323Q,014Q,204Q,001Q,072Q,120Q,017Q DB 020Q,371Q,023Q,224Q,001Q,062Q,114Q,230Q DB 011Q,071Q,104Q,001Q,104Q,071Q,111Q,016Q DB 030Q,073Q,104Q,003Q,130Q,073Q,003Q,015Q DB 001Q,057Q,023Q,024Q,003Q,067Q,004Q,001Q DB 001Q,047Q,016Q,017Q,020Q,000Q,122Q,023Q DB 024Q L5142: DB 377Q ; ; LA000: DS 1 LA001: DS 1 LA002: DS 1 LA003: DS 1 LA004: DS 1 LA005: DS 1 LA006: DS 1 LA007: DS 1 LA010: DS 1 LA011: DS 1 LA012: DS 1 LA013: DS 1 LA014: DS 2 LA016: DS 1 LA017: DS 1 LA020: DS 1 LA021: DS 1 LA022: DS 1 LA023: DS 1 LA024: DS 2 LA026: DS 1 LA027: DS 1 LA030: DS 50Q LA100: DS 2 LA102: DS 2 LA104: DS 2 LA106: DS 2 LA110: DS 2 LA112: DS 2 END