CALL CRLF MVI C,LLAB+12 CALL BLKO SLA4 LXI H,IBUF-5 LINE NUMBER ADDRESS MVI C,4 SLA5 MOV B,M CALL OUT8 OUTPUT LINE NUMBER INX H DCR C JNZ SLA5 CALL BLK1 SLA6 XRA A SET ZERO FLAG MVI H,0 SET SYMBOL VALUE JMP AVAL * GET HERE WHEN TERMINATION CHARACTER IS FOUND. BLANK,COMMA,CR. * CHECK FOR LEADING FIELD SEPARATOR SEND LDA OPRI FETCH OPERAND INDICATOR ORA A SET FLAGS JNZ ERRS SYNTAX ERROR LHLD OPRD LDA GTLT GET GREATER LESS THAN FLAG CPI 3CH IS IT GREATER THAN JNZ SEN0 MOV L,H JMP SEN2 SEN0 CPI 3EH IS IT LESS THAN JNZ SEN1 SEN2 MVI H,0 SET HIGH ORDER 0 SEN1 MOV A,H GET HIGH ORDER BYTE LXI D,TEMP SET ADDRESS ORA A SET FLAGS RET * * GET A NUMERIC VALUE WHICH IS EIGHER HEXADECIMAL OR DECIMAL * ON RETURN CARRY SET INDICATES AN ERROR * NUMS CALL ALPS GET NUMERIC DCX D LDAX D GET LAST CHARACTER LXI B,ABUF SET BUFFER ADDRESS CPI 'H' IS IT HEXADECIMAL JZ NUM2 CPI 'Q' IS IT OCTAL JZ NUM3 CPI 'D' IS IT DECIMAL JNZ ADEC NUMD1 XRA A GET A ZERO STAX D CLEAR D FROM BUFFER NUM1 JMP ADEC NUM2 XRA A GET A ZERO STAX D CLEAR H FROM BUFFER JMP AHEX NUM3 XRA A STAX D JMP AOCT * * PROCESS REGISTER ERROR ERRR MVI A,'R' GET INDICATOR LXI H,0 GET A 0 STA OBUF+18 SET IN OUTPUT BUFFER RET * PROCESS SYNTAX ERROR ERRS MVI A,'S' GET INDICATOR STA OBUF+18 STORE IN OUTPUT BUFFER LXI H,0 GET A ZERO JMP SEN1 * PROCESS UNDEFINED SYMBOL ERROR ERRU MVI A,'U' GET INDICATOR JMP ERRS+2 * PROCESS VALUE ERROR ERRV MVI A,'V' GET INDICATOR JMP ERRR+2 * PROCESS MISSING LABEL ERROR ERRM MVI A,'M' GET INDICATOR STA OBUF+18 STORE IN OUTPUT BUFFER JMP AOU1 * PROCESS ARGUMENT ERROR ERRA MVI A,'A' GET INDICATOR JMP ERRS+2 * PROCESS OPCODE ERROR * STORE 3 BYTES OF ZERO IN OBJECT CODE TO PROVIDE FOR A PATCH ERRO MVI A,'O' GET INDICATOR STA OBUF+18 STORE IN OUTPUT BUFFER LDA PASI FETCH PASS INDICATOR ORA A WHICH PASS RZ RETURN IF PASS 1 MVI C,3 NEED 3 BYTES ERO1 XRA A GET A ZERO CALL ASTO PUT IN LISTING AND MEMORY DCR C JNZ ERO1 RET * PROCESS LABEL ERROR ERRL MVI A,'L' GET INDICATOR JMP ERRO+2 * PROCESS DUPLICATE LABEL ERROR ERRD MVI A,'D' GET ERROR INDICATOR STA OBUF+18 STORE IN OUTPUT BUFFER CALL AOU1 DISPLAY ERROR JMP OPC PROCESS OPCODE * * THIS ROUTINE IS USED TO FORMAT THE ASSEMBLY OUTPUT LISTING * FORMT MVI C,0 LXI H,IBUF LINE ADDRESS MOV A,M GET FIRST CHARACTER CPI '*' COMMENT? RZ MVI B,2 CALL FRSUB FORMAT LINE RC INR B MORE FORMAT CALL FRSUB FORMAT LINE RC MVI D,2 JMP FRSUA * FRSUB MVI D,1 FRSUA MOV A,B ADD D MOV B,A LDA TERMW SUI IBUF81-IBUF1P JZ ADDER ZERO IS RIGHT ON JNC BOVER DCR B JMP ADDER BOVER MOV A,D GET VALUE OF D RAL ADD B MOV B,A ADDER MOV A,B ADI 5 MOV B,A FRSU0 MOV E,D FRSU3 INR C INCREMENT CHRACTER COUNT MOV A,M GET NEXT CHARACTER CPI ' ' RC RETURN IF CR INX H JNZ FRSU0 DCR E JNZ FRSU3 FRSU1 INR C MOV A,M GET NEXT CHARACTER CPI ' ' LOOK FOR NON BLANK RC INX H JZ FRSU1 MOV A,C SUB B RNC DCX H DCX H MVI C,0 MOV M,C SET MOVE STOP MOV C,A MOV A,B CPI 22 JZ FRSU4 LHLD PNTR MOV A,C CMA INR A MOV E,A MVI D,0 DAD D GET NEW POINTER SHLD PNTR FRSU4 MOV L,C MVI H,0FFH MVI C,0 LXI D,IBUF+82 END OF BUFFER ADDRESS DAD D XCHG CALL RMOV FORMAT LINE XCHG FRSU2 INX H MVI M,' ' REPLACE STOP WITH A BLANK MOV A,L CMP E JNZ FRSU2 INX H INX H MOV C,B RET * THIS CODE IS USED TO MATCH ALS8 PROMS * BUT SERVES NO FUNCTION CALL 0EEEFH JNZ 0E102H * TERMINAL WIDTH COMMAND TERM LXI B,ABUF ADDRESS OF PARAMETER CALL ADEC CONVERT VALUE JC WHAT ERROR MOV A,L SUI 1BH CPI 120-1BH MAXIMUM VALUE JNC WHAT VALUE TOO LARGE STA TERMW SET NEW WIDTH JMP EORMS * * * * * * THIS PROGRAM IS AN 8080 SIMULATOR * * NOP EQU 0 NOOP INSTRUCTION VALUE HLTI EQU 118 HALT INSTRUCTION VALUE CONM EQU 11000101B CONDITION CODE MASK SIMU LXI H,NOP GET A NOP SHLD SEXE+1 STORE IN EXECUTION AREA LHLD NPC FETCH PC (NEW) MOV A,M FETCH NEXT INSTRUCTION STA SEXE STORE IN EXECUTION AREA MOV B,A SAVE IN REG B CPI 40H CHECK BITS 7,6 JC D00 BITS 7,6=00 CPI 0C0H JNC D11 BITS 7,6=11 JMP IEXE BITS 7,6=01,10 * * * INCREMENT PC, RESTORE CPU STATUS, EXECUTE INSTRUCTION * AND SAVE CPU STATUS * BYT1 INX H INCREMENT PC SHLD PC SAVE PC (OLD) JMP RSTO RESTORE STATUS AND EXECUTE * * * SIMULATE THOSE INSTRUCTIONS FOR WHICH BITS 7,6=00 * * SOME INSTRUCTIONS CAN BE EXECUTED DIRECTLY WITH NO FURTHER * PROCESSING: NOP,DAD,STAX,LDAX,INX,DCX,INR,DCR,ROTATES, * DAA,CMA,STC,CMC. * D00 ANI 7 LOW 3 BITS JZ BYT1 JUMP IF NOP CPI 3 JC DOS1 CPI 6 JNZ BYT1 EXECUTE DIRECTLY * PROCESS MVI R INSTRUCTION BYT2 INX H INCREMENT PC MOV A,M FETCH IMMEDIATE BYTE STA SEXE+1 STORE IN EXECUTION AREA JMP BYT1 * * DOS1 CPI 2 MOV A,B JZ DOS2 * PROCESS LXI,DAD INSTRUCTIONS. DAD CNA BE EXECUTED DIRECTLY ANI 8 JNZ BYT1 * PROCESS LXI INSTRUCTION AND OTHER 3 BYTE INSTRUCTIONS * THAT CNA BE EXECUTED DIRECTLY BYT3 INX H INCREMENT PC MOV A,M FETCH 2ND BYTE STA SEXE+1 STORE IN EXECUTION AREA INX H INCREMENT PC MOV A,M FETCH 3RD BYTE STA SEXE+2 STORE IN EXECUTION AREA JMP BYT1 EXECUTE INSTRUCTION * PROCESS STAX LDAX,SHLD,LHL,STA,LDA INSTRUCTIONS DOS2 CPI 20H JNC BYT3 SHLD,LHLD,STA,LDA JMP BYT1 STAX,LDAX * * INSTRUCTIONS FOR WHICH BITS 7,6=01,10 * PROCESS THE MOV R1,R2 INSTRUCTIONS AND ACCUMULATOR * GROUP INSTRUCTIONS. ALSO THE HALT INSTRUCTION * IEXE CPI HLTI CHECK FOR HALT JZ HLTA HALT INSTRUCTION JMP BYT1 EXECUTE INSTRUCTION * * HLTA CALL CRLF CALL DNPC DISPLAY PROGRAM COUNTER LXI H,HMES MESSAGE ADDRESS CALL SCRN OUTPUT MESSAGE JMP CTRL * HMES DB 'H','A','L','T' DB 13 * * PROCESS INSTRUCTIONS FOR WHICH BITS 7,6=11 * D11 ANI 7 JZ CRET CONDITIONAL RETURN CPI 2 JZ CJMP CONDITIONAL JUMP JC POP CPI 4 JZ CCAL CONDITIONAL CALL JC MIS1 CPI 6 JZ BYT2 IMMEDIATE ACC. INSTRUCTION JC PUSH * PROCESS RST INSTRUCTION RST XRA A GET A ZERO STA PC+1 CALL ADDRESS (HIGH) MOV A,B FETCH INSTRUCTION ANI 070Q RESTART ADDRESS STA PC CALL ADDRESS (LOW) JMP CAL1 SAVE RETURN ADDRESS CRET CALL SCON CHECK CONDITION JNZ JMP3 DON'T RETURN RET XCHG SAVE PC IN D,E LHLD USP LOAD USERS STACK POINTER CALL ADDR FETCH RETURN ADDRESS INX H INCREMENT SP JMP CAL2 * PROCESS POP,RET,PCHL,SPHL INSTRUCTIONS POP MOV A,B FETCH INSTRUCTION ANI 010Q JZ BYT1 POP INSTRUCTION MOV A,B GET INSTRUCTION CPI 331Q JZ ERR1 ILLEGAL CODE JC RET RET INSTRUCTION CPI 351Q JNZ BYT1 SPHL INSTRUCTION LHLD REGL GET H,L JMP JMP4 * PROCESS JUMP INSTRUCTIONS CJMP CALL SCON CHECK CONDITION JMP CALL STORA STORE THE JUMP ADDRESS FOR DISPLAY JNZ JMP2 DON'T TAKE JUMP JMP1 CALL ADDR STORE JUMP ADDRESS IN PC JMP DISP * INCREMENT PC AFTER CALL OR JUMP IF IT IS NOT TAKEN JMP2 INX H INCREMENT PC JMP3 INX H INCREMENT PC JMP4 SHLD PC SAVE PC JMP DISP * SAVE INSTRUCTION FOR DISPLAY * * STORA PUSH PSW SAVE CONDITION INX H MOV A,M STA SEXE+2 LOW BYTE INX H MOV A,M STA SEXE+1 HIGH BYTE DCX H POP PSW ALL RESTORED RET * * PROCESS JMP,OUT,IN,XTHL,XCHG,DI,EI * MIS1 MOV A,B FETCH INSTRUCTION ANI 070Q JZ JMP JMP INSTRUCTION CPI 020Q JZ OUT OUT INSTRUCTION JC ERR1 ILLEGAL CODE CPI 030Q JZ IN IN INSTRUCTION JMP BYT1 XTHL,XCHG,DI,EI * PROCESS CALL INSTRUCTIONS CCAL CALL SCON CHECK CONDITION JNZ JMP DON'T PERFORM CALL CALL CALL STORA CALL ADDR CALL ADDRESS IN PC CAL1 INX H RETURN ADDRESS XCHG SAVE ADDRESS IN D,E LDA REALI GET REAL TIME INDICATOR ORA A JNZ CALR CAL3 LHLD USP GET USERS SP DCX H DECREMENT SP MOV M,D SAVE RETURN ADD (HIGH) DCX H DECREMENT SP MOV M,E RETURN ADD (LOW) CAL2 SHLD USP SAVE USER SP JMP DISP * CHECK IF THIS ROUTINE SHOULD BE EXECUTED IN REAL TIME CALR LHLD PC LDA REALAD GET REAL T IME ADDRESS CMP L JNZ CAL3 LDA REALAD+1 CMP H JNZ CAL3 * EXECUTE IN REAL TIME SHLD SEXE+1 PUT ADDRESS IN EXE AREA XCHG SHLD PC SAVE PC FOR RETURN JMP RSTO RESTORE AND EXECUTE * PUSH AND CALL INSTRUCTIONS PUSH MOV A,B FETCH INSTRUCTION ANI 010Q JZ BYT1 PUSH INSTRUCTION MOV A,B FETCH INSTRUCTION CPI 315Q JZ CALL CALL INSTRUCTION JMP ERR1 ILLEGAL CODES * * * THIS SUBROUTINE CHECKS THE FLAGS BITS AGAINST THE BITS IN * THE INSTRUCTION TO DECIDE WHETHER TO EXECUTE OR SKIP * THE CURRENT INSTRUCTION. IT IS USED FOR CONDITIONAL CALLS * RETURNS, AND JUMPS. * ON RETURN FORM ROUTINE ZERO FLAG = 1 IMPLIES EXECUTE INSTRUCTION * SCON MOV A,B FETCH INSTRUCTION ANI 08H TRUE OR FALSE CONDITION MOV C,A JZ FALS JUMP IF FALSE COND MVI C,CONM SET MAKS TO 1'S FALS MOV A,B LOAD INSTRUCTION ANI 30H CONDITION BITS JNZ CCAR MVI D,40H ZERO BIT POSITION JMP FIG CCAR CPI 20H WHICH CONDITION JZ CPAR PARITY CONDITION JNC CSGN SIGN CONDITION MVI D,01H CARRY BIT POSITION JMP FIG CPAR MVI D,04H PARITY BIT POSITION JMP FIG CSGN MVI D,80H SIGN BIT POSITION FIG LDA FLAG FETCH FLAG BITS XRA C TRUE OR FALSE MASK ANA D WHICH CONDITION RET * * * THIS SUBROUTINE FETCHES 2 BYTES FROM MEMORY AND STORES * THEM IN THE PC. USED IN CALLS, JUMPS, AND RETURNS. * ADDR MOV A,M FETCH 1ST BYTE STA PC STORE PC (LOW) INX H INCREMENT ADDRESS MOV A,M FETCH 2ND BYTE STA PC+1 STORE PC (HIGH) RET * * ILLEGAL INSTRUCTION * ERR1 CALL DBU1 CALL SERR * * * * PROCESS INPUT INSTRUCTIONS * IN INX H MOV A,M GET PORT NUMBER FROM MEMORY * PROCESS SIMULATED INPUT PORT INX H SHLD PC SAVE PROGRAM COUNTER STA SEXE+1 PUT IN EXECUTION AREA CALL ICHK CHECK PROT TABLE JNZ INPO STANDARD PORT, SIMULATE MOV A,M GET PORT TYPE NUMBER ORA A SET FLAGS JZ INPO SIMULATED PORT JM RSTO REAL TIME PORT - GO EXECUTE * PRESET INPUT PORT INX H INCREMENT TABLE POINTER MOV A,M GET PRESET VALUE STA REGA PUT IN REGISTER A JMP DISP INPO LXI D,IMES MESSAGE ADDRESS CALL INIO OUTPUT MESSAGE CALL READ READ INPUT CALL ZBUF CLEAR BUFFER LXI H,IBUF SET INPUT BUFFER ADDRESS CALL SBL1 SCAN TO INPUT CALL NUMS JC SERR ILLEGAL VALUE MOV A,H ORA A JNZ INPO ILLEGAL VALUE READ MOV A,L STA REGA SAVE IN ACCUMULATOR JMP OUT1 * IMES DB 'I','N','P','U','T',' ',13 * * THIS ROUTINE IS USED TO OUTPUT MESSAGES FOR THE SIMULATOR * THE MESSAGE CONSISTS OF THE PC PLUS SOME OTHER CHARACTERS * INIO CALL CRLF PUSH D CALL DNPC OUTPUT ADDRESS POP D XCHG CALL SCRN OUTPUT MESSAGE LHLD NPC INX H MOV A,M GET PORT NUMBER CALL DUMO OUTPUT PORT NUM BER MVI B,'=' JMP OUT8 OUTPUT" SIGN * OUT INX H MOV A,M GET PORT NUMBER INX H SHLD PC STA SEXE+1 CALL OTCHK MVI A,1 JNZ OUTI1 MOV A,M OUTI1 ORA A JM RSTO REAL TIME PORT PUSH PSW LXI D,OMES CALL INIO POP PSW ORA A LDA REGA MOV B,A JZ OTASC * SIMULATED OUTPUT IN HEXADECIMAL OTSIM CALL SOUT JMP OUT1 * SIMULATED OUTPUT IN ASCII OTASC CPI ' ' DISPLAYABLE JC OTSIM CALL OUT8 OUT1 CALL CRLF JMP DISP * OMES DB 'O','U','T','P','U','T',' ',13 * * * THIS ROUTINE WILL RESTORE THE CPU STATUS AND THEN EXECUTE