***************************** * OPERATORS ***************************** L1339: SUI 13H CPI LAST$OPR$JMP-13H JNC SYNTAX$ERR MOV E,A MVI D,0 LXI H,OPR$JMP$LIST DAD D DAD D MOV E,M INX H MOV H,M MOV L,E PCHL OPR$JMP$LIST: DW OPR$00 ; 13 HLT ... DW OPR$01 ; 14 LXI DW OPR$02 ; 15 DAD DW OPR$03 ; 16 POP PUSH DW OPR$04 ; 17 JMP CALL ... DW OPR$05 ; 18 MOV DW OPR$06 ; 19 MVI DW OPR$07 ; 1A IN ACI ... DW OPR$08 ; 1B LDAX STAX DW OPR$09 ; 1C CCD CCI ... DW OPR$10 ; 1D ADC ADD ... DW OPR$11 ; 1E INR DCR DW OPR$12 ; 1F DCX INX DW OPR$13 ; 20 RST DW OPR$14 ; 21 INP OUTP DW OPR$15 ; 22 PCIX SPIX XTIX DW OPR$16 ; 23 PCIY SPIY XTIY DW OPR$17 ; 24 DADC DSBC DW OPR$18 ; 25 LBCD LDED ... DW OPR$19 ; 26 LIXD SIXD DW OPR$20 ; 27 LIYD SIYD DW OPR$21 ; 28 BIT RES SET DW OPR$22 ; 29 DADX DW OPR$23 ; 2A DADY DW OPR$24 ; 2B DJNZ JMPR ... DW OPR$25 ; 2C RALR RARR ... LAST$OPR$JMP: EQU 2CH+1 ***************************** * 13H (op) SINGLE BYTE OPS * DI EI CMA CMC DAA EXX HLT * NOP RAL RAR RET RLC RRC STC * EXAF PCHL SPHL XCHG XTHL ***************************** OPR$00: CALL PUT$COD$01 CALL GET$STR JMP L1413 ***************************** * 14H LXI * LXI rr,nn (op|rr<<4 nn) * LXI X,nn (DD 21 nn) * LXI Y,nn (FD 21 nn) ***************************** OPR$01: CALL G$OPRND$01 CALL OPR$03XY CALL G$OPRND$02A CALL G$OPRND$03A CALL G$OPRND$04A CALL G$COMMA CALL G$ADDRESS JMP L1413 ***************************** * 15H DAD rr (op|rr<<4) ***************************** OPR$02: CALL G$OPRND$04 JMP L1413 ***************************** * 16H POP PUSH rr (op|rr<<4) ***************************** OPR$03: CALL G$OPRND$01 CALL OPR$03XY ;check X/Y CALL G$OPRND$02A CALL G$OPRND$03A CPI 38H ; A register ? JZ OPR$03A ; synonym for PSW ANI 8 ;no, insure double CNZ REG$ERROR OPR$03A: MOV A,C ANI 30H ORA B JMP L1410 OPR$03XY: ; X/Y reg's ? CPI 14H CZ OPR$03X CPI 24H CZ OPR$03Y RET OPR$03X: ;output DD op CALL PUT$COD$DD MVI A,4 ;make memory reg RET OPR$03Y: ;output FD op CALL PUT$COD$FD MVI A,4 ;make memory reg RET ***************************** * 17H LDA STA LHLD SHLD * JMP CALL and conditionals * OPR nn (op nn) ***************************** OPR$04: CALL PUT$COD$01 CALL G$ADDRESS JMP L1413 ***************************** * 18H MOV * MOV r,r' (op|r<<3|r') * MOV r,[X+d] (DD op|r<<3 d) * MOV r,[Y+d] (FD op|r<<3 d) * MOV [X+d],r (DD op|r d) * MOV [Y+d],r (FD op|r d) ***************************** ; STX: CZ REG$ERROR ; don't allow M for r OPR$05: CALL G$OPRND$RXYC CPI 034H ; Indexed ? JZ OPR05A CALL G$OPRND$02A CALL G$OPRND$03A ORA B MOV B,A CALL G$COMMA CALL G$OPRND$RXYC CPI 034H ; Indexed ? JZ OPR05B CALL G$OPRND$02A ORA B JMP L1410 OPR$05A: MOV A,H PUSH H ; Save Disp CALL OPR$03XY CALL G$COMMA CALL G$OPRND$02 ORI 070H ; OPskel CALL PUT$COD$00 POP H MOV A,L JMP L1410 OPR$05B: MOV A,H PUSH H ; Save Disp CALL OPR$03XY MVI A,046H ; OPskel ORA B CALL PUT$COD$00 POP H MOV A,L JMP L1410 ***************************** * 019H MVI B/C/D/E/H/L/A/[X/Y+d] * MVI r,n (op|r<<3 n) * MVI [X+d],n (DD op d n) * MVI [Y+d],n (FD op d n) ***************************** OPR$06: CALL G$OPRND$RXYC CPI 034H ; Indexed ? JZ OPR$06A CALL G$OPRND$02A CALL G$OPRND$03A ORA B OPR$06C: CALL PUT$COD$00 CALL G$COMMA CALL G$OPRND$05 JMP L1413 OPR$06A: MOV A,H CALL OPR$03XY MVI A,036H CALL PUT$COD$00 LDA L0161 ; Displacement JMP OPR$06C ***************************** * 1AH IN ACI ADI ANI CPI * ORI OUT SBI SUI XRI * OPR n (op n) ***************************** OPR$07: CALL PUT$COD$01 CALL G$OPRND$05 JMP L1413 ***************************** * 1BH LDAX STAX * OPER rr (op|rr<<4) rr=BC,DE ***************************** OPR$08: CALL G$OPRND$03 ANI 028H CNZ REG$ERROR MOV A,C ANI 10H ORA B JMP L1410 ***************************** * 1CH CCD CCI IM0 IM1 IM2 IND * INI LDD LDI NEG RLD RRD * CCDR CCIR INDR INIR * LDAI LDAR LDDR LDIR * RETI RETN STAI STAR * OUTD OUTI OUTDR OUTIR * OPER (ED op) ***************************** OPR$09: CALL PUT$COD$ED JMP OPR$00 ***************************** * 1DH ADC ADD ANA CMP ORA SBB SUB XRA * OPR r (op|r) * OPR [X+d] (DD op|6 dd) * OPR [Y+d] (FD op|6 dd) ***************************** OPR$10: CALL G$OPRND$RXYC CPI 034H ; Index reg ? JZ OPR$10A CALL G$OPRND$02A ORA B JMP L1410 OPR$10A: MOV A,H CALL OPR$03XY MVI A,06H ORA B CALL PUT$COD$00 LDA L0161 ; Displacement JMP L1410 ***************************** * 1EH INR DCR * OPR r (op|r<<3) * OPR [X+d] (DD op|30 dd) * OPR [Y+d] (FD op|30 dd) ***************************** OPR$11: CALL G$OPRND$RXYC CPI 034H ; Index reg ? JZ OPR$11A CALL G$OPRND$02A CALL G$OPRND$03A ORA B JMP L1410 OPR$11A: MOV A,H CALL OPR$03XY MVI A,30H ORA B CALL PUT$COD$00 LDA L0161 ; Displacement JMP L1410 ***************************** * 1F DCX INX B/D/H/SP/X/Y ***************************** OPR$12: CALL G$OPRND$01 CALL OPR$03XY CALL G$OPRND$02A CALL G$OPRND$03A CALL G$OPRND$04A JMP L1413 ***************************** * 20H RST p (op|p<<3) ***************************** OPR$13: CALL G$OPRND$03 ORA B JMP L1410 **************************** * 21H INP OUTP r (ED op|r<<3) **************************** OPR$14: CALL PUT$COD$ED CALL G$OPRND$03 CPI 30H CZ REG$ERROR ; don't allow M for r ORA B JMP L1410 ***************************** * 22H PCIX SPIX XTIX (DD op) ***************************** OPR$15: CALL PUT$COD$DD JMP OPR$00 ***************************** * 23H PCIY SPIY XTIY (FD op) ***************************** OPR$16: CALL PUT$COD$FD JMP OPR$00 **************************** * 24H DADC DSBC rr (ED op|rr<<4) **************************** OPR$17: CALL PUT$COD$ED JMP OPR$02 **************************** * 25H LBCD LSPD LDED * SBCD SDED SSPD (ED op nn) **************************** OPR$18: CALL PUT$COD$ED JMP OPR$04 **************************** * 26H LIXD SIXD (DD op nn) **************************** OPR$19: CALL PUT$COD$DD JMP OPR$04 **************************** * 27H LIYD SIYD (FD op nn) **************************** OPR$20: CALL PUT$COD$FD JMP OPR$04 **************************** * 28 BIT RES SET B/C/D/E/H/L/A/M/[X/Y+d] * BIT b,r (CB op|b<<3|r) * BIT b,[X+d] (DD CB d op|b<<3) * BIT b,[Y+d] (FD CB d op|b<<3) **************************** OPR$21: CALL G$OPRND$03 ORA B MOV B,A CALL G$COMMA CALL G$OPRND$RXYC CPI 034H ; Indexed ? JZ OPR$21A ORA B MOV B,A CALL PUT$COD$CB MOV A,B JMP L1410 OPR$21A: MOV A,H CALL OPR$03XY CALL PUT$COD$CB LDA L0161 ; Displacement CALL PUT$COD$HEX MVI A,06H ; Operation ORA B JMP L1410 **************************** * 29H DADX rx (DD op|rx<<4) **************************** OPR$22: CALL PUT$COD$DD CALL G$OPRND$01 CPI 14H JNZ OPR$22A MVI A,4 JMP OPR$22B OPR$22A: MOV C,A CPI 4 CZ REG$ERROR ;H register not allowed MOV A,C CPI 8 CNC VALUE$ERR MOV A,C OPR$22B: CALL G$OPRND$03A ANI 8 CNZ REG$ERROR MOV A,C ANI 30H ORA B JMP L1410 **************************** * 2AH DADY ry (FD op|ry<<4) **************************** OPR$23: CALL PUT$COD$FD CALL G$OPRND$01 CPI 24H JNZ OPR$22A MVI A,4 JMP OPR$22B **************************** * 2BH DJNZ JMPR JRC JRZ JRNC JRNZ * OPR $+e (op e-2) **************************** OPR$24: CALL PUT$COD$01 LHLD LOC$CTR1 INX H CALL L0E2B PUSH H CALL G$OPRND$00 POP B DAD B CALL G$OPRND$01A OPR$24A: MOV A,L JMP L1410 **************************** * 2CH SLAR SRAR SRLR * RALR RARR RLCR RRCR * OPER r (CB op|r) * OPER [X+d] (DD CB dd op) * OPER [Y+d] (FD CB dd op) **************************** OPR$25: CALL G$OPRND$RXYC CPI 034H ; Index reg ? JZ OPR$25A CALL G$OPRND$02A ORA B PUSH PSW CALL PUT$COD$CB POP PSW JMP L1410 OPR$25A: MOV A,H CALL OPR$03XY MVI A,06H ORA B PUSH PSW CALL PUT$COD$CB LDA L0161 ; Displacement CALL PUT$COD$00 POP PSW JMP L1410 **************************** * Line ending routines **************************** L1410: CALL PUT$COD$00 L1413: CALL L15A5 CALL L1594 JMP END$LINE L141C: LDA STR$TYPE CPI 4 CNZ DATA$ERR LDA STRING CPI ',' RZ CPI ';' RZ CPI CR CNZ DATA$ERR RET ***************************** * Return Like G$OPRND$01 for * 8080 Regs ELSE indexed: * Reg A = 34H, B = OPskel * Regs C = D = E = n/a * Regs H = 14/24, L = Disp ***************************** G$OPRND$RXYC: PUSH B CALL GET$STR LDA L0747 CPI '[' JZ G$OPRND$XY CALL L0F17 LHLD L0161 POP B CALL G$OPRND$01A RET G$OPRND$XY: CALL GET$STR ; Initial '[' CALL SCAN$OP CNZ VALUE$ERR PUSH B ; Save X/Y CALL GET$STR CALL L0F17 CALL GET$STR ; Terminal ']' LHLD L0161 CALL G$OPRND$01A POP PSW POP B MOV H,A MVI A,034H RET *************************************** * LOOK FOR OPERAND (1433) *************************************** ; ; GET OPERAND, RETURN WITH LISTED VALUE IN REG H. G$OPRND$00: ;LOOK FOR OPERAND PUSH B CALL GET$STR CALL L0F17 LHLD L0161 ;OPERAND VALUE POP B RET G$OPRND$01: CALL G$OPRND$00 G$OPRND$01A: MOV A,H ORA A JZ G$OPRND$01C CPI 0FFH ; NEGATIVE VALUE JNZ G$OPRND$01B MOV A,L RAL JC G$OPRND$01C G$OPRND$01B: CALL VALUE$ERR ;IF VALUE > 8 BITS, THEN ERROR. G$OPRND$01C: MOV A,L RET G$OPRND$02: CALL G$OPRND$01 G$OPRND$02A: CPI 8 CNC VALUE$ERR ;IF OPERAND > 8 THEN ERROR. ANI 7 RET G$OPRND$03: CALL G$OPRND$02 G$OPRND$03A: RAL RAL RAL ANI 38H ;SHIFT LEFT AND MASK. MOV C,A RET G$OPRND$04: CALL G$OPRND$03 G$OPRND$04A: ANI 8 ;insure its a double CNZ REG$ERROR G$OPRND$04B: MOV A,C ;GET OPERAND CODE ANI 30H ORA B ;MERGE WITH OPERATOR JMP PUT$COD$00 G$OPRND$05: CALL G$OPRND$01 JMP PUT$COD$00 G$ADDRESS: CALL G$OPRND$00 JMP PUT$ADDR G$COMMA: PUSH PSW PUSH B LDA STR$TYPE CPI 4 JNZ COMMA$ERR LDA STRING CPI ',' JZ L1490 COMMA$ERR: MVI A,'C' ;COMMA ERROR. 43H CALL ERR$COD L1490: POP B POP PSW RET *************************************** * AFTER AN OPERATION IS DECODED, IT COMES * TO THIS ROUTINE TO CLOSE OUT THE LINE *************************************** END$LINE: CALL L15A5 LDA STR$TYPE CPI 4 ;IS THIS TYPE OTHER JNZ SYNTAX$ERR LDA STRING CPI CR ;IS THIS A CR. JNZ E$LINE$00 CALL GET$STR ;YES THEN CLOSE LINE. JMP MAIN$01 ;AND RETURN TO MAIN$01. 10B1H E$LINE$00: CPI ';' ; IS THIS A COMMENT? JNZ E$LINE$02 CALL L15A5 E$LINE$01: CALL GET$STR ; RUN OUT COMMENT.0805H LDA STR$TYPE CPI 4 JNZ E$LINE$01 ;DONE? LDA STRING CPI LF JZ MAIN$01 ;YES WE ARE DONE. CPI EOF JZ MAIN$01 CPI '!' JZ MAIN$01 JMP E$LINE$01 E$LINE$02: CPI '!' JZ MAIN$01 CPI EOF JNZ SYNTAX$ERR LXI H,COPY$LEVEL XRA A ORA M JNZ E$COPY JMP E$PASS SYNTAX$ERR: MVI A,'S' ;SYNTAX ERROR. CALL ERR$COD JMP E$LINE$01 SUBDEHL: MOV A,E SUB L MOV L,A MOV A,D SBB H MOV H,A RET ***************************** * END OF COPY ***************************** E$COPY: DCR M ; RESET LEVEL INX H LXI D,SRCFCB ; RESTORE FCB MVI C,12 E$COPY$02: MOV A,M STAX D INX H INX D DCR C JNZ E$COPY$02 CALL RESET$SRC ; RESET FILE E$COPY$04: LXI H,1000H SHLD IBUF$CTR CALL DSK$IN ; REFILL BUFFER LXI H,COPY$EXT LDA SRC$EXT CMP M JNZ E$COPY$04 ; UNTIL EXT = INX H LDA SRC$CR CMP M JNZ E$COPY$04 ; & RECORD = LHLD COPY$CTR SHLD IBUF$CTR ; RESTORE CTR LDA COPY$CHR STA CUR$CHR ; & CHARACTER JMP MAIN$01 *************************************** * END OF PASS *************************************** E$PASS: XRA A STA LINE$NM INR A STA LINE$NM+1 LXI H,PASS$NM MOV A,M INR M ORA A JZ MAIN$00 CALL GET$STR CALL L1641 LXI H,L1691 MVI M,CR LXI H,NXT$FREE$ADDR CALL MSGOUT LHLD SYMTAB$PTR XCHG LHLD SYM$TAB$BASE CALL SUBDEHL PUSH H LHLD CCP$BEGIN XCHG LHLD SYM$TAB$BASE CALL SUBDEHL MOV E,H MVI D,0 POP H CALL L0E36 XCHG CALL L1644 LXI H,L1691 LXI D,E$PASS$01 E$PASS$00: LDAX D ORA A JZ E$PASS$02 MOV M,A INX H INX D JMP E$PASS$00 E$PASS$01: DB 'H use factor',CR,0 E$PASS$02: LXI H,NXT$FREE$ADDR+1 CALL MSGOUT LHLD L1688 SHLD LOC$CTR1 LXI H,LINE$NUM-1 E$PASS$03: INX H MOV A,M CPI ' ' JZ E$PASS$03 CALL MSGOUT JMP CLOSE$00 LINE$NM: DW 0100H LINE$NUM: DB ' input lines read',CR *************************************** * INCREMENT LINE NUMBER *************************************** INC$LINE$NM: LDA PASS$NM ;IF PASS=0 THEN DONT INCR. ORA A JZ INC$LINE$01 LXI H,LINE$NUM+5 INC$LINE$00: MOV A,M ORI '0' INR A MOV M,A CPI ':' ;OVERFLOW? JC INC$LINE$01 ;NO EXIT MVI M,'0' ;YES, RESET DECADE DCX H ;AND INCR NEXT. JMP INC$LINE$00 INC$LINE$01: LXI H,LINE$NM+1 MVI A,1 ADD M DAA MOV M,A DCX H MVI A,0 ADC M DAA MOV M,A RET *************************************** L1594: LHLD LOC$CTR1 SHLD LOC$CTR2 RET ************************************** L159B: LHLD L1686 SHLD SYM$HASH$PTR CALL SYM$05 RET *************************************** L15A5: CALL L159B RZ LXI H,0 SHLD L1686 LDA PASS$NM ORA A JNZ L15CC CALL SYM$18 PUSH PSW ANI 7 CNZ LABLE$ERR POP PSW ORI 1 CALL SYM$17 LHLD LOC$CTR2 CALL PUT$SYM$VAL RET L15CC: CALL SYM$18 ANI 7 CZ PHASE$ERR CALL GET$SYM$VAL XCHG LHLD LOC$CTR2 CALL CMP$LIM CNZ PHASE$ERR RET *************************************** * PUT CODE IN OBJECT & PRN LINES * AND MAINTAIN LOCATION COUNTERS *************************************** PUT$COD$CB: MVI A,0CBH JMP PUT$COD$HEX PUT$COD$ED: MVI A,0EDH JMP PUT$COD$HEX PUT$COD$DD: MVI A,0DDH JMP PUT$COD$HEX PUT$COD$FD: MVI A,0FDH JMP PUT$COD$HEX PUT$COD$HEX: PUSH B CALL PUT$COD$00 POP B RET PUT$COD$00: MOV B,A ;MOVE OBJECT TO B PUT$COD$01: LDA PASS$NM ;GET PASS NUMBER ORA A MOV A,B JZ L1607 ;UPDATE LOCATION ONLY IF PASS 0. PUSH B CALL PUT$OBJ LDA NXT$FREE$ADDR CPI ' ' ;20H LHLD LOC$CTR2 CZ L1644 LDA PRN$LINE$CCTR CPI 10H POP B JNC L1607 MOV A,B CALL L1631 L1607: LHLD LOC$CTR1 INX H SHLD LOC$CTR1 RET *************************************** * PUT ADDRESS IN PRN LINE & OBJ *************************************** PUT$ADDR: PUSH H MOV B,L CALL PUT$COD$01 POP H MOV B,H JMP PUT$COD$01 *************************************** * HEX TO ASCII CONVERSION *************************************** L1619: ADI 30H CPI 3AH RC ADI 7 RET *************************************** * PUT NIBBLE IN PRN LINE *************************************** L1621: CALL L1619 LXI H,PRN$LINE$CCTR MOV E,M MVI D,0 INR M LXI H,PRN$LINE DAD D MOV M,A RET *************************************** * PUT BYTE IN PRN LINE *************************************** L1631: PUSH PSW RAR RAR RAR RAR ANI 0FH CALL L1621 ;PUT UPPER POP PSW ANI 0FH JMP L1621 ;PUT LOWER *************************************** * PUT LOCATION IN PRN LINE *************************************** L1641: LHLD LOC$CTR2 L1644: XCHG LXI H,PRN$LINE$CCTR PUSH H MVI M,1 MOV A,D PUSH D CALL L1631 POP D MOV A,E CALL L1631 POP H INR M RET *************************************** * ERROR ROUTINES *************************************** REG$ERROR: PUSH PSW PUSH B MVI A,'R' ;REGISTER ERROR CALL ERR$COD POP B POP PSW RET VALUE$ERR: PUSH PSW PUSH H MVI A,'V' ;VALUE ERROR CALL ERR$COD POP H POP PSW RET DATA$ERR: PUSH PSW MVI A,'D' ;DATA ERROR JMP L1681 PHASE$ERR: PUSH PSW MVI A,'P' ;PHASE ERROR JMP L1681 LABLE$ERR: PUSH PSW MVI A,'L' ;LABLE ERROR JMP L1681 NOT$IMP$ERR: PUSH PSW MVI A,'N' ;NOT IMPLEMENTED L1681: CALL ERR$COD POP PSW RET L1686: DW 0 L1688: DW 0 PRN$LINE$CCTR: DB 0 SYM$OPTION: DB 0 PRN$LINE: DB 0 NXT$FREE$ADDR: DB 0,0,0,0 L1691: DB 0 L1692: DB 0 DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 IBUFR: ; STACK AND INPUT BUFFER DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0 PRN$BUFR EQU IBUFR+1000H OBJ$BUFR EQU PRN$BUFR+400H SYM$HASH$LST EQU OBJ$BUFR+400H SYM$TABLE EQU SYM$HASH$LST+100H SYM$TAB EQU SYM$TABLE+2