1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 1
      


                   ;
                   ; DISASSEMBLY OF ALS-8 SYSTEM
                   ; BY BARRY A. WATZMAN
                   ;
                   ; <><><><><><><><><><><><><><><><><><><><><><><><><><><><><
                   ; MODIFIED TO PROPER INTEL SYNTAX AND FIXED TYPOS.
                   ; MODIFIED TERMINAL IO FOR MITS SIO REV. 1, SEE *UM*.
                   ;
                   ; ENTRY POINTS:
                   ;     E024     USE WHEN POWER IS FIRST APPLIED OR AFTER
                   ;              A MAJOR PROGRAM CRASH.
                   ;
                   ;     E000     USE AFTER A MINOR CRASH TO REINITIALIZE
                   ;              THE RAM I/O DRIVERS. FOLLOWING THIS THE
                   ;              FILE, IODR, CUST, AND SYMBOL TABLE CAN
                   ;              BE EXAMINED FOR POSSIBLE AFFECTS.
                   ;
                   ;     E060     USE TO RETURN TO THE ALS-8 AFTER AN
                   ;              OPERATIONAL PROGRAM HAS GONE INTO AN
                   ;              ENDLESS LOOP OR HALTED.
                   ;
                   ; UDO MUNK, AUGUST 2018
                   ; <><><><><><><><><><><><><><><><><><><><><><><><><><><><><
                   ;
   D000            DATA    EQU     0D000H          ;LOCATION OF DATA BLOCK
   E000            CODE    EQU     0E000H          ;LOCATION OF ACTUAL CODE
   CC00            VDM1    EQU     0CC00H          ;VDM-1 SCREEN MEMORY LOCATION
                   ;
   E000                    ORG     CODE
   E000   00       ALS8:   NOP
   E001   C33BE0           JMP     LE03B
                   ;
                   ;PART OF THE CODE TO DELETE CUSTOM COMMANDS
                   ;
   E004   CD0CE5   LE004:  CALL    LE50C           ;SET UP ABUF, H,L FOR DELETE
   E007   C3B7E4           JMP     LE4B7           ;USE SYMLD CODE TO DELETE COMD
                   ;
                   ;THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED
                   ;BY B,C AND CONVERTS THE ASCII DECIMAL DIGITS INTO
                   ;BINARY.  UP TO A 16-BIT VALUE CAN BE CONVERTED.  THE
                   ;SCAN STOPS WHEN A BINARY ZERO IS FOUND IN THE BUFFER.
                   ;
   E00A   210000   ADEC:   LXI     H,0             ;GET A 16 BIT ZERO
   E00D   0A       ADE1:   LDAX    B               ;FETCH ASCII DIGIT
   E00E   B7               ORA     A               ;SET ZERO FLAG
   E00F   C8               RZ                      ;RETURN IFF FINISHED
   E010   54               MOV     D,H             ;DUPLICATE CURRENT VALUE
   E011   5D               MOV     E,L             ;FROM H,L INTO D,E
   E012   29               DAD     H               ;CURRENT VALUE TIMES TWO
   E013   29               DAD     H               ;AGAIN - NOW 4X ORIG. VALUE
   E014   19               DAD     D               ;ADD IN ORIG VALUE - NOW 5X
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 2
      


   E015   29               DAD     H               ;TIMES TWO - NOW 10X
   E016   D630             SUI     30H             ;CONVERT FETCHED DGT TO BINARY
   E018   FE0A             CPI     10              ;CHECK FOR LEGAL VALUE
   E01A   3F               CMC                     ;SET UP CARRY FLAG
   E01B   D8               RC                      ;RETURN W/CARRY SET IF ERROR
   E01C   5F               MOV     E,A             ;ELSE MOVE BINARY VALUE TO E
   E01D   1600             MVI     D,0             ;AND ZERO TO D
   E01F   19               DAD     D               ;AND ADD TO 10X ORIG. NUMBER
   E020   03               INX     B               ;NOW POINT TO NEXT DIGIT
   E021   C30DE0           JMP     ADE1            ;AND PROCESS IT
                   ;
                   ;LOWEST LEVEL ENTRY POINT -- INITIALIZES EVERYTHING
                   ;
   E024   2100D0   INITA:  LXI     H,FILE0         ;POINT TO START OF DATA AREA
   E027   AF               XRA     A               ;GET A ZERO
   E028   4F               MOV     C,A             ;MOVE IT TO C
   E029   77       INIT2:  MOV     M,A             ;STASH THE ZERO
   E02A   0D               DCR     C               ;DECREMENT C
   E02B   23               INX     H               ;POINT TO NEXT LOCATION
   E02C   C229E0           JNZ     INIT2           ;IF HAVEN'T DONE 256 LOCATIONS
   E02F   3200D3           STA     SYSYM           ;ANOTHER LOCATION TO ZERO
   E032   322FD1           STA     SMODE           ;AND ANOTHER
   E035   325CD2           STA     CUCOM           ;AND STILL ANOTHER
   E038   C300E0           JMP     ALS8            ;NOW START UP THE SYSTEM
                   ;
                   ;WARM RESTART - RESTORES I/O DRIVERS AND DOES PARTIAL
                   ;INITIALIZATION
                   ;
   E03B   0E3D     LE03B:  MVI     C,(CRLF-IONME) AND 0FFH
   E03D   312FD1           LXI     SP,SMODE        ;SET STACK POINTER
   E040   11D9E1           LXI     D,IONME         ;POINT TO IO CODE SOURCE
   E043   218FD0           LXI     H,SYSIO         ;POINT TO DEST IN DATA AREA
   E046   1A       LE046:  LDAX    D               ;GET A BYTE
   E047   77               MOV     M,A             ;PUT IT IN DATA AREA
   E048   13               INX     D               ;SOURCE POINTER
   E049   23               INX     H               ;DEST POINTER
   E04A   0D               DCR     C               ;NO OF BYTES LEFT TO BE MOVED
   E04B   C246E0           JNZ     LE046           ;IF NOT DONE
   E04E   2100E0           LXI     H,ALS8          ;POINT TO START CODE
   E051   2232D1           SHLD    SYMADD          ;INITIAL SYMBOL TABLE ADDR
   E054   3E35             MVI     A,(IBUF+81) AND 0FFH
   E056   328FD1           STA     TERMW           ;INITIAL TERMINAL WIDTH
   E059   AF               XRA     A               ;GET A ZERO
   E05A   322FD1           STA     SMODE           ;SAVE AS SMODE
   E05D   3290D1           STA     CHRR            ;AND CHRR
                   ;
                   ;WARM RESTART WITH NO INITIALIZATION
                   ;PRINTS "READY" AND ENTERS MAIN PROCESSING LOOP
                   ;
   E060   2194D0   EORMS:  LXI     H,SYSIN         ;POINT TO CUR DRIVER ADDRS
   E063   CD5AE1           CALL    LE15A           ;SET I/O JUMPS TO CUR DRIVERS
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 3
      


   E066   CD16E2           CALL    CRLF            ;PRINT A CR/LF ON TERMINAL
   E069   21D7E0           LXI     H,RDYMG         ;POINT TO READY MESSAGE
   E06C   CD80E3           CALL    SCRN            ;PRINT "READY"
   E06F   C3CBE0           JMP     LE0CB           ;ANOTHER CRLF & ENTER MAIN LOOP
                   ;
                   ;THIS IS THE MAIN ALS-8 COMMAND LOOP
                   ;
   E072   210000   LE072:  LXI     H,0             ;GET A ZERO TO H,L
   E075   22FDD0           SHLD    SWCH1           ;TO SWITCH 1
   E078   312FD1   LE078:  LXI     SP,SMODE        ;SET STACK POINTER
   E07B   CD72E1           CALL    READ            ;GET A COMND LINE IN IBUF
   E07E   23               INX     H               ;POINT TO 1ST CHAR
   E07F   7E               MOV     A,M             ;GET IT
   E080   FE3A             CPI     '9'+1           ;COMPARE TO 9
   E082   DA57E8           JC      LINE            ;NEW LINE IF 1ST CHAR NUMERIC
   E085   CD15E5           CALL    VALC            ;EXTRACT ASCII & BINARY ARGS
   E088   0604             MVI     B,4             ;LENGTH OF ALS8 COMMANDS
   E08A   11E6E3           LXI     D,CTAB          ;POINT AT COMMAND TABLE
   E08D   CD28E2           CALL    COMS            ;SEE IF COMMAND IS IN TABLE
   E090   E5               PUSH    H               ;SAVE H,L PNTR INTO LINE
   E091   CAACE0           JZ      LE0AC           ;MATCH WAS FOUND
   E094   E1               POP     H               ;RESTORE POINTER TO LINE
   E095   13               INX     D               ;POINT TO 2ND PART OF TABLE
   E096   CD28E2           CALL    COMS            ;SEARCH 2ND PART
   E099   CAA5E0           JZ      LE0A5           ;IF MATCH FOUND
   E09C   115CD2           LXI     D,CUCOM         ;NO MATCH, TRY CUSTOM TABLE
   E09F   CD40E2           CALL    LE240           ;SEARCH CUSTOM TABLE
   E0A2   C2DDE7           JNZ     WHAT            ;ERROR MSG IF NO MATCH FOUND
   E0A5   E5       LE0A5:  PUSH    H               ;SAVE H,L
   E0A6   CD1EE3           CALL    LE31E           ;CONVERT ABUF CNTS TO BINARY
   E0A9   DADDE7           JC      WHAT            ;IF ABUF NOT LEGAL NO.
   E0AC   3AFCD0   LE0AC:  LDA     IOSWC           ;1 COMND DRVR SWTCH DELAY FLAG
   E0AF   B7               ORA     A               ;SET FLAGS
   E0B0   C457E1           CNZ     LE157           ;TIME TO SWITCH DRIVERS
   E0B3   E1               POP     H               ;RESTORE POINTER TO COMD LINE
   E0B4   CDDDE0           CALL    LE0DD           ;EXECUTE THE COMMAND
   E0B7   3AFDD0   EOR:    LDA     SWCH1           ;GET I/O RESTORE SWITCH
   E0BA   B7               ORA     A               ;SET FLAGS
   E0BB   C260E0           JNZ     EORMS           ;RESTORE JMPS & PRT "READY"
   E0BE   3AFED0           LDA     SWCH2           ;GET DRIVER HOLD REQ.
   E0C1   B7               ORA     A               ;SET FLAGS
   E0C2   C2D1E0           JNZ     EORNS           ;HOLD CURRENT DRVR, DO CRLF
   E0C5   2194D0           LXI     H,SYSIN         ;POINT TO SYSTEM DRIVERS
   E0C8   CD5AE1           CALL    LE15A           ;PUT IN JUMPS & DO CRLF
   E0CB   CD16E2   LE0CB:  CALL    CRLF            ;PRINT CRLF
   E0CE   C372E0           JMP     LE072           ;DO ANOTHER ALS8 COMMAND
                   ;
                   ;END OF MAIN PROCESSING LOOP
                   ;
                   ;FOLLOWING RETURN POINT DOES A CR/LF AND LEAVES
                   ;ALL DRIVERS AND SWITCHES INTACT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 4
      


                   ;
   E0D1   CD16E2   EORNS:  CALL    CRLF            ;PRINT A CRLF
   E0D4   C378E0           JMP     LE078           ;RET LEAVING DRIVERS INTACT
                   ;
                   ;SIGN-ON AND COMMAND MODE MESSAGE
                   ;
   E0D7   52454144 RDYMG:  DB      'READY',0DH
   E0DB   590D    
                   ;
                   ;HERE IS WHERE WE DISPATCH TO COMMANDS
                   ;NOTE THAT SINCE THIS IS A CALLED ROUTINE, SO
                   ;IN EFFECT IS THE ROUTINE TRANSFERED TO
                   ;
   E0DD   E9       LE0DD:  PCHL                    ;GO TO IT
                   ;
                   ;THE IODR COMMAND AND IT'S ZILLION FORMS
                   ;
   E0DE   0E06     IODR:   MVI     C,MAXFIL        ;MAX NUMBER OF DRIVER NAMES
   E0E0   214ED0           LXI     H,IOFLE         ;POINT TO DRIVER FILE
   E0E3   3AD7D0           LDA     FBUF            ;NAME IN SLASHES AFTR COMMAND ?
   E0E6   B7               ORA     A               ;SET FLAGS
   E0E7   CA51E1           JZ      LE151           ;NO - PRT LIST OF DRIVERS
   E0EA   EB               XCHG                    ;YES - TABLE PNTR TO D,E
   E0EB   CD8DE6           CALL    LE68D           ;SEARCH DIRECTORY FOR NAME
   E0EE   C2FEE0           JNZ     LE0FE           ;NAME FOUND
   E0F1   CD1CE5           CALL    VCHK            ;NOT FOUND - CHECK FOR PARMS
   E0F4   3ADED0           LDA     FEF             ;GET FREE ENTRY FOUND FLAG
   E0F7   B7               ORA     A               ;SET FLAGS
   E0F8   CACCE5           JZ      LE5CC           ;NO ENTRIES LEFT - PRT "FULL"
   E0FB   2ADCD0           LHLD    FREAD           ;GET ADDR OF FREE ENTRY
   E0FE   22DCD0   LE0FE:  SHLD    FREAD           ;FREAD HAS ADDR OF ENTRY
   E101   CD76E6           CALL    ROOM            ;PUT FILE NAME INTO DIRECTORY
   E104   210500           LXI     H,NMLEN         ;NAME LENGTH
   E107   19               DAD     D               ;H,L POINT JUST AFTER NAME
   E108   3ADFD0           LDA     ABUF            ;SEE IF ADDR SPECIFIED
   E10B   B7               ORA     A               ;SET FLAGS
   E10C   C219E1           JNZ     LE119           ;IF ADDR WAS SPECIFIED
   E10F   2205D1           SHLD    OPRD            ;NO ADDR, SET UP FOR SWTCH
   E112   3C               INR     A               ;MAKE ACCUM. NON-ZERO
   E113   32FCD0           STA     IOSWC           ;SET I/O SWITCH FLAG
   E116   C34CE1           JMP     LE14C           ;PRINT THE SELECTED ENTRY
   E119   EB       LE119:  XCHG                    ;SAVE I/O ADDRS IN D,E
   E11A   2AEFD0           LHLD    BBUF            ;GET 1ST ADDR SPECIFIED
   E11D   7D               MOV     A,L             ;L TO A
   E11E   B4               ORA     H               ;SEE IF ADDRS IS 0
   E11F   3AE6D0           LDA     ABUF+7          ;POINT TO 2ND ASCII PARM.
   E122   C230E1           JNZ     LE130           ;IF 1ST ADDR NOT ZERO
   E125   B7               ORA     A               ;SEE IF 2ND ADDR SPECIFIED
   E126   C22DE1           JNZ     LE12D           ;IF 2ND ARGUMENT NOT OMITTED
   E129   12               STAX    D               ;STORE 0 FOR INPUT, DELT ENTRY
   E12A   13               INX     D               ;FOR 2ND BYTE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 5
      


   E12B   12               STAX    D               ;ZERO IT TOO
   E12C   C9       BITBKT: RET                     ;DONE
                   ;
                   ;1ST ARG. WAS 0, 2ND WAS PRESENT
                   ;
   E12D   2A94D0   LE12D:  LHLD    SYSIN           ;GET STD SYSIN DRIVER
   E130   EB       LE130:  XCHG                    ;TO D,E
   E131   73               MOV     M,E             ;STORING IT AS INPUT DRIVER
   E132   23               INX     H               ;2ND BYTE
   E133   72               MOV     M,D             ;STORE IT
   E134   23               INX     H               ;POINT TO OUTPUT DRIVER
   E135   EB               XCHG                    ;OUTPUT DRIVER ADDR TO D,E
   E136   B7               ORA     A               ;SET FLAGS FOR 2ND ARG OMITTED
   E137   212CE1           LXI     H,BITBKT        ;POINT TO THE BIT BUCKET
   E13A   CA48E1           JZ      LE148           ;IF 2ND ARG OMITTED
   E13D   2AF1D0           LHLD    BBUF+2          ;GET 2ND ARG
   E140   7D               MOV     A,L             ;MOVE L TO A
   E141   B4               ORA     H               ;SEE IF ARG = 0
   E142   C248E1           JNZ     LE148           ;JMP IF NOT ZERO
   E145   2A96D0           LHLD    SYSOT           ;ELSE SET TO USE SYSOT
   E148   EB       LE148:  XCHG                    ;OUTPUT ADDR TO D,E
   E149   73               MOV     M,E             ;MOVING IT TO OUTPUT TABLE
   E14A   23               INX     H               ;2ND HALF
   E14B   72               MOV     M,D             ;DONE
   E14C   0E01     LE14C:  MVI     C,1             ;SET UP TO PRINT ENTRY
   E14E   2ADCD0           LHLD    FREAD           ;GET IT'S ADDRESS
   E151   CD2AE6   LE151:  CALL    LE62A           ;PRINT IT
   E154   C3D1E0           JMP     EORNS           ;DONE WITH IODR
                   ;
                   ;SET UP I/O JUMPS TO I/O DRIVER SET WHOSE ADDRESSES
                   ;ARE POINTED TO BY OPRD (SET ABOVE)
                   ;
   E157   2A05D1   LE157:  LHLD    OPRD            ;GET ADDRESS OF I/O ADDRESSAS
                   ;
                   ;STORE I/O JUMPS TO ADDRESSES POINTED TO BY CONTENTS OF
                   ;H,L -- SYSIO, OR IF ENTERD IN LINE, ONE OF THE OTHER
                   ;I/O DRIVERS
                   ;
   E15A   CD82E9   LE15A:  CALL    LODM            ;GET THE 4 BYTES OF 2 ADDRESSES
   E15D   21CCD0           LXI     H,IN8           ;POINT TO THE I/O JUMPS
   E160   36C3             MVI     M,0C3H          ;STORE JUMP INST.
   E162   23               INX     H               ;POINT TO NEXT BYTE
   E163   70               MOV     M,B             ;STORE IT
   E164   23               INX     H               ;2ND BYTE
   E165   71               MOV     M,C             ;STORE IT
   E166   23               INX     H               ;NOW 1ST BYTE FOR OUTPUT
   E167   36C3             MVI     M,0C3H          ;STORE JUMP INST
   E169   23               INX     H               ;POINT TO ADDR 1ST BYTE
   E16A   72               MOV     M,D             ;STORE IT
   E16B   23               INX     H               ;POINT 2ND BYTE
   E16C   73               MOV     M,E             ;STORE IT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 6
      


   E16D   AF               XRA     A               ;A ZERO
   E16E   32FCD0           STA     IOSWC           ;RESET SWITCH TO NO-SWITCH MODE
   E171   C9               RET                     ;DONE
                   ;
                   ;THE FOLLOWING ROUTINE READS A COMMAND LINE FROM THE
                   ;TERMINAL AND PUTS IT IN THE OUTPUT BUFFER
                   ;
   E172   21E4D1   READ:   LXI     H,IBUF          ;GET INPUT BUFFER ADDR
   E175   22D4D0           SHLD    ADDS            ;SAVE ADDRESS
   E178   1E02             MVI     E,2             ;INIT. CHAR COUNT
   E17A   CDCCD0   NEXT:   CALL    IN8             ;READ A LINE
   E17D   FE18             CPI     'X'-40H         ;CHECK FOR CNTL X
   E17F   C288E1           JNZ     CR              ;CHECK FOR C/R IF NOT CNTL X
   E182   CD16E2           CALL    CRLF            ;ELSE DO CRLF
   E185   C372E1           JMP     READ            ;AND START OVER
   E188   FE0D     CR:     CPI     0DH             ;IS IT A C/R ?
   E18A   C2A7E1           JNZ     DEL             ;IF NOT, CHECK FOR CHAR DELETE
   E18D   7D               MOV     A,L             ;GET LOW ORDER BYTE OF ADDR
   E18E   FEE4             CPI     IBUF AND 0FFH   ;SEE IF CR IS ONLY CHAR ON LINE
   E190   CA72E1           JZ      READ            ;GET ANOTHER LINE IF SO
   E193   70               MOV     M,B             ;PUT CHAR IN THE LINE
   E194   23               INX     H               ;POINT TO NEXT POSITION
   E195   3601             MVI     M,1             ;PUT END OF LINE INDICATOR
   E197   23               INX     H               ;POINT 1 AFTER THE LINE
   E198   CDDFF3           CALL    LF3DF           ;GET TERMW+1 IN A
   E19B   3C               INR     A               ;INCREMENT IT FOR EOF MARK
   E19C   CDD1E1           CALL    CLER            ;CLEAR REST OF THE BUFFER
   E19F   21E3D1           LXI     H,IBUF-1        ;POINT TO CHAR COUNT
   E1A2   7B               MOV     A,E             ;PUT IT BEFORE THE LINE
   E1A3   32F3D0           STA     CCNT            ;AND SAVE AS CHAR COUNT
   E1A6   C9               RET                     ;DONE
   E1A7   FE7F     DEL:    CPI     7FH             ;IS THE CHAR A DELETE ?
   E1A9   C2BCE1           JNZ     CHAR            ;IF NOT, PUT IT IN LINE
   E1AC   3EE4             MVI     A,IBUF AND 0FFH ;ELSE GET LOW-ORDER ADDR
   E1AE   BD               CMP     L               ;MAKE SURE NOT AT IBUF
   E1AF   CA7AE1           JZ      NEXT            ;IF SO, IGNORE DELETE
   E1B2   2B               DCX     H               ;ELSE DCR BUFFER POINTER
   E1B3   1D               DCR     E               ;AND CHAR COUNT
   E1B4   065F     BSPA:   MVI     B,5FH           ;GET BACKSPACE CHAR
   E1B6   CDCFD0           CALL    OUT8            ;MAKE TERMINAL BKSPACE
   E1B9   C37AE1           JMP     NEXT            ;THEN GET NEXT CHAR
   E1BC   CDCFD0   CHAR:   CALL    OUT8            ;ECHO THE CHAR
   E1BF   FE20             CPI     ' '             ;MAKE SURE IT'S PRINTABLE
   E1C1   DA7AE1           JC      NEXT            ;SKIP IT IF IT'S CNTL CHAR
   E1C4   77               MOV     M,A             ;ELSE PUT IT IN THE BUFFER
   E1C5   3A8FD1           LDA     TERMW           ;GET TERMINAL WIDTH
   E1C8   BD               CMP     L               ;SEE IF WE'RE THERE
   E1C9   CAB4E1           JZ      BSPA            ;BACKSPACE IF BUFFER OVERFLOW
   E1CC   23               INX     H               ;ELSE INCREMENT THE BUFFER PNTR
   E1CD   1C               INR     E               ;AND THE CHAR COUNT
   E1CE   C37AE1           JMP     NEXT            ;THEN DO NEXT CHAR
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 7
      


                   ;
                   ;THIS ROUTINE IS USED TO BLANK OUT A PORTION OF MEMORY
                   ;SINCE ONLY L IS TESTED, AREA MUST BE < 256 BYTES
                   ;
   E1D1   BD       CLER:   CMP     L               ;SEE IF AT END OF AREA TO BLANK
   E1D2   C8               RZ                      ;DONE IF SO
   E1D3   3620             MVI     M,' '           ;ELSE GET A SPACE
   E1D5   23               INX     H               ;INCREMENT THE MEMORY POINTER
   E1D6   C3D1E1           JMP     CLER            ;AND TEST NEW ADDRESS
                   ;
                   ;HERE ARE THE BUILT IN I/O DRIVERS AND THEIR NAME
                   ;THIS CODE IS MOVED INTO THE DATA PORTION DURING
                   ;PROGRAM INITIALIZATION.
                   ;PART OF THE ENTER COMMAND IS ALSO MOVED, FOR NO REASON.
                   ;
   E1D9   53595349 IONME:  DB      'SYSIO'         ;STANDARD DRIVER NAME
   E1DD   4F      
   E1DE   98D0             DW      INDR            ;INPUT ROUTINE ADDR
   E1E0   A9D0             DW      OUTDR           ;OUTPUT ROUTINE ADDR
   E1E2   CDA4D0   INP8:   CALL    STAT            ;BECOMES INDR: AFTER THE MOVE
                   ;       JZ      INDR            ;*UM*
   E1E5   C298D0           JNZ     INDR            ;*UM*
   E1E8   DB01             IN      UDATA
   E1EA   E67F             ANI     7FH
   E1EC   47               MOV     B,A
   E1ED   C9               RET
   E1EE   DB00             IN      USTA            ;THIS BECOMES STAT:
   E1F0   E601             ANI     DAV
   E1F2   C9               RET
   E1F3   CDA4D0   OUTP8:  CALL    STAT
   E1F6   CAB8D0           JZ      NOCHR
   E1F9   DB01             IN      UDATA           ;NOTE THAT BEFORE EA. OUTPUT
   E1FB   E67F             ANI     7FH
   E1FD   FE1B             CPI     ESC             ;ALS8 TESTS FOR AN ESC. CHAR
   E1FF   CA60E0           JZ      EORMS           ;AND RETNS TO CMD MODE IF FOUND
   E202   DB00             IN      USTA            ;BECOMES NOCHR:
   E204   E680             ANI     TBE
                   ;       JZ      NOCHR
   E206   C2B8D0           JNZ     NOCHR           ;*UM*
   E209   78               MOV     A,B
   E20A   D301             OUT     UDATA
   E20C   C9               RET
                   ;
                   ;THE ENTER COMMAND.
                   ;
   E20D   CD1CE5   ENTR:   CALL    VCHK            ;MAKE SURE PARAMETERS GIVEN
   E210   CD0BE8           CALL    ENTS            ;TO DO THE ENTER FUNCTION
   E213   DADDE7           JC      WHAT            ;IF ERROR FOUND
                   ;
                   ;CRLF UTILITY
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 8
      


   E216   060D     CRLF:   MVI     B,0DH           ;CAR. RETURN
   E218   CDCFD0           CALL    OUT8
   E21B   060A     LF:     MVI     B,0AH           ;LINE FEED
   E21D   CDCFD0           CALL    OUT8
   E220   067F             MVI     B,7FH           ;NULLS FOR SLOW TERMINALS
   E222   CDCFD0           CALL    OUT8
   E225   C3CFD0           JMP     OUT8            ;LET OUT8 DO THE RETURN
                   ;
                   ;TABLE SEARCH ROUTINE USED FOR BOTH COMMAND SEARCHES AND
                   ;SYMBOL LOOK-UPS.  ZERO FLAG SET IF MATCH FOUND, IN WHICH
                   ;CASE H,L HAS VALUE OF STRING (16 BIT).
                   ;LENGTH OF STRING IS IN B, TABLE ADDRESS IS IN
                   ;D,E, ADDS POINTS TO ITEM TO BE LOOKED UP.
                   ;IF NO MATCH, D,E POINT TO BYTE AFTER TABLE END.
                   ;
   E228   2AD4D0   COMS:   LHLD    ADDS            ;GET ADDR OF ITEM TO LOOK UP
   E22B   48               MOV     C,B             ;LENGTH OF ITEM TO LOOK UP
   E22C   1A               LDAX    D               ;1ST BYTE OF NEXT TABLE ENTRY
   E22D   B7               ORA     A               ;IF ZERO, ==> END OF TABLE
   E22E   CA3EE2           JZ      LE23E           ;TO SET RET FLAG FOR NO MATCH
   E231   CD57E2           CALL    SEAR            ;SEE IF ENTRY MATCHES STRING
   E234   1A               LDAX    D               ;GET 1ST BYTE OF VALUE
   E235   67               MOV     H,A             ;MOVING TO H,L
   E236   13               INX     D               ;INCREMENT POINTER
   E237   1A               LDAX    D               ;GET 2ND BYTE OF VALUE
   E238   6F               MOV     L,A             ;MOVE TO H,L COMPLETE
   E239   C8               RZ                      ;RET IF SEAR INDICATED MATCH
   E23A   13               INX     D               ;ELSE POINT TO NEXT TABLE ITEM
   E23B   C328E2           JMP     COMS            ;AND TEST IT
   E23E   3C       LE23E:  INR     A               ;MAKE NON ZERO
   E23F   C9               RET                     ;INDICATING NO MATCH
                   ;
                   ;THE FOLLOWING ROUTINE IS THE SAME AS COMS, ABOVE, EXCEPT
                   ;THAT IT IS USED TO SEARCH THE CUSTOM COMMAND TABLE, WHICH
                   ;CONSISTS OF 5 CHAR NAMES WITH ONLY 1ST FOUR TESTED.
                   ;BECAUSE OF THIS IT HAS AN EXTRA INX D INSTR.
                   ;
   E240   2AD4D0   LE240:  LHLD    ADDS            ;GET ADDR OF ITEM TO LOOK UP
   E243   48               MOV     C,B             ;LENGTH OF ITEM TO LOOK UP
   E244   1A               LDAX    D               ;1ST BYTE OF TABLE ENTRY
   E245   B7               ORA     A               ;IF ZERO ==> END OF TABLE
   E246   CA3EE2           JZ      LE23E           ;TO SET RET FLAG FOR NO MATCH
   E249   CD57E2           CALL    SEAR            ;SEE IF ENTRY MATCHES STRING
   E24C   13               INX     D               ;SKIP 5TH CHAR OF ENTRY NAME
   E24D   1A               LDAX    D               ;GET 1ST BYTE OF VALUE
   E24E   67               MOV     H,A             ;MOVING TO H,L
   E24F   13               INX     D               ;POINT TO 2ND BYTE OF VALUE
   E250   1A               LDAX    D               ;GET 2ND BYTE OF VALUE
   E251   6F               MOV     L,A             ;MOVE TO H,L COMPLETE
   E252   C8               RZ                      ;RET IF SEAR INDICATED MATCH
   E253   13               INX     D               ;POINT TO NEXT ENTRY
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 9
      


   E254   C340E2           JMP     LE240           ;TEST IT
                   ;
                   ;ROUTINE TO SEE IF TWO STRINGS ARE EQUAL.  STRINGS POINTED
                   ;TO BY D,E AND H,L.  ZERO FLAG SET INDICATES MATCH.  REG C
                   ;HAS LENGTH OF MASTER STRING.  D POINT AFTER ITS STRING
                   ;EVEN IF NO MATCH; H,L POINTS AFTER IT'S STRING IF MATCH,
                   ;ELSE TO 1ST NON-MATCHING CHAR.
                   ;
   E257   1A       SEAR:   LDAX    D               ;GET A CHAR FROM 1 STRING
   E258   BE               CMP     M               ;COMPARE TO OTHER STRING
   E259   C263E2           JNZ     INCA            ;IF IT DOESN'T MATCH
   E25C   23               INX     H               ;INCREMENT POINTER
   E25D   13               INX     D               ;INCREMENT POINTER
   E25E   0D               DCR     C               ;COUNT OF CHARS LEFT TO CHECK
   E25F   C257E2           JNZ     SEAR            ;IF CHARS LEFT, TEST THEM
   E262   C9               RET                     ;ELSE DONE
   E263   13       INCA:   INX     D               ;INCREMENT POINTER
   E264   0D               DCR     C               ;DECREMENT COUNT
   E265   C263E2           JNZ     INCA            ;KEEP INR. POINTER IF NOT DONE
   E268   0C               INR     C               ;ELSE CLEAR ZERO FLAG
   E269   C9               RET                     ;AND RETURN
                   ;
                   ;ROUTINE TO ZERO OUT A BUFFER IN MEMORY
                   ;
   E26A   AF       ZBUF:   XRA     A               ;GET A ZERO
   E26B   11EFD0           LXI     D,ABUF+16       ;POINT TO THE BUFFER
   E26E   0610             MVI     B,16            ;BUFFER LENGTH
   E270   1B       ZBU1:   DCX     D               ;DECREMENT POINTER
   E271   12               STAX    D               ;ZERO OUT A LOCATION
   E272   05               DCR     B               ;DECREMENT COUNT
   E273   C270E2           JNZ     ZBU1            ;IF MORE LEFT TO ZERO
   E276   C9               RET                     ;DONE
                   ;
                   ;THE EXECUTE COMMAND - DOES A CALL TO A SPECIFIED ADDR.
                   ;
   E277   CD1CE5   EXEC:   CALL    VCHK            ;CHECK FOR PROPER ARGUMENT
   E27A   CD16E2           CALL    CRLF            ;DO CRLF
   E27D   2AEFD0           LHLD    BBUF            ;GET EXEC ADDR
   E280   E9               PCHL                    ;GO TO IT
                   ;
                   ;ROUTINE TO EXTRACT VALUES FROM A COMMAND LINE
                   ;AND PLACE THEM IN BUFFERS
                   ;
   E281   210000   ETRA:   LXI     H,0             ;GET A ZERO
   E284   22F1D0           SHLD    BBUF+2          ;ASSUME NO 2ND OPERAND
   E287   22D7D0           SHLD    FBUF            ;ASSUME NO FILE NAME IN /'S
   E28A   CD6AE2           CALL    ZBUF            ;ZERO OUT ABUF
   E28D   21E3D1           LXI     H,IBUF-1        ;SET TO SCAN COMMAND LINE
   E290   23       VAL1:   INX     H               ;POINT TO NEXT CHAR
   E291   7E               MOV     A,M             ;GET CHAR
   E292   FE20             CPI     ' '             ;SPACE ?
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 10
      


   E294   3F               CMC                     ;SET CARRY TO INDICATE CNTL CHR
   E295   D0               RNC                     ;DONE-CR ONLY CNTL CHR ALLOWED
   E296   C290E2           JNZ     VAL1            ;IF CHAR WAS NOT A SPACE
   E299   2201D1           SHLD    PNTR            ;ELSE SPACE, SAVE POINTER
   E29C   CDCCEE           CALL    SBLK            ;AND SCAN TO 1ST CHAR
   E29F   3F               CMC                     ;CARRY SET ==> C/R 1ST CHAR
   E2A0   D0               RNC                     ;DONE THEN
   E2A1   FE2F             CPI     '/'             ;FILE NAME DELIMITER ?
   E2A3   C2CBE2           JNZ     VAL5            ;NO, LOOK FOR OTHER PARAMETERS
   E2A6   11D7D0           LXI     D,FBUF          ;YES, POINT TO FILE NAME BUFFER
   E2A9   0E05             MVI     C,NMLEN         ;FILE NAME LENGTH
   E2AB   23       VAL2:   INX     H               ;MOVING NAME TO FILE NAME BUFR
   E2AC   7E               MOV     A,M             ;GET A CHAR
   E2AD   FE2F             CPI     '/'             ;TERMINATING SLASH ?
   E2AF   CABBE2           JZ      VAL3            ;DONE MOVING NAME THEN
   E2B2   0D               DCR     C               ;ELSE DCR COUNT OF CHARS LEFT
   E2B3   FADDE7           JM      WHAT            ;IF NAME > 5 CHARS
   E2B6   12               STAX    D               ;ELSE PUT LETTER IN BUFFER
   E2B7   13               INX     D               ;INCREMENT DEST. POINTER
   E2B8   C3ABE2           JMP     VAL2            ;AND DO NEXT CHARACTER
   E2BB   3E20     VAL3:   MVI     A,' '           ;GET A SPACE
   E2BD   0D       VAL4:   DCR     C               ;DECREMENT COUNT OF CHARS LEFT
   E2BE   FAC6E2           JM      DONE            ;IF NEGATIVE, DONE
   E2C1   12               STAX    D               ;PAD REST OF BUFR WITH SPACES
   E2C2   13               INX     D               ;INCREMENT BUFFER POINTER
   E2C3   C3BDE2           JMP     VAL4            ;CONTINUE TILL BUFFER FILLED
   E2C6   CDD3EE   DONE:   CALL    SBL2            ;SCAN TO NEXT NON-SPACE CHAR
   E2C9   3F               CMC                     ;CARRY MEANS CHAR. RETRN FOUND
   E2CA   D0               RNC                     ;AND CAR. RETRN = DONE
   E2CB   11DFD0   VAL5:   LXI     D,ABUF          ;POINT TO THE ASCII BUFFER
   E2CE   CDD7E2           CALL    LE2D7           ;PUT IN ABUF & CNVRT BY MODE
   E2D1   D8               RC                      ;IF C/R WAS TERMINATING CHAR
   E2D2   CDCCEE           CALL    SBLK            ;ELSE SCAN TO 2ND ASCII PARM.
   E2D5   3F               CMC                     ;TEST FOR C/R FOUND
   E2D6   D0               RNC                     ;RET., ELSE FALL THRU TO DO 2ND
   E2D7   CD3EF1   LE2D7:  CALL    ALPS            ;PUT PARM. IN ABUF
   E2DA   7B               MOV     A,E             ;GET ENDING ADDR LOW BYTE
   E2DB   90               SUB     B               ;SUBTRACTING PARM LENGTH
   E2DC   6F               MOV     L,A             ;TO GET BACK TO START
   E2DD   7A               MOV     A,D             ;NOW HIGH ORDER BYTE
   E2DE   DE00             SBI     0               ;IN CASE OF BORROW
   E2E0   67               MOV     H,A             ;H,L HAS START OF PARM IN ABUF
   E2E1   3A2FD1           LDA     SMODE           ;GET NUMERIC MODE
   E2E4   87               ADD     A               ;MULT. BY 2
   E2E5   C604             ADI     4               ;AND ADD 4
   E2E7   B8               CMP     B               ;TEST FOR NO. OF DIGITS ALLOWED
   E2E8   D8               RC                      ;# DIGITS > 4 AND HEX MODE
   E2E9   CDA5E9           CALL    NORM            ;NORMALIZE ASCII NUMBER
   E2EC   EB               XCHG                    ;START OF SUB-BUFFER TO D,E
   E2ED   210700           LXI     H,7             ;LENGTH OF SUB-BUFFERS IN ABUF
   E2F0   19               DAD     D               ;H,L POINT TO NEXT SUB-BUFFER
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 11
      


   E2F1   EB               XCHG                    ;NEXT SUB-BUFFER IN D,E
   E2F2   C9               RET                     ;DONE
                   ;
                   ;SOME NUMERICAL CONVERSION ROUTINES FOLLOW.
                   ;B,C POINT TO 1ST ASCII DIGIT, NUMERIC STRING ENDS WITH
                   ;BINARY ZERO.  ANSWER IN H,L AND CARRY SET = ERROR.
                   ;
                   ;EMODE CONVERTS BASED ON CURRENT MODE SETTING, SMODE
                   ;EQUAL TO 0 FOR HEX, 1 FOR OCTAL.
                   ;
   E2F3   3A2FD1   EMODE:  LDA     SMODE           ;GET MODE SETTING
   E2F6   B7               ORA     A               ;SET FLAGS
   E2F7   C233E3           JNZ     AOCT            ;OCTAL IS 1
   E2FA   210000   AHEX:   LXI     H,0             ;START WITH A ZERO
   E2FD   0A       AHE1:   LDAX    B               ;GET A DIGIT
   E2FE   B7               ORA     A               ;SEE IF ZERO
   E2FF   C8               RZ                      ;YES - DONE
   E300   29               DAD     H               ;MULT H,L BY TWO
   E301   29               DAD     H               ;AGAIN - NOW 4X ORIG VALUE
   E302   29               DAD     H               ;AGAIN - NOW 8X ORIG VALUE
   E303   29               DAD     H               ;AGAIN - NOW 10H X ORIG VALU
   E304   CD11E3           CALL    AHS1            ;CONVERT DIGIT TO BINARY
   E307   FE10             CPI     10H             ;SEE IF LEGAL
   E309   3F               CMC                     ;SET CARRY FLAG
   E30A   D8               RC                      ;FOR PROPER ILLEAGLE RETURN
   E30B   85               ADD     L               ;OTHERWISE ADD IT INTO THE NO.
   E30C   6F               MOV     L,A             ;AND RESTORE TO H,L
   E30D   03               INX     B               ;NOW POINT TO NEXT ASCII DIGIT
   E30E   C3FDE2           JMP     AHE1            ;AND PROCESS IT
                   ;
                   ;ROUTINE TO CONVERT ASCII HEX DIGIT INTO BINARY
                   ;
   E311   D630     AHS1:   SUI     30H             ;CONVERT 0-9 TO BINARY
   E313   FE0A             CPI     0AH             ;SEE IF > ASCII 9
   E315   D8               RC                      ;RETURN IF NOT, DONE
   E316   D607             SUI     7               ;TO TAKE CARE OF A-F
   E318   FE0A             CPI     0AH             ;COMPARE TO DECIMAL 10
   E31A   D0               RNC                     ;IF > 10 OR =, RETURN DONE
   E31B   3EFF             MVI     A,0FFH          ;ELSE BAD CHAR, SET A > 10H
   E31D   C9               RET                     ;AND RETURN
                   ;
                   ;HERE IS A ROUTINE TO CONVERT BOTH OF TWO POSSIBLE
                   ;VALUES IN ABUF INTO BINARY BASED ON THE CURRENT MODE
                   ;SETTING, AND PLACE THEM INTO BBUF AND BBUF+2
                   ;
   E31E   01DFD0   LE31E:  LXI     B,ABUF          ;POINT TO THE 1ST OPERAND
   E321   CDF3E2           CALL    EMODE           ;CONVERT IT
   E324   D8               RC                      ;RETURN W/CARRY SET ON ERROR
   E325   22EFD0           SHLD    BBUF            ;PUT VALUE IN BBUF
   E328   01E6D0           LXI     B,ABUF+7        ;POINT TO 2ND VALUE
   E32B   CDF3E2           CALL    EMODE           ;CONVERT IT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 12
      


   E32E   D8               RC                      ;RETURN W/CARRY SET ON ERROR
   E32F   22F1D0           SHLD    BBUF+2          ;PUT IT IN THE BINARY BUFFER
   E332   C9               RET                     ;DONE
                   ;
                   ;OCTAL TO BINARY CONVERSION
                   ;
   E333   210000   AOCT:   LXI     H,0             ;START W/ZERO
   E336   0A       LE336:  LDAX    B               ;GET A CHAR
   E337   B7               ORA     A               ;ZERO ?
   E338   C8               RZ                      ;DONE THEN, RETURN
   E339   29               DAD     H               ;MULT H,L BY TWO
   E33A   29               DAD     H               ;AGAIN - NOW 4X ORIG VALU
   E33B   29               DAD     H               ;AGAIN - NOW 8X ORIG VALU
   E33C   D630             SUI     30H             ;CONVERT ASCII DIGIT TO BINARY
   E33E   FE08             CPI     8               ;LEGAL VALUE ?
   E340   3F               CMC                     ;SET CARRY FOR PROPER RETURN
   E341   D8               RC                      ;RETURN IF BAD
   E342   85               ADD     L               ;ELSE ADD IN VALUE
   E343   6F               MOV     L,A             ;AND PUT IT BACK
   E344   03               INX     B               ;POINT TO NEXT ASCII DIGIT
   E345   C336E3           JMP     LE336           ;AND PROCESS IT
                   ;
                   ;DECIMAL OUTPUT ROUTINE FOR BINARY NO. IN REG A.
                   ;
   E348   CDADE3   DOUT:   CALL    BIND            ;CONVRT A TO DECIMAL IN ADDS
   E34B   CD7AE5   LE34B:  CALL    LE57A           ;PRINT 1ST TWO CHARS IN ADDS
   E34E   23               INX     H               ;POINT TO 3RD CHAR IN ADDS
   E34F   46               MOV     B,M             ;GET IT
   E350   C3CFD0           JMP     OUT8            ;PRINT IT AND RETURN
                   ;
                   ;OCTAL OUTPUT ROUTINE
                   ;
   E353   CDC8E3   OOUT:   CALL    BINO            ;CONVERT TO OCTAL IN ADDS
   E356   C34BE3           JMP     LE34B           ;PUT OUT 3 OCTAL DIGITS AND RET
                   ;
                   ;OCTAL FOLLOWED BY SPACE
                   ;
   E359   CD53E3   OOTB:   CALL    OOUT            ;PUT OUT OCTAL NO.
   E35C   0620     LE35C:  MVI     B,' '           ;GET A SPACE
   E35E   C3CFD0           JMP     OUT8            ;PUT IT OUT
                   ;
                   ;OUTPUT NUMBER OF SPACES IN REG C
                   ;
   E361   CD5CE3   BLKO:   CALL    LE35C           ;PUT OUT A SPACE
   E364   0D               DCR     C               ;DECREMENT COUNT
   E365   C261E3           JNZ     BLKO            ;PUT OUT MORE IF NOT DONE
   E368   C9               RET                     ;ELSE RETURN
                   ;
                   ;COMPARE THE ADDRESSES AT BBUF AND BBUF+2
                   ;INCREMENT THE ADDR AT BBUF AND RET CARRY SET IF SAME
                   ;USED BY DUMP COMMAND TO TEST FOR END
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 13
      


                   ;
   E369   2AEFD0   ACHK:   LHLD    BBUF            ;GET 1ST ADDRESS
   E36C   3AF2D0           LDA     BBUF+3          ;GET HIGH BYTE OF 2ND ADDR
   E36F   BC               CMP     H               ;COMPARE HIGH ORDER BYTES
   E370   C27BE3           JNZ     ACH1            ;BBUF LOWER, INR IT & GO HOME
   E373   3AF1D0           LDA     BBUF+2          ;GET 2ND ADDR LOW BYTE
   E376   BD               CMP     L               ;COMPARE TWO ADDR.
   E377   C27BE3           JNZ     ACH1            ;BBUF LOWER, INR IT & GO HOME
   E37A   37               STC                     ;ADDR. ARE SAME, SET CARRY
   E37B   23       ACH1:   INX     H               ;INCREMENT BBUF ADDR
   E37C   22EFD0           SHLD    BBUF            ;PUT IT BACK
   E37F   C9               RET                     ;DONE
                   ;
                   ;PRINT CHARACTERS UNTIL A CAR. RET. FOUND
                   ;
   E380   AF       SCRN:   XRA     A               ;BINARY ZERO
   E381   32FFD0           STA     XOUT            ;LAST CHAR OUTPUT
   E384   46               MOV     B,M             ;GET A CHARACTER
   E385   3E0D             MVI     A,0DH           ;CAR. RETRN TO A.
   E387   B8               CMP     B               ;CHAR IN B = C/R ?
   E388   C8               RZ                      ;YES - DONE
   E389   CDCFD0           CALL    OUT8            ;NO - OUTPUT IT & MOV TO A
   E38C   23               INX     H               ;INCREMENT POINTER
   E38D   C381E3           JMP     SCRN+1          ;UPDATE XOUT AND DO NEXT CHAR
                   ;
                   ;CONVERT BINARY TO HEX ASCII & STORE
                   ;
   E390   21D4D0   BINH:   LXI     H,ADDS          ;DESTINATION FOR ASCII
   E393   47               MOV     B,A             ;SAVE CHAR IN B
   E394   1F               RAR                     ;MOVING HIGH ORDER NIBBLE TO
   E395   1F               RAR                     ;LOW ORDER NIBBLE
   E396   1F               RAR
   E397   1F               RAR
   E398   CDA3E3           CALL    BIN1            ;CONVERT TO LETTER OR NO.
   E39B   77               MOV     M,A             ;STORE IT
   E39C   23               INX     H               ;INCREMENT DEST. POINTER
   E39D   78               MOV     A,B             ;GET BACK ORIG NO.
   E39E   CDA3E3           CALL    BIN1            ;CONVERT LOW ORDER NIBBLE TO NO
   E3A1   77               MOV     M,A             ;PUT IT IN MEMORY
   E3A2   C9               RET                     ;DONE
                   ;
                   ;CONVERT LOW ORDER NIBBLE OF A TO HEX ASCII
                   ;
   E3A3   E60F     BIN1:   ANI     0FH             ;MASK LOW NIBBLE
   E3A5   C630             ADI     30H             ;CONVERT TO NO.
   E3A7   FE3A             CPI     '9'+1           ;SEE IF > 9
   E3A9   D8               RC                      ;IT WASN'T -- DONE
   E3AA   C607             ADI     7               ;ADD 7 TO GET LETTER
   E3AC   C9               RET                     ;DONE
                   ;
                   ;BINARY TO DECIMAL
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 14
      


                   ;
   E3AD   21D4D0   BIND:   LXI     H,ADDS          ;POINT TO DESTINATION
   E3B0   0664             MVI     B,100           ;DOING SUCCESSIVE SUBTRACTIONS
   E3B2   CDBEE3           CALL    BID1            ;SUBTRACT & KEEP COUNT
   E3B5   060A             MVI     B,10            ;NOW WORK WITH TENS
   E3B7   CDBEE3           CALL    BID1            ;MORE SUBTRACTIONS
   E3BA   C630             ADI     30H             ;CONVERT UNITS TO DECIMAL ASCII
   E3BC   77               MOV     M,A             ;STORE UNITS DIGIT IN MEMORY
   E3BD   C9               RET                     ;DONE
   E3BE   362F     BID1:   MVI     M,'0'-1
   E3C0   34               INR     M               ;INCR COUNT OF SUBTRACTIONS
   E3C1   90               SUB     B               ;DO A SUBTRACTION
   E3C2   D2C0E3           JNC     BID1+2          ;DO IT AGAIN IF ANS > 0
   E3C5   80               ADD     B               ;IF ANS < 0, UN-SUBTRACT
   E3C6   23               INX     H               ;INCREMENT DEST. POINTER
   E3C7   C9               RET                     ;DIGIT STORED
                   ;
                   ;BINARY TO OCTAL
                   ;
                   ;NOTE THAT THE CARRY IS USED, SO THE MAX SINGLE BYTE OCTAL
                   ;VALUE THAT CAN BE HANDLED IS 777 NOT 377.  THIS FEATURE IS
                   ;USED IN THE DUMP ROUTINE.
                   ;
   E3C8   21D4D0   BINO:   LXI     H,ADDS          ;GET DEST. POINTER
   E3CB   47               MOV     B,A             ;SAVE ORIG NO. IN B
   E3CC   17               RAL                     ;HIGH ORDER BITS & CARRY
   E3CD   17               RAL                     ;MOVING TO LOW ORDER 3 BITS
   E3CE   17               RAL                     ;
   E3CF   E607             ANI     7               ;MASK TO 3 BITS
   E3D1   C630             ADI     30H             ;CONVERT TO ASCII
   E3D3   77               MOV     M,A             ;STORE IN MEMORY
   E3D4   78               MOV     A,B             ;GET ORIG. NO.
   E3D5   1F               RAR                     ;MOVE MIDDLE 3 BITS
   E3D6   1F               RAR                     ;TO LOW ORDER 3 BITS
   E3D7   1F               RAR
   E3D8   E607             ANI     7               ;AND MASK THEM OUT
   E3DA   C630             ADI     30H             ;CONVERT TO ASCII
   E3DC   23               INX     H               ;INCREMENT MEMORY POINTER
   E3DD   77               MOV     M,A             ;AND PUT DIGIT IN MEMORY
   E3DE   78               MOV     A,B             ;GET ORIGINAL DIGIT AGAIN
   E3DF   E607             ANI     7               ;MASK TO LOW ORDER 3 BITS
   E3E1   C630             ADI     30H             ;CONVERT TO ASCII
   E3E3   23               INX     H               ;INCREMENT MEMORY POINTER
   E3E4   77               MOV     M,A             ;AND STORE IN MEMORY
   E3E5   C9               RET                     ;DONE
                   ;
                   ;HERE IS THE ALS-8 COMMAND TABLE
                   ;
   E3E6   4C495354 CTAB:   DB      'LIST'
   E3EA   E9DB             DB      (LIST SHR 8) AND 0FFH, LIST AND 0FFH
   E3EC   54455854         DB      'TEXT'
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 15
      


   E3F0   E9DC             DB      (TEXT SHR 8) AND 0FFH, TEXT AND 0FFH
   E3F2   44454C54         DB      'DELT'
   E3F6   EA2C             DB      (DELT SHR 8) AND 0FFH, DELT AND 0FFH
   E3F8   4D4F4445         DB      'MODE'
   E3FC   E58C             DB      (MODE SHR 8) AND 0FFH, MODE AND 0FFH
   E3FE   4643484B         DB      'FCHK'
   E402   E6D3             DB      (FCHK SHR 8) AND 0FFH, FCHK AND 0FFH
   E404   464F524D         DB      'FORM'
   E408   E6CC             DB      (FORM SHR 8) AND 0FFH, FORM AND 0FFH
   E40A   4E464F52         DB      'NFOR'
   E40E   E6CD             DB      (NFOR SHR 8) AND 0FFH, NFOR AND 0FFH
   E410   53574348         DB      'SWCH'
   E414   E0D1             DB      (EORNS SHR 8) AND 0FFH, EORNS AND 0FFH
   E416   53494D55         DB      'SIMU'
   E41A   F75C             DB      (SIMU SHR 8) AND 0FFH, SIMU AND 0FFH
   E41C   00               DB      0
   E41D   44554D50         DB      'DUMP'
   E421   E524             DB      (DUMP SHR 8) AND 0FFH, DUMP AND 0FFH
   E423   45584543         DB      'EXEC'
   E427   E277             DB      (EXEC SHR 8) AND 0FFH, EXEC AND 0FFH
   E429   454E5452         DB      'ENTR'
   E42D   E20D             DB      (ENTR SHR 8) AND 0FFH, ENTR AND 0FFH
   E42F   46494C45         DB      'FILE'
   E433   E5B0             DB      (FILE SHR 8) AND 0FFH, FILE AND 0FFH
   E435   4153534D         DB      'ASSM'
   E439   EAAF             DB      (ASSM SHR 8) AND 0FFH, ASSM AND 0FFH
   E43B   41535349         DB      'ASSI'
   E43F   EAAF             DB      (ASSM SHR 8) AND 0FFH, ASSM AND 0FFH
   E441   494F4452         DB      'IODR'
   E445   E0DE             DB      (IODR SHR 8) AND 0FFH, IODR AND 0FFH
   E447   53544142         DB      'STAB'
   E44B   EAA3             DB      (STAB SHR 8) AND 0FFH, STAB AND 0FFH
   E44D   53594D4C         DB      'SYML'
   E451   E47E             DB      (SYML SHR 8) AND 0FFH, SYML AND 0FFH
   E453   43555354         DB      'CUST'
   E457   E4F5             DB      (CUST SHR 8) AND 0FFH, CUST AND 0FFH
   E459   524E554D         DB      'RNUM'
   E45D   E769             DB      (RNUM SHR 8) AND 0FFH, RNUM AND 0FFH
   E45F   464D4F56         DB      'FMOV'
   E463   E731             DB      (FMOV SHR 8) AND 0FFH, FMOV AND 0FFH
   E465   45444954         DB      'EDIT'
   E469   FA0B             DB      (TXT2 SHR 8) AND 0FFH, TXT2 AND 0FFH
   E46B   4155544F         DB      'AUTO'
   E46F   F96A             DB      (AUTO SHR 8) AND 0FFH, AUTO AND 0FFH
   E471   46494E44         DB      'FIND'
   E475   FF3B             DB      (FIND2 SHR 8) AND 0FFH, FIND2 AND 0FFH
   E477   5445524D         DB      'TERM'
   E47B   F3E4             DB      (TERM SHR 8) AND 0FFH, TERM AND 0FFH
   E47D   00               DB      0
                   ;
                   ;SYSTEM SYMBOL TABLE ROUTINES
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 16
      


                   ;
   E47E   21E8D1   SYML:   LXI     H,IBUF+4        ;POINT TO FIFTH CHAR
   E481   7E               MOV     A,M             ;GET IT
   E482   FE45             CPI     'E'             ;SYMLE - ENTER INTO TABLE ?
   E484   CAABE4           JZ      LE4AB           ;YES - MAKE AN ENTRY
   E487   FE44             CPI     'D'             ;SYMLD - DELETE FROM TABLE ?
   E489   CAB4E4           JZ      LE4B4           ;YES - DELETE IT THEN
                   ;
                   ;PRINT CONTENTS OF SYSTEM SYMBOL TABLE
                   ;
   E48C   2100D3           LXI     H,SYSYM         ;POINT TO SYSTEM SYMBOL TABLE
   E48F   3E04     LE48F:  MVI     A,4             ;PRINT 4 ACROSS
   E491   32F3D0           STA     CCNT            ;SAVE AS COUNT
   E494   CD16E2           CALL    CRLF            ;START ON NEW LINE
   E497   7E       LE497:  MOV     A,M             ;GET 1ST CHAR
   E498   B7               ORA     A               ;END OF TABLE ?
   E499   CAEEE4           JZ      LE4EE           ;THEN PRINT END ADDRESS
   E49C   CDA8EE           CALL    LEEA8           ;PRINT 1 SYMBOL & VALUE
   E49F   13               INX     D               ;POINT TO NEXT SYMBOL
   E4A0   21F3D0           LXI     H,CCNT          ;POINT AT COUNT
   E4A3   35               DCR     M               ;DCR NO LEFT THIS LINE
   E4A4   EB               XCHG                    ;TABLE POINTER TO H,L
   E4A5   C297E4           JNZ     LE497           ;PRINT MORE THIS LINE
   E4A8   C38FE4           JMP     LE48F           ;OR START NEW LINE
                   ;
                   ;ENTER NEW SYMBOL INTO TABLE
                   ;
   E4AB   CD1CE5   LE4AB:  CALL    VCHK            ;CHECK FOR VALID VALUE & NAME
   E4AE   CDCEE4   LE4AE:  CALL    LE4CE           ;VALIDATE NAME & MOVE TO ABUF
   E4B1   C3E2EC           JMP     LECE2           ;PUT SYMBOL INTO TABLE
                   ;
                   ;DELETE SYMBOL
                   ;
   E4B4   CDAEE4   LE4B4:  CALL    LE4AE           ;H,L POINTS TO VALUE ON RET
   E4B7   23       LE4B7:  INX     H               ;POINT TO 2ND CHAR OF VALUE
   E4B8   23               INX     H               ;POINT TO NEXT SYMBOL
   E4B9   EB               XCHG                    ;D,E POINT AT SYM. AFTR DELETED
   E4BA   21F9FF           LXI     H,-(NMLEN+2)    ;SYMBOL TABLE ENTRY LENGTH
   E4BD   19               DAD     D               ;H,L POINTS AT BEG. OF ENTRY
   E4BE   1A               LDAX    D               ;GET CHAR FROM TABLE ENTRY
   E4BF   B7       LE4BF:  ORA     A               ;SET FLAGS
   E4C0   0607             MVI     B,(NMLEN+2)     ;ENTRY LENGTH
   E4C2   77       LE4C2:  MOV     M,A             ;MOVE CHAR UP IN TABLE
   E4C3   C8               RZ                      ;IF END OF TABLE MOVED
   E4C4   23               INX     H               ;INR DEST. POINTER
   E4C5   13               INX     D               ;INR SOURCE POINTER
   E4C6   1A               LDAX    D               ;GET NEXT CHAR FROM SYMBOL
   E4C7   05               DCR     B               ;COUNT OF CHRS THIS SYMBOL
   E4C8   C2C2E4           JNZ     LE4C2           ;IF NOT DONE THIS SYMBOL
   E4CB   C3BFE4           JMP     LE4BF           ;TO MOVE NEXT SYMBOL UP
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 17
      


                   ;ROUTINE TO VALIDATE A SYMBOL NAME & MOVE IT TO ABUF
                   ;
   E4CE   CD6AE2   LE4CE:  CALL    ZBUF            ;BLANK OUT ABUF
   E4D1   EB               XCHG                    ;H,L POINT TO START OF ABUF
   E4D2   22D4D0           SHLD    ADDS            ;SAVE ADDRESS
   E4D5   11D7D0           LXI     D,FBUF          ;POINT AT FILE-NAME BUFFER
   E4D8   EB               XCHG                    ;H,L=FBUF & D,E=ABUF
   E4D9   AF               XRA     A               ;GET A ZERO
   E4DA   32DCD0           STA     FREAD           ;SAVE AS 1ST FREE ADDRESS
   E4DD   7E               MOV     A,M             ;GET 1ST CHAR OF NAME
   E4DE   B7               ORA     A               ;ZERO ?
   E4DF   CADDE7           JZ      WHAT            ;ERROR IF NO NAME GIVEN
   E4E2   CD54F1           CALL    LF154           ;MOVE THE NAME IF IT'S VALID
   E4E5   FE21             CPI     21H             ;MAKE SURE SPACE FOLLOWS NAME
   E4E7   D2DDE7           JNC     WHAT            ;ERROR IF SPACE DOESN'T FOLLOW
   E4EA   2AEFD0           LHLD    BBUF            ;GET VALUE
   E4ED   C9               RET                     ;RETURN W/VALUE IN H,L
                   ;
                   ;DO A CR/LF AND PRINT ASCII CONTENTS OF ADDR POINTED TO BY H,L
                   ;
   E4EE   EB       LE4EE:  XCHG                    ;POINTER FROM D,E TO H,L
   E4EF   CD16E2           CALL    CRLF            ;START ON NEW LINE
   E4F2   C35CE5           JMP     ADOUT           ;PRINT ADDR POINTED TO BY H,L
                   ;
                   ;CUSTOM COMMAND TABLE MANAGEMENT
                   ;
   E4F5   21E8D1   CUST:   LXI     H,IBUF+4        ;POINT AT 5TH CHAR
   E4F8   7E               MOV     A,M             ;GET IT
   E4F9   FE45             CPI     'E'             ;ENTER NEW CUST. COMMAND ?
   E4FB   CA09E5           JZ      LE509           ;YES - DO IT
   E4FE   FE44             CPI     'D'             ;DELETE CUSTOM COMMAND ?
   E500   CA04E0           JZ      LE004           ;YES - DO IT
   E503   215CD2           LXI     H,CUCOM         ;POINT AT CUSTOM COMMAND TABLE
   E506   C38FE4           JMP     LE48F           ;PRINT USING SYML ROUTINES
                   ;
                   ;ENTER AND DELETE MOSTLY USE SYMLE & SYMLD CODE
                   ;
   E509   CD1CE5   LE509:  CALL    VCHK            ;MAKE SURE VALUE GIVEN
   E50C   CDCEE4   LE50C:  CALL    LE4CE           ;VALIDATE NAME & MOVE TO ABUF
   E50F   115CD2           LXI     D,CUCOM         ;D,E POINT AT CUST. TABLE
   E512   C3E5EC           JMP     LECE5           ;PUT VALUE INTO TABLE
                   ;
                   ;ROUTINE TO EXTRACT VALUES FROM COMMAND LINE & REPORT AN ERROR
                   ;
   E515   CD81E2   VALC:   CALL    ETRA            ;ETRA DOES THE REAL WORK
   E518   DADDE7           JC      WHAT            ;IF AN ERROR OCCURED
   E51B   C9               RET                     ;DONE, NO ERROR
                   ;
                   ;ROUTINE TO VERIFY THAT REQUIRED PARAMETERS WERE ENTERED
                   ;
   E51C   3ADFD0   VCHK:   LDA     ABUF            ;GET 1ST CHAR OF ABUF
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 18
      


   E51F   B7               ORA     A               ;ZERO ?
   E520   CADDE7           JZ      WHAT            ;ERROR - REQD. PARM. OMITTED
   E523   C9               RET                     ;DONE
                   ;
                   ;THE DUMP COMMAND
                   ;
   E524   CD1CE5   DUMP:   CALL    VCHK            ;MAKE SURE ADDRESS GIVEN
   E527   3E10             MVI     A,16            ;16 VALUES PER LINE
   E529   32F3D0           STA     CCNT            ;SAVE AS COUNT
   E52C   CD16E2   LE52C:  CALL    CRLF            ;START NEW LINE
   E52F   2AEFD0           LHLD    BBUF            ;GET ADDRESS
   E532   EB               XCHG                    ;DO D,E
   E533   CD5CE5           CALL    ADOUT           ;PRINT ADDRESS ON LEFT OF LINE
   E536   063A             MVI     B,':'           ;FOLLOW ADDRESS WITH COLON
   E538   CDCFD0           CALL    OUT8            ;PRINT IT
   E53B   CD5CE3           CALL    LE35C           ;PUT OUT A SPACE
   E53E   3AF3D0           LDA     CCNT            ;GET COUNT OF ADDRS/LINE
   E541   32F4D0   LE541:  STA     DCNT            ;SAVE AS DUMP COUNT
   E544   2AEFD0           LHLD    BBUF            ;GET ADDR TO DUMP
   E547   7E               MOV     A,M             ;GET DATA AT THAT ADDR
   E548   CD6FE5           CALL    DUMO            ;PRINT ITS VALUE
   E54B   CD5CE3           CALL    LE35C           ;PUT A SPACE OUT
   E54E   CD69E3           CALL    ACHK            ;COMPARE BBUF & BBUF+2
   E551   D8               RC                      ;REACHED END ADDRS. - DONE
   E552   3AF4D0           LDA     DCNT            ;ELSE GET DUMP COUNT
   E555   3D               DCR     A               ;DCR COUNT BYTES LEFT THIS LINE
   E556   C241E5           JNZ     LE541           ;DO MORE BYTES ON THIS LINE
   E559   C32CE5           JMP     LE52C           ;DO ANOTHER LINE
                   ;
                   ;ROUTINE TO PUT OUT AN ADDRESS
                   ;
                   ;NOTE THAT THIS ROUTINE TAKES ADVANTAGE (?) OF THE FACT THAT
                   ;BINO USES THE CARRY BIT TO OUTPUT A SINGLE BYTE IN A AS
                   ;XXX WHERE XXX MAY BE 777 (INCLUDING CARRY) AND IS NOT
                   ;LIMITED TO 377.  ADDRESSES THUS COME OUT AS A SINGLE 16 BIT
                   ;NUMBER RATHER THAN IN THE MORE COMMON "SPLIT OCTAL" CONSISTING
                   ;OF TWO SEPERATE 8 BIT QUANTITIES WITH A MAX VALUE OF 377 EACH.
                   ;
   E55C   3A2FD1   ADOUT:  LDA     SMODE           ;GET CURRENT MODE
   E55F   B7               ORA     A               ;CLEAR CARRY & SET ZERO FLAG
   E560   7A               MOV     A,D             ;HIGH ORDER BYTE TO A
   E561   CA65E5           JZ      LE565           ;SKIP NEXT PART IF BASE HEX
   E564   1F               RAR                     ;LOW ORDER BIT TO CARRY FOR OCT
   E565   57       LE565:  MOV     D,A             ;RESTORE HIGH ORDER BYTE
   E566   17               RAL                     ;SHIFT LEFT 1 BIT THRU ACCUM.
   E567   4F               MOV     C,A             ;LOW BIT/CARRY IN C FOR OCTAL
   E568   7A               MOV     A,D             ;GET HIGH ORDER BYTE
   E569   CD6FE5           CALL    DUMO            ;OUTPUT USING CURRENT MODE
   E56C   79               MOV     A,C             ;FOR OCTAL, GET ORIG HIGH BYTE
   E56D   1F               RAR                     ;SET CARRY BIT
   E56E   7B               MOV     A,E             ;GET LOW ORDER BYTE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 19
      


   E56F   212FD1   DUMO:   LXI     H,SMODE         ;POINT TO MODE
   E572   46               MOV     B,M             ;GET IT
   E573   05               DCR     B               ;DECR (OCTAL MODE = 1)
   E574   CA53E3           JZ      OOUT            ;FOR OCTAL
   E577   CD90E3   HOUT:   CALL    BINH            ;CONVERT BIN TO HEX IN ADDS
   E57A   21D4D0   LE57A:  LXI     H,ADDS          ;BUFFER WHERE CHARS STORED
   E57D   46               MOV     B,M             ;GET CHAR IN B
   E57E   CDCFD0           CALL    OUT8            ;PRINT A HEX ASCII CHAR
   E581   23               INX     H               ;INX POINTER
   E582   46               MOV     B,M             ;GET NEXT CHAR
   E583   C3CFD0           JMP     OUT8            ;PRINT IT & GO HOME
   E586   CD77E5   HOTB:   CALL    HOUT            ;PUT OUT HEX
   E589   C35CE3           JMP     LE35C           ;PUT OUT SPACE & GO HOME
                   ;
                   ;MODE - USED TO SET THE OUTPUT MODE
                   ;
   E58C   CD1CE5   MODE:   CALL    VCHK            ;VERIFY PARAMETER GIVEN
   E58F   01DFD0           LXI     B,ABUF          ;POINT TO PARAMETER
   E592   CDFAE2           CALL    AHEX            ;CONVERT TO BINARY
   E595   DADDE7           JC      WHAT            ;IF PARAMETER INVALID
   E598   7C               MOV     A,H             ;GET HIGH ORDER BYTE
   E599   B7               ORA     A               ;SET FLAGS
   E59A   C2DDE7           JNZ     WHAT            ;PARM. MUST BE < 256
   E59D   0600             MVI     B,0             ;ASSUME HEX SPECIFIED
   E59F   7D               MOV     A,L             ;GET LOW ORDER PARMATER
   E5A0   FE16             CPI     16H             ;IS PARAMETER 16 ?
   E5A2   CAABE5           JZ      LE5AB           ;YES - STORE 0 AS MODE
   E5A5   04               INR     B               ;MAKE B = MODE = 1
   E5A6   FE08             CPI     8               ;IS PARAMETER 8 ?
   E5A8   C2DDE7           JNZ     WHAT            ;MUST BE EITHER 8 OR 16
   E5AB   78       LE5AB:  MOV     A,B             ;GET MODE (REG B)
   E5AC   322FD1           STA     SMODE           ;MAKE IT THE MODE
   E5AF   C9               RET                     ;WE ARE DONE
                   ;
                   ;PROCESS THE FILE COMMANDS
                   ;
   E5B0   3AD7D0   FILE:   LDA     FBUF            ;GET 1ST CHAR OF FILE NAME
   E5B3   B7               ORA     A               ;SET FLAGS
   E5B4   CA18E6           JZ      FOUT            ;NO NAME GIVEN - DO A LISTING
   E5B7   CD8AE6           CALL    FSEA            ;LOOK UP FILE
   E5BA   EB               XCHG                    ;D,E HAS ADDR OF DIR. ENTRY
   E5BB   C2D2E5           JNZ     TEST            ;IF DIR. ENTRY FOUND
                   ;
                   ;ENTRY MATCHING FBUF NOT FOUND
                   ;
   E5BE   3ADFD0           LDA     ABUF            ;CHECK FOR PARAMETER GIVEN
   E5C1   B7               ORA     A               ;SET FLAGS
   E5C2   CADDE7           JZ      WHAT            ;ADDR. REQUIRED FOR NEW FILE
                   ;
                   ;CHECK FOR ROOM TO ADD A NEW FILE
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 20
      


   E5C5   3ADED0           LDA     FEF             ;GET FREE ENTRY FOUND FLAG
   E5C8   B7               ORA     A               ;SET FLAGS
   E5C9   C2E7E5           JNZ     ROOM1           ;TO ADD THE NEW FILE
   E5CC   21F7E7   LE5CC:  LXI     H,EMES1         ;POINT TO ERROR MESSAGE
   E5CF   C3E0E7           JMP     MESS            ;PRINT IT
                   ;
                   ;ENTRY MATCHING FBUF FOUND
                   ;
   E5D2   3ADFD0   TEST:   LDA     ABUF            ;SEE IF PARAMETER GIVEN
   E5D5   B7               ORA     A               ;SET FLAGS
   E5D6   CAEAE5           JZ      SWAPS           ;NO PARMS - MAKE IT CUR FILE
   E5D9   2AEFD0           LHLD    BBUF            ;GET BINARY VALU OF PARM
   E5DC   7C               MOV     A,H             ;HIGH ORDER BYTE
   E5DD   B5               ORA     L               ;SEE IF PARM IS ZERO
   E5DE   CAEAE5           JZ      SWAPS           ;TO DELETE THE FILE
   E5E1   21FCE7   LE5E1:  LXI     H,EMES2         ;CAN'T RESPECIFY EXISTING FILE
   E5E4   C3E0E7           JMP     MESS            ;TELL IT TO THE OPERATOR
                   ;
                   ;CREATE NEW FILE - NAME IS IN FBUF
                   ;FREAD POINTS TO A FREE DIRECTORY ENTRY
                   ;
   E5E7   CD76E6   ROOM1:  CALL    ROOM            ;MOVE NAME IN FBUF TO DIRECTORY
                   ;
                   ;MAKE FILE POINTED TO BY D,E CURRENT
                   ;
   E5EA   2100D0   SWAPS:  LXI     H,FILE0         ;POINT H,L TO CUR FILE
   E5ED   0E0D             MVI     C,FELEN         ;BYTE COUNT
   E5EF   1A       SWAP:   LDAX    D               ;GET A BYTE FROM NEW CUR FILE
   E5F0   46               MOV     B,M             ;GET BYTE FROM CUR CUR FILE
   E5F1   77               MOV     M,A             ;NEW CUR FILE BYTE TO FILE 0
   E5F2   78               MOV     A,B             ;EXCHANGE
   E5F3   12               STAX    D               ;CUR CUR FILE BYTE TO FREAD
   E5F4   13               INX     D               ;INR NON-CURRENT FILE POINTER
   E5F5   23               INX     H               ;INR FILE 0 POINTER
   E5F6   0D               DCR     C               ;COUNT OF BYTES TO MOVE
   E5F7   C2EFE5           JNZ     SWAP            ;IF NOT DONE SWAPPING ENTRIES
                   ;
                   ;CHECK FOR 2ND PARAMETER (ADDRESS)
                   ;
   E5FA   3ADFD0           LDA     ABUF            ;GET 2ND PARAMETER 1ST CHAR
   E5FD   B7               ORA     A               ;SET FLAGS
   E5FE   CA18E6           JZ      FOUT            ;NONE GIVEN
                   ;
                   ;PROCESS 2ND PARAMETER
                   ;
   E601   2AEFD0           LHLD    BBUF            ;GET 2ND PARAMETER ADDRESS
   E604   2205D0           SHLD    BOFP            ;MAKE IT BEG OF FILE POINTER
   E607   2207D0           SHLD    EOFP            ;AND END OF FILE POINTER
   E60A   7D               MOV     A,L             ;TEST FOR ADDR = 0
   E60B   B4               ORA     H               ;
   E60C   CA11E6           JZ      FIL35           ;YES - DELETE IT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 21
      


   E60F   3601             MVI     M,1             ;NO - PUT EOF MARK AT BOFP
   E611   AF       FIL35:  XRA     A               ;BINARY ZERO
   E612   3209D0           STA     MAXL            ;AT MAX. LINE NO.
   E615   C325E6           JMP     FOOT            ;OUTPUT PARAMETERS
                   ;
                   ;LIST 1 OR MORE FILES & THEIR PARAMETERS
                   ;
   E618   CD16E2   FOUT:   CALL    CRLF            ;DO A CR/LF
   E61B   3AE8D1           LDA     IBUF+4          ;GET OPT. 5TH CHAR
   E61E   FE53             CPI     'S'             ;WAS COMMAND FILES ?
   E620   0E06             MVI     C,MAXFIL        ;MAX NO OF FILES
   E622   CA27E6           JZ      FOUL            ;YES - LIST ALL FILES
   E625   0E01     FOOT:   MVI     C,1             ;ELSE LIST ONLY 1 FILE
                   ;
                   ;LIST PARMS. FOR NO OF FILES IN REG C.
                   ;
   E627   2100D0   FOUL:   LXI     H,FILE0         ;POINT TO DIRECTORY
   E62A   79       LE62A:  MOV     A,C             ;GET NO FILES LEFT TO LIST
   E62B   32DED0   FINE:   STA     FOCNT           ;SAVE AS FILE OUTPUT COUNT
   E62E   E5               PUSH    H               ;SAVE DIRECTORY POINTER
   E62F   110500           LXI     D,NMLEN         ;NAME LENGTH
   E632   19               DAD     D               ;POINT AT FILES BOFP
   E633   7E               MOV     A,M             ;GET 1ST BYTE OF BOFP
   E634   B7               ORA     A               ;ZERO ?
   E635   C245E6           JNZ     FOOD            ;NO - LIST IT
   E638   23               INX     H               ;POINT AT 2ND BYTE OF BOFP
   E639   86               ADD     M               ;ADD TO 1ST BYTE
   E63A   23               INX     H               ;POINT TO EOFP 1ST BYTE
   E63B   C245E6           JNZ     FOOD            ;BOFP NON ZERO - LIST IT
   E63E   33               INX     SP              ;TO "UN-PUSH" H,L
   E63F   33               INX     SP              ;
   E640   23               INX     H               ;POINT TO 2ND BYTE OF EOFP
   E641   23               INX     H               ;POINT TO MAXL
   E642   C35AE6           JMP     FEET            ;TO GO TO NEXT ENTRY
                   ;
                   ;HAVE A VALID ENTRY TO OUTPUT
                   ;
   E645   E1       FOOD:   POP     H               ;GET POINTER TO FILES NAME
   E646   CD16E2           CALL    CRLF            ;START IT ON A FRESH LINE
   E649   0E05             MVI     C,NMLEN         ;LENGTH
   E64B   46       FAST:   MOV     B,M             ;GET A CHAR OF NAME
   E64C   CDCFD0           CALL    OUT8            ;PRINT IT
   E64F   0D               DCR     C               ;DECREMENT COUNT
   E650   23               INX     H               ;POINT TO NEXT CHAR
   E651   C24BE6           JNZ     FAST            ;PRINT REMAINING CHARS IF ANY
   E654   CD66E6           CALL    LE666           ;PRINT SPACE, BOFP, SPACE
   E657   CD66E6           CALL    LE666           ;PRINT SPACE, EOFP, SPACE
   E65A   110400   FEET:   LXI     D,FELEN-NMLEN-4 ;LENGTH OF MAXL
   E65D   19               DAD     D               ;POINT AT NEXT FILE ENTRY
   E65E   3ADED0           LDA     FOCNT           ;PRINTING 1 OR ALL ?
   E661   3D               DCR     A               ;DECR. COUNT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 22
      


   E662   C22BE6           JNZ     FINE            ;TO PRINT MORE
   E665   C9               RET                     ;DONE
                   ;
                   ;ROUTINE TO PRINT AN ADDRESS
                   ;
   E666   CD5CE3   LE666:  CALL    LE35C           ;PRINT SPACE
   E669   5E               MOV     E,M             ;GET BYTE OF BOFP OR EOFP
   E66A   23               INX     H               ;POINT TO 2ND BYTE
   E66B   56               MOV     D,M             ;GET IT
   E66C   E5               PUSH    H               ;SAVE POINTER INTO FILE DIR.
   E66D   CD5CE5           CALL    ADOUT           ;PRINT ADDRESS
   E670   CD5CE3           CALL    LE35C           ;AND TRAILING SPACE
   E673   E1               POP     H               ;RESTORE POINTER
   E674   23               INX     H               ;POINT TO MAXL
   E675   C9               RET                     ;DONE
                   ;
                   ;MOVE FILE NAME TO BLOCK POINTED TO BY FREAD
                   ;
   E676   2ADCD0   ROOM:   LHLD    FREAD           ;GET ADDR OF FREE ENTRY
   E679   EB               XCHG                    ;TO D,E
   E67A   21D7D0           LXI     H,FBUF          ;ADDR OF NAME IN COMMAND
   E67D   D5               PUSH    D               ;SAVE DIRECTORY ADDR
   E67E   0E05             MVI     C,NMLEN         ;NO CHARS TO MOVE
   E680   7E       MOV23:  MOV     A,M             ;GET CHAR FROM COMMAND
   E681   12               STAX    D               ;PUT INTO DIRECTORY
   E682   13               INX     D               ;INCR. DIR. POINTER
   E683   0D               DCR     C               ;DCR CHAR COUNT
   E684   23               INX     H               ;INCR. FBUF POINTER
   E685   C280E6           JNZ     MOV23           ;MOVE REMAINING CHARS
   E688   D1               POP     D               ;RESTORE DIR. POINTER
   E689   C9               RET                     ;DONE
                   ;
                   ;FILE DIRECTORY SEARCH ROUTINE
                   ;LOOK FOR ENTRY W/NAME IN FBUF - ZERO SET ==> NOT FOUND
                   ;ELSE H,L POINT TO THE ENTRY
                   ;ALSO, IF ENTRY FOUND W/BOFP ADDR = 0, SET FEF FLAG > 0
                   ;AND FREAD TO THE ADDR OF THAT ENTRY
                   ;
   E68A   1100D0   FSEA:   LXI     D,FILE0         ;POINT TO DIRECTORY
   E68D   AF       LE68D:  XRA     A               ;GET ZERO
   E68E   32DED0           STA     FEF             ;ASSUME NO FREE ENTRIES
   E691   0606             MVI     B,MAXFIL        ;NO OF ENTRIES IN DIR.
   E693   21D7D0   FSE10:  LXI     H,FBUF          ;ADDR OF NAME TO LOOK UP
   E696   0E05             MVI     C,NMLEN         ;NO CHARS PER NAME
   E698   CD57E2           CALL    SEAR            ;COMPARE CURRENT ENTRY TO FBUF
   E69B   F5               PUSH    PSW             ;SAVE RESULTS FLAG
   E69C   D5               PUSH    D               ;SAVE DIR POINTER
   E69D   1A               LDAX    D               ;GET BYTE OF BOFP ADDR
   E69E   B7               ORA     A               ;EMPTY ?
   E69F   C2C0E6           JNZ     FSE20           ;NO
   E6A2   13               INX     D               ;2ND BYTE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 23
      


   E6A3   1A               LDAX    D               ;GET IT
   E6A4   B7               ORA     A               ;SET FLAGS
   E6A5   C2C0E6           JNZ     FSE20           ;NOT ZERO
   E6A8   EB               XCHG                    ;DIR POINTER TO H,L
   E6A9   11FAFF           LXI     D,-NMLEN-1      ;
   E6AC   19               DAD     D               ;POINT BACK TO EMPTY ENTRY
   E6AD   22DCD0           SHLD    FREAD           ;AND SAVE IT'S ADDRESS
   E6B0   7A               MOV     A,D             ;D HAPPENS TO BE NON-ZERO
   E6B1   32DED0           STA     FEF             ;AND SO NOW IS FEF
   E6B4   E1               POP     H               ;RESTORE DIR POINTER TO H,L
   E6B5   F1               POP     PSW             ;RESTORE SEAR RESULTS FLAG
                   ;
                   ;MOVE TO NEXT ENTRY
                   ;
   E6B6   110800   FSE15:  LXI     D,FELEN-NMLEN
   E6B9   19               DAD     D               ;H,L POINTS TO NEXT ENTRY
   E6BA   EB               XCHG                    ;ENTRY ADDR TO D,E
   E6BB   05               DCR     B               ;COUNT OF FILES IN DIR
   E6BC   C8               RZ                      ;NO FILES LEFT TO SEARCH
   E6BD   C393E6           JMP     FSE10           ;SEARCH REMAINING FILES
                   ;
                   ;ENTRY WASN'T FREE, LOOK AT SEAR RESULTS
                   ;
   E6C0   E1       FSE20:  POP     H               ;RESTORE DIRECTORY POINTER
   E6C1   F1               POP     PSW             ;SEAR RESULTS IN FLAG
   E6C2   C2B6E6           JNZ     FSE15           ;IT DIDN'T MATCH ANYWAY
                   ;
                   ;MATCHING ENTRY FOUND WHICH WASN'T FREE
                   ;
   E6C5   11FBFF           LXI     D,-NMLEN
   E6C8   19               DAD     D               ;H,L POINT AT THE DIR. ENTRY
   E6C9   7A               MOV     A,D             ;D IS NON-ZERO
   E6CA   B7               ORA     A               ;SET FLAGS TO CLEAR ZERO FLAG
   E6CB   C9               RET                     ;DONE
                   ;
                   ;FORM COMMAND TO SET OUTPUT MODE
                   ;
   E6CC   2F       FORM:   CMA                     ;ALL COMNDS ARE EXEC WITH A=0
   E6CD   32FAD0   NFOR:   STA     LFMT            ;
   E6D0   C360E0           JMP     EORMS           ;IT'S THAT SIMPLE, FOLKS
                   ;
                   ;FCHK
                   ;
   E6D3   2A05D0   FCHK:   LHLD    BOFP            ;GET BEG. OF FILE PTR
   E6D6   7C               MOV     A,H             ;SEE IF BOFP IS ZERO
   E6D7   B5               ORA     L               ;WOULD IMPLY NO FILES
   E6D8   CAE1E5           JZ      LE5E1           ;PRINT ERROR MESSAGE
   E6DB   010400           LXI     B,4             ;LENGTH OF LINE NO.
   E6DE   09               DAD     B               ;H,L POINTS JUST PAST LINE NO
   E6DF   0C               INR     C               ;C = 5 = LINE LEN TO THIS PT.
   E6E0   23       LE6E0:  INX     H               ;POINT TO NEXT CHAR
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 24
      


   E6E1   0C               INR     C               ;LINE LENGTH TO THIS POINT
   E6E2   CD2BE7           CALL    LE72B           ;GET TERM WIDTH IN A
   E6E5   B9               CMP     C               ;LINE > TERMINAL WIDTH ?
   E6E6   DA18E7           JC      LE718           ;YES - ERROR
   E6E9   7E               MOV     A,M             ;GET LINE CHAR
   E6EA   FE0D             CPI     0DH             ;END OF LINE ?
   E6EC   C2E0E6           JNZ     LE6E0           ;KEEP TESTING THIS LINE
   E6EF   2A05D0           LHLD    BOFP            ;GET BEG. OF FILE PTR
   E6F2   71               MOV     M,C             ;MAKE LENGTH BYTE OK 1ST LINE
   E6F3   7E       LE6F3:  MOV     A,M             ;GET LENGTH BYTE
   E6F4   FE01             CPI     1               ;END OF FILE ?
   E6F6   CA25E7           JZ      LE725           ;TO RESET MAXL
   E6F9   FE06             CPI     6               ;MIN LINE LEN (NO. + LEN + CR)
   E6FB   DA18E7           JC      LE718           ;REPORT ERROR IF LINE TOO SHORT
   E6FE   CD2BE7           CALL    LE72B           ;GET TERMINAL WIDTH IN A
   E701   BE               CMP     M               ;COMPARE WITH LENGTH BYTE
   E702   4E               MOV     C,M             ;LENGTH BYTE TO C
   E703   0D               DCR     C               ;GOING TO COUNT CHARS IN LINE
   E704   0D       LE704:  DCR     C               ;COUNT OF ACUTAL CHARS LEFT
   E705   23               INX     H               ;POINT TO NEXT CHAR
   E706   7E               MOV     A,M             ;GET IT
   E707   CA12E7           JZ      LE712           ;COUNT TO 0 - MUST BE C/R
   E70A   FE20             CPI     20H             ;IS CHAR CNTL CHAR ?
   E70C   DA18E7           JC      LE718           ;CNTL CHARS NOT ALLOWED
   E70F   C304E7           JMP     LE704           ;TEST NEXT CHAR IN LINE
   E712   FE0D     LE712:  CPI     0DH             ;IS CHAR C/R ?
   E714   23               INX     H               ;POINT TO NEXT CHAR
   E715   CAF3E6           JZ      LE6F3           ;YES - GO ON, CHECK FOR EOF
                   ;
                   ;ERROR
                   ;
   E718   EB       LE718:  XCHG                    ;BAD ADDRESS TO D,E
   E719   CD5CE3           CALL    LE35C           ;PRINT A SPACE
   E71C   CD5CE5           CALL    ADOUT           ;FOLLOWED BY THE BAD ADDRESS
   E71F   2101E8           LXI     H,FERR          ;POINT TO FILE ERROR MESSAGE
   E722   C3E0E7           JMP     MESS            ;PRINT THE ERROR MESSAGE
   E725   CD50EA   LE725:  CALL    LEA50           ;UPDATE MAXL
   E728   C318E6           JMP     FOUT            ;PRINT FILE PARMS & RETURN
   E72B   3A8FD1   LE72B:  LDA     TERMW           ;GET TERM WIDTH
   E72E   C61B             ADI     -(IBUF+1) AND 0FFH
   E730   C9               RET                     ;BINARY TERM WIDTH IN A
                   ;
                   ;FILE MOVE COMMANDS
                   ;
   E731   CD1CE5   FMOV:   CALL    VCHK            ;CHECK FOR REQD PARMS
   E734   2A05D0           LHLD    BOFP            ;GET BEG OF FILE PTR
   E737   EB               XCHG                    ;BOFP TO D,E
   E738   2AEFD0           LHLD    BBUF            ;GET DEST ADDR
   E73B   2205D0           SHLD    BOFP            ;NEW BEG OF FILE
   E73E   7D               MOV     A,L             ;LOW ORDER DEST TO A
   E73F   93               SUB     E               ;SUBRACTING CUR BOF FROM NEW
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 25
      


   E740   7C               MOV     A,H             ;TO SEE WHICH WAY TO MOVE
   E741   9A               SBB     D               ;ANSWER NOW IN CARRY FLAG
   E742   DA60E7           JC      LE760           ;IF MOVING TO LOWER ADDR
                   ;
                   ;MOVING TO HIGHER ADDR
                   ;
   E745   2A07D0           LHLD    EOFP            ;MOVING TO HIGHER ADDR
   E748   7D               MOV     A,L             ;GOING TO SUBTRACT CUR (OLD)
   E749   93               SUB     E               ;BOFP FROM CUR EOFP & PUT
   E74A   4F               MOV     C,A             ;RESULT (FILE LENGTH) IN
   E74B   7C               MOV     A,H             ;REG B,C
   E74C   9A               SBB     D               ;
   E74D   47               MOV     B,A             ;
   E74E   2A05D0           LHLD    BOFP            ;GET DEST BEG OF FILE
   E751   09               DAD     B               ;ADD LENGTH = NEW END
   E752   EB               XCHG                    ;NEW END IN D,E
   E753   3602             MVI     M,2             ;PUT 02H AT CUR BEG OF FILE
   E755   4E               MOV     C,M             ;AND IN REG C
   E756   2A07D0           LHLD    EOFP            ;GET CUR END OF FILE TO H,L
   E759   EB               XCHG                    ;CUR EOF=D,E & NEW END H,L
   E75A   CD79E9           CALL    RMOV            ;DO THE MOVE
   E75D   C365E7           JMP     LE765           ;PUT 02H AT BOF AND FCHK
                   ;
                   ;MOVING LOWER IN MEMORY
                   ;
   E760   0E01     LE760:  MVI     C,1             ;LMOV WILL USE 01H AS END MARK
   E762   CD70E9           CALL    LMOV            ;DO THE MOVE
   E765   71       LE765:  MOV     M,C             ;PUT TERMINATOR MARK IN FILE
   E766   C3D3E6           JMP     FCHK            ;FCHK TO UPDATE 1ST L.B. & EOF
                   ;
                   ;RENUMBER COMMAND
                   ;
   E769   CD1CE5   RNUM:   CALL    VCHK            ;CHECK FOR REQD. PARAMETERS
   E76C   3AE6D0           LDA     ABUF+7          ;SEE IF INCREMENT SPECIFIED
   E76F   0605             MVI     B,5             ;DEFAULT INCREMENT
   E771   B7               ORA     A               ;SET FLAGS
   E772   CA85E7           JZ      LE785           ;NO INCREMENT GIVEN, USE 5
   E775   01E6D0           LXI     B,ABUF+7        ;POINT AT GIVEN INCREMENT
   E778   CD0AE0           CALL    ADEC            ;CONVERT TO DECIMAL
   E77B   DADDE7           JC      WHAT            ;IF ERROR
   E77E   7D               MOV     A,L             ;GET INCREMENT
   E77F   FE1A             CPI     26              ;MAXIMUM INCREMENT + 1
   E781   D2DDE7           JNC     WHAT            ;IF INCREMENT > 25
   E784   47               MOV     B,A             ;INCREMENT IN B
   E785   2A05D0   LE785:  LHLD    BOFP            ;GET BOF POINTER
   E788   22D2D0           SHLD    APNT            ;SAVE
   E78B   7E       LE78B:  MOV     A,M             ;GET LENGTH BYTE
   E78C   FE01             CPI     1               ;END OF FILE ?
   E78E   CAD3E6           JZ      FCHK            ;YES, DONE, DO FCHK
   E791   23               INX     H               ;POINT 1ST DIGIT
   E792   11DFD0           LXI     D,ABUF          ;STARTING LINE NO. SOURCE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 26
      


   E795   0E04             MVI     C,4             ;LENGTH OF LINE NO.
   E797   1A       LE797:  LDAX    D               ;GET A DIGIT
   E798   77               MOV     M,A             ;PUT IT IN THE LINE
   E799   23               INX     H               ;POINT TO NEXT DIGIT
   E79A   13               INX     D               ;IN SOURCE, TOO
   E79B   0D               DCR     C               ;COUNT OF DIGITS LEFT
   E79C   C297E7           JNZ     LE797           ;DO NEXT DIGITS
   E79F   2AD2D0           LHLD    APNT            ;GET POINTER TO LINE
   E7A2   7E               MOV     A,M             ;GET LENGTH BYTE
   E7A3   CD6BE9           CALL    ADR             ;POINT TO NEXT LINE
   E7A6   22D2D0           SHLD    APNT            ;UPDATE LINE POINTER
   E7A9   2B               DCX     H               ;POINT TO LAST CHR OF PREV LINE
   E7AA   7E               MOV     A,M             ;GET IT
   E7AB   FE0D             CPI     0DH             ;IS IT A CARRIAGE RET ?
   E7AD   C218E7           JNZ     LE718           ;DOING A LITTLE FCHKING HERE
   E7B0   21E2D0           LXI     H,ABUF+3        ;POINT TO LSB OF LINE NO.
   E7B3   7E               MOV     A,M             ;GET IT
   E7B4   80               ADD     B               ;ADD INCREMENT
   E7B5   FE3A     LE7B5:  CPI     '9'+1           ;CARRY ?
   E7B7   D2CCE7           JNC     LE7CC           ;NO - CONTINUE
   E7BA   77               MOV     M,A             ;PUT UPDATED DIGIT BACK
   E7BB   3ADFD0           LDA     ABUF            ;GET MSB
   E7BE   FE39             CPI     '9'             ;EQUAL 9 ?
   E7C0   D4C9E7           CNC     LE7C9           ;IF SO, CHANGE INCREMENT TO 1
   E7C3   2AD2D0           LHLD    APNT            ;GET POINTER TO NEXT LINE
   E7C6   C38BE7           JMP     LE78B           ;AND DO IT
                   ;
                   ;CHANGE INCREMENT TO 1 IF NOS. GET TO 9000
                   ;
   E7C9   0601     LE7C9:  MVI     B,1             ;NEW INCREMENT
   E7CB   C9               RET
                   ;
                   ;GET HERE IF ADDITION GAVE CARRY
                   ;
   E7CC   0E00     LE7CC:  MVI     C,0             ;C WILL BECOME DECIMAL CARRY
   E7CE   0C       LE7CE:  INR     C               ;INR FOR EA SUBTR. OF 10
   E7CF   D60A             SUI     10              ;SUB 10 FROM ADDITION RESULT
   E7D1   FE3A             CPI     '9'+1           ;RESULT STILL > 9 ?
   E7D3   D2CEE7           JNC     LE7CE           ;SUB AGAIN & KEEP CNT OF SUBTR
   E7D6   77               MOV     M,A             ;LESS THAN 10 - PUT DIGIT BACK
   E7D7   2B               DCX     H               ;POINT TO NEXT MSB
   E7D8   7E               MOV     A,M             ;GET IT
   E7D9   81               ADD     C               ;ADD CARRY FROM PREV. DIGIT
   E7DA   C3B5E7           JMP     LE7B5           ;AND REPEAT THE PROCESS
                   ;
                   ;GENERAL ERROR MESSAGE ROUTINES
                   ;
   E7DD   21F1E7   WHAT:   LXI     H,EMES
   E7E0   CD16E2   MESS:   CALL    CRLF            ;DO CR/LF
   E7E3   E5               PUSH    H               ;SAVE H,L
   E7E4   2194D0           LXI     H,SYSIN         ;RESTORE STD I/O DRIVERS
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 27
      


   E7E7   CD5AE1           CALL    LE15A           ;DO IT
   E7EA   E1               POP     H               ;RESTORE H,L
   E7EB   CD80E3           CALL    SCRN            ;PRINT THE MSG POINTED TO BY H,L
   E7EE   C3CBE0           JMP     LE0CB           ;GO BACK TO ALS-8 COMND MODE
                   ;
                   ;MESSAGES
                   ;
   E7F1   57484154 EMES:   DB      'WHAT?', 0DH
   E7F5   3F0D    
   E7F7   46554C4C EMES1:  DB      'FULL', 0DH
   E7FB   0D      
   E7FC   46434F4E EMES2:  DB      'FCON', 0DH
   E800   0D      
   E801   2046494C FERR:   DB      ' FILE ERR', 0DH
   E805   45204552
   E809   520D    
                   ;
                   ;THIS IS THE PROCESSING PORTION OF THE ENTER COMMAND
                   ;
   E80B   CD16E2   ENTS:   CALL    CRLF            ;START ON A NEW LINE
   E80E   CD72E1           CALL    READ            ;GET A LINE OF INPUT
   E811   21E4D1           LXI     H,IBUF          ;POINT TO IT'S START
   E814   2201D1           SHLD    PNTR            ;SAVE POINTER
   E817   CD6AE2   ENT1:   CALL    ZBUF            ;CLEAR ASCII BUFFER
   E81A   CDCCEE           CALL    SBLK            ;SCAN TO CHARACTERS IN IBUF
   E81D   DA0BE8           JC      ENTS            ;C/R FOUND, GET ANOTHER LINE
   E820   FE2F             CPI     '/'             ;ENTER TERMINATION CHAR ?
   E822   C8               RZ                      ;YES - DONE THEN
   E823   CD3EF1           CALL    ALPS            ;LOAD ABUF FROM IBUF
   E826   EB               XCHG                    ;
   E827   01DFD0           LXI     B,ABUF          ;POINT TO THE LOADED BUFR
   E82A   3A2FD1           LDA     SMODE           ;GET THE CURRENT MODE
   E82D   B7               ORA     A               ;SET FLAGS
   E82E   C237E8           JNZ     LE837           ;JUMP IF OCTAL
   E831   CDFAE2           CALL    AHEX            ;CONVERT ASCII HEX TO BINARY
   E834   C33AE8           JMP     LE83A           ;TO CONTINUE
   E837   CD33E3   LE837:  CALL    AOCT            ;CONVERT OCTAL TO BINARY
   E83A   D8       LE83A:  RC                      ;RETURN IF ERROR
   E83B   1A               LDAX    D               ;GET CHAR FROM INPUT LINE
   E83C   FE3A             CPI     ':'             ;NEW ADDRESS OR DATA ?
   E83E   CA4CE8           JZ      LE84C           ;NEW ADDRESS
   E841   7D               MOV     A,L             ;DATA TO A
   E842   2AEFD0           LHLD    BBUF            ;GET ENTER POINTER
   E845   77               MOV     M,A             ;PUT DATA IN MEMORY
   E846   CD7BE3           CALL    ACH1            ;INCREMENT ENTER POINTER
   E849   C317E8           JMP     ENT1            ;DO NEXT BYTE
   E84C   22EFD0   LE84C:  SHLD    BBUF            ;SAVE AS NEW ENTER ADDR
   E84F   EB               XCHG                    ;IBUF POINTER TO H,L
   E850   23               INX     H               ;INCREMENT IT
   E851   2201D1           SHLD    PNTR            ;SAVE IT
   E854   C317E8           JMP     ENT1            ;DO MORE BYTES
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 28
      


                   ;
                   ;HERE ARE THE ROUTINES THAT ADD OR REPLACE LINES IN FILES
                   ;BASED ON THEIR LINE NUMBERS.  DELETE IS HANDLED BY A
                   ;SEPARATE ROUTINE
                   ;
   E857   FE30     LINE:   CPI     '0'             ;MAKE SURE 1ST CHAR IS NUMERIC
   E859   DADDE7           JC      WHAT            ;IF IT'S NOT
   E85C   213030           LXI     H,3030H         ;TWO ASCII ZEROES
   E85F   22E0D1           SHLD    IBUF-4          ;PUT TWO BEFORE THE LINE
   E862   22E2D1           SHLD    IBUF-2          ;TWO MORE MAKES FOUR
   E865   21E3D1           LXI     H,IBUF-1        ;POINT TO SPACE BEFORE LINE
   E868   0E04             MVI     C,4             ;MAX NO DIGITS IN LINE NO
   E86A   23       LE86A:  INX     H               ;POINT TO 1ST CHAR
   E86B   7E               MOV     A,M             ;GET IT
   E86C   FE30             CPI     '0'             ;NUMERIC ?
   E86E   DA7CE8           JC      LE87C           ;NO
   E871   FE3A             CPI     '9'+1           ;NUMERIC ?
   E873   D27CE8           JNC     LE87C           ;NO
   E876   0D               DCR     C               ;YES, NUMERIC
   E877   C26AE8           JNZ     LE86A           ;COUNT NUMERIC CHRS IN LINE NO.
                   ;
                   ;IF WE GET HERE THE LINE HAD A FULL 4-DIGIT NO. TO BEGIN WITH
                   ;NOW MAKE SURE LINE NO. IS FOLLOWED BY AT LEAST ONE SPACE
                   ;PUT ONE IN IF IT'S NOT
                   ;
   E87A   23               INX     H               ;POINT AFTER THE LINE NO
   E87B   7E               MOV     A,M             ;GET CHAR
   E87C   FE20     LE87C:  CPI     ' '             ;IS CHAR AFTER LINE NO. SPACE ?
   E87E   41               MOV     B,C             ;COUNT OF LEADING 0'S TO ADD
   E87F   2B               DCX     H               ;POINT TO LAST DIGIT OF LINE NO
   E880   CA93E8           JZ      LE893           ;IF LINE NO FOLLOWED BY SPACE
   E883   0C               INR     C               ;INR COUNT OF TOTAL CHRS TO ADD
   E884   41               MOV     B,C             ;SAVE IN B
   E885   0E04             MVI     C,4             ;NEED TO MOVE 4 DIGIT LINE NO.
   E887   3E20             MVI     A,' '           ;TO INSERT A SPACE
   E889   56       LE889:  MOV     D,M             ;GET CHAR
   E88A   77               MOV     M,A             ;PUT CHAR IN A INTO LINE
   E88B   7A               MOV     A,D             ;CHAR REMOVED FROM LINE TO A
   E88C   2B               DCX     H               ;DECREMENT LINE POINTER
   E88D   0D               DCR     C               ;AND COUNT OF CHRS LEFT TO MOVE
   E88E   C289E8           JNZ     LE889           ;IF NOT DONE
   E891   77               MOV     M,A             ;REPLACE LAST CHARACTER
   E892   48               MOV     C,B             ;COUNT OF 0'S TO INSERT
   E893   21E4D1   LE893:  LXI     H,IBUF          ;POINT TO IBUFFER
   E896   2B       LE896:  DCX     H               ;DECREMENT LINE POINTER
   E897   0D               DCR     C               ;DCR COUNT OF 0'S TO INSERT
   E898   F296E8           JP      LE896           ;LOOP TILL IT GOES NEGATIVE
   E89B   22C9D1           SHLD    SAVL            ;H,L IS NEW START OF LINE
   E89E   3AF3D0           LDA     CCNT            ;GET OLD LINE LENGTH COUNT
   E8A1   80               ADD     B               ;ADD COUNT OF CHARACTERS ADDED
   E8A2   32F3D0           STA     CCNT            ;UPDATED COUNT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 29
      


   E8A5   FE07             CPI     7               ;7 ==> ORIG LINE WAS BLANK
   E8A7   CA2BE9           JZ      LE92B           ;TO DELETE THE LINE
   E8AA   77               MOV     M,A             ;PUT LEN BYTE AT HEAD OF LINE
   E8AB   110400           LXI     D,4             ;LENGTH OF LINE NO.
   E8AE   19               DAD     D               ;H,L POINTS LAST CHR OF LINE NO
   E8AF   22D4D0           SHLD    ADDS            ;SAVE ADDR.
   E8B2   110CD0           LXI     D,MAXL+3        ;END OF HIGHEST LIN # IN FILE
   E8B5   CD92E9           CALL    COM0            ;COMPARE LINE NO. TO MAXL
   E8B8   D2D8E8           JNC     INSRT           ;LINE GOES INTO MIDDLE OF FILE
                   ;
                   ;LINE GOES AT END OF FILE
                   ;
   E8BB   23               INX     H               ;POINT TO LINE NO.
   E8BC   CD82E9           CALL    LODM            ;GET IT IN BCDE
   E8BF   210CD0           LXI     H,MAXL+3        ;POINT TO END OF MAXL
   E8C2   CD8AE9           CALL    STOM            ;THIS LINE BECOMES NEW MAXL
   E8C5   2AC9D1           LHLD    SAVL            ;GET ADDR OF LINE
   E8C8   EB               XCHG                    ;D,E IS LINE POINTER
   E8C9   2A07D0           LHLD    EOFP            ;H,L IS CURRENT END OF FILE
   E8CC   0E01             MVI     C,1             ;1 IS THE MOVE TERMINATOR CHAR
   E8CE   CD70E9           CALL    LMOV            ;MOVE LINE TO END OF FILE
   E8D1   71               MOV     M,C             ;PUT EOF MARK IN FILE
   E8D2   2207D0           SHLD    EOFP            ;UPDATE END OF FILE
   E8D5   C3D1E0           JMP     EORNS           ;DONE
                   ;
                   ;GET HERE TO INSERT A LINE INTO FILE
                   ;
   E8D8   CD47E9   INSRT:  CALL    LE947           ;FIND LINE NO IN FILE
   E8DB   0E02             MVI     C,2             ;FLAG INITIALIZATION
   E8DD   CAE1E8           JZ      EQUL            ;LINE IN FILE HAS SAME NO.
   E8E0   0D               DCR     C               ;C=1 ==> NO. NOT NOW IN FILE
   E8E1   46       EQUL:   MOV     B,M             ;GET LENGTH OF LINE IN FILE
   E8E2   2B               DCX     H               ;ADDR TO INSERT LINE AFTER
   E8E3   3602             MVI     M,2             ;PUT MARKER THERE
   E8E5   22D2D0           SHLD    APNT            ;AND SAVE AS POINTER
   E8E8   3AF3D0           LDA     CCNT            ;LENGTH OF LINE TO ADD
   E8EB   0D               DCR     C               ;THE FLAG - 2 = REPLACEMENT
   E8EC   CAF6E8           JZ      LT              ;IF NEW LINE # NOT = OLD LINE #
   E8EF   90               SUB     B               ;COMPUTE DIFF IN LINE LENGTHS
   E8F0   CA19E9           JZ      ZERO            ;IF LINES ARE SAME LENGTH
   E8F3   DA09E9           JC      GT              ;IF NEW LINE > OLD LINE
                   ;
                   ;GET HERE IF OLD LINE > NEW LINE OR DOING
                   ;ADDITION RATHER THAN REPLACEMENT
                   ;
   E8F6   2A07D0   LT:     LHLD    EOFP            ;GET OLD END OF FILE
   E8F9   54               MOV     D,H             ;DUPLICATE IN D,E
   E8FA   5D               MOV     E,L             ;
   E8FB   CD6BE9           CALL    ADR             ;ADD DIFF. TO OLD EOFP
   E8FE   2207D0           SHLD    EOFP            ;OLD + ADDED = NEW
   E901   0E02             MVI     C,2             ;MOVE TERMINATION MARK IN FILE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 30
      


   E903   CD79E9           CALL    RMOV            ;DO THE MOVE
   E906   C319E9           JMP     ZERO            ;INSERT LINE INTO GAP CREATED
                   ;
                   ;GET HERE IF OLD LINE < NEW LINE
                   ;
   E909   2F       GT:     CMA                     ;MAKE DIFFERENCE NEGATIVE
   E90A   3C               INR     A               ;TWO'S COMPLEMENT
   E90B   54               MOV     D,H             ;DUPLICATE H,L IN D,E
   E90C   5D               MOV     E,L             ;
   E90D   CD6BE9           CALL    ADR             ;SUB. DIFF FROM OLD EOFP
   E910   EB               XCHG                    ;
   E911   CD70E9           CALL    LMOV            ;DELETE EXCESS CHAR IN FILE
   E914   3601             MVI     M,1             ;E-O-F INDICATOR
   E916   2207D0           SHLD    EOFP            ;E-O-F ADDRESS
                   ;
                   ;GET HERE TO INSERT CURRENT LINE INTO FILE AREA
                   ;
   E919   2AC9D1   ZERO:   LHLD    SAVL            ;LINE ADDRESS
   E91C   EB               XCHG                    ;TO D,E
   E91D   2AD2D0           LHLD    APNT            ;INSERT ADDRESS
   E920   360D             MVI     M,0DH           ;REPLACE MOVE TERM. MARK W/CR
   E922   23               INX     H               ;POINT TO WHERE NEW LINE GOES
   E923   0E01             MVI     C,1             ;MOVE TERMINATION MARK
   E925   CD70E9           CALL    LMOV            ;PUT LINE INTO FILE
   E928   C3D1E0           JMP     EORNS           ;DONE
                   ;
                   ;DELETE LINE IF LINE NO. ENTERED WITH NO TEXT
                   ;
   E92B   23       LE92B:  INX     H               ;POINT TO LINE NO TO DELETE
   E92C   CD82E9           CALL    LODM            ;GET IT IN B,C,D,E
   E92F   21E2D0           LXI     H,ABUF+3        ;DESTINATION ADDRESS
   E932   CD8AE9           CALL    STOM            ;STORE DELETE ADDRESS
   E935   21E9D0           LXI     H,ABUF+10       ;ADDRESS OF END OF 2ND PARM
   E938   CD8AE9           CALL    STOM            ;STORE LINE NO. AGAIN
   E93B   CD2FEA           CALL    LEA2F           ;MAKE LIKE A DELT N,N COMMAND
   E93E   C3D1E0           JMP     EORNS           ;LINE DELETED, DONE
                   ;
                   ;FIND - SEARCH FILE FOR SPECIFIED LINE
                   ;
   E941   21E2D0   FIND:   LXI     H,ABUF+3        ;ADDRS. OF TEMP BUFFER
   E944   22D4D0   FIND1:  SHLD    ADDS            ;ADDR OF NO. TO LOOK UP
   E947   2A05D0   LE947:  LHLD    BOFP            ;START OF FILE TO SEARCH
   E94A   CD64E9   FI1:    CALL    E01             ;SEE IF AT END OF FILE
   E94D   EB               XCHG                    ;FILE ADR TO D,E
   E94E   2AD4D0           LHLD    ADDS            ;GET ADDR OF NO TO LOOK UP
   E951   EB               XCHG                    ;SET UP
   E952   3E04             MVI     A,4             ;LENGTH OF LINE NO.
   E954   CD6BE9           CALL    ADR             ;POINT TO END OF LINE NO.
   E957   CD92E9           CALL    COM0            ;SEE IF LINE NOS. ARE SAME
   E95A   D8               RC                      ;NO IN FILE > SUBJECT
   E95B   C8               RZ                      ;NOS. ARE THE SAME
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 31
      


   E95C   7E       FI2:    MOV     A,M             ;GET LENGTH BYTE
   E95D   CD6BE9           CALL    ADR             ;POINT TO NEXT LINE
   E960   C34AE9           JMP     FI1             ;TEST NEXT LINE
                   ;
                   ;ROUTINE TO CHECK FOR END OF FILE
                   ;
   E963   23       EOF:    INX     H               ;
   E964   3E01     E01:    MVI     A,1             ;EOF INDICATOR
   E966   BE               CMP     M               ;SAME AS CHAR POINTED TO ?
   E967   C0               RNZ                     ;NO - RETURN
   E968   C3D1E0           JMP     EORNS           ;YES - ABORT COMMAND
                   ;
                   ;ROUTINE TO ADD ONE BYTE NO IN A TO ADDR IN H,L
                   ;
   E96B   85       ADR:    ADD     L               ;ADD A TO L
   E96C   6F               MOV     L,A             ;RESULT REPLACES L
   E96D   D0               RNC                     ;DONE IF NO CARRY
   E96E   24               INR     H               ;ELSE INCREMENT H
   E96F   C9               RET                     ;DONE NOW
                   ;
                   ;CHARACTER MOVEMENT ROUTINE TO MOVE FROM D,E TO H,L
                   ;INCREMENTING D,E (START AT LOW ADDRESS END OF BLOCK TO MOVE)
                   ;MOVE ENDS WHEN CHAR IN REG C IS ENCOUNTERED.
                   ;
   E970   1A       LMOV:   LDAX    D               ;GET SOURCE CHAR
   E971   13               INX     D               ;INR SOURCE POINTER
   E972   B9               CMP     C               ;TERMINATION CHAR ?
   E973   C8               RZ                      ;YES - DONE THEN
   E974   77               MOV     M,A             ;NO - MOVE TO DEST.
   E975   23               INX     H               ;INR DESTINATION POINTER
   E976   C370E9           JMP     LMOV            ;DO NEXT CHAR
                   ;
                   ;CHARACTER MOVEMENT ROUTINE TO MOVE FROM D,E TO H,L
                   ;DECREMENTING POINTERS (START AT HIGH END OF BLOCK)
                   ;MOVE ENDS WHEN CHAR IN REG C IS ENCOUNTERED
                   ;
   E979   1A       RMOV:   LDAX    D               ;GET SOURCE CHAR
   E97A   1B               DCX     D               ;DECR SOURCE POINTER
   E97B   B9               CMP     C               ;TERMINATION CHAR ?
   E97C   C8               RZ                      ;YES - DONE
   E97D   77               MOV     M,A             ;NO - STORE CHAR AT DEST.
   E97E   2B               DCX     H               ;DECREMENT DEST. POINTER
   E97F   C379E9           JMP     RMOV            ;DO NEXT CHARACTER
                   ;
                   ;LOAD FOUR CHARS FROM MEMORY INTO REGS B,C,D,E
                   ;
   E982   46       LODM:   MOV     B,M
   E983   23               INX     H
   E984   4E               MOV     C,M
   E985   23               INX     H
   E986   56               MOV     D,M
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 32
      


   E987   23               INX     H
   E988   5E               MOV     E,M
   E989   C9               RET
                   ;
                   ;STORE FOUR CHARS FROM REGS B,C,D,E INTO MEMORY
                   ;
   E98A   73       STOM:   MOV     M,E
   E98B   2B               DCX     H
   E98C   72               MOV     M,D
   E98D   2B               DCX     H
   E98E   71               MOV     M,C
   E98F   2B               DCX     H
   E990   70               MOV     M,B
   E991   C9               RET
                   ;
                   ;ROUTINE TO COMPARE TWO CHAR STRINGS OF LENGTH 4.
                   ;ZERO FLAG SET ==> STRINGS EQUAL. CARRY ==> STRING
                   ;ADDRESSED BY D,E GREATER THAN OR = STRING ADDR BY
                   ;H,L
                   ;
   E992   0E04     COM0:   MVI     C,4             ;LENGTH OF COMPARISON
   E994   0601     COM1:   MVI     B,1             ;ASSUME EQUAL
   E996   B7               ORA     A               ;CLEAR CARRY
   E997   1A       C01:    LDAX    D               ;FETCH CHARACTER
   E998   9E               SBB     M               ;SET FLAGS & COMPARE
   E999   CA9DE9           JZ      C02             ;THESE BYTES ARE THE SAME
   E99C   04               INR     B               ;MAKE EQUAL FLAG = 2
   E99D   1B       C02:    DCX     D               ;DECREMENT 1 STR. POINTER
   E99E   2B               DCX     H               ;DECR. OTHER POINTER
   E99F   0D               DCR     C               ;DECR. CNT OF BYTES TO COMPARE
   E9A0   C297E9           JNZ     C01             ;DO NEXT BYTE
   E9A3   05               DCR     B               ;DECREMENT ZERO FLAG
   E9A4   C9               RET                     ;DONE W/ZERO SET
                   ;
                   ;ROUTINE TO TAKE ASCII CHARS AND ADD LEADING ASCII
                   ;ZEROS TO YIELD A 4 CHARACTER ASCII VALUE
                   ;
   E9A5   CD82E9   NORM:   CALL    LODM            ;GET 4 DIGITS
   E9A8   AF               XRA     A               ;GET A BINARY ZERO
   E9A9   B8               CMP     B               ;ARE ALL DIGITS ZERO ?
   E9AA   C8               RZ                      ;YES - NOTHING TO NORMALIZE
   E9AB   BB       NOR1:   CMP     E               ;NORMALIZED ?
   E9AC   C48AE9           CNZ     STOM            ;YES, PUT DIGITS BACK
   E9AF   C0               RNZ                     ;AND RETURN
   E9B0   5A               MOV     E,D             ;ELSE MOVE DIGITS UP
   E9B1   51               MOV     D,C
   E9B2   48               MOV     C,B
   E9B3   0630             MVI     B,'0'           ;AND ADD A ZERO
   E9B5   C3ABE9           JMP     NOR1            ;THEN TEST FOR NORMALIZATION
                   ;
                   ;ROUTINE TO MOVE A LINE FROM THE FILE BUFFER INTO
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 33
      


                   ;THE ASSEMBLERS LINE BUFFER
                   ;
   E9B8   2AD2D0   MOVEL:  LHLD    APNT            ;GET ASSEMBLER POINTER
   E9BB   7E               MOV     A,M             ;GET 1ST CHAR OF LINE
   E9BC   FE01             CPI     1               ;END OF FILE ?
   E9BE   C8               RZ                      ;YES, RETURN
   E9BF   EB               XCHG                    ;LINE ADDR TO D,E
   E9C0   6F               MOV     L,A             ;GET LENGTH AS 16 BITS IN H,L
   E9C1   2600             MVI     H,0             ;LENGTH < 128
   E9C3   19               DAD     D               ;ADD LENGTH TO START ADDR
   E9C4   2B               DCX     H               ;POINT TO LAST CHAR OF LINE
   E9C5   7E               MOV     A,M             ;GET IT
   E9C6   FE0D             CPI     0DH             ;C/R ?
   E9C8   C218E7           JNZ     LE718           ;REPORT FCHK ERROR
   E9CB   13               INX     D               ;POINT TO 1ST ACTUAL CHAR
   E9CC   21DFD1           LXI     H,IBUF-5        ;ASSEMBLERS BUFFER
   E9CF   0E0D             MVI     C,0DH           ;TERMINATION CHAR
   E9D1   CD70E9           CALL    LMOV            ;MOVE THE LINE
   E9D4   71               MOV     M,C             ;PUT C/R AT END OF LINE
   E9D5   EB               XCHG                    ;1ST CHAR OF NEXT LINE TO H,L
   E9D6   22D2D0           SHLD    APNT            ;SAVE UPDATED ASSEM. POINTER
   E9D9   B7               ORA     A               ;CLEAR FLAGS
   E9DA   C9               RET                     ;DONE
                   ;
                   ;LIST AND TEXT (LIST W/O LINE NUMBERS) COMMANDS
                   ;
   E9DB   2F       LIST:   CMA                     ;MAKE A NON-ZERO
   E9DC   32FBD0   TEXT:   STA     NOLIN           ;SAVE AS FORMAT FLAG
   E9DF   CD16E2           CALL    CRLF            ;START ON FRESH LINE
   E9E2   21DFD0           LXI     H,ABUF          ;GET STARTING LINE NO.
   E9E5   CD82E9           CALL    LODM            ;
   E9E8   AF               XRA     A               ;ZERO FLAGS & ACCUM.
   E9E9   B8               CMP     B               ;LINE NO. GIVEN ?
   E9EA   C2EFE9           JNZ     LE9EF           ;JUMP IF LINE NO. GIVEN
   E9ED   06FF             MVI     B,0FFH          ;MAKE LINE NO. > 9999
   E9EF   21E9D0   LE9EF:  LXI     H,ABUF+10
   E9F2   BE               CMP     M               ;ENDING LINE NO. GIVEN ?
   E9F3   C2F9E9           JNZ     LE9F9           ;IF ENDING NO. GIVEN
   E9F6   CD8AE9           CALL    STOM            ;STORE ENDING LINE NO > 9999
   E9F9   CD41E9   LE9F9:  CALL    FIND            ;FIND STARTING LINE NO.
   E9FC   22D2D0           SHLD    APNT            ;SAVE AS POINTER
   E9FF   CDB8E9   LE9FF:  CALL    MOVEL           ;MOVE LINE TO OUTPUT BUFFER
   EA02   CAB7E0           JZ      EOR             ;IF END OF FILE FOUND
   EA05   21E2D1           LXI     H,IBUF-2        ;POINT TO LAST DIGIT OF LINE NO
   EA08   11E9D0           LXI     D,ABUF+10       ;D POINTS TO ENDING LINE NO.
   EA0B   CD92E9           CALL    COM0            ;COMPARE LINE NO. & END LIN NO.
   EA0E   D8               RC                      ;RETURN IF > ENDING LINE NO
   EA0F   3AFAD0           LDA     LFMT            ;GET FORMAT FLAG
   EA12   B7               ORA     A               ;SET FLAGS
   EA13   C461F3           CNZ     LF361           ;TO FORMAT LINE
   EA16   21DFD1           LXI     H,IBUF-5        ;POINT TO START OF LINE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 34
      


   EA19   3AFBD0           LDA     NOLIN           ;GET LINE NO. FLAG
   EA1C   B7               ORA     A               ;SET FLAGS
   EA1D   C223EA           JNZ     LEA23           ;PRINT WITH LINE NO.
   EA20   21E4D1           LXI     H,IBUF          ;POINT PAST LIN NO.
   EA23   CD80E3   LEA23:  CALL    SCRN            ;PRINT LINE FROM H,L POINTER
   EA26   CD16E2           CALL    CRLF            ;PUT CR/LF AFTER LINE
   EA29   C3FFE9           JMP     LE9FF           ;TO DO NEXT LINE
                   ;
                   ;DELT - THE DELETE LINE COMMAND
                   ;
   EA2C   CD1CE5   DELT:   CALL    VCHK            ;CHECK FOR REQD PARAMETERS
   EA2F   CD41E9   LEA2F:  CALL    FIND            ;GET STARTING DELT ADDR
   EA32   22D2D0           SHLD    DELP            ;SAVE IT
   EA35   21E9D0           LXI     H,ABUF+10       ;SEE IF 2ND PARM GIVEN
   EA38   7E               MOV     A,M             ;GET CHAR
   EA39   B7               ORA     A               ;SET FLAGS
   EA3A   C240EA           JNZ     LEA40           ;IF 2ND PARM GIVEN
   EA3D   21E2D0           LXI     H,ABUF+3        ;FIRST & LAST LINE ARE SAME
   EA40   22D4D0   LEA40:  SHLD    ADDS            ;SAVE 1ST LINE FIND ADDR
   EA43   EB               XCHG
   EA44   210CD0           LXI     H,MAXL+3        ;HIGHEST LINE NO.
   EA47   CD92E9           CALL    COM0            ;COMPARE TO ENDING DELT LINE
   EA4A   2AD2D0           LHLD    DELP            ;GET DELT POSITION TO H,L
   EA4D   DA8EEA           JC      NOVR            ;DELETE DOES NOT INVOLVE END
                   ;
                   ;GET HERE IF DELETE INVOLVES END OF FILE
                   ;
                   ;THIS GETS COMPLICATED BECAUSE:
                   ;  A) THE LAST LINE'S C/R IS NOT FOLLOWED BY ANY LINE NO.
                   ;                      AND
                   ;  B) IN GENERAL, A 0DH MIGHT BE EITHER A LENGTH BYTE OR C/R
                   ;
   EA50   2207D0   LEA50:  SHLD    EOFP            ;DELT POS. ==> NEW EOF
   EA53   3601             MVI     M,1             ;PUT NEW EOF MARK IN FILE
   EA55   46               MOV     B,M             ;FLAG WHICH ISN'T REALLY USED
   EA56   EB               XCHG                    ;D,E = EOF
   EA57   2A05D0           LHLD    BOFP            ;H,L = BOF
   EA5A   EB               XCHG                    ;D,E = BOF & H,L = EOF
   EA5B   2B               DCX     H               ;SO WE MISS LAST LINE'S C/R
   EA5C   7D       DEL2:   MOV     A,L             ;SUBTRACT BOF FROM EOF
   EA5D   93               SUB     E               ;
   EA5E   7C               MOV     A,H             ;
   EA5F   9A               SBB     D               ;
   EA60   3E0D             MVI     A,0DH           ;SETTING UP FOR COMPARE
   EA62   DA85EA           JC      DEL4            ;NO 0DH IN FILE==> MAXL=0
   EA65   2B               DCX     H               ;MOVE UP 1 CHAR
   EA66   BE               CMP     M               ;0DH ?
   EA67   C25CEA           JNZ     DEL2            ;NO, THEN TRY NEXT CHAR
   EA6A   2B               DCX     H               ;YES - SEE IF TWO IN A ROW
   EA6B   7D               MOV     A,L             ;SUBTRACTING BOF FROM POINTER
   EA6C   93               SUB     E
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 35
      


   EA6D   7C               MOV     A,H             ;
   EA6E   9A               SBB     D               ;
   EA6F   DA85EA           JC      DEL4            ;0DH WAS 1ST CHAR==>LENGTH BYTE
   EA72   3E0D             MVI     A,0DH           ;COMPARE THIS CHAR TO 0DH
   EA74   BE               CMP     M               ;
   EA75   23               INX     H               ;POINT TO NEXT CHAR
   EA76   23               INX     H               ;POINT TO NEXT CHAR
   EA77   CA7BEA           JZ      DEL3            ;WERE TWO 0DH'S, AT LINE # NOW
   EA7A   23       LEA7A:  INX     H               ;ONLY 1 0DH, 1 MORE==>AT LINE #
   EA7B   CD82E9   DEL3:   CALL    LODM            ;GET LINE NO IN REGS
   EA7E   210CD0           LXI     H,MAXL+3        ;WHERE IT GOES
   EA81   CD8AE9           CALL    STOM            ;PUT IT THERE
   EA84   C9               RET                     ;MAXL IS UPDATED
   EA85   EB       DEL4:   XCHG                    ;FOR PROPER RETURN
   EA86   05               DCR     B               ;ALWAYS 1 ==> 0
   EA87   C27AEA           JNZ     LEA7A           ;NEVER TAKE JUMP
   EA8A   3209D0           STA     MAXL            ;MAKES MAXL VERY SMALL ALWAYS
   EA8D   C9               RET                     ;DONE, EDITOR THINKS FILE EMPTY
                   ;
                   ;GET HERE IF DELETE IS IN THE MIDDLE OF THE FILE
                   ;
   EA8E   CD4AE9   NOVR:   CALL    FI1             ;FIND END OF DELETE AREA
   EA91   CC5CE9           CZ      FI2             ;NEXT LINE IF LINE NOS. EQUL
   EA94   EB               XCHG                    ;
   EA95   2AD2D0           LHLD    DELP            ;DEST = START OF DELT AREA
   EA98   0E01             MVI     C,1             ;TERM ON EOF MARK
   EA9A   CD70E9           CALL    LMOV            ;DO THE MOVE TO DELETE
   EA9D   2207D0           SHLD    EOFP            ;UPDATE EOF ADDRESS
   EAA0   3601             MVI     M,1             ;PUT EOF MARK IN FILE
   EAA2   C9               RET                     ;DONE
                   ;
                   ;STAB COMMAND - SET SYMBOL TABLE ADDRESS
                   ;
   EAA3   CD1CE5   STAB:   CALL    VCHK            ;CHECK FOR REQD PARM
   EAA6   2AEFD0           LHLD    BBUF            ;GET IT
   EAA9   2232D1           SHLD    SYMADD          ;SAVE AS SYMBOL TABLE ADDRESS
   EAAC   C360E0           JMP     EORMS           ;DONE
                   ;
                   ; ***** END OF ALS8COM MODULE
                   ;
                   ;
                   ;THE ASSEMBLER STARTS HERE
                   ;
                   ;ASPC IS THE PROGRAM COUNTER (GOES ON LISTING), AND
                   ;BBUF+2 IS THE STORAGE COUNTER (WHERE OBJECT CODE GOES)
                   ;
   EAAF   CD1CE5   ASSM:   CALL    VCHK            ;AT LEAST 1 PARM. REQD
   EAB2   3AE6D0           LDA     ABUF+7          ;2ND PARM. (OFFSET) GIVEN ?
   EAB5   B7               ORA     A               ;SET FLAGS
   EAB6   C2BFEA           JNZ     ASM4            ;USE 2ND PARM. IF GIVEN
   EAB9   2AEFD0           LHLD    BBUF            ;ELSE GET 1ST PARM
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 36
      


   EABC   22F1D0           SHLD    BBUF+2          ;USE 1ST PARM. AS STORAGE CNTR
   EABF   3AE8D1   ASM4:   LDA     IBUF+4          ;GET LETTER AFTER ASSM OR ASSI
   EAC2   FE45             CPI     'E'             ;'E' - OMIT NON-ERROR LINES ?
   EAC4   CAD6EA           JZ      LEAD6           ;SKIP CHECKING FOR 'S' OR 'X'
   EAC7   FE53             CPI     'S'             ;'S' - LIST SYMBOL TABLE ?
   EAC9   CAD6EA           JZ      LEAD6           ;SKIP CHECKING FOR 'X'
   EACC   FE58             CPI     'X'             ;'X' - CROSS REFERENCE ?
   EACE   CAD6EA           JZ      LEAD6           ;HAVE PRINT FLAG
   EAD1   FE20             CPI     ' '             ;MUST BE SPACE, E, S, OR X
   EAD3   C2DDE7           JNZ     WHAT            ;WHOOPS - ILLEAGLE CHAR.
   EAD6   32F4D0   LEAD6:  STA     SYMX            ;SAVE SYMBOL/PRINT FLAG
   EAD9   3AE7D1           LDA     IBUF+3          ;GET ASSEMBLY TYPE (ASSM/ASSI)
   EADC   3200D1           STA     ASMTY           ;SAVE AS ASSEMBLY TYPE
   EADF   AF               XRA     A               ;GET A ZERO
   EAE0   2A32D1           LHLD    SYMADD          ;POINT TO SYMBOL TABLE START
   EAE3   77               MOV     M,A             ;PUT IN END OF TABLE MARK
   EAE4   320AD1           STA     ALST            ;ASSUME LIST TURNED 'ON'
   EAE7   32F9D0           STA     PASI            ;SET PASS INDICATOR TO PASS 1
   EAEA   2AEFD0   LEAEA:  LHLD    BBUF            ;GET PGM. ORG
   EAED   22F7D0           SHLD    ASPC            ;USE IT TO INIT. PROG. COUNTER
   EAF0   2A05D0           LHLD    BOFP            ;GET START OF SOURCE
   EAF3   22D2D0           SHLD    APNT            ;USE IT TO INIT. ASS. POINTER
                   ;
                   ;THIS IS THE START OF THE MAIN ASSEMBLER PROCESSING LOOP
                   ;
   EAF6   312FD1   LEAF6:  LXI     SP,SMODE
   EAF9   21C9D1           LXI     H,OBUF          ;POINT TO OUTPUT BUFFER
   EAFC   3EE4             MVI     A,IBUF AND 0FFH ;LOW BYTE OF END OF OBUF
   EAFE   CDD1E1           CALL    CLER            ;CLEAR OBUF TO SPACES
   EB01   3A00D1           LDA     ASMTY           ;GET ASSM/ASSI FLAG
   EB04   FE49             CPI     'I'             ;USING EXTERNAL INPUT ?
   EB06   CA12EB           JZ      LEB12           ;YES - CALL IT
   EB09   CDB8E9           CALL    MOVEL           ;ELSE MOVEL PUTS LINE IN IBUF
   EB0C   CA39EE           JZ      LEE39           ;IF END OF FILE DETECTED
   EB0F   C315EB           JMP     LEB15           ;SKIP CALL TO EXT. INPUT
   EB12   CDCCD0   LEB12:  CALL    IN8             ;CALL ASSI DRIVER FOR EXT INPUT
   EB15   3AF9D0   LEB15:  LDA     PASI            ;GET PASS INDICATOR
   EB18   B7               ORA     A               ;SET FLAGS
   EB19   C222EB           JNZ     ASM2            ;DO THE 2ND PASS
   EB1C   CD57EB           CALL    PAS1            ;ELSE DO PASS 1
   EB1F   C3F6EA           JMP     LEAF6           ;THEN BACK TO TOP OF LOOP
   EB22   CD3DEC   ASM2:   CALL    PAS2            ;PROCESS PASS 2 LINE
   EB25   21C9D1           LXI     H,OBUF          ;POINT TO OUTPUT BUFFER
   EB28   CD2EEB           CALL    AOUT            ;PRINT LINE
   EB2B   C3F6EA           JMP     LEAF6           ;THEN BACK TO TOP OF LOOP
                   ;
                   ;END OF MAIN LOOP
                   ;
                   ;FOLLOWING ROUTINE PRINTS LINE DURING 2ND PASS
                   ;
   EB2E   3ADBD1   AOUT:   LDA     OBUF+18         ;GET ERROR TYPE IN OUTPUT LINE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 37
      


   EB31   FE20             CPI     ' '             ;WAS THERE AN ERROR ?
   EB33   C241EB           JNZ     LEB41           ;YES - PRINT LINE
   EB36   3AF4D0           LDA     AERR            ;GET SYMBOL/ERROR PRINT FLAG
   EB39   FE45             CPI     'E'             ;ERRORS-ONLY LISTING ?
   EB3B   C8               RZ                      ;YES - DONE WITH THIS LINE
   EB3C   3A0AD1           LDA     ALST            ;GET ASSEMBLER LIST FLAG
   EB3F   B7               ORA     A               ;SET FLAGS
   EB40   C0               RNZ                     ;DONE IF LISTING TURNED OFF
   EB41   3AF9D0   LEB41:  LDA     PASI            ;GET PASS INDICATOR
   EB44   FE02             CPI     2               ;GREATER THAN 1 (E.G. 3RD PASS)
   EB46   D0               RNC                     ;DONE THEN
   EB47   3AFAD0           LDA     LFMT            ;GET FORMAT/NO FORMAT FLAG
   EB4A   B7               ORA     A               ;SET FLAGS
   EB4B   C461F3           CNZ     LF361           ;FORMAT LINE IF NECESSARY
   EB4E   21C9D1           LXI     H,OBUF          ;POINT TO LINE TO OUTPUT
   EB51   CD16E2           CALL    CRLF            ;DO CARRIAGE RET FROM PREV LINE
   EB54   C380E3           JMP     SCRN            ;PRINT LINE & RET.
                   ;
                   ;PASS 1 OF THE ASSEMBLER USED TO FORM SYMBOL TABLE
                   ;
   EB57   CD6AE2   PAS1:   CALL    ZBUF            ;CLEAR OUT THE ASCII BUFFER
   EB5A   32F9D0           STA     PASI            ;PUT PASS INDICATOR BACK
   EB5D   21E4D1           LXI     H,IBUF          ;POINT TO 1ST CHAR OF LINE
   EB60   2201D1           SHLD    PNTR            ;SAVE AS POINTER INTO LINE
   EB63   7E               MOV     A,M             ;GET 1ST CHAR
   EB64   FE20             CPI     ' '             ;BLANK ?
   EB66   CA8EEB           JZ      OPC             ;NO LABEL THEN
   EB69   FE2A             CPI     COMCHR          ;COMMENT CHARACTER ?
   EB6B   C8               RZ                      ;DONE IF COMMENT LINE
                   ;
                   ;PROCESS LABEL POINTED TO IN LINE BY H,L
                   ;
   EB6C   CDF8F0           CALL    SLAB            ;SEE IF LABEL ALREADY IN TABLE
   EB6F   DAE0F0           JC      LF0E0           ;ERROR IN LABEL
   EB72   CA56F3           JZ      ERRD            ;DUPLICATE LABEL
   EB75   CDB3EB           CALL    LCHK            ;CHECK CHAR AFTER LABEL
   EB78   DAE0F0           JC      LF0E0           ;IF NOT SPACE OR COLON
   EB7B   CDA5EB           CALL    LEBA5           ;TO MOVE LABEL INTO TABLE
   EB7E   EB               XCHG                    ;SYM. TABLE ADDR TO H,L
   EB7F   22F5D0           SHLD    TABA            ;SAVE AS SYMBOL TABLE PNTR
   EB82   3AF8D0           LDA     ASPC+1          ;PUTTING P.C. IN SYMBOL TABLE
   EB85   77               MOV     M,A             ;PUT 1ST BYTE IN TABLE
   EB86   23               INX     H               ;INR. TABLE POINTER
   EB87   3AF7D0           LDA     ASPC            ;GET 2ND BYTE
   EB8A   77               MOV     M,A             ;PUT IT IN TABLE
   EB8B   23               INX     H               ;POINT PAST VALUE
   EB8C   3600             MVI     M,0             ;END OF TABLE MARK
                   ;
                   ;PROCESS OPCODE
                   ;
   EB8E   CD6AE2   OPC:    CALL    ZBUF            ;BLANK OUT ABUF
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 38
      


   EB91   CDCCEE           CALL    SBLK            ;SCAN TO OPCODE
   EB94   DAD8F0           JC      OERR            ;IF FOUND C/R INSTEAD
   EB97   CD3EF1           CALL    ALPS            ;MOVE OPCODE INTO ABUF
   EB9A   FE20             CPI     ' '             ;CHECK FOR SPACE AFTER OPCODE
   EB9C   DA37F0           JC      OPCD            ;OPCODE FOLLOWED BY C/R
   EB9F   C2D8F0           JNZ     OERR            ;OPCODE FOLLOWED BY CHAR.
   EBA2   C337F0           JMP     OPCD            ;TO CONTINUE OPCODE PROC.
                   ;
                   ;ROUTINE TO MOVE LABEL INTO SYMBOL TABLE
                   ;
   EBA5   0E05     LEBA5:  MVI     C,LLAB          ;LENGTH OF LABEL
   EBA7   21DFD0           LXI     H,ABUF          ;SOURCE
   EBAA   7E       MLAB:   MOV     A,M             ;GET CHAR FROM LABEL
   EBAB   12               STAX    D               ;PUT IT IN TABLE
   EBAC   13               INX     D               ;DEST. POINTER
   EBAD   23               INX     H               ;SOURCE POINTER
   EBAE   0D               DCR     C               ;LENGTH POINTER
   EBAF   C2AAEB           JNZ     MLAB            ;IF MORE CHARS TO MOVE
   EBB2   C9               RET                     ;ELSE DONE
                   ;
                   ;CHECK LABELS FOR VALID TERMINATOR
                   ;
   EBB3   2A01D1   LCHK:   LHLD    PNTR            ;GET POINTER
   EBB6   7E               MOV     A,M             ;GET CHAR
   EBB7   FE20             CPI     ' '             ;SPACE ?
   EBB9   C8               RZ                      ;OK THEN, RETURN
   EBBA   FE3A             CPI     ':'             ;COLON ?
   EBBC   C0               RNZ                     ;IF NOT, RETURN ZERO FLAG OFF
   EBBD   23               INX     H               ;ELSE OK, INR. PAST NON-SPACE
   EBBE   2201D1           SHLD    PNTR            ;AND UPDATE POINTER
   EBC1   C9               RET                     ;THEN RETURN
                   ;
                   ;PROCESS PSEUDO OPS IN PASS 1
                   ;H,L POINTS INTO LINE, D,E POINTS INTO OPCODE TABLE
                   ;
   EBC2   CDCCEE   PSU1:   CALL    SBLK            ;SCAN TO OPERAND
   EBC5   1A               LDAX    D               ;FETCH TABLE VALUE
   EBC6   B7               ORA     A               ;SET FLAGS
   EBC7   CAE6EB           JZ      ORG1            ;ORG PSEUDO OP
   EBCA   FAA8EC           JM      DAT2A           ;DB PSEUDO OP
   EBCD   FE02             CPI     2               ;
   EBCF   DAFBEB           JC      EQU1            ;EQU PSEUDO OP
   EBD2   CA16EC           JZ      RESI            ;DS PSEUDO OP
   EBD5   FE08             CPI     8               ;
   EBD7   CA26EC           JZ      LEC26           ;ASC PSEUDO OP
   EBDA   FE05             CPI     5               ;
   EBDC   D0               RNC                     ;PSEUDO-OPS NOT USED 1ST PASS
   EBDD   EA39EE           JPE     LEE39           ;END PSEUDO OP
                   ;
                   ;DO DW PSEUDO OP
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 39
      


   EBE0   0E02     ACO1:   MVI     C,2             ;DW IS A 2-BYTE INSTR.
   EBE2   AF               XRA     A               ;CLEAR CARRY & FLAGS
   EBE3   C3C7F0           JMP     OCN1            ;TO INCREMENT PGM. COUNTER
                   ;
                   ;DO ORG PSEUDO OP
                   ;
   EBE6   CD60F1   ORG1:   CALL    ASCN            ;GET OPERAND TO H,L
   EBE9   3ADBD1           LDA     OBUF+18         ;GET ERROR INDICATOR
   EBEC   FE20             CPI     ' '             ;ANY ERRORS IN THIS LINE ?
   EBEE   C0               RNZ                     ;IF SO, DON'T PROCESS
   EBEF   22F7D0           SHLD    ASPC            ;ELSE PUT VALUE IN PGM. CTR.
   EBF2   3AE4D1           LDA     IBUF            ;GET 1ST CHAR OF LINE
   EBF5   FE20             CPI     ' '             ;SPACE OR LABEL CHAR ?
   EBF7   C8               RZ                      ;DONE IF SPACE
   EBF8   C306EC           JMP     EQUS            ;ELSE CHANGE LABEL VALUE
                   ;
                   ;DO EQU PSEUDO OP
                   ;
   EBFB   CD60F1   EQU1:   CALL    ASCN            ;GET VALUE TO H,L
   EBFE   3AE4D1           LDA     IBUF            ;POINT AT 1ST CHAR OF LINE
   EC01   FE20             CPI     ' '             ;SPACE OR LABLE CHAR ?
   EC03   CA2FF3           JZ      ERRM            ;EQU REQUIRES A LABEL ALWAYS
   EC06   EB       EQUS:   XCHG                    ;VALUE TO D,E
   EC07   2AF5D0           LHLD    TABA            ;TABLE ADDR TO H,L
   EC0A   72               MOV     M,D             ;STORE LABEL VALUE IN S. TABLE
   EC0B   23               INX     H               ;2ND BYTE
   EC0C   73               MOV     M,E             ;
   EC0D   3ADBD1           LDA     OBUF+18         ;GET ERROR FLAG
   EC10   FE20             CPI     ' '             ;LINE O.K. ?
   EC12   C8               RZ                      ;DONE THEN
   EC13   C341EB           JMP     LEB41           ;ELSE PRINT THE LINE
                   ;
                   ;DO DS PSEUDO OP
                   ;
   EC16   CD60F1   RESI:   CALL    ASCN            ;GET OPERAND VALUE TO H,L
   EC19   44               MOV     B,H             ;MOVING TO B,C
   EC1A   4D               MOV     C,L             ;
   EC1B   3ADBD1           LDA     OBUF+18         ;GET ERROR INDICATOR
   EC1E   FE20             CPI     ' '             ;LINE O.K. ?
   EC20   C241EB           JNZ     LEB41           ;PRINT IT IF NOT
   EC23   C3A1EC           JMP     RES21           ;ELSE ADD B,C TO PGM. CTR.
                   ;
                   ;DO ASC PSEUDO OP
                   ;
   EC26   7E       LEC26:  MOV     A,M             ;GET 1ST NON-SPACE CHAR
   EC27   FE0D             CPI     0DH             ;CARRIAGE RETN ?
   EC29   C8               RZ                      ;DONE
   EC2A   57               MOV     D,A             ;SAVE DELIMITER IN D
   EC2B   010000           LXI     B,0             ;INITIALIZE CHAR COUNT TO 0
   EC2E   23       LEC2E:  INX     H               ;POINT TO NEXT CHAR
   EC2F   7E               MOV     A,M             ;GET IT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 40
      


   EC30   FE0D             CPI     0DH             ;END OF LINE ?
   EC32   CAA1EC           JZ      RES21           ;DONE WITH STRING
   EC35   BA               CMP     D               ;2ND DELIMETER ?
   EC36   CAA1EC           JZ      RES21           ;DONE IF SO
   EC39   03               INX     B               ;ELSE INR. CHAR COUNT
   EC3A   C32EEC           JMP     LEC2E           ;AND KEEP ON COUNTING
                   ;
                   ;PERFORM PASS 2 OF THE ASSEMBLER
                   ;
   EC3D   21C9D1   PAS2:   LXI     H,OBUF          ;SET OUTPUT BUFFER ADDRESS
   EC40   3AF8D0           LDA     ASPC+1          ;GET HIGH BYTE OF PGM. CTR.
   EC43   CD93E3           CALL    BINH+3          ;CONVERT TO ASCII & STORE
   EC46   23               INX     H               ;POINT PAST BYTE
   EC47   3AF7D0           LDA     ASPC            ;GET LOW ORDER BYTE
   EC4A   CD93E3           CALL    BINH+3          ;PUT IT IN ADDR FIELD, TOO
   EC4D   220BD1           SHLD    OIND            ;SAVE H,L AS OUTPUT POINTER
   EC50   CD6AE2           CALL    ZBUF            ;CLEAR ABUFF
   EC53   21E4D1           LXI     H,IBUF          ;POINT TO LINE TO ASSEMBLE
   EC56   2201D1   PABL:   SHLD    PNTR            ;SAVE AS POINTER
   EC59   7E               MOV     A,M             ;GET 1ST CHAR OF LINE
   EC5A   FE20             CPI     ' '             ;SPACE ?
   EC5C   CA8EEB           JZ      OPC             ;YES, NO LABEL, PROC. OPCODE
   EC5F   FE2A             CPI     COMCHR          ;IS IT A COMMENT LINE ?
   EC61   C8               RZ                      ;DONE THEN
   EC62   CDF8F0           CALL    SLAB            ;LOOK UP LABEL IN TABLE
   EC65   DAE0F0           JC      LF0E0           ;LABEL ERROR
   EC68   CDB3EB           CALL    LCHK            ;CHECK TERM. CHAR
   EC6B   C2E0F0           JNZ     LF0E0           ;NOT FOLLOWED BY '$' OR ':'
   EC6E   C38EEB           JMP     OPC             ;PROCESS THE OPCODE
                   ;
                   ;PROCESS PSEUDO OPS FOR THE 2ND PASS
                   ;
   EC71   1A       PSU2:   LDAX    D               ;GET TABLE VALUE
   EC72   B7               ORA     A               ;SET FLAGS
   EC73   CAAEEC           JZ      ORG2            ;ORG PSEUDO OP
   EC76   FAA5EC           JM      DAT2            ;DB PSEUDO OP
   EC79   FE02             CPI     2
   EC7B   D8               RC                      ;EQU WAS PROCESSED ON 1ST PASS
   EC7C   CA95EC           JZ      RES2            ;DS PSEUDO OP
   EC7F   FE08             CPI     8
   EC81   CA01ED           JZ      LED01           ;ASC PSEUDO OP
   EC84   FE05             CPI     5
   EC86   CAD3EC           JZ      LECD3           ;COM PSEUDO OP
   EC89   D2CDEC           JNC     LECCD           ;BOTH LST AND NLST
   EC8C   EA39EE           JPE     LEE39           ;END PSEUDO OP
                   ;
                   ;DO DW PSEUDO OP
                   ;
   EC8F   CD14EE   ACO2:   CALL    TYS6            ;GET VALUE & PUT IN MEM
   EC92   C3E0EB           JMP     ACO1            ;INR P.C. & RET
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 41
      


                   ;DO DS PSEUDO OP IN PASS 2
                   ;
   EC95   CD5DF1   RES2:   CALL    ASBL            ;GET VALUE IN H,L
   EC98   44               MOV     B,H             ;MOVING TO B,C
   EC99   4D               MOV     C,L
   EC9A   2AF1D0           LHLD    BBUF+2          ;GET STORAGE COUNTER
   EC9D   09               DAD     B               ;ADD NO BYTES IN DS STMNT
   EC9E   22F1D0           SHLD    BBUF+2          ;UPDATE STORAGE COUNTER
   ECA1   AF       RES21:  XRA     A               ;CLEAR ZERO FLAG
   ECA2   C3CAF0           JMP     OCN2            ;TO UPDATE PGM. COUNTER
                   ;
                   ;DO PASS 2 DB PSEUDO OP
                   ;
   ECA5   CDD3ED   DAT2:   CALL    TYS5            ;GET OPERNAD
   ECA8   AF       DAT2A:  XRA     A               ;MAKE ACC. ZERO
   ECA9   0E01             MVI     C,1             ;BYTE COUNT
   ECAB   C3C7F0           JMP     OCN1            ;TO INR. PGM. COUNTER
                   ;
                   ;DO ORG PSEUDO OP
                   ;
                   ;P.T. SCREWED THIS ONE UP, AS THEY STORE THE NEW ORG NOT ONLY
                   ;AS THE ASSEMBLERS PROGRAM COUNTER, BUT ALSO AS THE STORAGE
                   ;COUNTER, WHICH POINTS TO WHERE THEY ARE STORING THE OBJECT
                   ;CODE. THUS IF YOU WERE USING AN OFFSET (E.G. ASSM XXXX YYYY)
                   ;BEFORE THE ORG STATEMENT, YOU WON'T BE AFTERWARDS.  WHAT'S
                   ;SURPRISING IS THAT IMSAI'S SCS-1, WRITTEN BY THE SAME CO.
                   ;THAT WROTE ALS-8 FOR P.T. (MICRO-TEC OF SUNNYVALE CALIF.),
                   ;HAS THIS FIXED, EVEN THOUGH IT WAS AN EARLIER PRODUCT.
                   ;
   ECAE   CD5DF1   ORG2:   CALL    ASBL            ;GET ORG VALUE
   ECB1   3ADBD1           LDA     OBUF+18         ;FETCH ERROR FLAG
   ECB4   FE20             CPI     ' '             ;LINE O.K. ?
   ECB6   C0               RNZ                     ;IGNORA IF NOT
   ECB7   EB               XCHG                    ;VALUE TO D,E
   ECB8   2AF7D0           LHLD    ASPC            ;GET CUR. PGM COUNTER
   ECBB   EB               XCHG                    ;NEW ORG H,L - PC IN D,E
   ECBC   22F7D0           SHLD    ASPC            ;MAKE ORG NEW P.C.
   ECBF   22F1D0           SHLD    BBUF+2          ;AND MAKE IT STORAGE CNTR ALSO
   ECC2   C9               RET                     ;DONE, AND YOU ARE SCREWED
                   ;
                   ;PROCESS THE $ SYMBOL (CUR. VALUE OF PGM. COUNTER)
                   ;
   ECC3   23       LECC3:  INX     H               ;INCREMENT POINTER
   ECC4   2201D1           SHLD    PNTR            ;SAVE POINTER
   ECC7   2AF7D0           LHLD    ASPC            ;GET CUR. PGM. COUNTER
   ECCA   C304F2           JMP     AVAL            ;TO FINISH EXPR. EVALUATION
                   ;
                   ;PROCESS NLST AND LST PSEUDO OPS.
                   ;
   ECCD   D606     LECCD:  SUI     6               ;CONVERT LST/NLST TO 0 OR 1
   ECCF   320AD1           STA     ALST            ;SAVE AP LIST FLAG
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 42
      


   ECD2   C9               RET                     ;DONE
                   ;
                   ;PROCESS COM PSEUDO OP
                   ;
   ECD3   CD6AE2   LECD3:  CALL    ZBUF            ;CLEAR ABUF
   ECD6   CDCCEE           CALL    SBLK            ;SCAN TO LABEL TO ENTER
   ECD9   CDF8F0           CALL    SLAB            ;LOOKUP LABEL, VALUE IN H,L
   ECDC   DA37F3           JC      ERRA            ;IF ERROR IN LABEL
   ECDF   C225F3           JNZ     ERRU            ;IF LABEL NOT FOUND
   ECE2   1100D3   LECE2:  LXI     D,SYSYM         ;SYSTEM SYMBOL TABLE
   ECE5   2205D1   LECE5:  SHLD    OPRD            ;SAVE VALUE IN OPRD
   ECE8   0605             MVI     B,LLAB          ;LENGTH OF LABELS
   ECEA   CD28E2           CALL    COMS            ;SEE IF ALREADY IN SYSTEM TABLE
   ECED   CAF9EC           JZ      LECF9           ;ALREADY IN TABLE, CHG VALUE
   ECF0   CDA5EB           CALL    LEBA5           ;NOT IN TABLE, ADD IT
   ECF3   13               INX     D               ;POINT PAST (UNDEFINED) VALUE
   ECF4   13               INX     D               ;2ND BYTE
   ECF5   AF               XRA     A               ;GET BINARY ZERO
   ECF6   12               STAX    D               ;TABLE'S NEW END MARK
   ECF7   1B               DCX     D               ;POINT TO 2ND BYTE OF VALUE
   ECF8   3C               INR     A               ;TURN ZERO FLAG OFF
   ECF9   2A05D1   LECF9:  LHLD    OPRD            ;GET SYMBOL'S VALUE
   ECFC   EB               XCHG                    ;TO D,E
   ECFD   73               MOV     M,E             ;STORE 1 BYTE
   ECFE   2B               DCX     H               ;POINT FROM 2ND TO 1ST BYTE
   ECFF   72               MOV     M,D             ;STORE IT, TOO.
   ED00   C9               RET                     ;DONE
                   ;
                   ;DO ASC PSEUDO OP
                   ;
   ED01   CDCCEE   LED01:  CALL    SBLK            ;SCAN TO 1ST NON BLANK CHAR
   ED04   DA37F3           JC      ERRA            ;IF C/R FOUND
   ED07   4F               MOV     C,A             ;SAVE AS DELIM.
   ED08   23               INX     H               ;POINT TO 1ST CHR OF STRING
   ED09   7E               MOV     A,M             ;GET IT
   ED0A   FE0D             CPI     0DH             ;END OF LINE ?
   ED0C   CA37F3           JZ      ERRA            ;ERROR THEN
   ED0F   B9               CMP     C               ;SECOND DELIMITER ?
   ED10   CA37F3           JZ      ERRA            ;ERROR THEN, TOO
   ED13   06F9             MVI     B,0F9H          ;******MAY BE ADDRESS DEPENDANT
   ED15   7E       LED15:  MOV     A,M             ;GET THE CHAR FROM STRING
   ED16   FE0D             CPI     0DH             ;END OF LINE ?
   ED18   CA57ED           JZ      LED57           ;DONE WITH STRING THEN
   ED1B   B9               CMP     C               ;2ND DELIMITER ?
   ED1C   CA57ED           JZ      LED57           ;DONE WITH STRING THEN
   ED1F   2201D1           SHLD    PNTR            ;SAVE STRING POINTER
   ED22   2AF7D0           LHLD    ASPC            ;GET PROGRAM COUNTER
   ED25   23               INX     H               ;THIS USED UP 1 BYTE
   ED26   22F7D0           SHLD    ASPC            ;PUT UPDATED POINTER BACK
   ED29   04               INR     B               ;
   ED2A   C5               PUSH    B               ;SAVE B,C
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 43
      


   ED2B   CD1DEE           CALL    ASTO            ;PUT BYTE IN MEMORY & LISTING
   ED2E   7D               MOV     A,L             ;GET LOW BYTE OF LISTING PTR
   ED2F   FED8             CPI     (OBUF+15) AND 0FFH
   ED31   C24FED           JNZ     LED4F           ;NO, DO NEXT BYTE
   ED34   CD2EEB           CALL    AOUT            ;YES, PRINT THE LINE
   ED37   C1               POP     B               ;GET BACK B,C
   ED38   0600             MVI     B,0             ;RESET FLAG
   ED3A   C5               PUSH    B               ;SAVE B,C AGAIN
   ED3B   212020           LXI     H,2020H         ;TWO SPACES
   ED3E   22C9D1           SHLD    OBUF            ;BLANK ADDR FIELD BYTES 1 & 2
   ED41   22CBD1           SHLD    OBUF+2          ;3RD & 4TH BYTES
   ED44   3E0D             MVI     A,0DH           ;GET C/R
   ED46   32D9D1           STA     OBUF+16         ;LINE ENDS WITH OBJECT CODE
   ED49   21CCD1           LXI     H,OBUF+3        ;LAST BYTE OF ADDR FIELD
   ED4C   220BD1           SHLD    OIND            ;OUTPUT POINTER FOR NXT LINE
   ED4F   2A01D1   LED4F:  LHLD    PNTR            ;GET STRING POINTER
   ED52   C1               POP     B               ;RESTORE B,C
   ED53   23               INX     H               ;INCREMENT STRING POINTER
   ED54   C315ED           JMP     LED15           ;DO NEXT BYTE OF STRING
                   ;
                   ;GET HERE WHEN HAVE REACHED 2ND DELIMITER OR C/R
                   ;
   ED57   78       LED57:  MOV     A,B             ;GET 1ST LINE FLAG TO A
   ED58   B7               ORA     A               ;SET FLAGS
   ED59   F8               RM                      ;ON 1ST LINE, DONE
   ED5A   CAF6EA           JZ      LEAF6           ;FOR S.T./XREF, MAIN LOOP
   ED5D   2A0BD1           LHLD    OIND            ;GET OUTPUT LINE POINTER
   ED60   23               INX     H               ;POINT PAST LAST BYTE
   ED61   360D             MVI     M,0DH           ;TERMINATE LINE
   ED63   C9               RET                     ;DONE
                   ;
                   ;PROCESS STAX AND LDAX INST.
                   ;
   ED64   CD5DF1   TYP2:   CALL    ASBL            ;FETCH OPERAND
   ED67   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
   ED6A   7D               MOV     A,L             ;GET LOW ORDER OPERAND
   ED6B   B7               ORA     A               ;SET FLAGS
   ED6C   CA88ED           JZ      TY31            ;OPERAND = 0
   ED6F   FE02             CPI     2               ;OPERAND = 2
   ED71   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
   ED74   C388ED           JMP     TY31
                   ;
                   ;PROCESS PUSH, POP, INX, DCX, DAD INSTRUCTIONS
                   ;
   ED77   CD5DF1   TYP3:   CALL    ASBL            ;FETCH OPERAND
   ED7A   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
   ED7D   7D               MOV     A,L             ;GET LOW ORDER OPERAND
   ED7E   0F               RRC                     ;CHECK LOW ORDER BIT
   ED7F   DC11F3           CC      ERRR            ;ILLEGAL REGISTER
   ED82   17               RAL                     ;RESTORE
   ED83   FE08             CPI     8               ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 44
      


   ED85   D411F3           CNC     ERRR            ;ILLEGAL REGISTER
   ED88   07       TY31:   RLC                     ;SHIFT LEFT 3 TIMES
   ED89   17               RAL                     ;
   ED8A   17               RAL                     ;
   ED8B   47       TY32:   MOV     B,A             ;SAVE REGISTER
   ED8C   1A               LDAX    D               ;FETCH OPCODE BASE
   ED8D   80               ADD     B               ;FORM OPCODE W/REGISTER
   ED8E   FE76             CPI     76H             ;CHECK FOR MOV M,M
   ED90   CC11F3           CZ      ERRR            ;ILLEGAL REGISTER
   ED93   C31DEE           JMP     ASTO            ;PUT IN MEM & INR P.C.
                   ;
                   ;PROCESS ACCUMULATOR, INR, DCR, MOV, RST INSTRUCTIONS
                   ;
   ED96   CD5DF1   TYP4:   CALL    ASBL            ;FETCH OPERAND
   ED99   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
   ED9C   7D               MOV     A,L             ;GET LOW ORDER OPERAND
   ED9D   FE08             CPI     8               ;
   ED9F   D411F3           CNC     ERRR            ;ILLEGAL REGISTER
   EDA2   1A               LDAX    D               ;FETCH OPCODE BASE
   EDA3   FE40             CPI     40H             ;CHECK FOR MOV INST.
   EDA5   CAB4ED           JZ      TY41            ;PROCESS THEM SEPARATELY
   EDA8   FEC7             CPI     0C7H            ;
   EDAA   7D               MOV     A,L             ;OPERAND IN ACCUM.
   EDAB   CA88ED           JZ      TY31            ;RST INSTRUCTION
   EDAE   FA8BED           JM      TY32            ;ACCUMULATOR INST.
   EDB1   C388ED           JMP     TY31            ;INR, DCR INSTRUCTIONS
                   ;
                   ;PROCESS MOV INSTRUCTIONS
                   ;
   EDB4   29       TY41:   DAD     H               ;MULT OPRND BY 8 (3 LFT SHIFTS)
   EDB5   29               DAD     H               ;
   EDB6   29               DAD     H               ;
   EDB7   85               ADD     L               ;FORM OPCODE
   EDB8   12               STAX    D               ;SAVE OPCODE
   EDB9   CDF2ED           CALL    MPNT            ;
   EDBC   CD60F1           CALL    ASCN            ;
   EDBF   C411F3           CNZ     ERRR            ;
   EDC2   7D               MOV     A,L             ;FETCH LOW ORDER OPERAND
   EDC3   FE08             CPI     8               ;
   EDC5   D411F3           CNC     ERRR            ;ILLEGAL REGISTERS
   EDC8   C38BED           JMP     TY32            ;
                   ;
                   ;PROCESS IMMEDIATE INSTRUCTIONS
                   ;IMMEDIATE BYTE CAN BE -256 TO +255
                   ;MVI INSTRUCTION IS A SPECIAL CASE AND HAS 2 OPERANDS
                   ;
   EDCB   FE06     TYP5:   CPI     6               ;CHECK FOR MVI INST
   EDCD   CCE0ED           CZ      TY56            ;SPECIAL CASE
   EDD0   CD1DEE           CALL    ASTO            ;PUT OBJ. IN MEM & ON LISTING
   EDD3   CD5DF1   TYS5:   CALL    ASBL            ;GET IMMEDIATE ARG.
   EDD6   3C               INR     A               ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 45
      


   EDD7   FE02             CPI     2               ;CHECK OPERAND FOR RANGE
   EDD9   D42AF3           CNC     ERRV            ;OPERAND OUT OF RANGE
   EDDC   7D               MOV     A,L             ;
   EDDD   C31DEE           JMP     ASTO            ;PUT OBJECT IN MEM & ON LISTING
                   ;
                   ;FETCH 1ST ARGUMENT FOR MVI AND LXI INSTRUCTIONS
                   ;
   EDE0   CD5DF1   TY56:   CALL    ASBL            ;FETCH ARGUMENT
   EDE3   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
   EDE6   7D               MOV     A,L             ;GET LOW ORDER ARGUMENT
   EDE7   FE08             CPI     8               ;
   EDE9   D411F3           CNC     ERRR            ;ILLEGAL REGISTER
   EDEC   29               DAD     H               ;MULT BY 8 (3 LEFT SHIFTS)
   EDED   29               DAD     H               ;
   EDEE   29               DAD     H               ;
   EDEF   1A               LDAX    D               ;FETCH OPCODE BASE
   EDF0   85               ADD     L               ;FORM OPCODE
   EDF1   5F               MOV     E,A             ;SAVE OBJECT BYTE
   EDF2   2A01D1   MPNT:   LHLD    PNTR            ;FETCH POINTER
   EDF5   7E               MOV     A,M             ;FETCH CHARACTER
   EDF6   FE2C             CPI     ','             ;CHECK FOR COMMA
   EDF8   23               INX     H               ;INCREMENT POINTER
   EDF9   2201D1           SHLD    PNTR            ;AND SAVE IT
   EDFC   C21AF3           JNZ     ERRS            ;SYNTAX ERROR IF NO COMMA
   EDFF   7B               MOV     A,E             ;
   EE00   C9               RET                     ;
                   ;
                   ;PROCESS 3 BYTE INSTRUCTIONS
                   ;LXI INSTRUCTION IS A SPECIAL CASE
                   ;
   EE01   FE01     TYP6:   CPI     1               ;CHECK FOR LXI INSTRUCTION
   EE03   C211EE           JNZ     TY6             ;JUMP IF NOT LXI
   EE06   CDE0ED           CALL    TY56            ;GET REGISTER
   EE09   E608             ANI     8               ;CHECK FOR ILLEGAL REGISTER
   EE0B   C411F3           CNZ     ERRR            ;REGISTER ERROR
   EE0E   7B               MOV     A,E             ;GET OPCODE
   EE0F   E6F7             ANI     0F7H            ;CLEAR BIT IN ERROR
   EE11   CD1DEE   TY6:    CALL    ASTO            ;STORE OBJECT BYTE
   EE14   CD5DF1   TYS6:   CALL    ASBL            ;FETCH OPERAND
   EE17   7D               MOV     A,L             ;TO ACCUM
   EE18   54               MOV     D,H             ;
   EE19   CD1DEE           CALL    ASTO            ;PUT 2ND BYTE IN MEMORY
   EE1C   7A               MOV     A,D             ;
                   ;
                   ;THIS ROUTINE IS USED TO STORE OBJECT CODE PRODUCED BY
                   ;THE ASSEMBLER DURING THE 2ND PASS INTO MEMORY
                   ;
   EE1D   2AF1D0   ASTO:   LHLD    BBUF+2          ;FETCH STORAGE COUNTER
   EE20   47               MOV     B,A             ;SAVE OBJECT BYTE
   EE21   3AF9D0           LDA     PASI            ;GET PASS INDICATOR
   EE24   FE02             CPI     2               ;3RD PASS ? (S.T./XREF)
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 46
      


   EE26   D0               RNC                     ;SKIP OBJECT STORAGE THEN
   EE27   78               MOV     A,B             ;ELSE RESTORE OBJECT BYTE
   EE28   77               MOV     M,A             ;AND PUT IT IN MEMORY
   EE29   23               INX     H               ;INCREMENT STORAGE POINTER
   EE2A   22F1D0           SHLD    BBUF+2          ;AND PUT IT BACK
   EE2D   2A0BD1           LHLD    OIND            ;GET OUTPUT ADDRESS
   EE30   23               INX     H               ;INCR. TO POINT PAST LAST BYTE
   EE31   23               INX     H               ;AGAIN, PUT SPACE BETWEEN BYTES
   EE32   CD93E3           CALL    BINH+3          ;CONVERT OBJECT BYTE TO ASCII
   EE35   220BD1           SHLD    OIND            ;AND SAVE UPDATED POINTER
   EE38   C9               RET                     ;OBJECT IN MEM & ON LISTING
                   ;
                   ;PROCESS THE END PSEUDO OP
                   ;
   EE39   21F9D0   LEE39:  LXI     H,PASI          ;POINT TO THE PASS INDICATOR
   EE3C   7E               MOV     A,M             ;GET IT
   EE3D   FE01             CPI     1               ;JUST FINISHED 2ND PASS ?
   EE3F   CA4CEE           JZ      LEE4C           ;YES - DONE OR START 3RD PASS
   EE42   D29DEE           JNC     LEE9D           ;IF 3RD PASS COMPLETE
   EE45   CD16E2           CALL    CRLF            ;DO CRLF AT START OF EA. PASS
   EE48   34               INR     M               ;INCREMENT PASS COUNTER
   EE49   C3EAEA           JMP     LEAEA           ;START NEXT PASS
                   ;
                   ;GET HERE AT END OF 2ND PASS
                   ;
   EE4C   3AF4D0   LEE4C:  LDA     SYMX            ;GET S.T./XREF FLAG
   EE4F   FE46             CPI     'E'+1           ;'S' OR 'X' OPTION REQUESTED ?
   EE51   DA60E0           JC      EORMS           ;NO - ASSY DONE, BACK TO ALS8
   EE54   34               INR     M               ;YES - INCREMENT PASS IND.
   EE55   CD16E2           CALL    CRLF            ;CRLF AFTER EA. PASS
   EE58   CD16E2   LEE58:  CALL    CRLF            ;AGAIN BEFORE S.T./XREF
   EE5B   AF               XRA     A               ;GET A ZERO
   EE5C   32F3D0   LEE5C:  STA     SCNT            ;SAVE AS SYMBOL COUNT
   EE5F   2A32D1           LHLD    SYMADD          ;GET ADDR OF SYMBOL TABLE
   EE62   54               MOV     D,H             ;DUPLICATE IN D,E
   EE63   5D               MOV     E,L             ;
                   ;
                   ;TEST NAMES POINTED TO BY D,E AND H,L
                   ;LEAVE NAME WHICH COMES 1ST IN ALPHABETICAL ORDER
                   ;POINTED TO BY D,E
                   ;
   EE64   010400   LEE64:  LXI     B,LLAB-1        ;OFFSET TO LAST CHAR OF NAME
   EE67   7E               MOV     A,M             ;GET 1ST CHAR OF NAME
   EE68   B7               ORA     A               ;ZERO ?
   EE69   CA82EE           JZ      LEE82           ;REACHED END OF SYMBOL TABLE
   EE6C   09               DAD     B               ;POINT TO LAST CHAR
   EE6D   EB               XCHG                    ;
   EE6E   09               DAD     B               ;POINT TO LAST CHAR
   EE6F   EB               XCHG                    ;
   EE70   0C               INR     C               ;C = LENGTH OF NAME
   EE71   CD94E9           CALL    COM1            ;COMPARE NAMES
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 47
      


   EE74   23               INX     H               ;POINT BACK AT 1ST CHAR
   EE75   13               INX     D               ;POINT BACK AT 1ST CHAR
   EE76   010700           LXI     B,LLAB+2        ;LENGTH OF TABLE ENTRY
   EE79   DA7EEE           JC      LEE7E           ;ALREADY IN CORRECT ORDER
   EE7C   54               MOV     D,H             ;MAKE D,E POINT TO "1ST" NAME
   EE7D   5D               MOV     E,L             ;
   EE7E   09       LEE7E:  DAD     B               ;H,L POINT TO NEXT NAME
   EE7F   C364EE           JMP     LEE64           ;TST NAMES POINTED TO BY DE, HL
                   ;
                   ;GET HERE WHEN PASS COMPLETED THRU SYMBOL TABLE
                   ;D,E POINT TO NAME WHICH COMES "1ST" IN ALPH. ORDER
                   ;NOTE THAT THE SYMBOLS ARE NOT MOVED IN THE TABLE, BUT
                   ;THAT THEIR 1ST CHAR IS REPLACED WITH 0FFH AS THE ARE PRINTED
                   ;
   EE82   EB       LEE82:  XCHG                    ;"1ST" NAME TO D,E
   EE83   7E               MOV     A,M             ;GET 1ST CHAR OF "LOWEST" NAME
   EE84   3D               DCR     A               ;IS IT 0FFH ? (IT WASN'T ZERO)
   EE85   FAB7E0           JM      EOR             ;IF SO, RETURN TO ALS-8
   EE88   3C               INR     A               ;ELSE RESTORE
   EE89   2230D1           SHLD    SYMSV           ;AND SAVE IT'S ADDRESS
   EE8C   CDA8EE           CALL    LEEA8           ;PRINT IT AND IT'S VALUE
   EE8F   3AF4D0           LDA     SYMX            ;GET THE S.T./XREF FLAG
   EE92   FE58             CPI     'X'             ;XREF REQUESTED ?
   EE94   CAEAEA           JZ      LEAEA           ;DO THE CROSS REFERENCE SEARCH
   EE97   3AF3D0           LDA     SCNT            ;ELSE GET SYMBOL COUNT
   EE9A   3C               INR     A               ;INCREMENT IT
   EE9B   FE04             CPI     4               ;MAX NO. SYMBOLS PRINTED/LINE
   EE9D   2A30D1   LEE9D:  LHLD    SYMSV           ;GET SYMBOL POINTER
   EEA0   36FF             MVI     M,0FFH          ;MAKE SYMBOL LAST
   EEA2   DA5CEE           JC      LEE5C           ;DO MORE SYMBOLS THIS LINE
   EEA5   C358EE           JMP     LEE58           ;TO START A NEW LINE
                   ;
                   ;THIS ROUTINE PRINTS NAMES AND THEIR VALUES.
                   ;IT IS USED FOR BOTH THE S.T./XREF AND FOR THE FILES/IODR
                   ;COMMANDS TO LIST THE DIRECTORY CONTENTS
                   ;
   EEA8   0E05     LEEA8:  MVI     C,NMLEN         ;CAREFUL IF LLAB <> NMLEN !
   EEAA   47       LEEAA:  MOV     B,A             ;SAVE CHAR IN B
   EEAB   B7               ORA     A               ;SET FLAGS
   EEAC   C2B1EE           JNZ     LEEB1           ;IF CHAR IS NOT HEX 00
   EEAF   0620             MVI     B,' '           ;PRINT SPACE TO PAD SHORT NAMES
   EEB1   CDCFD0   LEEB1:  CALL    OUT8            ;PRINT IT
   EEB4   23               INX     H               ;INCREMENT POINTER
   EEB5   7E               MOV     A,M             ;GET CHAR TO PRINT
   EEB6   0D               DCR     C               ;DCR COUNT OF CHARS LEFT
   EEB7   C2AAEE           JNZ     LEEAA           ;DO REMAINING CHARS
   EEBA   0E03             MVI     C,3             ;NO OF SPACES TO FOLLOW NAME
   EEBC   CD61E3           CALL    BLKO            ;PRINT THEM
   EEBF   56               MOV     D,M             ;GET SYMBOL VALUE IN D,E
   EEC0   23               INX     H               ;2ND BYTE
   EEC1   5E               MOV     E,M             ;IN D,E
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 48
      


   EEC2   E5               PUSH    H               ;SAVE POINTER
   EEC3   CD5CE5           CALL    ADOUT           ;PRINT VALUE
   EEC6   D1               POP     D               ;RESTORE POINTER TO D,E
   EEC7   0E05             MVI     C,5             ;NO OF SPACES AFTER VALUE
   EEC9   C361E3           JMP     BLKO            ;PRINT THEM & RETURN
                   ;
                   ;ROUTINE TO SCAN THROUGH SPACES UNTIL NON-BLANK CHAR FOUND
                   ;
   EECC   2A01D1   SBLK:   LHLD    PNTR            ;GET POINTER
   EECF   7E       SBL1:   MOV     A,M             ;GET CHAR AT POINTER
   EED0   FE20             CPI     ' '             ;SPACE ?
   EED2   C0               RNZ                     ;NO - DONE
   EED3   23       SBL2:   INX     H               ;YES - INCREMENT POINTER
   EED4   2201D1           SHLD    PNTR            ;AND UPDATE IT
   EED7   C3CFEE           JMP     SBL1            ;THEN CHECK NEW CHAR
                   ;
                   ;THIS ROUTINE IS USED TO CHECK THE CONDITION CODE
                   ;MNEMONICS FOR CONDITIONAL JUMPS, CALLS AND RETURNS.
                   ;
   EEDA   21E0D0   COND:   LXI     H,ABUF+1        ;POINT TO 2ND CHAR
   EEDD   22D4D0           SHLD    ADDS            ;SAVE IT'S ADDR.
   EEE0   0602             MVI     B,2             ;MAX. LENGTH OF CONDITION
   EEE2   C322F0           JMP     COPC            ;TO LOOKUP IN TABLE
                   ;
                   ;HERE IS THE ASSEMBLER OPCODE TABLE
                   ;
                   ;PSEUDO OPS WITH LENGTH OF 4 (OR PADDED TO 4 WITH HEX 0'S)
                   ;COME FIRST
                   ;
   EEE5   4F5247   OTAB:   DB      'ORG'
   EEE8   0000             DW      0
   EEEA   455155           DB      'EQU'
   EEED   0001             DW      0100H
   EEEF   4442             DB      'DB'
   EEF1   0000             DW      0
   EEF3   FF               DB      0FFH
   EEF4   4453             DB      'DS'
   EEF6   0000             DW      0
   EEF8   02               DB      2
   EEF9   4457             DB      'DW'
   EEFB   0000             DW      0
   EEFD   03               DB      3
   EEFE   454E44           DB      'END'
   EF01   0004             DW      0400H
   EF03   434F4D           DB      'COM'
   EF06   0005             DW      0500H
   EF08   4C5354           DB      'LST'
   EF0B   0006             DW      0600H
   EF0D   4E4C5354         DB      'NLST'
   EF11   07               DB      7
   EF12   415343           DB      'ASC'
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 49
      


   EF15   0008             DW      0800H
   EF17   00               DB      0
                   ;
                   ;THESE ARE FOLLOWED BY 3 CHAR OPCODES (OR 2 CHAR PADDED TO 3)
                   ;
   EF18   484C54           DB      'HLT'
   EF1B   76               DB      118
   EF1C   524C43           DB      'RLC'
   EF1F   07               DB      7
   EF20   525243           DB      'RRC'
   EF23   0F               DB      15
   EF24   52414C           DB      'RAL'
   EF27   17               DB      23
   EF28   524152           DB      'RAR'
   EF2B   1F               DB      31
   EF2C   524554           DB      'RET'
   EF2F   C9               DB      201
   EF30   434D41           DB      'CMA'
   EF33   2F               DB      47
   EF34   535443           DB      'STC'
   EF37   37               DB      55
   EF38   444141           DB      'DAA'
   EF3B   27               DB      39
   EF3C   434D43           DB      'CMC'
   EF3F   3F               DB      63
   EF40   4549             DB      'EI'
   EF42   00FB             DW      0FB00H
   EF44   4449             DB      'DI'
   EF46   00F3             DW      0F300H
   EF48   4E4F50           DB      'NOP'
   EF4B   0000             DW      0
   EF4D   58434847         DB      'XCHG'
   EF51   EB               DB      235
   EF52   5854484C         DB      'XTHL'
   EF56   E3               DB      227
   EF57   5350484C         DB      'SPHL'
   EF5B   F9               DB      249
   EF5C   5043484C         DB      'PCHL'
   EF60   E900             DW      00E9H
   EF62   53544158         DB      'STAX'
   EF66   02               DB      2
   EF67   4C444158         DB      'LDAX'
   EF6B   0A00             DW      000AH
   EF6D   50555348         DB      'PUSH'
   EF71   C5               DB      197
   EF72   504F50           DB      'POP'
   EF75   00C1             DW      0C100H
   EF77   494E58           DB      'INX'
   EF7A   0003             DW      0300H
   EF7C   444358           DB      'DCX'
   EF7F   000B             DW      0B00H
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 50
      


   EF81   444144           DB      'DAD'
   EF84   0009             DW      0900H
   EF86   00               DB      0
   EF87   494E52           DB      'INR'
   EF8A   04               DB      4
   EF8B   444352           DB      'DCR'
   EF8E   05               DB      5
   EF8F   4D4F56           DB      'MOV'
   EF92   40               DB      64
   EF93   414444           DB      'ADD'
   EF96   80               DB      128
   EF97   414443           DB      'ADC'
   EF9A   88               DB      136
   EF9B   535542           DB      'SUB'
   EF9E   90               DB      144
   EF9F   534242           DB      'SBB'
   EFA2   98               DB      152
   EFA3   414E41           DB      'ANA'
   EFA6   A0               DB      160
   EFA7   585241           DB      'XRA'
   EFAA   A8               DB      168
   EFAB   4F5241           DB      'ORA'
   EFAE   B0               DB      176
   EFAF   434D50           DB      'CMP'
   EFB2   B8               DB      184
   EFB3   525354           DB      'RST'
   EFB6   C700             DW      00C7H
   EFB8   414449           DB      'ADI'
   EFBB   C6               DB      198
   EFBC   414349           DB      'ACI'
   EFBF   CE               DB      206
   EFC0   535549           DB      'SUI'
   EFC3   D6               DB      214
   EFC4   534249           DB      'SBI'
   EFC7   DE               DB      222
   EFC8   414E49           DB      'ANI'
   EFCB   E6               DB      230
   EFCC   585249           DB      'XRI'
   EFCF   EE               DB      238
   EFD0   4F5249           DB      'ORI'
   EFD3   F6               DB      246
   EFD4   435049           DB      'CPI'
   EFD7   FE               DB      254
   EFD8   494E             DB      'IN'
   EFDA   00DB             DW      0DB00H
   EFDC   4F5554           DB      'OUT'
   EFDF   D3               DB      211
   EFE0   4D5649           DB      'MVI'
   EFE3   0600             DW      0006H
                   ;
                   ;WHICH ARE FOLLOWED BY 4 CHAR OPCODES (OR LESS PADDED TO 4)
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 51
      


                   ;
   EFE5   4A4D50           DB      'JMP'
   EFE8   00C3             DW      0C300H
   EFEA   43414C4C         DB      'CALL'
   EFEE   CD               DB      205
   EFEF   4C5849           DB      'LXI'
   EFF2   0001             DW      0100H
   EFF4   4C4441           DB      'LDA'
   EFF7   003A             DW      3A00H
   EFF9   535441           DB      'STA'
   EFFC   0032             DW      3200H
   EFFE   53484C44         DB      'SHLD'
   F002   22               DB      34
   F003   4C484C44         DB      'LHLD'
   F007   2A00             DW      002AH
                   ;
                   ;WHICH IS FINALLY FOLLOWED BY THE 2 CHAR CNDX CODE TABLE
                   ;
   F009   4E5A             DB      'NZ'
   F00B   00               DB      0
   F00C   5A               DB      'Z'
   F00D   0008             DW      0800H
   F00F   4E43             DB      'NC'
   F011   10               DB      16
   F012   43               DB      'C'
   F013   0018             DW      1800H
   F015   504F             DB      'PO'
   F017   20               DB      32
   F018   5045             DB      'PE'
   F01A   28               DB      40
   F01B   50               DB      'P'
   F01C   0030             DW      3000H
   F01E   4D               DB      'M'
   F01F   0038             DW      3800H
   F021   00               DB      0
                   ;
                   ;THIS ROUTINE IS USED TO CHECK A GIVEN OPCODE
                   ;AGAINST THE LEGAL OPCODES IN THE OPCODE TABLE
                   ;
   F022   2AD4D0   COPC:   LHLD    ADDS            ;GET POINTER
   F025   1A               LDAX    D               ;FETCH CHARACTER
   F026   B7               ORA     A               ;SET FLAGS
   F027   CA34F0           JZ      COP1            ;END OF TABLE
   F02A   48               MOV     C,B             ;LENGTH OF STRING
   F02B   CD57E2           CALL    SEAR            ;SEARCH THE TABLE
   F02E   1A               LDAX    D               ;
   F02F   C8               RZ                      ;RETURN IF MATCH
   F030   13               INX     D               ;NEXT STRING
   F031   C322F0           JMP     COPC            ;CONTINUE SEARCH
   F034   3C       COP1:   INR     A               ;CLEAR ZERO FLAG
   F035   13               INX     D               ;INCREMENT ADDRESS
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 52
      


   F036   C9               RET                     ;NO MATCH
                   ;
                   ;THIS ROUTINE CHECKS THE LEGAL OPCODES IN BOTH PASS 1
                   ;AND PASS 2.  IN PASS 1 THE PROGRAM COUNTER IS INCREMENTED
                   ;BY THE CORRECT NUMBER OF BYTES. AN ADDRESS IS
                   ;ALSO SET SO THAT AN INDEXED JUMP CAN BE MADE TO
                   ;PROCESS THE OPCODE FOR PASS 2.
                   ;
   F037   21DFD0   OPCD:   LXI     H,ABUF          ;GET ADDRESS
   F03A   22D4D0           SHLD    ADDS            ;SAVE IT
   F03D   11E5EE           LXI     D,OTAB          ;OPCODE TABLE ADDR.
   F040   0604             MVI     B,4             ;LENGTH OF PSEUDO-OP ENTRIES
   F042   CD22F0           CALL    COPC            ;LOOK IT UP IN TABLE
   F045   CAE6F0           JZ      PSEU            ;PSEUDO-OP IF FOUND
   F048   05               DCR     B               ;ELSE TRY 3-CHAR OPCODES
   F049   CD22F0           CALL    COPC            ;LOOK IT UP
   F04C   CA53F0           JZ      OP1             ;IF FOUND IN THIS GROUP
   F04F   04               INR     B               ;THEN TRY FOUR CHAR OPCODES
   F050   CD22F0           CALL    COPC            ;LOOK IT UP
   F053   211DEE   OP1:    LXI     H,ASTO          ;TYPE 1 INSTRUCTIONS
   F056   0E01     OP2:    MVI     C,1             ;1 BYTE INST.
   F058   CAB3F0           JZ      OCNT            ;IF FOUND
                   ;
   F05B   CD22F0   OPC2:   CALL    COPC            ;CHECK FOR STAX, LDAX
   F05E   2164ED           LXI     H,TYP2          ;
   F061   CA56F0           JZ      OP2             ;
   F064   CD22F0           CALL    COPC            ;CHK FOR PUSH, POP, INX, DCX, DAD
                   ;
   F067   2177ED           LXI     H,TYP3          ;
   F06A   CA56F0           JZ      OP2             ;
   F06D   05               DCR     B               ;3 CHAR OPCODES
   F06E   CD22F0           CALL    COPC            ;ACC INST: INR, DCR, MOV, RST
                   ;
   F071   2196ED           LXI     H,TYP4          ;
   F074   CA56F0           JZ      OP2             ;
                   ;
   F077   CD22F0   OPC3:   CALL    COPC            ;IMMEDIATE INSTRUCTIONS
   F07A   21CBED           LXI     H,TYP5
   F07D   0E02             MVI     C,2             ;2 BYTE INSTRUCTIONS
   F07F   CAB3F0           JZ      OCNT            ;
   F082   04               INR     B               ;4 CHAR OPCODES
   F083   CD22F0           CALL    COPC            ;JMP, CALL, LXI, LDA, STA,
                   ;                               ;LHLD, SHLD
   F086   CAAEF0           JZ      OP4             ;
   F089   CDDAEE           CALL    COND            ;CONDITIONAL INST.
   F08C   C2D8F0           JNZ     OERR            ;ILLEGAL OPCODE
   F08F   C6C0             ADI     192             ;ADD BASE VALUE TO RETURN
   F091   57               MOV     D,A             ;
   F092   0603             MVI     B,3             ;3 CHARACTER OPCODES
   F094   3ADFD0           LDA     ABUF            ;FETCH 1ST CHAR
   F097   4F               MOV     C,A             ;SAVE IT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 53
      


   F098   FE52             CPI     'R'             ;CONDITIONAL RETURN
   F09A   7A               MOV     A,D             ;
   F09B   CA53F0           JZ      OP1             ;
   F09E   79               MOV     A,C             ;
   F09F   14               INR     D               ;FORM CONDITIONAL JUMP
   F0A0   14               INR     D               ;
   F0A1   FE4A             CPI     'J'             ;CONDITIONAL JUMP
   F0A3   CAADF0           JZ      OPAD            ;
   F0A6   FE43             CPI     'C'             ;CONDITIONAL CALL
   F0A8   C2D8F0           JNZ     OERR            ;ILLEGAL OPCODE
   F0AB   14               INR     D               ;FORM CONDITIONAL CALL
   F0AC   14               INR     D               ;
   F0AD   7A       OPAD:   MOV     A,D             ;GET OPCODE
   F0AE   2101EE   OP4:    LXI     H,TYP6          ;
   F0B1   0E03     OP5:    MVI     C,3             ;3 BYTE INSTRUCTIONS
   F0B3   3209D1   OCNT:   STA     TEMP            ;SAVE OPCODE
                   ;
                   ;CHECK FOR OPCODE ONLY CONTAINING CORRECT NO. OF CHARS.
                   ;THUS ADDQ, SAY, WOULD GIVE AN ERROR
                   ;
   F0B6   3EDF             MVI     A,ABUF AND 0FFH ;LOAD BUFFER ADDRESS
   F0B8   80               ADD     B               ;LENGTH OF OPCODE
   F0B9   5F               MOV     E,A             ;
   F0BA   3ED0             MVI     A,ABUF/256      ;
   F0BC   CE00             ACI     0               ;GET HIGH ORDER ADDRESS
   F0BE   57               MOV     D,A             ;
   F0BF   1A               LDAX    D               ;FETCH CHAR AFTER OPCODE
   F0C0   B7               ORA     A               ;IT SHOULD BE ZERO
   F0C1   C2D8F0           JNZ     OERR            ;OPCODE ERROR
   F0C4   3AF9D0           LDA     PASI            ;FETCH PASS INDICATOR
   F0C7   0600     OCN1:   MVI     B,0             ;
   F0C9   EB               XCHG                    ;
   F0CA   2AF7D0   OCN2:   LHLD    ASPC            ;FETCH PROGRAM COUNTER
   F0CD   09               DAD     B               ;ADD IN BYTE COUNT
   F0CE   22F7D0           SHLD    ASPC            ;STORE PC
   F0D1   B7               ORA     A               ;WHICH PASS
   F0D2   C8               RZ                      ;RETURN IF PASS 1
   F0D3   3A09D1           LDA     TEMP            ;FETCH OPCODE
   F0D6   EB               XCHG                    ;
   F0D7   E9               PCHL                    ;
                   ;
   F0D8   213CF3   OERR:   LXI     H,ERRO          ;SET ERROR ADDRESS
   F0DB   0E03     LF0DB:  MVI     C,3             ;LEAVE 3 BYTES FOR PATCH
   F0DD   C3C4F0           JMP     OCN1-3          ;
                   ;
   F0E0   2151F3   LF0E0:  LXI     H,ERRL
   F0E3   C3DBF0           JMP     LF0DB
                   ;
   F0E6   21E3D0   PSEU:   LXI     H,ABUF+4        ;SET BUFFER ADDRESS
   F0E9   7E               MOV     A,M             ;FETCH CHAR AFTER OPCODE
   F0EA   B7               ORA     A               ;IT SHOULD BE ZERO
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 54
      


   F0EB   C2D8F0           JNZ     OERR            ;IF NOT
   F0EE   3AF9D0           LDA     PASI            ;GET PASS INDICATOR
   F0F1   B7               ORA     A               ;PASS 1 ?
   F0F2   CAC2EB           JZ      PSU1            ;YES - JUMP
   F0F5   C371EC           JMP     PSU2            ;NO - DO 2ND PASS OPERATIONS
                   ;
                   ;THIS ROUTINE IS USED TO PROCESS LABELS.
                   ;IT CHECKS TO SEE IF A LABEL IS IN THE SYMBOL TABLE
                   ;OR NOT.  ON RETURN, Z=1 INDICATES A MATCH WAS FOUND
                   ;AND H,L CONTAIN THE VALUE ASSOCIATED WITH THE LABEL.
                   ;THE REGISTER NAMES A, B, C, D, E, H, L, AND M ARE
                   ;PRE-DEFINED AND NEED NOT BE ENTERED BY THE USER.
                   ;ON RETURN, C=1 INDICATES A LABEL ERROR.
                   ;
   F0F8   FE41     SLAB:   CPI     'A'             ;CHECK FOR LEGAL CHAR
   F0FA   D8               RC                      ;ILLEGAL CHAR
   F0FB   FE5B             CPI     'Z'+1           ;CHECK FOR LEAGAL CHAR
   F0FD   3F               CMC                     ;SETTING CARRY FOR PROPER RET
   F0FE   D8               RC                      ;ILLEGAL CHAR
   F0FF   CD3EF1           CALL    ALPS            ;PLACE SYMBOL IN ABUF
   F102   21DFD0           LXI     H,ABUF          ;POINT TO SYMBOL
   F105   3AF9D0           LDA     PASI            ;GET PASS INDICATOR
   F108   FE02             CPI     2               ;DOING XREF/S.T. PASS ?
   F10A   3C               INR     A               ;BUMP PASS INDICATOR IN ACCUM.
   F10B   D0               RNC                     ;RETURN IF ON XREF/S.T. PASS
   F10C   22D4D0           SHLD    ADDS            ;SAVE ADDRESS OF SYMBOL
   F10F   05               DCR     B               ;CHECK IF ONLY 1 CHAR SYMBOL
   F110   C223F1           JNZ     SLA1            ;LOOK THEM UP IN REG. TABLE
   F113   04               INR     B               ;SET B=1
   F114   112DF1           LXI     D,RTAB          ;POINT TO REGISTER TABLE
   F117   CD22F0           CALL    COPC            ;LOOK FOR MATCH
   F11A   C223F1           JNZ     SLA1            ;NOT FOUND, TRY SYMBOL TABLE
   F11D   6F               MOV     L,A             ;FOUND, VALUE TO L
   F11E   2600             MVI     H,0             ;AND MAKE H ZERO
   F120   37               STC                     ;SET CARRY
   F121   3F               CMC                     ;COMPLEMENT CARRY
   F122   C9               RET                     ;DONE
   F123   2A32D1   SLA1:   LHLD    SYMADD          ;GET SYMBOL TABLE ADDR
   F126   EB               XCHG                    ;TO D,E
   F127   0605             MVI     B,LLAB          ;LENGTH OF LABELS
   F129   CD28E2           CALL    COMS            ;CHECK TABLE
   F12C   C9               RET                     ;WITH FLAGS SET
                   ;
                   ;HERE IS THE INTERNAL REGISTER TABLE
                   ;
   F12D   41       RTAB:   DB      'A'
   F12E   07               DB      7
   F12F   42               DB      'B'
   F130   00               DB      0
   F131   43               DB      'C'
   F132   01               DB      1
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 55
      


   F133   44               DB      'D'
   F134   02               DB      2
   F135   45               DB      'E'
   F136   03               DB      3
   F137   48               DB      'H'
   F138   04               DB      4
   F139   4C               DB      'L'
   F13A   05               DB      5
   F13B   4D               DB      'M'
   F13C   06               DB      6
   F13D   00               DB      0
                   ;
                   ;THIS ROUTINE SCANS THE INPUT LINE AND PLACES THE
                   ;OPCODES AND LABELS IN THE ABUF BUFFER.  THE SCAN TERMINATES
                   ;WHEN A NON ALPHANUMERIC CHARACTER (A-Z, 0-9) IS FOUND.
                   ;
   F13E   0600     ALPS:   MVI     B,0             ;SET COUNT
   F140   12       ALP1:   STAX    D               ;STORE CHAR IN BUFFER
   F141   04               INR     B               ;INCREMENT COUNT
   F142   78               MOV     A,B             ;FETCH COUNT
   F143   FE0F             CPI     15              ;MAX BUFFER SIZE
   F145   D0               RNC                     ;RETURN IF BUFFER FILLED
   F146   13               INX     D               ;INCREMENT ABUF POINTER
   F147   23               INX     H               ;INCREMENT INPUT LINE POINTER
   F148   2201D1           SHLD    PNTR            ;SAVE INPUT POINTER
   F14B   7E               MOV     A,M             ;FETCH CHARACTER
   F14C   FE30             CPI     '0'             ;CHECK FOR LEGAL CHAR
   F14E   D8               RC                      ;ILLEGAL CHAR
   F14F   FE3A             CPI     '9'+1           ;AGAIN
   F151   DA40F1           JC      ALP1            ;NUMERIC = O.K.
   F154   FE41     LF154:  CPI     'A'             ;TEST FOR LETTER
   F156   D8               RC                      ;ILLEGAL CHAR
   F157   FE5B             CPI     'Z'+1           ;
   F159   DA40F1           JC      ALP1            ;VALID LETTER
   F15C   C9               RET                     ;W/CARRY SET, ILLEGAL CHAR
                   ;
                   ;THIS ROUTINE IS USED TO SCAN THE INPUT LINE AND DETERMINE
                   ;THE VALUE OF AN OPERAND FIELD.  ON RETURN, VALUE IS IN H,L.
                   ;
   F15D   CDCCEE   ASBL:   CALL    SBLK            ;GET THE FIRST ARGUMENT
   F160   2A01D1   ASCN:   LHLD    PNTR            ;FETCH SCAN POINTER
   F163   7E               MOV     A,M             ;FETCH CHARACTER
   F164   210000           LXI     H,0             ;GET A ZERO
   F167   2205D1           SHLD    OPRD            ;INITIALIZE OPERAND
   F16A   2C               INR     L               ;L = 1 ==> BECOMES OPRI
   F16B   67               MOV     H,A             ;CHAR TO H, BECOMES GTLT
   F16C   2207D1           SHLD    OPRI            ;SAVE OPRI AND GTLT
   F16F   2A01D1   NXT1:   LHLD    PNTR            ;GET SCAN POINTER
   F172   2B               DCX     H               ;INIT. FOR LOOP BELOW
   F173   CD6AE2           CALL    ZBUF            ;CLEAR OUT ABUFF
   F176   3204D1           STA     SIGN            ;ZERO SIGN INDICATOR
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 56
      


   F179   23       NXT2:   INX     H               ;INCREMENT POINTER
   F17A   7E               MOV     A,M             ;GET CHAR
   F17B   FE3C             CPI     '<'             ;HIGH ORDER BYTE SIGN ?
   F17D   CA79F1           JZ      NXT2            ;ALREADY TAKEN CARE OF (GTLT)
   F180   FE3E             CPI     '>'             ;LOW ORDER BYTE SIGN ?
   F182   CA79F1           JZ      NXT2            ;ALREADY TAKEN CARE OF (GTLT)
   F185   FE21             CPI     ' '+1           ;CAR. RETURN OR SPACE ?
   F187   DAC8F2           JC      SEND            ;END OF OPERAND FIELD THEN
   F18A   FE2C             CPI     ','             ;FIELD SEPARATOR ?
   F18C   CAC8F2           JZ      SEND            ;ALSO END OF FIELD
                   ;
                   ;CHECK FOR OPERATORS
                   ;
   F18F   FE2B             CPI     '+'             ;CHECK FOR PLUS
   F191   CAA6F1           JZ      LF1A6           ;STORE 0 AS SIGN
   F194   04               INR     B               ;MAKE B 01
   F195   FE2D             CPI     '-'             ;MINUS SIGN ?
   F197   CAA6F1           JZ      LF1A6           ;SAVE NON-ZERO SIGN
   F19A   04               INR     B               ;MAKE B 02
   F19B   FE2A             CPI     '*'             ;CHECK FOR MULTIPLY
   F19D   CAA6F1           JZ      LF1A6           ;STORE B AS 02
   F1A0   04               INR     B               ;MAKE B 03
   F1A1   FE2F             CPI     '/'             ;CHECK FOR DIVIDE
   F1A3   C2BAF1           JNZ     ASC2            ;IF NOT SIGN, CHK FOR OPERAND
   F1A6   78       LF1A6:  MOV     A,B             ;MOVE B TO A
   F1A7   3204D1           STA     SIGN            ;SET SIGN BYTE
   F1AA   3A07D1   ASC1:   LDA     OPRI            ;FETCH OPERAND INDICATOR
   F1AD   FE02             CPI     2               ;CHECK FOR 2 OPERATORS TOGETHER
   F1AF   CA1AF3           JZ      ERRS            ;SYNTAX ERROR
   F1B2   3E02             MVI     A,2             ;NOW SET UP OPRI AS 2
   F1B4   3207D1           STA     OPRI            ;AND STORE IT
   F1B7   C379F1           JMP     NXT2            ;ANOTHER WILL NOT BE ALLOWED
                   ;
                   ;CHECK FOR OPERANDS
                   ;
   F1BA   4F       ASC2:   MOV     C,A             ;SAVE CHAR
   F1BB   3A07D1           LDA     OPRI            ;GET OPERATOR
   F1BE   B7               ORA     A               ;CHECK FOR TWO OPERANDS
   F1BF   CA1AF3           JZ      ERRS            ;TWO IN A ROW NOT ALLOWED
   F1C2   79               MOV     A,C             ;RESTORE CHAR
   F1C3   FE24             CPI     '$'             ;PGM. COUNTER ?
   F1C5   CAC3EC           JZ      LECC3           ;GET IT & CONTINUE
                   ;
                   ;CHECK FOR ASCII CHARACTERS
                   ;
   F1C8   FE27     ASC3:   CPI     27H             ;QUOTE MARK ?
   F1CA   C2F4F1           JNZ     ASC5            ;NO - MUST BE SOMETHING ELSE
   F1CD   110000           LXI     D,0             ;INITIALIZE CHAR. VALUE
   F1D0   0E03             MVI     C,3             ;MAX CHAR COUNT + 1
   F1D2   23       ASC4:   INX     H               ;POINT TO NEXT CHAR
   F1D3   2201D1           SHLD    PNTR            ;SAVE POINTER
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 57
      


   F1D6   7E               MOV     A,M             ;GET CHAR
   F1D7   FE0D             CPI     0DH             ;CARRIAGE RETURN ?
   F1D9   CA37F3           JZ      ERRA            ;ARGUMENT ERROR THEN
   F1DC   FE27             CPI     27H             ;2ND QUOTE MARK ?
   F1DE   C2EBF1           JNZ     SSTR            ;NO - PROCESS CHAR
   F1E1   23               INX     H               ;POINT PAST 2ND QUOTE
   F1E2   2201D1           SHLD    PNTR            ;UPDATE POINTER
   F1E5   7E               MOV     A,M             ;FETCH NEXT CHAR
   F1E6   FE27             CPI     27H             ;CHECK FOR TWO IN A ROW
   F1E8   C205F2           JNZ     AVAL+1          ;WAS TERMINAL QUOTE
   F1EB   0D       SSTR:   DCR     C               ;CHECK COUNT
   F1EC   CA37F3           JZ      ERRA            ;TOO MANY CHARS
   F1EF   53               MOV     D,E             ;1ST CHAR (IF ANY) IN D
   F1F0   5F               MOV     E,A             ;THIS CHAR IN E
   F1F1   C3D2F1           JMP     ASC4            ;GET NEXT CHAR
   F1F4   FE30     ASC5:   CPI     '0'             ;SEE IF NUMERIC
   F1F6   DA37F3           JC      ERRA            ;NO CHARS < 30H LEGAL
   F1F9   FE3A             CPI     '9'+1           ;TRY HIGH END
   F1FB   D274F2           JNC     ALAB            ;ALPHABETIC - TRY LABEL
   F1FE   CDEBF2           CALL    NUMS            ;NUMERIC - CONVERT
   F201   DA37F3           JC      ERRA            ;ARGUMENT ERROR
   F204   EB       AVAL:   XCHG                    ;OPERAND VALUE IN H,L
   F205   2A05D1           LHLD    OPRD            ;FETCH OPERAND VALUE
   F208   AF               XRA     A               ;GET A ZERO
   F209   3207D1           STA     OPRI            ;AND CLEAR OPERAND INDICATOR
   F20C   3A04D1           LDA     SIGN            ;GET SIGN
   F20F   FE01             CPI     1               ;MINUS SIGN ?
   F211   CA1EF2           JZ      ASUB            ;THEN DO A SUBTACTION
   F214   D227F2           JNC     LF227           ;MULTIPLY OR DIVIDE
   F217   19               DAD     D               ;ADD NEW OPERAND DE TO OLD HL
   F218   2205D1   ASC7:   SHLD    OPRD            ;AND UPDATE THE RESULT
   F21B   C36FF1           JMP     NXT1            ;NOW SEE IF MORE
   F21E   7D       ASUB:   MOV     A,L             ;GET OLD OPRAND IN H,L
   F21F   93               SUB     E               ;SUBTRACT NEW OPRAND IN D,E
   F220   6F               MOV     L,A             ;RESTORE RESULT TO H,L
   F221   7C               MOV     A,H             ;NOW DO HIGH ORDER BYTE
   F222   9A               SBB     D               ;
   F223   67               MOV     H,A             ;PUT IT BACK
   F224   C318F2           JMP     ASC7            ;AND FINISH UP
                   ;
                   ;DO MULTIPLY DIVIDE
                   ;
   F227   42       LF227:  MOV     B,D             ;MOVE CURRENT OPRD IN DE TO BC
   F228   4B               MOV     C,E             ;
   F229   EB               XCHG                    ;AND OLD OPRND TO D,E
   F22A   210000           LXI     H,0             ;INITIALIZE ANSWER
   F22D   FE03             CPI     3               ;DOING DIVISION ?
   F22F   CA47F2           JZ      LF247           ;YES
   F232   CD38F2           CALL    LF238           ;NO, MULITPLICATION - DO IT
   F235   C318F2           JMP     ASC7            ;THEN FINISH UP
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 58
      


                   ;MULTIPLICATION ROUTINE
                   ;
                   ;THIS ALGORITHM IS INTERESTING BUT DIFFICULT TO UNDERSTAND
                   ;UNTIL STUDIED FOR A WHILE. BUT IT DOES WORK
                   ;
   F238   3E10     LF238:  MVI     A,16            ;16 BITS
   F23A   29       LF23A:  DAD     H               ;MULTIPLY PARTIAL ANS. BY 2
   F23B   EB               XCHG                    ;CHANGE REGISTERS
   F23C   29               DAD     H               ;MULT. MULTIPLIER BY 2
   F23D   EB               XCHG                    ;RESTORE ORIG. REGISTERS
   F23E   D242F2           JNC     LF242           ;IF 2X MULTIPLIER ==> NO CARRY
   F241   09               DAD     B               ;ADD MULTIPLICAND TO INTER ANS
   F242   3D       LF242:  DCR     A               ;DCR NO OF BITS LEFT TO CHECK
   F243   C23AF2           JNZ     LF23A           ;DO IT OVER IF NOT DONE
   F246   C9               RET                     ;ELSE FINAL ANS. IS IN H,L
                   ;
                   ;DIVISION ROUTINE
                   ;
                   ;FIRST CHECK FOR DIVIDE BY ZERO
                   ;
   F247   78       LF247:  MOV     A,B             ;GET BYTE OF DIVISOR
   F248   B1               ORA     C               ;OR IT WITH OTHER BYTE
   F249   CA18F2           JZ      ASC7            ;CAN'T DIVIDE BY ZERO
   F24C   CD53F2           CALL    LF253           ;DO ACTUALLY DO THE DIVISION
   F24F   EB               XCHG                    ;ANSWER TO H,L
   F250   C318F2           JMP     ASC7            ;TO FINISH UP
                   ;
                   ;DIVISION ROUTINE FOLLOWS. IT IS SIMILAR IN PRINCIPLE TO
                   ;THE MULTIPLICATION ROUTINE
                   ;
   F253   3E10     LF253:  MVI     A,16            ;16 BITS
   F255   32F3D0   LF255:  STA     SCNT            ;SAVE AS COUNT
   F258   29               DAD     H               ;SHIFT LEFT
   F259   EB               XCHG                    ;SWITCH REGISTERS
   F25A   29               DAD     H               ;SHIFT LEFT
   F25B   EB               XCHG                    ;RESTORE REGISTERS
   F25C   D260F2           JNC     LF260           ;IF NO CARRY
   F25F   23               INX     H               ;ELSE INCREMENT H,L
   F260   7D       LF260:  MOV     A,L             ;AND SUBTRACT DIVISOR FROM IT
   F261   91               SUB     C               ;
   F262   6F               MOV     L,A             ;
   F263   7C               MOV     A,H             ;
   F264   98               SBB     B               ;
   F265   67               MOV     H,A             ;
   F266   13               INX     D               ;INCREMENT PARTIAL ANSWER
   F267   D26CF2           JNC     LF26C           ;OK IF NO CARRY
   F26A   09               DAD     B               ;ADD DIVISOR TO H,L
   F26B   1B               DCX     D               ;AND DECREMENT ANSWER
   F26C   3AF3D0   LF26C:  LDA     SCNT            ;GET COUNT
   F26F   3D               DCR     A               ;DECREMENT IT
   F270   C255F2           JNZ     LF255           ;IF NOT DONE, DO MORE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 59
      


   F273   C9               RET                     ;ELSE DONE, ANS IN D,E
                   ;
                   ;CHECK FOR SYMBOLS FROM SYMBOL TABLE
                   ;
   F274   CDF8F0   ALAB:   CALL    SLAB            ;SEE IF LABEL IN TABLE
   F277   CA04F2           JZ      AVAL            ;IF FOUND
   F27A   DA37F3           JC      ERRA            ;IF LABEL ERROR
   F27D   3AF9D0           LDA     PASI            ;NOT FOUND, GET PASS IND.
   F280   FE02             CPI     2               ;DOING S.T./XREF PASS ?
   F282   D291F2           JNC     LF291           ;YES - PROCESS
   F285   1100D3           LXI     D,SYSYM         ;ELSE TRY SYSTEM SYMBOL TABLE
   F288   CD28E2           CALL    COMS            ;SEARCH IT
   F28B   CA04F2           JZ      AVAL            ;IF FOUND
   F28E   C325F3           JMP     ERRU            ;ELSE UNDEFINED SYMBOL ERROR
                   ;
                   ;THE FOLLOWING ROUTINE IS USED TO HANDLE SYMBOLS DURING A
                   ;SYMBOL TABLE/XREF PASS (3RD PASS, PASI = 2).
                   ;DOES CROSS REFERENCE
                   ;
   F291   EB       LF291:  XCHG                    ;D,E ==> SYMBOL NAME IN ABUF
   F292   2A30D1           LHLD    SYMSV           ;SYMBOL DOING XREF PASS FOR
   F295   0E05             MVI     C,LLAB          ;LENGTH OF SYMBOL
   F297   CD57E2           CALL    SEAR            ;SAME ?
   F29A   C2C2F2           JNZ     LF2C2           ;NO
   F29D   21F3D0           LXI     H,SCNT          ;POINT TO SYMBOL COUNT
   F2A0   34               INR     M               ;INCREMENT IT
   F2A1   7E               MOV     A,M             ;GET IT
   F2A2   FE0C             CPI     12              ;MAX. NO ON ONE LINE ?
   F2A4   DAB1F2           JC      LF2B1           ;NO - DO MORE THIS LINE
   F2A7   3601             MVI     M,1             ;YES - RESET COUNT
   F2A9   CD16E2           CALL    CRLF            ;DO CAR RET/LINE FEED
   F2AC   0E11             MVI     C,17            ;AND PRINT 17 SPACES
   F2AE   CD61E3           CALL    BLKO            ;DO IT
   F2B1   21DFD1   LF2B1:  LXI     H,IBUF-5        ;POINT TO LINE NO.
   F2B4   0E04             MVI     C,4             ;LENGTH OF LINE NO
   F2B6   46       LF2B6:  MOV     B,M             ;GET A CHAR
   F2B7   CDCFD0           CALL    OUT8            ;PRINT IT
   F2BA   23               INX     H               ;POINT TO NEXT CHAR
   F2BB   0D               DCR     C               ;DECR CHAR COUNT
   F2BC   C2B6F2           JNZ     LF2B6           ;DO NEXT CHAR IF NOT DONE
   F2BF   CD5CE3           CALL    LE35C           ;PUT OUT A SPACE AFTER LINE NO
   F2C2   AF       LF2C2:  XRA     A               ;CLEAR FLAGS
   F2C3   2600             MVI     H,0             ;AND H,L
   F2C5   C304F2           JMP     AVAL            ;AND CONTINUE SEARCH
                   ;
                   ;ROUTINE TO CHECK FOR TERMINATING CHARACTERS IN LABEL FILEDS
                   ;
   F2C8   3A07D1   SEND:   LDA     OPRI            ;FETCH OPERAND INDICATOR
   F2CB   B7               ORA     A               ;SET FLAGS
   F2CC   C21AF3           JNZ     ERRS            ;SYNTAX ERROR
   F2CF   2A05D1           LHLD    OPRD            ;GET OPERAND VALUE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 60
      


   F2D2   3A08D1           LDA     GTLT            ;GET SHIFT INDICATOR
   F2D5   FE3C             CPI     '<'             ;USING HIGH HALF ONLY ?
   F2D7   C2DEF2           JNZ     LF2DE           ;NO - OK AS IS
   F2DA   6C               MOV     L,H             ;YES - MOVE HIGH HALF TO L
   F2DB   C3E3F2           JMP     LF2E3           ;AND CLEAR HIGH HALF
   F2DE   FE3E     LF2DE:  CPI     '>'             ;USING LOW HALF ONLY ?
   F2E0   C2E5F2           JNZ     SEN1            ;NO - OK AS IS THEN
   F2E3   2600     LF2E3:  MVI     H,0             ;ELSE CLEAR HIGH HALF
   F2E5   7C       SEN1:   MOV     A,H             ;GET HIGH ORDER BYTE
   F2E6   1109D1           LXI     D,TEMP          ;GET ADDRESS
   F2E9   B7               ORA     A               ;SET FLAGS
   F2EA   C9               RET                     ;DONE
                   ;
                   ;GET A NUMERIC VALUE, HEX, OCTAL, OR DECIMAL
                   ;
   F2EB   CD3EF1   NUMS:   CALL    ALPS            ;PUT CHARS IN ABUFF
   F2EE   1B               DCX     D               ;POINT TO LAST CHAR
   F2EF   1A               LDAX    D               ;GET LAST CHAR
   F2F0   01DFD0           LXI     B,ABUF          ;B,C POINT TO NUMBER
   F2F3   FE48             CPI     'H'             ;HEX ?
   F2F5   CA07F3           JZ      NUM2            ;YES - PROCESS
   F2F8   FE51             CPI     'Q'             ;OCTAL ?
   F2FA   CA0CF3           JZ      NUM3            ;YES - PROCESS
   F2FD   FE44             CPI     'D'             ;DECIMAL ?
   F2FF   C20AE0           JNZ     ADEC            ;PROCESS DECIMAL BY DEFAULT
   F302   AF       NUM1:   XRA     A               ;GET BINARY ZERO
   F303   12               STAX    D               ;CLEAR THE TYPE LETTER
   F304   C30AE0           JMP     ADEC            ;PROCESS DECIMAL
   F307   AF       NUM2:   XRA     A               ;GET A BINARY ZERO
   F308   12               STAX    D               ;CLEAR THE TRAILING H
   F309   C3FAE2           JMP     AHEX            ;PROCESS HEX
   F30C   AF       NUM3:   XRA     A               ;GET A BINARY ZERO
   F30D   12               STAX    D               ;CLEAR THE TRAILING Q
   F30E   C333E3           JMP     AOCT            ;PROCESS OCTAL
                   ;
                   ;FOLLOWING ARE THE ERROR REPORTING ROUTINES
                   ;
   F311   3E52     ERRR:   MVI     A,'R'           ;REGISTER ERROR
   F313   210000           LXI     H,0             ;CLEAR H,L
   F316   32DBD1           STA     OBUF+18         ;WHERE THE ERROR LETTER GOES
   F319   C9               RET                     ;DONE
   F31A   3E53     ERRS:   MVI     A,'S'           ;SYNTAX ERROR
   F31C   32DBD1           STA     OBUF+18         ;WHERE THE ERROR LETTER GOES
   F31F   210000           LXI     H,0             ;CLEAR H,L
   F322   C3E5F2           JMP     SEN1            ;FINISH UP & GO HOME
   F325   3E55     ERRU:   MVI     A,'U'           ;UNDEFINED SYMBOL
   F327   C31CF3           JMP     ERRS+2
   F32A   3E56     ERRV:   MVI     A,'V'           ;VALUE ERROR
   F32C   C313F3           JMP     ERRR+2
   F32F   3E4D     ERRM:   MVI     A,'M'           ;MISSING LABEL
   F331   32DBD1           STA     OBUF+18         ;WHERE THE ERROR LETTER GOES
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 61
      


   F334   C341EB           JMP     LEB41           ;FINISH STATEMENT PROCESSING
   F337   3E41     ERRA:   MVI     A,'A'           ;ARGUMENT ERROR
   F339   C31CF3           JMP     ERRS+2
   F33C   3E4F     ERRO:   MVI     A,'O'           ;OPCODE ERROR
   F33E   32DBD1           STA     OBUF+18         ;WHERE ERROR LETTER GOES
   F341   3AF9D0           LDA     PASI            ;GET PASS INDICATOR
   F344   B7               ORA     A               ;SET FLAGS
   F345   C8               RZ                      ;RET IF ON 1ST PASS
   F346   0E03             MVI     C,3             ;ELSE SET UP TO LEAVE 3 BYTES
   F348   AF       ERO1:   XRA     A               ;GET A BINARY ZERO
   F349   CD1DEE           CALL    ASTO            ;PUT IT IN MEMORY & LISTING
   F34C   0D               DCR     C               ;DECR COUNT
   F34D   C248F3           JNZ     ERO1            ;DO MORE IF NOT DONE
   F350   C9               RET                     ;DONE - ROOM LEFT FOR PATCH
   F351   3E4C     ERRL:   MVI     A,'L'           ;LABEL ERROR
   F353   C33EF3           JMP     ERRO+2
   F356   3E44     ERRD:   MVI     A,'D'           ;DUPLICATE LABEL
   F358   32DBD1           STA     OBUF+18         ;WHERE ERROR LETTER GOES
   F35B   CD41EB           CALL    LEB41           ;DISPLAY THE ERROR
   F35E   C38EEB           JMP     OPC             ;PROCESS OPCODE
                   ;
                   ;FOLLOWING IS THE LINE FORMATING ROUTINE
                   ;
                   ;IT IS BEING LEFT UN-COMMENTED SO THAT YOU MAY TRY TO
                   ;COMMENT IT YOURSELF & THEREFORE HAVE A BETTER APPRECIATION
                   ;OF THE WORK I HAVE GONE TO - NOTE THAT IT IS LESS THAN TWO
                   ;PAGES LONG, AND WE ARE NOW OVER 50 PAGES INTO THIS MONSTER.
                   ;HAVE FUN.  (PS - I HAVE GONE TO THE TROUBLE OF PUTING
                   ;IN SYMBOLIC REFERENCES TO MAKE THE CODE RE-ASSEMBLEABLE)
                   ;
   F361   0E00     LF361:  MVI     C,0
   F363   21E4D1           LXI     H,IBUF
   F366   7E               MOV     A,M
   F367   FE2A             CPI     COMCHR
   F369   C8               RZ
   F36A   0602             MVI     B,2
   F36C   CD7AF3           CALL    LF37A
   F36F   D8               RC
   F370   04               INR     B
   F371   CD7AF3           CALL    LF37A
   F374   D8               RC
   F375   1602             MVI     D,2
   F377   C37CF3           JMP     LF37C
   F37A   1601     LF37A:  MVI     D,1
   F37C   78       LF37C:  MOV     A,B
   F37D   82               ADD     D
   F37E   47               MOV     B,A
   F37F   3A8FD1           LDA     TERMW
   F382   D635             SUI     (IBUF+81) AND 0FFH
   F384   CA92F3           JZ      LF392
   F387   D28EF3           JNC     LF38E
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 62
      


   F38A   05               DCR     B
   F38B   C392F3           JMP     LF392
   F38E   7A       LF38E:  MOV     A,D
   F38F   17               RAL
   F390   80               ADD     B
   F391   47               MOV     B,A
   F392   78       LF392:  MOV     A,B
   F393   C605             ADI     5
   F395   47               MOV     B,A
   F396   5A       LF396:  MOV     E,D
   F397   0C       LF397:  INR     C
   F398   7E               MOV     A,M
   F399   FE20             CPI     20H
   F39B   D8               RC
   F39C   23               INX     H
   F39D   C296F3           JNZ     LF396
   F3A0   1D               DCR     E
   F3A1   C297F3           JNZ     LF397
   F3A4   0C       LF3A4:  INR     C
   F3A5   7E               MOV     A,M
   F3A6   FE20             CPI     20H
   F3A8   D8               RC
   F3A9   23               INX     H
   F3AA   CAA4F3           JZ      LF3A4
   F3AD   79               MOV     A,C
   F3AE   90               SUB     B
   F3AF   D0               RNC
   F3B0   2B               DCX     H
   F3B1   2B               DCX     H
   F3B2   3600             MVI     M,0
   F3B4   4F               MOV     C,A
   F3B5   15               DCR     D
   F3B6   C2C5F3           JNZ     LF3C5
   F3B9   2A01D1           LHLD    PNTR
   F3BC   2F               CMA
   F3BD   3C               INR     A
   F3BE   5F               MOV     E,A
   F3BF   1600             MVI     D,0
   F3C1   19               DAD     D
   F3C2   2201D1           SHLD    PNTR
   F3C5   69       LF3C5:  MOV     L,C
   F3C6   26FF             MVI     H,0FFH
   F3C8   0E00             MVI     C,0
   F3CA   1136D2           LXI     D,IBUF+82
   F3CD   19               DAD     D
   F3CE   EB               XCHG
   F3CF   CD79E9           CALL    RMOV
   F3D2   EB               XCHG
   F3D3   23       LF3D3:  INX     H
   F3D4   3620             MVI     M,20H
   F3D6   7D               MOV     A,L
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 63
      


   F3D7   BB               CMP     E
   F3D8   C2D3F3           JNZ     LF3D3
   F3DB   23               INX     H
   F3DC   23               INX     H
   F3DD   48               MOV     C,B
   F3DE   C9               RET
   F3DF   3A8FD1   LF3DF:  LDA     TERMW
   F3E2   3C               INR     A
   F3E3   C9               RET
                   ;
                   ;FOLLOWING IS THE CODE TO SET THE TERMINAL WIDTH
                   ;NOTE THAT WHAT IS ACTUALLY STORED IS THE LOW ORDER BYTE
                   ;OF THE 1ST ADDR BEYOND THE BUFFER END, NOT THE WIDTH ITSELF.
                   ;
   F3E4   01DFD0   TERM:   LXI     B,ABUF          ;POINT TO KEYED IN VALUE
   F3E7   CD0AE0           CALL    ADEC            ;CONVERT TO BINARY
   F3EA   7D               MOV     A,L             ;VALUE TO A
   F3EB   D61B             SUI     (-(IBUF+1)) AND 0FFH
   F3ED   FE5C             CPI     (IBUF+120) AND 0FFH
   F3EF   D2DDE7           JNC     WHAT            ;IF TERMW > 120 SPECIFIED
   F3F2   328FD1           STA     TERMW           ;SAVE IT
   F3F5   C360E0           JMP     EORMS           ;DONE
   F3F8   00               NOP
   F3F9   00               NOP
   F3FA   00               NOP
   F3FB   00               NOP
   F3FC   00               NOP
   F3FD   00               NOP
   F3FE   00               NOP
   F3FF   00               NOP
                   ;
                   ; ****** END OF ALS8ASM MODULE
                   ;
                   ;
                   ;THIS IS THE INTERPRETIVE DEBUGGING SIMULATOR
                   ;IT'S BASIC OPERATION IS TO SIMULATE ALL OF THE 8080
                   ;REGISTERS IN MEMORY, & THEN MOVE THE INST. TO BE
                   ;SIMULATED INTO A 3 BYTE AREA IN RAM AND EXECUTE IT
                   ;FOLLOWED BY A JUMP INST WHICH RETURNS CONTROL TO THE
                   ;ROUTINE.  A SIMULATOR SIMILAR TO THIS WAS DESCRIBED IN
                   ;DETAIL IN SEPT. 77 KILOBAUD PG. 64.  HOWEVER ALTHOUGH
                   ;THE PRINCIPLE IS THE SAME, THE CODE IS QUITE DIFFERENT.
                   ;THE SIMULATOR ENTRY POINT IS AT F75C.
                   ;
                   ;COME HERE TO "SIMULATE" A SINGLE INSTRUCTION
                   ;
   F400   210000   LF400:  LXI     H,0             ;GET TWO ZEROS
   F403   224DD1           SHLD    LD14C+1         ;CLEAR 2ND & 3RD INST BYTES
   F406   2A3CD1           LHLD    LD13C           ;GET PGM COUNTER
   F409   7E               MOV     A,M             ;GET NEXT INST TO SIMULATE
   F40A   324CD1           STA     LD14C           ;SAVE IT IN INST REG
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 64
      


   F40D   47               MOV     B,A             ;AND IN B
   F40E   FE40             CPI     40H             ;TRYING TO DETERMINE TYPE INST
   F410   DA22F4           JC      LF422           ;FOR FURTHER TESTING
   F413   FEC0             CPI     0C0H            ;MORE TESTING
   F415   D275F4           JNC     LF475           ;INST >= C0 HEX
   F418   C359F4           JMP     LF459           ;1 BYTE ACCUM INST
                   ;
                   ;RETURN HERE TO PROCESS 1 BYTE ACCUM. INST
                   ;
   F41B   23       LF41B:  INX     H               ;INR PGM COUNTER
   F41C   223ED1           SHLD    LD13E           ;SAVE ADDR OF NEXT INST
   F41F   C334F6           JMP     LF634           ;PROCESS THE INST
                   ;
                   ;GET HERE FOR INST WITH OPCODES LESS THAN 40H
                   ;
   F422   E607     LF422:  ANI     7               ;MASK LOW 3 BITS
   F424   CA1BF4           JZ      LF41B           ;NOP IS ONLY LEGAL 8080 INST
   F427   FE03             CPI     3               ;MASK LOW ORDER TWO BITS
   F429   DA39F4           JC      LF439           ;01,02,09,0A,..,31,32,39,3A ETC
   F42C   FE06             CPI     6               ;CHECK FOR MVI
   F42E   C21BF4           JNZ     LF41B           ;JMP IF NOT MVI
                   ;
                   ;COME HERE FOR ACCUMULATOR IMMEDIATE INST (MVI, ADI, CPI, ETC)
                   ;
   F431   23       LF431:  INX     H               ;POINT TO 2ND BYTE
   F432   7E               MOV     A,M             ;GET IT
   F433   324DD1           STA     LD14C+1         ;SAVE AS 2ND BYTE TO SIMULATE
   F436   C31BF4           JMP     LF41B           ;SIMULATE INST. EXECUTION
                   ;
                   ;COME HERE FOR LXI, STAX, DAD, LDAX, SHLD, LHLD, STA, LDA
                   ;
   F439   FE02     LF439:  CPI     2               ;STAX/LDAX,SHLD/LHLD,STA/LDA
   F43B   78               MOV     A,B             ;RESTORE THE FULL OPCODE
   F43C   CA51F4           JZ      LF451           ;FOR LIST 2 INST PREV.
   F43F   E608             ANI     8               ;CHECK FOR DAD
   F441   C21BF4           JNZ     LF41B           ;PROCESS DAD INST
   F444   23       LF444:  INX     H               ;POINT TO 2ND BYTE
   F445   7E               MOV     A,M             ;GET IT
   F446   324DD1           STA     LD14C+1         ;PUT IT IN SIM'S INST REG
   F449   23               INX     H               ;POINT TO 3RD BYTE
   F44A   7E               MOV     A,M             ;GET IT
   F44B   324ED1           STA     LD14C+2         ;PUT IT IN AS 3RD BYTE
   F44E   C31BF4           JMP     LF41B           ;SIMULATE EXECUTION OF THE INST
                   ;
                   ;COME HERE FOR STAX, LDAX, SHLD, LHLD, STA, LDA
                   ;
   F451   FE20     LF451:  CPI     20H             ;DIVIDE GROUP IN 2 PARTS
   F453   D244F4           JNC     LF444           ;FOR SHLD/LHLD, STA/LDA
   F456   C31BF4           JMP     LF41B           ;FOR LDAX/STAX
                   ;
                   ;GET HERE FOR 1 BYTE ACCUM. INST > 40H AND < C0H
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 65
      


                   ;MOV,CMP,ANA,ADD,ADC,SUB,SBB,XRA,ORA AND HLT
                   ;
   F459   FE76     LF459:  CPI     76H             ;HALT INST ?
   F45B   CA61F4           JZ      LF461           ;YES - PROCESS IT
   F45E   C31BF4           JMP     LF41B           ;NO - PROCESS OTHERS
                   ;
                   ;PROCESS HALT INST
                   ;
   F461   CD16E2   LF461:  CALL    CRLF            ;DO CR/LF
   F464   CDB8F6           CALL    LF6B8           ;PRINT OUT SIMULATORS P.C.
   F467   2170F4           LXI     H,LF470         ;POINT TO HALT MESSAGE
   F46A   CD80E3           CALL    SCRN            ;PRINT "HALT"
   F46D   C374F7           JMP     LF774           ;AND THEN RESTART SIMULATOR
   F470   48414C54 LF470:  DB      'HALT',0DH
   F474   0D      
                   ;
                   ;COME HERE FOR INST WITH OPCODES >= C0 HEX
                   ;
   F475   E607     LF475:  ANI     7               ;MASK LOW 3 BITS
   F477   CA9FF4           JZ      LF49F           ;CONDITIONAL RETURN
   F47A   FE02             CPI     2               ;CONDITIONAL JUMP ?
   F47C   CACAF4           JZ      LF4CA           ;YES - PROCESS CNDX JMP
   F47F   DAB0F4           JC      LF4B0           ;POP, RET, PCHL, SPHL
   F482   FE04             CPI     4               ;CONDITIONAL CALL ?
   F484   CA05F5           JZ      LF505           ;YES - PROCESS IT
   F487   DAEFF4           JC      LF4EF           ;NO-JMP,IN,OUT,EI,DI,XTHL,XCHG
   F48A   FE06             CPI     6               ;ACCUM. IMMEDIATE ?
   F48C   CA31F4           JZ      LF431           ;YES - PROCESS
   F48F   DA42F5           JC      LF542           ;PUSH, CALL & ILLEGAL
                   ;
                   ;GET HERE TO PROCESS RST INSTRUCTIONS
                   ;
   F492   AF               XRA     A               ;GET A ZERO
   F493   323FD1           STA     LD13E+1         ;CLEAR HIGH ORDER CALLED ADDR
   F496   78               MOV     A,B             ;RESTORE OPCODE TO A
   F497   E638             ANI     38H             ;MASK RST TYPE
   F499   323ED1           STA     LD13E           ;STORE AS LOW ORDER BYTE
   F49C   C311F5           JMP     LF511           ;PROCESS AS NORMAL CALL
                   ;
                   ;COME HERE FOR CONDITIONAL RETURN
                   ;
   F49F   CD51F5   LF49F:  CALL    LF551           ;OPERATE ON OPCODE & FLAG REG
   F4A2   C2DAF4           JNZ     LF4DA           ;CNDX NOT MET,CLEAN UP, GO HOME
                   ;
                   ;COME HERE TO PROCESS RETURN
                   ;
   F4A5   EB       LF4A5:  XCHG                    ;SAVE PGM CTR IN D,E
   F4A6   2A40D1           LHLD    LD140           ;GET STACK POINTER H,L
   F4A9   CD7FF5           CALL    LF57F           ;POP STK & SAVE AS NEXT ADDR
   F4AC   23               INX     H               ;INR STACK POINTER FOR 2ND BYTE
   F4AD   C321F5           JMP     LF521           ;RESET STK PTR & GO TO NXT INST
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 66
      


                   ;
                   ;COME HERE FOR POP, RET, PCHL, SPHL
                   ;
   F4B0   78       LF4B0:  MOV     A,B             ;RESTORE INST TO A
   F4B1   E608             ANI     8               ;POP INST ?
   F4B3   CA1BF4           JZ      LF41B           ;YES - PROCESS IT
   F4B6   78               MOV     A,B             ;NO - RESTORE INST AGAIN
   F4B7   FED9             CPI     0D9H            ;ILLEGAL OPCODE ?
   F4B9   CA89F5           JZ      LF589           ;YES - PROCESS ILLEGAL OPCODE
   F4BC   DAA5F4           JC      LF4A5           ;NO - RETURN INST IF CARRY
   F4BF   FEE9             CPI     0E9H            ;NOT RET - PCHL ?
   F4C1   C21BF4           JNZ     LF41B           ;NO - MUST BE SPHL
   F4C4   2A44D1           LHLD    LD144           ;PCHL - GET H,L
   F4C7   C3DBF4           JMP     LF4DB           ;MAKE ADDR OF NEXT INST & RET
                   ;
                   ;COME HERE FOR CONDITIONAL JUMP
                   ;
   F4CA   CD51F5   LF4CA:  CALL    LF551           ;EVALUATE CONDITION
                   ;
                   ;GET HERE FOR STD JUMP
                   ;
   F4CD   CDE1F4   LF4CD:  CALL    LF4E1           ;FILL IN 2ND & 3RD BYTES
   F4D0   C2D9F4           JNZ     LF4D9           ;JMP IF CNDX NOT MET
   F4D3   CD7FF5           CALL    LF57F           ;UPDATE ADDR OF NXT INST
   F4D6   C36AF6           JMP     LF66A           ;DONE W/SIMULATED JUMP
   F4D9   23       LF4D9:  INX     H               ;POINT TO 3RD BYTE
   F4DA   23       LF4DA:  INX     H               ;POINT TO NEXT INST
   F4DB   223ED1   LF4DB:  SHLD    LD13E           ;SAVE H,L AS ADDR OF NXT INST
   F4DE   C36AF6           JMP     LF66A           ;DONE WITH THIS INST
                   ;
                   ;UPDATE 2ND & 3RD BYTES OF INST AT D14C
                   ;DONE EVEN IF INST IS NOT REALLY EXECUTED SO DISPLAY
                   ;OF INST WILL BE CORRECT.
                   ;NOTE REVERSAL OF "BACKWARD" 8080 ADDRESSES
                   ;
   F4E1   F5       LF4E1:  PUSH    PSW             ;SAVE PSW
   F4E2   23               INX     H               ;POINT TO INST 2ND BYTE
   F4E3   7E               MOV     A,M             ;GET IT
   F4E4   324ED1           STA     LD14C+2         ;SAVE AS SIM 2ND (3RD?) BYTE
   F4E7   23               INX     H               ;POINT TO INST 3RD BYTE
   F4E8   7E               MOV     A,M             ;GET IT
   F4E9   324DD1           STA     LD14C+1         ;SAVE AS SIM 3RD (2ND?) BYTE
   F4EC   2B               DCX     H               ;POINT BACK AT 2ND INST BYTE
   F4ED   F1               POP     PSW             ;RESTORE PSW
   F4EE   C9               RET                     ;DONE
                   ;
                   ;GET HERE FOR JMP, OUT, IN, XTHL, XCHG, EI, DI INSTRUCTIONS
                   ;
   F4EF   78       LF4EF:  MOV     A,B             ;GET WHOLE INST
   F4F0   E638             ANI     38H             ;MASK
   F4F2   CACDF4           JZ      LF4CD           ;JUMP INST
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 67
      


   F4F5   FE10             CPI     10H             ;
   F4F7   CAF2F5           JZ      LF5F2           ;OUT INST
   F4FA   DA89F5           JC      LF589           ;ILLEGAL OPCODE
   F4FD   FE18             CPI     18H             ;MASK AGAIN
   F4FF   CA8FF5           JZ      LF58F           ;INPUT INST
   F502   C31BF4           JMP     LF41B           ;EI, DI, XTHL, XCHG
                   ;
                   ;COME HERE FOR CONDITIONAL CALL INST
                   ;
   F505   CD51F5   LF505:  CALL    LF551           ;EVALUATE CONDITION
   F508   C2CDF4           JNZ     LF4CD           ;JUMP IF NOT MET
                   ;
                   ;GET HERE FOR CALL INST
                   ;
   F50B   CDE1F4   LF50B:  CALL    LF4E1           ;UPDATE DISPLAY INST
   F50E   CD7FF5           CALL    LF57F           ;CALLED ADDR ==> NXT INST
   F511   23       LF511:  INX     H               ;POINT TO INST AFTR CALL
   F512   EB               XCHG                    ;SAVE RET ADDR IN D,E
   F513   3A35D1           LDA     LD135           ;GET REAL-TIME RUN FLAG
   F516   B7               ORA     A               ;SET FLAGS
   F517   C227F5           JNZ     LF527           ;JUMP IF SIMULATING
   F51A   2A40D1   LF51A:  LHLD    LD140           ;GET STACK POINTER
   F51D   2B               DCX     H               ;POINT TO NEXT ENTRY 1ST BYTE
   F51E   72               MOV     M,D             ;PUT HIGH ORDER RET ADDR IN
   F51F   2B               DCX     H               ;NOW DO LOW ORDER BYTE
   F520   73               MOV     M,E             ;RET ADDR ON STACK
   F521   2240D1   LF521:  SHLD    LD140           ;UPDATE STACK POINTER
   F524   C36AF6           JMP     LF66A           ;SIMULATED CALL DONE
   F527   2A3ED1   LF527:  LHLD    LD13E           ;GET CALLED ADDR
   F52A   3A3AD1           LDA     LD13A           ;GET LOW ORDER R.T. RUN ADDR
   F52D   BD               CMP     L               ;SAME ?
   F52E   C21AF5           JNZ     LF51A           ;NO - SIMULATE CALL
   F531   3A3BD1           LDA     LD13A+1         ;GET HIGH ORDER R.T. RUN ADDR
   F534   BC               CMP     H               ;SAME ?
   F535   C21AF5           JNZ     LF51A           ;NO - SIMULATE CALL
   F538   224DD1           SHLD    LD14C+1         ;SAME - PUT CALL ADDR IN
   F53B   EB               XCHG                    ;RET ADDR TO H,L
   F53C   223ED1           SHLD    LD13E           ;NEXT SIM. ADDR TO EXEC
   F53F   C334F6           JMP     LF634           ;EXECUTE CALL FOR REAL
                   ;
                   ;GET HERE FOR PUSH, CALL & ILLEGAL OPCODES
                   ;
   F542   78       LF542:  MOV     A,B             ;RESTORE INSTRUCTION
   F543   E608             ANI     8               ;MASK
   F545   CA1BF4           JZ      LF41B           ;PUSH, POP
   F548   78               MOV     A,B             ;RESTORE OPCODE AGAIN
   F549   FECD             CPI     0CDH            ;CALL ?
   F54B   CA0BF5           JZ      LF50B           ;YES - PROCESS IT
   F54E   C389F5           JMP     LF589           ;ILLEGAL OPCODE
                   ;
                   ;GET HERE TO EVALUATE CONDITION FOR CONDITIONAL JMP, CALL, RET
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 68
      


                   ;
   F551   78       LF551:  MOV     A,B             ;RESTORE OP CODE
   F552   E608             ANI     8               ;MASK CNDX TRUE/FALSE BIT
   F554   4F               MOV     C,A             ;SAVE TRUE/FALSE STATUS
   F555   CA5AF5           JZ      LF55A           ;JUMP IF NZ,NC,PO,P
   F558   0EC5             MVI     C,0C5H          ;PSW COND FLAG MASK
   F55A   78       LF55A:  MOV     A,B             ;RESTORE OPCODE AGAIN
   F55B   E630             ANI     30H             ;ZERO FLAG CONDITIONAL ?
   F55D   C265F5           JNZ     LF565           ;NO - TEST OTHERS
   F560   1640             MVI     D,40H           ;PSW ZERO FLAG MASK
   F562   C379F5           JMP     LF579           ;EVALUATE THE CONDITION
   F565   FE20     LF565:  CPI     20H             ;PARITY/SIGN FLAG CONDITION ?
   F567   CA72F5           JZ      LF572           ;YES - PARITY FLAG CNDX
   F56A   D277F5           JNC     LF577           ;YES - SIGN FLAG CNDX
   F56D   1601             MVI     D,1             ;CARRY FLAG MASK
   F56F   C379F5           JMP     LF579           ;EVALUATE CONDITION
   F572   1604     LF572:  MVI     D,4             ;PARITY FLAG BIT MASK
   F574   C379F5           JMP     LF579           ;EVALUATE THE CONDITION
   F577   1680     LF577:  MVI     D,80H           ;SIGN FLAG BIT MASK
   F579   3A42D1   LF579:  LDA     LD142           ;GET SIMULATOR'S FLAG REGISTER
   F57C   A9               XRA     C               ;SET CNDX & T/F INTO ACC
   F57D   A2               ANA     D               ;MASK OUT PROPER FLAG BIT
   F57E   C9               RET                     ;AND GO BACK W/ZERO FLAG SET
                   ;
                   ;SAVE ADDR POINTED TO BY H,L AS NEXT INST TO EXECUTE
                   ;
   F57F   7E       LF57F:  MOV     A,M             ;GET 1ST BYTE
   F580   323ED1           STA     LD13E           ;SAVE IT AS NEXT INST LOW BYTE
   F583   23               INX     H               ;POINT TO 2ND BYTE
   F584   7E               MOV     A,M             ;GET IT
   F585   323FD1           STA     LD13E+1         ;SAVE AS HIGH BYTE
   F588   C9               RET                     ;DONE
                   ;
                   ;ROUTINE TO PROCESS ILLEGAL OPCODES
                   ;
   F589   CDCAF6   LF589:  CALL    LF6CA           ;DISPLAY INST & ALL REGS
   F58C   CD49F9           CALL    LF949           ;PRINT ?, RESTART (NEVER RET)
                   ;
                   ;ROUTINE TO PROCESS INPUT INST
                   ;
   F58F   23       LF58F:  INX     H               ;POINT TO PORT
   F590   7E               MOV     A,M             ;GET IT
   F591   23               INX     H               ;POINT TO NEXT INST
   F592   223ED1           SHLD    LD13E           ;AND MAKE IT NEXT TO EXEC
   F595   324DD1           STA     LD14C+1         ;PUT PORT INTO SIM'S INST REG
   F598   CDA1F8           CALL    LF8A1           ;SEARCH INPUT PORT TABLE
   F59B   C2AEF5           JNZ     LF5AE           ;JUMP IF PORT NOT IN TABLE
   F59E   7E               MOV     A,M             ;GET PORT I/O TYPE
   F59F   B7               ORA     A               ;SET FLAGS
   F5A0   CAAEF5           JZ      LF5AE           ;IF PORT SIMULATED
   F5A3   FA34F6           JM      LF634           ;TO REALLY EXEC I/O INST
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 69
      


   F5A6   23               INX     H               ;ELSE PRESET, POINT TO VALUE
   F5A7   7E               MOV     A,M             ;GET IT
   F5A8   324AD1           STA     LD14A           ;TO SIM'S ACCUM (WHERE ELSE ?)
   F5AB   C36AF6           JMP     LF66A           ;TO DISPLAY & DO NEXT INST
                   ;
                   ;COME HERE TO EXECUTE SIMULATED INPUT INST
                   ;
   F5AE   11D2F5   LF5AE:  LXI     D,LF5D2         ;POINT TO INPUT MESSAGE
   F5B1   CDD9F5           CALL    LF5D9           ;PRINT PGM CTR & MESSAGE
   F5B4   CD72E1           CALL    READ            ;GET USER'S ANSWER
   F5B7   CD6AE2           CALL    ZBUF            ;CLEAR ABUF
   F5BA   21E4D1           LXI     H,IBUF          ;POINT TO INPUT BUFFER
   F5BD   CDCFEE           CALL    SBL1            ;SCAN PAST SPACES
   F5C0   CDEBF2           CALL    NUMS            ;CONVERT TO BINARY
   F5C3   DA49F9           JC      LF949           ;IF ERROR IN ANSWER
   F5C6   7C               MOV     A,H             ;GET HIGH ORDER BYTE
   F5C7   B7               ORA     A               ;SET FLAGS
   F5C8   C2AEF5           JNZ     LF5AE           ;MAKE USER DO IT AGAIN IF > 255
   F5CB   7D               MOV     A,L             ;GET LOW ORDER BYTE
   F5CC   324AD1           STA     LD14A           ;STUFF IT INTO SIM'S ACCUM
   F5CF   C326F6           JMP     LF626           ;DO CR/LF & FINSIH UP
                   ;
   F5D2   494E5055 LF5D2:  DB      'INPUT '
   F5D6   5420    
   F5D8   0D               DB      0DH
                   ;
                   ;ROUTINE TO PRINT INPUT OR OUTPUT MESSAGE FOR SIMULATED I/O
                   ;
   F5D9   CD16E2   LF5D9:  CALL    CRLF            ;DO CR/LF
   F5DC   D5               PUSH    D               ;SAVE D,E
   F5DD   CDB8F6           CALL    LF6B8           ;PRINT PGM COUNTER & SPACES
   F5E0   D1               POP     D               ;RESTORE REGS
   F5E1   EB               XCHG                    ;MESSAGE ADDR TO H,L
   F5E2   CD80E3           CALL    SCRN            ;PRINT INPUT OR OUTPUT MSG
   F5E5   2A3CD1           LHLD    LD13C           ;GET SIM'S PGM CTR
   F5E8   23               INX     H               ;INCR, POINTING TO PORT
   F5E9   7E               MOV     A,M             ;GET PORT IN ACCUM
   F5EA   CD6FE5           CALL    DUMO            ;PRINT PORT
   F5ED   063D             MVI     B,'='           ;FOLLOWED BY EQUALS SIGN
   F5EF   C3CFD0           JMP     OUT8            ;AND THEN RETURN
                   ;
                   ;ROUTINE TO PROCESS OUTPUT INSTRUCTION
                   ;
   F5F2   23       LF5F2:  INX     H               ;POINT TO PORT
   F5F3   7E               MOV     A,M             ;GET IT
   F5F4   23               INX     H               ;POINT TO NEXT INST
   F5F5   223ED1           SHLD    LD13E           ;SAVE AS ADDR OF NEXT INST
   F5F8   324DD1           STA     LD14C+1         ;PUT PORT IN SIM'S INST REG
   F5FB   CD97F8           CALL    LF897           ;SEARCH OUTPUT TABLE
   F5FE   3E01             MVI     A,1             ;ASSUME SIMULATED
   F600   C204F6           JNZ     LF604           ;IF PORT NOT IN TABLE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 70
      


   F603   7E               MOV     A,M             ;GET TYPE OUTPUT
   F604   B7       LF604:  ORA     A               ;SET FLAGS
   F605   FA34F6           JM      LF634           ;TO REALLY EXECUTE OUT INST
   F608   F5               PUSH    PSW             ;SAVE ACCUM & FLAGS
   F609   112CF6           LXI     D,LF62C         ;POINT TO OUTPUT MESSAGE
   F60C   CDD9F5           CALL    LF5D9           ;PRINT IT
   F60F   F1               POP     PSW             ;RESTORE FLAGS & ACCUM
   F610   B7               ORA     A               ;SET FLAGS
   F611   3A4AD1           LDA     LD14A           ;GET CONTENTS OF SIM'S ACCUM
   F614   47               MOV     B,A             ;MOVE TO B
   F615   CA1EF6           JZ      LF61E           ;ASCII MODE (UNLESS CNTL CHAR)
   F618   CD47F7   LF618:  CALL    LF747           ;PRINT ACC USING CUR MODE
   F61B   C326F6           JMP     LF626           ;DO CR/LF, PRINT REGS & DO NEXT
   F61E   FE20     LF61E:  CPI     20H             ;TEST FOR CONTROL CHAR
   F620   DA18F6           JC      LF618           ;PRT USING CUR MODE, NOT ASCII
   F623   CDCFD0           CALL    OUT8            ;NOT CNTL CHAR, OK TO OUTPUT
   F626   CD16E2   LF626:  CALL    CRLF            ;NOW DO CR/LF TO MAKE IT PRETTY
   F629   C36AF6           JMP     LF66A           ;THEN PRINT REGS & DO NEXT INST
                   ;
   F62C   4F555450 LF62C:  DB      'OUTPUT '
   F630   555420  
   F633   0D               DB      0DH
                   ;
                   ;COME HERE TO EXECUTE AN INST.
                   ;LOAD REAL 8080 REGS FROM SIMULATORS REGS, EXEC INST
                   ;AND THEN UNLOAD 8080'S REGS TO SIMULATORS REGS
                   ;
   F634   3140D1   LF634:  LXI     SP,LD140        ;POINT STACK AT SIMULATORS REGS
   F637   3EC3             MVI     A,0C3H          ;JUMP INST
   F639   324FD1           STA     LD14F           ;STORE JUST AFTER INST TO SIMUL
   F63C   2152F6           LXI     H,LF652         ;RETURN POINT AFTER INST EXECUT
   F63F   2250D1           SHLD    LD14F+1         ;STORE IT JUST AFTER JUMP INST
   F642   E1               POP     H               ;LOAD 8080 H,L FROM SIM STK PTR
   F643   F1               POP     PSW             ;LOAD 8080 PSW FROM SIMULATOR
   F644   33               INX     SP              ;SKIP L FOR NOW
   F645   33               INX     SP              ;SKIP H FOR NOW
   F646   D1               POP     D               ;LOAD 8080 D,E FROM SIMULATOR
   F647   C1               POP     B               ;LOAD 8080 B,C FROM SIMULATOR
   F648   F9               SPHL                    ;MOVE SIM STACK TO 8080 STACK
   F649   2A44D1           LHLD    LD144           ;LOAD 8080 H,L FROM SIM H,L
   F64C   3A4AD1           LDA     LD14A           ;GET SIMULATED ACCUM
   F64F   C34CD1           JMP     LD14C           ;EXECUTE INST TO BE SIMULATED
                   ;
                   ;RETURN HERE AFTER EXECUTING THE "SIMULATED" INST
                   ;
   F652   324AD1   LF652:  STA     LD14A           ;SAVE 8080 ACCUM INTO SIMULTR
   F655   2244D1           SHLD    LD144           ;SAVE 8080 H,L INTO SIMULATOR
   F658   17               RAL                     ;SAVE CARRY FLAG DURING DAD
   F659   210000           LXI     H,0             ;SETTING UP ....
   F65C   39               DAD     SP              ;TO GET THE STACK POINTER
   F65D   314AD1           LXI     SP,LD14A        ;POINT CPU STACK TO REG AREA
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 71
      


   F660   C5               PUSH    B               ;SAVE 8080 B,C INTO SIMULATOR
   F661   D5               PUSH    D               ;SAVE 8080 D,E INTO SIMULATOR
   F662   3B               DCX     SP              ;SKIP H (ALREADY STORED)
   F663   3B               DCX     SP              ;SKIP L (ALREADY STORED)
   F664   1F               RAR                     ;RESTORE CARRY FLAG
   F665   F5               PUSH    PSW             ;SAVE 8080 PSW INTO SIMULATOR
   F666   E5               PUSH    H               ;SAVE 8080 STK PNTR INTO SIM
   F667   312BD1           LXI     SP,LD12B        ;RELOAD 8080'S STACK POINTER
   F66A   DBFF     LF66A:  IN      0FFH            ;GET SENSE SWITCHES
   F66C   E680             ANI     80H             ;MASK HIGH ORDER BIT
   F66E   C297F6           JNZ     LF697           ;FORCE RETURN TO COMMAND MODE
   F671   CDA4D0           CALL    STAT            ;SEE IF KEYBOARD CHAR WAITING
   F674   CA7FF6           JZ      LF67F           ;NO - CONTINUE PROCESSING
   F677   CDCCD0           CALL    IN8             ;YES - GET CHAR
   F67A   FE18             CPI     'X'-40H         ;CONTROL-X ?
   F67C   CA97F6           JZ      LF697           ;YES - FORCE RET TO COMND MODE
   F67F   3A34D1   LF67F:  LDA     LD134           ;GET BREAKPOINT FLAG
   F682   B7               ORA     A               ;SET FLAGS
   F683   CA9DF6           JZ      LF69D           ;JMP IF NO BKPT SET
   F686   2A38D1           LHLD    LD138           ;BKPT ADDR TO H,L
   F689   3A3DD1           LDA     LD13C+1         ;HIGH BYTE OF SIM P.C.
   F68C   BC               CMP     H               ;COMPARE TO BKPT
   F68D   C2AFF6           JNZ     LF6AF           ;BKPT NOT REACHED
   F690   3A3CD1           LDA     LD13C           ;GET LOW BYTE OF P.C.
   F693   BD               CMP     L               ;COMPARE TO BKPT
   F694   C2AFF6           JNZ     LF6AF           ;BKPT NOT REACHED
                   ;
                   ;COME HERE WHEN BREAKPOINT IS REACHED
                   ;
   F697   CDCAF6   LF697:  CALL    LF6CA           ;PRINT REGS, P.C., ETC.
   F69A   C374F7           JMP     LF774           ;RESTART SIMULATOR
                   ;
                   ;GET HERE AFTER EA. INST IN SIMULATED CONT. RUN MODE
                   ;
   F69D   CDCAF6   LF69D:  CALL    LF6CA           ;PRINT REGS, PC, ETC
   F6A0   DBFF             IN      0FFH            ;GET SENSE SWITCHES
   F6A2   E640             ANI     40H             ;MASK CONTINUOUS RUN BIT
   F6A4   CCCCD0           CZ      IN8             ;IF CONT RUN, CK KYBD PORT
   F6A7   FE18             CPI     'X'-40H         ;CONTROL-X WAITING ?
   F6A9   CA74F7           JZ      LF774           ;YES - RETURN TO SIM COMND MODE
                   ;
                   ;SIMULATOR "GO" COMMAND
                   ;
   F6AC   CD16E2   LF6AC:  CALL    CRLF            ;DO CR/LF
   F6AF   2A3ED1   LF6AF:  LHLD    LD13E           ;GET ADDR OF INST TO SIMULATE
   F6B2   223CD1           SHLD    LD13C           ;AND SAVE IT AS SIM PGM COUNTER
   F6B5   C300F4           JMP     LF400           ;SIMULATE THE INSTRUCTION
                   ;
                   ;ROUTINE TO PRINT OUT SIMULATORS P.C. AND TWO SPACES
                   ;
   F6B8   3A3DD1   LF6B8:  LDA     LD13C+1         ;GET HIGH ORDER SIM P.C. BYTE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 72
      


   F6BB   57               MOV     D,A             ;TO D
   F6BC   3A3CD1           LDA     LD13C           ;NOW LOW ORDER BYTE
   F6BF   5F               MOV     E,A             ;D,E HAVE P.C.
   F6C0   CD5CE5           CALL    ADOUT           ;PRINT IT IN HEX
   F6C3   CD5CE3           CALL    LE35C           ;PRINT SPACE
   F6C6   CD5CE3           CALL    LE35C           ;PRINT SPACE
   F6C9   C9               RET                     ;DONE
                   ;
                   ;ROUTINE TO PRINT OUT SIMULATORS PC AND ALL FLAGS & REGS
                   ;
   F6CA   CDB8F6   LF6CA:  CALL    LF6B8           ;PRINT PC & SPACES
   F6CD   3A42D1           LDA     LD142           ;GET FLAG REGISTER
   F6D0   4F               MOV     C,A             ;SAVE IT IN C
   F6D1   E601             ANI     01H             ;MASK CARRY BIT
   F6D3   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
   F6D6   E680             ANI     80H             ;MASK SIGN BIT
   F6D8   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
   F6DB   E610             ANI     10H             ;MASK AUX CARRY BIT
   F6DD   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
   F6E0   E604             ANI     04H             ;MASK PARITY BIT
   F6E2   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
   F6E5   E640             ANI     40H             ;MASK ZERO BIT
   F6E7   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
   F6EA   CD5CE3           CALL    LE35C           ;PRINT A SPACE
   F6ED   114AD1           LXI     D,LD14A         ;POINT TO ACCUM
   F6F0   1A               LDAX    D               ;GET IT
   F6F1   CD56F7           CALL    LF756           ;PRINT IT USING CUR. MODE
   F6F4   CD5CE3           CALL    LE35C           ;PRINT SPACE
   F6F7   0E04             MVI     C,04H           ;NO OF REGS TO OUTPUT
   F6F9   1B       LF6F9:  DCX     D               ;POINT TO NEXT REG
   F6FA   1A               LDAX    D               ;GET IT
   F6FB   CD56F7           CALL    LF756           ;PRINT IT USING CUR MODE
   F6FE   0D               DCR     C               ;NO OF REGS LEFT
   F6FF   C2F9F6           JNZ     LF6F9           ;DO NEXT IF NOT DONE
   F702   CD5CE3           CALL    LE35C           ;PRINT SPACE
   F705   1B               DCX     D               ;POINT TO H
   F706   1A               LDAX    D               ;GET IT
   F707   CD56F7           CALL    LF756           ;PRINT IT
   F70A   1B               DCX     D               ;POINT TO L
   F70B   1A               LDAX    D               ;GET IT
   F70C   CD56F7           CALL    LF756           ;PRINT IT
   F70F   2A44D1           LHLD    LD144           ;GET H,L
   F712   7E               MOV     A,M             ;GET "M" CHAR
   F713   CD56F7           CALL    LF756           ;PRINT IT
   F716   CD5CE3           CALL    LE35C           ;SPACE
   F719   3A41D1           LDA     LD140+1         ;STACK PTR HIGH BYTE
   F71C   57               MOV     D,A             ;TO D
   F71D   3A40D1           LDA     LD140           ;STACK PTR LOW BYTE
   F720   5F               MOV     E,A             ;D,E HAS STK PTR ADDR
   F721   CD5CE5           CALL    ADOUT           ;PRINT STACK POINTER
   F724   114CD1           LXI     D,LD14C         ;POINT TO CURRENT INST
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 73
      


   F727   CD5CE3           CALL    LE35C           ;PRINT SPACE
   F72A   CD33F7           CALL    LF733           ;PRINT BYTE & SPACE
   F72D   CD33F7           CALL    LF733           ;PRINT BYTE & SPACE
   F730   C333F7           JMP     LF733           ;A BIT OF SLOPPY CODE
   F733   CD5CE3   LF733:  CALL    LE35C           ;PRINT A SPACE
   F736   1A               LDAX    D               ;GET BYTE POINTED TO BY D,E
   F737   13               INX     D               ;POINT TO NEXT
   F738   CD47F7           CALL    LF747           ;PRINT THE BYTE
   F73B   C9               RET                     ;DONE
                   ;
                   ;PRINT A 1 OR A ZERO (USED TO PRINT FLAG BYTES)
                   ;
   F73C   0631     LF73C:  MVI     B,'1'           ;ASSUME 1
   F73E   C242F7           JNZ     LF742           ;MUST BE IF IT'S NOT ZERO
   F741   05               DCR     B               ;NOT 1, MAKE IT 0
   F742   CDCFD0   LF742:  CALL    OUT8            ;PRINT IT, WHATEVER
   F745   79               MOV     A,C             ;RESTORE THE FLAG BYTE IN A
   F746   C9               RET                     ;DONE
                   ;
                   ;PRINT A BYTE USING CURRENT SIMULATOR MODE
                   ;
   F747   214BD1   LF747:  LXI     H,LD14B         ;POINT TO SIMULATOR MODE
   F74A   46               MOV     B,M             ;GET IT
   F74B   05               DCR     B               ;SETTING FLAGS
   F74C   F253F7           JP      LF753           ;IF MODE WASN'T ZERO
   F74F   CD6FE5           CALL    DUMO            ;USE ALS-8 MODE
   F752   C9               RET                     ;DONE
   F753   C348E3   LF753:  JMP     DOUT            ;USE DECIMAL
                   ;
                   ;ROUTINE TO PRINT BYTE FOLLOWED BY SPACE
                   ;
   F756   CD47F7   LF756:  CALL    LF747           ;PRINT THE BYTE
   F759   C35CE3           JMP     LE35C           ;THEN DO SPACE & RETURN
                   ;
                   ;THIS IS THE SIMULATOR MAIN ENTRY POINT
                   ;
   F75C   3AE8D1   SIMU:   LDA     IBUF+4          ;GET CHAR AFTER 'SIMU'
   F75F   FE21             CPI     ' '+1           ;COMPARE TO BLANK
   F761   D274F7           JNC     LF774           ;SKIP INIT. IF NOT BLANK
   F764   AF               XRA     A               ;ELSE GET A ZERO
   F765   3236D1           STA     LD136           ;CLEAR INPUT PORT ASSIGN FLAG
   F768   324BD1           STA     LD14B           ;CLEAR SIMULATOR MODE
   F76B   3237D1           STA     LD137           ;CLEAR OUTPUT PORT ASSIGN FLAGS
   F76E   3235D1           STA     LD135           ;CLEAR REAL TIME RUN FLAG
   F771   3234D1   LF771:  STA     LD134           ;CLEAR BRKPT FLAG
                   ;
                   ;WARM RESTART ENTRY POINT
                   ;
   F774   312FD1   LF774:  LXI     SP,SMODE        ;SET STACK
   F777   CD16E2           CALL    CRLF            ;DO CR/LF
   F77A   062A             MVI     B,'*'           ;PROMPT
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 74
      


   F77C   CDCFD0           CALL    OUT8            ;PRINT IT
   F77F   CD72E1           CALL    READ            ;GET A COMND LINE IN IBUF
   F782   3AE4D1           LDA     IBUF            ;GET 1ST CHAR
   F785   FE50             CPI     'P'             ;SET PGM COUNTER ?
   F787   C296F7           JNZ     LF796           ;NO - TRY OTHER COMMANDS
   F78A   CD32F9           CALL    LF932           ;GET OPERAND VALUE TO H,L
   F78D   223ED1           SHLD    LD13E           ;? - THIS IS NOT THE SIM P.C.
   F790   223CD1           SHLD    LD13C           ;THE SIMULATORS PGM. COUNTER
   F793   C374F7           JMP     LF774           ;GET NEXT COMMAND
   F796   FE42     LF796:  CPI     'B'             ;SET BREAKPOINT ?
   F798   C2A4F7           JNZ     LF7A4           ;NO - TRY ANOTHER COMMAND
   F79B   CD32F9           CALL    LF932           ;GET ADDR TO H,L
   F79E   2238D1           SHLD    LD138           ;SET BREAKPOINT ADDR
   F7A1   C371F7           JMP     LF771           ;SET BKPT FLAG & RESTART
   F7A4   FE52     LF7A4:  CPI     'R'             ;SET REAL-TIME RUN ADDR ?
   F7A6   C2B7F7           JNZ     LF7B7           ;NO - TRY ANOTHER COMMAND
   F7A9   CD32F9           CALL    LF932           ;GET ADDR TO H,L
   F7AC   223AD1           SHLD    LD13A           ;SET REAL-TIME RUN ADDR
   F7AF   3E01             MVI     A,1             ;GET A ONE
   F7B1   3235D1           STA     LD135           ;AND USE IT TO SET R.T. RUN FLG
   F7B4   C374F7           JMP     LF774           ;RESTART & GET NEXT COMMAND
                   ;
                   ;TEST FOR AND PROCESS THE CLEAR COMMANDS
                   ;
   F7B7   FE43     LF7B7:  CPI     'C'             ;CLEAR COMMAND ?
   F7B9   C2DEF7           JNZ     LF7DE           ;NO - TRY OTHER COMMANDS
   F7BC   3AE5D1           LDA     IBUF+1          ;YES - GET NEXT CHAR
   F7BF   2134D1           LXI     H,LD134         ;POINT TO BKPT FLAG
   F7C2   FE42             CPI     'B'             ;CLEAR BREAKPOINT ?
   F7C4   CAD9F7           JZ      LF7D9           ;YES - DO IT
   F7C7   23               INX     H               ;NO, POINT TO R.T. RUN FLAG
   F7C8   FE52             CPI     'R'             ;CLEAR R.T. RUN ADDR ?
   F7CA   CAD9F7           JZ      LF7D9           ;YES - DO IT
   F7CD   23               INX     H               ;NO, POINT TO INPT PT ASGN FLAG
   F7CE   FE49             CPI     'I'             ;CLEAR INPUT PORT ASSIGNMENTS ?
   F7D0   CAD9F7           JZ      LF7D9           ;YES - DO IT
   F7D3   23               INX     H               ;NO, POINT TO OUTP PT ASGN FLAG
   F7D4   FE4F             CPI     'O'             ;CLEAR OUTPUT PORT ASSGNMENTS ?
   F7D6   C249F9           JNZ     LF949           ;NO - INVALID CLEAR COMMAND
   F7D9   3600     LF7D9:  MVI     M,0             ;CLEAR FLG H,L POINT TO
   F7DB   C374F7           JMP     LF774           ;AND RESTART SIMULATOR
   F7DE   FE47     LF7DE:  CPI     'G'             ;GO COMMAND ?
   F7E0   CAACF6           JZ      LF6AC           ;YES - DO IT
   F7E3   FE44             CPI     'D'             ;DUMP COMMAND ?
   F7E5   C2F1F7           JNZ     LF7F1           ;NO - TRY NEXT COMMAND
   F7E8   CD32F9           CALL    LF932           ;GET ADDR IN H,L
   F7EB   CD27E5           CALL    DUMP+3          ;AND USE ALS-8 DUMP CODE
   F7EE   C374F7           JMP     LF774           ;THEN RESTART THE SIMULATOR
   F7F1   FE45     LF7F1:  CPI     'E'             ;ENTER COMMAND ?
   F7F3   C202F8           JNZ     LF802           ;NO, TEST OTHER COMMANDS
   F7F6   CD32F9           CALL    LF932           ;GET ADDRESS TO H,L
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 75
      


   F7F9   CD0BE8           CALL    ENTS            ;USE ALS-8 ENTER CODE
   F7FC   DA49F9           JC      LF949           ;IF ERROR
   F7FF   C374F7           JMP     LF774           ;ELSE RESTART
   F802   FE58     LF802:  CPI     'X'             ;EXIT SIMULATOR COMMAND ?
   F804   CA60E0           JZ      EORMS           ;YES - RET TO ALS-8
   F807   FE4D             CPI     'M'             ;MODE COMMAND ?
   F809   C21FF8           JNZ     LF81F           ;NO - TEST OTHER COMMANDS
   F80C   CD32F9           CALL    LF932           ;GET VALUE IN H,L
   F80F   7D               MOV     A,L             ;NOW TO A
   F810   0601             MVI     B,1             ;ASSUME HEX
   F812   FE10             CPI     16              ;HEX ?
   F814   CA18F8           JZ      LF818           ;YES - SKIP NEXT STMNT
   F817   05               DCR     B               ;MAKE IT 0 ==> OCTAL
   F818   78       LF818:  MOV     A,B             ;GET FLAG TO A
   F819   324BD1           STA     LD14B           ;AND UPDATE MODE
   F81C   C374F7           JMP     LF774           ;THEN RESTART SIMULATOR
                   ;
                   ;PROCESS THE VARIOUS INPUT COMMANDS
                   ;
   F81F   FE49     LF81F:  CPI     'I'             ;SET INPUT COMMAND ?
   F821   C263F8           JNZ     LF863           ;NO - TRY OTHER COMMANDS
   F824   CD32F9           CALL    LF932           ;GET VALUE TO H,L
   F827   7C               MOV     A,H             ;HIGH ORDER BYTE TO A
   F828   B7               ORA     A               ;SET FLAGS
   F829   C249F9           JNZ     LF949           ;ERROR IF > 256
   F82C   7D               MOV     A,L             ;PORT TO A
   F82D   CDA1F8           CALL    LF8A1           ;SEARCH INPUT PORT TABLE
   F830   79               MOV     A,C             ;GET NO OF PORTS IN TABLE
   F831   FE10             CPI     16              ;TABLE FULL ?
   F833   D249F9           JNC     LF949           ;ERROR THEN
   F836   3236D1           STA     LD136           ;ELSE UPDATE # OF TABLE ENTRIES
   F839   36FF             MVI     M,0FFH          ;AND MAKE PORT REAL-TIME
   F83B   3AE5D1           LDA     IBUF+1          ;GET CHAR AFTER 'I'
   F83E   FE53             CPI     'S'             ;PRESET ?
   F840   C254F8           JNZ     LF854           ;NO - TRY REAL-TIME & CLEAR
   F843   EB               XCHG                    ;SAVE TABLE POINTER IN D,E
   F844   2AF1D0           LHLD    BBUF+2          ;GET VALUE OF PRESET
   F847   7C               MOV     A,H             ;GET HIGH BYTE
   F848   B7               ORA     A               ;SET FLAGS
   F849   C249F9           JNZ     LF949           ;ERROR IF > 255
   F84C   EB               XCHG                    ;TABLE POINTER BACK TO H,L
   F84D   3601             MVI     M,1             ;SAY PRESET
   F84F   23               INX     H               ;MOVE 1 BEYOND INPUT TYPE
   F850   73               MOV     M,E             ;AND STORE PRESET VALUE
   F851   C374F7           JMP     LF774           ;THEN RESTART SIMULATOR
   F854   FE52     LF854:  CPI     'R'             ;REAL-TIME INPUT ?
   F856   CA74F7           JZ      LF774           ;RESTART SIMULATR - ALREADY SET
   F859   3600             MVI     M,0             ;ELSE ASSUME SIMULATED
   F85B   FE43             CPI     'C'             ;TEST FOR SIMULATED
   F85D   CA74F7           JZ      LF774           ;OK IF IT REALLY IS
   F860   C349F9           JMP     LF949           ;ELSE ERROR
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 76
      


                   ;
                   ;TEST FOR AND PROCESS THE OUTPUT COMMANDS
                   ;
   F863   FE4F     LF863:  CPI     'O'             ;SET OUTPUT INST ?
   F865   C2BCF8           JNZ     LF8BC           ;NO - TRY OTHER COMMANDS
   F868   CD32F9           CALL    LF932           ;ELSE GET PORT NO IN H,L
   F86B   7C               MOV     A,H             ;HIGH BYTE TO A
   F86C   B7               ORA     A               ;SET FLAGS
   F86D   C249F9           JNZ     LF949           ;ERROR IF > 255
   F870   7D               MOV     A,L             ;PORT TO A
   F871   CD97F8           CALL    LF897           ;LOOK UP PORT IN TABLE
   F874   79               MOV     A,C             ;GET NO OF PORTS IN TABLE
   F875   FE10             CPI     16              ;TABLE FULL ?
   F877   D249F9           JNC     LF949           ;ERROR THEN
   F87A   3237D1           STA     LD137           ;ELSE UPDATE # OF TABLE ENTRIES
   F87D   06FF             MVI     B,0FFH          ;ASSUME REAL-TIME
   F87F   3AE5D1           LDA     IBUF+1          ;GET NEXT CHAR OF COMMAND
   F882   FE52             CPI     'R'             ;REAL-TIME ?
   F884   CA90F8           JZ      LF890           ;ENTER R.T. IN TABLE & RESTART
   F887   04               INR     B               ;NOT R.T., ASSUME ASCII
   F888   FE41             CPI     'A'             ;ASCII ?
   F88A   CA90F8           JZ      LF890           ;YES - PUT IN TABLE
   F88D   04               INR     B               ;NOT R.T. OR ASCII - SIMULATED?
   F88E   FE43             CPI     'C'             ;CLEAR (SIMULATED) ?
   F890   70       LF890:  MOV     M,B             ;SET OUTPUT MODE
   F891   CA74F7           JZ      LF774           ;MODE SET, RESTART
   F894   C349F9           JMP     LF949           ;ERROR, SIMULATED ASSUMED
   F897   2162D1   LF897:  LXI     H,LD162         ;POINT TO OUTPUT TABLE
   F89A   47               MOV     B,A             ;PORT NO TO B
   F89B   3A37D1           LDA     LD137           ;NO OF TABLE ENTRIES
   F89E   C3A8F8           JMP     LF8A8           ;SEARCH TABLE
   F8A1   2152D1   LF8A1:  LXI     H,LD152         ;POINT TO INPUT TABLE
   F8A4   47               MOV     B,A             ;PORT NO TO B
   F8A5   3A36D1           LDA     LD136           ;NO OF TABLE ENTRIES
   F8A8   4F       LF8A8:  MOV     C,A             ;TABLE ENTRIES TO C
   F8A9   B7               ORA     A               ;SET FLAGS
   F8AA   78               MOV     A,B             ;PORT NO BACK TO A
   F8AB   41               MOV     B,C             ;NO OF ENTRIES TO B
   F8AC   CAB8F8           JZ      LF8B8           ;IF TABLE CURRENTLY EMPTY
   F8AF   BE       LF8AF:  CMP     M               ;POINTING AT CORRECT PORT ?
   F8B0   23               INX     H               ;POINT TO I/O TYPE FOR PORT
   F8B1   C8               RZ                      ;IF WE HAVE PORT
   F8B2   23               INX     H               ;POINT TO I/O BYTE VALUE
   F8B3   23               INX     H               ;AND TO NEXT PORT
   F8B4   05               DCR     B               ;DCR NO OF TABLE ENTRIES LEFT
   F8B5   C2AFF8           JNZ     LF8AF           ;AND CHECK REMAINING ENTRIES
   F8B8   77       LF8B8:  MOV     M,A             ;PUT PORT IN TABLE
   F8B9   23               INX     H               ;AND POINT TO I/O TYPE
   F8BA   0C               INR     C               ;INR NO OF ENTRIES IN TABLE
   F8BB   C9               RET                     ;AND RETURN DONE
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 77
      


                   ;PROCESS THE SET REGISTER/FLAG COMMANDS
                   ;
   F8BC   FE53     LF8BC:  CPI     'S'             ;SET REGISTERS ?
   F8BE   C249F9           JNZ     LF949           ;THERE AREN'T ANY COMMANDS LEFT
   F8C1   21E5D1           LXI     H,IBUF+1        ;POINT TO NEXT BYTE
   F8C4   2201D1           SHLD    PNTR            ;AND SAVE CHAR POINTER
   F8C7   CD6AE2   LF8C7:  CALL    ZBUF            ;CLEAR ABUF
   F8CA   CDCCEE           CALL    SBLK            ;SCAN TO TEXT
   F8CD   DA74F7           JC      LF774           ;RESTART IF C/R FOUND
   F8D0   EB               XCHG                    ;LINE PTR TO D,E
   F8D1   0E0A             MVI     C,10            ;NO OF REGISTERS IN TABLE
   F8D3   2154F9           LXI     H,LF954         ;POINT TO TABLE
   F8D6   BE       LF8D6:  CMP     M               ;SAME ?
   F8D7   CAE2F8           JZ      LF8E2           ;FOUND REGISTER TO SET
   F8DA   23               INX     H               ;ELSE POINT TO NEXT REGISTER
   F8DB   0D               DCR     C               ;AND DCR COUNT
   F8DC   C2D6F8           JNZ     LF8D6           ;THEN TEST IT FOR MATCH
   F8DF   C349F9           JMP     LF949           ;NO MATCH IN TABLE, ERROR
   F8E2   79       LF8E2:  MOV     A,C             ;GET DISPLACEMENT INTO TABLE
   F8E3   3209D1           STA     TEMP            ;AND SAVE IT
   F8E6   EB               XCHG                    ;POINTER TO H,L
   F8E7   23               INX     H               ;POINT TO NEXT CHAR
   F8E8   7E               MOV     A,M             ;GET IT
   F8E9   FE3D             CPI     '='             ;EQUALS SIGN ?
   F8EB   C249F9           JNZ     LF949           ;ERROR IF NOT
   F8EE   23               INX     H               ;POINT TO ARGUMENT
   F8EF   7E               MOV     A,M             ;GET IT
   F8F0   11DFD0           LXI     D,ABUF          ;POINT TO ABUF
   F8F3   CD12F9           CALL    LF912           ;CONVERT ARGUMENT TO BINARY
   F8F6   DA49F9           JC      LF949           ;IF ERROR
   F8F9   3A09D1           LDA     TEMP            ;GET DISP. INTO TABLE BACK
   F8FC   FE01             CPI     1               ;SETTING STACK POINTER ?
   F8FE   CA2CF9           JZ      LF92C           ;HANDLE THAT SEPARATELY
   F901   4F               MOV     C,A             ;DISPLACEMENT TO C
   F902   7C               MOV     A,H             ;GET HIGH ORDER BYTE OF VALUE
   F903   B7               ORA     A               ;SET FLAGS
   F904   C249F9           JNZ     LF949           ;ERROR IF > 255
   F907   7D               MOV     A,L             ;GET VALUE TO A
   F908   2140D1           LXI     H,LD140         ;REGISTER TABLE IN RAM
   F90B   0600             MVI     B,0             ;B,C HAS DISPLACEMENT INTO TBL
   F90D   09               DAD     B               ;H,L HAS ABSOLUTE ADDR
   F90E   77               MOV     M,A             ;UPDATE SIM/8080 REGISTER
   F90F   C3C7F8           JMP     LF8C7           ;DO NEXT REGISTER(S) IF ANY
                   ;
                   ;ROUTINE TO CONVERT KEYED IN VALUE TO 16 BIT VALUE IN H,L
                   ;
   F912   CD3EF1   LF912:  CALL    ALPS            ;PUT ARGUMENT INTO ABUF
   F915   1B               DCX     D               ;POINT TO LAST CHAR
   F916   1A               LDAX    D               ;GET IT
   F917   01DFD0           LXI     B,ABUF          ;POINT TO ARGUMENT
   F91A   FE44             CPI     'D'             ;DECIMAL ?
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 78
      


   F91C   CA02F3           JZ      NUM1            ;YES
   F91F   FE51             CPI     'Q'             ;OCTAL ?
   F921   CA0CF3           JZ      NUM3            ;YES
   F924   FE48             CPI     'H'             ;HEX ?
   F926   C2F3E2           JNZ     EMODE           ;NO, USE STD MODE
   F929   C307F3           JMP     NUM2            ;ELSE HEX
   F92C   2240D1   LF92C:  SHLD    LD140           ;UPDATE SIM/8080 STACK PNTR
   F92F   C3C7F8           JMP     LF8C7           ;AND DO NEXT REGISTER(S) IF ANY
                   ;
                   ;ROUTINE TO SET SIMULATED PROGRAM COUNTER
                   ;
   F932   CD81E2   LF932:  CALL    ETRA            ;GET VALUES FROM COMMAND LINE
   F935   DA49F9           JC      LF949           ;IF ERROR
   F938   CD1EE3           CALL    LE31E           ;VALUES TO BIN IN BBUF & BBUF+2
   F93B   DA49F9           JC      LF949           ;ON ERROR
   F93E   3ADFD0           LDA     ABUF            ;GET FIRST CHAR OF VALUE
   F941   B7               ORA     A               ;AND SET FLAGS
   F942   CA49F9           JZ      LF949           ;ERROR IF NO VALUE GIVEN
   F945   2AEFD0           LHLD    BBUF            ;GET VALUE
   F948   C9               RET                     ;AND RETURN WITH IT IN H,L
                   ;
                   ;ERROR HANDLER ROUTINE
                   ;
   F949   CD16E2   LF949:  CALL    CRLF            ;DO CR/LF
   F94C   063F             MVI     B,'?'           ;GET QUESTION MARK
   F94E   CDCFD0           CALL    OUT8            ;AND PRINT IT
   F951   C374F7           JMP     LF774           ;THEN RESTART SIMULATOR
                   ;
                   ;TABLE OF REGISTER NAMES FOR THE SET COMMANDS
                   ;VALUES ARE STORED IN A TABLE IN MEMORY AT D143, BUT
                   ;IN REVERSE ORDER.  THERE IS ONE ENTRY HERE FOR EACH
                   ;ENTRY IN THAT TABLE.  NOTE THAT THE ACCUM. APPEARS
                   ;TWICE, ONCE BY ITSELF & ONCE WITH THE FLAGS (AS PSW)
                   ;
   F954   41       LF954:  DB      'A'
   F955   42               DB      'B'
   F956   43               DB      'C'
   F957   44               DB      'D'
   F958   45               DB      'E'
   F959   48               DB      'H'
   F95A   4C               DB      'L'
   F95B   41               DB      'A'
   F95C   46               DB      'F'
   F95D   53               DB      'S'
   F95E   00               NOP
   F95F   00               NOP
   F960   00               NOP
   F961   00               NOP
   F962   00               NOP
   F963   00               NOP
   F964   00               NOP
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 79
      


   F965   00               NOP
   F966   00               NOP
   F967   00               NOP
   F968   00               NOP
   F969   00               NOP
                   ;
                   ;COME HERE TO EXECUTE AUTO-NUMBER INPUT MODE
                   ;
                   ;WHAT THIS CODE ACTUALLY DOES IS TO MODIFY THE INPUT ROUTINE
                   ;TO COME INTO A PRE-PROCESSOR AT F99A INSTEAD OF THE NORMAL
                   ;IN8 INPUT ROUTINE.  THAT ROUTINE ACTUALLY DOES THE LINE
                   ;NUMBER PROCESSING.
                   ;
   F96A   2ACDD0   AUTO:   LHLD    IN8+1           ;GET ADDR OF CUR INPUT DRIVER
   F96D   22F0D0           SHLD    BBUF+1          ;AND SAVE IN BBUF
   F970   3ADFD0           LDA     ABUF            ;SEE IF OPT PARAMETER GIVEN
   F973   B7               ORA     A               ;SET FLAGS
   F974   CA83F9           JZ      LF983           ;NOT GIVEN, START WITH 1
   F977   2A09D0           LHLD    MAXL            ;GET HALF OF CUR MAX LINE NO
   F97A   22DFD0           SHLD    ABUF            ;SAVE IT
   F97D   2A0BD0           LHLD    MAXL+2          ;GET OTHER HALF
   F980   C389F9           JMP     LF989           ;SKIP INITIALIZATION
   F983   213030   LF983:  LXI     H,3030H         ;TWO ZERO'S
   F986   22DFD0           SHLD    ABUF            ;SAVE AS TWO HIGH DIGITS
   F989   22E1D0   LF989:  SHLD    ABUF+2          ;AND SAVE H,L AS LOW ORDER DGTS
   F98C   3EC3             MVI     A,0C3H          ;JUMP INST
   F98E   32EFD0           STA     BBUF            ;BBUF = JUMP INTO AUTO CODE NOW
   F991   219AF9           LXI     H,LF99A         ;GET ADDR OF LINE NO PROCESSOR
   F994   22CDD0           SHLD    IN8+1           ;USE IT FOR NEW INPUT ROUTINE
   F997   C3D1E0           JMP     EORNS           ;EVERYTHING'S SET UP
                   ;
                   ;HERE IS THE ROUTINE WHICH ACTUALLY PUTS LINE NOS. ON LINES.
                   ;IT IS SUBSTITUTED FOR THE STANDARD ROUTINE BY THE CODE ABOVE.
                   ;
   F99A   CDEFD0   LF99A:  CALL    BBUF            ;CALL THE STD. INPUT ROUTINE
   F99D   7D               MOV     A,L             ;GET LOW BYTE ADDR OF CHAR PTR
   F99E   FEE4             CPI     IBUF AND 0FFH   ;AT 1ST CHAR OF INPUT BUFFER ?
   F9A0   C2AEF9           JNZ     LF9AE           ;NO - SKIP BEG OF LINE PROC.
   F9A3   3E1B             MVI     A,1BH           ;YES - SEE IF ESCAPE CHAR
   F9A5   B8               CMP     B               ;
   F9A6   CA60E0           JZ      EORMS           ;IT IS ESC - DO COMPLETE RESET
   F9A9   21E9D1           LXI     H,IBUF+5        ;POINT TO NEW CHAR DEST
   F9AC   1E07             MVI     E,7             ;AND RESET LINE LENGTH
   F9AE   3E0D     LF9AE:  MVI     A,0DH           ;GET ASCII CAR. RET.
   F9B0   B8               CMP     B               ;END OF LINE ?
   F9B1   78               MOV     A,B             ;PUT CHAR IN ACCUM.
   F9B2   C0               RNZ                     ;AND RETURN IF NOT END OF LINE
   F9B3   E5               PUSH    H               ;ELSE SAVE IBUF POINTER
   F9B4   D5               PUSH    D               ;AND LINE LENGTH
   F9B5   11DFD0           LXI     D,ABUF          ;POINT TO CUR LINE NO.
   F9B8   21E2D0           LXI     H,ABUF+3        ;AND TO END OF LINE NO.
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 80
      


   F9BB   7E       LF9BB:  MOV     A,M             ;GET RIGHT-HAND DIGIT
   F9BC   3C               INR     A               ;INCREMENT IT
   F9BD   FE3A             CPI     '9'+1           ;GONE PAST 9 ?
   F9BF   D2D8F9           JNC     LF9D8           ;YES - FIX IT UP
   F9C2   77               MOV     M,A             ;ELSE PUT IT BACK
   F9C3   21E4D1           LXI     H,IBUF          ;POINT TO IBUF
   F9C6   0604             MVI     B,4             ;LENGTH OF LINE NO
   F9C8   1A       LF9C8:  LDAX    D               ;GET CHAR FROM LINE NO.
   F9C9   77               MOV     M,A             ;AND PUT IT INTO IBUF
   F9CA   23               INX     H               ;INR IBUF POINTER
   F9CB   13               INX     D               ;INR LINE NO. POINTER
   F9CC   05               DCR     B               ;DCR COUNT
   F9CD   C2C8F9           JNZ     LF9C8           ;AND CONTINUE TILL DONE
   F9D0   3620             MVI     M,' '           ;THEN PUT A SPACE IN IBUF
   F9D2   D1               POP     D               ;AND RESTORE REGISTERS
   F9D3   060D             MVI     B,0DH           ;AND CHARACTER
   F9D5   78               MOV     A,B             ;WHICH READ WANTS IN ACCUM
   F9D6   E1               POP     H               ;RESTORE REGS
   F9D7   C9               RET                     ;AND GO HOME, DONE
   F9D8   3E30     LF9D8:  MVI     A,'0'           ;REPLACE DIGIT WITH A ZERO
   F9DA   77               MOV     M,A             ;AND PUT IT BACK
   F9DB   2B               DCX     H               ;POINT TO HIGHER DIGIT
   F9DC   C3BBF9           JMP     LF9BB           ;AND TRY TO INR IT
   F9DF   00               NOP
   F9E0   00               NOP
   F9E1   00               NOP
   F9E2   00               NOP
   F9E3   00               NOP
   F9E4   00               NOP
   F9E5   00               NOP
   F9E6   00               NOP
   F9E7   00               NOP
   F9E8   00               NOP
   F9E9   00               NOP
   F9EA   00               NOP
   F9EB   00               NOP
   F9EC   00               NOP
   F9ED   00               NOP
   F9EE   00               NOP
   F9EF   00               NOP
   F9F0   00               NOP
   F9F1   00               NOP
   F9F2   00               NOP
   F9F3   00               NOP
   F9F4   00               NOP
   F9F5   00               NOP
   F9F6   00               NOP
   F9F7   00               NOP
   F9F8   00               NOP
   F9F9   00               NOP
   F9FA   00               NOP
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 81
      


   F9FB   00               NOP
   F9FC   00               NOP
   F9FD   00               NOP
   F9FE   00               NOP
   F9FF   00               NOP
                   ;
                   ; ****END OF ALS8SIM MODULE
                   ;
                   ;
                   ;THE TXT-2 TEXT EDITOR STARTS HERE BUT ENTRY IS AT TXT2 (FA0B)
                   ;
                   ;ROUTINE TO CREATE A ONE LINE FILE NECESSARY FOR THE
                   ;EDITOR WHEN STARTING A NEW (E.G. NULL OR EMPTY) FILE
                   ;
   FA00   3602     LFA00:  MVI     M,2             ;LENGTH BYTE
   FA02   23               INX     H               ;POINT TO NEXT BYTE
   FA03   360D             MVI     M,0DH           ;CARRIAGE RETURN
   FA05   23               INX     H               ;POINT TO NEXT
   FA06   3601             MVI     M,1             ;END OF FILE MARK
   FA08   2207D0           SHLD    EOFP            ;NOW WE HAVE A NON-EMPTY FILE
                   ;
                   ;THIS IS THE EDITOR ENTRY POINT
                   ;
   FA0B   312FD1   TXT2:   LXI     SP,SMODE        ;SET STACK POINTER
   FA0E   2A05D0           LHLD    BOFP            ;GET BEG OF FILE POINTER
   FA11   1107D0           LXI     D,EOFP          ;AND POINT TO END OF FILE PTR
   FA14   CD42FD           CALL    LFD42           ;COMPARE THEM
   FA17   CA00FA           JZ      LFA00           ;CREATE ONE LINE FILE IF EMPTY
   FA1A   DADDE7           JC      WHAT            ;ERROR IF BOFP > EOFP
   FA1D   E5               PUSH    H               ;SAVE BEG. OF FILE POINTER
   FA1E   CD4EFD           CALL    LFD4E           ;CLEAR SCREEN & INITIALIZE VARS
   FA21   97               SUB     A               ;GET A ZERO
   FA22   47               MOV     B,A             ;MAKE IT ROW
   FA23   CD1AFF           CALL    LFF1A           ;CALC CUR ADDR & TURN IT ON
   FA26   E1               POP     H               ;RESTORE BEG OF FILE PNTR
   FA27   229AD1   LFA27:  SHLD    LD19A           ;
   FA2A   CDD9FA           CALL    LFAD9
                   ;
                   ;THIS IS THE BEGINNING OF THE MAIN EDITOR COMMAND LOOP
                   ;
   FA2D   CD33FA   LFA2D:  CALL    LFA33           ;GET AND EXECUTE A COMMAND
   FA30   C32DFA           JMP     LFA2D           ;DO IT AGAIN
                   ;
                   ;AND THAT WAS THE END OF IT
                   ;
   FA33   CD13FF   LFA33:  CALL    LFF13           ;CALC CUR ADDR & TURN CURSR ON
   FA36   CDCCD0           CALL    IN8             ;GET A CHAR OF COMMAND
   FA39   FE20     LFA39:  CPI     ' '             ;CONTROL CHAR ?
   FA3B   D204FC           JNC     LFC04           ;PROCESS PRINTING CHAR IF NOT
   FA3E   FE01             CPI     'A'-40H         ;CURSOR LEFT COMMAND ?
   FA40   CA57FB           JZ      LFB57           ;PROCESS IF SO
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 82
      


   FA43   FE13             CPI     'S'-40H         ;CURSOR RIGHT COMMAND ?
   FA45   CA10FC           JZ      LFC10           ;PROCESS IF SO
   FA48   F5               PUSH    PSW             ;SAVE COMMAND
   FA49   CDA4FC           CALL    LFCA4
   FA4C   C1               POP     B               ;RESTORE COMMAND TO B
   FA4D   2165FA           LXI     H,LFA65         ;EDITOR COMMAND TABLE
   FA50   7E       LFA50:  MOV     A,M             ;GET TABLE COMMAND
   FA51   B7               ORA     A               ;END OF TABLE ?
   FA52   C8               RZ                      ;YES
   FA53   B8               CMP     B               ;NO - SAME AS COMMAND ?
   FA54   23               INX     H               ;POINT TO COMMAND ADDR
   FA55   CA60FA           JZ      LFA60           ;DISPATCH TO IT ON MATCH
   FA58   23               INX     H               ;NO MATCH - POINT PAST COMMAND
   FA59   23               INX     H               ;TO NEXT COMMAND
   FA5A   C350FA           JMP     LFA50           ;AND TEST NEXT COMMAND
                   ;
                   ;ROUTINE TO DISPATCH TO COMMAND IN TABLE
                   ;
   FA5D   21A1D1   LFA5D:  LXI     H,LD1A1         ;POINT TO UNDEFINED COMMAND
   FA60   7E       LFA60:  MOV     A,M             ;COMMAND LOW BYTE TO A
   FA61   23               INX     H               ;POINT TO HIGH BYTE
   FA62   66               MOV     H,M             ;HIGH BYTE TO H
   FA63   6F               MOV     L,A             ;H,L NOW HAS COMPLETE ADDR
   FA64   E9               PCHL                    ;DISPATCH TO COMMAND ROUTINE
                   ;
                   ;HERE IS THE COMMAND TABLE FOR THE EDITOR COMMANDS
                   ;
   FA65   17       LFA65:  DB      'W'-40H         ;UP
   FA66   CCFA             DW      LFACC
   FA68   1A               DB      'Z'-40H         ;DOWN
   FA69   62FB             DW      LFB62
   FA6B   05               DB      'E'-40H         ;SCROLL UP ONE LINE
   FA6C   8EFB             DW      LFB8E
   FA6E   18               DB      'X'-40H         ;SCROLL DOWN ONE LINE
   FA6F   C6FA             DW      LFAC6
   FA71   12               DB      'R'-40H         ;SCROLL UP 1 PAGE
   FA72   12FB             DW      LFB12
   FA74   03               DB      'C'-40H         ;SCROLL DOWN 1 PAGE
   FA75   21FB             DW      LFB21
   FA77   0A               DB      'J'-40H         ;ERASE EOF & SCROLL UP (L/F)
   FA78   7BFB             DW      LFB7B
   FA7A   02               DB      'B'-40H         ;INSERT LINE
   FA7B   C8FB             DW      LFBC8
   FA7D   0D               DB      'M'-40H         ;SCROLL UP & INSERT LINE (C/R)
   FA7E   9DFB             DW      LFB9D
   FA80   14               DB      'T'-40H         ;TOGGLE INSERT MODE SW
   FA81   72FB             DW      LFB72
   FA83   10               DB      'P'-40H         ;DELETE LINE
   FA84   D2FB             DW      LFBD2
   FA86   08               DB      'H'-40H         ;DELETE CHAR
   FA87   2EFC             DW      LFC2E
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 83
      


   FA89   06               DB      'F'-40H         ;EXIT TO ALS-8
   FA8A   A5FA             DW      LFAA5
   FA8C   0F               DB      'O'-40H         ;EDITOR SEARCH
   FA8D   58FF             DW      LFF58
   FA8F   09               DB      'I'-40H         ;CONTINUE SEARCH
   FA90   64FF             DW      LFF64
   FA92   19               DB      'Y'-40H         ;REPEAT COMMAND
   FA93   AEFA             DW      LFAAE
   FA95   11               DB      'Q'-40H         ;HOME COMMAND
   FA96   9CFA             DW      LFA9C
   FA98   15               DB      'U'-40H         ;UNDEFINED COMMAND
   FA99   5DFA             DW      LFA5D
   FA9B   00               DB      0
                   ;
                   ;HOME CURSOR
                   ;
   FA9C   AF       LFA9C:  XRA     A               ;GET A ZERO
   FA9D   3296D1           STA     NCHAR           ;MAKE IT THE COLUMN
   FAA0   3E06             MVI     A,6             ;HOME=LINE 7 (START W/0 AT TOP)
   FAA2   C3D6FA           JMP     LFAD6           ;PUT THE CURSOR THERE
                   ;
                   ;EXIT EDITOR TO ALS-8
                   ;
   FAA5   CD4EFD   LFAA5:  CALL    LFD4E           ;CLEAR VDM-1 SCREEN
   FAA8   CDD3E6           CALL    FCHK            ;FCHK FILE
   FAAB   C360E0           JMP     EORMS           ;GO BACK TO ALS-8
                   ;
                   ;REPEAT COMMAND
                   ;
   FAAE   CDCCD0   LFAAE:  CALL    IN8             ;GET COMMAND TO REPEAT
   FAB1   32EFD0           STA     BBUF            ;SAVE COMMAND
   FAB4   CDCCD0           CALL    IN8             ;GET REPEAT COUNT
   FAB7   D630             SUI     30H             ;CONVERT TO BINARY
   FAB9   F5       LFAB9:  PUSH    PSW             ;SAVE COUNT
   FABA   3AEFD0           LDA     BBUF            ;GET COMMAND
   FABD   CD39FA           CALL    LFA39           ;EXECUTE IT ONE TIME
   FAC0   F1               POP     PSW             ;RESTORE COUNT
   FAC1   3D               DCR     A               ;DECREMENT COUNT
   FAC2   C8               RZ                      ;DONE IF COUNT=0
   FAC3   C3B9FA           JMP     LFAB9           ;ELSE DO IT AGAIN
                   ;
                   ;SCROLL DOWN 1 LINE
                   ;
   FAC6   CD72FC   LFAC6:  CALL    LFC72
   FAC9   C2D9FA           JNZ     LFAD9
                   ;
                   ;CURSOR UP
                   ;
   FACC   3A95D1   LFACC:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FACF   3D               DCR     A
   FAD0   F2D6FA           JP      LFAD6
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 84
      


   FAD3   3A99D1           LDA     LD199
   FAD6   3295D1   LFAD6:  STA     SLINE
   FAD9   2A9AD1   LFAD9:  LHLD    LD19A
   FADC   229CD1           SHLD    LD19C
   FADF   AF               XRA     A
   FAE0   3298D1           STA     LD198           ;CLEAR INSERT MODE
   FAE3   F5               PUSH    PSW
   FAE4   3299D1   LFAE4:  STA     LD199
   FAE7   EB               XCHG
   FAE8   2195D1           LXI     H,SLINE
   FAEB   BE               CMP     M
   FAEC   EB               XCHG
   FAED   C2F3FA           JNZ     LFAF3
   FAF0   229ED1           SHLD    LD19E
   FAF3   CD07FE   LFAF3:  CALL    LFE07
   FAF6   F1       LFAF6:  POP     PSW
   FAF7   3C               INR     A
   FAF8   FE10             CPI     16
   FAFA   C8               RZ
   FAFB   47               MOV     B,A
   FAFC   CD5FFC           CALL    LFC5F
   FAFF   EB               XCHG
   FB00   78               MOV     A,B
   FB01   F5               PUSH    PSW
   FB02   C2E4FA           JNZ     LFAE4
   FB05   0600             MVI     B,0
   FB07   0E23             MVI     C,'#'
   FB09   210140           LXI     H,4001H
   FB0C   CD4EFE           CALL    LFE4E
   FB0F   C3F6FA           JMP     LFAF6
                   ;
                   ;SCROLL UP 1 PAGE (16 LINES)
                   ;
   FB12   3E10     LFB12:  MVI     A,16
   FB14   F5       LFB14:  PUSH    PSW
   FB15   CD5FFC           CALL    LFC5F
   FB18   C494FB           CNZ     LFB94
   FB1B   F1               POP     PSW
   FB1C   3D               DCR     A
   FB1D   C214FB           JNZ     LFB14
   FB20   C9               RET
                   ;
                   ;SCROLL DOWN 1 PAGE (16 LINES)
                   ;
   FB21   3E10     LFB21:  MVI     A,16
   FB23   F5       LFB23:  PUSH    PSW
   FB24   CD72FC           CALL    LFC72
   FB27   C4D9FA           CNZ     LFAD9
   FB2A   F1               POP     PSW
   FB2B   3D               DCR     A
   FB2C   C223FB           JNZ     LFB23
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 85
      


   FB2F   C9               RET
                   ;
                   ;ROUTINE TO GIVE WARNING WHEN TEXT BUFFER GETS FULL
                   ;
   FB30   1146FB   LFB30:  LXI     D,LFB46         ;POINT TO WARNING MESSAGE
   FB33   0E11             MVI     C,17            ;LENGTH OF MESSAGE
   FB35   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FB38   CD0CFE           CALL    LFE0C           ;PRINT MESSAGE
   FB3B   CDCCD0   LFB3B:  CALL    IN8             ;GET CHAR FROM CONSOLE
   FB3E   FE11             CPI     'Q'-40H         ;CONTROL-Q ?
   FB40   C23BFB           JNZ     LFB3B           ;NO - WAIT INDEFINATELY
   FB43   C30BFA           JMP     TXT2            ;YES - RESTART EDITOR
                   ;
   FB46   46554C4C LFB46:  DB      'FULL--TYPE CTRL Q'
   FB4A   2D2D5459
   FB4E   50452043
   FB52   54524C20
   FB56   51      
                   ;
                   ;CURSOR LEFT COMMAND
                   ;
   FB57   CD2DFF   LFB57:  CALL    LFF2D           ;CURSOR OFF
   FB5A   78               MOV     A,B             ;COLUMN TO A
   FB5B   3D               DCR     A               ;DECREMENT IT
   FB5C   E63F     LFB5C:  ANI     3FH             ;KEEP IT TO 0-63
   FB5E   77               MOV     M,A             ;PUT IT BACK AS NEW COLUMN
   FB5F   C316FF           JMP     LFF16           ;TURN CURSOR ON & RET
                   ;
                   ;CURSOR DOWN
                   ;
   FB62   3A95D1   LFB62:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FB65   2199D1           LXI     H,LD199
   FB68   BE               CMP     M
   FB69   C26EFB           JNZ     LFB6E
   FB6C   3EFF             MVI     A,0FFH
   FB6E   3C       LFB6E:  INR     A
   FB6F   C3D6FA           JMP     LFAD6
                   ;
                   ;TOGGLE CHAR INSERT MODE
                   ;
   FB72   3A98D1   LFB72:  LDA     LD198           ;GET INSERT MODE SWITCH
   FB75   EE01             XRI     1               ;TOGGLE LOW ORDER BIT
   FB77   3298D1           STA     LD198           ;PUT IT BACK
   FB7A   C9               RET                     ;DONE
                   ;
                   ;ERASE TO THE END OF LINE AND SCROLL UP
                   ;
   FB7B   CDEDFD   LFB7B:  CALL    LFDED           ;CALC CURSOR ADDR
   FB7E   3620     LFB7E:  MVI     M,' '           ;MOVE SPACE TO LINE
   FB80   2C               INR     L               ;INR LINE POINTER
   FB81   7D               MOV     A,L             ;MOVE IT TO A
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 86
      


   FB82   E63F             ANI     3FH             ;END OF LINE YET ?
   FB84   C27EFB           JNZ     LFB7E           ;MORE SPACES IF NOT
   FB87   CDA4FC           CALL    LFCA4           ;YES - NOW UPDATE FILE
   FB8A   97               SUB     A               ;GET A ZERO
   FB8B   3296D1           STA     NCHAR           ;AND MAKE IT NEW COLUMN
                   ;
                   ;SCROLL UP 1 LINE
                   ;
   FB8E   CD5FFC   LFB8E:  CALL    LFC5F
   FB91   CA62FB           JZ      LFB62
   FB94   219AD1   LFB94:  LXI     H,LD19A
   FB97   CD62FC           CALL    LFC62
   FB9A   C3D9FA           JMP     LFAD9
                   ;
                   ;SCROLL UP AND INSERT 1 LINE
                   ;
   FB9D   219ED1   LFB9D:  LXI     H,LD19E
   FBA0   CD62FC           CALL    LFC62
   FBA3   C2ACFB           JNZ     LFBAC
   FBA6   2A07D0           LHLD    EOFP
   FBA9   229ED1           SHLD    LD19E
   FBAC   CD51FC   LFBAC:  CALL    LFC51
   FBAF   AF               XRA     A
   FBB0   3296D1           STA     NCHAR
   FBB3   3A99D1           LDA     LD199
   FBB6   FE0F             CPI     0FH
   FBB8   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FBBB   C26EFB           JNZ     LFB6E
   FBBE   219AD1           LXI     H,LD19A
   FBC1   CD62FC           CALL    LFC62
   FBC4   C3D9FA           JMP     LFAD9
                   ;
   FBC7   01               DB      01H             ;THIS IS A FOOL'S BYTE
                   ;
                   ;INSERT LINE COMMAND
                   ;
   FBC8   CD51FC   LFBC8:  CALL    LFC51
   FBCB   AF               XRA     A
   FBCC   3296D1           STA     NCHAR
   FBCF   C3D9FA           JMP     LFAD9
                   ;
                   ;DELETE LINE COMMAND
                   ;
   FBD2   97       LFBD2:  SUB     A               ;GET A ZERO
   FBD3   3298D1           STA     LD198           ;USE IT TO CLEAR INSERT MODE
   FBD6   2A05D0           LHLD    BOFP
   FBD9   7E               MOV     A,M
   FBDA   CD32FD           CALL    LFD32
   FBDD   7E               MOV     A,M
   FBDE   FE01             CPI     1
   FBE0   C8               RZ
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 87
      


   FBE1   CD5FFC           CALL    LFC5F
   FBE4   C2EAFB           JNZ     LFBEA
   FBE7   CD72FC           CALL    LFC72
   FBEA   F5       LFBEA:  PUSH    PSW
   FBEB   2A9ED1           LHLD    LD19E
   FBEE   7E               MOV     A,M
   FBEF   2F               CMA
   FBF0   3C               INR     A
   FBF1   CDD1FC           CALL    LFCD1
   FBF4   F1               POP     PSW
   FBF5   C2D9FA           JNZ     LFAD9
   FBF8   2A9ED1           LHLD    LD19E
   FBFB   7E               MOV     A,M
   FBFC   FE01             CPI     1
   FBFE   CACCFA           JZ      LFACC
   FC01   C3D9FA           JMP     LFAD9
                   ;
                   ;
                   ;
   FC04   4F       LFC04:  MOV     C,A
   FC05   3A98D1           LDA     LD198           ;GET INSERT MODE FLAG
   FC08   B7               ORA     A               ;SET CPU FLAGS
   FC09   C218FC           JNZ     LFC18           ;JUMP IF IN INSERT MODE
   FC0C   CDEDFD           CALL    LFDED
   FC0F   71               MOV     M,C
                   ;
                   ;CURSOR RIGHT COMMAND
                   ;
   FC10   CD2DFF   LFC10:  CALL    LFF2D           ;TURN CURSOR OFF
   FC13   78               MOV     A,B             ;COLUMN TO A
   FC14   3C               INR     A               ;INCREMENT IT
   FC15   C35CFB           JMP     LFB5C           ;CURSOR BACK ON & RET
                   ;
                   ;
                   ;
   FC18   CDEDFD   LFC18:  CALL    LFDED
   FC1B   79               MOV     A,C
   FC1C   F680             ORI     80H
   FC1E   4F               MOV     C,A
   FC1F   7E       LFC1F:  MOV     A,M
   FC20   E67F             ANI     7FH
   FC22   71               MOV     M,C
   FC23   4F               MOV     C,A
   FC24   2C               INR     L
   FC25   7D               MOV     A,L
   FC26   E63F             ANI     3FH
   FC28   C21FFC           JNZ     LFC1F
   FC2B   C310FC           JMP     LFC10
                   ;
                   ;DELETE CHARACTER
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 88
      


   FC2E   CDEDFD   LFC2E:  CALL    LFDED           ;CALC CURSOR POSITION
   FC31   3A96D1           LDA     NCHAR           ;GET CURRENT COLUMN
   FC34   FE3F             CPI     3FH             ;COLUMN 63 (LAST) ?
   FC36   DA3CFC           JC      LFC3C           ;NO - DELETE CHAR
   FC39   36A0             MVI     M,' '+80H       ;MAKE LAST COL SPACE W/CURSOR
   FC3B   C9               RET                     ;DONE
                   ;
                   ;ROUTINE TO DELETE A CHAR FROM MIDDLE OF LINE
                   ;
   FC3C   7D       LFC3C:  MOV     A,L             ;GET LINE POINTER
   FC3D   5F               MOV     E,A             ;SAVE IT
   FC3E   F63F             ORI     3FH             ;MAKE IT POINT TO LAST COL
   FC40   6F               MOV     L,A             ;PUT IT BACK
   FC41   7B               MOV     A,E             ;RESTORE ORIG PTR TO A
   FC42   0E20             MVI     C,' '           ;SPACE TO C
   FC44   46       LFC44:  MOV     B,M             ;GET CHAR FROM LINE
   FC45   71               MOV     M,C             ;REPL WITH CHAR ON IT'S RIGHT
   FC46   48               MOV     C,B             ;AND MAKE IT NXT CHAR ON RIGHT
   FC47   2D               DCR     L               ;DECR COLUMN POINTER
   FC48   BD               CMP     L               ;AND COMPARE TO INITIAL COL
   FC49   C244FC           JNZ     LFC44           ;AND KEEP UP IF NOT DONE
   FC4C   78               MOV     A,B             ;GET LAST CHAR TO STORE IN A
                   ;
                   ;TURN ON THE CURSOR
                   ;
   FC4D   F680     LFC4D:  ORI     80H             ;MAKE CURSOR BIT HIGH
   FC4F   77               MOV     M,A             ;PUT CHAR W/CURSOR ON SCREEN
   FC50   C9               RET                     ;DONE, CURSOR ON
                   ;
                   ;
                   ;
   FC51   3E02     LFC51:  MVI     A,2
   FC53   CDD1FC           CALL    LFCD1
   FC56   2A9ED1           LHLD    LD19E
   FC59   3602             MVI     M,2
   FC5B   23               INX     H
   FC5C   360D             MVI     M,0DH
   FC5E   C9               RET
                   ;
                   ;
                   ;
   FC5F   219CD1   LFC5F:  LXI     H,LD19C
   FC62   5E       LFC62:  MOV     E,M
   FC63   23               INX     H
   FC64   56               MOV     D,M
   FC65   1A               LDAX    D
   FC66   EB               XCHG
   FC67   CD32FD           CALL    LFD32
   FC6A   EB               XCHG
   FC6B   1A               LDAX    D
   FC6C   3D               DCR     A
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 89
      


   FC6D   C8               RZ
   FC6E   72               MOV     M,D
   FC6F   2B               DCX     H
   FC70   73               MOV     M,E
   FC71   C9               RET
                   ;
                   ;
                   ;
   FC72   2A9AD1   LFC72:  LHLD    LD19A
   FC75   CD95FC           CALL    LFC95
   FC78   C8               RZ
   FC79   2B               DCX     H
   FC7A   2B       LFC7A:  DCX     H
   FC7B   CD95FC           CALL    LFC95
   FC7E   CA90FC           JZ      LFC90
   FC81   7E               MOV     A,M
   FC82   FE0D             CPI     0DH
   FC84   C27AFC           JNZ     LFC7A
   FC87   2B               DCX     H
   FC88   7E               MOV     A,M
   FC89   FE0D             CPI     0DH
   FC8B   CA8FFC           JZ      LFC8F
   FC8E   23               INX     H
   FC8F   23       LFC8F:  INX     H
   FC90   3C       LFC90:  INR     A
   FC91   229AD1           SHLD    LD19A
   FC94   C9               RET
                   ;
                   ;
                   ;
   FC95   3A05D0   LFC95:  LDA     BOFP
   FC98   95               SUB     L
   FC99   3A06D0           LDA     BOFP+1
   FC9C   9C               SBB     H
   FC9D   C0               RNZ
   FC9E   3A05D0           LDA     BOFP
   FCA1   95               SUB     L
   FCA2   B7               ORA     A
   FCA3   C9               RET
                   ;
                   ;
                   ;
   FCA4   CD2DFF   LFCA4:  CALL    LFF2D           ;TURN ON THE CURSOR
   FCA7   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FCAA   CD33FE           CALL    LFE33           ;BACK UP TO LAST NON BLANK CHAR
   FCAD   0C               INR     C
   FCAE   0C               INR     C
   FCAF   79               MOV     A,C
   FCB0   FE06             CPI     6
   FCB2   D2B8FC           JNC     LFCB8
   FCB5   3E06             MVI     A,6
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 90
      


   FCB7   4F               MOV     C,A
   FCB8   2A9ED1   LFCB8:  LHLD    LD19E
   FCBB   96               SUB     M
   FCBC   CDD1FC           CALL    LFCD1
   FCBF   2A9ED1           LHLD    LD19E
   FCC2   71               MOV     M,C
   FCC3   0D               DCR     C
   FCC4   0D               DCR     C
   FCC5   23               INX     H
   FCC6   EB               XCHG
   FCC7   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FCCA   CD24FE           CALL    LFE24
   FCCD   EB               XCHG
   FCCE   360D             MVI     M,0DH
   FCD0   C9               RET
                   ;
                   ;
                   ;
   FCD1   47       LFCD1:  MOV     B,A
   FCD2   B7               ORA     A
   FCD3   C8               RZ
   FCD4   FA1AFD           JM      LFD1A
   FCD7   2A07D0           LHLD    EOFP
   FCDA   CD32FD           CALL    LFD32
   FCDD   1191D1           LXI     D,LD191         ;POINT TO ESET BUFFER LIMIT
   FCE0   CD42FD           CALL    LFD42
   FCE3   DA30FB           JC      LFB30
   FCE6   EB               XCHG
   FCE7   2A9ED1           LHLD    LD19E
   FCEA   2B               DCX     H
   FCEB   3681             MVI     M,81H
   FCED   2A07D0           LHLD    EOFP
   FCF0   7E       LFCF0:  MOV     A,M
   FCF1   FE81             CPI     81H
   FCF3   CAFCFC           JZ      LFCFC
   FCF6   12               STAX    D
   FCF7   2B               DCX     H
   FCF8   1B               DCX     D
   FCF9   C3F0FC           JMP     LFCF0
                   ;
                   ;
                   ;
   FCFC   360D     LFCFC:  MVI     M,0DH
   FCFE   2A07D0   LFCFE:  LHLD    EOFP
   FD01   78               MOV     A,B
   FD02   CD32FD           CALL    LFD32
   FD05   2207D0           SHLD    EOFP
   FD08   2A9CD1           LHLD    LD19C
   FD0B   119ED1           LXI     D,LD19E
   FD0E   CD42FD           CALL    LFD42
   FD11   C8               RZ
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 91
      


   FD12   78               MOV     A,B
   FD13   CD32FD           CALL    LFD32
   FD16   229CD1           SHLD    LD19C
   FD19   C9               RET
                   ;
                   ;
                   ;
   FD1A   2F       LFD1A:  CMA
   FD1B   3C               INR     A
   FD1C   2A9ED1           LHLD    LD19E
   FD1F   CD32FD           CALL    LFD32
   FD22   EB               XCHG
   FD23   2A9ED1           LHLD    LD19E
   FD26   1A       LFD26:  LDAX    D
   FD27   77               MOV     M,A
   FD28   FE01             CPI     01H
   FD2A   CAFEFC           JZ      LFCFE
   FD2D   23               INX     H
   FD2E   13               INX     D
   FD2F   C326FD           JMP     LFD26
                   ;
                   ;
                   ;
   FD32   B7       LFD32:  ORA     A
   FD33   FA3BFD           JM      LFD3B
   FD36   85               ADD     L
   FD37   6F               MOV     L,A
   FD38   D0               RNC
   FD39   24               INR     H
   FD3A   C9               RET
                   ;
                   ;
                   ;
   FD3B   85       LFD3B:  ADD     L
   FD3C   6F               MOV     L,A
   FD3D   3EFF             MVI     A,0FFH
   FD3F   8C               ADC     H
   FD40   67               MOV     H,A
   FD41   C9               RET
                   ;
                   ;
                   ;
   FD42   1A       LFD42:  LDAX    D
   FD43   95               SUB     L
   FD44   13               INX     D
   FD45   1A               LDAX    D
   FD46   9C               SBB     H
   FD47   1B               DCX     D
   FD48   D8               RC
   FD49   C0               RNZ
   FD4A   1A               LDAX    D
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 92
      


   FD4B   95               SUB     L
   FD4C   B7               ORA     A
   FD4D   C9               RET
                   ;
                   ;ROUTINE TO CLEAR ALL OR PART OF VDM-1 DISPLAY SCREEN
                   ;
   FD4E   2100CC   LFD4E:  LXI     H,VDM1          ;ENTER HERE TO CLR WHOLE SCREEN
   FD51   3620     LFD51:  MVI     M,' '           ;FILL WITH SPACES
   FD53   23               INX     H               ;POINT TO NEXT CHAR POSITION
   FD54   7C               MOV     A,H             ;GET HIGH ORDER BYTE
   FD55   FED0             CPI     0D0H            ;PAST END OF SCREEN ?
   FD57   DA51FD           JC      LFD51           ;CONTINUE IF NOT
   FD5A   AF               XRA     A               ;ELSE GET A ZERO TO CLEAR:
   FD5B   3294D1           STA     BOSL            ;BEGINNING OF SCREEN LINE (0-F)
   FD5E   3293D1           STA     BOTL            ;BEGINNING OF TEXT LINE (0-F)
   FD61   3296D1           STA     NCHAR           ;CURRENT COLUMN POSITION
   FD64   3E0F             MVI     A,0FH           ;THEN GET A 15
   FD66   3295D1           STA     SLINE           ;TO PUT US ON THE BOTTOM LINE
                   ;
                   ;THIS ROUTINE OUTPUTS A PROPER COMMAND BYTE TO THE VDM-1/SOL-20
                   ;VIDEO DISPLAY GENERATOR BASED ON SCREEN PARAMTETERS
                   ;
   FD69   3A94D1   LFD69:  LDA     BOSL            ;BEGINNING OF SCREEN LINE (0-F)
   FD6C   07               RLC                     ;SHIFT LEFT TO HIGH NIBBLE
   FD6D   07               RLC                     ;
   FD6E   07               RLC                     ;
   FD6F   07               RLC                     ;
   FD70   2193D1           LXI     H,BOTL          ;BEGINNING OF TEXT LINE (0-F)
   FD73   B6               ORA     M               ;A NOW HAS VDM CONTROL BYTE
   FD74   D3C8             OUT     0C8H            ;FOR VDM-1
   FD76   D3FE             OUT     0FEH            ;FOR SOL'S
   FD78   C9               RET                     ;DONE
                   ;
                   ;
                   ;
   FD79   2C       LFD79:  INR     L
   FD7A   7D               MOV     A,L
   FD7B   E63F             ANI     3FH
   FD7D   C0               RNZ
   FD7E   7D               MOV     A,L
   FD7F   C6C0             ADI     0C0H
   FD81   6F               MOV     L,A
   FD82   C9               RET
                   ;
                   ;THIS ROUTINE IS PART OF THE VDM-1 DRIVER USED TO DISPLAY
                   ;NORMAL CHARS AFTER CHECKING FOR SPEED CNTL HAS BEEN DONE
                   ;
   FD83   E67F     LFD83:  ANI     7FH             ;CLEAR PARITY BIT
   FD85   4F               MOV     C,A             ;SAVE IN C
   FD86   2196D1           LXI     H,NCHAR         ;CURRENT COLUMN
   FD89   46               MOV     B,M             ;COL IN B
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 93
      


   FD8A   FE0D             CPI     0DH             ;IS CHAR A C/R ?
   FD8C   CAB1FD           JZ      LFDB1           ;PROCESS IT SEPERATELY
   FD8F   FE5F             CPI     5FH             ;BACKSPACE ?
   FD91   CAEDFE           JZ      LFEED           ;IT GET'S SPECIAL TREATMENT TOO
   FD94   FE01             CPI     'A'-40H         ;CURSOR ON-OFF TOGGLE ?
   FD96   CA06FF           JZ      LFF06           ;ANOTHER SPECIAL
   FD99   FE1A             CPI     'Z'-40H         ;CLEAR SCREEN ?
   FD9B   CA4EFD           JZ      LFD4E           ;LAST SPECIAL CHAR
   FD9E   FE20             CPI     20H             ;TESTING FOR CONTROL CHAR
   FDA0   D8               RC                      ;SKIP THEM IF FOUND
   FDA1   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FDA4   CDF4FD           CALL    VDAD            ;AND CALCULATE CHAR ADDRESS
   FDA7   71               MOV     M,C             ;PUT CHAR ON SCREEN
   FDA8   3A96D1           LDA     NCHAR           ;NOW GET COLUMN
   FDAB   3C               INR     A               ;AND INCREMENT IT
   FDAC   FE40             CPI     64              ;GONE OFF END OF LINE ?
   FDAE   C2BDFD           JNZ     LFDBD           ;NO - OK THEN
                   ;
                   ;COME HERE TO PROCESS CARRIAGE RETURN
                   ;
   FDB1   3A95D1   LFDB1:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FDB4   CD46FE           CALL    LFE46           ;TURN CURSOR OFF
   FDB7   3E01             MVI     A,1
   FDB9   CDCDFD           CALL    LFDCD           ;CLEAR TO END OF LINE & SCROLL
   FDBC   97               SUB     A               ;GET A ZERO
   FDBD   3296D1   LFDBD:  STA     NCHAR           ;PUT UPDATED COL. POSITION BACK
   FDC0   47               MOV     B,A             ;AND MOVE IT TO B
   FDC1   3A97D1           LDA     LD197           ;GET CURSOR ON-OFF FLAG
   FDC4   FE00             CPI     0               ;SET FLAGS
   FDC6   C8               RZ                      ;DONE IF CURSOR OFF
   FDC7   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FDCA   C31AFF           JMP     LFF1A           ;TURN CURSOR ON & RETURN
                   ;
                   ;
                   ;
   FDCD   2193D1   LFDCD:  LXI     H,BOTL          ;BEGINNING OF TEXT LINE (0-F)
   FDD0   B7               ORA     A
   FDD1   CAD9FD           JZ      LFDD9
   FDD4   7E               MOV     A,M
   FDD5   34               INR     M
   FDD6   C3DDFD           JMP     LFDDD
   FDD9   35       LFDD9:  DCR     M
   FDDA   7E               MOV     A,M
   FDDB   E60F             ANI     0FH
   FDDD   96       LFDDD:  SUB     M
   FDDE   0E00             MVI     C,0
   FDE0   CD0CFE           CALL    LFE0C
   FDE3   2193D1           LXI     H,BOTL          ;BEGINNING OF TEXT LINE (0-F)
   FDE6   7E               MOV     A,M
   FDE7   E60F             ANI     0FH
   FDE9   77               MOV     M,A
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 94
      


   FDEA   C369FD           JMP     LFD69
                   ;
                   ;
                   ;
   FDED   3A95D1   LFDED:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FDF0   2196D1           LXI     H,NCHAR         ;GET COLUMN POSITION
   FDF3   46               MOV     B,M             ;TO B
                   ;
                   ;FOLLOWING ROUTINE CALCULATES ADDR OF CHAR AT LINE
                   ;IN "A" AND COL "B"
                   ;
   FDF4   6F       VDAD:   MOV     L,A             ;LINE NO. (0-F) TO L
   FDF5   3A93D1           LDA     BOTL            ;BEGINNING OF TEXT LINE (0-F)
   FDF8   85               ADD     L               ;ADD OFFSET TO LINE
   FDF9   0F               RRC                     ;DIVIDE BY TWO
   FDFA   0F               RRC                     ;AGAIN, NOW /4
   FDFB   6F               MOV     L,A             ;SAVE # PAGES (256) OFFSET
   FDFC   E603             ANI     3               ;MAKE IT 0-3 ONLY
   FDFE   C6CC             ADI     (VDM1 SHR 8) AND 0FFH
   FE00   67               MOV     H,A             ;H NOW HI SCREEN ADDR
   FE01   7D               MOV     A,L             ;RESTORE # 256 BYTE PGS. OFFSET
   FE02   E6C0             ANI     0C0H            ;CHG TO # LINES FROM PG BOUNDRY
   FE04   80               ADD     B               ;ADD IN COL ON LINE
   FE05   6F               MOV     L,A             ;H,L NOW COMPLETE ADDR
   FE06   C9               RET                     ;DONE
                   ;
                   ;
                   ;
   FE07   4E       LFE07:  MOV     C,M
   FE08   0D               DCR     C
   FE09   0D               DCR     C
   FE0A   23               INX     H
   FE0B   EB               XCHG
   FE0C   0600     LFE0C:  MVI     B,0
   FE0E   CDF4FD           CALL    VDAD
   FE11   0640             MVI     B,64
   FE13   AF       LFE13:  XRA     A
   FE14   B9               CMP     C
   FE15   3E20             MVI     A,' '
   FE17   CA1DFE           JZ      LFE1D
   FE1A   1A               LDAX    D
   FE1B   13               INX     D
   FE1C   0D               DCR     C
   FE1D   77       LFE1D:  MOV     M,A
   FE1E   2C               INR     L
   FE1F   05               DCR     B
   FE20   C213FE           JNZ     LFE13
   FE23   C9               RET
                   ;
                   ;
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 95
      


   FE24   0600     LFE24:  MVI     B,0
   FE26   CDF4FD           CALL    VDAD
   FE29   0C               INR     C
   FE2A   0D       LFE2A:  DCR     C
   FE2B   C8               RZ
   FE2C   7E               MOV     A,M
   FE2D   12               STAX    D
   FE2E   23               INX     H
   FE2F   13               INX     D
   FE30   C32AFE           JMP     LFE2A
                   ;
                   ;
                   ;
   FE33   063F     LFE33:  MVI     B,3FH
   FE35   CDF4FD           CALL    VDAD
   FE38   0E40             MVI     C,40H
   FE3A   7E       LFE3A:  MOV     A,M
   FE3B   E67F             ANI     7FH
   FE3D   FE20             CPI     20H
   FE3F   C0               RNZ
   FE40   2B               DCX     H
   FE41   0D               DCR     C
   FE42   C23AFE           JNZ     LFE3A
   FE45   C9               RET
                   ;
                   ;ROUTINE TO TURN CURSOR OFF
                   ;
   FE46   CDF4FD   LFE46:  CALL    VDAD            ;CALCULATE SCREEN ADDR
   FE49   7E               MOV     A,M             ;GET CHAR UNDER CURSOR
   FE4A   E67F             ANI     7FH             ;TURN CURSOR BIT OFF
   FE4C   77               MOV     M,A             ;PUT IT BACK
   FE4D   C9               RET                     ;DONE, CURSOR OFF
                   ;
                   ;
                   ;
   FE4E   EB       LFE4E:  XCHG
   FE4F   F5       LFE4F:  PUSH    PSW
   FE50   D5               PUSH    D
   FE51   CDF4FD           CALL    VDAD
   FE54   71       LFE54:  MOV     M,C
   FE55   CD79FD           CALL    LFD79
   FE58   15               DCR     D
   FE59   C254FE           JNZ     LFE54
   FE5C   D1               POP     D
   FE5D   F1               POP     PSW
   FE5E   1D               DCR     E
   FE5F   C8               RZ
   FE60   3C               INR     A
   FE61   C34FFE           JMP     LFE4F
                   ;
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 96
      


                   ;
   FE64   FE1B     LFE64:  CPI     1BH             ;ESCAPE CHAR ?
   FE66   CA60E0           JZ      EORMS           ;BACK TO ALS-8 THEN
   FE69   FE20             CPI     20H             ;SPACE BAR ?
   FE6B   C2C1FE           JNZ     LFEC1           ;NO - CLEAR CHRR AND RETURN
   FE6E   CDA4D0   LFE6E:  CALL    STAT            ;YES - CHAR TYPED ?
   FE71   CA6EFE           JZ      LFE6E           ;NO - WAIT FOREVER IF NECESSARY
   FE74   C3C2FE           JMP     LFEC2           ;THEN SAVE THAT CHAR AS CHRR
                   ;
                   ;VDM-1 DRIVER STARTS HERE
                   ;
   FE77   78       LFE77:  MOV     A,B             ;GET CHAR TO A
   FE78   FE7F             CPI     7FH             ;DELETE CHAR ?
   FE7A   C8               RZ                      ;RETURN IF SO
   FE7B   E5               PUSH    H               ;ELSE SAVE REGISTERS
   FE7C   D5               PUSH    D               ;
   FE7D   C5               PUSH    B               ;
   FE7E   3AA0D1           LDA     SPEED           ;GET SPEED CONTROL BYTE
   FE81   67               MOV     H,A             ;TO H
   FE82   2E80             MVI     L,80H           ;COUNTER NOW SET
   FE84   CD9DFE           CALL    LFE9D           ;SEE IF CHAR WAITING
   FE87   AF               XRA     A               ;MAKE ACC. ZERO
   FE88   2B       LFE88:  DCX     H               ;DCR TIMER COUNTER
   FE89   BC               CMP     H               ;H = 0 YET ?
   FE8A   C288FE           JNZ     LFE88           ;NO - THEN DELAY SOME MORE
   FE8D   C1               POP     B               ;RESTORE CHAR TO B
   FE8E   C5               PUSH    B               ;AND RE-SAVE B,C
   FE8F   78               MOV     A,B             ;GET CHAR AGAIN
   FE90   FE13             CPI     'S'-40H         ;CONTROL-S ?
   FE92   CCC6FE           CZ      LFEC6           ;CALL SPEED SET ROUTINE
   FE95   CD83FD           CALL    LFD83           ;PUT CHAR ON SCREEN
   FE98   C1               POP     B               ;RESTORE REGS
   FE99   D1               POP     D               ;
   FE9A   E1               POP     H               ;
   FE9B   78               MOV     A,B             ;PUT CHAR IN ACC ON EXIT
   FE9C   C9               RET                     ;DONE
                   ;
                   ;ROUTINE TO CHECK FOR KEYBOARD INPUT & SCREEN CONTROL VALUE
                   ;
   FE9D   3A90D1   LFE9D:  LDA     CHRR            ;DEFAULT SPEED
   FEA0   47               MOV     B,A             ;SAVE IT IN B
   FEA1   CDA4D0           CALL    STAT            ;KEYBOARD CHAR WAITING ?
   FEA4   C4CCD0           CNZ     IN8             ;YES - THEN GET IT
   FEA7   78               MOV     A,B             ;DEFAULT SPEED OR CHAR TO A
   FEA8   B7       LFEA8:  ORA     A               ;SET FLAGS
   FEA9   C8               RZ                      ;NO CHG IF CHR/DEFAULT=0
   FEAA   FE3A             CPI     '9'+1           ;NUMERIC ?
   FEAC   D264FE           JNC     LFE64           ;NO, NOT NUMERIC
   FEAF   FE31             CPI     '1'             ;NUMERIC ?
   FEB1   DA64FE           JC      LFE64           ;NO, NOT NUMERIC
   FEB4   E60F             ANI     0FH             ;CONVERT TO BINARY
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 97
      


   FEB6   4F               MOV     C,A             ;SAVE IN C
   FEB7   AF               XRA     A               ;CLEAR ACC & FLAGS
   FEB8   37               STC                     ;SET CARRY
   FEB9   32A0D1   LFEB9:  STA     SPEED           ;SPEED CONTROL BYTE
   FEBC   17               RAL                     ;MOVE ACCUM/CARRY 1 BIT LEFT
   FEBD   0D               DCR     C               ;DCR SPEED COUNT
   FEBE   C2B9FE           JNZ     LFEB9           ;IF SPEED COUNT <> 0, CONTINUE
   FEC1   AF       LFEC1:  XRA     A               ;GET A ZERO
   FEC2   3290D1   LFEC2:  STA     CHRR            ;MAKE IT ZERO FOR NEXT TIME
   FEC5   C9               RET                     ;DONE
                   ;
                   ;ROUTINE TO SET SPEED
                   ;
   FEC6   0600     LFEC6:  MVI     B,0             ;COLUMN = 0
   FEC8   CDB1FD           CALL    LFDB1           ;CLEAR LINE
   FECB   21E6FE           LXI     H,LFEE6         ;POINT TO "SPEED ?" MESSAGE
   FECE   7E       LFECE:  MOV     A,M             ;GET CHAR FROM MSG
   FECF   E5               PUSH    H               ;SAVE H,L
   FED0   CD83FD           CALL    LFD83           ;PRINT MESSAGE
   FED3   E1               POP     H               ;RESTORE H,L
   FED4   23               INX     H               ;POINT TO NEXT CHAR
   FED5   7E               MOV     A,M             ;GET IT
   FED6   B7               ORA     A               ;SET FLAGS
   FED7   C2CEFE           JNZ     LFECE           ;PRINT IT IF NOT ZERO
   FEDA   CDCCD0           CALL    IN8             ;GET CHAR
   FEDD   CDA8FE           CALL    LFEA8           ;TEST NUMERIC & SET SPEED
   FEE0   CD16E2           CALL    CRLF            ;DO CR/LF
   FEE3   C3D1E0           JMP     EORNS           ;THEN BACK TO ALS-8
                   ;
   FEE6   53504545 LFEE6:  DB      'SPEED?'
   FEEA   443F    
   FEEC   00               DB      0
                   ;
                   ;
                   ;ROUTINE TO PROCESS BACKSPACE (5FH)
                   ;
   FEED   3A96D1   LFEED:  LDA     NCHAR           ;GET COLUMN
   FEF0   47               MOV     B,A             ;TO B
   FEF1   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FEF4   CD46FE           CALL    LFE46           ;TURN CURSOR OFF
   FEF7   2B               DCX     H               ;POINT TO PREV CHAR
   FEF8   3620             MVI     M,' '           ;REPLACE IT WITH SPACE
   FEFA   78               MOV     A,B             ;OLD COLUMN ADDR TO A
   FEFB   B7               ORA     A               ;SET FLAGS
   FEFC   CA00FF           JZ      LFF00           ;DON'T BACK INTO PREV LINE
   FEFF   05               DCR     B               ;DECREMENT COLUMN
   FF00   3A95D1   LFF00:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FF03   C31AFF           JMP     LFF1A           ;UPDATE ROW, COL, CUR ON & RET
                   ;
                   ;CURSOR ON-OFF TOGGLE ROUTINES
                   ;
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 98
      


   FF06   3A97D1   LFF06:  LDA     LD197           ;GET CURSOR ON-OFF FLAG
   FF09   EE01             XRI     01H             ;TOGGLE LOW ORDER BIT
   FF0B   3297D1           STA     LD197           ;PUT IT BACK
   FF0E   E601             ANI     01H             ;MASK LOW ORDER BIT
   FF10   C22AFF           JNZ     LFF2A           ;JUMP IF CURSOR OFF
   FF13   3A96D1   LFF13:  LDA     NCHAR           ;GET COLUMN
   FF16   47       LFF16:  MOV     B,A             ;TO A
   FF17   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FF1A   E60F     LFF1A:  ANI     0FH             ;KEEP IT TO 0-15
   FF1C   3295D1           STA     SLINE           ;UPDATE IT
   FF1F   CDF4FD           CALL    VDAD            ;CALCULATE CURSOR ADDRESS
   FF22   78               MOV     A,B             ;COLUMN TO A
   FF23   3296D1           STA     NCHAR           ;UPDATE IT
   FF26   7E               MOV     A,M             ;GET CHAR TO A
   FF27   C34DFC           JMP     LFC4D           ;TURN ON CURSOR & RETURN
   FF2A   3297D1   LFF2A:  STA     LD197           ;UPDATE CURSOR FLAG
   FF2D   2196D1   LFF2D:  LXI     H,NCHAR         ;POINT TO COLUMN
   FF30   46               MOV     B,M             ;GET IT TO B
   FF31   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
   FF34   CD46FE           CALL    LFE46           ;TURN CURSOR OFF
   FF37   2196D1           LXI     H,NCHAR         ;FOR PROPER EXIT
   FF3A   C9               RET                     ;DONE, CURSOR OFF
                   ;
                   ;THIS IS THE ALS-8 (NOT TXT-2) FIND COMMAND
                   ;
   FF3B   CD16E2   FIND2:  CALL    CRLF            ;DO CR/LF
   FF3E   CD80FF           CALL    LFF80           ;GET SEARCH STRING
   FF41   2A05D0           LHLD    BOFP            ;LOAD SEARCH STARTING POINT
   FF44   CDC2FF   LFF44:  CALL    LFFC2           ;SEARCH FOR STRING
   FF47   FE01             CPI     1               ;EOF FOUND ?
   FF49   C8               RZ                      ;DONE IF YES
   FF4A   2AD2D0           LHLD    INSP            ;ELSE POINT TO LINE W/STRING
   FF4D   23               INX     H               ;POINT PAST LENGTH BYTE
   FF4E   CD80E3           CALL    SCRN            ;PRINT LINE
   FF51   CD16E2           CALL    CRLF            ;CAR. RET AT END OF LINE
   FF54   23               INX     H               ;INR TO NEXT LINE
   FF55   C344FF           JMP     LFF44           ;AND CONTINUE SEARCH
                   ;
                   ;EDITOR STRING SEARCH
                   ;
   FF58   CD4EFD   LFF58:  CALL    LFD4E           ;CLEAR SCREEN
   FF5B   CD80FF           CALL    LFF80           ;GET SEARCH STRING
   FF5E   2A05D0           LHLD    BOFP            ;POINT TO BEGINNING OF FILE
   FF61   229CD1           SHLD    LD19C           ;SAVE AS SEARCH STARTING POINT
                   ;
                   ;CONTINUE SEARCH
                   ;
   FF64   312FD1   LFF64:  LXI     SP,SMODE        ;RESET STACK POINTER
   FF67   2A9CD1           LHLD    LD19C           ;GET SEARCH STARTING PT.
   FF6A   CDC2FF           CALL    LFFC2           ;SEARCH FROM H,L FOR STRING
   FF6D   FE01             CPI     1               ;END OF FILE FOUND ?
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 99
      


   FF6F   CA0BFA           JZ      TXT2            ;RESTART EDITOR THEN
   FF72   CD4EFD           CALL    LFD4E           ;
   FF75   AF               XRA     A               ;GET A ZERO
   FF76   47               MOV     B,A             ;MAKE IT THE ROW
   FF77   CD1AFF           CALL    LFF1A           ;TURN CURSOR ON
   FF7A   2AD2D0           LHLD    INSP            ;GET POINTER TO LINE W/STRING
   FF7D   C327FA           JMP     LFA27           ;PUT TEXT ON SCRN & RET
                   ;
                   ;ROUTINE TO FIND STRING
                   ;
   FF80   063A     LFF80:  MVI     B,':'           ;GET PROMPT
   FF82   CDCFD0           CALL    OUT8            ;PRINT IT
   FF85   1E00             MVI     E,0             ;INITIALIZE STRING LENGTH
   FF87   2135D2           LXI     H,IBUF+81       ;POINT TO STRING LOCATION
   FF8A   CDCCD0   LFF8A:  CALL    IN8             ;GET STRING CHAR
   FF8D   FE7F             CPI     7FH             ;DELETE ?
   FF8F   C2A1FF           JNZ     LFFA1           ;NO - MUST BE CHAR
   FF92   7B               MOV     A,E             ;ELSE MOVE LENGTH TO A
   FF93   B7               ORA     A               ;ZERO ?
   FF94   CA8AFF           JZ      LFF8A           ;NO ACTION IF ZERO
   FF97   1D               DCR     E               ;ELSE DCR STRING LENGTH
   FF98   2B               DCX     H               ;AND STRING POINTER
   FF99   065F             MVI     B,5FH           ;GET A BACKSPACE CHAR
   FF9B   CDCFD0   LFF9B:  CALL    OUT8            ;AND PRINT IT
   FF9E   C38AFF           JMP     LFF8A           ;THEN GET THE NEXT CHAR
   FFA1   FE0D     LFFA1:  CPI     0DH             ;CARRIAGE RETURN ?
   FFA3   C2B6FF           JNZ     LFFB6           ;NO - MUST BE CHAR
   FFA6   7B               MOV     A,E             ;ELSE GET LENGTH TO A
   FFA7   B7               ORA     A               ;SET FLAGS
   FFA8   C2B1FF           JNZ     LFFB1           ;IF NOT ZERO, DONE
   FFAB   CD16E2           CALL    CRLF            ;ELSE PRINT CRLF
   FFAE   C380FF           JMP     LFF80           ;AND GET STRING (AGAIN)
   FFB1   70       LFFB1:  MOV     M,B             ;MOVE C/R TO STRING BUFFER
   FFB2   CD16E2           CALL    CRLF            ;PRINT CR/LF
   FFB5   C9               RET                     ;AND RETURN W/STRING IN BUFFER
   FFB6   FE20     LFFB6:  CPI     20H             ;IS CHAR A CNTL CHAR ?
   FFB8   DA8AFF           JC      LFF8A           ;IGNORE IT THEN
   FFBB   1C               INR     E               ;ELSE INR LENGTH
   FFBC   70               MOV     M,B             ;PUT CHAR IN STRING
   FFBD   23               INX     H               ;INR POINTER
   FFBE   C39BFF           JMP     LFF9B           ;AND DO NEXT CHAR
                   ;
                   ;ROUTINE TO SEARCH FOR STRING
                   ;
   FFC1   23       LFFC1:  INX     H               ;POINT PAST LENGTH BYTE
   FFC2   22D2D0   LFFC2:  SHLD    INSP            ;AND SAVE AS POINTER
   FFC5   0E00             MVI     C,0             ;INITIALIZE COUNTER
   FFC7   1135D2   LFFC7:  LXI     D,IBUF+81       ;GET STRING LENGTH
   FFCA   7E               MOV     A,M             ;GET CHAR FROM LINE
   FFCB   FE01             CPI     1               ;END OF FILE ?
   FFCD   C8               RZ                      ;IF SO, RETURN
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 100
      


   FFCE   23       LFFCE:  INX     H               ;ELSE INCR LINE POINTER
   FFCF   0C               INR     C               ;AND COUNT OF CHARS TESTED
   FFD0   1A               LDAX    D               ;GET CHAR FROM STRING
   FFD1   BE               CMP     M               ;STRING & LINE AGREE ?
   FFD2   13               INX     D               ;INR STRING POINTER
   FFD3   CAE7FF           JZ      LFFE7           ;AND KEEP TESTING
   FFD6   FE0D             CPI     0DH             ;WAS NON-MATCH DUE TO C/R ?
   FFD8   C8               RZ                      ;YES - STRING MATCHED THEN
   FFD9   7E               MOV     A,M             ;ELSE MOVE LINE CHAR TO A
   FFDA   FE0D             CPI     0DH             ;AND SEE IF END OF LINE
   FFDC   CAC1FF           JZ      LFFC1           ;IT WAS - GO TO NEXT LINE
   FFDF   0D       LFFDF:  DCR     C               ;ELSE DCR MATCH COUNT
   FFE0   CAC7FF           JZ      LFFC7           ;BACK TO WHERE WE STARTED ?
   FFE3   2B               DCX     H               ;NO - DCR LINE POINTER
   FFE4   C3DFFF           JMP     LFFDF           ;AND TEST AGAIN
   FFE7   FE0D     LFFE7:  CPI     0DH             ;MATCH - END OF STRING TOO ?
   FFE9   C8               RZ                      ;THAT'S STILL A MATCH
   FFEA   7E               MOV     A,M             ;ELSE GET LINE CHAR
   FFEB   FE0D             CPI     0DH             ;AND SEE IF END OF LINE
   FFED   CAC1FF           JZ      LFFC1           ;IF SO TEST NEXT LINE
   FFF0   C3CEFF           JMP     LFFCE           ;ELSE GO ON WITH TEST
                   ;
                   ;ESET COMMAND TO SET UPPER LIMIT ON EDITOR TEXT BUFFER
                   ;
   FFF3   2AEFD0   LFFF3:  LHLD    BBUF            ;GET VALUE OF UPPER LIMIT
   FFF6   2291D1           SHLD    LD191           ;SAVE IT
   FFF9   C360E0           JMP     EORMS           ;AND GO BACK TO ALS-8
                   ;
                   ; **** END OF ALS8TXT MODULE
                   ;
                   ;
   D000                    ORG     DATA            ;START OF SYSTEM GLOBAL
                   ;
                   ;SYSTEM GLOBAL AREA
                   ;
   0001            UDATA   EQU     1               ;DATA PORT NUMBER
                   ;DAV    EQU     40H             ;DATA AVAILABLE AT BIT 6
   0001            DAV     EQU     01H             ;*UM*
   0080            TBE     EQU     80H             ;TRANS. BUFFER EMPTY AT BIT 7
   0000            USTA    EQU     0               ;UART STATUS PORT
   0001            UDAI    EQU     1               ;UART DATA
   0001            UDAO    EQU     1               ;UART DATA
   00FF            SWCH    EQU     0FFH            ;SENSE SWITCH
                   ;
                   ;FILE AREA PARAMETERS
                   ;
   0006            MAXFIL  EQU     6               ;MAX # OF FILES
   0005            NMLEN   EQU     5               ;NAME LENGTH
   000D            FELEN   EQU     NMLEN+8         ;DIRECTORY ENTRY LENGTH
                   ;
                   ;FILE TABLE
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 101
      


                   ;
                   ;FILE 0 IS THE "CURRENT FILE" ALL OTHER FILES
                   ;ARE STORED IN THE FILE TABLE IN THIS FORMAT
                   ;
   D000            FILE0:  DS      NMLEN           ;CURRENT FILE LOCATION
   D005            BOFP:   DS      2               ;BEGINNING OF FILE POINTER
   D007            EOFP:   DS      2               ;END OF FILE POINTER
   D009            MAXL:   DS      4               ;MAXIMUM LINE NUMBER IN FILE
                   ;
   D00D            FILTB:  DS      (MAXFIL-1)*FELEN;REST OF FILE TABLE
                   ;
                   ;I/O DRIVER TABLES
                   ;
   D04E            IOFLE:  DS      (MAXFIL-1)*FELEN
   D08F            SYSIO:  DS      NMLEN
   D094            SYSIN:  DS      2
   D096            SYSOT:  DS      2               ;OUTPUT DRIVER ADDRESS
                   ;
                   ;THE INPUT DRIVER
                   ;
   D098            INDR:   DS      OUTP8-INP8
                   ;
                   ;THE OUTPUT DRIVER
                   ;
   D0A9            OUTDR:  DS      CRLF-OUTP8      ;OUTPUT DRIVER
   D0CC            IN8:    DS      3               ;DRIVER JUMP POINTS
   D0CF            OUT8:   DS      3
   D0A4            STAT    EQU     INDR+12
   D0B8            NOCHR   EQU     OUTDR+0FH
                   ;
                   ;SYSTEM PARAMETERS
                   ;
   D0D2            INSP:   DS      2               ;INSERT LINE POSITION
   D0D2            DELP    EQU     INSP            ;DELETE LINE POSITION
   000D            ASCR    EQU     13
   001B            ESC     EQU     1BH
   002A            COMCHR  EQU     '*'             ;ASSEMBLER COMMENT CHARACTER
   D0D4            HCON:   DS      3               ;CONVERSION AREA
   D0D4            ADDS    EQU     HCON            ;FIND ADDRESS
   D0D7            FBUF:   DS      NMLEN           ;FILE NAME BUFFER
   D0DC            FREAD:  DS      2               ;FREE ADDRESS IN DIRECTORY
   D0DE            FEF:    DS      1               ;FREE ENTRY FOUND FLAG
   D0DE            FOCNT   EQU     FEF             ;OUTPUT COUNTER
   D0DF            ABUF:   DS      16              ;ASCII BUFFER AREA
   D0EF            BBUF:   DS      4               ;BINARY BUFFER
   D0F3            SCNT:   DS      1               ;SYMBOL COUNT
   D0F4            DCNT:   DS      1               ;DUMP ROUTINE COUNTER
   D0F5            TABA:   DS      2               ;SYMBOL TABLE END ADDRESS
   D0F7            ASPC:   DS      2               ;ASSEMBLER PROGRAM COUNTER
   D0F9            PASI:   DS      1               ;PASS INDICATOR
   D0FA            LFMT:   DS      1               ;FORMAT CONTROL
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 102
      


   D0FB            NOLIN:  DS      1
   D0FC            IOSWC:  DS      1               ;I/O SWITCH INDICATOR
   D0FD            SWCH1:  DS      1
   D0FE            SWCH2:  DS      1
   D0FF            XOUT:   DS      1               ;SCRN PARAMETER
   D100            ASMTY:  DS      1               ;ASSEMBLY TYPE FLAG
   D101            PNTR:   DS      2               ;LINE POINTER STORAGE
   D103            NOLA:   DS      1               ;NUMBER OF LABELS
   D104            SIGN:   DS      1               ;SIGN STORAGE FOR SCAN
   D105            OPRD:   DS      2
   D107            OPRI:   DS      1
   D108            GTLT:   DS      1
   D109            TEMP:   DS      1
   D0D2            APNT    EQU     INSP
   D0F4            AERR    EQU     DCNT
   D10A            ALST:   DS      1
   D10B            OIND:   DS      2
   0005            LLAB    EQU     5
   D10D                    DS      16
   D11D            AREA:   DS      14
   D12B            LD12B:  DS      4
   D12F            SMODE:  DS      1
   D130            SYMSV:  DS      2
   D0F3            CCNT    EQU     SCNT
   D0F4            SYMX    EQU     AERR
   D132            SYMADD: DS      2
   D134            LD134:  DS      1               ;SIM. BREAKPOINT FLAG
   D135            LD135:  DS      1               ;SIM. REAL-TIME RUN FLAG
   D136            LD136:  DS      1               ;SIM. INPUT PORT ASSIG. FLAG
   D137            LD137:  DS      1               ;SIM. OUTPUT PORT ASSIG. FLAG
   D138            LD138:  DS      2               ;SIM. BREAKPOINT ADDR.
   D13A            LD13A:  DS      2               ;SIM. REAL TIME RUN ADDR
   D13C            LD13C:  DS      2               ;SIM. PROGRAM COUNTER
   D13E            LD13E:  DS      2               ;ADDR FOR NEXT INST TO EXECUTE
   D140            LD140:  DS      2               ;SIM. STACK POINTER
   D142            LD142:  DS      2               ;SIM. FLAG REGISTER & ACCUM.
   D144            LD144:  DS      1               ;SIM. "L" REGISTER
   D145            LD145:  DS      1               ;SIM. "H" REGISTER
   D146            LD146:  DS      1               ;SIM. "E" REGISTER
   D147            LD147:  DS      1               ;SIM. "D" REGISTER
   D148            LD148:  DS      1               ;SIM. "C" REGISTER
   D149            LD149:  DS      1               ;SIM. "B" REGISTER
   D14A            LD14A:  DS      1               ;SIM. ACCUM (2ND COPY)
   D14B            LD14B:  DS      1               ;SIM. MODE
   D14C            LD14C:  DS      3               ;STORAGE FOR INST TO BE SIM.
   D14F            LD14F:  DS      3               ;STORAGE FOR JMP RETN TO SIM.
   D152            LD152:  DS      16              ;SIMULATOR'S INPUT TABLE
   D162            LD162:  DS      16              ;SIMULATOR'S OUTPUT TABLE
   D18F                    ORG     DATA+18FH
   D18F            TERMW:  DS      1
   D190            CHRR:   DS      1
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 103
      


   D191            LD191:  DS      2               ;ESET UPPER TEXT BUFFER LIMIT
   D193            BOTL:   DS      1               ;BEGINNING OF TEXT LINE (0-F)
   D194            BOSL:   DS      1               ;BEGINNING OF SCREEN LINE (0-F)
   D195            SLINE:  DS      1               ;CURRENT LINE (0-F)
   D196            NCHAR:  DS      1               ;CURRENT COLUMN POSITION (0-63)
   D197            LD197:  DS      1               ;CURSOR ON-OFF FLAG
   D198            LD198:  DS      1               ;INSERT MODE FLAG
   D199            LD199:  DS      1
   D19A            LD19A:  DS      2
   D19C            LD19C:  DS      2
   D19E            LD19E:  DS      2
   D1A0            SPEED:  DS      1               ;DISPLAY DRIVER SPEED BYTE
   D1A1            LD1A1:  DS      2               ;UNDEFINED COMMAND ADDRESS
   D1A3            USARE:  DS      38              ;USER AREA
   D1C9            OBUF:   DS      22
   D1DF                    DS      5
   D1E4            IBUF:   DS      120             ;INPUT BUFFER
   FA0E            EDIT    EQU     0FA0EH
   D1C9            SAVL    EQU     OBUF
   D25C            CUCOM:  DS      70              ;CUSTOM COMMAND TABLE
   D300                    ORG     DATA+300H
   D300            SYSYM:  DS      2               ;START OF SYSTEM SYMBOL TABLE
   E000            SYMT    EQU     CODE
                   ;
                           END
 NO PROGRAM ERRORS
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 104
      


                        SYMBOL TABLE

  * 01

  A      0007      ABUF   D0DF      ACH1   E37B      ACHK   E369      
  ACO1   EBE0      ACO2   EC8F *    ADDS   D0D4      ADE1   E00D      
  ADEC   E00A      ADOUT  E55C      ADR    E96B      AERR   D0F4      
  AHE1   E2FD      AHEX   E2FA      AHS1   E311      ALAB   F274      
  ALP1   F140      ALPS   F13E      ALS8   E000      ALST   D10A      
  AOCT   E333      AOUT   EB2E      APNT   D0D2      AREA   D11D *    
  ASBL   F15D      ASC1   F1AA *    ASC2   F1BA      ASC3   F1C8 *    
  ASC4   F1D2      ASC5   F1F4      ASC7   F218      ASCN   F160      
  ASCR   000D *    ASM2   EB22      ASM4   EABF      ASMTY  D100      
  ASPC   D0F7      ASSM   EAAF      ASTO   EE1D      ASUB   F21E      
  AUTO   F96A      AVAL   F204      B      0000      BBUF   D0EF      
  BID1   E3BE      BIN1   E3A3      BIND   E3AD      BINH   E390      
  BINO   E3C8      BITBK  E12C      BLKO   E361      BOFP   D005      
  BOSL   D194      BOTL   D193      BSPA   E1B4      C      0001      
  C01    E997      C02    E99D      CCNT   D0F3      CHAR   E1BC      
  CHRR   D190      CLER   E1D1      CODE   E000      COM0   E992      
  COM1   E994      COMCH  002A      COMS   E228      COND   EEDA      
  COP1   F034      COPC   F022      CR     E188      CRLF   E216      
  CTAB   E3E6      CUCOM  D25C      CUST   E4F5      D      0002      
  DAT2   ECA5      DAT2A  ECA8      DATA   D000      DAV    0001      
  DCNT   D0F4      DEL    E1A7      DEL2   EA5C      DEL3   EA7B      
  DEL4   EA85      DELP   D0D2      DELT   EA2C      DONE   E2C6      
  DOUT   E348      DUMO   E56F      DUMP   E524      E      0003      
  E01    E964      EDIT   FA0E *    EMES   E7F1      EMES1  E7F7      
  EMES2  E7FC      EMODE  E2F3      ENT1   E817      ENTR   E20D      
  ENTS   E80B      EOF    E963 *    EOFP   D007      EOR    E0B7      
  EORMS  E060      EORNS  E0D1      EQU1   EBFB      EQUL   E8E1      
  EQUS   EC06      ERO1   F348      ERRA   F337      ERRD   F356      
  ERRL   F351      ERRM   F32F      ERRO   F33C      ERRR   F311      
  ERRS   F31A      ERRU   F325      ERRV   F32A      ESC    001B      
  ETRA   E281      EXEC   E277      FAST   E64B      FBUF   D0D7      
  FCHK   E6D3      FEET   E65A      FEF    D0DE      FELEN  000D      
  FERR   E801      FI1    E94A      FI2    E95C      FIL35  E611      
  FILE   E5B0      FILE0  D000      FILTB  D00D *    FIND   E941      
  FIND1  E944 *    FIND2  FF3B      FINE   E62B      FMOV   E731      
  FOCNT  D0DE      FOOD   E645      FOOT   E625      FORM   E6CC      
  FOUL   E627      FOUT   E618      FREAD  D0DC      FSE10  E693      
  FSE15  E6B6      FSE20  E6C0      FSEA   E68A      GT     E909      
  GTLT   D108      H      0004      HCON   D0D4      HOTB   E586 *    
  HOUT   E577      IBUF   D1E4      IN8    D0CC      INCA   E263      
  INDR   D098      INIT2  E029      INITA  E024 *    INP8   E1E2      
  INSP   D0D2      INSRT  E8D8      IODR   E0DE      IOFLE  D04E      
  IONME  E1D9      IOSWC  D0FC      L      0005      LCHK   EBB3      
  LD12B  D12B      LD134  D134      LD135  D135      LD136  D136      
  LD137  D137      LD138  D138      LD13A  D13A      LD13C  D13C      
  LD13E  D13E      LD140  D140      LD142  D142      LD144  D144      
  LD145  D145 *    LD146  D146 *    LD147  D147 *    LD148  D148 *    
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 105
                              SYMBOL TABLE


  LD149  D149 *    LD14A  D14A      LD14B  D14B      LD14C  D14C      
  LD14F  D14F      LD152  D152      LD162  D162      LD191  D191      
  LD197  D197      LD198  D198      LD199  D199      LD19A  D19A      
  LD19C  D19C      LD19E  D19E      LD1A1  D1A1      LE004  E004      
  LE03B  E03B      LE046  E046      LE072  E072      LE078  E078      
  LE0A5  E0A5      LE0AC  E0AC      LE0CB  E0CB      LE0DD  E0DD      
  LE0FE  E0FE      LE119  E119      LE12D  E12D      LE130  E130      
  LE148  E148      LE14C  E14C      LE151  E151      LE157  E157      
  LE15A  E15A      LE23E  E23E      LE240  E240      LE2D7  E2D7      
  LE31E  E31E      LE336  E336      LE34B  E34B      LE35C  E35C      
  LE48F  E48F      LE497  E497      LE4AB  E4AB      LE4AE  E4AE      
  LE4B4  E4B4      LE4B7  E4B7      LE4BF  E4BF      LE4C2  E4C2      
  LE4CE  E4CE      LE4EE  E4EE      LE509  E509      LE50C  E50C      
  LE52C  E52C      LE541  E541      LE565  E565      LE57A  E57A      
  LE5AB  E5AB      LE5CC  E5CC      LE5E1  E5E1      LE62A  E62A      
  LE666  E666      LE68D  E68D      LE6E0  E6E0      LE6F3  E6F3      
  LE704  E704      LE712  E712      LE718  E718      LE725  E725      
  LE72B  E72B      LE760  E760      LE765  E765      LE785  E785      
  LE78B  E78B      LE797  E797      LE7B5  E7B5      LE7C9  E7C9      
  LE7CC  E7CC      LE7CE  E7CE      LE837  E837      LE83A  E83A      
  LE84C  E84C      LE86A  E86A      LE87C  E87C      LE889  E889      
  LE893  E893      LE896  E896      LE92B  E92B      LE947  E947      
  LE9EF  E9EF      LE9F9  E9F9      LE9FF  E9FF      LEA23  EA23      
  LEA2F  EA2F      LEA40  EA40      LEA50  EA50      LEA7A  EA7A      
  LEAD6  EAD6      LEAEA  EAEA      LEAF6  EAF6      LEB12  EB12      
  LEB15  EB15      LEB41  EB41      LEBA5  EBA5      LEC26  EC26      
  LEC2E  EC2E      LECC3  ECC3      LECCD  ECCD      LECD3  ECD3      
  LECE2  ECE2      LECE5  ECE5      LECF9  ECF9      LED01  ED01      
  LED15  ED15      LED4F  ED4F      LED57  ED57      LEE39  EE39      
  LEE4C  EE4C      LEE58  EE58      LEE5C  EE5C      LEE64  EE64      
  LEE7E  EE7E      LEE82  EE82      LEE9D  EE9D      LEEA8  EEA8      
  LEEAA  EEAA      LEEB1  EEB1      LF     E21B *    LF0DB  F0DB      
  LF0E0  F0E0      LF154  F154      LF1A6  F1A6      LF227  F227      
  LF238  F238      LF23A  F23A      LF242  F242      LF247  F247      
  LF253  F253      LF255  F255      LF260  F260      LF26C  F26C      
  LF291  F291      LF2B1  F2B1      LF2B6  F2B6      LF2C2  F2C2      
  LF2DE  F2DE      LF2E3  F2E3      LF361  F361      LF37A  F37A      
  LF37C  F37C      LF38E  F38E      LF392  F392      LF396  F396      
  LF397  F397      LF3A4  F3A4      LF3C5  F3C5      LF3D3  F3D3      
  LF3DF  F3DF      LF400  F400      LF41B  F41B      LF422  F422      
  LF431  F431      LF439  F439      LF444  F444      LF451  F451      
  LF459  F459      LF461  F461      LF470  F470      LF475  F475      
  LF49F  F49F      LF4A5  F4A5      LF4B0  F4B0      LF4CA  F4CA      
  LF4CD  F4CD      LF4D9  F4D9      LF4DA  F4DA      LF4DB  F4DB      
  LF4E1  F4E1      LF4EF  F4EF      LF505  F505      LF50B  F50B      
  LF511  F511      LF51A  F51A      LF521  F521      LF527  F527      
  LF542  F542      LF551  F551      LF55A  F55A      LF565  F565      
  LF572  F572      LF577  F577      LF579  F579      LF57F  F57F      
  LF589  F589      LF58F  F58F      LF5AE  F5AE      LF5D2  F5D2      
  LF5D9  F5D9      LF5F2  F5F2      LF604  F604      LF618  F618      
  LF61E  F61E      LF626  F626      LF62C  F62C      LF634  F634      
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 106
                              SYMBOL TABLE


  LF652  F652      LF66A  F66A      LF67F  F67F      LF697  F697      
  LF69D  F69D      LF6AC  F6AC      LF6AF  F6AF      LF6B8  F6B8      
  LF6CA  F6CA      LF6F9  F6F9      LF733  F733      LF73C  F73C      
  LF742  F742      LF747  F747      LF753  F753      LF756  F756      
  LF771  F771      LF774  F774      LF796  F796      LF7A4  F7A4      
  LF7B7  F7B7      LF7D9  F7D9      LF7DE  F7DE      LF7F1  F7F1      
  LF802  F802      LF818  F818      LF81F  F81F      LF854  F854      
  LF863  F863      LF890  F890      LF897  F897      LF8A1  F8A1      
  LF8A8  F8A8      LF8AF  F8AF      LF8B8  F8B8      LF8BC  F8BC      
  LF8C7  F8C7      LF8D6  F8D6      LF8E2  F8E2      LF912  F912      
  LF92C  F92C      LF932  F932      LF949  F949      LF954  F954      
  LF983  F983      LF989  F989      LF99A  F99A      LF9AE  F9AE      
  LF9BB  F9BB      LF9C8  F9C8      LF9D8  F9D8      LFA00  FA00      
  LFA27  FA27      LFA2D  FA2D      LFA33  FA33      LFA39  FA39      
  LFA50  FA50      LFA5D  FA5D      LFA60  FA60      LFA65  FA65      
  LFA9C  FA9C      LFAA5  FAA5      LFAAE  FAAE      LFAB9  FAB9      
  LFAC6  FAC6      LFACC  FACC      LFAD6  FAD6      LFAD9  FAD9      
  LFAE4  FAE4      LFAF3  FAF3      LFAF6  FAF6      LFB12  FB12      
  LFB14  FB14      LFB21  FB21      LFB23  FB23      LFB30  FB30      
  LFB3B  FB3B      LFB46  FB46      LFB57  FB57      LFB5C  FB5C      
  LFB62  FB62      LFB6E  FB6E      LFB72  FB72      LFB7B  FB7B      
  LFB7E  FB7E      LFB8E  FB8E      LFB94  FB94      LFB9D  FB9D      
  LFBAC  FBAC      LFBC8  FBC8      LFBD2  FBD2      LFBEA  FBEA      
  LFC04  FC04      LFC10  FC10      LFC18  FC18      LFC1F  FC1F      
  LFC2E  FC2E      LFC3C  FC3C      LFC44  FC44      LFC4D  FC4D      
  LFC51  FC51      LFC5F  FC5F      LFC62  FC62      LFC72  FC72      
  LFC7A  FC7A      LFC8F  FC8F      LFC90  FC90      LFC95  FC95      
  LFCA4  FCA4      LFCB8  FCB8      LFCD1  FCD1      LFCF0  FCF0      
  LFCFC  FCFC      LFCFE  FCFE      LFD1A  FD1A      LFD26  FD26      
  LFD32  FD32      LFD3B  FD3B      LFD42  FD42      LFD4E  FD4E      
  LFD51  FD51      LFD69  FD69      LFD79  FD79      LFD83  FD83      
  LFDB1  FDB1      LFDBD  FDBD      LFDCD  FDCD      LFDD9  FDD9      
  LFDDD  FDDD      LFDED  FDED      LFE07  FE07      LFE0C  FE0C      
  LFE13  FE13      LFE1D  FE1D      LFE24  FE24      LFE2A  FE2A      
  LFE33  FE33      LFE3A  FE3A      LFE46  FE46      LFE4E  FE4E      
  LFE4F  FE4F      LFE54  FE54      LFE64  FE64      LFE6E  FE6E      
  LFE77  FE77 *    LFE88  FE88      LFE9D  FE9D      LFEA8  FEA8      
  LFEB9  FEB9      LFEC1  FEC1      LFEC2  FEC2      LFEC6  FEC6      
  LFECE  FECE      LFEE6  FEE6      LFEED  FEED      LFF00  FF00      
  LFF06  FF06      LFF13  FF13      LFF16  FF16      LFF1A  FF1A      
  LFF2A  FF2A      LFF2D  FF2D      LFF44  FF44      LFF58  FF58      
  LFF64  FF64      LFF80  FF80      LFF8A  FF8A      LFF9B  FF9B      
  LFFA1  FFA1      LFFB1  FFB1      LFFB6  FFB6      LFFC1  FFC1      
  LFFC2  FFC2      LFFC7  FFC7      LFFCE  FFCE      LFFDF  FFDF      
  LFFE7  FFE7      LFFF3  FFF3 *    LFMT   D0FA      LINE   E857      
  LIST   E9DB      LLAB   0005      LMOV   E970      LODM   E982      
  LT     E8F6      M      0006      MAXFI  0006      MAXL   D009      
  MESS   E7E0      MLAB   EBAA      MODE   E58C      MOV23  E680      
  MOVEL  E9B8      MPNT   EDF2      NCHAR  D196      NEXT   E17A      
  NFOR   E6CD      NMLEN  0005      NOCHR  D0B8      NOLA   D103 *    
  NOLIN  D0FB      NOR1   E9AB      NORM   E9A5      NOVR   EA8E      
1
 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0      
+                                                      21:15  07/30/2018
+                                                                                      PAGE 107
                              SYMBOL TABLE


  NUM1   F302      NUM2   F307      NUM3   F30C      NUMS   F2EB      
  NXT1   F16F      NXT2   F179      OBUF   D1C9      OCN1   F0C7      
  OCN2   F0CA      OCNT   F0B3      OERR   F0D8      OIND   D10B      
  OOTB   E359 *    OOUT   E353      OP1    F053      OP2    F056      
  OP4    F0AE      OP5    F0B1 *    OPAD   F0AD      OPC    EB8E      
  OPC2   F05B *    OPC3   F077 *    OPCD   F037      OPRD   D105      
  OPRI   D107      ORG1   EBE6      ORG2   ECAE      OTAB   EEE5      
  OUT8   D0CF      OUTDR  D0A9      OUTP8  E1F3      PABL   EC56 *    
  PAS1   EB57      PAS2   EC3D      PASI   D0F9      PNTR   D101      
  PSEU   F0E6      PSU1   EBC2      PSU2   EC71      PSW    0006      
  RDYMG  E0D7      READ   E172      RES2   EC95      RES21  ECA1      
  RESI   EC16      RMOV   E979      RNUM   E769      ROOM   E676      
  ROOM1  E5E7      RTAB   F12D      SAVL   D1C9      SBL1   EECF      
  SBL2   EED3      SBLK   EECC      SCNT   D0F3      SCRN   E380      
  SEAR   E257      SEN1   F2E5      SEND   F2C8      SIGN   D104      
  SIMU   F75C      SLA1   F123      SLAB   F0F8      SLINE  D195      
  SMODE  D12F      SP     0006      SPEED  D1A0      SSTR   F1EB      
  STAB   EAA3      STAT   D0A4      STOM   E98A      SWAP   E5EF      
  SWAPS  E5EA      SWCH   00FF *    SWCH1  D0FD      SWCH2  D0FE      
  SYMAD  D132      SYML   E47E      SYMSV  D130      SYMT   E000 *    
  SYMX   D0F4      SYSIN  D094      SYSIO  D08F      SYSOT  D096      
  SYSYM  D300      TABA   D0F5      TBE    0080      TEMP   D109      
  TERM   F3E4      TERMW  D18F      TEST   E5D2      TEXT   E9DC      
  TXT2   FA0B      TY31   ED88      TY32   ED8B      TY41   EDB4      
  TY56   EDE0      TY6    EE11      TYP2   ED64      TYP3   ED77      
  TYP4   ED96      TYP5   EDCB      TYP6   EE01      TYS5   EDD3      
  TYS6   EE14      UDAI   0001 *    UDAO   0001 *    UDATA  0001      
  USARE  D1A3 *    USTA   0000      VAL1   E290      VAL2   E2AB      
  VAL3   E2BB      VAL4   E2BD      VAL5   E2CB      VALC   E515      
  VCHK   E51C      VDAD   FDF4      VDM1   CC00      WHAT   E7DD      
  XOUT   D0FF      ZBU1   E270      ZBUF   E26A      ZERO   E919      
  
