11
2 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3+                                                      21:15  07/30/2018
4+                                                                                      PAGE 1
5
6
7
8                   ;
9                   ; DISASSEMBLY OF ALS-8 SYSTEM
10                   ; BY BARRY A. WATZMAN
11                   ;
12                   ; <><><><><><><><><><><><><><><><><><><><><><><><><><><><><
13                   ; MODIFIED TO PROPER INTEL SYNTAX AND FIXED TYPOS.
14                   ; MODIFIED TERMINAL IO FOR MITS SIO REV. 1, SEE *UM*.
15                   ;
16                   ; ENTRY POINTS:
17                   ;     E024     USE WHEN POWER IS FIRST APPLIED OR AFTER
18                   ;              A MAJOR PROGRAM CRASH.
19                   ;
20                   ;     E000     USE AFTER A MINOR CRASH TO REINITIALIZE
21                   ;              THE RAM I/O DRIVERS. FOLLOWING THIS THE
22                   ;              FILE, IODR, CUST, AND SYMBOL TABLE CAN
23                   ;              BE EXAMINED FOR POSSIBLE AFFECTS.
24                   ;
25                   ;     E060     USE TO RETURN TO THE ALS-8 AFTER AN
26                   ;              OPERATIONAL PROGRAM HAS GONE INTO AN
27                   ;              ENDLESS LOOP OR HALTED.
28                   ;
29                   ; UDO MUNK, AUGUST 2018
30                   ; <><><><><><><><><><><><><><><><><><><><><><><><><><><><><
31                   ;
32   D000            DATA    EQU     0D000H          ;LOCATION OF DATA BLOCK
33   E000            CODE    EQU     0E000H          ;LOCATION OF ACTUAL CODE
34   CC00            VDM1    EQU     0CC00H          ;VDM-1 SCREEN MEMORY LOCATION
35                   ;
36   E000                    ORG     CODE
37   E000   00       ALS8:   NOP
38   E001   C33BE0           JMP     LE03B
39                   ;
40                   ;PART OF THE CODE TO DELETE CUSTOM COMMANDS
41                   ;
42   E004   CD0CE5   LE004:  CALL    LE50C           ;SET UP ABUF, H,L FOR DELETE
43   E007   C3B7E4           JMP     LE4B7           ;USE SYMLD CODE TO DELETE COMD
44                   ;
45                   ;THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED
46                   ;BY B,C AND CONVERTS THE ASCII DECIMAL DIGITS INTO
47                   ;BINARY.  UP TO A 16-BIT VALUE CAN BE CONVERTED.  THE
48                   ;SCAN STOPS WHEN A BINARY ZERO IS FOUND IN THE BUFFER.
49                   ;
50   E00A   210000   ADEC:   LXI     H,0             ;GET A 16 BIT ZERO
51   E00D   0A       ADE1:   LDAX    B               ;FETCH ASCII DIGIT
52   E00E   B7               ORA     A               ;SET ZERO FLAG
53   E00F   C8               RZ                      ;RETURN IFF FINISHED
54   E010   54               MOV     D,H             ;DUPLICATE CURRENT VALUE
55   E011   5D               MOV     E,L             ;FROM H,L INTO D,E
56   E012   29               DAD     H               ;CURRENT VALUE TIMES TWO
57   E013   29               DAD     H               ;AGAIN - NOW 4X ORIG. VALUE
58   E014   19               DAD     D               ;ADD IN ORIG VALUE - NOW 5X
591
60 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
61+                                                      21:15  07/30/2018
62+                                                                                      PAGE 2
63
64
65
66   E015   29               DAD     H               ;TIMES TWO - NOW 10X
67   E016   D630             SUI     30H             ;CONVERT FETCHED DGT TO BINARY
68   E018   FE0A             CPI     10              ;CHECK FOR LEGAL VALUE
69   E01A   3F               CMC                     ;SET UP CARRY FLAG
70   E01B   D8               RC                      ;RETURN W/CARRY SET IF ERROR
71   E01C   5F               MOV     E,A             ;ELSE MOVE BINARY VALUE TO E
72   E01D   1600             MVI     D,0             ;AND ZERO TO D
73   E01F   19               DAD     D               ;AND ADD TO 10X ORIG. NUMBER
74   E020   03               INX     B               ;NOW POINT TO NEXT DIGIT
75   E021   C30DE0           JMP     ADE1            ;AND PROCESS IT
76                   ;
77                   ;LOWEST LEVEL ENTRY POINT -- INITIALIZES EVERYTHING
78                   ;
79   E024   2100D0   INITA:  LXI     H,FILE0         ;POINT TO START OF DATA AREA
80   E027   AF               XRA     A               ;GET A ZERO
81   E028   4F               MOV     C,A             ;MOVE IT TO C
82   E029   77       INIT2:  MOV     M,A             ;STASH THE ZERO
83   E02A   0D               DCR     C               ;DECREMENT C
84   E02B   23               INX     H               ;POINT TO NEXT LOCATION
85   E02C   C229E0           JNZ     INIT2           ;IF HAVEN'T DONE 256 LOCATIONS
86   E02F   3200D3           STA     SYSYM           ;ANOTHER LOCATION TO ZERO
87   E032   322FD1           STA     SMODE           ;AND ANOTHER
88   E035   325CD2           STA     CUCOM           ;AND STILL ANOTHER
89   E038   C300E0           JMP     ALS8            ;NOW START UP THE SYSTEM
90                   ;
91                   ;WARM RESTART - RESTORES I/O DRIVERS AND DOES PARTIAL
92                   ;INITIALIZATION
93                   ;
94   E03B   0E3D     LE03B:  MVI     C,(CRLF-IONME) AND 0FFH
95   E03D   312FD1           LXI     SP,SMODE        ;SET STACK POINTER
96   E040   11D9E1           LXI     D,IONME         ;POINT TO IO CODE SOURCE
97   E043   218FD0           LXI     H,SYSIO         ;POINT TO DEST IN DATA AREA
98   E046   1A       LE046:  LDAX    D               ;GET A BYTE
99   E047   77               MOV     M,A             ;PUT IT IN DATA AREA
100   E048   13               INX     D               ;SOURCE POINTER
101   E049   23               INX     H               ;DEST POINTER
102   E04A   0D               DCR     C               ;NO OF BYTES LEFT TO BE MOVED
103   E04B   C246E0           JNZ     LE046           ;IF NOT DONE
104   E04E   2100E0           LXI     H,ALS8          ;POINT TO START CODE
105   E051   2232D1           SHLD    SYMADD          ;INITIAL SYMBOL TABLE ADDR
106   E054   3E35             MVI     A,(IBUF+81) AND 0FFH
107   E056   328FD1           STA     TERMW           ;INITIAL TERMINAL WIDTH
108   E059   AF               XRA     A               ;GET A ZERO
109   E05A   322FD1           STA     SMODE           ;SAVE AS SMODE
110   E05D   3290D1           STA     CHRR            ;AND CHRR
111                   ;
112                   ;WARM RESTART WITH NO INITIALIZATION
113                   ;PRINTS "READY" AND ENTERS MAIN PROCESSING LOOP
114                   ;
115   E060   2194D0   EORMS:  LXI     H,SYSIN         ;POINT TO CUR DRIVER ADDRS
116   E063   CD5AE1           CALL    LE15A           ;SET I/O JUMPS TO CUR DRIVERS
1171
118 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
119+                                                      21:15  07/30/2018
120+                                                                                      PAGE 3
121
122
123
124   E066   CD16E2           CALL    CRLF            ;PRINT A CR/LF ON TERMINAL
125   E069   21D7E0           LXI     H,RDYMG         ;POINT TO READY MESSAGE
126   E06C   CD80E3           CALL    SCRN            ;PRINT "READY"
127   E06F   C3CBE0           JMP     LE0CB           ;ANOTHER CRLF & ENTER MAIN LOOP
128                   ;
129                   ;THIS IS THE MAIN ALS-8 COMMAND LOOP
130                   ;
131   E072   210000   LE072:  LXI     H,0             ;GET A ZERO TO H,L
132   E075   22FDD0           SHLD    SWCH1           ;TO SWITCH 1
133   E078   312FD1   LE078:  LXI     SP,SMODE        ;SET STACK POINTER
134   E07B   CD72E1           CALL    READ            ;GET A COMND LINE IN IBUF
135   E07E   23               INX     H               ;POINT TO 1ST CHAR
136   E07F   7E               MOV     A,M             ;GET IT
137   E080   FE3A             CPI     '9'+1           ;COMPARE TO 9
138   E082   DA57E8           JC      LINE            ;NEW LINE IF 1ST CHAR NUMERIC
139   E085   CD15E5           CALL    VALC            ;EXTRACT ASCII & BINARY ARGS
140   E088   0604             MVI     B,4             ;LENGTH OF ALS8 COMMANDS
141   E08A   11E6E3           LXI     D,CTAB          ;POINT AT COMMAND TABLE
142   E08D   CD28E2           CALL    COMS            ;SEE IF COMMAND IS IN TABLE
143   E090   E5               PUSH    H               ;SAVE H,L PNTR INTO LINE
144   E091   CAACE0           JZ      LE0AC           ;MATCH WAS FOUND
145   E094   E1               POP     H               ;RESTORE POINTER TO LINE
146   E095   13               INX     D               ;POINT TO 2ND PART OF TABLE
147   E096   CD28E2           CALL    COMS            ;SEARCH 2ND PART
148   E099   CAA5E0           JZ      LE0A5           ;IF MATCH FOUND
149   E09C   115CD2           LXI     D,CUCOM         ;NO MATCH, TRY CUSTOM TABLE
150   E09F   CD40E2           CALL    LE240           ;SEARCH CUSTOM TABLE
151   E0A2   C2DDE7           JNZ     WHAT            ;ERROR MSG IF NO MATCH FOUND
152   E0A5   E5       LE0A5:  PUSH    H               ;SAVE H,L
153   E0A6   CD1EE3           CALL    LE31E           ;CONVERT ABUF CNTS TO BINARY
154   E0A9   DADDE7           JC      WHAT            ;IF ABUF NOT LEGAL NO.
155   E0AC   3AFCD0   LE0AC:  LDA     IOSWC           ;1 COMND DRVR SWTCH DELAY FLAG
156   E0AF   B7               ORA     A               ;SET FLAGS
157   E0B0   C457E1           CNZ     LE157           ;TIME TO SWITCH DRIVERS
158   E0B3   E1               POP     H               ;RESTORE POINTER TO COMD LINE
159   E0B4   CDDDE0           CALL    LE0DD           ;EXECUTE THE COMMAND
160   E0B7   3AFDD0   EOR:    LDA     SWCH1           ;GET I/O RESTORE SWITCH
161   E0BA   B7               ORA     A               ;SET FLAGS
162   E0BB   C260E0           JNZ     EORMS           ;RESTORE JMPS & PRT "READY"
163   E0BE   3AFED0           LDA     SWCH2           ;GET DRIVER HOLD REQ.
164   E0C1   B7               ORA     A               ;SET FLAGS
165   E0C2   C2D1E0           JNZ     EORNS           ;HOLD CURRENT DRVR, DO CRLF
166   E0C5   2194D0           LXI     H,SYSIN         ;POINT TO SYSTEM DRIVERS
167   E0C8   CD5AE1           CALL    LE15A           ;PUT IN JUMPS & DO CRLF
168   E0CB   CD16E2   LE0CB:  CALL    CRLF            ;PRINT CRLF
169   E0CE   C372E0           JMP     LE072           ;DO ANOTHER ALS8 COMMAND
170                   ;
171                   ;END OF MAIN PROCESSING LOOP
172                   ;
173                   ;FOLLOWING RETURN POINT DOES A CR/LF AND LEAVES
174                   ;ALL DRIVERS AND SWITCHES INTACT
1751
176 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
177+                                                      21:15  07/30/2018
178+                                                                                      PAGE 4
179
180
181
182                   ;
183   E0D1   CD16E2   EORNS:  CALL    CRLF            ;PRINT A CRLF
184   E0D4   C378E0           JMP     LE078           ;RET LEAVING DRIVERS INTACT
185                   ;
186                   ;SIGN-ON AND COMMAND MODE MESSAGE
187                   ;
188   E0D7   52454144 RDYMG:  DB      'READY',0DH
189   E0DB   590D
190                   ;
191                   ;HERE IS WHERE WE DISPATCH TO COMMANDS
192                   ;NOTE THAT SINCE THIS IS A CALLED ROUTINE, SO
193                   ;IN EFFECT IS THE ROUTINE TRANSFERED TO
194                   ;
195   E0DD   E9       LE0DD:  PCHL                    ;GO TO IT
196                   ;
197                   ;THE IODR COMMAND AND IT'S ZILLION FORMS
198                   ;
199   E0DE   0E06     IODR:   MVI     C,MAXFIL        ;MAX NUMBER OF DRIVER NAMES
200   E0E0   214ED0           LXI     H,IOFLE         ;POINT TO DRIVER FILE
201   E0E3   3AD7D0           LDA     FBUF            ;NAME IN SLASHES AFTR COMMAND ?
202   E0E6   B7               ORA     A               ;SET FLAGS
203   E0E7   CA51E1           JZ      LE151           ;NO - PRT LIST OF DRIVERS
204   E0EA   EB               XCHG                    ;YES - TABLE PNTR TO D,E
205   E0EB   CD8DE6           CALL    LE68D           ;SEARCH DIRECTORY FOR NAME
206   E0EE   C2FEE0           JNZ     LE0FE           ;NAME FOUND
207   E0F1   CD1CE5           CALL    VCHK            ;NOT FOUND - CHECK FOR PARMS
208   E0F4   3ADED0           LDA     FEF             ;GET FREE ENTRY FOUND FLAG
209   E0F7   B7               ORA     A               ;SET FLAGS
210   E0F8   CACCE5           JZ      LE5CC           ;NO ENTRIES LEFT - PRT "FULL"
211   E0FB   2ADCD0           LHLD    FREAD           ;GET ADDR OF FREE ENTRY
212   E0FE   22DCD0   LE0FE:  SHLD    FREAD           ;FREAD HAS ADDR OF ENTRY
213   E101   CD76E6           CALL    ROOM            ;PUT FILE NAME INTO DIRECTORY
214   E104   210500           LXI     H,NMLEN         ;NAME LENGTH
215   E107   19               DAD     D               ;H,L POINT JUST AFTER NAME
216   E108   3ADFD0           LDA     ABUF            ;SEE IF ADDR SPECIFIED
217   E10B   B7               ORA     A               ;SET FLAGS
218   E10C   C219E1           JNZ     LE119           ;IF ADDR WAS SPECIFIED
219   E10F   2205D1           SHLD    OPRD            ;NO ADDR, SET UP FOR SWTCH
220   E112   3C               INR     A               ;MAKE ACCUM. NON-ZERO
221   E113   32FCD0           STA     IOSWC           ;SET I/O SWITCH FLAG
222   E116   C34CE1           JMP     LE14C           ;PRINT THE SELECTED ENTRY
223   E119   EB       LE119:  XCHG                    ;SAVE I/O ADDRS IN D,E
224   E11A   2AEFD0           LHLD    BBUF            ;GET 1ST ADDR SPECIFIED
225   E11D   7D               MOV     A,L             ;L TO A
226   E11E   B4               ORA     H               ;SEE IF ADDRS IS 0
227   E11F   3AE6D0           LDA     ABUF+7          ;POINT TO 2ND ASCII PARM.
228   E122   C230E1           JNZ     LE130           ;IF 1ST ADDR NOT ZERO
229   E125   B7               ORA     A               ;SEE IF 2ND ADDR SPECIFIED
230   E126   C22DE1           JNZ     LE12D           ;IF 2ND ARGUMENT NOT OMITTED
231   E129   12               STAX    D               ;STORE 0 FOR INPUT, DELT ENTRY
232   E12A   13               INX     D               ;FOR 2ND BYTE
2331
234 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
235+                                                      21:15  07/30/2018
236+                                                                                      PAGE 5
237
238
239
240   E12B   12               STAX    D               ;ZERO IT TOO
241   E12C   C9       BITBKT: RET                     ;DONE
242                   ;
243                   ;1ST ARG. WAS 0, 2ND WAS PRESENT
244                   ;
245   E12D   2A94D0   LE12D:  LHLD    SYSIN           ;GET STD SYSIN DRIVER
246   E130   EB       LE130:  XCHG                    ;TO D,E
247   E131   73               MOV     M,E             ;STORING IT AS INPUT DRIVER
248   E132   23               INX     H               ;2ND BYTE
249   E133   72               MOV     M,D             ;STORE IT
250   E134   23               INX     H               ;POINT TO OUTPUT DRIVER
251   E135   EB               XCHG                    ;OUTPUT DRIVER ADDR TO D,E
252   E136   B7               ORA     A               ;SET FLAGS FOR 2ND ARG OMITTED
253   E137   212CE1           LXI     H,BITBKT        ;POINT TO THE BIT BUCKET
254   E13A   CA48E1           JZ      LE148           ;IF 2ND ARG OMITTED
255   E13D   2AF1D0           LHLD    BBUF+2          ;GET 2ND ARG
256   E140   7D               MOV     A,L             ;MOVE L TO A
257   E141   B4               ORA     H               ;SEE IF ARG = 0
258   E142   C248E1           JNZ     LE148           ;JMP IF NOT ZERO
259   E145   2A96D0           LHLD    SYSOT           ;ELSE SET TO USE SYSOT
260   E148   EB       LE148:  XCHG                    ;OUTPUT ADDR TO D,E
261   E149   73               MOV     M,E             ;MOVING IT TO OUTPUT TABLE
262   E14A   23               INX     H               ;2ND HALF
263   E14B   72               MOV     M,D             ;DONE
264   E14C   0E01     LE14C:  MVI     C,1             ;SET UP TO PRINT ENTRY
265   E14E   2ADCD0           LHLD    FREAD           ;GET IT'S ADDRESS
266   E151   CD2AE6   LE151:  CALL    LE62A           ;PRINT IT
267   E154   C3D1E0           JMP     EORNS           ;DONE WITH IODR
268                   ;
269                   ;SET UP I/O JUMPS TO I/O DRIVER SET WHOSE ADDRESSES
270                   ;ARE POINTED TO BY OPRD (SET ABOVE)
271                   ;
272   E157   2A05D1   LE157:  LHLD    OPRD            ;GET ADDRESS OF I/O ADDRESSAS
273                   ;
274                   ;STORE I/O JUMPS TO ADDRESSES POINTED TO BY CONTENTS OF
275                   ;H,L -- SYSIO, OR IF ENTERD IN LINE, ONE OF THE OTHER
276                   ;I/O DRIVERS
277                   ;
278   E15A   CD82E9   LE15A:  CALL    LODM            ;GET THE 4 BYTES OF 2 ADDRESSES
279   E15D   21CCD0           LXI     H,IN8           ;POINT TO THE I/O JUMPS
280   E160   36C3             MVI     M,0C3H          ;STORE JUMP INST.
281   E162   23               INX     H               ;POINT TO NEXT BYTE
282   E163   70               MOV     M,B             ;STORE IT
283   E164   23               INX     H               ;2ND BYTE
284   E165   71               MOV     M,C             ;STORE IT
285   E166   23               INX     H               ;NOW 1ST BYTE FOR OUTPUT
286   E167   36C3             MVI     M,0C3H          ;STORE JUMP INST
287   E169   23               INX     H               ;POINT TO ADDR 1ST BYTE
288   E16A   72               MOV     M,D             ;STORE IT
289   E16B   23               INX     H               ;POINT 2ND BYTE
290   E16C   73               MOV     M,E             ;STORE IT
2911
292 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
293+                                                      21:15  07/30/2018
294+                                                                                      PAGE 6
295
296
297
298   E16D   AF               XRA     A               ;A ZERO
299   E16E   32FCD0           STA     IOSWC           ;RESET SWITCH TO NO-SWITCH MODE
300   E171   C9               RET                     ;DONE
301                   ;
302                   ;THE FOLLOWING ROUTINE READS A COMMAND LINE FROM THE
303                   ;TERMINAL AND PUTS IT IN THE OUTPUT BUFFER
304                   ;
305   E172   21E4D1   READ:   LXI     H,IBUF          ;GET INPUT BUFFER ADDR
306   E175   22D4D0           SHLD    ADDS            ;SAVE ADDRESS
307   E178   1E02             MVI     E,2             ;INIT. CHAR COUNT
308   E17A   CDCCD0   NEXT:   CALL    IN8             ;READ A LINE
309   E17D   FE18             CPI     'X'-40H         ;CHECK FOR CNTL X
310   E17F   C288E1           JNZ     CR              ;CHECK FOR C/R IF NOT CNTL X
311   E182   CD16E2           CALL    CRLF            ;ELSE DO CRLF
312   E185   C372E1           JMP     READ            ;AND START OVER
313   E188   FE0D     CR:     CPI     0DH             ;IS IT A C/R ?
314   E18A   C2A7E1           JNZ     DEL             ;IF NOT, CHECK FOR CHAR DELETE
315   E18D   7D               MOV     A,L             ;GET LOW ORDER BYTE OF ADDR
316   E18E   FEE4             CPI     IBUF AND 0FFH   ;SEE IF CR IS ONLY CHAR ON LINE
317   E190   CA72E1           JZ      READ            ;GET ANOTHER LINE IF SO
318   E193   70               MOV     M,B             ;PUT CHAR IN THE LINE
319   E194   23               INX     H               ;POINT TO NEXT POSITION
320   E195   3601             MVI     M,1             ;PUT END OF LINE INDICATOR
321   E197   23               INX     H               ;POINT 1 AFTER THE LINE
322   E198   CDDFF3           CALL    LF3DF           ;GET TERMW+1 IN A
323   E19B   3C               INR     A               ;INCREMENT IT FOR EOF MARK
324   E19C   CDD1E1           CALL    CLER            ;CLEAR REST OF THE BUFFER
325   E19F   21E3D1           LXI     H,IBUF-1        ;POINT TO CHAR COUNT
326   E1A2   7B               MOV     A,E             ;PUT IT BEFORE THE LINE
327   E1A3   32F3D0           STA     CCNT            ;AND SAVE AS CHAR COUNT
328   E1A6   C9               RET                     ;DONE
329   E1A7   FE7F     DEL:    CPI     7FH             ;IS THE CHAR A DELETE ?
330   E1A9   C2BCE1           JNZ     CHAR            ;IF NOT, PUT IT IN LINE
331   E1AC   3EE4             MVI     A,IBUF AND 0FFH ;ELSE GET LOW-ORDER ADDR
332   E1AE   BD               CMP     L               ;MAKE SURE NOT AT IBUF
333   E1AF   CA7AE1           JZ      NEXT            ;IF SO, IGNORE DELETE
334   E1B2   2B               DCX     H               ;ELSE DCR BUFFER POINTER
335   E1B3   1D               DCR     E               ;AND CHAR COUNT
336   E1B4   065F     BSPA:   MVI     B,5FH           ;GET BACKSPACE CHAR
337   E1B6   CDCFD0           CALL    OUT8            ;MAKE TERMINAL BKSPACE
338   E1B9   C37AE1           JMP     NEXT            ;THEN GET NEXT CHAR
339   E1BC   CDCFD0   CHAR:   CALL    OUT8            ;ECHO THE CHAR
340   E1BF   FE20             CPI     ' '             ;MAKE SURE IT'S PRINTABLE
341   E1C1   DA7AE1           JC      NEXT            ;SKIP IT IF IT'S CNTL CHAR
342   E1C4   77               MOV     M,A             ;ELSE PUT IT IN THE BUFFER
343   E1C5   3A8FD1           LDA     TERMW           ;GET TERMINAL WIDTH
344   E1C8   BD               CMP     L               ;SEE IF WE'RE THERE
345   E1C9   CAB4E1           JZ      BSPA            ;BACKSPACE IF BUFFER OVERFLOW
346   E1CC   23               INX     H               ;ELSE INCREMENT THE BUFFER PNTR
347   E1CD   1C               INR     E               ;AND THE CHAR COUNT
348   E1CE   C37AE1           JMP     NEXT            ;THEN DO NEXT CHAR
3491
350 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
351+                                                      21:15  07/30/2018
352+                                                                                      PAGE 7
353
354
355
356                   ;
357                   ;THIS ROUTINE IS USED TO BLANK OUT A PORTION OF MEMORY
358                   ;SINCE ONLY L IS TESTED, AREA MUST BE < 256 BYTES
359                   ;
360   E1D1   BD       CLER:   CMP     L               ;SEE IF AT END OF AREA TO BLANK
361   E1D2   C8               RZ                      ;DONE IF SO
362   E1D3   3620             MVI     M,' '           ;ELSE GET A SPACE
363   E1D5   23               INX     H               ;INCREMENT THE MEMORY POINTER
364   E1D6   C3D1E1           JMP     CLER            ;AND TEST NEW ADDRESS
365                   ;
366                   ;HERE ARE THE BUILT IN I/O DRIVERS AND THEIR NAME
367                   ;THIS CODE IS MOVED INTO THE DATA PORTION DURING
368                   ;PROGRAM INITIALIZATION.
369                   ;PART OF THE ENTER COMMAND IS ALSO MOVED, FOR NO REASON.
370                   ;
371   E1D9   53595349 IONME:  DB      'SYSIO'         ;STANDARD DRIVER NAME
372   E1DD   4F
373   E1DE   98D0             DW      INDR            ;INPUT ROUTINE ADDR
374   E1E0   A9D0             DW      OUTDR           ;OUTPUT ROUTINE ADDR
375   E1E2   CDA4D0   INP8:   CALL    STAT            ;BECOMES INDR: AFTER THE MOVE
376                   ;       JZ      INDR            ;*UM*
377   E1E5   C298D0           JNZ     INDR            ;*UM*
378   E1E8   DB01             IN      UDATA
379   E1EA   E67F             ANI     7FH
380   E1EC   47               MOV     B,A
381   E1ED   C9               RET
382   E1EE   DB00             IN      USTA            ;THIS BECOMES STAT:
383   E1F0   E601             ANI     DAV
384   E1F2   C9               RET
385   E1F3   CDA4D0   OUTP8:  CALL    STAT
386   E1F6   CAB8D0           JZ      NOCHR
387   E1F9   DB01             IN      UDATA           ;NOTE THAT BEFORE EA. OUTPUT
388   E1FB   E67F             ANI     7FH
389   E1FD   FE1B             CPI     ESC             ;ALS8 TESTS FOR AN ESC. CHAR
390   E1FF   CA60E0           JZ      EORMS           ;AND RETNS TO CMD MODE IF FOUND
391   E202   DB00             IN      USTA            ;BECOMES NOCHR:
392   E204   E680             ANI     TBE
393                   ;       JZ      NOCHR
394   E206   C2B8D0           JNZ     NOCHR           ;*UM*
395   E209   78               MOV     A,B
396   E20A   D301             OUT     UDATA
397   E20C   C9               RET
398                   ;
399                   ;THE ENTER COMMAND.
400                   ;
401   E20D   CD1CE5   ENTR:   CALL    VCHK            ;MAKE SURE PARAMETERS GIVEN
402   E210   CD0BE8           CALL    ENTS            ;TO DO THE ENTER FUNCTION
403   E213   DADDE7           JC      WHAT            ;IF ERROR FOUND
404                   ;
405                   ;CRLF UTILITY
406                   ;
4071
408 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
409+                                                      21:15  07/30/2018
410+                                                                                      PAGE 8
411
412
413
414   E216   060D     CRLF:   MVI     B,0DH           ;CAR. RETURN
415   E218   CDCFD0           CALL    OUT8
416   E21B   060A     LF:     MVI     B,0AH           ;LINE FEED
417   E21D   CDCFD0           CALL    OUT8
418   E220   067F             MVI     B,7FH           ;NULLS FOR SLOW TERMINALS
419   E222   CDCFD0           CALL    OUT8
420   E225   C3CFD0           JMP     OUT8            ;LET OUT8 DO THE RETURN
421                   ;
422                   ;TABLE SEARCH ROUTINE USED FOR BOTH COMMAND SEARCHES AND
423                   ;SYMBOL LOOK-UPS.  ZERO FLAG SET IF MATCH FOUND, IN WHICH
424                   ;CASE H,L HAS VALUE OF STRING (16 BIT).
425                   ;LENGTH OF STRING IS IN B, TABLE ADDRESS IS IN
426                   ;D,E, ADDS POINTS TO ITEM TO BE LOOKED UP.
427                   ;IF NO MATCH, D,E POINT TO BYTE AFTER TABLE END.
428                   ;
429   E228   2AD4D0   COMS:   LHLD    ADDS            ;GET ADDR OF ITEM TO LOOK UP
430   E22B   48               MOV     C,B             ;LENGTH OF ITEM TO LOOK UP
431   E22C   1A               LDAX    D               ;1ST BYTE OF NEXT TABLE ENTRY
432   E22D   B7               ORA     A               ;IF ZERO, ==> END OF TABLE
433   E22E   CA3EE2           JZ      LE23E           ;TO SET RET FLAG FOR NO MATCH
434   E231   CD57E2           CALL    SEAR            ;SEE IF ENTRY MATCHES STRING
435   E234   1A               LDAX    D               ;GET 1ST BYTE OF VALUE
436   E235   67               MOV     H,A             ;MOVING TO H,L
437   E236   13               INX     D               ;INCREMENT POINTER
438   E237   1A               LDAX    D               ;GET 2ND BYTE OF VALUE
439   E238   6F               MOV     L,A             ;MOVE TO H,L COMPLETE
440   E239   C8               RZ                      ;RET IF SEAR INDICATED MATCH
441   E23A   13               INX     D               ;ELSE POINT TO NEXT TABLE ITEM
442   E23B   C328E2           JMP     COMS            ;AND TEST IT
443   E23E   3C       LE23E:  INR     A               ;MAKE NON ZERO
444   E23F   C9               RET                     ;INDICATING NO MATCH
445                   ;
446                   ;THE FOLLOWING ROUTINE IS THE SAME AS COMS, ABOVE, EXCEPT
447                   ;THAT IT IS USED TO SEARCH THE CUSTOM COMMAND TABLE, WHICH
448                   ;CONSISTS OF 5 CHAR NAMES WITH ONLY 1ST FOUR TESTED.
449                   ;BECAUSE OF THIS IT HAS AN EXTRA INX D INSTR.
450                   ;
451   E240   2AD4D0   LE240:  LHLD    ADDS            ;GET ADDR OF ITEM TO LOOK UP
452   E243   48               MOV     C,B             ;LENGTH OF ITEM TO LOOK UP
453   E244   1A               LDAX    D               ;1ST BYTE OF TABLE ENTRY
454   E245   B7               ORA     A               ;IF ZERO ==> END OF TABLE
455   E246   CA3EE2           JZ      LE23E           ;TO SET RET FLAG FOR NO MATCH
456   E249   CD57E2           CALL    SEAR            ;SEE IF ENTRY MATCHES STRING
457   E24C   13               INX     D               ;SKIP 5TH CHAR OF ENTRY NAME
458   E24D   1A               LDAX    D               ;GET 1ST BYTE OF VALUE
459   E24E   67               MOV     H,A             ;MOVING TO H,L
460   E24F   13               INX     D               ;POINT TO 2ND BYTE OF VALUE
461   E250   1A               LDAX    D               ;GET 2ND BYTE OF VALUE
462   E251   6F               MOV     L,A             ;MOVE TO H,L COMPLETE
463   E252   C8               RZ                      ;RET IF SEAR INDICATED MATCH
464   E253   13               INX     D               ;POINT TO NEXT ENTRY
4651
466 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
467+                                                      21:15  07/30/2018
468+                                                                                      PAGE 9
469
470
471
472   E254   C340E2           JMP     LE240           ;TEST IT
473                   ;
474                   ;ROUTINE TO SEE IF TWO STRINGS ARE EQUAL.  STRINGS POINTED
475                   ;TO BY D,E AND H,L.  ZERO FLAG SET INDICATES MATCH.  REG C
476                   ;HAS LENGTH OF MASTER STRING.  D POINT AFTER ITS STRING
477                   ;EVEN IF NO MATCH; H,L POINTS AFTER IT'S STRING IF MATCH,
478                   ;ELSE TO 1ST NON-MATCHING CHAR.
479                   ;
480   E257   1A       SEAR:   LDAX    D               ;GET A CHAR FROM 1 STRING
481   E258   BE               CMP     M               ;COMPARE TO OTHER STRING
482   E259   C263E2           JNZ     INCA            ;IF IT DOESN'T MATCH
483   E25C   23               INX     H               ;INCREMENT POINTER
484   E25D   13               INX     D               ;INCREMENT POINTER
485   E25E   0D               DCR     C               ;COUNT OF CHARS LEFT TO CHECK
486   E25F   C257E2           JNZ     SEAR            ;IF CHARS LEFT, TEST THEM
487   E262   C9               RET                     ;ELSE DONE
488   E263   13       INCA:   INX     D               ;INCREMENT POINTER
489   E264   0D               DCR     C               ;DECREMENT COUNT
490   E265   C263E2           JNZ     INCA            ;KEEP INR. POINTER IF NOT DONE
491   E268   0C               INR     C               ;ELSE CLEAR ZERO FLAG
492   E269   C9               RET                     ;AND RETURN
493                   ;
494                   ;ROUTINE TO ZERO OUT A BUFFER IN MEMORY
495                   ;
496   E26A   AF       ZBUF:   XRA     A               ;GET A ZERO
497   E26B   11EFD0           LXI     D,ABUF+16       ;POINT TO THE BUFFER
498   E26E   0610             MVI     B,16            ;BUFFER LENGTH
499   E270   1B       ZBU1:   DCX     D               ;DECREMENT POINTER
500   E271   12               STAX    D               ;ZERO OUT A LOCATION
501   E272   05               DCR     B               ;DECREMENT COUNT
502   E273   C270E2           JNZ     ZBU1            ;IF MORE LEFT TO ZERO
503   E276   C9               RET                     ;DONE
504                   ;
505                   ;THE EXECUTE COMMAND - DOES A CALL TO A SPECIFIED ADDR.
506                   ;
507   E277   CD1CE5   EXEC:   CALL    VCHK            ;CHECK FOR PROPER ARGUMENT
508   E27A   CD16E2           CALL    CRLF            ;DO CRLF
509   E27D   2AEFD0           LHLD    BBUF            ;GET EXEC ADDR
510   E280   E9               PCHL                    ;GO TO IT
511                   ;
512                   ;ROUTINE TO EXTRACT VALUES FROM A COMMAND LINE
513                   ;AND PLACE THEM IN BUFFERS
514                   ;
515   E281   210000   ETRA:   LXI     H,0             ;GET A ZERO
516   E284   22F1D0           SHLD    BBUF+2          ;ASSUME NO 2ND OPERAND
517   E287   22D7D0           SHLD    FBUF            ;ASSUME NO FILE NAME IN /'S
518   E28A   CD6AE2           CALL    ZBUF            ;ZERO OUT ABUF
519   E28D   21E3D1           LXI     H,IBUF-1        ;SET TO SCAN COMMAND LINE
520   E290   23       VAL1:   INX     H               ;POINT TO NEXT CHAR
521   E291   7E               MOV     A,M             ;GET CHAR
522   E292   FE20             CPI     ' '             ;SPACE ?
5231
524 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
525+                                                      21:15  07/30/2018
526+                                                                                      PAGE 10
527
528
529
530   E294   3F               CMC                     ;SET CARRY TO INDICATE CNTL CHR
531   E295   D0               RNC                     ;DONE-CR ONLY CNTL CHR ALLOWED
532   E296   C290E2           JNZ     VAL1            ;IF CHAR WAS NOT A SPACE
533   E299   2201D1           SHLD    PNTR            ;ELSE SPACE, SAVE POINTER
534   E29C   CDCCEE           CALL    SBLK            ;AND SCAN TO 1ST CHAR
535   E29F   3F               CMC                     ;CARRY SET ==> C/R 1ST CHAR
536   E2A0   D0               RNC                     ;DONE THEN
537   E2A1   FE2F             CPI     '/'             ;FILE NAME DELIMITER ?
538   E2A3   C2CBE2           JNZ     VAL5            ;NO, LOOK FOR OTHER PARAMETERS
539   E2A6   11D7D0           LXI     D,FBUF          ;YES, POINT TO FILE NAME BUFFER
540   E2A9   0E05             MVI     C,NMLEN         ;FILE NAME LENGTH
541   E2AB   23       VAL2:   INX     H               ;MOVING NAME TO FILE NAME BUFR
542   E2AC   7E               MOV     A,M             ;GET A CHAR
543   E2AD   FE2F             CPI     '/'             ;TERMINATING SLASH ?
544   E2AF   CABBE2           JZ      VAL3            ;DONE MOVING NAME THEN
545   E2B2   0D               DCR     C               ;ELSE DCR COUNT OF CHARS LEFT
546   E2B3   FADDE7           JM      WHAT            ;IF NAME > 5 CHARS
547   E2B6   12               STAX    D               ;ELSE PUT LETTER IN BUFFER
548   E2B7   13               INX     D               ;INCREMENT DEST. POINTER
549   E2B8   C3ABE2           JMP     VAL2            ;AND DO NEXT CHARACTER
550   E2BB   3E20     VAL3:   MVI     A,' '           ;GET A SPACE
551   E2BD   0D       VAL4:   DCR     C               ;DECREMENT COUNT OF CHARS LEFT
552   E2BE   FAC6E2           JM      DONE            ;IF NEGATIVE, DONE
553   E2C1   12               STAX    D               ;PAD REST OF BUFR WITH SPACES
554   E2C2   13               INX     D               ;INCREMENT BUFFER POINTER
555   E2C3   C3BDE2           JMP     VAL4            ;CONTINUE TILL BUFFER FILLED
556   E2C6   CDD3EE   DONE:   CALL    SBL2            ;SCAN TO NEXT NON-SPACE CHAR
557   E2C9   3F               CMC                     ;CARRY MEANS CHAR. RETRN FOUND
558   E2CA   D0               RNC                     ;AND CAR. RETRN = DONE
559   E2CB   11DFD0   VAL5:   LXI     D,ABUF          ;POINT TO THE ASCII BUFFER
560   E2CE   CDD7E2           CALL    LE2D7           ;PUT IN ABUF & CNVRT BY MODE
561   E2D1   D8               RC                      ;IF C/R WAS TERMINATING CHAR
562   E2D2   CDCCEE           CALL    SBLK            ;ELSE SCAN TO 2ND ASCII PARM.
563   E2D5   3F               CMC                     ;TEST FOR C/R FOUND
564   E2D6   D0               RNC                     ;RET., ELSE FALL THRU TO DO 2ND
565   E2D7   CD3EF1   LE2D7:  CALL    ALPS            ;PUT PARM. IN ABUF
566   E2DA   7B               MOV     A,E             ;GET ENDING ADDR LOW BYTE
567   E2DB   90               SUB     B               ;SUBTRACTING PARM LENGTH
568   E2DC   6F               MOV     L,A             ;TO GET BACK TO START
569   E2DD   7A               MOV     A,D             ;NOW HIGH ORDER BYTE
570   E2DE   DE00             SBI     0               ;IN CASE OF BORROW
571   E2E0   67               MOV     H,A             ;H,L HAS START OF PARM IN ABUF
572   E2E1   3A2FD1           LDA     SMODE           ;GET NUMERIC MODE
573   E2E4   87               ADD     A               ;MULT. BY 2
574   E2E5   C604             ADI     4               ;AND ADD 4
575   E2E7   B8               CMP     B               ;TEST FOR NO. OF DIGITS ALLOWED
576   E2E8   D8               RC                      ;# DIGITS > 4 AND HEX MODE
577   E2E9   CDA5E9           CALL    NORM            ;NORMALIZE ASCII NUMBER
578   E2EC   EB               XCHG                    ;START OF SUB-BUFFER TO D,E
579   E2ED   210700           LXI     H,7             ;LENGTH OF SUB-BUFFERS IN ABUF
580   E2F0   19               DAD     D               ;H,L POINT TO NEXT SUB-BUFFER
5811
582 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
583+                                                      21:15  07/30/2018
584+                                                                                      PAGE 11
585
586
587
588   E2F1   EB               XCHG                    ;NEXT SUB-BUFFER IN D,E
589   E2F2   C9               RET                     ;DONE
590                   ;
591                   ;SOME NUMERICAL CONVERSION ROUTINES FOLLOW.
592                   ;B,C POINT TO 1ST ASCII DIGIT, NUMERIC STRING ENDS WITH
593                   ;BINARY ZERO.  ANSWER IN H,L AND CARRY SET = ERROR.
594                   ;
595                   ;EMODE CONVERTS BASED ON CURRENT MODE SETTING, SMODE
596                   ;EQUAL TO 0 FOR HEX, 1 FOR OCTAL.
597                   ;
598   E2F3   3A2FD1   EMODE:  LDA     SMODE           ;GET MODE SETTING
599   E2F6   B7               ORA     A               ;SET FLAGS
600   E2F7   C233E3           JNZ     AOCT            ;OCTAL IS 1
601   E2FA   210000   AHEX:   LXI     H,0             ;START WITH A ZERO
602   E2FD   0A       AHE1:   LDAX    B               ;GET A DIGIT
603   E2FE   B7               ORA     A               ;SEE IF ZERO
604   E2FF   C8               RZ                      ;YES - DONE
605   E300   29               DAD     H               ;MULT H,L BY TWO
606   E301   29               DAD     H               ;AGAIN - NOW 4X ORIG VALUE
607   E302   29               DAD     H               ;AGAIN - NOW 8X ORIG VALUE
608   E303   29               DAD     H               ;AGAIN - NOW 10H X ORIG VALU
609   E304   CD11E3           CALL    AHS1            ;CONVERT DIGIT TO BINARY
610   E307   FE10             CPI     10H             ;SEE IF LEGAL
611   E309   3F               CMC                     ;SET CARRY FLAG
612   E30A   D8               RC                      ;FOR PROPER ILLEAGLE RETURN
613   E30B   85               ADD     L               ;OTHERWISE ADD IT INTO THE NO.
614   E30C   6F               MOV     L,A             ;AND RESTORE TO H,L
615   E30D   03               INX     B               ;NOW POINT TO NEXT ASCII DIGIT
616   E30E   C3FDE2           JMP     AHE1            ;AND PROCESS IT
617                   ;
618                   ;ROUTINE TO CONVERT ASCII HEX DIGIT INTO BINARY
619                   ;
620   E311   D630     AHS1:   SUI     30H             ;CONVERT 0-9 TO BINARY
621   E313   FE0A             CPI     0AH             ;SEE IF > ASCII 9
622   E315   D8               RC                      ;RETURN IF NOT, DONE
623   E316   D607             SUI     7               ;TO TAKE CARE OF A-F
624   E318   FE0A             CPI     0AH             ;COMPARE TO DECIMAL 10
625   E31A   D0               RNC                     ;IF > 10 OR =, RETURN DONE
626   E31B   3EFF             MVI     A,0FFH          ;ELSE BAD CHAR, SET A > 10H
627   E31D   C9               RET                     ;AND RETURN
628                   ;
629                   ;HERE IS A ROUTINE TO CONVERT BOTH OF TWO POSSIBLE
630                   ;VALUES IN ABUF INTO BINARY BASED ON THE CURRENT MODE
631                   ;SETTING, AND PLACE THEM INTO BBUF AND BBUF+2
632                   ;
633   E31E   01DFD0   LE31E:  LXI     B,ABUF          ;POINT TO THE 1ST OPERAND
634   E321   CDF3E2           CALL    EMODE           ;CONVERT IT
635   E324   D8               RC                      ;RETURN W/CARRY SET ON ERROR
636   E325   22EFD0           SHLD    BBUF            ;PUT VALUE IN BBUF
637   E328   01E6D0           LXI     B,ABUF+7        ;POINT TO 2ND VALUE
638   E32B   CDF3E2           CALL    EMODE           ;CONVERT IT
6391
640 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
641+                                                      21:15  07/30/2018
642+                                                                                      PAGE 12
643
644
645
646   E32E   D8               RC                      ;RETURN W/CARRY SET ON ERROR
647   E32F   22F1D0           SHLD    BBUF+2          ;PUT IT IN THE BINARY BUFFER
648   E332   C9               RET                     ;DONE
649                   ;
650                   ;OCTAL TO BINARY CONVERSION
651                   ;
652   E333   210000   AOCT:   LXI     H,0             ;START W/ZERO
653   E336   0A       LE336:  LDAX    B               ;GET A CHAR
654   E337   B7               ORA     A               ;ZERO ?
655   E338   C8               RZ                      ;DONE THEN, RETURN
656   E339   29               DAD     H               ;MULT H,L BY TWO
657   E33A   29               DAD     H               ;AGAIN - NOW 4X ORIG VALU
658   E33B   29               DAD     H               ;AGAIN - NOW 8X ORIG VALU
659   E33C   D630             SUI     30H             ;CONVERT ASCII DIGIT TO BINARY
660   E33E   FE08             CPI     8               ;LEGAL VALUE ?
661   E340   3F               CMC                     ;SET CARRY FOR PROPER RETURN
662   E341   D8               RC                      ;RETURN IF BAD
663   E342   85               ADD     L               ;ELSE ADD IN VALUE
664   E343   6F               MOV     L,A             ;AND PUT IT BACK
665   E344   03               INX     B               ;POINT TO NEXT ASCII DIGIT
666   E345   C336E3           JMP     LE336           ;AND PROCESS IT
667                   ;
668                   ;DECIMAL OUTPUT ROUTINE FOR BINARY NO. IN REG A.
669                   ;
670   E348   CDADE3   DOUT:   CALL    BIND            ;CONVRT A TO DECIMAL IN ADDS
671   E34B   CD7AE5   LE34B:  CALL    LE57A           ;PRINT 1ST TWO CHARS IN ADDS
672   E34E   23               INX     H               ;POINT TO 3RD CHAR IN ADDS
673   E34F   46               MOV     B,M             ;GET IT
674   E350   C3CFD0           JMP     OUT8            ;PRINT IT AND RETURN
675                   ;
676                   ;OCTAL OUTPUT ROUTINE
677                   ;
678   E353   CDC8E3   OOUT:   CALL    BINO            ;CONVERT TO OCTAL IN ADDS
679   E356   C34BE3           JMP     LE34B           ;PUT OUT 3 OCTAL DIGITS AND RET
680                   ;
681                   ;OCTAL FOLLOWED BY SPACE
682                   ;
683   E359   CD53E3   OOTB:   CALL    OOUT            ;PUT OUT OCTAL NO.
684   E35C   0620     LE35C:  MVI     B,' '           ;GET A SPACE
685   E35E   C3CFD0           JMP     OUT8            ;PUT IT OUT
686                   ;
687                   ;OUTPUT NUMBER OF SPACES IN REG C
688                   ;
689   E361   CD5CE3   BLKO:   CALL    LE35C           ;PUT OUT A SPACE
690   E364   0D               DCR     C               ;DECREMENT COUNT
691   E365   C261E3           JNZ     BLKO            ;PUT OUT MORE IF NOT DONE
692   E368   C9               RET                     ;ELSE RETURN
693                   ;
694                   ;COMPARE THE ADDRESSES AT BBUF AND BBUF+2
695                   ;INCREMENT THE ADDR AT BBUF AND RET CARRY SET IF SAME
696                   ;USED BY DUMP COMMAND TO TEST FOR END
6971
698 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
699+                                                      21:15  07/30/2018
700+                                                                                      PAGE 13
701
702
703
704                   ;
705   E369   2AEFD0   ACHK:   LHLD    BBUF            ;GET 1ST ADDRESS
706   E36C   3AF2D0           LDA     BBUF+3          ;GET HIGH BYTE OF 2ND ADDR
707   E36F   BC               CMP     H               ;COMPARE HIGH ORDER BYTES
708   E370   C27BE3           JNZ     ACH1            ;BBUF LOWER, INR IT & GO HOME
709   E373   3AF1D0           LDA     BBUF+2          ;GET 2ND ADDR LOW BYTE
710   E376   BD               CMP     L               ;COMPARE TWO ADDR.
711   E377   C27BE3           JNZ     ACH1            ;BBUF LOWER, INR IT & GO HOME
712   E37A   37               STC                     ;ADDR. ARE SAME, SET CARRY
713   E37B   23       ACH1:   INX     H               ;INCREMENT BBUF ADDR
714   E37C   22EFD0           SHLD    BBUF            ;PUT IT BACK
715   E37F   C9               RET                     ;DONE
716                   ;
717                   ;PRINT CHARACTERS UNTIL A CAR. RET. FOUND
718                   ;
719   E380   AF       SCRN:   XRA     A               ;BINARY ZERO
720   E381   32FFD0           STA     XOUT            ;LAST CHAR OUTPUT
721   E384   46               MOV     B,M             ;GET A CHARACTER
722   E385   3E0D             MVI     A,0DH           ;CAR. RETRN TO A.
723   E387   B8               CMP     B               ;CHAR IN B = C/R ?
724   E388   C8               RZ                      ;YES - DONE
725   E389   CDCFD0           CALL    OUT8            ;NO - OUTPUT IT & MOV TO A
726   E38C   23               INX     H               ;INCREMENT POINTER
727   E38D   C381E3           JMP     SCRN+1          ;UPDATE XOUT AND DO NEXT CHAR
728                   ;
729                   ;CONVERT BINARY TO HEX ASCII & STORE
730                   ;
731   E390   21D4D0   BINH:   LXI     H,ADDS          ;DESTINATION FOR ASCII
732   E393   47               MOV     B,A             ;SAVE CHAR IN B
733   E394   1F               RAR                     ;MOVING HIGH ORDER NIBBLE TO
734   E395   1F               RAR                     ;LOW ORDER NIBBLE
735   E396   1F               RAR
736   E397   1F               RAR
737   E398   CDA3E3           CALL    BIN1            ;CONVERT TO LETTER OR NO.
738   E39B   77               MOV     M,A             ;STORE IT
739   E39C   23               INX     H               ;INCREMENT DEST. POINTER
740   E39D   78               MOV     A,B             ;GET BACK ORIG NO.
741   E39E   CDA3E3           CALL    BIN1            ;CONVERT LOW ORDER NIBBLE TO NO
742   E3A1   77               MOV     M,A             ;PUT IT IN MEMORY
743   E3A2   C9               RET                     ;DONE
744                   ;
745                   ;CONVERT LOW ORDER NIBBLE OF A TO HEX ASCII
746                   ;
747   E3A3   E60F     BIN1:   ANI     0FH             ;MASK LOW NIBBLE
748   E3A5   C630             ADI     30H             ;CONVERT TO NO.
749   E3A7   FE3A             CPI     '9'+1           ;SEE IF > 9
750   E3A9   D8               RC                      ;IT WASN'T -- DONE
751   E3AA   C607             ADI     7               ;ADD 7 TO GET LETTER
752   E3AC   C9               RET                     ;DONE
753                   ;
754                   ;BINARY TO DECIMAL
7551
756 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
757+                                                      21:15  07/30/2018
758+                                                                                      PAGE 14
759
760
761
762                   ;
763   E3AD   21D4D0   BIND:   LXI     H,ADDS          ;POINT TO DESTINATION
764   E3B0   0664             MVI     B,100           ;DOING SUCCESSIVE SUBTRACTIONS
765   E3B2   CDBEE3           CALL    BID1            ;SUBTRACT & KEEP COUNT
766   E3B5   060A             MVI     B,10            ;NOW WORK WITH TENS
767   E3B7   CDBEE3           CALL    BID1            ;MORE SUBTRACTIONS
768   E3BA   C630             ADI     30H             ;CONVERT UNITS TO DECIMAL ASCII
769   E3BC   77               MOV     M,A             ;STORE UNITS DIGIT IN MEMORY
770   E3BD   C9               RET                     ;DONE
771   E3BE   362F     BID1:   MVI     M,'0'-1
772   E3C0   34               INR     M               ;INCR COUNT OF SUBTRACTIONS
773   E3C1   90               SUB     B               ;DO A SUBTRACTION
774   E3C2   D2C0E3           JNC     BID1+2          ;DO IT AGAIN IF ANS > 0
775   E3C5   80               ADD     B               ;IF ANS < 0, UN-SUBTRACT
776   E3C6   23               INX     H               ;INCREMENT DEST. POINTER
777   E3C7   C9               RET                     ;DIGIT STORED
778                   ;
779                   ;BINARY TO OCTAL
780                   ;
781                   ;NOTE THAT THE CARRY IS USED, SO THE MAX SINGLE BYTE OCTAL
782                   ;VALUE THAT CAN BE HANDLED IS 777 NOT 377.  THIS FEATURE IS
783                   ;USED IN THE DUMP ROUTINE.
784                   ;
785   E3C8   21D4D0   BINO:   LXI     H,ADDS          ;GET DEST. POINTER
786   E3CB   47               MOV     B,A             ;SAVE ORIG NO. IN B
787   E3CC   17               RAL                     ;HIGH ORDER BITS & CARRY
788   E3CD   17               RAL                     ;MOVING TO LOW ORDER 3 BITS
789   E3CE   17               RAL                     ;
790   E3CF   E607             ANI     7               ;MASK TO 3 BITS
791   E3D1   C630             ADI     30H             ;CONVERT TO ASCII
792   E3D3   77               MOV     M,A             ;STORE IN MEMORY
793   E3D4   78               MOV     A,B             ;GET ORIG. NO.
794   E3D5   1F               RAR                     ;MOVE MIDDLE 3 BITS
795   E3D6   1F               RAR                     ;TO LOW ORDER 3 BITS
796   E3D7   1F               RAR
797   E3D8   E607             ANI     7               ;AND MASK THEM OUT
798   E3DA   C630             ADI     30H             ;CONVERT TO ASCII
799   E3DC   23               INX     H               ;INCREMENT MEMORY POINTER
800   E3DD   77               MOV     M,A             ;AND PUT DIGIT IN MEMORY
801   E3DE   78               MOV     A,B             ;GET ORIGINAL DIGIT AGAIN
802   E3DF   E607             ANI     7               ;MASK TO LOW ORDER 3 BITS
803   E3E1   C630             ADI     30H             ;CONVERT TO ASCII
804   E3E3   23               INX     H               ;INCREMENT MEMORY POINTER
805   E3E4   77               MOV     M,A             ;AND STORE IN MEMORY
806   E3E5   C9               RET                     ;DONE
807                   ;
808                   ;HERE IS THE ALS-8 COMMAND TABLE
809                   ;
810   E3E6   4C495354 CTAB:   DB      'LIST'
811   E3EA   E9DB             DB      (LIST SHR 8) AND 0FFH, LIST AND 0FFH
812   E3EC   54455854         DB      'TEXT'
8131
814 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
815+                                                      21:15  07/30/2018
816+                                                                                      PAGE 15
817
818
819
820   E3F0   E9DC             DB      (TEXT SHR 8) AND 0FFH, TEXT AND 0FFH
821   E3F2   44454C54         DB      'DELT'
822   E3F6   EA2C             DB      (DELT SHR 8) AND 0FFH, DELT AND 0FFH
823   E3F8   4D4F4445         DB      'MODE'
824   E3FC   E58C             DB      (MODE SHR 8) AND 0FFH, MODE AND 0FFH
825   E3FE   4643484B         DB      'FCHK'
826   E402   E6D3             DB      (FCHK SHR 8) AND 0FFH, FCHK AND 0FFH
827   E404   464F524D         DB      'FORM'
828   E408   E6CC             DB      (FORM SHR 8) AND 0FFH, FORM AND 0FFH
829   E40A   4E464F52         DB      'NFOR'
830   E40E   E6CD             DB      (NFOR SHR 8) AND 0FFH, NFOR AND 0FFH
831   E410   53574348         DB      'SWCH'
832   E414   E0D1             DB      (EORNS SHR 8) AND 0FFH, EORNS AND 0FFH
833   E416   53494D55         DB      'SIMU'
834   E41A   F75C             DB      (SIMU SHR 8) AND 0FFH, SIMU AND 0FFH
835   E41C   00               DB      0
836   E41D   44554D50         DB      'DUMP'
837   E421   E524             DB      (DUMP SHR 8) AND 0FFH, DUMP AND 0FFH
838   E423   45584543         DB      'EXEC'
839   E427   E277             DB      (EXEC SHR 8) AND 0FFH, EXEC AND 0FFH
840   E429   454E5452         DB      'ENTR'
841   E42D   E20D             DB      (ENTR SHR 8) AND 0FFH, ENTR AND 0FFH
842   E42F   46494C45         DB      'FILE'
843   E433   E5B0             DB      (FILE SHR 8) AND 0FFH, FILE AND 0FFH
844   E435   4153534D         DB      'ASSM'
845   E439   EAAF             DB      (ASSM SHR 8) AND 0FFH, ASSM AND 0FFH
846   E43B   41535349         DB      'ASSI'
847   E43F   EAAF             DB      (ASSM SHR 8) AND 0FFH, ASSM AND 0FFH
848   E441   494F4452         DB      'IODR'
849   E445   E0DE             DB      (IODR SHR 8) AND 0FFH, IODR AND 0FFH
850   E447   53544142         DB      'STAB'
851   E44B   EAA3             DB      (STAB SHR 8) AND 0FFH, STAB AND 0FFH
852   E44D   53594D4C         DB      'SYML'
853   E451   E47E             DB      (SYML SHR 8) AND 0FFH, SYML AND 0FFH
854   E453   43555354         DB      'CUST'
855   E457   E4F5             DB      (CUST SHR 8) AND 0FFH, CUST AND 0FFH
856   E459   524E554D         DB      'RNUM'
857   E45D   E769             DB      (RNUM SHR 8) AND 0FFH, RNUM AND 0FFH
858   E45F   464D4F56         DB      'FMOV'
859   E463   E731             DB      (FMOV SHR 8) AND 0FFH, FMOV AND 0FFH
860   E465   45444954         DB      'EDIT'
861   E469   FA0B             DB      (TXT2 SHR 8) AND 0FFH, TXT2 AND 0FFH
862   E46B   4155544F         DB      'AUTO'
863   E46F   F96A             DB      (AUTO SHR 8) AND 0FFH, AUTO AND 0FFH
864   E471   46494E44         DB      'FIND'
865   E475   FF3B             DB      (FIND2 SHR 8) AND 0FFH, FIND2 AND 0FFH
866   E477   5445524D         DB      'TERM'
867   E47B   F3E4             DB      (TERM SHR 8) AND 0FFH, TERM AND 0FFH
868   E47D   00               DB      0
869                   ;
870                   ;SYSTEM SYMBOL TABLE ROUTINES
8711
872 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
873+                                                      21:15  07/30/2018
874+                                                                                      PAGE 16
875
876
877
878                   ;
879   E47E   21E8D1   SYML:   LXI     H,IBUF+4        ;POINT TO FIFTH CHAR
880   E481   7E               MOV     A,M             ;GET IT
881   E482   FE45             CPI     'E'             ;SYMLE - ENTER INTO TABLE ?
882   E484   CAABE4           JZ      LE4AB           ;YES - MAKE AN ENTRY
883   E487   FE44             CPI     'D'             ;SYMLD - DELETE FROM TABLE ?
884   E489   CAB4E4           JZ      LE4B4           ;YES - DELETE IT THEN
885                   ;
886                   ;PRINT CONTENTS OF SYSTEM SYMBOL TABLE
887                   ;
888   E48C   2100D3           LXI     H,SYSYM         ;POINT TO SYSTEM SYMBOL TABLE
889   E48F   3E04     LE48F:  MVI     A,4             ;PRINT 4 ACROSS
890   E491   32F3D0           STA     CCNT            ;SAVE AS COUNT
891   E494   CD16E2           CALL    CRLF            ;START ON NEW LINE
892   E497   7E       LE497:  MOV     A,M             ;GET 1ST CHAR
893   E498   B7               ORA     A               ;END OF TABLE ?
894   E499   CAEEE4           JZ      LE4EE           ;THEN PRINT END ADDRESS
895   E49C   CDA8EE           CALL    LEEA8           ;PRINT 1 SYMBOL & VALUE
896   E49F   13               INX     D               ;POINT TO NEXT SYMBOL
897   E4A0   21F3D0           LXI     H,CCNT          ;POINT AT COUNT
898   E4A3   35               DCR     M               ;DCR NO LEFT THIS LINE
899   E4A4   EB               XCHG                    ;TABLE POINTER TO H,L
900   E4A5   C297E4           JNZ     LE497           ;PRINT MORE THIS LINE
901   E4A8   C38FE4           JMP     LE48F           ;OR START NEW LINE
902                   ;
903                   ;ENTER NEW SYMBOL INTO TABLE
904                   ;
905   E4AB   CD1CE5   LE4AB:  CALL    VCHK            ;CHECK FOR VALID VALUE & NAME
906   E4AE   CDCEE4   LE4AE:  CALL    LE4CE           ;VALIDATE NAME & MOVE TO ABUF
907   E4B1   C3E2EC           JMP     LECE2           ;PUT SYMBOL INTO TABLE
908                   ;
909                   ;DELETE SYMBOL
910                   ;
911   E4B4   CDAEE4   LE4B4:  CALL    LE4AE           ;H,L POINTS TO VALUE ON RET
912   E4B7   23       LE4B7:  INX     H               ;POINT TO 2ND CHAR OF VALUE
913   E4B8   23               INX     H               ;POINT TO NEXT SYMBOL
914   E4B9   EB               XCHG                    ;D,E POINT AT SYM. AFTR DELETED
915   E4BA   21F9FF           LXI     H,-(NMLEN+2)    ;SYMBOL TABLE ENTRY LENGTH
916   E4BD   19               DAD     D               ;H,L POINTS AT BEG. OF ENTRY
917   E4BE   1A               LDAX    D               ;GET CHAR FROM TABLE ENTRY
918   E4BF   B7       LE4BF:  ORA     A               ;SET FLAGS
919   E4C0   0607             MVI     B,(NMLEN+2)     ;ENTRY LENGTH
920   E4C2   77       LE4C2:  MOV     M,A             ;MOVE CHAR UP IN TABLE
921   E4C3   C8               RZ                      ;IF END OF TABLE MOVED
922   E4C4   23               INX     H               ;INR DEST. POINTER
923   E4C5   13               INX     D               ;INR SOURCE POINTER
924   E4C6   1A               LDAX    D               ;GET NEXT CHAR FROM SYMBOL
925   E4C7   05               DCR     B               ;COUNT OF CHRS THIS SYMBOL
926   E4C8   C2C2E4           JNZ     LE4C2           ;IF NOT DONE THIS SYMBOL
927   E4CB   C3BFE4           JMP     LE4BF           ;TO MOVE NEXT SYMBOL UP
928                   ;
9291
930 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
931+                                                      21:15  07/30/2018
932+                                                                                      PAGE 17
933
934
935
936                   ;ROUTINE TO VALIDATE A SYMBOL NAME & MOVE IT TO ABUF
937                   ;
938   E4CE   CD6AE2   LE4CE:  CALL    ZBUF            ;BLANK OUT ABUF
939   E4D1   EB               XCHG                    ;H,L POINT TO START OF ABUF
940   E4D2   22D4D0           SHLD    ADDS            ;SAVE ADDRESS
941   E4D5   11D7D0           LXI     D,FBUF          ;POINT AT FILE-NAME BUFFER
942   E4D8   EB               XCHG                    ;H,L=FBUF & D,E=ABUF
943   E4D9   AF               XRA     A               ;GET A ZERO
944   E4DA   32DCD0           STA     FREAD           ;SAVE AS 1ST FREE ADDRESS
945   E4DD   7E               MOV     A,M             ;GET 1ST CHAR OF NAME
946   E4DE   B7               ORA     A               ;ZERO ?
947   E4DF   CADDE7           JZ      WHAT            ;ERROR IF NO NAME GIVEN
948   E4E2   CD54F1           CALL    LF154           ;MOVE THE NAME IF IT'S VALID
949   E4E5   FE21             CPI     21H             ;MAKE SURE SPACE FOLLOWS NAME
950   E4E7   D2DDE7           JNC     WHAT            ;ERROR IF SPACE DOESN'T FOLLOW
951   E4EA   2AEFD0           LHLD    BBUF            ;GET VALUE
952   E4ED   C9               RET                     ;RETURN W/VALUE IN H,L
953                   ;
954                   ;DO A CR/LF AND PRINT ASCII CONTENTS OF ADDR POINTED TO BY H,L
955                   ;
956   E4EE   EB       LE4EE:  XCHG                    ;POINTER FROM D,E TO H,L
957   E4EF   CD16E2           CALL    CRLF            ;START ON NEW LINE
958   E4F2   C35CE5           JMP     ADOUT           ;PRINT ADDR POINTED TO BY H,L
959                   ;
960                   ;CUSTOM COMMAND TABLE MANAGEMENT
961                   ;
962   E4F5   21E8D1   CUST:   LXI     H,IBUF+4        ;POINT AT 5TH CHAR
963   E4F8   7E               MOV     A,M             ;GET IT
964   E4F9   FE45             CPI     'E'             ;ENTER NEW CUST. COMMAND ?
965   E4FB   CA09E5           JZ      LE509           ;YES - DO IT
966   E4FE   FE44             CPI     'D'             ;DELETE CUSTOM COMMAND ?
967   E500   CA04E0           JZ      LE004           ;YES - DO IT
968   E503   215CD2           LXI     H,CUCOM         ;POINT AT CUSTOM COMMAND TABLE
969   E506   C38FE4           JMP     LE48F           ;PRINT USING SYML ROUTINES
970                   ;
971                   ;ENTER AND DELETE MOSTLY USE SYMLE & SYMLD CODE
972                   ;
973   E509   CD1CE5   LE509:  CALL    VCHK            ;MAKE SURE VALUE GIVEN
974   E50C   CDCEE4   LE50C:  CALL    LE4CE           ;VALIDATE NAME & MOVE TO ABUF
975   E50F   115CD2           LXI     D,CUCOM         ;D,E POINT AT CUST. TABLE
976   E512   C3E5EC           JMP     LECE5           ;PUT VALUE INTO TABLE
977                   ;
978                   ;ROUTINE TO EXTRACT VALUES FROM COMMAND LINE & REPORT AN ERROR
979                   ;
980   E515   CD81E2   VALC:   CALL    ETRA            ;ETRA DOES THE REAL WORK
981   E518   DADDE7           JC      WHAT            ;IF AN ERROR OCCURED
982   E51B   C9               RET                     ;DONE, NO ERROR
983                   ;
984                   ;ROUTINE TO VERIFY THAT REQUIRED PARAMETERS WERE ENTERED
985                   ;
986   E51C   3ADFD0   VCHK:   LDA     ABUF            ;GET 1ST CHAR OF ABUF
9871
988 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
989+                                                      21:15  07/30/2018
990+                                                                                      PAGE 18
991
992
993
994   E51F   B7               ORA     A               ;ZERO ?
995   E520   CADDE7           JZ      WHAT            ;ERROR - REQD. PARM. OMITTED
996   E523   C9               RET                     ;DONE
997                   ;
998                   ;THE DUMP COMMAND
999                   ;
1000   E524   CD1CE5   DUMP:   CALL    VCHK            ;MAKE SURE ADDRESS GIVEN
1001   E527   3E10             MVI     A,16            ;16 VALUES PER LINE
1002   E529   32F3D0           STA     CCNT            ;SAVE AS COUNT
1003   E52C   CD16E2   LE52C:  CALL    CRLF            ;START NEW LINE
1004   E52F   2AEFD0           LHLD    BBUF            ;GET ADDRESS
1005   E532   EB               XCHG                    ;DO D,E
1006   E533   CD5CE5           CALL    ADOUT           ;PRINT ADDRESS ON LEFT OF LINE
1007   E536   063A             MVI     B,':'           ;FOLLOW ADDRESS WITH COLON
1008   E538   CDCFD0           CALL    OUT8            ;PRINT IT
1009   E53B   CD5CE3           CALL    LE35C           ;PUT OUT A SPACE
1010   E53E   3AF3D0           LDA     CCNT            ;GET COUNT OF ADDRS/LINE
1011   E541   32F4D0   LE541:  STA     DCNT            ;SAVE AS DUMP COUNT
1012   E544   2AEFD0           LHLD    BBUF            ;GET ADDR TO DUMP
1013   E547   7E               MOV     A,M             ;GET DATA AT THAT ADDR
1014   E548   CD6FE5           CALL    DUMO            ;PRINT ITS VALUE
1015   E54B   CD5CE3           CALL    LE35C           ;PUT A SPACE OUT
1016   E54E   CD69E3           CALL    ACHK            ;COMPARE BBUF & BBUF+2
1017   E551   D8               RC                      ;REACHED END ADDRS. - DONE
1018   E552   3AF4D0           LDA     DCNT            ;ELSE GET DUMP COUNT
1019   E555   3D               DCR     A               ;DCR COUNT BYTES LEFT THIS LINE
1020   E556   C241E5           JNZ     LE541           ;DO MORE BYTES ON THIS LINE
1021   E559   C32CE5           JMP     LE52C           ;DO ANOTHER LINE
1022                   ;
1023                   ;ROUTINE TO PUT OUT AN ADDRESS
1024                   ;
1025                   ;NOTE THAT THIS ROUTINE TAKES ADVANTAGE (?) OF THE FACT THAT
1026                   ;BINO USES THE CARRY BIT TO OUTPUT A SINGLE BYTE IN A AS
1027                   ;XXX WHERE XXX MAY BE 777 (INCLUDING CARRY) AND IS NOT
1028                   ;LIMITED TO 377.  ADDRESSES THUS COME OUT AS A SINGLE 16 BIT
1029                   ;NUMBER RATHER THAN IN THE MORE COMMON "SPLIT OCTAL" CONSISTING
1030                   ;OF TWO SEPERATE 8 BIT QUANTITIES WITH A MAX VALUE OF 377 EACH.
1031                   ;
1032   E55C   3A2FD1   ADOUT:  LDA     SMODE           ;GET CURRENT MODE
1033   E55F   B7               ORA     A               ;CLEAR CARRY & SET ZERO FLAG
1034   E560   7A               MOV     A,D             ;HIGH ORDER BYTE TO A
1035   E561   CA65E5           JZ      LE565           ;SKIP NEXT PART IF BASE HEX
1036   E564   1F               RAR                     ;LOW ORDER BIT TO CARRY FOR OCT
1037   E565   57       LE565:  MOV     D,A             ;RESTORE HIGH ORDER BYTE
1038   E566   17               RAL                     ;SHIFT LEFT 1 BIT THRU ACCUM.
1039   E567   4F               MOV     C,A             ;LOW BIT/CARRY IN C FOR OCTAL
1040   E568   7A               MOV     A,D             ;GET HIGH ORDER BYTE
1041   E569   CD6FE5           CALL    DUMO            ;OUTPUT USING CURRENT MODE
1042   E56C   79               MOV     A,C             ;FOR OCTAL, GET ORIG HIGH BYTE
1043   E56D   1F               RAR                     ;SET CARRY BIT
1044   E56E   7B               MOV     A,E             ;GET LOW ORDER BYTE
10451
1046 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1047+                                                      21:15  07/30/2018
1048+                                                                                      PAGE 19
1049
1050
1051
1052   E56F   212FD1   DUMO:   LXI     H,SMODE         ;POINT TO MODE
1053   E572   46               MOV     B,M             ;GET IT
1054   E573   05               DCR     B               ;DECR (OCTAL MODE = 1)
1055   E574   CA53E3           JZ      OOUT            ;FOR OCTAL
1056   E577   CD90E3   HOUT:   CALL    BINH            ;CONVERT BIN TO HEX IN ADDS
1057   E57A   21D4D0   LE57A:  LXI     H,ADDS          ;BUFFER WHERE CHARS STORED
1058   E57D   46               MOV     B,M             ;GET CHAR IN B
1059   E57E   CDCFD0           CALL    OUT8            ;PRINT A HEX ASCII CHAR
1060   E581   23               INX     H               ;INX POINTER
1061   E582   46               MOV     B,M             ;GET NEXT CHAR
1062   E583   C3CFD0           JMP     OUT8            ;PRINT IT & GO HOME
1063   E586   CD77E5   HOTB:   CALL    HOUT            ;PUT OUT HEX
1064   E589   C35CE3           JMP     LE35C           ;PUT OUT SPACE & GO HOME
1065                   ;
1066                   ;MODE - USED TO SET THE OUTPUT MODE
1067                   ;
1068   E58C   CD1CE5   MODE:   CALL    VCHK            ;VERIFY PARAMETER GIVEN
1069   E58F   01DFD0           LXI     B,ABUF          ;POINT TO PARAMETER
1070   E592   CDFAE2           CALL    AHEX            ;CONVERT TO BINARY
1071   E595   DADDE7           JC      WHAT            ;IF PARAMETER INVALID
1072   E598   7C               MOV     A,H             ;GET HIGH ORDER BYTE
1073   E599   B7               ORA     A               ;SET FLAGS
1074   E59A   C2DDE7           JNZ     WHAT            ;PARM. MUST BE < 256
1075   E59D   0600             MVI     B,0             ;ASSUME HEX SPECIFIED
1076   E59F   7D               MOV     A,L             ;GET LOW ORDER PARMATER
1077   E5A0   FE16             CPI     16H             ;IS PARAMETER 16 ?
1078   E5A2   CAABE5           JZ      LE5AB           ;YES - STORE 0 AS MODE
1079   E5A5   04               INR     B               ;MAKE B = MODE = 1
1080   E5A6   FE08             CPI     8               ;IS PARAMETER 8 ?
1081   E5A8   C2DDE7           JNZ     WHAT            ;MUST BE EITHER 8 OR 16
1082   E5AB   78       LE5AB:  MOV     A,B             ;GET MODE (REG B)
1083   E5AC   322FD1           STA     SMODE           ;MAKE IT THE MODE
1084   E5AF   C9               RET                     ;WE ARE DONE
1085                   ;
1086                   ;PROCESS THE FILE COMMANDS
1087                   ;
1088   E5B0   3AD7D0   FILE:   LDA     FBUF            ;GET 1ST CHAR OF FILE NAME
1089   E5B3   B7               ORA     A               ;SET FLAGS
1090   E5B4   CA18E6           JZ      FOUT            ;NO NAME GIVEN - DO A LISTING
1091   E5B7   CD8AE6           CALL    FSEA            ;LOOK UP FILE
1092   E5BA   EB               XCHG                    ;D,E HAS ADDR OF DIR. ENTRY
1093   E5BB   C2D2E5           JNZ     TEST            ;IF DIR. ENTRY FOUND
1094                   ;
1095                   ;ENTRY MATCHING FBUF NOT FOUND
1096                   ;
1097   E5BE   3ADFD0           LDA     ABUF            ;CHECK FOR PARAMETER GIVEN
1098   E5C1   B7               ORA     A               ;SET FLAGS
1099   E5C2   CADDE7           JZ      WHAT            ;ADDR. REQUIRED FOR NEW FILE
1100                   ;
1101                   ;CHECK FOR ROOM TO ADD A NEW FILE
1102                   ;
11031
1104 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1105+                                                      21:15  07/30/2018
1106+                                                                                      PAGE 20
1107
1108
1109
1110   E5C5   3ADED0           LDA     FEF             ;GET FREE ENTRY FOUND FLAG
1111   E5C8   B7               ORA     A               ;SET FLAGS
1112   E5C9   C2E7E5           JNZ     ROOM1           ;TO ADD THE NEW FILE
1113   E5CC   21F7E7   LE5CC:  LXI     H,EMES1         ;POINT TO ERROR MESSAGE
1114   E5CF   C3E0E7           JMP     MESS            ;PRINT IT
1115                   ;
1116                   ;ENTRY MATCHING FBUF FOUND
1117                   ;
1118   E5D2   3ADFD0   TEST:   LDA     ABUF            ;SEE IF PARAMETER GIVEN
1119   E5D5   B7               ORA     A               ;SET FLAGS
1120   E5D6   CAEAE5           JZ      SWAPS           ;NO PARMS - MAKE IT CUR FILE
1121   E5D9   2AEFD0           LHLD    BBUF            ;GET BINARY VALU OF PARM
1122   E5DC   7C               MOV     A,H             ;HIGH ORDER BYTE
1123   E5DD   B5               ORA     L               ;SEE IF PARM IS ZERO
1124   E5DE   CAEAE5           JZ      SWAPS           ;TO DELETE THE FILE
1125   E5E1   21FCE7   LE5E1:  LXI     H,EMES2         ;CAN'T RESPECIFY EXISTING FILE
1126   E5E4   C3E0E7           JMP     MESS            ;TELL IT TO THE OPERATOR
1127                   ;
1128                   ;CREATE NEW FILE - NAME IS IN FBUF
1129                   ;FREAD POINTS TO A FREE DIRECTORY ENTRY
1130                   ;
1131   E5E7   CD76E6   ROOM1:  CALL    ROOM            ;MOVE NAME IN FBUF TO DIRECTORY
1132                   ;
1133                   ;MAKE FILE POINTED TO BY D,E CURRENT
1134                   ;
1135   E5EA   2100D0   SWAPS:  LXI     H,FILE0         ;POINT H,L TO CUR FILE
1136   E5ED   0E0D             MVI     C,FELEN         ;BYTE COUNT
1137   E5EF   1A       SWAP:   LDAX    D               ;GET A BYTE FROM NEW CUR FILE
1138   E5F0   46               MOV     B,M             ;GET BYTE FROM CUR CUR FILE
1139   E5F1   77               MOV     M,A             ;NEW CUR FILE BYTE TO FILE 0
1140   E5F2   78               MOV     A,B             ;EXCHANGE
1141   E5F3   12               STAX    D               ;CUR CUR FILE BYTE TO FREAD
1142   E5F4   13               INX     D               ;INR NON-CURRENT FILE POINTER
1143   E5F5   23               INX     H               ;INR FILE 0 POINTER
1144   E5F6   0D               DCR     C               ;COUNT OF BYTES TO MOVE
1145   E5F7   C2EFE5           JNZ     SWAP            ;IF NOT DONE SWAPPING ENTRIES
1146                   ;
1147                   ;CHECK FOR 2ND PARAMETER (ADDRESS)
1148                   ;
1149   E5FA   3ADFD0           LDA     ABUF            ;GET 2ND PARAMETER 1ST CHAR
1150   E5FD   B7               ORA     A               ;SET FLAGS
1151   E5FE   CA18E6           JZ      FOUT            ;NONE GIVEN
1152                   ;
1153                   ;PROCESS 2ND PARAMETER
1154                   ;
1155   E601   2AEFD0           LHLD    BBUF            ;GET 2ND PARAMETER ADDRESS
1156   E604   2205D0           SHLD    BOFP            ;MAKE IT BEG OF FILE POINTER
1157   E607   2207D0           SHLD    EOFP            ;AND END OF FILE POINTER
1158   E60A   7D               MOV     A,L             ;TEST FOR ADDR = 0
1159   E60B   B4               ORA     H               ;
1160   E60C   CA11E6           JZ      FIL35           ;YES - DELETE IT
11611
1162 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1163+                                                      21:15  07/30/2018
1164+                                                                                      PAGE 21
1165
1166
1167
1168   E60F   3601             MVI     M,1             ;NO - PUT EOF MARK AT BOFP
1169   E611   AF       FIL35:  XRA     A               ;BINARY ZERO
1170   E612   3209D0           STA     MAXL            ;AT MAX. LINE NO.
1171   E615   C325E6           JMP     FOOT            ;OUTPUT PARAMETERS
1172                   ;
1173                   ;LIST 1 OR MORE FILES & THEIR PARAMETERS
1174                   ;
1175   E618   CD16E2   FOUT:   CALL    CRLF            ;DO A CR/LF
1176   E61B   3AE8D1           LDA     IBUF+4          ;GET OPT. 5TH CHAR
1177   E61E   FE53             CPI     'S'             ;WAS COMMAND FILES ?
1178   E620   0E06             MVI     C,MAXFIL        ;MAX NO OF FILES
1179   E622   CA27E6           JZ      FOUL            ;YES - LIST ALL FILES
1180   E625   0E01     FOOT:   MVI     C,1             ;ELSE LIST ONLY 1 FILE
1181                   ;
1182                   ;LIST PARMS. FOR NO OF FILES IN REG C.
1183                   ;
1184   E627   2100D0   FOUL:   LXI     H,FILE0         ;POINT TO DIRECTORY
1185   E62A   79       LE62A:  MOV     A,C             ;GET NO FILES LEFT TO LIST
1186   E62B   32DED0   FINE:   STA     FOCNT           ;SAVE AS FILE OUTPUT COUNT
1187   E62E   E5               PUSH    H               ;SAVE DIRECTORY POINTER
1188   E62F   110500           LXI     D,NMLEN         ;NAME LENGTH
1189   E632   19               DAD     D               ;POINT AT FILES BOFP
1190   E633   7E               MOV     A,M             ;GET 1ST BYTE OF BOFP
1191   E634   B7               ORA     A               ;ZERO ?
1192   E635   C245E6           JNZ     FOOD            ;NO - LIST IT
1193   E638   23               INX     H               ;POINT AT 2ND BYTE OF BOFP
1194   E639   86               ADD     M               ;ADD TO 1ST BYTE
1195   E63A   23               INX     H               ;POINT TO EOFP 1ST BYTE
1196   E63B   C245E6           JNZ     FOOD            ;BOFP NON ZERO - LIST IT
1197   E63E   33               INX     SP              ;TO "UN-PUSH" H,L
1198   E63F   33               INX     SP              ;
1199   E640   23               INX     H               ;POINT TO 2ND BYTE OF EOFP
1200   E641   23               INX     H               ;POINT TO MAXL
1201   E642   C35AE6           JMP     FEET            ;TO GO TO NEXT ENTRY
1202                   ;
1203                   ;HAVE A VALID ENTRY TO OUTPUT
1204                   ;
1205   E645   E1       FOOD:   POP     H               ;GET POINTER TO FILES NAME
1206   E646   CD16E2           CALL    CRLF            ;START IT ON A FRESH LINE
1207   E649   0E05             MVI     C,NMLEN         ;LENGTH
1208   E64B   46       FAST:   MOV     B,M             ;GET A CHAR OF NAME
1209   E64C   CDCFD0           CALL    OUT8            ;PRINT IT
1210   E64F   0D               DCR     C               ;DECREMENT COUNT
1211   E650   23               INX     H               ;POINT TO NEXT CHAR
1212   E651   C24BE6           JNZ     FAST            ;PRINT REMAINING CHARS IF ANY
1213   E654   CD66E6           CALL    LE666           ;PRINT SPACE, BOFP, SPACE
1214   E657   CD66E6           CALL    LE666           ;PRINT SPACE, EOFP, SPACE
1215   E65A   110400   FEET:   LXI     D,FELEN-NMLEN-4 ;LENGTH OF MAXL
1216   E65D   19               DAD     D               ;POINT AT NEXT FILE ENTRY
1217   E65E   3ADED0           LDA     FOCNT           ;PRINTING 1 OR ALL ?
1218   E661   3D               DCR     A               ;DECR. COUNT
12191
1220 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1221+                                                      21:15  07/30/2018
1222+                                                                                      PAGE 22
1223
1224
1225
1226   E662   C22BE6           JNZ     FINE            ;TO PRINT MORE
1227   E665   C9               RET                     ;DONE
1228                   ;
1229                   ;ROUTINE TO PRINT AN ADDRESS
1230                   ;
1231   E666   CD5CE3   LE666:  CALL    LE35C           ;PRINT SPACE
1232   E669   5E               MOV     E,M             ;GET BYTE OF BOFP OR EOFP
1233   E66A   23               INX     H               ;POINT TO 2ND BYTE
1234   E66B   56               MOV     D,M             ;GET IT
1235   E66C   E5               PUSH    H               ;SAVE POINTER INTO FILE DIR.
1236   E66D   CD5CE5           CALL    ADOUT           ;PRINT ADDRESS
1237   E670   CD5CE3           CALL    LE35C           ;AND TRAILING SPACE
1238   E673   E1               POP     H               ;RESTORE POINTER
1239   E674   23               INX     H               ;POINT TO MAXL
1240   E675   C9               RET                     ;DONE
1241                   ;
1242                   ;MOVE FILE NAME TO BLOCK POINTED TO BY FREAD
1243                   ;
1244   E676   2ADCD0   ROOM:   LHLD    FREAD           ;GET ADDR OF FREE ENTRY
1245   E679   EB               XCHG                    ;TO D,E
1246   E67A   21D7D0           LXI     H,FBUF          ;ADDR OF NAME IN COMMAND
1247   E67D   D5               PUSH    D               ;SAVE DIRECTORY ADDR
1248   E67E   0E05             MVI     C,NMLEN         ;NO CHARS TO MOVE
1249   E680   7E       MOV23:  MOV     A,M             ;GET CHAR FROM COMMAND
1250   E681   12               STAX    D               ;PUT INTO DIRECTORY
1251   E682   13               INX     D               ;INCR. DIR. POINTER
1252   E683   0D               DCR     C               ;DCR CHAR COUNT
1253   E684   23               INX     H               ;INCR. FBUF POINTER
1254   E685   C280E6           JNZ     MOV23           ;MOVE REMAINING CHARS
1255   E688   D1               POP     D               ;RESTORE DIR. POINTER
1256   E689   C9               RET                     ;DONE
1257                   ;
1258                   ;FILE DIRECTORY SEARCH ROUTINE
1259                   ;LOOK FOR ENTRY W/NAME IN FBUF - ZERO SET ==> NOT FOUND
1260                   ;ELSE H,L POINT TO THE ENTRY
1261                   ;ALSO, IF ENTRY FOUND W/BOFP ADDR = 0, SET FEF FLAG > 0
1262                   ;AND FREAD TO THE ADDR OF THAT ENTRY
1263                   ;
1264   E68A   1100D0   FSEA:   LXI     D,FILE0         ;POINT TO DIRECTORY
1265   E68D   AF       LE68D:  XRA     A               ;GET ZERO
1266   E68E   32DED0           STA     FEF             ;ASSUME NO FREE ENTRIES
1267   E691   0606             MVI     B,MAXFIL        ;NO OF ENTRIES IN DIR.
1268   E693   21D7D0   FSE10:  LXI     H,FBUF          ;ADDR OF NAME TO LOOK UP
1269   E696   0E05             MVI     C,NMLEN         ;NO CHARS PER NAME
1270   E698   CD57E2           CALL    SEAR            ;COMPARE CURRENT ENTRY TO FBUF
1271   E69B   F5               PUSH    PSW             ;SAVE RESULTS FLAG
1272   E69C   D5               PUSH    D               ;SAVE DIR POINTER
1273   E69D   1A               LDAX    D               ;GET BYTE OF BOFP ADDR
1274   E69E   B7               ORA     A               ;EMPTY ?
1275   E69F   C2C0E6           JNZ     FSE20           ;NO
1276   E6A2   13               INX     D               ;2ND BYTE
12771
1278 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1279+                                                      21:15  07/30/2018
1280+                                                                                      PAGE 23
1281
1282
1283
1284   E6A3   1A               LDAX    D               ;GET IT
1285   E6A4   B7               ORA     A               ;SET FLAGS
1286   E6A5   C2C0E6           JNZ     FSE20           ;NOT ZERO
1287   E6A8   EB               XCHG                    ;DIR POINTER TO H,L
1288   E6A9   11FAFF           LXI     D,-NMLEN-1      ;
1289   E6AC   19               DAD     D               ;POINT BACK TO EMPTY ENTRY
1290   E6AD   22DCD0           SHLD    FREAD           ;AND SAVE IT'S ADDRESS
1291   E6B0   7A               MOV     A,D             ;D HAPPENS TO BE NON-ZERO
1292   E6B1   32DED0           STA     FEF             ;AND SO NOW IS FEF
1293   E6B4   E1               POP     H               ;RESTORE DIR POINTER TO H,L
1294   E6B5   F1               POP     PSW             ;RESTORE SEAR RESULTS FLAG
1295                   ;
1296                   ;MOVE TO NEXT ENTRY
1297                   ;
1298   E6B6   110800   FSE15:  LXI     D,FELEN-NMLEN
1299   E6B9   19               DAD     D               ;H,L POINTS TO NEXT ENTRY
1300   E6BA   EB               XCHG                    ;ENTRY ADDR TO D,E
1301   E6BB   05               DCR     B               ;COUNT OF FILES IN DIR
1302   E6BC   C8               RZ                      ;NO FILES LEFT TO SEARCH
1303   E6BD   C393E6           JMP     FSE10           ;SEARCH REMAINING FILES
1304                   ;
1305                   ;ENTRY WASN'T FREE, LOOK AT SEAR RESULTS
1306                   ;
1307   E6C0   E1       FSE20:  POP     H               ;RESTORE DIRECTORY POINTER
1308   E6C1   F1               POP     PSW             ;SEAR RESULTS IN FLAG
1309   E6C2   C2B6E6           JNZ     FSE15           ;IT DIDN'T MATCH ANYWAY
1310                   ;
1311                   ;MATCHING ENTRY FOUND WHICH WASN'T FREE
1312                   ;
1313   E6C5   11FBFF           LXI     D,-NMLEN
1314   E6C8   19               DAD     D               ;H,L POINT AT THE DIR. ENTRY
1315   E6C9   7A               MOV     A,D             ;D IS NON-ZERO
1316   E6CA   B7               ORA     A               ;SET FLAGS TO CLEAR ZERO FLAG
1317   E6CB   C9               RET                     ;DONE
1318                   ;
1319                   ;FORM COMMAND TO SET OUTPUT MODE
1320                   ;
1321   E6CC   2F       FORM:   CMA                     ;ALL COMNDS ARE EXEC WITH A=0
1322   E6CD   32FAD0   NFOR:   STA     LFMT            ;
1323   E6D0   C360E0           JMP     EORMS           ;IT'S THAT SIMPLE, FOLKS
1324                   ;
1325                   ;FCHK
1326                   ;
1327   E6D3   2A05D0   FCHK:   LHLD    BOFP            ;GET BEG. OF FILE PTR
1328   E6D6   7C               MOV     A,H             ;SEE IF BOFP IS ZERO
1329   E6D7   B5               ORA     L               ;WOULD IMPLY NO FILES
1330   E6D8   CAE1E5           JZ      LE5E1           ;PRINT ERROR MESSAGE
1331   E6DB   010400           LXI     B,4             ;LENGTH OF LINE NO.
1332   E6DE   09               DAD     B               ;H,L POINTS JUST PAST LINE NO
1333   E6DF   0C               INR     C               ;C = 5 = LINE LEN TO THIS PT.
1334   E6E0   23       LE6E0:  INX     H               ;POINT TO NEXT CHAR
13351
1336 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1337+                                                      21:15  07/30/2018
1338+                                                                                      PAGE 24
1339
1340
1341
1342   E6E1   0C               INR     C               ;LINE LENGTH TO THIS POINT
1343   E6E2   CD2BE7           CALL    LE72B           ;GET TERM WIDTH IN A
1344   E6E5   B9               CMP     C               ;LINE > TERMINAL WIDTH ?
1345   E6E6   DA18E7           JC      LE718           ;YES - ERROR
1346   E6E9   7E               MOV     A,M             ;GET LINE CHAR
1347   E6EA   FE0D             CPI     0DH             ;END OF LINE ?
1348   E6EC   C2E0E6           JNZ     LE6E0           ;KEEP TESTING THIS LINE
1349   E6EF   2A05D0           LHLD    BOFP            ;GET BEG. OF FILE PTR
1350   E6F2   71               MOV     M,C             ;MAKE LENGTH BYTE OK 1ST LINE
1351   E6F3   7E       LE6F3:  MOV     A,M             ;GET LENGTH BYTE
1352   E6F4   FE01             CPI     1               ;END OF FILE ?
1353   E6F6   CA25E7           JZ      LE725           ;TO RESET MAXL
1354   E6F9   FE06             CPI     6               ;MIN LINE LEN (NO. + LEN + CR)
1355   E6FB   DA18E7           JC      LE718           ;REPORT ERROR IF LINE TOO SHORT
1356   E6FE   CD2BE7           CALL    LE72B           ;GET TERMINAL WIDTH IN A
1357   E701   BE               CMP     M               ;COMPARE WITH LENGTH BYTE
1358   E702   4E               MOV     C,M             ;LENGTH BYTE TO C
1359   E703   0D               DCR     C               ;GOING TO COUNT CHARS IN LINE
1360   E704   0D       LE704:  DCR     C               ;COUNT OF ACUTAL CHARS LEFT
1361   E705   23               INX     H               ;POINT TO NEXT CHAR
1362   E706   7E               MOV     A,M             ;GET IT
1363   E707   CA12E7           JZ      LE712           ;COUNT TO 0 - MUST BE C/R
1364   E70A   FE20             CPI     20H             ;IS CHAR CNTL CHAR ?
1365   E70C   DA18E7           JC      LE718           ;CNTL CHARS NOT ALLOWED
1366   E70F   C304E7           JMP     LE704           ;TEST NEXT CHAR IN LINE
1367   E712   FE0D     LE712:  CPI     0DH             ;IS CHAR C/R ?
1368   E714   23               INX     H               ;POINT TO NEXT CHAR
1369   E715   CAF3E6           JZ      LE6F3           ;YES - GO ON, CHECK FOR EOF
1370                   ;
1371                   ;ERROR
1372                   ;
1373   E718   EB       LE718:  XCHG                    ;BAD ADDRESS TO D,E
1374   E719   CD5CE3           CALL    LE35C           ;PRINT A SPACE
1375   E71C   CD5CE5           CALL    ADOUT           ;FOLLOWED BY THE BAD ADDRESS
1376   E71F   2101E8           LXI     H,FERR          ;POINT TO FILE ERROR MESSAGE
1377   E722   C3E0E7           JMP     MESS            ;PRINT THE ERROR MESSAGE
1378   E725   CD50EA   LE725:  CALL    LEA50           ;UPDATE MAXL
1379   E728   C318E6           JMP     FOUT            ;PRINT FILE PARMS & RETURN
1380   E72B   3A8FD1   LE72B:  LDA     TERMW           ;GET TERM WIDTH
1381   E72E   C61B             ADI     -(IBUF+1) AND 0FFH
1382   E730   C9               RET                     ;BINARY TERM WIDTH IN A
1383                   ;
1384                   ;FILE MOVE COMMANDS
1385                   ;
1386   E731   CD1CE5   FMOV:   CALL    VCHK            ;CHECK FOR REQD PARMS
1387   E734   2A05D0           LHLD    BOFP            ;GET BEG OF FILE PTR
1388   E737   EB               XCHG                    ;BOFP TO D,E
1389   E738   2AEFD0           LHLD    BBUF            ;GET DEST ADDR
1390   E73B   2205D0           SHLD    BOFP            ;NEW BEG OF FILE
1391   E73E   7D               MOV     A,L             ;LOW ORDER DEST TO A
1392   E73F   93               SUB     E               ;SUBRACTING CUR BOF FROM NEW
13931
1394 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1395+                                                      21:15  07/30/2018
1396+                                                                                      PAGE 25
1397
1398
1399
1400   E740   7C               MOV     A,H             ;TO SEE WHICH WAY TO MOVE
1401   E741   9A               SBB     D               ;ANSWER NOW IN CARRY FLAG
1402   E742   DA60E7           JC      LE760           ;IF MOVING TO LOWER ADDR
1403                   ;
1404                   ;MOVING TO HIGHER ADDR
1405                   ;
1406   E745   2A07D0           LHLD    EOFP            ;MOVING TO HIGHER ADDR
1407   E748   7D               MOV     A,L             ;GOING TO SUBTRACT CUR (OLD)
1408   E749   93               SUB     E               ;BOFP FROM CUR EOFP & PUT
1409   E74A   4F               MOV     C,A             ;RESULT (FILE LENGTH) IN
1410   E74B   7C               MOV     A,H             ;REG B,C
1411   E74C   9A               SBB     D               ;
1412   E74D   47               MOV     B,A             ;
1413   E74E   2A05D0           LHLD    BOFP            ;GET DEST BEG OF FILE
1414   E751   09               DAD     B               ;ADD LENGTH = NEW END
1415   E752   EB               XCHG                    ;NEW END IN D,E
1416   E753   3602             MVI     M,2             ;PUT 02H AT CUR BEG OF FILE
1417   E755   4E               MOV     C,M             ;AND IN REG C
1418   E756   2A07D0           LHLD    EOFP            ;GET CUR END OF FILE TO H,L
1419   E759   EB               XCHG                    ;CUR EOF=D,E & NEW END H,L
1420   E75A   CD79E9           CALL    RMOV            ;DO THE MOVE
1421   E75D   C365E7           JMP     LE765           ;PUT 02H AT BOF AND FCHK
1422                   ;
1423                   ;MOVING LOWER IN MEMORY
1424                   ;
1425   E760   0E01     LE760:  MVI     C,1             ;LMOV WILL USE 01H AS END MARK
1426   E762   CD70E9           CALL    LMOV            ;DO THE MOVE
1427   E765   71       LE765:  MOV     M,C             ;PUT TERMINATOR MARK IN FILE
1428   E766   C3D3E6           JMP     FCHK            ;FCHK TO UPDATE 1ST L.B. & EOF
1429                   ;
1430                   ;RENUMBER COMMAND
1431                   ;
1432   E769   CD1CE5   RNUM:   CALL    VCHK            ;CHECK FOR REQD. PARAMETERS
1433   E76C   3AE6D0           LDA     ABUF+7          ;SEE IF INCREMENT SPECIFIED
1434   E76F   0605             MVI     B,5             ;DEFAULT INCREMENT
1435   E771   B7               ORA     A               ;SET FLAGS
1436   E772   CA85E7           JZ      LE785           ;NO INCREMENT GIVEN, USE 5
1437   E775   01E6D0           LXI     B,ABUF+7        ;POINT AT GIVEN INCREMENT
1438   E778   CD0AE0           CALL    ADEC            ;CONVERT TO DECIMAL
1439   E77B   DADDE7           JC      WHAT            ;IF ERROR
1440   E77E   7D               MOV     A,L             ;GET INCREMENT
1441   E77F   FE1A             CPI     26              ;MAXIMUM INCREMENT + 1
1442   E781   D2DDE7           JNC     WHAT            ;IF INCREMENT > 25
1443   E784   47               MOV     B,A             ;INCREMENT IN B
1444   E785   2A05D0   LE785:  LHLD    BOFP            ;GET BOF POINTER
1445   E788   22D2D0           SHLD    APNT            ;SAVE
1446   E78B   7E       LE78B:  MOV     A,M             ;GET LENGTH BYTE
1447   E78C   FE01             CPI     1               ;END OF FILE ?
1448   E78E   CAD3E6           JZ      FCHK            ;YES, DONE, DO FCHK
1449   E791   23               INX     H               ;POINT 1ST DIGIT
1450   E792   11DFD0           LXI     D,ABUF          ;STARTING LINE NO. SOURCE
14511
1452 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1453+                                                      21:15  07/30/2018
1454+                                                                                      PAGE 26
1455
1456
1457
1458   E795   0E04             MVI     C,4             ;LENGTH OF LINE NO.
1459   E797   1A       LE797:  LDAX    D               ;GET A DIGIT
1460   E798   77               MOV     M,A             ;PUT IT IN THE LINE
1461   E799   23               INX     H               ;POINT TO NEXT DIGIT
1462   E79A   13               INX     D               ;IN SOURCE, TOO
1463   E79B   0D               DCR     C               ;COUNT OF DIGITS LEFT
1464   E79C   C297E7           JNZ     LE797           ;DO NEXT DIGITS
1465   E79F   2AD2D0           LHLD    APNT            ;GET POINTER TO LINE
1466   E7A2   7E               MOV     A,M             ;GET LENGTH BYTE
1467   E7A3   CD6BE9           CALL    ADR             ;POINT TO NEXT LINE
1468   E7A6   22D2D0           SHLD    APNT            ;UPDATE LINE POINTER
1469   E7A9   2B               DCX     H               ;POINT TO LAST CHR OF PREV LINE
1470   E7AA   7E               MOV     A,M             ;GET IT
1471   E7AB   FE0D             CPI     0DH             ;IS IT A CARRIAGE RET ?
1472   E7AD   C218E7           JNZ     LE718           ;DOING A LITTLE FCHKING HERE
1473   E7B0   21E2D0           LXI     H,ABUF+3        ;POINT TO LSB OF LINE NO.
1474   E7B3   7E               MOV     A,M             ;GET IT
1475   E7B4   80               ADD     B               ;ADD INCREMENT
1476   E7B5   FE3A     LE7B5:  CPI     '9'+1           ;CARRY ?
1477   E7B7   D2CCE7           JNC     LE7CC           ;NO - CONTINUE
1478   E7BA   77               MOV     M,A             ;PUT UPDATED DIGIT BACK
1479   E7BB   3ADFD0           LDA     ABUF            ;GET MSB
1480   E7BE   FE39             CPI     '9'             ;EQUAL 9 ?
1481   E7C0   D4C9E7           CNC     LE7C9           ;IF SO, CHANGE INCREMENT TO 1
1482   E7C3   2AD2D0           LHLD    APNT            ;GET POINTER TO NEXT LINE
1483   E7C6   C38BE7           JMP     LE78B           ;AND DO IT
1484                   ;
1485                   ;CHANGE INCREMENT TO 1 IF NOS. GET TO 9000
1486                   ;
1487   E7C9   0601     LE7C9:  MVI     B,1             ;NEW INCREMENT
1488   E7CB   C9               RET
1489                   ;
1490                   ;GET HERE IF ADDITION GAVE CARRY
1491                   ;
1492   E7CC   0E00     LE7CC:  MVI     C,0             ;C WILL BECOME DECIMAL CARRY
1493   E7CE   0C       LE7CE:  INR     C               ;INR FOR EA SUBTR. OF 10
1494   E7CF   D60A             SUI     10              ;SUB 10 FROM ADDITION RESULT
1495   E7D1   FE3A             CPI     '9'+1           ;RESULT STILL > 9 ?
1496   E7D3   D2CEE7           JNC     LE7CE           ;SUB AGAIN & KEEP CNT OF SUBTR
1497   E7D6   77               MOV     M,A             ;LESS THAN 10 - PUT DIGIT BACK
1498   E7D7   2B               DCX     H               ;POINT TO NEXT MSB
1499   E7D8   7E               MOV     A,M             ;GET IT
1500   E7D9   81               ADD     C               ;ADD CARRY FROM PREV. DIGIT
1501   E7DA   C3B5E7           JMP     LE7B5           ;AND REPEAT THE PROCESS
1502                   ;
1503                   ;GENERAL ERROR MESSAGE ROUTINES
1504                   ;
1505   E7DD   21F1E7   WHAT:   LXI     H,EMES
1506   E7E0   CD16E2   MESS:   CALL    CRLF            ;DO CR/LF
1507   E7E3   E5               PUSH    H               ;SAVE H,L
1508   E7E4   2194D0           LXI     H,SYSIN         ;RESTORE STD I/O DRIVERS
15091
1510 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1511+                                                      21:15  07/30/2018
1512+                                                                                      PAGE 27
1513
1514
1515
1516   E7E7   CD5AE1           CALL    LE15A           ;DO IT
1517   E7EA   E1               POP     H               ;RESTORE H,L
1518   E7EB   CD80E3           CALL    SCRN            ;PRINT THE MSG POINTED TO BY H,L
1519   E7EE   C3CBE0           JMP     LE0CB           ;GO BACK TO ALS-8 COMND MODE
1520                   ;
1521                   ;MESSAGES
1522                   ;
1523   E7F1   57484154 EMES:   DB      'WHAT?', 0DH
1524   E7F5   3F0D
1525   E7F7   46554C4C EMES1:  DB      'FULL', 0DH
1526   E7FB   0D
1527   E7FC   46434F4E EMES2:  DB      'FCON', 0DH
1528   E800   0D
1529   E801   2046494C FERR:   DB      ' FILE ERR', 0DH
1530   E805   45204552
1531   E809   520D
1532                   ;
1533                   ;THIS IS THE PROCESSING PORTION OF THE ENTER COMMAND
1534                   ;
1535   E80B   CD16E2   ENTS:   CALL    CRLF            ;START ON A NEW LINE
1536   E80E   CD72E1           CALL    READ            ;GET A LINE OF INPUT
1537   E811   21E4D1           LXI     H,IBUF          ;POINT TO IT'S START
1538   E814   2201D1           SHLD    PNTR            ;SAVE POINTER
1539   E817   CD6AE2   ENT1:   CALL    ZBUF            ;CLEAR ASCII BUFFER
1540   E81A   CDCCEE           CALL    SBLK            ;SCAN TO CHARACTERS IN IBUF
1541   E81D   DA0BE8           JC      ENTS            ;C/R FOUND, GET ANOTHER LINE
1542   E820   FE2F             CPI     '/'             ;ENTER TERMINATION CHAR ?
1543   E822   C8               RZ                      ;YES - DONE THEN
1544   E823   CD3EF1           CALL    ALPS            ;LOAD ABUF FROM IBUF
1545   E826   EB               XCHG                    ;
1546   E827   01DFD0           LXI     B,ABUF          ;POINT TO THE LOADED BUFR
1547   E82A   3A2FD1           LDA     SMODE           ;GET THE CURRENT MODE
1548   E82D   B7               ORA     A               ;SET FLAGS
1549   E82E   C237E8           JNZ     LE837           ;JUMP IF OCTAL
1550   E831   CDFAE2           CALL    AHEX            ;CONVERT ASCII HEX TO BINARY
1551   E834   C33AE8           JMP     LE83A           ;TO CONTINUE
1552   E837   CD33E3   LE837:  CALL    AOCT            ;CONVERT OCTAL TO BINARY
1553   E83A   D8       LE83A:  RC                      ;RETURN IF ERROR
1554   E83B   1A               LDAX    D               ;GET CHAR FROM INPUT LINE
1555   E83C   FE3A             CPI     ':'             ;NEW ADDRESS OR DATA ?
1556   E83E   CA4CE8           JZ      LE84C           ;NEW ADDRESS
1557   E841   7D               MOV     A,L             ;DATA TO A
1558   E842   2AEFD0           LHLD    BBUF            ;GET ENTER POINTER
1559   E845   77               MOV     M,A             ;PUT DATA IN MEMORY
1560   E846   CD7BE3           CALL    ACH1            ;INCREMENT ENTER POINTER
1561   E849   C317E8           JMP     ENT1            ;DO NEXT BYTE
1562   E84C   22EFD0   LE84C:  SHLD    BBUF            ;SAVE AS NEW ENTER ADDR
1563   E84F   EB               XCHG                    ;IBUF POINTER TO H,L
1564   E850   23               INX     H               ;INCREMENT IT
1565   E851   2201D1           SHLD    PNTR            ;SAVE IT
1566   E854   C317E8           JMP     ENT1            ;DO MORE BYTES
15671
1568 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1569+                                                      21:15  07/30/2018
1570+                                                                                      PAGE 28
1571
1572
1573
1574                   ;
1575                   ;HERE ARE THE ROUTINES THAT ADD OR REPLACE LINES IN FILES
1576                   ;BASED ON THEIR LINE NUMBERS.  DELETE IS HANDLED BY A
1577                   ;SEPARATE ROUTINE
1578                   ;
1579   E857   FE30     LINE:   CPI     '0'             ;MAKE SURE 1ST CHAR IS NUMERIC
1580   E859   DADDE7           JC      WHAT            ;IF IT'S NOT
1581   E85C   213030           LXI     H,3030H         ;TWO ASCII ZEROES
1582   E85F   22E0D1           SHLD    IBUF-4          ;PUT TWO BEFORE THE LINE
1583   E862   22E2D1           SHLD    IBUF-2          ;TWO MORE MAKES FOUR
1584   E865   21E3D1           LXI     H,IBUF-1        ;POINT TO SPACE BEFORE LINE
1585   E868   0E04             MVI     C,4             ;MAX NO DIGITS IN LINE NO
1586   E86A   23       LE86A:  INX     H               ;POINT TO 1ST CHAR
1587   E86B   7E               MOV     A,M             ;GET IT
1588   E86C   FE30             CPI     '0'             ;NUMERIC ?
1589   E86E   DA7CE8           JC      LE87C           ;NO
1590   E871   FE3A             CPI     '9'+1           ;NUMERIC ?
1591   E873   D27CE8           JNC     LE87C           ;NO
1592   E876   0D               DCR     C               ;YES, NUMERIC
1593   E877   C26AE8           JNZ     LE86A           ;COUNT NUMERIC CHRS IN LINE NO.
1594                   ;
1595                   ;IF WE GET HERE THE LINE HAD A FULL 4-DIGIT NO. TO BEGIN WITH
1596                   ;NOW MAKE SURE LINE NO. IS FOLLOWED BY AT LEAST ONE SPACE
1597                   ;PUT ONE IN IF IT'S NOT
1598                   ;
1599   E87A   23               INX     H               ;POINT AFTER THE LINE NO
1600   E87B   7E               MOV     A,M             ;GET CHAR
1601   E87C   FE20     LE87C:  CPI     ' '             ;IS CHAR AFTER LINE NO. SPACE ?
1602   E87E   41               MOV     B,C             ;COUNT OF LEADING 0'S TO ADD
1603   E87F   2B               DCX     H               ;POINT TO LAST DIGIT OF LINE NO
1604   E880   CA93E8           JZ      LE893           ;IF LINE NO FOLLOWED BY SPACE
1605   E883   0C               INR     C               ;INR COUNT OF TOTAL CHRS TO ADD
1606   E884   41               MOV     B,C             ;SAVE IN B
1607   E885   0E04             MVI     C,4             ;NEED TO MOVE 4 DIGIT LINE NO.
1608   E887   3E20             MVI     A,' '           ;TO INSERT A SPACE
1609   E889   56       LE889:  MOV     D,M             ;GET CHAR
1610   E88A   77               MOV     M,A             ;PUT CHAR IN A INTO LINE
1611   E88B   7A               MOV     A,D             ;CHAR REMOVED FROM LINE TO A
1612   E88C   2B               DCX     H               ;DECREMENT LINE POINTER
1613   E88D   0D               DCR     C               ;AND COUNT OF CHRS LEFT TO MOVE
1614   E88E   C289E8           JNZ     LE889           ;IF NOT DONE
1615   E891   77               MOV     M,A             ;REPLACE LAST CHARACTER
1616   E892   48               MOV     C,B             ;COUNT OF 0'S TO INSERT
1617   E893   21E4D1   LE893:  LXI     H,IBUF          ;POINT TO IBUFFER
1618   E896   2B       LE896:  DCX     H               ;DECREMENT LINE POINTER
1619   E897   0D               DCR     C               ;DCR COUNT OF 0'S TO INSERT
1620   E898   F296E8           JP      LE896           ;LOOP TILL IT GOES NEGATIVE
1621   E89B   22C9D1           SHLD    SAVL            ;H,L IS NEW START OF LINE
1622   E89E   3AF3D0           LDA     CCNT            ;GET OLD LINE LENGTH COUNT
1623   E8A1   80               ADD     B               ;ADD COUNT OF CHARACTERS ADDED
1624   E8A2   32F3D0           STA     CCNT            ;UPDATED COUNT
16251
1626 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1627+                                                      21:15  07/30/2018
1628+                                                                                      PAGE 29
1629
1630
1631
1632   E8A5   FE07             CPI     7               ;7 ==> ORIG LINE WAS BLANK
1633   E8A7   CA2BE9           JZ      LE92B           ;TO DELETE THE LINE
1634   E8AA   77               MOV     M,A             ;PUT LEN BYTE AT HEAD OF LINE
1635   E8AB   110400           LXI     D,4             ;LENGTH OF LINE NO.
1636   E8AE   19               DAD     D               ;H,L POINTS LAST CHR OF LINE NO
1637   E8AF   22D4D0           SHLD    ADDS            ;SAVE ADDR.
1638   E8B2   110CD0           LXI     D,MAXL+3        ;END OF HIGHEST LIN # IN FILE
1639   E8B5   CD92E9           CALL    COM0            ;COMPARE LINE NO. TO MAXL
1640   E8B8   D2D8E8           JNC     INSRT           ;LINE GOES INTO MIDDLE OF FILE
1641                   ;
1642                   ;LINE GOES AT END OF FILE
1643                   ;
1644   E8BB   23               INX     H               ;POINT TO LINE NO.
1645   E8BC   CD82E9           CALL    LODM            ;GET IT IN BCDE
1646   E8BF   210CD0           LXI     H,MAXL+3        ;POINT TO END OF MAXL
1647   E8C2   CD8AE9           CALL    STOM            ;THIS LINE BECOMES NEW MAXL
1648   E8C5   2AC9D1           LHLD    SAVL            ;GET ADDR OF LINE
1649   E8C8   EB               XCHG                    ;D,E IS LINE POINTER
1650   E8C9   2A07D0           LHLD    EOFP            ;H,L IS CURRENT END OF FILE
1651   E8CC   0E01             MVI     C,1             ;1 IS THE MOVE TERMINATOR CHAR
1652   E8CE   CD70E9           CALL    LMOV            ;MOVE LINE TO END OF FILE
1653   E8D1   71               MOV     M,C             ;PUT EOF MARK IN FILE
1654   E8D2   2207D0           SHLD    EOFP            ;UPDATE END OF FILE
1655   E8D5   C3D1E0           JMP     EORNS           ;DONE
1656                   ;
1657                   ;GET HERE TO INSERT A LINE INTO FILE
1658                   ;
1659   E8D8   CD47E9   INSRT:  CALL    LE947           ;FIND LINE NO IN FILE
1660   E8DB   0E02             MVI     C,2             ;FLAG INITIALIZATION
1661   E8DD   CAE1E8           JZ      EQUL            ;LINE IN FILE HAS SAME NO.
1662   E8E0   0D               DCR     C               ;C=1 ==> NO. NOT NOW IN FILE
1663   E8E1   46       EQUL:   MOV     B,M             ;GET LENGTH OF LINE IN FILE
1664   E8E2   2B               DCX     H               ;ADDR TO INSERT LINE AFTER
1665   E8E3   3602             MVI     M,2             ;PUT MARKER THERE
1666   E8E5   22D2D0           SHLD    APNT            ;AND SAVE AS POINTER
1667   E8E8   3AF3D0           LDA     CCNT            ;LENGTH OF LINE TO ADD
1668   E8EB   0D               DCR     C               ;THE FLAG - 2 = REPLACEMENT
1669   E8EC   CAF6E8           JZ      LT              ;IF NEW LINE # NOT = OLD LINE #
1670   E8EF   90               SUB     B               ;COMPUTE DIFF IN LINE LENGTHS
1671   E8F0   CA19E9           JZ      ZERO            ;IF LINES ARE SAME LENGTH
1672   E8F3   DA09E9           JC      GT              ;IF NEW LINE > OLD LINE
1673                   ;
1674                   ;GET HERE IF OLD LINE > NEW LINE OR DOING
1675                   ;ADDITION RATHER THAN REPLACEMENT
1676                   ;
1677   E8F6   2A07D0   LT:     LHLD    EOFP            ;GET OLD END OF FILE
1678   E8F9   54               MOV     D,H             ;DUPLICATE IN D,E
1679   E8FA   5D               MOV     E,L             ;
1680   E8FB   CD6BE9           CALL    ADR             ;ADD DIFF. TO OLD EOFP
1681   E8FE   2207D0           SHLD    EOFP            ;OLD + ADDED = NEW
1682   E901   0E02             MVI     C,2             ;MOVE TERMINATION MARK IN FILE
16831
1684 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1685+                                                      21:15  07/30/2018
1686+                                                                                      PAGE 30
1687
1688
1689
1690   E903   CD79E9           CALL    RMOV            ;DO THE MOVE
1691   E906   C319E9           JMP     ZERO            ;INSERT LINE INTO GAP CREATED
1692                   ;
1693                   ;GET HERE IF OLD LINE < NEW LINE
1694                   ;
1695   E909   2F       GT:     CMA                     ;MAKE DIFFERENCE NEGATIVE
1696   E90A   3C               INR     A               ;TWO'S COMPLEMENT
1697   E90B   54               MOV     D,H             ;DUPLICATE H,L IN D,E
1698   E90C   5D               MOV     E,L             ;
1699   E90D   CD6BE9           CALL    ADR             ;SUB. DIFF FROM OLD EOFP
1700   E910   EB               XCHG                    ;
1701   E911   CD70E9           CALL    LMOV            ;DELETE EXCESS CHAR IN FILE
1702   E914   3601             MVI     M,1             ;E-O-F INDICATOR
1703   E916   2207D0           SHLD    EOFP            ;E-O-F ADDRESS
1704                   ;
1705                   ;GET HERE TO INSERT CURRENT LINE INTO FILE AREA
1706                   ;
1707   E919   2AC9D1   ZERO:   LHLD    SAVL            ;LINE ADDRESS
1708   E91C   EB               XCHG                    ;TO D,E
1709   E91D   2AD2D0           LHLD    APNT            ;INSERT ADDRESS
1710   E920   360D             MVI     M,0DH           ;REPLACE MOVE TERM. MARK W/CR
1711   E922   23               INX     H               ;POINT TO WHERE NEW LINE GOES
1712   E923   0E01             MVI     C,1             ;MOVE TERMINATION MARK
1713   E925   CD70E9           CALL    LMOV            ;PUT LINE INTO FILE
1714   E928   C3D1E0           JMP     EORNS           ;DONE
1715                   ;
1716                   ;DELETE LINE IF LINE NO. ENTERED WITH NO TEXT
1717                   ;
1718   E92B   23       LE92B:  INX     H               ;POINT TO LINE NO TO DELETE
1719   E92C   CD82E9           CALL    LODM            ;GET IT IN B,C,D,E
1720   E92F   21E2D0           LXI     H,ABUF+3        ;DESTINATION ADDRESS
1721   E932   CD8AE9           CALL    STOM            ;STORE DELETE ADDRESS
1722   E935   21E9D0           LXI     H,ABUF+10       ;ADDRESS OF END OF 2ND PARM
1723   E938   CD8AE9           CALL    STOM            ;STORE LINE NO. AGAIN
1724   E93B   CD2FEA           CALL    LEA2F           ;MAKE LIKE A DELT N,N COMMAND
1725   E93E   C3D1E0           JMP     EORNS           ;LINE DELETED, DONE
1726                   ;
1727                   ;FIND - SEARCH FILE FOR SPECIFIED LINE
1728                   ;
1729   E941   21E2D0   FIND:   LXI     H,ABUF+3        ;ADDRS. OF TEMP BUFFER
1730   E944   22D4D0   FIND1:  SHLD    ADDS            ;ADDR OF NO. TO LOOK UP
1731   E947   2A05D0   LE947:  LHLD    BOFP            ;START OF FILE TO SEARCH
1732   E94A   CD64E9   FI1:    CALL    E01             ;SEE IF AT END OF FILE
1733   E94D   EB               XCHG                    ;FILE ADR TO D,E
1734   E94E   2AD4D0           LHLD    ADDS            ;GET ADDR OF NO TO LOOK UP
1735   E951   EB               XCHG                    ;SET UP
1736   E952   3E04             MVI     A,4             ;LENGTH OF LINE NO.
1737   E954   CD6BE9           CALL    ADR             ;POINT TO END OF LINE NO.
1738   E957   CD92E9           CALL    COM0            ;SEE IF LINE NOS. ARE SAME
1739   E95A   D8               RC                      ;NO IN FILE > SUBJECT
1740   E95B   C8               RZ                      ;NOS. ARE THE SAME
17411
1742 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1743+                                                      21:15  07/30/2018
1744+                                                                                      PAGE 31
1745
1746
1747
1748   E95C   7E       FI2:    MOV     A,M             ;GET LENGTH BYTE
1749   E95D   CD6BE9           CALL    ADR             ;POINT TO NEXT LINE
1750   E960   C34AE9           JMP     FI1             ;TEST NEXT LINE
1751                   ;
1752                   ;ROUTINE TO CHECK FOR END OF FILE
1753                   ;
1754   E963   23       EOF:    INX     H               ;
1755   E964   3E01     E01:    MVI     A,1             ;EOF INDICATOR
1756   E966   BE               CMP     M               ;SAME AS CHAR POINTED TO ?
1757   E967   C0               RNZ                     ;NO - RETURN
1758   E968   C3D1E0           JMP     EORNS           ;YES - ABORT COMMAND
1759                   ;
1760                   ;ROUTINE TO ADD ONE BYTE NO IN A TO ADDR IN H,L
1761                   ;
1762   E96B   85       ADR:    ADD     L               ;ADD A TO L
1763   E96C   6F               MOV     L,A             ;RESULT REPLACES L
1764   E96D   D0               RNC                     ;DONE IF NO CARRY
1765   E96E   24               INR     H               ;ELSE INCREMENT H
1766   E96F   C9               RET                     ;DONE NOW
1767                   ;
1768                   ;CHARACTER MOVEMENT ROUTINE TO MOVE FROM D,E TO H,L
1769                   ;INCREMENTING D,E (START AT LOW ADDRESS END OF BLOCK TO MOVE)
1770                   ;MOVE ENDS WHEN CHAR IN REG C IS ENCOUNTERED.
1771                   ;
1772   E970   1A       LMOV:   LDAX    D               ;GET SOURCE CHAR
1773   E971   13               INX     D               ;INR SOURCE POINTER
1774   E972   B9               CMP     C               ;TERMINATION CHAR ?
1775   E973   C8               RZ                      ;YES - DONE THEN
1776   E974   77               MOV     M,A             ;NO - MOVE TO DEST.
1777   E975   23               INX     H               ;INR DESTINATION POINTER
1778   E976   C370E9           JMP     LMOV            ;DO NEXT CHAR
1779                   ;
1780                   ;CHARACTER MOVEMENT ROUTINE TO MOVE FROM D,E TO H,L
1781                   ;DECREMENTING POINTERS (START AT HIGH END OF BLOCK)
1782                   ;MOVE ENDS WHEN CHAR IN REG C IS ENCOUNTERED
1783                   ;
1784   E979   1A       RMOV:   LDAX    D               ;GET SOURCE CHAR
1785   E97A   1B               DCX     D               ;DECR SOURCE POINTER
1786   E97B   B9               CMP     C               ;TERMINATION CHAR ?
1787   E97C   C8               RZ                      ;YES - DONE
1788   E97D   77               MOV     M,A             ;NO - STORE CHAR AT DEST.
1789   E97E   2B               DCX     H               ;DECREMENT DEST. POINTER
1790   E97F   C379E9           JMP     RMOV            ;DO NEXT CHARACTER
1791                   ;
1792                   ;LOAD FOUR CHARS FROM MEMORY INTO REGS B,C,D,E
1793                   ;
1794   E982   46       LODM:   MOV     B,M
1795   E983   23               INX     H
1796   E984   4E               MOV     C,M
1797   E985   23               INX     H
1798   E986   56               MOV     D,M
17991
1800 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1801+                                                      21:15  07/30/2018
1802+                                                                                      PAGE 32
1803
1804
1805
1806   E987   23               INX     H
1807   E988   5E               MOV     E,M
1808   E989   C9               RET
1809                   ;
1810                   ;STORE FOUR CHARS FROM REGS B,C,D,E INTO MEMORY
1811                   ;
1812   E98A   73       STOM:   MOV     M,E
1813   E98B   2B               DCX     H
1814   E98C   72               MOV     M,D
1815   E98D   2B               DCX     H
1816   E98E   71               MOV     M,C
1817   E98F   2B               DCX     H
1818   E990   70               MOV     M,B
1819   E991   C9               RET
1820                   ;
1821                   ;ROUTINE TO COMPARE TWO CHAR STRINGS OF LENGTH 4.
1822                   ;ZERO FLAG SET ==> STRINGS EQUAL. CARRY ==> STRING
1823                   ;ADDRESSED BY D,E GREATER THAN OR = STRING ADDR BY
1824                   ;H,L
1825                   ;
1826   E992   0E04     COM0:   MVI     C,4             ;LENGTH OF COMPARISON
1827   E994   0601     COM1:   MVI     B,1             ;ASSUME EQUAL
1828   E996   B7               ORA     A               ;CLEAR CARRY
1829   E997   1A       C01:    LDAX    D               ;FETCH CHARACTER
1830   E998   9E               SBB     M               ;SET FLAGS & COMPARE
1831   E999   CA9DE9           JZ      C02             ;THESE BYTES ARE THE SAME
1832   E99C   04               INR     B               ;MAKE EQUAL FLAG = 2
1833   E99D   1B       C02:    DCX     D               ;DECREMENT 1 STR. POINTER
1834   E99E   2B               DCX     H               ;DECR. OTHER POINTER
1835   E99F   0D               DCR     C               ;DECR. CNT OF BYTES TO COMPARE
1836   E9A0   C297E9           JNZ     C01             ;DO NEXT BYTE
1837   E9A3   05               DCR     B               ;DECREMENT ZERO FLAG
1838   E9A4   C9               RET                     ;DONE W/ZERO SET
1839                   ;
1840                   ;ROUTINE TO TAKE ASCII CHARS AND ADD LEADING ASCII
1841                   ;ZEROS TO YIELD A 4 CHARACTER ASCII VALUE
1842                   ;
1843   E9A5   CD82E9   NORM:   CALL    LODM            ;GET 4 DIGITS
1844   E9A8   AF               XRA     A               ;GET A BINARY ZERO
1845   E9A9   B8               CMP     B               ;ARE ALL DIGITS ZERO ?
1846   E9AA   C8               RZ                      ;YES - NOTHING TO NORMALIZE
1847   E9AB   BB       NOR1:   CMP     E               ;NORMALIZED ?
1848   E9AC   C48AE9           CNZ     STOM            ;YES, PUT DIGITS BACK
1849   E9AF   C0               RNZ                     ;AND RETURN
1850   E9B0   5A               MOV     E,D             ;ELSE MOVE DIGITS UP
1851   E9B1   51               MOV     D,C
1852   E9B2   48               MOV     C,B
1853   E9B3   0630             MVI     B,'0'           ;AND ADD A ZERO
1854   E9B5   C3ABE9           JMP     NOR1            ;THEN TEST FOR NORMALIZATION
1855                   ;
1856                   ;ROUTINE TO MOVE A LINE FROM THE FILE BUFFER INTO
18571
1858 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1859+                                                      21:15  07/30/2018
1860+                                                                                      PAGE 33
1861
1862
1863
1864                   ;THE ASSEMBLERS LINE BUFFER
1865                   ;
1866   E9B8   2AD2D0   MOVEL:  LHLD    APNT            ;GET ASSEMBLER POINTER
1867   E9BB   7E               MOV     A,M             ;GET 1ST CHAR OF LINE
1868   E9BC   FE01             CPI     1               ;END OF FILE ?
1869   E9BE   C8               RZ                      ;YES, RETURN
1870   E9BF   EB               XCHG                    ;LINE ADDR TO D,E
1871   E9C0   6F               MOV     L,A             ;GET LENGTH AS 16 BITS IN H,L
1872   E9C1   2600             MVI     H,0             ;LENGTH < 128
1873   E9C3   19               DAD     D               ;ADD LENGTH TO START ADDR
1874   E9C4   2B               DCX     H               ;POINT TO LAST CHAR OF LINE
1875   E9C5   7E               MOV     A,M             ;GET IT
1876   E9C6   FE0D             CPI     0DH             ;C/R ?
1877   E9C8   C218E7           JNZ     LE718           ;REPORT FCHK ERROR
1878   E9CB   13               INX     D               ;POINT TO 1ST ACTUAL CHAR
1879   E9CC   21DFD1           LXI     H,IBUF-5        ;ASSEMBLERS BUFFER
1880   E9CF   0E0D             MVI     C,0DH           ;TERMINATION CHAR
1881   E9D1   CD70E9           CALL    LMOV            ;MOVE THE LINE
1882   E9D4   71               MOV     M,C             ;PUT C/R AT END OF LINE
1883   E9D5   EB               XCHG                    ;1ST CHAR OF NEXT LINE TO H,L
1884   E9D6   22D2D0           SHLD    APNT            ;SAVE UPDATED ASSEM. POINTER
1885   E9D9   B7               ORA     A               ;CLEAR FLAGS
1886   E9DA   C9               RET                     ;DONE
1887                   ;
1888                   ;LIST AND TEXT (LIST W/O LINE NUMBERS) COMMANDS
1889                   ;
1890   E9DB   2F       LIST:   CMA                     ;MAKE A NON-ZERO
1891   E9DC   32FBD0   TEXT:   STA     NOLIN           ;SAVE AS FORMAT FLAG
1892   E9DF   CD16E2           CALL    CRLF            ;START ON FRESH LINE
1893   E9E2   21DFD0           LXI     H,ABUF          ;GET STARTING LINE NO.
1894   E9E5   CD82E9           CALL    LODM            ;
1895   E9E8   AF               XRA     A               ;ZERO FLAGS & ACCUM.
1896   E9E9   B8               CMP     B               ;LINE NO. GIVEN ?
1897   E9EA   C2EFE9           JNZ     LE9EF           ;JUMP IF LINE NO. GIVEN
1898   E9ED   06FF             MVI     B,0FFH          ;MAKE LINE NO. > 9999
1899   E9EF   21E9D0   LE9EF:  LXI     H,ABUF+10
1900   E9F2   BE               CMP     M               ;ENDING LINE NO. GIVEN ?
1901   E9F3   C2F9E9           JNZ     LE9F9           ;IF ENDING NO. GIVEN
1902   E9F6   CD8AE9           CALL    STOM            ;STORE ENDING LINE NO > 9999
1903   E9F9   CD41E9   LE9F9:  CALL    FIND            ;FIND STARTING LINE NO.
1904   E9FC   22D2D0           SHLD    APNT            ;SAVE AS POINTER
1905   E9FF   CDB8E9   LE9FF:  CALL    MOVEL           ;MOVE LINE TO OUTPUT BUFFER
1906   EA02   CAB7E0           JZ      EOR             ;IF END OF FILE FOUND
1907   EA05   21E2D1           LXI     H,IBUF-2        ;POINT TO LAST DIGIT OF LINE NO
1908   EA08   11E9D0           LXI     D,ABUF+10       ;D POINTS TO ENDING LINE NO.
1909   EA0B   CD92E9           CALL    COM0            ;COMPARE LINE NO. & END LIN NO.
1910   EA0E   D8               RC                      ;RETURN IF > ENDING LINE NO
1911   EA0F   3AFAD0           LDA     LFMT            ;GET FORMAT FLAG
1912   EA12   B7               ORA     A               ;SET FLAGS
1913   EA13   C461F3           CNZ     LF361           ;TO FORMAT LINE
1914   EA16   21DFD1           LXI     H,IBUF-5        ;POINT TO START OF LINE
19151
1916 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1917+                                                      21:15  07/30/2018
1918+                                                                                      PAGE 34
1919
1920
1921
1922   EA19   3AFBD0           LDA     NOLIN           ;GET LINE NO. FLAG
1923   EA1C   B7               ORA     A               ;SET FLAGS
1924   EA1D   C223EA           JNZ     LEA23           ;PRINT WITH LINE NO.
1925   EA20   21E4D1           LXI     H,IBUF          ;POINT PAST LIN NO.
1926   EA23   CD80E3   LEA23:  CALL    SCRN            ;PRINT LINE FROM H,L POINTER
1927   EA26   CD16E2           CALL    CRLF            ;PUT CR/LF AFTER LINE
1928   EA29   C3FFE9           JMP     LE9FF           ;TO DO NEXT LINE
1929                   ;
1930                   ;DELT - THE DELETE LINE COMMAND
1931                   ;
1932   EA2C   CD1CE5   DELT:   CALL    VCHK            ;CHECK FOR REQD PARAMETERS
1933   EA2F   CD41E9   LEA2F:  CALL    FIND            ;GET STARTING DELT ADDR
1934   EA32   22D2D0           SHLD    DELP            ;SAVE IT
1935   EA35   21E9D0           LXI     H,ABUF+10       ;SEE IF 2ND PARM GIVEN
1936   EA38   7E               MOV     A,M             ;GET CHAR
1937   EA39   B7               ORA     A               ;SET FLAGS
1938   EA3A   C240EA           JNZ     LEA40           ;IF 2ND PARM GIVEN
1939   EA3D   21E2D0           LXI     H,ABUF+3        ;FIRST & LAST LINE ARE SAME
1940   EA40   22D4D0   LEA40:  SHLD    ADDS            ;SAVE 1ST LINE FIND ADDR
1941   EA43   EB               XCHG
1942   EA44   210CD0           LXI     H,MAXL+3        ;HIGHEST LINE NO.
1943   EA47   CD92E9           CALL    COM0            ;COMPARE TO ENDING DELT LINE
1944   EA4A   2AD2D0           LHLD    DELP            ;GET DELT POSITION TO H,L
1945   EA4D   DA8EEA           JC      NOVR            ;DELETE DOES NOT INVOLVE END
1946                   ;
1947                   ;GET HERE IF DELETE INVOLVES END OF FILE
1948                   ;
1949                   ;THIS GETS COMPLICATED BECAUSE:
1950                   ;  A) THE LAST LINE'S C/R IS NOT FOLLOWED BY ANY LINE NO.
1951                   ;                      AND
1952                   ;  B) IN GENERAL, A 0DH MIGHT BE EITHER A LENGTH BYTE OR C/R
1953                   ;
1954   EA50   2207D0   LEA50:  SHLD    EOFP            ;DELT POS. ==> NEW EOF
1955   EA53   3601             MVI     M,1             ;PUT NEW EOF MARK IN FILE
1956   EA55   46               MOV     B,M             ;FLAG WHICH ISN'T REALLY USED
1957   EA56   EB               XCHG                    ;D,E = EOF
1958   EA57   2A05D0           LHLD    BOFP            ;H,L = BOF
1959   EA5A   EB               XCHG                    ;D,E = BOF & H,L = EOF
1960   EA5B   2B               DCX     H               ;SO WE MISS LAST LINE'S C/R
1961   EA5C   7D       DEL2:   MOV     A,L             ;SUBTRACT BOF FROM EOF
1962   EA5D   93               SUB     E               ;
1963   EA5E   7C               MOV     A,H             ;
1964   EA5F   9A               SBB     D               ;
1965   EA60   3E0D             MVI     A,0DH           ;SETTING UP FOR COMPARE
1966   EA62   DA85EA           JC      DEL4            ;NO 0DH IN FILE==> MAXL=0
1967   EA65   2B               DCX     H               ;MOVE UP 1 CHAR
1968   EA66   BE               CMP     M               ;0DH ?
1969   EA67   C25CEA           JNZ     DEL2            ;NO, THEN TRY NEXT CHAR
1970   EA6A   2B               DCX     H               ;YES - SEE IF TWO IN A ROW
1971   EA6B   7D               MOV     A,L             ;SUBTRACTING BOF FROM POINTER
1972   EA6C   93               SUB     E
19731
1974 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1975+                                                      21:15  07/30/2018
1976+                                                                                      PAGE 35
1977
1978
1979
1980   EA6D   7C               MOV     A,H             ;
1981   EA6E   9A               SBB     D               ;
1982   EA6F   DA85EA           JC      DEL4            ;0DH WAS 1ST CHAR==>LENGTH BYTE
1983   EA72   3E0D             MVI     A,0DH           ;COMPARE THIS CHAR TO 0DH
1984   EA74   BE               CMP     M               ;
1985   EA75   23               INX     H               ;POINT TO NEXT CHAR
1986   EA76   23               INX     H               ;POINT TO NEXT CHAR
1987   EA77   CA7BEA           JZ      DEL3            ;WERE TWO 0DH'S, AT LINE # NOW
1988   EA7A   23       LEA7A:  INX     H               ;ONLY 1 0DH, 1 MORE==>AT LINE #
1989   EA7B   CD82E9   DEL3:   CALL    LODM            ;GET LINE NO IN REGS
1990   EA7E   210CD0           LXI     H,MAXL+3        ;WHERE IT GOES
1991   EA81   CD8AE9           CALL    STOM            ;PUT IT THERE
1992   EA84   C9               RET                     ;MAXL IS UPDATED
1993   EA85   EB       DEL4:   XCHG                    ;FOR PROPER RETURN
1994   EA86   05               DCR     B               ;ALWAYS 1 ==> 0
1995   EA87   C27AEA           JNZ     LEA7A           ;NEVER TAKE JUMP
1996   EA8A   3209D0           STA     MAXL            ;MAKES MAXL VERY SMALL ALWAYS
1997   EA8D   C9               RET                     ;DONE, EDITOR THINKS FILE EMPTY
1998                   ;
1999                   ;GET HERE IF DELETE IS IN THE MIDDLE OF THE FILE
2000                   ;
2001   EA8E   CD4AE9   NOVR:   CALL    FI1             ;FIND END OF DELETE AREA
2002   EA91   CC5CE9           CZ      FI2             ;NEXT LINE IF LINE NOS. EQUL
2003   EA94   EB               XCHG                    ;
2004   EA95   2AD2D0           LHLD    DELP            ;DEST = START OF DELT AREA
2005   EA98   0E01             MVI     C,1             ;TERM ON EOF MARK
2006   EA9A   CD70E9           CALL    LMOV            ;DO THE MOVE TO DELETE
2007   EA9D   2207D0           SHLD    EOFP            ;UPDATE EOF ADDRESS
2008   EAA0   3601             MVI     M,1             ;PUT EOF MARK IN FILE
2009   EAA2   C9               RET                     ;DONE
2010                   ;
2011                   ;STAB COMMAND - SET SYMBOL TABLE ADDRESS
2012                   ;
2013   EAA3   CD1CE5   STAB:   CALL    VCHK            ;CHECK FOR REQD PARM
2014   EAA6   2AEFD0           LHLD    BBUF            ;GET IT
2015   EAA9   2232D1           SHLD    SYMADD          ;SAVE AS SYMBOL TABLE ADDRESS
2016   EAAC   C360E0           JMP     EORMS           ;DONE
2017                   ;
2018                   ; ***** END OF ALS8COM MODULE
2019                   ;
2020                   ;
2021                   ;THE ASSEMBLER STARTS HERE
2022                   ;
2023                   ;ASPC IS THE PROGRAM COUNTER (GOES ON LISTING), AND
2024                   ;BBUF+2 IS THE STORAGE COUNTER (WHERE OBJECT CODE GOES)
2025                   ;
2026   EAAF   CD1CE5   ASSM:   CALL    VCHK            ;AT LEAST 1 PARM. REQD
2027   EAB2   3AE6D0           LDA     ABUF+7          ;2ND PARM. (OFFSET) GIVEN ?
2028   EAB5   B7               ORA     A               ;SET FLAGS
2029   EAB6   C2BFEA           JNZ     ASM4            ;USE 2ND PARM. IF GIVEN
2030   EAB9   2AEFD0           LHLD    BBUF            ;ELSE GET 1ST PARM
20311
2032 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2033+                                                      21:15  07/30/2018
2034+                                                                                      PAGE 36
2035
2036
2037
2038   EABC   22F1D0           SHLD    BBUF+2          ;USE 1ST PARM. AS STORAGE CNTR
2039   EABF   3AE8D1   ASM4:   LDA     IBUF+4          ;GET LETTER AFTER ASSM OR ASSI
2040   EAC2   FE45             CPI     'E'             ;'E' - OMIT NON-ERROR LINES ?
2041   EAC4   CAD6EA           JZ      LEAD6           ;SKIP CHECKING FOR 'S' OR 'X'
2042   EAC7   FE53             CPI     'S'             ;'S' - LIST SYMBOL TABLE ?
2043   EAC9   CAD6EA           JZ      LEAD6           ;SKIP CHECKING FOR 'X'
2044   EACC   FE58             CPI     'X'             ;'X' - CROSS REFERENCE ?
2045   EACE   CAD6EA           JZ      LEAD6           ;HAVE PRINT FLAG
2046   EAD1   FE20             CPI     ' '             ;MUST BE SPACE, E, S, OR X
2047   EAD3   C2DDE7           JNZ     WHAT            ;WHOOPS - ILLEAGLE CHAR.
2048   EAD6   32F4D0   LEAD6:  STA     SYMX            ;SAVE SYMBOL/PRINT FLAG
2049   EAD9   3AE7D1           LDA     IBUF+3          ;GET ASSEMBLY TYPE (ASSM/ASSI)
2050   EADC   3200D1           STA     ASMTY           ;SAVE AS ASSEMBLY TYPE
2051   EADF   AF               XRA     A               ;GET A ZERO
2052   EAE0   2A32D1           LHLD    SYMADD          ;POINT TO SYMBOL TABLE START
2053   EAE3   77               MOV     M,A             ;PUT IN END OF TABLE MARK
2054   EAE4   320AD1           STA     ALST            ;ASSUME LIST TURNED 'ON'
2055   EAE7   32F9D0           STA     PASI            ;SET PASS INDICATOR TO PASS 1
2056   EAEA   2AEFD0   LEAEA:  LHLD    BBUF            ;GET PGM. ORG
2057   EAED   22F7D0           SHLD    ASPC            ;USE IT TO INIT. PROG. COUNTER
2058   EAF0   2A05D0           LHLD    BOFP            ;GET START OF SOURCE
2059   EAF3   22D2D0           SHLD    APNT            ;USE IT TO INIT. ASS. POINTER
2060                   ;
2061                   ;THIS IS THE START OF THE MAIN ASSEMBLER PROCESSING LOOP
2062                   ;
2063   EAF6   312FD1   LEAF6:  LXI     SP,SMODE
2064   EAF9   21C9D1           LXI     H,OBUF          ;POINT TO OUTPUT BUFFER
2065   EAFC   3EE4             MVI     A,IBUF AND 0FFH ;LOW BYTE OF END OF OBUF
2066   EAFE   CDD1E1           CALL    CLER            ;CLEAR OBUF TO SPACES
2067   EB01   3A00D1           LDA     ASMTY           ;GET ASSM/ASSI FLAG
2068   EB04   FE49             CPI     'I'             ;USING EXTERNAL INPUT ?
2069   EB06   CA12EB           JZ      LEB12           ;YES - CALL IT
2070   EB09   CDB8E9           CALL    MOVEL           ;ELSE MOVEL PUTS LINE IN IBUF
2071   EB0C   CA39EE           JZ      LEE39           ;IF END OF FILE DETECTED
2072   EB0F   C315EB           JMP     LEB15           ;SKIP CALL TO EXT. INPUT
2073   EB12   CDCCD0   LEB12:  CALL    IN8             ;CALL ASSI DRIVER FOR EXT INPUT
2074   EB15   3AF9D0   LEB15:  LDA     PASI            ;GET PASS INDICATOR
2075   EB18   B7               ORA     A               ;SET FLAGS
2076   EB19   C222EB           JNZ     ASM2            ;DO THE 2ND PASS
2077   EB1C   CD57EB           CALL    PAS1            ;ELSE DO PASS 1
2078   EB1F   C3F6EA           JMP     LEAF6           ;THEN BACK TO TOP OF LOOP
2079   EB22   CD3DEC   ASM2:   CALL    PAS2            ;PROCESS PASS 2 LINE
2080   EB25   21C9D1           LXI     H,OBUF          ;POINT TO OUTPUT BUFFER
2081   EB28   CD2EEB           CALL    AOUT            ;PRINT LINE
2082   EB2B   C3F6EA           JMP     LEAF6           ;THEN BACK TO TOP OF LOOP
2083                   ;
2084                   ;END OF MAIN LOOP
2085                   ;
2086                   ;FOLLOWING ROUTINE PRINTS LINE DURING 2ND PASS
2087                   ;
2088   EB2E   3ADBD1   AOUT:   LDA     OBUF+18         ;GET ERROR TYPE IN OUTPUT LINE
20891
2090 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2091+                                                      21:15  07/30/2018
2092+                                                                                      PAGE 37
2093
2094
2095
2096   EB31   FE20             CPI     ' '             ;WAS THERE AN ERROR ?
2097   EB33   C241EB           JNZ     LEB41           ;YES - PRINT LINE
2098   EB36   3AF4D0           LDA     AERR            ;GET SYMBOL/ERROR PRINT FLAG
2099   EB39   FE45             CPI     'E'             ;ERRORS-ONLY LISTING ?
2100   EB3B   C8               RZ                      ;YES - DONE WITH THIS LINE
2101   EB3C   3A0AD1           LDA     ALST            ;GET ASSEMBLER LIST FLAG
2102   EB3F   B7               ORA     A               ;SET FLAGS
2103   EB40   C0               RNZ                     ;DONE IF LISTING TURNED OFF
2104   EB41   3AF9D0   LEB41:  LDA     PASI            ;GET PASS INDICATOR
2105   EB44   FE02             CPI     2               ;GREATER THAN 1 (E.G. 3RD PASS)
2106   EB46   D0               RNC                     ;DONE THEN
2107   EB47   3AFAD0           LDA     LFMT            ;GET FORMAT/NO FORMAT FLAG
2108   EB4A   B7               ORA     A               ;SET FLAGS
2109   EB4B   C461F3           CNZ     LF361           ;FORMAT LINE IF NECESSARY
2110   EB4E   21C9D1           LXI     H,OBUF          ;POINT TO LINE TO OUTPUT
2111   EB51   CD16E2           CALL    CRLF            ;DO CARRIAGE RET FROM PREV LINE
2112   EB54   C380E3           JMP     SCRN            ;PRINT LINE & RET.
2113                   ;
2114                   ;PASS 1 OF THE ASSEMBLER USED TO FORM SYMBOL TABLE
2115                   ;
2116   EB57   CD6AE2   PAS1:   CALL    ZBUF            ;CLEAR OUT THE ASCII BUFFER
2117   EB5A   32F9D0           STA     PASI            ;PUT PASS INDICATOR BACK
2118   EB5D   21E4D1           LXI     H,IBUF          ;POINT TO 1ST CHAR OF LINE
2119   EB60   2201D1           SHLD    PNTR            ;SAVE AS POINTER INTO LINE
2120   EB63   7E               MOV     A,M             ;GET 1ST CHAR
2121   EB64   FE20             CPI     ' '             ;BLANK ?
2122   EB66   CA8EEB           JZ      OPC             ;NO LABEL THEN
2123   EB69   FE2A             CPI     COMCHR          ;COMMENT CHARACTER ?
2124   EB6B   C8               RZ                      ;DONE IF COMMENT LINE
2125                   ;
2126                   ;PROCESS LABEL POINTED TO IN LINE BY H,L
2127                   ;
2128   EB6C   CDF8F0           CALL    SLAB            ;SEE IF LABEL ALREADY IN TABLE
2129   EB6F   DAE0F0           JC      LF0E0           ;ERROR IN LABEL
2130   EB72   CA56F3           JZ      ERRD            ;DUPLICATE LABEL
2131   EB75   CDB3EB           CALL    LCHK            ;CHECK CHAR AFTER LABEL
2132   EB78   DAE0F0           JC      LF0E0           ;IF NOT SPACE OR COLON
2133   EB7B   CDA5EB           CALL    LEBA5           ;TO MOVE LABEL INTO TABLE
2134   EB7E   EB               XCHG                    ;SYM. TABLE ADDR TO H,L
2135   EB7F   22F5D0           SHLD    TABA            ;SAVE AS SYMBOL TABLE PNTR
2136   EB82   3AF8D0           LDA     ASPC+1          ;PUTTING P.C. IN SYMBOL TABLE
2137   EB85   77               MOV     M,A             ;PUT 1ST BYTE IN TABLE
2138   EB86   23               INX     H               ;INR. TABLE POINTER
2139   EB87   3AF7D0           LDA     ASPC            ;GET 2ND BYTE
2140   EB8A   77               MOV     M,A             ;PUT IT IN TABLE
2141   EB8B   23               INX     H               ;POINT PAST VALUE
2142   EB8C   3600             MVI     M,0             ;END OF TABLE MARK
2143                   ;
2144                   ;PROCESS OPCODE
2145                   ;
2146   EB8E   CD6AE2   OPC:    CALL    ZBUF            ;BLANK OUT ABUF
21471
2148 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2149+                                                      21:15  07/30/2018
2150+                                                                                      PAGE 38
2151
2152
2153
2154   EB91   CDCCEE           CALL    SBLK            ;SCAN TO OPCODE
2155   EB94   DAD8F0           JC      OERR            ;IF FOUND C/R INSTEAD
2156   EB97   CD3EF1           CALL    ALPS            ;MOVE OPCODE INTO ABUF
2157   EB9A   FE20             CPI     ' '             ;CHECK FOR SPACE AFTER OPCODE
2158   EB9C   DA37F0           JC      OPCD            ;OPCODE FOLLOWED BY C/R
2159   EB9F   C2D8F0           JNZ     OERR            ;OPCODE FOLLOWED BY CHAR.
2160   EBA2   C337F0           JMP     OPCD            ;TO CONTINUE OPCODE PROC.
2161                   ;
2162                   ;ROUTINE TO MOVE LABEL INTO SYMBOL TABLE
2163                   ;
2164   EBA5   0E05     LEBA5:  MVI     C,LLAB          ;LENGTH OF LABEL
2165   EBA7   21DFD0           LXI     H,ABUF          ;SOURCE
2166   EBAA   7E       MLAB:   MOV     A,M             ;GET CHAR FROM LABEL
2167   EBAB   12               STAX    D               ;PUT IT IN TABLE
2168   EBAC   13               INX     D               ;DEST. POINTER
2169   EBAD   23               INX     H               ;SOURCE POINTER
2170   EBAE   0D               DCR     C               ;LENGTH POINTER
2171   EBAF   C2AAEB           JNZ     MLAB            ;IF MORE CHARS TO MOVE
2172   EBB2   C9               RET                     ;ELSE DONE
2173                   ;
2174                   ;CHECK LABELS FOR VALID TERMINATOR
2175                   ;
2176   EBB3   2A01D1   LCHK:   LHLD    PNTR            ;GET POINTER
2177   EBB6   7E               MOV     A,M             ;GET CHAR
2178   EBB7   FE20             CPI     ' '             ;SPACE ?
2179   EBB9   C8               RZ                      ;OK THEN, RETURN
2180   EBBA   FE3A             CPI     ':'             ;COLON ?
2181   EBBC   C0               RNZ                     ;IF NOT, RETURN ZERO FLAG OFF
2182   EBBD   23               INX     H               ;ELSE OK, INR. PAST NON-SPACE
2183   EBBE   2201D1           SHLD    PNTR            ;AND UPDATE POINTER
2184   EBC1   C9               RET                     ;THEN RETURN
2185                   ;
2186                   ;PROCESS PSEUDO OPS IN PASS 1
2187                   ;H,L POINTS INTO LINE, D,E POINTS INTO OPCODE TABLE
2188                   ;
2189   EBC2   CDCCEE   PSU1:   CALL    SBLK            ;SCAN TO OPERAND
2190   EBC5   1A               LDAX    D               ;FETCH TABLE VALUE
2191   EBC6   B7               ORA     A               ;SET FLAGS
2192   EBC7   CAE6EB           JZ      ORG1            ;ORG PSEUDO OP
2193   EBCA   FAA8EC           JM      DAT2A           ;DB PSEUDO OP
2194   EBCD   FE02             CPI     2               ;
2195   EBCF   DAFBEB           JC      EQU1            ;EQU PSEUDO OP
2196   EBD2   CA16EC           JZ      RESI            ;DS PSEUDO OP
2197   EBD5   FE08             CPI     8               ;
2198   EBD7   CA26EC           JZ      LEC26           ;ASC PSEUDO OP
2199   EBDA   FE05             CPI     5               ;
2200   EBDC   D0               RNC                     ;PSEUDO-OPS NOT USED 1ST PASS
2201   EBDD   EA39EE           JPE     LEE39           ;END PSEUDO OP
2202                   ;
2203                   ;DO DW PSEUDO OP
2204                   ;
22051
2206 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2207+                                                      21:15  07/30/2018
2208+                                                                                      PAGE 39
2209
2210
2211
2212   EBE0   0E02     ACO1:   MVI     C,2             ;DW IS A 2-BYTE INSTR.
2213   EBE2   AF               XRA     A               ;CLEAR CARRY & FLAGS
2214   EBE3   C3C7F0           JMP     OCN1            ;TO INCREMENT PGM. COUNTER
2215                   ;
2216                   ;DO ORG PSEUDO OP
2217                   ;
2218   EBE6   CD60F1   ORG1:   CALL    ASCN            ;GET OPERAND TO H,L
2219   EBE9   3ADBD1           LDA     OBUF+18         ;GET ERROR INDICATOR
2220   EBEC   FE20             CPI     ' '             ;ANY ERRORS IN THIS LINE ?
2221   EBEE   C0               RNZ                     ;IF SO, DON'T PROCESS
2222   EBEF   22F7D0           SHLD    ASPC            ;ELSE PUT VALUE IN PGM. CTR.
2223   EBF2   3AE4D1           LDA     IBUF            ;GET 1ST CHAR OF LINE
2224   EBF5   FE20             CPI     ' '             ;SPACE OR LABEL CHAR ?
2225   EBF7   C8               RZ                      ;DONE IF SPACE
2226   EBF8   C306EC           JMP     EQUS            ;ELSE CHANGE LABEL VALUE
2227                   ;
2228                   ;DO EQU PSEUDO OP
2229                   ;
2230   EBFB   CD60F1   EQU1:   CALL    ASCN            ;GET VALUE TO H,L
2231   EBFE   3AE4D1           LDA     IBUF            ;POINT AT 1ST CHAR OF LINE
2232   EC01   FE20             CPI     ' '             ;SPACE OR LABLE CHAR ?
2233   EC03   CA2FF3           JZ      ERRM            ;EQU REQUIRES A LABEL ALWAYS
2234   EC06   EB       EQUS:   XCHG                    ;VALUE TO D,E
2235   EC07   2AF5D0           LHLD    TABA            ;TABLE ADDR TO H,L
2236   EC0A   72               MOV     M,D             ;STORE LABEL VALUE IN S. TABLE
2237   EC0B   23               INX     H               ;2ND BYTE
2238   EC0C   73               MOV     M,E             ;
2239   EC0D   3ADBD1           LDA     OBUF+18         ;GET ERROR FLAG
2240   EC10   FE20             CPI     ' '             ;LINE O.K. ?
2241   EC12   C8               RZ                      ;DONE THEN
2242   EC13   C341EB           JMP     LEB41           ;ELSE PRINT THE LINE
2243                   ;
2244                   ;DO DS PSEUDO OP
2245                   ;
2246   EC16   CD60F1   RESI:   CALL    ASCN            ;GET OPERAND VALUE TO H,L
2247   EC19   44               MOV     B,H             ;MOVING TO B,C
2248   EC1A   4D               MOV     C,L             ;
2249   EC1B   3ADBD1           LDA     OBUF+18         ;GET ERROR INDICATOR
2250   EC1E   FE20             CPI     ' '             ;LINE O.K. ?
2251   EC20   C241EB           JNZ     LEB41           ;PRINT IT IF NOT
2252   EC23   C3A1EC           JMP     RES21           ;ELSE ADD B,C TO PGM. CTR.
2253                   ;
2254                   ;DO ASC PSEUDO OP
2255                   ;
2256   EC26   7E       LEC26:  MOV     A,M             ;GET 1ST NON-SPACE CHAR
2257   EC27   FE0D             CPI     0DH             ;CARRIAGE RETN ?
2258   EC29   C8               RZ                      ;DONE
2259   EC2A   57               MOV     D,A             ;SAVE DELIMITER IN D
2260   EC2B   010000           LXI     B,0             ;INITIALIZE CHAR COUNT TO 0
2261   EC2E   23       LEC2E:  INX     H               ;POINT TO NEXT CHAR
2262   EC2F   7E               MOV     A,M             ;GET IT
22631
2264 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2265+                                                      21:15  07/30/2018
2266+                                                                                      PAGE 40
2267
2268
2269
2270   EC30   FE0D             CPI     0DH             ;END OF LINE ?
2271   EC32   CAA1EC           JZ      RES21           ;DONE WITH STRING
2272   EC35   BA               CMP     D               ;2ND DELIMETER ?
2273   EC36   CAA1EC           JZ      RES21           ;DONE IF SO
2274   EC39   03               INX     B               ;ELSE INR. CHAR COUNT
2275   EC3A   C32EEC           JMP     LEC2E           ;AND KEEP ON COUNTING
2276                   ;
2277                   ;PERFORM PASS 2 OF THE ASSEMBLER
2278                   ;
2279   EC3D   21C9D1   PAS2:   LXI     H,OBUF          ;SET OUTPUT BUFFER ADDRESS
2280   EC40   3AF8D0           LDA     ASPC+1          ;GET HIGH BYTE OF PGM. CTR.
2281   EC43   CD93E3           CALL    BINH+3          ;CONVERT TO ASCII & STORE
2282   EC46   23               INX     H               ;POINT PAST BYTE
2283   EC47   3AF7D0           LDA     ASPC            ;GET LOW ORDER BYTE
2284   EC4A   CD93E3           CALL    BINH+3          ;PUT IT IN ADDR FIELD, TOO
2285   EC4D   220BD1           SHLD    OIND            ;SAVE H,L AS OUTPUT POINTER
2286   EC50   CD6AE2           CALL    ZBUF            ;CLEAR ABUFF
2287   EC53   21E4D1           LXI     H,IBUF          ;POINT TO LINE TO ASSEMBLE
2288   EC56   2201D1   PABL:   SHLD    PNTR            ;SAVE AS POINTER
2289   EC59   7E               MOV     A,M             ;GET 1ST CHAR OF LINE
2290   EC5A   FE20             CPI     ' '             ;SPACE ?
2291   EC5C   CA8EEB           JZ      OPC             ;YES, NO LABEL, PROC. OPCODE
2292   EC5F   FE2A             CPI     COMCHR          ;IS IT A COMMENT LINE ?
2293   EC61   C8               RZ                      ;DONE THEN
2294   EC62   CDF8F0           CALL    SLAB            ;LOOK UP LABEL IN TABLE
2295   EC65   DAE0F0           JC      LF0E0           ;LABEL ERROR
2296   EC68   CDB3EB           CALL    LCHK            ;CHECK TERM. CHAR
2297   EC6B   C2E0F0           JNZ     LF0E0           ;NOT FOLLOWED BY '$' OR ':'
2298   EC6E   C38EEB           JMP     OPC             ;PROCESS THE OPCODE
2299                   ;
2300                   ;PROCESS PSEUDO OPS FOR THE 2ND PASS
2301                   ;
2302   EC71   1A       PSU2:   LDAX    D               ;GET TABLE VALUE
2303   EC72   B7               ORA     A               ;SET FLAGS
2304   EC73   CAAEEC           JZ      ORG2            ;ORG PSEUDO OP
2305   EC76   FAA5EC           JM      DAT2            ;DB PSEUDO OP
2306   EC79   FE02             CPI     2
2307   EC7B   D8               RC                      ;EQU WAS PROCESSED ON 1ST PASS
2308   EC7C   CA95EC           JZ      RES2            ;DS PSEUDO OP
2309   EC7F   FE08             CPI     8
2310   EC81   CA01ED           JZ      LED01           ;ASC PSEUDO OP
2311   EC84   FE05             CPI     5
2312   EC86   CAD3EC           JZ      LECD3           ;COM PSEUDO OP
2313   EC89   D2CDEC           JNC     LECCD           ;BOTH LST AND NLST
2314   EC8C   EA39EE           JPE     LEE39           ;END PSEUDO OP
2315                   ;
2316                   ;DO DW PSEUDO OP
2317                   ;
2318   EC8F   CD14EE   ACO2:   CALL    TYS6            ;GET VALUE & PUT IN MEM
2319   EC92   C3E0EB           JMP     ACO1            ;INR P.C. & RET
2320                   ;
23211
2322 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2323+                                                      21:15  07/30/2018
2324+                                                                                      PAGE 41
2325
2326
2327
2328                   ;DO DS PSEUDO OP IN PASS 2
2329                   ;
2330   EC95   CD5DF1   RES2:   CALL    ASBL            ;GET VALUE IN H,L
2331   EC98   44               MOV     B,H             ;MOVING TO B,C
2332   EC99   4D               MOV     C,L
2333   EC9A   2AF1D0           LHLD    BBUF+2          ;GET STORAGE COUNTER
2334   EC9D   09               DAD     B               ;ADD NO BYTES IN DS STMNT
2335   EC9E   22F1D0           SHLD    BBUF+2          ;UPDATE STORAGE COUNTER
2336   ECA1   AF       RES21:  XRA     A               ;CLEAR ZERO FLAG
2337   ECA2   C3CAF0           JMP     OCN2            ;TO UPDATE PGM. COUNTER
2338                   ;
2339                   ;DO PASS 2 DB PSEUDO OP
2340                   ;
2341   ECA5   CDD3ED   DAT2:   CALL    TYS5            ;GET OPERNAD
2342   ECA8   AF       DAT2A:  XRA     A               ;MAKE ACC. ZERO
2343   ECA9   0E01             MVI     C,1             ;BYTE COUNT
2344   ECAB   C3C7F0           JMP     OCN1            ;TO INR. PGM. COUNTER
2345                   ;
2346                   ;DO ORG PSEUDO OP
2347                   ;
2348                   ;P.T. SCREWED THIS ONE UP, AS THEY STORE THE NEW ORG NOT ONLY
2349                   ;AS THE ASSEMBLERS PROGRAM COUNTER, BUT ALSO AS THE STORAGE
2350                   ;COUNTER, WHICH POINTS TO WHERE THEY ARE STORING THE OBJECT
2351                   ;CODE. THUS IF YOU WERE USING AN OFFSET (E.G. ASSM XXXX YYYY)
2352                   ;BEFORE THE ORG STATEMENT, YOU WON'T BE AFTERWARDS.  WHAT'S
2353                   ;SURPRISING IS THAT IMSAI'S SCS-1, WRITTEN BY THE SAME CO.
2354                   ;THAT WROTE ALS-8 FOR P.T. (MICRO-TEC OF SUNNYVALE CALIF.),
2355                   ;HAS THIS FIXED, EVEN THOUGH IT WAS AN EARLIER PRODUCT.
2356                   ;
2357   ECAE   CD5DF1   ORG2:   CALL    ASBL            ;GET ORG VALUE
2358   ECB1   3ADBD1           LDA     OBUF+18         ;FETCH ERROR FLAG
2359   ECB4   FE20             CPI     ' '             ;LINE O.K. ?
2360   ECB6   C0               RNZ                     ;IGNORA IF NOT
2361   ECB7   EB               XCHG                    ;VALUE TO D,E
2362   ECB8   2AF7D0           LHLD    ASPC            ;GET CUR. PGM COUNTER
2363   ECBB   EB               XCHG                    ;NEW ORG H,L - PC IN D,E
2364   ECBC   22F7D0           SHLD    ASPC            ;MAKE ORG NEW P.C.
2365   ECBF   22F1D0           SHLD    BBUF+2          ;AND MAKE IT STORAGE CNTR ALSO
2366   ECC2   C9               RET                     ;DONE, AND YOU ARE SCREWED
2367                   ;
2368                   ;PROCESS THE $ SYMBOL (CUR. VALUE OF PGM. COUNTER)
2369                   ;
2370   ECC3   23       LECC3:  INX     H               ;INCREMENT POINTER
2371   ECC4   2201D1           SHLD    PNTR            ;SAVE POINTER
2372   ECC7   2AF7D0           LHLD    ASPC            ;GET CUR. PGM. COUNTER
2373   ECCA   C304F2           JMP     AVAL            ;TO FINISH EXPR. EVALUATION
2374                   ;
2375                   ;PROCESS NLST AND LST PSEUDO OPS.
2376                   ;
2377   ECCD   D606     LECCD:  SUI     6               ;CONVERT LST/NLST TO 0 OR 1
2378   ECCF   320AD1           STA     ALST            ;SAVE AP LIST FLAG
23791
2380 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2381+                                                      21:15  07/30/2018
2382+                                                                                      PAGE 42
2383
2384
2385
2386   ECD2   C9               RET                     ;DONE
2387                   ;
2388                   ;PROCESS COM PSEUDO OP
2389                   ;
2390   ECD3   CD6AE2   LECD3:  CALL    ZBUF            ;CLEAR ABUF
2391   ECD6   CDCCEE           CALL    SBLK            ;SCAN TO LABEL TO ENTER
2392   ECD9   CDF8F0           CALL    SLAB            ;LOOKUP LABEL, VALUE IN H,L
2393   ECDC   DA37F3           JC      ERRA            ;IF ERROR IN LABEL
2394   ECDF   C225F3           JNZ     ERRU            ;IF LABEL NOT FOUND
2395   ECE2   1100D3   LECE2:  LXI     D,SYSYM         ;SYSTEM SYMBOL TABLE
2396   ECE5   2205D1   LECE5:  SHLD    OPRD            ;SAVE VALUE IN OPRD
2397   ECE8   0605             MVI     B,LLAB          ;LENGTH OF LABELS
2398   ECEA   CD28E2           CALL    COMS            ;SEE IF ALREADY IN SYSTEM TABLE
2399   ECED   CAF9EC           JZ      LECF9           ;ALREADY IN TABLE, CHG VALUE
2400   ECF0   CDA5EB           CALL    LEBA5           ;NOT IN TABLE, ADD IT
2401   ECF3   13               INX     D               ;POINT PAST (UNDEFINED) VALUE
2402   ECF4   13               INX     D               ;2ND BYTE
2403   ECF5   AF               XRA     A               ;GET BINARY ZERO
2404   ECF6   12               STAX    D               ;TABLE'S NEW END MARK
2405   ECF7   1B               DCX     D               ;POINT TO 2ND BYTE OF VALUE
2406   ECF8   3C               INR     A               ;TURN ZERO FLAG OFF
2407   ECF9   2A05D1   LECF9:  LHLD    OPRD            ;GET SYMBOL'S VALUE
2408   ECFC   EB               XCHG                    ;TO D,E
2409   ECFD   73               MOV     M,E             ;STORE 1 BYTE
2410   ECFE   2B               DCX     H               ;POINT FROM 2ND TO 1ST BYTE
2411   ECFF   72               MOV     M,D             ;STORE IT, TOO.
2412   ED00   C9               RET                     ;DONE
2413                   ;
2414                   ;DO ASC PSEUDO OP
2415                   ;
2416   ED01   CDCCEE   LED01:  CALL    SBLK            ;SCAN TO 1ST NON BLANK CHAR
2417   ED04   DA37F3           JC      ERRA            ;IF C/R FOUND
2418   ED07   4F               MOV     C,A             ;SAVE AS DELIM.
2419   ED08   23               INX     H               ;POINT TO 1ST CHR OF STRING
2420   ED09   7E               MOV     A,M             ;GET IT
2421   ED0A   FE0D             CPI     0DH             ;END OF LINE ?
2422   ED0C   CA37F3           JZ      ERRA            ;ERROR THEN
2423   ED0F   B9               CMP     C               ;SECOND DELIMITER ?
2424   ED10   CA37F3           JZ      ERRA            ;ERROR THEN, TOO
2425   ED13   06F9             MVI     B,0F9H          ;******MAY BE ADDRESS DEPENDANT
2426   ED15   7E       LED15:  MOV     A,M             ;GET THE CHAR FROM STRING
2427   ED16   FE0D             CPI     0DH             ;END OF LINE ?
2428   ED18   CA57ED           JZ      LED57           ;DONE WITH STRING THEN
2429   ED1B   B9               CMP     C               ;2ND DELIMITER ?
2430   ED1C   CA57ED           JZ      LED57           ;DONE WITH STRING THEN
2431   ED1F   2201D1           SHLD    PNTR            ;SAVE STRING POINTER
2432   ED22   2AF7D0           LHLD    ASPC            ;GET PROGRAM COUNTER
2433   ED25   23               INX     H               ;THIS USED UP 1 BYTE
2434   ED26   22F7D0           SHLD    ASPC            ;PUT UPDATED POINTER BACK
2435   ED29   04               INR     B               ;
2436   ED2A   C5               PUSH    B               ;SAVE B,C
24371
2438 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2439+                                                      21:15  07/30/2018
2440+                                                                                      PAGE 43
2441
2442
2443
2444   ED2B   CD1DEE           CALL    ASTO            ;PUT BYTE IN MEMORY & LISTING
2445   ED2E   7D               MOV     A,L             ;GET LOW BYTE OF LISTING PTR
2446   ED2F   FED8             CPI     (OBUF+15) AND 0FFH
2447   ED31   C24FED           JNZ     LED4F           ;NO, DO NEXT BYTE
2448   ED34   CD2EEB           CALL    AOUT            ;YES, PRINT THE LINE
2449   ED37   C1               POP     B               ;GET BACK B,C
2450   ED38   0600             MVI     B,0             ;RESET FLAG
2451   ED3A   C5               PUSH    B               ;SAVE B,C AGAIN
2452   ED3B   212020           LXI     H,2020H         ;TWO SPACES
2453   ED3E   22C9D1           SHLD    OBUF            ;BLANK ADDR FIELD BYTES 1 & 2
2454   ED41   22CBD1           SHLD    OBUF+2          ;3RD & 4TH BYTES
2455   ED44   3E0D             MVI     A,0DH           ;GET C/R
2456   ED46   32D9D1           STA     OBUF+16         ;LINE ENDS WITH OBJECT CODE
2457   ED49   21CCD1           LXI     H,OBUF+3        ;LAST BYTE OF ADDR FIELD
2458   ED4C   220BD1           SHLD    OIND            ;OUTPUT POINTER FOR NXT LINE
2459   ED4F   2A01D1   LED4F:  LHLD    PNTR            ;GET STRING POINTER
2460   ED52   C1               POP     B               ;RESTORE B,C
2461   ED53   23               INX     H               ;INCREMENT STRING POINTER
2462   ED54   C315ED           JMP     LED15           ;DO NEXT BYTE OF STRING
2463                   ;
2464                   ;GET HERE WHEN HAVE REACHED 2ND DELIMITER OR C/R
2465                   ;
2466   ED57   78       LED57:  MOV     A,B             ;GET 1ST LINE FLAG TO A
2467   ED58   B7               ORA     A               ;SET FLAGS
2468   ED59   F8               RM                      ;ON 1ST LINE, DONE
2469   ED5A   CAF6EA           JZ      LEAF6           ;FOR S.T./XREF, MAIN LOOP
2470   ED5D   2A0BD1           LHLD    OIND            ;GET OUTPUT LINE POINTER
2471   ED60   23               INX     H               ;POINT PAST LAST BYTE
2472   ED61   360D             MVI     M,0DH           ;TERMINATE LINE
2473   ED63   C9               RET                     ;DONE
2474                   ;
2475                   ;PROCESS STAX AND LDAX INST.
2476                   ;
2477   ED64   CD5DF1   TYP2:   CALL    ASBL            ;FETCH OPERAND
2478   ED67   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
2479   ED6A   7D               MOV     A,L             ;GET LOW ORDER OPERAND
2480   ED6B   B7               ORA     A               ;SET FLAGS
2481   ED6C   CA88ED           JZ      TY31            ;OPERAND = 0
2482   ED6F   FE02             CPI     2               ;OPERAND = 2
2483   ED71   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
2484   ED74   C388ED           JMP     TY31
2485                   ;
2486                   ;PROCESS PUSH, POP, INX, DCX, DAD INSTRUCTIONS
2487                   ;
2488   ED77   CD5DF1   TYP3:   CALL    ASBL            ;FETCH OPERAND
2489   ED7A   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
2490   ED7D   7D               MOV     A,L             ;GET LOW ORDER OPERAND
2491   ED7E   0F               RRC                     ;CHECK LOW ORDER BIT
2492   ED7F   DC11F3           CC      ERRR            ;ILLEGAL REGISTER
2493   ED82   17               RAL                     ;RESTORE
2494   ED83   FE08             CPI     8               ;
24951
2496 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2497+                                                      21:15  07/30/2018
2498+                                                                                      PAGE 44
2499
2500
2501
2502   ED85   D411F3           CNC     ERRR            ;ILLEGAL REGISTER
2503   ED88   07       TY31:   RLC                     ;SHIFT LEFT 3 TIMES
2504   ED89   17               RAL                     ;
2505   ED8A   17               RAL                     ;
2506   ED8B   47       TY32:   MOV     B,A             ;SAVE REGISTER
2507   ED8C   1A               LDAX    D               ;FETCH OPCODE BASE
2508   ED8D   80               ADD     B               ;FORM OPCODE W/REGISTER
2509   ED8E   FE76             CPI     76H             ;CHECK FOR MOV M,M
2510   ED90   CC11F3           CZ      ERRR            ;ILLEGAL REGISTER
2511   ED93   C31DEE           JMP     ASTO            ;PUT IN MEM & INR P.C.
2512                   ;
2513                   ;PROCESS ACCUMULATOR, INR, DCR, MOV, RST INSTRUCTIONS
2514                   ;
2515   ED96   CD5DF1   TYP4:   CALL    ASBL            ;FETCH OPERAND
2516   ED99   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
2517   ED9C   7D               MOV     A,L             ;GET LOW ORDER OPERAND
2518   ED9D   FE08             CPI     8               ;
2519   ED9F   D411F3           CNC     ERRR            ;ILLEGAL REGISTER
2520   EDA2   1A               LDAX    D               ;FETCH OPCODE BASE
2521   EDA3   FE40             CPI     40H             ;CHECK FOR MOV INST.
2522   EDA5   CAB4ED           JZ      TY41            ;PROCESS THEM SEPARATELY
2523   EDA8   FEC7             CPI     0C7H            ;
2524   EDAA   7D               MOV     A,L             ;OPERAND IN ACCUM.
2525   EDAB   CA88ED           JZ      TY31            ;RST INSTRUCTION
2526   EDAE   FA8BED           JM      TY32            ;ACCUMULATOR INST.
2527   EDB1   C388ED           JMP     TY31            ;INR, DCR INSTRUCTIONS
2528                   ;
2529                   ;PROCESS MOV INSTRUCTIONS
2530                   ;
2531   EDB4   29       TY41:   DAD     H               ;MULT OPRND BY 8 (3 LFT SHIFTS)
2532   EDB5   29               DAD     H               ;
2533   EDB6   29               DAD     H               ;
2534   EDB7   85               ADD     L               ;FORM OPCODE
2535   EDB8   12               STAX    D               ;SAVE OPCODE
2536   EDB9   CDF2ED           CALL    MPNT            ;
2537   EDBC   CD60F1           CALL    ASCN            ;
2538   EDBF   C411F3           CNZ     ERRR            ;
2539   EDC2   7D               MOV     A,L             ;FETCH LOW ORDER OPERAND
2540   EDC3   FE08             CPI     8               ;
2541   EDC5   D411F3           CNC     ERRR            ;ILLEGAL REGISTERS
2542   EDC8   C38BED           JMP     TY32            ;
2543                   ;
2544                   ;PROCESS IMMEDIATE INSTRUCTIONS
2545                   ;IMMEDIATE BYTE CAN BE -256 TO +255
2546                   ;MVI INSTRUCTION IS A SPECIAL CASE AND HAS 2 OPERANDS
2547                   ;
2548   EDCB   FE06     TYP5:   CPI     6               ;CHECK FOR MVI INST
2549   EDCD   CCE0ED           CZ      TY56            ;SPECIAL CASE
2550   EDD0   CD1DEE           CALL    ASTO            ;PUT OBJ. IN MEM & ON LISTING
2551   EDD3   CD5DF1   TYS5:   CALL    ASBL            ;GET IMMEDIATE ARG.
2552   EDD6   3C               INR     A               ;
25531
2554 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2555+                                                      21:15  07/30/2018
2556+                                                                                      PAGE 45
2557
2558
2559
2560   EDD7   FE02             CPI     2               ;CHECK OPERAND FOR RANGE
2561   EDD9   D42AF3           CNC     ERRV            ;OPERAND OUT OF RANGE
2562   EDDC   7D               MOV     A,L             ;
2563   EDDD   C31DEE           JMP     ASTO            ;PUT OBJECT IN MEM & ON LISTING
2564                   ;
2565                   ;FETCH 1ST ARGUMENT FOR MVI AND LXI INSTRUCTIONS
2566                   ;
2567   EDE0   CD5DF1   TY56:   CALL    ASBL            ;FETCH ARGUMENT
2568   EDE3   C411F3           CNZ     ERRR            ;ILLEGAL REGISTER
2569   EDE6   7D               MOV     A,L             ;GET LOW ORDER ARGUMENT
2570   EDE7   FE08             CPI     8               ;
2571   EDE9   D411F3           CNC     ERRR            ;ILLEGAL REGISTER
2572   EDEC   29               DAD     H               ;MULT BY 8 (3 LEFT SHIFTS)
2573   EDED   29               DAD     H               ;
2574   EDEE   29               DAD     H               ;
2575   EDEF   1A               LDAX    D               ;FETCH OPCODE BASE
2576   EDF0   85               ADD     L               ;FORM OPCODE
2577   EDF1   5F               MOV     E,A             ;SAVE OBJECT BYTE
2578   EDF2   2A01D1   MPNT:   LHLD    PNTR            ;FETCH POINTER
2579   EDF5   7E               MOV     A,M             ;FETCH CHARACTER
2580   EDF6   FE2C             CPI     ','             ;CHECK FOR COMMA
2581   EDF8   23               INX     H               ;INCREMENT POINTER
2582   EDF9   2201D1           SHLD    PNTR            ;AND SAVE IT
2583   EDFC   C21AF3           JNZ     ERRS            ;SYNTAX ERROR IF NO COMMA
2584   EDFF   7B               MOV     A,E             ;
2585   EE00   C9               RET                     ;
2586                   ;
2587                   ;PROCESS 3 BYTE INSTRUCTIONS
2588                   ;LXI INSTRUCTION IS A SPECIAL CASE
2589                   ;
2590   EE01   FE01     TYP6:   CPI     1               ;CHECK FOR LXI INSTRUCTION
2591   EE03   C211EE           JNZ     TY6             ;JUMP IF NOT LXI
2592   EE06   CDE0ED           CALL    TY56            ;GET REGISTER
2593   EE09   E608             ANI     8               ;CHECK FOR ILLEGAL REGISTER
2594   EE0B   C411F3           CNZ     ERRR            ;REGISTER ERROR
2595   EE0E   7B               MOV     A,E             ;GET OPCODE
2596   EE0F   E6F7             ANI     0F7H            ;CLEAR BIT IN ERROR
2597   EE11   CD1DEE   TY6:    CALL    ASTO            ;STORE OBJECT BYTE
2598   EE14   CD5DF1   TYS6:   CALL    ASBL            ;FETCH OPERAND
2599   EE17   7D               MOV     A,L             ;TO ACCUM
2600   EE18   54               MOV     D,H             ;
2601   EE19   CD1DEE           CALL    ASTO            ;PUT 2ND BYTE IN MEMORY
2602   EE1C   7A               MOV     A,D             ;
2603                   ;
2604                   ;THIS ROUTINE IS USED TO STORE OBJECT CODE PRODUCED BY
2605                   ;THE ASSEMBLER DURING THE 2ND PASS INTO MEMORY
2606                   ;
2607   EE1D   2AF1D0   ASTO:   LHLD    BBUF+2          ;FETCH STORAGE COUNTER
2608   EE20   47               MOV     B,A             ;SAVE OBJECT BYTE
2609   EE21   3AF9D0           LDA     PASI            ;GET PASS INDICATOR
2610   EE24   FE02             CPI     2               ;3RD PASS ? (S.T./XREF)
26111
2612 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2613+                                                      21:15  07/30/2018
2614+                                                                                      PAGE 46
2615
2616
2617
2618   EE26   D0               RNC                     ;SKIP OBJECT STORAGE THEN
2619   EE27   78               MOV     A,B             ;ELSE RESTORE OBJECT BYTE
2620   EE28   77               MOV     M,A             ;AND PUT IT IN MEMORY
2621   EE29   23               INX     H               ;INCREMENT STORAGE POINTER
2622   EE2A   22F1D0           SHLD    BBUF+2          ;AND PUT IT BACK
2623   EE2D   2A0BD1           LHLD    OIND            ;GET OUTPUT ADDRESS
2624   EE30   23               INX     H               ;INCR. TO POINT PAST LAST BYTE
2625   EE31   23               INX     H               ;AGAIN, PUT SPACE BETWEEN BYTES
2626   EE32   CD93E3           CALL    BINH+3          ;CONVERT OBJECT BYTE TO ASCII
2627   EE35   220BD1           SHLD    OIND            ;AND SAVE UPDATED POINTER
2628   EE38   C9               RET                     ;OBJECT IN MEM & ON LISTING
2629                   ;
2630                   ;PROCESS THE END PSEUDO OP
2631                   ;
2632   EE39   21F9D0   LEE39:  LXI     H,PASI          ;POINT TO THE PASS INDICATOR
2633   EE3C   7E               MOV     A,M             ;GET IT
2634   EE3D   FE01             CPI     1               ;JUST FINISHED 2ND PASS ?
2635   EE3F   CA4CEE           JZ      LEE4C           ;YES - DONE OR START 3RD PASS
2636   EE42   D29DEE           JNC     LEE9D           ;IF 3RD PASS COMPLETE
2637   EE45   CD16E2           CALL    CRLF            ;DO CRLF AT START OF EA. PASS
2638   EE48   34               INR     M               ;INCREMENT PASS COUNTER
2639   EE49   C3EAEA           JMP     LEAEA           ;START NEXT PASS
2640                   ;
2641                   ;GET HERE AT END OF 2ND PASS
2642                   ;
2643   EE4C   3AF4D0   LEE4C:  LDA     SYMX            ;GET S.T./XREF FLAG
2644   EE4F   FE46             CPI     'E'+1           ;'S' OR 'X' OPTION REQUESTED ?
2645   EE51   DA60E0           JC      EORMS           ;NO - ASSY DONE, BACK TO ALS8
2646   EE54   34               INR     M               ;YES - INCREMENT PASS IND.
2647   EE55   CD16E2           CALL    CRLF            ;CRLF AFTER EA. PASS
2648   EE58   CD16E2   LEE58:  CALL    CRLF            ;AGAIN BEFORE S.T./XREF
2649   EE5B   AF               XRA     A               ;GET A ZERO
2650   EE5C   32F3D0   LEE5C:  STA     SCNT            ;SAVE AS SYMBOL COUNT
2651   EE5F   2A32D1           LHLD    SYMADD          ;GET ADDR OF SYMBOL TABLE
2652   EE62   54               MOV     D,H             ;DUPLICATE IN D,E
2653   EE63   5D               MOV     E,L             ;
2654                   ;
2655                   ;TEST NAMES POINTED TO BY D,E AND H,L
2656                   ;LEAVE NAME WHICH COMES 1ST IN ALPHABETICAL ORDER
2657                   ;POINTED TO BY D,E
2658                   ;
2659   EE64   010400   LEE64:  LXI     B,LLAB-1        ;OFFSET TO LAST CHAR OF NAME
2660   EE67   7E               MOV     A,M             ;GET 1ST CHAR OF NAME
2661   EE68   B7               ORA     A               ;ZERO ?
2662   EE69   CA82EE           JZ      LEE82           ;REACHED END OF SYMBOL TABLE
2663   EE6C   09               DAD     B               ;POINT TO LAST CHAR
2664   EE6D   EB               XCHG                    ;
2665   EE6E   09               DAD     B               ;POINT TO LAST CHAR
2666   EE6F   EB               XCHG                    ;
2667   EE70   0C               INR     C               ;C = LENGTH OF NAME
2668   EE71   CD94E9           CALL    COM1            ;COMPARE NAMES
26691
2670 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2671+                                                      21:15  07/30/2018
2672+                                                                                      PAGE 47
2673
2674
2675
2676   EE74   23               INX     H               ;POINT BACK AT 1ST CHAR
2677   EE75   13               INX     D               ;POINT BACK AT 1ST CHAR
2678   EE76   010700           LXI     B,LLAB+2        ;LENGTH OF TABLE ENTRY
2679   EE79   DA7EEE           JC      LEE7E           ;ALREADY IN CORRECT ORDER
2680   EE7C   54               MOV     D,H             ;MAKE D,E POINT TO "1ST" NAME
2681   EE7D   5D               MOV     E,L             ;
2682   EE7E   09       LEE7E:  DAD     B               ;H,L POINT TO NEXT NAME
2683   EE7F   C364EE           JMP     LEE64           ;TST NAMES POINTED TO BY DE, HL
2684                   ;
2685                   ;GET HERE WHEN PASS COMPLETED THRU SYMBOL TABLE
2686                   ;D,E POINT TO NAME WHICH COMES "1ST" IN ALPH. ORDER
2687                   ;NOTE THAT THE SYMBOLS ARE NOT MOVED IN THE TABLE, BUT
2688                   ;THAT THEIR 1ST CHAR IS REPLACED WITH 0FFH AS THE ARE PRINTED
2689                   ;
2690   EE82   EB       LEE82:  XCHG                    ;"1ST" NAME TO D,E
2691   EE83   7E               MOV     A,M             ;GET 1ST CHAR OF "LOWEST" NAME
2692   EE84   3D               DCR     A               ;IS IT 0FFH ? (IT WASN'T ZERO)
2693   EE85   FAB7E0           JM      EOR             ;IF SO, RETURN TO ALS-8
2694   EE88   3C               INR     A               ;ELSE RESTORE
2695   EE89   2230D1           SHLD    SYMSV           ;AND SAVE IT'S ADDRESS
2696   EE8C   CDA8EE           CALL    LEEA8           ;PRINT IT AND IT'S VALUE
2697   EE8F   3AF4D0           LDA     SYMX            ;GET THE S.T./XREF FLAG
2698   EE92   FE58             CPI     'X'             ;XREF REQUESTED ?
2699   EE94   CAEAEA           JZ      LEAEA           ;DO THE CROSS REFERENCE SEARCH
2700   EE97   3AF3D0           LDA     SCNT            ;ELSE GET SYMBOL COUNT
2701   EE9A   3C               INR     A               ;INCREMENT IT
2702   EE9B   FE04             CPI     4               ;MAX NO. SYMBOLS PRINTED/LINE
2703   EE9D   2A30D1   LEE9D:  LHLD    SYMSV           ;GET SYMBOL POINTER
2704   EEA0   36FF             MVI     M,0FFH          ;MAKE SYMBOL LAST
2705   EEA2   DA5CEE           JC      LEE5C           ;DO MORE SYMBOLS THIS LINE
2706   EEA5   C358EE           JMP     LEE58           ;TO START A NEW LINE
2707                   ;
2708                   ;THIS ROUTINE PRINTS NAMES AND THEIR VALUES.
2709                   ;IT IS USED FOR BOTH THE S.T./XREF AND FOR THE FILES/IODR
2710                   ;COMMANDS TO LIST THE DIRECTORY CONTENTS
2711                   ;
2712   EEA8   0E05     LEEA8:  MVI     C,NMLEN         ;CAREFUL IF LLAB <> NMLEN !
2713   EEAA   47       LEEAA:  MOV     B,A             ;SAVE CHAR IN B
2714   EEAB   B7               ORA     A               ;SET FLAGS
2715   EEAC   C2B1EE           JNZ     LEEB1           ;IF CHAR IS NOT HEX 00
2716   EEAF   0620             MVI     B,' '           ;PRINT SPACE TO PAD SHORT NAMES
2717   EEB1   CDCFD0   LEEB1:  CALL    OUT8            ;PRINT IT
2718   EEB4   23               INX     H               ;INCREMENT POINTER
2719   EEB5   7E               MOV     A,M             ;GET CHAR TO PRINT
2720   EEB6   0D               DCR     C               ;DCR COUNT OF CHARS LEFT
2721   EEB7   C2AAEE           JNZ     LEEAA           ;DO REMAINING CHARS
2722   EEBA   0E03             MVI     C,3             ;NO OF SPACES TO FOLLOW NAME
2723   EEBC   CD61E3           CALL    BLKO            ;PRINT THEM
2724   EEBF   56               MOV     D,M             ;GET SYMBOL VALUE IN D,E
2725   EEC0   23               INX     H               ;2ND BYTE
2726   EEC1   5E               MOV     E,M             ;IN D,E
27271
2728 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2729+                                                      21:15  07/30/2018
2730+                                                                                      PAGE 48
2731
2732
2733
2734   EEC2   E5               PUSH    H               ;SAVE POINTER
2735   EEC3   CD5CE5           CALL    ADOUT           ;PRINT VALUE
2736   EEC6   D1               POP     D               ;RESTORE POINTER TO D,E
2737   EEC7   0E05             MVI     C,5             ;NO OF SPACES AFTER VALUE
2738   EEC9   C361E3           JMP     BLKO            ;PRINT THEM & RETURN
2739                   ;
2740                   ;ROUTINE TO SCAN THROUGH SPACES UNTIL NON-BLANK CHAR FOUND
2741                   ;
2742   EECC   2A01D1   SBLK:   LHLD    PNTR            ;GET POINTER
2743   EECF   7E       SBL1:   MOV     A,M             ;GET CHAR AT POINTER
2744   EED0   FE20             CPI     ' '             ;SPACE ?
2745   EED2   C0               RNZ                     ;NO - DONE
2746   EED3   23       SBL2:   INX     H               ;YES - INCREMENT POINTER
2747   EED4   2201D1           SHLD    PNTR            ;AND UPDATE IT
2748   EED7   C3CFEE           JMP     SBL1            ;THEN CHECK NEW CHAR
2749                   ;
2750                   ;THIS ROUTINE IS USED TO CHECK THE CONDITION CODE
2751                   ;MNEMONICS FOR CONDITIONAL JUMPS, CALLS AND RETURNS.
2752                   ;
2753   EEDA   21E0D0   COND:   LXI     H,ABUF+1        ;POINT TO 2ND CHAR
2754   EEDD   22D4D0           SHLD    ADDS            ;SAVE IT'S ADDR.
2755   EEE0   0602             MVI     B,2             ;MAX. LENGTH OF CONDITION
2756   EEE2   C322F0           JMP     COPC            ;TO LOOKUP IN TABLE
2757                   ;
2758                   ;HERE IS THE ASSEMBLER OPCODE TABLE
2759                   ;
2760                   ;PSEUDO OPS WITH LENGTH OF 4 (OR PADDED TO 4 WITH HEX 0'S)
2761                   ;COME FIRST
2762                   ;
2763   EEE5   4F5247   OTAB:   DB      'ORG'
2764   EEE8   0000             DW      0
2765   EEEA   455155           DB      'EQU'
2766   EEED   0001             DW      0100H
2767   EEEF   4442             DB      'DB'
2768   EEF1   0000             DW      0
2769   EEF3   FF               DB      0FFH
2770   EEF4   4453             DB      'DS'
2771   EEF6   0000             DW      0
2772   EEF8   02               DB      2
2773   EEF9   4457             DB      'DW'
2774   EEFB   0000             DW      0
2775   EEFD   03               DB      3
2776   EEFE   454E44           DB      'END'
2777   EF01   0004             DW      0400H
2778   EF03   434F4D           DB      'COM'
2779   EF06   0005             DW      0500H
2780   EF08   4C5354           DB      'LST'
2781   EF0B   0006             DW      0600H
2782   EF0D   4E4C5354         DB      'NLST'
2783   EF11   07               DB      7
2784   EF12   415343           DB      'ASC'
27851
2786 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2787+                                                      21:15  07/30/2018
2788+                                                                                      PAGE 49
2789
2790
2791
2792   EF15   0008             DW      0800H
2793   EF17   00               DB      0
2794                   ;
2795                   ;THESE ARE FOLLOWED BY 3 CHAR OPCODES (OR 2 CHAR PADDED TO 3)
2796                   ;
2797   EF18   484C54           DB      'HLT'
2798   EF1B   76               DB      118
2799   EF1C   524C43           DB      'RLC'
2800   EF1F   07               DB      7
2801   EF20   525243           DB      'RRC'
2802   EF23   0F               DB      15
2803   EF24   52414C           DB      'RAL'
2804   EF27   17               DB      23
2805   EF28   524152           DB      'RAR'
2806   EF2B   1F               DB      31
2807   EF2C   524554           DB      'RET'
2808   EF2F   C9               DB      201
2809   EF30   434D41           DB      'CMA'
2810   EF33   2F               DB      47
2811   EF34   535443           DB      'STC'
2812   EF37   37               DB      55
2813   EF38   444141           DB      'DAA'
2814   EF3B   27               DB      39
2815   EF3C   434D43           DB      'CMC'
2816   EF3F   3F               DB      63
2817   EF40   4549             DB      'EI'
2818   EF42   00FB             DW      0FB00H
2819   EF44   4449             DB      'DI'
2820   EF46   00F3             DW      0F300H
2821   EF48   4E4F50           DB      'NOP'
2822   EF4B   0000             DW      0
2823   EF4D   58434847         DB      'XCHG'
2824   EF51   EB               DB      235
2825   EF52   5854484C         DB      'XTHL'
2826   EF56   E3               DB      227
2827   EF57   5350484C         DB      'SPHL'
2828   EF5B   F9               DB      249
2829   EF5C   5043484C         DB      'PCHL'
2830   EF60   E900             DW      00E9H
2831   EF62   53544158         DB      'STAX'
2832   EF66   02               DB      2
2833   EF67   4C444158         DB      'LDAX'
2834   EF6B   0A00             DW      000AH
2835   EF6D   50555348         DB      'PUSH'
2836   EF71   C5               DB      197
2837   EF72   504F50           DB      'POP'
2838   EF75   00C1             DW      0C100H
2839   EF77   494E58           DB      'INX'
2840   EF7A   0003             DW      0300H
2841   EF7C   444358           DB      'DCX'
2842   EF7F   000B             DW      0B00H
28431
2844 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2845+                                                      21:15  07/30/2018
2846+                                                                                      PAGE 50
2847
2848
2849
2850   EF81   444144           DB      'DAD'
2851   EF84   0009             DW      0900H
2852   EF86   00               DB      0
2853   EF87   494E52           DB      'INR'
2854   EF8A   04               DB      4
2855   EF8B   444352           DB      'DCR'
2856   EF8E   05               DB      5
2857   EF8F   4D4F56           DB      'MOV'
2858   EF92   40               DB      64
2859   EF93   414444           DB      'ADD'
2860   EF96   80               DB      128
2861   EF97   414443           DB      'ADC'
2862   EF9A   88               DB      136
2863   EF9B   535542           DB      'SUB'
2864   EF9E   90               DB      144
2865   EF9F   534242           DB      'SBB'
2866   EFA2   98               DB      152
2867   EFA3   414E41           DB      'ANA'
2868   EFA6   A0               DB      160
2869   EFA7   585241           DB      'XRA'
2870   EFAA   A8               DB      168
2871   EFAB   4F5241           DB      'ORA'
2872   EFAE   B0               DB      176
2873   EFAF   434D50           DB      'CMP'
2874   EFB2   B8               DB      184
2875   EFB3   525354           DB      'RST'
2876   EFB6   C700             DW      00C7H
2877   EFB8   414449           DB      'ADI'
2878   EFBB   C6               DB      198
2879   EFBC   414349           DB      'ACI'
2880   EFBF   CE               DB      206
2881   EFC0   535549           DB      'SUI'
2882   EFC3   D6               DB      214
2883   EFC4   534249           DB      'SBI'
2884   EFC7   DE               DB      222
2885   EFC8   414E49           DB      'ANI'
2886   EFCB   E6               DB      230
2887   EFCC   585249           DB      'XRI'
2888   EFCF   EE               DB      238
2889   EFD0   4F5249           DB      'ORI'
2890   EFD3   F6               DB      246
2891   EFD4   435049           DB      'CPI'
2892   EFD7   FE               DB      254
2893   EFD8   494E             DB      'IN'
2894   EFDA   00DB             DW      0DB00H
2895   EFDC   4F5554           DB      'OUT'
2896   EFDF   D3               DB      211
2897   EFE0   4D5649           DB      'MVI'
2898   EFE3   0600             DW      0006H
2899                   ;
2900                   ;WHICH ARE FOLLOWED BY 4 CHAR OPCODES (OR LESS PADDED TO 4)
29011
2902 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2903+                                                      21:15  07/30/2018
2904+                                                                                      PAGE 51
2905
2906
2907
2908                   ;
2909   EFE5   4A4D50           DB      'JMP'
2910   EFE8   00C3             DW      0C300H
2911   EFEA   43414C4C         DB      'CALL'
2912   EFEE   CD               DB      205
2913   EFEF   4C5849           DB      'LXI'
2914   EFF2   0001             DW      0100H
2915   EFF4   4C4441           DB      'LDA'
2916   EFF7   003A             DW      3A00H
2917   EFF9   535441           DB      'STA'
2918   EFFC   0032             DW      3200H
2919   EFFE   53484C44         DB      'SHLD'
2920   F002   22               DB      34
2921   F003   4C484C44         DB      'LHLD'
2922   F007   2A00             DW      002AH
2923                   ;
2924                   ;WHICH IS FINALLY FOLLOWED BY THE 2 CHAR CNDX CODE TABLE
2925                   ;
2926   F009   4E5A             DB      'NZ'
2927   F00B   00               DB      0
2928   F00C   5A               DB      'Z'
2929   F00D   0008             DW      0800H
2930   F00F   4E43             DB      'NC'
2931   F011   10               DB      16
2932   F012   43               DB      'C'
2933   F013   0018             DW      1800H
2934   F015   504F             DB      'PO'
2935   F017   20               DB      32
2936   F018   5045             DB      'PE'
2937   F01A   28               DB      40
2938   F01B   50               DB      'P'
2939   F01C   0030             DW      3000H
2940   F01E   4D               DB      'M'
2941   F01F   0038             DW      3800H
2942   F021   00               DB      0
2943                   ;
2944                   ;THIS ROUTINE IS USED TO CHECK A GIVEN OPCODE
2945                   ;AGAINST THE LEGAL OPCODES IN THE OPCODE TABLE
2946                   ;
2947   F022   2AD4D0   COPC:   LHLD    ADDS            ;GET POINTER
2948   F025   1A               LDAX    D               ;FETCH CHARACTER
2949   F026   B7               ORA     A               ;SET FLAGS
2950   F027   CA34F0           JZ      COP1            ;END OF TABLE
2951   F02A   48               MOV     C,B             ;LENGTH OF STRING
2952   F02B   CD57E2           CALL    SEAR            ;SEARCH THE TABLE
2953   F02E   1A               LDAX    D               ;
2954   F02F   C8               RZ                      ;RETURN IF MATCH
2955   F030   13               INX     D               ;NEXT STRING
2956   F031   C322F0           JMP     COPC            ;CONTINUE SEARCH
2957   F034   3C       COP1:   INR     A               ;CLEAR ZERO FLAG
2958   F035   13               INX     D               ;INCREMENT ADDRESS
29591
2960 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2961+                                                      21:15  07/30/2018
2962+                                                                                      PAGE 52
2963
2964
2965
2966   F036   C9               RET                     ;NO MATCH
2967                   ;
2968                   ;THIS ROUTINE CHECKS THE LEGAL OPCODES IN BOTH PASS 1
2969                   ;AND PASS 2.  IN PASS 1 THE PROGRAM COUNTER IS INCREMENTED
2970                   ;BY THE CORRECT NUMBER OF BYTES. AN ADDRESS IS
2971                   ;ALSO SET SO THAT AN INDEXED JUMP CAN BE MADE TO
2972                   ;PROCESS THE OPCODE FOR PASS 2.
2973                   ;
2974   F037   21DFD0   OPCD:   LXI     H,ABUF          ;GET ADDRESS
2975   F03A   22D4D0           SHLD    ADDS            ;SAVE IT
2976   F03D   11E5EE           LXI     D,OTAB          ;OPCODE TABLE ADDR.
2977   F040   0604             MVI     B,4             ;LENGTH OF PSEUDO-OP ENTRIES
2978   F042   CD22F0           CALL    COPC            ;LOOK IT UP IN TABLE
2979   F045   CAE6F0           JZ      PSEU            ;PSEUDO-OP IF FOUND
2980   F048   05               DCR     B               ;ELSE TRY 3-CHAR OPCODES
2981   F049   CD22F0           CALL    COPC            ;LOOK IT UP
2982   F04C   CA53F0           JZ      OP1             ;IF FOUND IN THIS GROUP
2983   F04F   04               INR     B               ;THEN TRY FOUR CHAR OPCODES
2984   F050   CD22F0           CALL    COPC            ;LOOK IT UP
2985   F053   211DEE   OP1:    LXI     H,ASTO          ;TYPE 1 INSTRUCTIONS
2986   F056   0E01     OP2:    MVI     C,1             ;1 BYTE INST.
2987   F058   CAB3F0           JZ      OCNT            ;IF FOUND
2988                   ;
2989   F05B   CD22F0   OPC2:   CALL    COPC            ;CHECK FOR STAX, LDAX
2990   F05E   2164ED           LXI     H,TYP2          ;
2991   F061   CA56F0           JZ      OP2             ;
2992   F064   CD22F0           CALL    COPC            ;CHK FOR PUSH, POP, INX, DCX, DAD
2993                   ;
2994   F067   2177ED           LXI     H,TYP3          ;
2995   F06A   CA56F0           JZ      OP2             ;
2996   F06D   05               DCR     B               ;3 CHAR OPCODES
2997   F06E   CD22F0           CALL    COPC            ;ACC INST: INR, DCR, MOV, RST
2998                   ;
2999   F071   2196ED           LXI     H,TYP4          ;
3000   F074   CA56F0           JZ      OP2             ;
3001                   ;
3002   F077   CD22F0   OPC3:   CALL    COPC            ;IMMEDIATE INSTRUCTIONS
3003   F07A   21CBED           LXI     H,TYP5
3004   F07D   0E02             MVI     C,2             ;2 BYTE INSTRUCTIONS
3005   F07F   CAB3F0           JZ      OCNT            ;
3006   F082   04               INR     B               ;4 CHAR OPCODES
3007   F083   CD22F0           CALL    COPC            ;JMP, CALL, LXI, LDA, STA,
3008                   ;                               ;LHLD, SHLD
3009   F086   CAAEF0           JZ      OP4             ;
3010   F089   CDDAEE           CALL    COND            ;CONDITIONAL INST.
3011   F08C   C2D8F0           JNZ     OERR            ;ILLEGAL OPCODE
3012   F08F   C6C0             ADI     192             ;ADD BASE VALUE TO RETURN
3013   F091   57               MOV     D,A             ;
3014   F092   0603             MVI     B,3             ;3 CHARACTER OPCODES
3015   F094   3ADFD0           LDA     ABUF            ;FETCH 1ST CHAR
3016   F097   4F               MOV     C,A             ;SAVE IT
30171
3018 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3019+                                                      21:15  07/30/2018
3020+                                                                                      PAGE 53
3021
3022
3023
3024   F098   FE52             CPI     'R'             ;CONDITIONAL RETURN
3025   F09A   7A               MOV     A,D             ;
3026   F09B   CA53F0           JZ      OP1             ;
3027   F09E   79               MOV     A,C             ;
3028   F09F   14               INR     D               ;FORM CONDITIONAL JUMP
3029   F0A0   14               INR     D               ;
3030   F0A1   FE4A             CPI     'J'             ;CONDITIONAL JUMP
3031   F0A3   CAADF0           JZ      OPAD            ;
3032   F0A6   FE43             CPI     'C'             ;CONDITIONAL CALL
3033   F0A8   C2D8F0           JNZ     OERR            ;ILLEGAL OPCODE
3034   F0AB   14               INR     D               ;FORM CONDITIONAL CALL
3035   F0AC   14               INR     D               ;
3036   F0AD   7A       OPAD:   MOV     A,D             ;GET OPCODE
3037   F0AE   2101EE   OP4:    LXI     H,TYP6          ;
3038   F0B1   0E03     OP5:    MVI     C,3             ;3 BYTE INSTRUCTIONS
3039   F0B3   3209D1   OCNT:   STA     TEMP            ;SAVE OPCODE
3040                   ;
3041                   ;CHECK FOR OPCODE ONLY CONTAINING CORRECT NO. OF CHARS.
3042                   ;THUS ADDQ, SAY, WOULD GIVE AN ERROR
3043                   ;
3044   F0B6   3EDF             MVI     A,ABUF AND 0FFH ;LOAD BUFFER ADDRESS
3045   F0B8   80               ADD     B               ;LENGTH OF OPCODE
3046   F0B9   5F               MOV     E,A             ;
3047   F0BA   3ED0             MVI     A,ABUF/256      ;
3048   F0BC   CE00             ACI     0               ;GET HIGH ORDER ADDRESS
3049   F0BE   57               MOV     D,A             ;
3050   F0BF   1A               LDAX    D               ;FETCH CHAR AFTER OPCODE
3051   F0C0   B7               ORA     A               ;IT SHOULD BE ZERO
3052   F0C1   C2D8F0           JNZ     OERR            ;OPCODE ERROR
3053   F0C4   3AF9D0           LDA     PASI            ;FETCH PASS INDICATOR
3054   F0C7   0600     OCN1:   MVI     B,0             ;
3055   F0C9   EB               XCHG                    ;
3056   F0CA   2AF7D0   OCN2:   LHLD    ASPC            ;FETCH PROGRAM COUNTER
3057   F0CD   09               DAD     B               ;ADD IN BYTE COUNT
3058   F0CE   22F7D0           SHLD    ASPC            ;STORE PC
3059   F0D1   B7               ORA     A               ;WHICH PASS
3060   F0D2   C8               RZ                      ;RETURN IF PASS 1
3061   F0D3   3A09D1           LDA     TEMP            ;FETCH OPCODE
3062   F0D6   EB               XCHG                    ;
3063   F0D7   E9               PCHL                    ;
3064                   ;
3065   F0D8   213CF3   OERR:   LXI     H,ERRO          ;SET ERROR ADDRESS
3066   F0DB   0E03     LF0DB:  MVI     C,3             ;LEAVE 3 BYTES FOR PATCH
3067   F0DD   C3C4F0           JMP     OCN1-3          ;
3068                   ;
3069   F0E0   2151F3   LF0E0:  LXI     H,ERRL
3070   F0E3   C3DBF0           JMP     LF0DB
3071                   ;
3072   F0E6   21E3D0   PSEU:   LXI     H,ABUF+4        ;SET BUFFER ADDRESS
3073   F0E9   7E               MOV     A,M             ;FETCH CHAR AFTER OPCODE
3074   F0EA   B7               ORA     A               ;IT SHOULD BE ZERO
30751
3076 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3077+                                                      21:15  07/30/2018
3078+                                                                                      PAGE 54
3079
3080
3081
3082   F0EB   C2D8F0           JNZ     OERR            ;IF NOT
3083   F0EE   3AF9D0           LDA     PASI            ;GET PASS INDICATOR
3084   F0F1   B7               ORA     A               ;PASS 1 ?
3085   F0F2   CAC2EB           JZ      PSU1            ;YES - JUMP
3086   F0F5   C371EC           JMP     PSU2            ;NO - DO 2ND PASS OPERATIONS
3087                   ;
3088                   ;THIS ROUTINE IS USED TO PROCESS LABELS.
3089                   ;IT CHECKS TO SEE IF A LABEL IS IN THE SYMBOL TABLE
3090                   ;OR NOT.  ON RETURN, Z=1 INDICATES A MATCH WAS FOUND
3091                   ;AND H,L CONTAIN THE VALUE ASSOCIATED WITH THE LABEL.
3092                   ;THE REGISTER NAMES A, B, C, D, E, H, L, AND M ARE
3093                   ;PRE-DEFINED AND NEED NOT BE ENTERED BY THE USER.
3094                   ;ON RETURN, C=1 INDICATES A LABEL ERROR.
3095                   ;
3096   F0F8   FE41     SLAB:   CPI     'A'             ;CHECK FOR LEGAL CHAR
3097   F0FA   D8               RC                      ;ILLEGAL CHAR
3098   F0FB   FE5B             CPI     'Z'+1           ;CHECK FOR LEAGAL CHAR
3099   F0FD   3F               CMC                     ;SETTING CARRY FOR PROPER RET
3100   F0FE   D8               RC                      ;ILLEGAL CHAR
3101   F0FF   CD3EF1           CALL    ALPS            ;PLACE SYMBOL IN ABUF
3102   F102   21DFD0           LXI     H,ABUF          ;POINT TO SYMBOL
3103   F105   3AF9D0           LDA     PASI            ;GET PASS INDICATOR
3104   F108   FE02             CPI     2               ;DOING XREF/S.T. PASS ?
3105   F10A   3C               INR     A               ;BUMP PASS INDICATOR IN ACCUM.
3106   F10B   D0               RNC                     ;RETURN IF ON XREF/S.T. PASS
3107   F10C   22D4D0           SHLD    ADDS            ;SAVE ADDRESS OF SYMBOL
3108   F10F   05               DCR     B               ;CHECK IF ONLY 1 CHAR SYMBOL
3109   F110   C223F1           JNZ     SLA1            ;LOOK THEM UP IN REG. TABLE
3110   F113   04               INR     B               ;SET B=1
3111   F114   112DF1           LXI     D,RTAB          ;POINT TO REGISTER TABLE
3112   F117   CD22F0           CALL    COPC            ;LOOK FOR MATCH
3113   F11A   C223F1           JNZ     SLA1            ;NOT FOUND, TRY SYMBOL TABLE
3114   F11D   6F               MOV     L,A             ;FOUND, VALUE TO L
3115   F11E   2600             MVI     H,0             ;AND MAKE H ZERO
3116   F120   37               STC                     ;SET CARRY
3117   F121   3F               CMC                     ;COMPLEMENT CARRY
3118   F122   C9               RET                     ;DONE
3119   F123   2A32D1   SLA1:   LHLD    SYMADD          ;GET SYMBOL TABLE ADDR
3120   F126   EB               XCHG                    ;TO D,E
3121   F127   0605             MVI     B,LLAB          ;LENGTH OF LABELS
3122   F129   CD28E2           CALL    COMS            ;CHECK TABLE
3123   F12C   C9               RET                     ;WITH FLAGS SET
3124                   ;
3125                   ;HERE IS THE INTERNAL REGISTER TABLE
3126                   ;
3127   F12D   41       RTAB:   DB      'A'
3128   F12E   07               DB      7
3129   F12F   42               DB      'B'
3130   F130   00               DB      0
3131   F131   43               DB      'C'
3132   F132   01               DB      1
31331
3134 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3135+                                                      21:15  07/30/2018
3136+                                                                                      PAGE 55
3137
3138
3139
3140   F133   44               DB      'D'
3141   F134   02               DB      2
3142   F135   45               DB      'E'
3143   F136   03               DB      3
3144   F137   48               DB      'H'
3145   F138   04               DB      4
3146   F139   4C               DB      'L'
3147   F13A   05               DB      5
3148   F13B   4D               DB      'M'
3149   F13C   06               DB      6
3150   F13D   00               DB      0
3151                   ;
3152                   ;THIS ROUTINE SCANS THE INPUT LINE AND PLACES THE
3153                   ;OPCODES AND LABELS IN THE ABUF BUFFER.  THE SCAN TERMINATES
3154                   ;WHEN A NON ALPHANUMERIC CHARACTER (A-Z, 0-9) IS FOUND.
3155                   ;
3156   F13E   0600     ALPS:   MVI     B,0             ;SET COUNT
3157   F140   12       ALP1:   STAX    D               ;STORE CHAR IN BUFFER
3158   F141   04               INR     B               ;INCREMENT COUNT
3159   F142   78               MOV     A,B             ;FETCH COUNT
3160   F143   FE0F             CPI     15              ;MAX BUFFER SIZE
3161   F145   D0               RNC                     ;RETURN IF BUFFER FILLED
3162   F146   13               INX     D               ;INCREMENT ABUF POINTER
3163   F147   23               INX     H               ;INCREMENT INPUT LINE POINTER
3164   F148   2201D1           SHLD    PNTR            ;SAVE INPUT POINTER
3165   F14B   7E               MOV     A,M             ;FETCH CHARACTER
3166   F14C   FE30             CPI     '0'             ;CHECK FOR LEGAL CHAR
3167   F14E   D8               RC                      ;ILLEGAL CHAR
3168   F14F   FE3A             CPI     '9'+1           ;AGAIN
3169   F151   DA40F1           JC      ALP1            ;NUMERIC = O.K.
3170   F154   FE41     LF154:  CPI     'A'             ;TEST FOR LETTER
3171   F156   D8               RC                      ;ILLEGAL CHAR
3172   F157   FE5B             CPI     'Z'+1           ;
3173   F159   DA40F1           JC      ALP1            ;VALID LETTER
3174   F15C   C9               RET                     ;W/CARRY SET, ILLEGAL CHAR
3175                   ;
3176                   ;THIS ROUTINE IS USED TO SCAN THE INPUT LINE AND DETERMINE
3177                   ;THE VALUE OF AN OPERAND FIELD.  ON RETURN, VALUE IS IN H,L.
3178                   ;
3179   F15D   CDCCEE   ASBL:   CALL    SBLK            ;GET THE FIRST ARGUMENT
3180   F160   2A01D1   ASCN:   LHLD    PNTR            ;FETCH SCAN POINTER
3181   F163   7E               MOV     A,M             ;FETCH CHARACTER
3182   F164   210000           LXI     H,0             ;GET A ZERO
3183   F167   2205D1           SHLD    OPRD            ;INITIALIZE OPERAND
3184   F16A   2C               INR     L               ;L = 1 ==> BECOMES OPRI
3185   F16B   67               MOV     H,A             ;CHAR TO H, BECOMES GTLT
3186   F16C   2207D1           SHLD    OPRI            ;SAVE OPRI AND GTLT
3187   F16F   2A01D1   NXT1:   LHLD    PNTR            ;GET SCAN POINTER
3188   F172   2B               DCX     H               ;INIT. FOR LOOP BELOW
3189   F173   CD6AE2           CALL    ZBUF            ;CLEAR OUT ABUFF
3190   F176   3204D1           STA     SIGN            ;ZERO SIGN INDICATOR
31911
3192 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3193+                                                      21:15  07/30/2018
3194+                                                                                      PAGE 56
3195
3196
3197
3198   F179   23       NXT2:   INX     H               ;INCREMENT POINTER
3199   F17A   7E               MOV     A,M             ;GET CHAR
3200   F17B   FE3C             CPI     '<'             ;HIGH ORDER BYTE SIGN ?
3201   F17D   CA79F1           JZ      NXT2            ;ALREADY TAKEN CARE OF (GTLT)
3202   F180   FE3E             CPI     '>'             ;LOW ORDER BYTE SIGN ?
3203   F182   CA79F1           JZ      NXT2            ;ALREADY TAKEN CARE OF (GTLT)
3204   F185   FE21             CPI     ' '+1           ;CAR. RETURN OR SPACE ?
3205   F187   DAC8F2           JC      SEND            ;END OF OPERAND FIELD THEN
3206   F18A   FE2C             CPI     ','             ;FIELD SEPARATOR ?
3207   F18C   CAC8F2           JZ      SEND            ;ALSO END OF FIELD
3208                   ;
3209                   ;CHECK FOR OPERATORS
3210                   ;
3211   F18F   FE2B             CPI     '+'             ;CHECK FOR PLUS
3212   F191   CAA6F1           JZ      LF1A6           ;STORE 0 AS SIGN
3213   F194   04               INR     B               ;MAKE B 01
3214   F195   FE2D             CPI     '-'             ;MINUS SIGN ?
3215   F197   CAA6F1           JZ      LF1A6           ;SAVE NON-ZERO SIGN
3216   F19A   04               INR     B               ;MAKE B 02
3217   F19B   FE2A             CPI     '*'             ;CHECK FOR MULTIPLY
3218   F19D   CAA6F1           JZ      LF1A6           ;STORE B AS 02
3219   F1A0   04               INR     B               ;MAKE B 03
3220   F1A1   FE2F             CPI     '/'             ;CHECK FOR DIVIDE
3221   F1A3   C2BAF1           JNZ     ASC2            ;IF NOT SIGN, CHK FOR OPERAND
3222   F1A6   78       LF1A6:  MOV     A,B             ;MOVE B TO A
3223   F1A7   3204D1           STA     SIGN            ;SET SIGN BYTE
3224   F1AA   3A07D1   ASC1:   LDA     OPRI            ;FETCH OPERAND INDICATOR
3225   F1AD   FE02             CPI     2               ;CHECK FOR 2 OPERATORS TOGETHER
3226   F1AF   CA1AF3           JZ      ERRS            ;SYNTAX ERROR
3227   F1B2   3E02             MVI     A,2             ;NOW SET UP OPRI AS 2
3228   F1B4   3207D1           STA     OPRI            ;AND STORE IT
3229   F1B7   C379F1           JMP     NXT2            ;ANOTHER WILL NOT BE ALLOWED
3230                   ;
3231                   ;CHECK FOR OPERANDS
3232                   ;
3233   F1BA   4F       ASC2:   MOV     C,A             ;SAVE CHAR
3234   F1BB   3A07D1           LDA     OPRI            ;GET OPERATOR
3235   F1BE   B7               ORA     A               ;CHECK FOR TWO OPERANDS
3236   F1BF   CA1AF3           JZ      ERRS            ;TWO IN A ROW NOT ALLOWED
3237   F1C2   79               MOV     A,C             ;RESTORE CHAR
3238   F1C3   FE24             CPI     '$'             ;PGM. COUNTER ?
3239   F1C5   CAC3EC           JZ      LECC3           ;GET IT & CONTINUE
3240                   ;
3241                   ;CHECK FOR ASCII CHARACTERS
3242                   ;
3243   F1C8   FE27     ASC3:   CPI     27H             ;QUOTE MARK ?
3244   F1CA   C2F4F1           JNZ     ASC5            ;NO - MUST BE SOMETHING ELSE
3245   F1CD   110000           LXI     D,0             ;INITIALIZE CHAR. VALUE
3246   F1D0   0E03             MVI     C,3             ;MAX CHAR COUNT + 1
3247   F1D2   23       ASC4:   INX     H               ;POINT TO NEXT CHAR
3248   F1D3   2201D1           SHLD    PNTR            ;SAVE POINTER
32491
3250 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3251+                                                      21:15  07/30/2018
3252+                                                                                      PAGE 57
3253
3254
3255
3256   F1D6   7E               MOV     A,M             ;GET CHAR
3257   F1D7   FE0D             CPI     0DH             ;CARRIAGE RETURN ?
3258   F1D9   CA37F3           JZ      ERRA            ;ARGUMENT ERROR THEN
3259   F1DC   FE27             CPI     27H             ;2ND QUOTE MARK ?
3260   F1DE   C2EBF1           JNZ     SSTR            ;NO - PROCESS CHAR
3261   F1E1   23               INX     H               ;POINT PAST 2ND QUOTE
3262   F1E2   2201D1           SHLD    PNTR            ;UPDATE POINTER
3263   F1E5   7E               MOV     A,M             ;FETCH NEXT CHAR
3264   F1E6   FE27             CPI     27H             ;CHECK FOR TWO IN A ROW
3265   F1E8   C205F2           JNZ     AVAL+1          ;WAS TERMINAL QUOTE
3266   F1EB   0D       SSTR:   DCR     C               ;CHECK COUNT
3267   F1EC   CA37F3           JZ      ERRA            ;TOO MANY CHARS
3268   F1EF   53               MOV     D,E             ;1ST CHAR (IF ANY) IN D
3269   F1F0   5F               MOV     E,A             ;THIS CHAR IN E
3270   F1F1   C3D2F1           JMP     ASC4            ;GET NEXT CHAR
3271   F1F4   FE30     ASC5:   CPI     '0'             ;SEE IF NUMERIC
3272   F1F6   DA37F3           JC      ERRA            ;NO CHARS < 30H LEGAL
3273   F1F9   FE3A             CPI     '9'+1           ;TRY HIGH END
3274   F1FB   D274F2           JNC     ALAB            ;ALPHABETIC - TRY LABEL
3275   F1FE   CDEBF2           CALL    NUMS            ;NUMERIC - CONVERT
3276   F201   DA37F3           JC      ERRA            ;ARGUMENT ERROR
3277   F204   EB       AVAL:   XCHG                    ;OPERAND VALUE IN H,L
3278   F205   2A05D1           LHLD    OPRD            ;FETCH OPERAND VALUE
3279   F208   AF               XRA     A               ;GET A ZERO
3280   F209   3207D1           STA     OPRI            ;AND CLEAR OPERAND INDICATOR
3281   F20C   3A04D1           LDA     SIGN            ;GET SIGN
3282   F20F   FE01             CPI     1               ;MINUS SIGN ?
3283   F211   CA1EF2           JZ      ASUB            ;THEN DO A SUBTACTION
3284   F214   D227F2           JNC     LF227           ;MULTIPLY OR DIVIDE
3285   F217   19               DAD     D               ;ADD NEW OPERAND DE TO OLD HL
3286   F218   2205D1   ASC7:   SHLD    OPRD            ;AND UPDATE THE RESULT
3287   F21B   C36FF1           JMP     NXT1            ;NOW SEE IF MORE
3288   F21E   7D       ASUB:   MOV     A,L             ;GET OLD OPRAND IN H,L
3289   F21F   93               SUB     E               ;SUBTRACT NEW OPRAND IN D,E
3290   F220   6F               MOV     L,A             ;RESTORE RESULT TO H,L
3291   F221   7C               MOV     A,H             ;NOW DO HIGH ORDER BYTE
3292   F222   9A               SBB     D               ;
3293   F223   67               MOV     H,A             ;PUT IT BACK
3294   F224   C318F2           JMP     ASC7            ;AND FINISH UP
3295                   ;
3296                   ;DO MULTIPLY DIVIDE
3297                   ;
3298   F227   42       LF227:  MOV     B,D             ;MOVE CURRENT OPRD IN DE TO BC
3299   F228   4B               MOV     C,E             ;
3300   F229   EB               XCHG                    ;AND OLD OPRND TO D,E
3301   F22A   210000           LXI     H,0             ;INITIALIZE ANSWER
3302   F22D   FE03             CPI     3               ;DOING DIVISION ?
3303   F22F   CA47F2           JZ      LF247           ;YES
3304   F232   CD38F2           CALL    LF238           ;NO, MULITPLICATION - DO IT
3305   F235   C318F2           JMP     ASC7            ;THEN FINISH UP
3306                   ;
33071
3308 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3309+                                                      21:15  07/30/2018
3310+                                                                                      PAGE 58
3311
3312
3313
3314                   ;MULTIPLICATION ROUTINE
3315                   ;
3316                   ;THIS ALGORITHM IS INTERESTING BUT DIFFICULT TO UNDERSTAND
3317                   ;UNTIL STUDIED FOR A WHILE. BUT IT DOES WORK
3318                   ;
3319   F238   3E10     LF238:  MVI     A,16            ;16 BITS
3320   F23A   29       LF23A:  DAD     H               ;MULTIPLY PARTIAL ANS. BY 2
3321   F23B   EB               XCHG                    ;CHANGE REGISTERS
3322   F23C   29               DAD     H               ;MULT. MULTIPLIER BY 2
3323   F23D   EB               XCHG                    ;RESTORE ORIG. REGISTERS
3324   F23E   D242F2           JNC     LF242           ;IF 2X MULTIPLIER ==> NO CARRY
3325   F241   09               DAD     B               ;ADD MULTIPLICAND TO INTER ANS
3326   F242   3D       LF242:  DCR     A               ;DCR NO OF BITS LEFT TO CHECK
3327   F243   C23AF2           JNZ     LF23A           ;DO IT OVER IF NOT DONE
3328   F246   C9               RET                     ;ELSE FINAL ANS. IS IN H,L
3329                   ;
3330                   ;DIVISION ROUTINE
3331                   ;
3332                   ;FIRST CHECK FOR DIVIDE BY ZERO
3333                   ;
3334   F247   78       LF247:  MOV     A,B             ;GET BYTE OF DIVISOR
3335   F248   B1               ORA     C               ;OR IT WITH OTHER BYTE
3336   F249   CA18F2           JZ      ASC7            ;CAN'T DIVIDE BY ZERO
3337   F24C   CD53F2           CALL    LF253           ;DO ACTUALLY DO THE DIVISION
3338   F24F   EB               XCHG                    ;ANSWER TO H,L
3339   F250   C318F2           JMP     ASC7            ;TO FINISH UP
3340                   ;
3341                   ;DIVISION ROUTINE FOLLOWS. IT IS SIMILAR IN PRINCIPLE TO
3342                   ;THE MULTIPLICATION ROUTINE
3343                   ;
3344   F253   3E10     LF253:  MVI     A,16            ;16 BITS
3345   F255   32F3D0   LF255:  STA     SCNT            ;SAVE AS COUNT
3346   F258   29               DAD     H               ;SHIFT LEFT
3347   F259   EB               XCHG                    ;SWITCH REGISTERS
3348   F25A   29               DAD     H               ;SHIFT LEFT
3349   F25B   EB               XCHG                    ;RESTORE REGISTERS
3350   F25C   D260F2           JNC     LF260           ;IF NO CARRY
3351   F25F   23               INX     H               ;ELSE INCREMENT H,L
3352   F260   7D       LF260:  MOV     A,L             ;AND SUBTRACT DIVISOR FROM IT
3353   F261   91               SUB     C               ;
3354   F262   6F               MOV     L,A             ;
3355   F263   7C               MOV     A,H             ;
3356   F264   98               SBB     B               ;
3357   F265   67               MOV     H,A             ;
3358   F266   13               INX     D               ;INCREMENT PARTIAL ANSWER
3359   F267   D26CF2           JNC     LF26C           ;OK IF NO CARRY
3360   F26A   09               DAD     B               ;ADD DIVISOR TO H,L
3361   F26B   1B               DCX     D               ;AND DECREMENT ANSWER
3362   F26C   3AF3D0   LF26C:  LDA     SCNT            ;GET COUNT
3363   F26F   3D               DCR     A               ;DECREMENT IT
3364   F270   C255F2           JNZ     LF255           ;IF NOT DONE, DO MORE
33651
3366 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3367+                                                      21:15  07/30/2018
3368+                                                                                      PAGE 59
3369
3370
3371
3372   F273   C9               RET                     ;ELSE DONE, ANS IN D,E
3373                   ;
3374                   ;CHECK FOR SYMBOLS FROM SYMBOL TABLE
3375                   ;
3376   F274   CDF8F0   ALAB:   CALL    SLAB            ;SEE IF LABEL IN TABLE
3377   F277   CA04F2           JZ      AVAL            ;IF FOUND
3378   F27A   DA37F3           JC      ERRA            ;IF LABEL ERROR
3379   F27D   3AF9D0           LDA     PASI            ;NOT FOUND, GET PASS IND.
3380   F280   FE02             CPI     2               ;DOING S.T./XREF PASS ?
3381   F282   D291F2           JNC     LF291           ;YES - PROCESS
3382   F285   1100D3           LXI     D,SYSYM         ;ELSE TRY SYSTEM SYMBOL TABLE
3383   F288   CD28E2           CALL    COMS            ;SEARCH IT
3384   F28B   CA04F2           JZ      AVAL            ;IF FOUND
3385   F28E   C325F3           JMP     ERRU            ;ELSE UNDEFINED SYMBOL ERROR
3386                   ;
3387                   ;THE FOLLOWING ROUTINE IS USED TO HANDLE SYMBOLS DURING A
3388                   ;SYMBOL TABLE/XREF PASS (3RD PASS, PASI = 2).
3389                   ;DOES CROSS REFERENCE
3390                   ;
3391   F291   EB       LF291:  XCHG                    ;D,E ==> SYMBOL NAME IN ABUF
3392   F292   2A30D1           LHLD    SYMSV           ;SYMBOL DOING XREF PASS FOR
3393   F295   0E05             MVI     C,LLAB          ;LENGTH OF SYMBOL
3394   F297   CD57E2           CALL    SEAR            ;SAME ?
3395   F29A   C2C2F2           JNZ     LF2C2           ;NO
3396   F29D   21F3D0           LXI     H,SCNT          ;POINT TO SYMBOL COUNT
3397   F2A0   34               INR     M               ;INCREMENT IT
3398   F2A1   7E               MOV     A,M             ;GET IT
3399   F2A2   FE0C             CPI     12              ;MAX. NO ON ONE LINE ?
3400   F2A4   DAB1F2           JC      LF2B1           ;NO - DO MORE THIS LINE
3401   F2A7   3601             MVI     M,1             ;YES - RESET COUNT
3402   F2A9   CD16E2           CALL    CRLF            ;DO CAR RET/LINE FEED
3403   F2AC   0E11             MVI     C,17            ;AND PRINT 17 SPACES
3404   F2AE   CD61E3           CALL    BLKO            ;DO IT
3405   F2B1   21DFD1   LF2B1:  LXI     H,IBUF-5        ;POINT TO LINE NO.
3406   F2B4   0E04             MVI     C,4             ;LENGTH OF LINE NO
3407   F2B6   46       LF2B6:  MOV     B,M             ;GET A CHAR
3408   F2B7   CDCFD0           CALL    OUT8            ;PRINT IT
3409   F2BA   23               INX     H               ;POINT TO NEXT CHAR
3410   F2BB   0D               DCR     C               ;DECR CHAR COUNT
3411   F2BC   C2B6F2           JNZ     LF2B6           ;DO NEXT CHAR IF NOT DONE
3412   F2BF   CD5CE3           CALL    LE35C           ;PUT OUT A SPACE AFTER LINE NO
3413   F2C2   AF       LF2C2:  XRA     A               ;CLEAR FLAGS
3414   F2C3   2600             MVI     H,0             ;AND H,L
3415   F2C5   C304F2           JMP     AVAL            ;AND CONTINUE SEARCH
3416                   ;
3417                   ;ROUTINE TO CHECK FOR TERMINATING CHARACTERS IN LABEL FILEDS
3418                   ;
3419   F2C8   3A07D1   SEND:   LDA     OPRI            ;FETCH OPERAND INDICATOR
3420   F2CB   B7               ORA     A               ;SET FLAGS
3421   F2CC   C21AF3           JNZ     ERRS            ;SYNTAX ERROR
3422   F2CF   2A05D1           LHLD    OPRD            ;GET OPERAND VALUE
34231
3424 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3425+                                                      21:15  07/30/2018
3426+                                                                                      PAGE 60
3427
3428
3429
3430   F2D2   3A08D1           LDA     GTLT            ;GET SHIFT INDICATOR
3431   F2D5   FE3C             CPI     '<'             ;USING HIGH HALF ONLY ?
3432   F2D7   C2DEF2           JNZ     LF2DE           ;NO - OK AS IS
3433   F2DA   6C               MOV     L,H             ;YES - MOVE HIGH HALF TO L
3434   F2DB   C3E3F2           JMP     LF2E3           ;AND CLEAR HIGH HALF
3435   F2DE   FE3E     LF2DE:  CPI     '>'             ;USING LOW HALF ONLY ?
3436   F2E0   C2E5F2           JNZ     SEN1            ;NO - OK AS IS THEN
3437   F2E3   2600     LF2E3:  MVI     H,0             ;ELSE CLEAR HIGH HALF
3438   F2E5   7C       SEN1:   MOV     A,H             ;GET HIGH ORDER BYTE
3439   F2E6   1109D1           LXI     D,TEMP          ;GET ADDRESS
3440   F2E9   B7               ORA     A               ;SET FLAGS
3441   F2EA   C9               RET                     ;DONE
3442                   ;
3443                   ;GET A NUMERIC VALUE, HEX, OCTAL, OR DECIMAL
3444                   ;
3445   F2EB   CD3EF1   NUMS:   CALL    ALPS            ;PUT CHARS IN ABUFF
3446   F2EE   1B               DCX     D               ;POINT TO LAST CHAR
3447   F2EF   1A               LDAX    D               ;GET LAST CHAR
3448   F2F0   01DFD0           LXI     B,ABUF          ;B,C POINT TO NUMBER
3449   F2F3   FE48             CPI     'H'             ;HEX ?
3450   F2F5   CA07F3           JZ      NUM2            ;YES - PROCESS
3451   F2F8   FE51             CPI     'Q'             ;OCTAL ?
3452   F2FA   CA0CF3           JZ      NUM3            ;YES - PROCESS
3453   F2FD   FE44             CPI     'D'             ;DECIMAL ?
3454   F2FF   C20AE0           JNZ     ADEC            ;PROCESS DECIMAL BY DEFAULT
3455   F302   AF       NUM1:   XRA     A               ;GET BINARY ZERO
3456   F303   12               STAX    D               ;CLEAR THE TYPE LETTER
3457   F304   C30AE0           JMP     ADEC            ;PROCESS DECIMAL
3458   F307   AF       NUM2:   XRA     A               ;GET A BINARY ZERO
3459   F308   12               STAX    D               ;CLEAR THE TRAILING H
3460   F309   C3FAE2           JMP     AHEX            ;PROCESS HEX
3461   F30C   AF       NUM3:   XRA     A               ;GET A BINARY ZERO
3462   F30D   12               STAX    D               ;CLEAR THE TRAILING Q
3463   F30E   C333E3           JMP     AOCT            ;PROCESS OCTAL
3464                   ;
3465                   ;FOLLOWING ARE THE ERROR REPORTING ROUTINES
3466                   ;
3467   F311   3E52     ERRR:   MVI     A,'R'           ;REGISTER ERROR
3468   F313   210000           LXI     H,0             ;CLEAR H,L
3469   F316   32DBD1           STA     OBUF+18         ;WHERE THE ERROR LETTER GOES
3470   F319   C9               RET                     ;DONE
3471   F31A   3E53     ERRS:   MVI     A,'S'           ;SYNTAX ERROR
3472   F31C   32DBD1           STA     OBUF+18         ;WHERE THE ERROR LETTER GOES
3473   F31F   210000           LXI     H,0             ;CLEAR H,L
3474   F322   C3E5F2           JMP     SEN1            ;FINISH UP & GO HOME
3475   F325   3E55     ERRU:   MVI     A,'U'           ;UNDEFINED SYMBOL
3476   F327   C31CF3           JMP     ERRS+2
3477   F32A   3E56     ERRV:   MVI     A,'V'           ;VALUE ERROR
3478   F32C   C313F3           JMP     ERRR+2
3479   F32F   3E4D     ERRM:   MVI     A,'M'           ;MISSING LABEL
3480   F331   32DBD1           STA     OBUF+18         ;WHERE THE ERROR LETTER GOES
34811
3482 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3483+                                                      21:15  07/30/2018
3484+                                                                                      PAGE 61
3485
3486
3487
3488   F334   C341EB           JMP     LEB41           ;FINISH STATEMENT PROCESSING
3489   F337   3E41     ERRA:   MVI     A,'A'           ;ARGUMENT ERROR
3490   F339   C31CF3           JMP     ERRS+2
3491   F33C   3E4F     ERRO:   MVI     A,'O'           ;OPCODE ERROR
3492   F33E   32DBD1           STA     OBUF+18         ;WHERE ERROR LETTER GOES
3493   F341   3AF9D0           LDA     PASI            ;GET PASS INDICATOR
3494   F344   B7               ORA     A               ;SET FLAGS
3495   F345   C8               RZ                      ;RET IF ON 1ST PASS
3496   F346   0E03             MVI     C,3             ;ELSE SET UP TO LEAVE 3 BYTES
3497   F348   AF       ERO1:   XRA     A               ;GET A BINARY ZERO
3498   F349   CD1DEE           CALL    ASTO            ;PUT IT IN MEMORY & LISTING
3499   F34C   0D               DCR     C               ;DECR COUNT
3500   F34D   C248F3           JNZ     ERO1            ;DO MORE IF NOT DONE
3501   F350   C9               RET                     ;DONE - ROOM LEFT FOR PATCH
3502   F351   3E4C     ERRL:   MVI     A,'L'           ;LABEL ERROR
3503   F353   C33EF3           JMP     ERRO+2
3504   F356   3E44     ERRD:   MVI     A,'D'           ;DUPLICATE LABEL
3505   F358   32DBD1           STA     OBUF+18         ;WHERE ERROR LETTER GOES
3506   F35B   CD41EB           CALL    LEB41           ;DISPLAY THE ERROR
3507   F35E   C38EEB           JMP     OPC             ;PROCESS OPCODE
3508                   ;
3509                   ;FOLLOWING IS THE LINE FORMATING ROUTINE
3510                   ;
3511                   ;IT IS BEING LEFT UN-COMMENTED SO THAT YOU MAY TRY TO
3512                   ;COMMENT IT YOURSELF & THEREFORE HAVE A BETTER APPRECIATION
3513                   ;OF THE WORK I HAVE GONE TO - NOTE THAT IT IS LESS THAN TWO
3514                   ;PAGES LONG, AND WE ARE NOW OVER 50 PAGES INTO THIS MONSTER.
3515                   ;HAVE FUN.  (PS - I HAVE GONE TO THE TROUBLE OF PUTING
3516                   ;IN SYMBOLIC REFERENCES TO MAKE THE CODE RE-ASSEMBLEABLE)
3517                   ;
3518   F361   0E00     LF361:  MVI     C,0
3519   F363   21E4D1           LXI     H,IBUF
3520   F366   7E               MOV     A,M
3521   F367   FE2A             CPI     COMCHR
3522   F369   C8               RZ
3523   F36A   0602             MVI     B,2
3524   F36C   CD7AF3           CALL    LF37A
3525   F36F   D8               RC
3526   F370   04               INR     B
3527   F371   CD7AF3           CALL    LF37A
3528   F374   D8               RC
3529   F375   1602             MVI     D,2
3530   F377   C37CF3           JMP     LF37C
3531   F37A   1601     LF37A:  MVI     D,1
3532   F37C   78       LF37C:  MOV     A,B
3533   F37D   82               ADD     D
3534   F37E   47               MOV     B,A
3535   F37F   3A8FD1           LDA     TERMW
3536   F382   D635             SUI     (IBUF+81) AND 0FFH
3537   F384   CA92F3           JZ      LF392
3538   F387   D28EF3           JNC     LF38E
35391
3540 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3541+                                                      21:15  07/30/2018
3542+                                                                                      PAGE 62
3543
3544
3545
3546   F38A   05               DCR     B
3547   F38B   C392F3           JMP     LF392
3548   F38E   7A       LF38E:  MOV     A,D
3549   F38F   17               RAL
3550   F390   80               ADD     B
3551   F391   47               MOV     B,A
3552   F392   78       LF392:  MOV     A,B
3553   F393   C605             ADI     5
3554   F395   47               MOV     B,A
3555   F396   5A       LF396:  MOV     E,D
3556   F397   0C       LF397:  INR     C
3557   F398   7E               MOV     A,M
3558   F399   FE20             CPI     20H
3559   F39B   D8               RC
3560   F39C   23               INX     H
3561   F39D   C296F3           JNZ     LF396
3562   F3A0   1D               DCR     E
3563   F3A1   C297F3           JNZ     LF397
3564   F3A4   0C       LF3A4:  INR     C
3565   F3A5   7E               MOV     A,M
3566   F3A6   FE20             CPI     20H
3567   F3A8   D8               RC
3568   F3A9   23               INX     H
3569   F3AA   CAA4F3           JZ      LF3A4
3570   F3AD   79               MOV     A,C
3571   F3AE   90               SUB     B
3572   F3AF   D0               RNC
3573   F3B0   2B               DCX     H
3574   F3B1   2B               DCX     H
3575   F3B2   3600             MVI     M,0
3576   F3B4   4F               MOV     C,A
3577   F3B5   15               DCR     D
3578   F3B6   C2C5F3           JNZ     LF3C5
3579   F3B9   2A01D1           LHLD    PNTR
3580   F3BC   2F               CMA
3581   F3BD   3C               INR     A
3582   F3BE   5F               MOV     E,A
3583   F3BF   1600             MVI     D,0
3584   F3C1   19               DAD     D
3585   F3C2   2201D1           SHLD    PNTR
3586   F3C5   69       LF3C5:  MOV     L,C
3587   F3C6   26FF             MVI     H,0FFH
3588   F3C8   0E00             MVI     C,0
3589   F3CA   1136D2           LXI     D,IBUF+82
3590   F3CD   19               DAD     D
3591   F3CE   EB               XCHG
3592   F3CF   CD79E9           CALL    RMOV
3593   F3D2   EB               XCHG
3594   F3D3   23       LF3D3:  INX     H
3595   F3D4   3620             MVI     M,20H
3596   F3D6   7D               MOV     A,L
35971
3598 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3599+                                                      21:15  07/30/2018
3600+                                                                                      PAGE 63
3601
3602
3603
3604   F3D7   BB               CMP     E
3605   F3D8   C2D3F3           JNZ     LF3D3
3606   F3DB   23               INX     H
3607   F3DC   23               INX     H
3608   F3DD   48               MOV     C,B
3609   F3DE   C9               RET
3610   F3DF   3A8FD1   LF3DF:  LDA     TERMW
3611   F3E2   3C               INR     A
3612   F3E3   C9               RET
3613                   ;
3614                   ;FOLLOWING IS THE CODE TO SET THE TERMINAL WIDTH
3615                   ;NOTE THAT WHAT IS ACTUALLY STORED IS THE LOW ORDER BYTE
3616                   ;OF THE 1ST ADDR BEYOND THE BUFFER END, NOT THE WIDTH ITSELF.
3617                   ;
3618   F3E4   01DFD0   TERM:   LXI     B,ABUF          ;POINT TO KEYED IN VALUE
3619   F3E7   CD0AE0           CALL    ADEC            ;CONVERT TO BINARY
3620   F3EA   7D               MOV     A,L             ;VALUE TO A
3621   F3EB   D61B             SUI     (-(IBUF+1)) AND 0FFH
3622   F3ED   FE5C             CPI     (IBUF+120) AND 0FFH
3623   F3EF   D2DDE7           JNC     WHAT            ;IF TERMW > 120 SPECIFIED
3624   F3F2   328FD1           STA     TERMW           ;SAVE IT
3625   F3F5   C360E0           JMP     EORMS           ;DONE
3626   F3F8   00               NOP
3627   F3F9   00               NOP
3628   F3FA   00               NOP
3629   F3FB   00               NOP
3630   F3FC   00               NOP
3631   F3FD   00               NOP
3632   F3FE   00               NOP
3633   F3FF   00               NOP
3634                   ;
3635                   ; ****** END OF ALS8ASM MODULE
3636                   ;
3637                   ;
3638                   ;THIS IS THE INTERPRETIVE DEBUGGING SIMULATOR
3639                   ;IT'S BASIC OPERATION IS TO SIMULATE ALL OF THE 8080
3640                   ;REGISTERS IN MEMORY, & THEN MOVE THE INST. TO BE
3641                   ;SIMULATED INTO A 3 BYTE AREA IN RAM AND EXECUTE IT
3642                   ;FOLLOWED BY A JUMP INST WHICH RETURNS CONTROL TO THE
3643                   ;ROUTINE.  A SIMULATOR SIMILAR TO THIS WAS DESCRIBED IN
3644                   ;DETAIL IN SEPT. 77 KILOBAUD PG. 64.  HOWEVER ALTHOUGH
3645                   ;THE PRINCIPLE IS THE SAME, THE CODE IS QUITE DIFFERENT.
3646                   ;THE SIMULATOR ENTRY POINT IS AT F75C.
3647                   ;
3648                   ;COME HERE TO "SIMULATE" A SINGLE INSTRUCTION
3649                   ;
3650   F400   210000   LF400:  LXI     H,0             ;GET TWO ZEROS
3651   F403   224DD1           SHLD    LD14C+1         ;CLEAR 2ND & 3RD INST BYTES
3652   F406   2A3CD1           LHLD    LD13C           ;GET PGM COUNTER
3653   F409   7E               MOV     A,M             ;GET NEXT INST TO SIMULATE
3654   F40A   324CD1           STA     LD14C           ;SAVE IT IN INST REG
36551
3656 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3657+                                                      21:15  07/30/2018
3658+                                                                                      PAGE 64
3659
3660
3661
3662   F40D   47               MOV     B,A             ;AND IN B
3663   F40E   FE40             CPI     40H             ;TRYING TO DETERMINE TYPE INST
3664   F410   DA22F4           JC      LF422           ;FOR FURTHER TESTING
3665   F413   FEC0             CPI     0C0H            ;MORE TESTING
3666   F415   D275F4           JNC     LF475           ;INST >= C0 HEX
3667   F418   C359F4           JMP     LF459           ;1 BYTE ACCUM INST
3668                   ;
3669                   ;RETURN HERE TO PROCESS 1 BYTE ACCUM. INST
3670                   ;
3671   F41B   23       LF41B:  INX     H               ;INR PGM COUNTER
3672   F41C   223ED1           SHLD    LD13E           ;SAVE ADDR OF NEXT INST
3673   F41F   C334F6           JMP     LF634           ;PROCESS THE INST
3674                   ;
3675                   ;GET HERE FOR INST WITH OPCODES LESS THAN 40H
3676                   ;
3677   F422   E607     LF422:  ANI     7               ;MASK LOW 3 BITS
3678   F424   CA1BF4           JZ      LF41B           ;NOP IS ONLY LEGAL 8080 INST
3679   F427   FE03             CPI     3               ;MASK LOW ORDER TWO BITS
3680   F429   DA39F4           JC      LF439           ;01,02,09,0A,..,31,32,39,3A ETC
3681   F42C   FE06             CPI     6               ;CHECK FOR MVI
3682   F42E   C21BF4           JNZ     LF41B           ;JMP IF NOT MVI
3683                   ;
3684                   ;COME HERE FOR ACCUMULATOR IMMEDIATE INST (MVI, ADI, CPI, ETC)
3685                   ;
3686   F431   23       LF431:  INX     H               ;POINT TO 2ND BYTE
3687   F432   7E               MOV     A,M             ;GET IT
3688   F433   324DD1           STA     LD14C+1         ;SAVE AS 2ND BYTE TO SIMULATE
3689   F436   C31BF4           JMP     LF41B           ;SIMULATE INST. EXECUTION
3690                   ;
3691                   ;COME HERE FOR LXI, STAX, DAD, LDAX, SHLD, LHLD, STA, LDA
3692                   ;
3693   F439   FE02     LF439:  CPI     2               ;STAX/LDAX,SHLD/LHLD,STA/LDA
3694   F43B   78               MOV     A,B             ;RESTORE THE FULL OPCODE
3695   F43C   CA51F4           JZ      LF451           ;FOR LIST 2 INST PREV.
3696   F43F   E608             ANI     8               ;CHECK FOR DAD
3697   F441   C21BF4           JNZ     LF41B           ;PROCESS DAD INST
3698   F444   23       LF444:  INX     H               ;POINT TO 2ND BYTE
3699   F445   7E               MOV     A,M             ;GET IT
3700   F446   324DD1           STA     LD14C+1         ;PUT IT IN SIM'S INST REG
3701   F449   23               INX     H               ;POINT TO 3RD BYTE
3702   F44A   7E               MOV     A,M             ;GET IT
3703   F44B   324ED1           STA     LD14C+2         ;PUT IT IN AS 3RD BYTE
3704   F44E   C31BF4           JMP     LF41B           ;SIMULATE EXECUTION OF THE INST
3705                   ;
3706                   ;COME HERE FOR STAX, LDAX, SHLD, LHLD, STA, LDA
3707                   ;
3708   F451   FE20     LF451:  CPI     20H             ;DIVIDE GROUP IN 2 PARTS
3709   F453   D244F4           JNC     LF444           ;FOR SHLD/LHLD, STA/LDA
3710   F456   C31BF4           JMP     LF41B           ;FOR LDAX/STAX
3711                   ;
3712                   ;GET HERE FOR 1 BYTE ACCUM. INST > 40H AND < C0H
37131
3714 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3715+                                                      21:15  07/30/2018
3716+                                                                                      PAGE 65
3717
3718
3719
3720                   ;MOV,CMP,ANA,ADD,ADC,SUB,SBB,XRA,ORA AND HLT
3721                   ;
3722   F459   FE76     LF459:  CPI     76H             ;HALT INST ?
3723   F45B   CA61F4           JZ      LF461           ;YES - PROCESS IT
3724   F45E   C31BF4           JMP     LF41B           ;NO - PROCESS OTHERS
3725                   ;
3726                   ;PROCESS HALT INST
3727                   ;
3728   F461   CD16E2   LF461:  CALL    CRLF            ;DO CR/LF
3729   F464   CDB8F6           CALL    LF6B8           ;PRINT OUT SIMULATORS P.C.
3730   F467   2170F4           LXI     H,LF470         ;POINT TO HALT MESSAGE
3731   F46A   CD80E3           CALL    SCRN            ;PRINT "HALT"
3732   F46D   C374F7           JMP     LF774           ;AND THEN RESTART SIMULATOR
3733   F470   48414C54 LF470:  DB      'HALT',0DH
3734   F474   0D
3735                   ;
3736                   ;COME HERE FOR INST WITH OPCODES >= C0 HEX
3737                   ;
3738   F475   E607     LF475:  ANI     7               ;MASK LOW 3 BITS
3739   F477   CA9FF4           JZ      LF49F           ;CONDITIONAL RETURN
3740   F47A   FE02             CPI     2               ;CONDITIONAL JUMP ?
3741   F47C   CACAF4           JZ      LF4CA           ;YES - PROCESS CNDX JMP
3742   F47F   DAB0F4           JC      LF4B0           ;POP, RET, PCHL, SPHL
3743   F482   FE04             CPI     4               ;CONDITIONAL CALL ?
3744   F484   CA05F5           JZ      LF505           ;YES - PROCESS IT
3745   F487   DAEFF4           JC      LF4EF           ;NO-JMP,IN,OUT,EI,DI,XTHL,XCHG
3746   F48A   FE06             CPI     6               ;ACCUM. IMMEDIATE ?
3747   F48C   CA31F4           JZ      LF431           ;YES - PROCESS
3748   F48F   DA42F5           JC      LF542           ;PUSH, CALL & ILLEGAL
3749                   ;
3750                   ;GET HERE TO PROCESS RST INSTRUCTIONS
3751                   ;
3752   F492   AF               XRA     A               ;GET A ZERO
3753   F493   323FD1           STA     LD13E+1         ;CLEAR HIGH ORDER CALLED ADDR
3754   F496   78               MOV     A,B             ;RESTORE OPCODE TO A
3755   F497   E638             ANI     38H             ;MASK RST TYPE
3756   F499   323ED1           STA     LD13E           ;STORE AS LOW ORDER BYTE
3757   F49C   C311F5           JMP     LF511           ;PROCESS AS NORMAL CALL
3758                   ;
3759                   ;COME HERE FOR CONDITIONAL RETURN
3760                   ;
3761   F49F   CD51F5   LF49F:  CALL    LF551           ;OPERATE ON OPCODE & FLAG REG
3762   F4A2   C2DAF4           JNZ     LF4DA           ;CNDX NOT MET,CLEAN UP, GO HOME
3763                   ;
3764                   ;COME HERE TO PROCESS RETURN
3765                   ;
3766   F4A5   EB       LF4A5:  XCHG                    ;SAVE PGM CTR IN D,E
3767   F4A6   2A40D1           LHLD    LD140           ;GET STACK POINTER H,L
3768   F4A9   CD7FF5           CALL    LF57F           ;POP STK & SAVE AS NEXT ADDR
3769   F4AC   23               INX     H               ;INR STACK POINTER FOR 2ND BYTE
3770   F4AD   C321F5           JMP     LF521           ;RESET STK PTR & GO TO NXT INST
37711
3772 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3773+                                                      21:15  07/30/2018
3774+                                                                                      PAGE 66
3775
3776
3777
3778                   ;
3779                   ;COME HERE FOR POP, RET, PCHL, SPHL
3780                   ;
3781   F4B0   78       LF4B0:  MOV     A,B             ;RESTORE INST TO A
3782   F4B1   E608             ANI     8               ;POP INST ?
3783   F4B3   CA1BF4           JZ      LF41B           ;YES - PROCESS IT
3784   F4B6   78               MOV     A,B             ;NO - RESTORE INST AGAIN
3785   F4B7   FED9             CPI     0D9H            ;ILLEGAL OPCODE ?
3786   F4B9   CA89F5           JZ      LF589           ;YES - PROCESS ILLEGAL OPCODE
3787   F4BC   DAA5F4           JC      LF4A5           ;NO - RETURN INST IF CARRY
3788   F4BF   FEE9             CPI     0E9H            ;NOT RET - PCHL ?
3789   F4C1   C21BF4           JNZ     LF41B           ;NO - MUST BE SPHL
3790   F4C4   2A44D1           LHLD    LD144           ;PCHL - GET H,L
3791   F4C7   C3DBF4           JMP     LF4DB           ;MAKE ADDR OF NEXT INST & RET
3792                   ;
3793                   ;COME HERE FOR CONDITIONAL JUMP
3794                   ;
3795   F4CA   CD51F5   LF4CA:  CALL    LF551           ;EVALUATE CONDITION
3796                   ;
3797                   ;GET HERE FOR STD JUMP
3798                   ;
3799   F4CD   CDE1F4   LF4CD:  CALL    LF4E1           ;FILL IN 2ND & 3RD BYTES
3800   F4D0   C2D9F4           JNZ     LF4D9           ;JMP IF CNDX NOT MET
3801   F4D3   CD7FF5           CALL    LF57F           ;UPDATE ADDR OF NXT INST
3802   F4D6   C36AF6           JMP     LF66A           ;DONE W/SIMULATED JUMP
3803   F4D9   23       LF4D9:  INX     H               ;POINT TO 3RD BYTE
3804   F4DA   23       LF4DA:  INX     H               ;POINT TO NEXT INST
3805   F4DB   223ED1   LF4DB:  SHLD    LD13E           ;SAVE H,L AS ADDR OF NXT INST
3806   F4DE   C36AF6           JMP     LF66A           ;DONE WITH THIS INST
3807                   ;
3808                   ;UPDATE 2ND & 3RD BYTES OF INST AT D14C
3809                   ;DONE EVEN IF INST IS NOT REALLY EXECUTED SO DISPLAY
3810                   ;OF INST WILL BE CORRECT.
3811                   ;NOTE REVERSAL OF "BACKWARD" 8080 ADDRESSES
3812                   ;
3813   F4E1   F5       LF4E1:  PUSH    PSW             ;SAVE PSW
3814   F4E2   23               INX     H               ;POINT TO INST 2ND BYTE
3815   F4E3   7E               MOV     A,M             ;GET IT
3816   F4E4   324ED1           STA     LD14C+2         ;SAVE AS SIM 2ND (3RD?) BYTE
3817   F4E7   23               INX     H               ;POINT TO INST 3RD BYTE
3818   F4E8   7E               MOV     A,M             ;GET IT
3819   F4E9   324DD1           STA     LD14C+1         ;SAVE AS SIM 3RD (2ND?) BYTE
3820   F4EC   2B               DCX     H               ;POINT BACK AT 2ND INST BYTE
3821   F4ED   F1               POP     PSW             ;RESTORE PSW
3822   F4EE   C9               RET                     ;DONE
3823                   ;
3824                   ;GET HERE FOR JMP, OUT, IN, XTHL, XCHG, EI, DI INSTRUCTIONS
3825                   ;
3826   F4EF   78       LF4EF:  MOV     A,B             ;GET WHOLE INST
3827   F4F0   E638             ANI     38H             ;MASK
3828   F4F2   CACDF4           JZ      LF4CD           ;JUMP INST
38291
3830 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3831+                                                      21:15  07/30/2018
3832+                                                                                      PAGE 67
3833
3834
3835
3836   F4F5   FE10             CPI     10H             ;
3837   F4F7   CAF2F5           JZ      LF5F2           ;OUT INST
3838   F4FA   DA89F5           JC      LF589           ;ILLEGAL OPCODE
3839   F4FD   FE18             CPI     18H             ;MASK AGAIN
3840   F4FF   CA8FF5           JZ      LF58F           ;INPUT INST
3841   F502   C31BF4           JMP     LF41B           ;EI, DI, XTHL, XCHG
3842                   ;
3843                   ;COME HERE FOR CONDITIONAL CALL INST
3844                   ;
3845   F505   CD51F5   LF505:  CALL    LF551           ;EVALUATE CONDITION
3846   F508   C2CDF4           JNZ     LF4CD           ;JUMP IF NOT MET
3847                   ;
3848                   ;GET HERE FOR CALL INST
3849                   ;
3850   F50B   CDE1F4   LF50B:  CALL    LF4E1           ;UPDATE DISPLAY INST
3851   F50E   CD7FF5           CALL    LF57F           ;CALLED ADDR ==> NXT INST
3852   F511   23       LF511:  INX     H               ;POINT TO INST AFTR CALL
3853   F512   EB               XCHG                    ;SAVE RET ADDR IN D,E
3854   F513   3A35D1           LDA     LD135           ;GET REAL-TIME RUN FLAG
3855   F516   B7               ORA     A               ;SET FLAGS
3856   F517   C227F5           JNZ     LF527           ;JUMP IF SIMULATING
3857   F51A   2A40D1   LF51A:  LHLD    LD140           ;GET STACK POINTER
3858   F51D   2B               DCX     H               ;POINT TO NEXT ENTRY 1ST BYTE
3859   F51E   72               MOV     M,D             ;PUT HIGH ORDER RET ADDR IN
3860   F51F   2B               DCX     H               ;NOW DO LOW ORDER BYTE
3861   F520   73               MOV     M,E             ;RET ADDR ON STACK
3862   F521   2240D1   LF521:  SHLD    LD140           ;UPDATE STACK POINTER
3863   F524   C36AF6           JMP     LF66A           ;SIMULATED CALL DONE
3864   F527   2A3ED1   LF527:  LHLD    LD13E           ;GET CALLED ADDR
3865   F52A   3A3AD1           LDA     LD13A           ;GET LOW ORDER R.T. RUN ADDR
3866   F52D   BD               CMP     L               ;SAME ?
3867   F52E   C21AF5           JNZ     LF51A           ;NO - SIMULATE CALL
3868   F531   3A3BD1           LDA     LD13A+1         ;GET HIGH ORDER R.T. RUN ADDR
3869   F534   BC               CMP     H               ;SAME ?
3870   F535   C21AF5           JNZ     LF51A           ;NO - SIMULATE CALL
3871   F538   224DD1           SHLD    LD14C+1         ;SAME - PUT CALL ADDR IN
3872   F53B   EB               XCHG                    ;RET ADDR TO H,L
3873   F53C   223ED1           SHLD    LD13E           ;NEXT SIM. ADDR TO EXEC
3874   F53F   C334F6           JMP     LF634           ;EXECUTE CALL FOR REAL
3875                   ;
3876                   ;GET HERE FOR PUSH, CALL & ILLEGAL OPCODES
3877                   ;
3878   F542   78       LF542:  MOV     A,B             ;RESTORE INSTRUCTION
3879   F543   E608             ANI     8               ;MASK
3880   F545   CA1BF4           JZ      LF41B           ;PUSH, POP
3881   F548   78               MOV     A,B             ;RESTORE OPCODE AGAIN
3882   F549   FECD             CPI     0CDH            ;CALL ?
3883   F54B   CA0BF5           JZ      LF50B           ;YES - PROCESS IT
3884   F54E   C389F5           JMP     LF589           ;ILLEGAL OPCODE
3885                   ;
3886                   ;GET HERE TO EVALUATE CONDITION FOR CONDITIONAL JMP, CALL, RET
38871
3888 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3889+                                                      21:15  07/30/2018
3890+                                                                                      PAGE 68
3891
3892
3893
3894                   ;
3895   F551   78       LF551:  MOV     A,B             ;RESTORE OP CODE
3896   F552   E608             ANI     8               ;MASK CNDX TRUE/FALSE BIT
3897   F554   4F               MOV     C,A             ;SAVE TRUE/FALSE STATUS
3898   F555   CA5AF5           JZ      LF55A           ;JUMP IF NZ,NC,PO,P
3899   F558   0EC5             MVI     C,0C5H          ;PSW COND FLAG MASK
3900   F55A   78       LF55A:  MOV     A,B             ;RESTORE OPCODE AGAIN
3901   F55B   E630             ANI     30H             ;ZERO FLAG CONDITIONAL ?
3902   F55D   C265F5           JNZ     LF565           ;NO - TEST OTHERS
3903   F560   1640             MVI     D,40H           ;PSW ZERO FLAG MASK
3904   F562   C379F5           JMP     LF579           ;EVALUATE THE CONDITION
3905   F565   FE20     LF565:  CPI     20H             ;PARITY/SIGN FLAG CONDITION ?
3906   F567   CA72F5           JZ      LF572           ;YES - PARITY FLAG CNDX
3907   F56A   D277F5           JNC     LF577           ;YES - SIGN FLAG CNDX
3908   F56D   1601             MVI     D,1             ;CARRY FLAG MASK
3909   F56F   C379F5           JMP     LF579           ;EVALUATE CONDITION
3910   F572   1604     LF572:  MVI     D,4             ;PARITY FLAG BIT MASK
3911   F574   C379F5           JMP     LF579           ;EVALUATE THE CONDITION
3912   F577   1680     LF577:  MVI     D,80H           ;SIGN FLAG BIT MASK
3913   F579   3A42D1   LF579:  LDA     LD142           ;GET SIMULATOR'S FLAG REGISTER
3914   F57C   A9               XRA     C               ;SET CNDX & T/F INTO ACC
3915   F57D   A2               ANA     D               ;MASK OUT PROPER FLAG BIT
3916   F57E   C9               RET                     ;AND GO BACK W/ZERO FLAG SET
3917                   ;
3918                   ;SAVE ADDR POINTED TO BY H,L AS NEXT INST TO EXECUTE
3919                   ;
3920   F57F   7E       LF57F:  MOV     A,M             ;GET 1ST BYTE
3921   F580   323ED1           STA     LD13E           ;SAVE IT AS NEXT INST LOW BYTE
3922   F583   23               INX     H               ;POINT TO 2ND BYTE
3923   F584   7E               MOV     A,M             ;GET IT
3924   F585   323FD1           STA     LD13E+1         ;SAVE AS HIGH BYTE
3925   F588   C9               RET                     ;DONE
3926                   ;
3927                   ;ROUTINE TO PROCESS ILLEGAL OPCODES
3928                   ;
3929   F589   CDCAF6   LF589:  CALL    LF6CA           ;DISPLAY INST & ALL REGS
3930   F58C   CD49F9           CALL    LF949           ;PRINT ?, RESTART (NEVER RET)
3931                   ;
3932                   ;ROUTINE TO PROCESS INPUT INST
3933                   ;
3934   F58F   23       LF58F:  INX     H               ;POINT TO PORT
3935   F590   7E               MOV     A,M             ;GET IT
3936   F591   23               INX     H               ;POINT TO NEXT INST
3937   F592   223ED1           SHLD    LD13E           ;AND MAKE IT NEXT TO EXEC
3938   F595   324DD1           STA     LD14C+1         ;PUT PORT INTO SIM'S INST REG
3939   F598   CDA1F8           CALL    LF8A1           ;SEARCH INPUT PORT TABLE
3940   F59B   C2AEF5           JNZ     LF5AE           ;JUMP IF PORT NOT IN TABLE
3941   F59E   7E               MOV     A,M             ;GET PORT I/O TYPE
3942   F59F   B7               ORA     A               ;SET FLAGS
3943   F5A0   CAAEF5           JZ      LF5AE           ;IF PORT SIMULATED
3944   F5A3   FA34F6           JM      LF634           ;TO REALLY EXEC I/O INST
39451
3946 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3947+                                                      21:15  07/30/2018
3948+                                                                                      PAGE 69
3949
3950
3951
3952   F5A6   23               INX     H               ;ELSE PRESET, POINT TO VALUE
3953   F5A7   7E               MOV     A,M             ;GET IT
3954   F5A8   324AD1           STA     LD14A           ;TO SIM'S ACCUM (WHERE ELSE ?)
3955   F5AB   C36AF6           JMP     LF66A           ;TO DISPLAY & DO NEXT INST
3956                   ;
3957                   ;COME HERE TO EXECUTE SIMULATED INPUT INST
3958                   ;
3959   F5AE   11D2F5   LF5AE:  LXI     D,LF5D2         ;POINT TO INPUT MESSAGE
3960   F5B1   CDD9F5           CALL    LF5D9           ;PRINT PGM CTR & MESSAGE
3961   F5B4   CD72E1           CALL    READ            ;GET USER'S ANSWER
3962   F5B7   CD6AE2           CALL    ZBUF            ;CLEAR ABUF
3963   F5BA   21E4D1           LXI     H,IBUF          ;POINT TO INPUT BUFFER
3964   F5BD   CDCFEE           CALL    SBL1            ;SCAN PAST SPACES
3965   F5C0   CDEBF2           CALL    NUMS            ;CONVERT TO BINARY
3966   F5C3   DA49F9           JC      LF949           ;IF ERROR IN ANSWER
3967   F5C6   7C               MOV     A,H             ;GET HIGH ORDER BYTE
3968   F5C7   B7               ORA     A               ;SET FLAGS
3969   F5C8   C2AEF5           JNZ     LF5AE           ;MAKE USER DO IT AGAIN IF > 255
3970   F5CB   7D               MOV     A,L             ;GET LOW ORDER BYTE
3971   F5CC   324AD1           STA     LD14A           ;STUFF IT INTO SIM'S ACCUM
3972   F5CF   C326F6           JMP     LF626           ;DO CR/LF & FINSIH UP
3973                   ;
3974   F5D2   494E5055 LF5D2:  DB      'INPUT '
3975   F5D6   5420
3976   F5D8   0D               DB      0DH
3977                   ;
3978                   ;ROUTINE TO PRINT INPUT OR OUTPUT MESSAGE FOR SIMULATED I/O
3979                   ;
3980   F5D9   CD16E2   LF5D9:  CALL    CRLF            ;DO CR/LF
3981   F5DC   D5               PUSH    D               ;SAVE D,E
3982   F5DD   CDB8F6           CALL    LF6B8           ;PRINT PGM COUNTER & SPACES
3983   F5E0   D1               POP     D               ;RESTORE REGS
3984   F5E1   EB               XCHG                    ;MESSAGE ADDR TO H,L
3985   F5E2   CD80E3           CALL    SCRN            ;PRINT INPUT OR OUTPUT MSG
3986   F5E5   2A3CD1           LHLD    LD13C           ;GET SIM'S PGM CTR
3987   F5E8   23               INX     H               ;INCR, POINTING TO PORT
3988   F5E9   7E               MOV     A,M             ;GET PORT IN ACCUM
3989   F5EA   CD6FE5           CALL    DUMO            ;PRINT PORT
3990   F5ED   063D             MVI     B,'='           ;FOLLOWED BY EQUALS SIGN
3991   F5EF   C3CFD0           JMP     OUT8            ;AND THEN RETURN
3992                   ;
3993                   ;ROUTINE TO PROCESS OUTPUT INSTRUCTION
3994                   ;
3995   F5F2   23       LF5F2:  INX     H               ;POINT TO PORT
3996   F5F3   7E               MOV     A,M             ;GET IT
3997   F5F4   23               INX     H               ;POINT TO NEXT INST
3998   F5F5   223ED1           SHLD    LD13E           ;SAVE AS ADDR OF NEXT INST
3999   F5F8   324DD1           STA     LD14C+1         ;PUT PORT IN SIM'S INST REG
4000   F5FB   CD97F8           CALL    LF897           ;SEARCH OUTPUT TABLE
4001   F5FE   3E01             MVI     A,1             ;ASSUME SIMULATED
4002   F600   C204F6           JNZ     LF604           ;IF PORT NOT IN TABLE
40031
4004 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4005+                                                      21:15  07/30/2018
4006+                                                                                      PAGE 70
4007
4008
4009
4010   F603   7E               MOV     A,M             ;GET TYPE OUTPUT
4011   F604   B7       LF604:  ORA     A               ;SET FLAGS
4012   F605   FA34F6           JM      LF634           ;TO REALLY EXECUTE OUT INST
4013   F608   F5               PUSH    PSW             ;SAVE ACCUM & FLAGS
4014   F609   112CF6           LXI     D,LF62C         ;POINT TO OUTPUT MESSAGE
4015   F60C   CDD9F5           CALL    LF5D9           ;PRINT IT
4016   F60F   F1               POP     PSW             ;RESTORE FLAGS & ACCUM
4017   F610   B7               ORA     A               ;SET FLAGS
4018   F611   3A4AD1           LDA     LD14A           ;GET CONTENTS OF SIM'S ACCUM
4019   F614   47               MOV     B,A             ;MOVE TO B
4020   F615   CA1EF6           JZ      LF61E           ;ASCII MODE (UNLESS CNTL CHAR)
4021   F618   CD47F7   LF618:  CALL    LF747           ;PRINT ACC USING CUR MODE
4022   F61B   C326F6           JMP     LF626           ;DO CR/LF, PRINT REGS & DO NEXT
4023   F61E   FE20     LF61E:  CPI     20H             ;TEST FOR CONTROL CHAR
4024   F620   DA18F6           JC      LF618           ;PRT USING CUR MODE, NOT ASCII
4025   F623   CDCFD0           CALL    OUT8            ;NOT CNTL CHAR, OK TO OUTPUT
4026   F626   CD16E2   LF626:  CALL    CRLF            ;NOW DO CR/LF TO MAKE IT PRETTY
4027   F629   C36AF6           JMP     LF66A           ;THEN PRINT REGS & DO NEXT INST
4028                   ;
4029   F62C   4F555450 LF62C:  DB      'OUTPUT '
4030   F630   555420
4031   F633   0D               DB      0DH
4032                   ;
4033                   ;COME HERE TO EXECUTE AN INST.
4034                   ;LOAD REAL 8080 REGS FROM SIMULATORS REGS, EXEC INST
4035                   ;AND THEN UNLOAD 8080'S REGS TO SIMULATORS REGS
4036                   ;
4037   F634   3140D1   LF634:  LXI     SP,LD140        ;POINT STACK AT SIMULATORS REGS
4038   F637   3EC3             MVI     A,0C3H          ;JUMP INST
4039   F639   324FD1           STA     LD14F           ;STORE JUST AFTER INST TO SIMUL
4040   F63C   2152F6           LXI     H,LF652         ;RETURN POINT AFTER INST EXECUT
4041   F63F   2250D1           SHLD    LD14F+1         ;STORE IT JUST AFTER JUMP INST
4042   F642   E1               POP     H               ;LOAD 8080 H,L FROM SIM STK PTR
4043   F643   F1               POP     PSW             ;LOAD 8080 PSW FROM SIMULATOR
4044   F644   33               INX     SP              ;SKIP L FOR NOW
4045   F645   33               INX     SP              ;SKIP H FOR NOW
4046   F646   D1               POP     D               ;LOAD 8080 D,E FROM SIMULATOR
4047   F647   C1               POP     B               ;LOAD 8080 B,C FROM SIMULATOR
4048   F648   F9               SPHL                    ;MOVE SIM STACK TO 8080 STACK
4049   F649   2A44D1           LHLD    LD144           ;LOAD 8080 H,L FROM SIM H,L
4050   F64C   3A4AD1           LDA     LD14A           ;GET SIMULATED ACCUM
4051   F64F   C34CD1           JMP     LD14C           ;EXECUTE INST TO BE SIMULATED
4052                   ;
4053                   ;RETURN HERE AFTER EXECUTING THE "SIMULATED" INST
4054                   ;
4055   F652   324AD1   LF652:  STA     LD14A           ;SAVE 8080 ACCUM INTO SIMULTR
4056   F655   2244D1           SHLD    LD144           ;SAVE 8080 H,L INTO SIMULATOR
4057   F658   17               RAL                     ;SAVE CARRY FLAG DURING DAD
4058   F659   210000           LXI     H,0             ;SETTING UP ....
4059   F65C   39               DAD     SP              ;TO GET THE STACK POINTER
4060   F65D   314AD1           LXI     SP,LD14A        ;POINT CPU STACK TO REG AREA
40611
4062 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4063+                                                      21:15  07/30/2018
4064+                                                                                      PAGE 71
4065
4066
4067
4068   F660   C5               PUSH    B               ;SAVE 8080 B,C INTO SIMULATOR
4069   F661   D5               PUSH    D               ;SAVE 8080 D,E INTO SIMULATOR
4070   F662   3B               DCX     SP              ;SKIP H (ALREADY STORED)
4071   F663   3B               DCX     SP              ;SKIP L (ALREADY STORED)
4072   F664   1F               RAR                     ;RESTORE CARRY FLAG
4073   F665   F5               PUSH    PSW             ;SAVE 8080 PSW INTO SIMULATOR
4074   F666   E5               PUSH    H               ;SAVE 8080 STK PNTR INTO SIM
4075   F667   312BD1           LXI     SP,LD12B        ;RELOAD 8080'S STACK POINTER
4076   F66A   DBFF     LF66A:  IN      0FFH            ;GET SENSE SWITCHES
4077   F66C   E680             ANI     80H             ;MASK HIGH ORDER BIT
4078   F66E   C297F6           JNZ     LF697           ;FORCE RETURN TO COMMAND MODE
4079   F671   CDA4D0           CALL    STAT            ;SEE IF KEYBOARD CHAR WAITING
4080   F674   CA7FF6           JZ      LF67F           ;NO - CONTINUE PROCESSING
4081   F677   CDCCD0           CALL    IN8             ;YES - GET CHAR
4082   F67A   FE18             CPI     'X'-40H         ;CONTROL-X ?
4083   F67C   CA97F6           JZ      LF697           ;YES - FORCE RET TO COMND MODE
4084   F67F   3A34D1   LF67F:  LDA     LD134           ;GET BREAKPOINT FLAG
4085   F682   B7               ORA     A               ;SET FLAGS
4086   F683   CA9DF6           JZ      LF69D           ;JMP IF NO BKPT SET
4087   F686   2A38D1           LHLD    LD138           ;BKPT ADDR TO H,L
4088   F689   3A3DD1           LDA     LD13C+1         ;HIGH BYTE OF SIM P.C.
4089   F68C   BC               CMP     H               ;COMPARE TO BKPT
4090   F68D   C2AFF6           JNZ     LF6AF           ;BKPT NOT REACHED
4091   F690   3A3CD1           LDA     LD13C           ;GET LOW BYTE OF P.C.
4092   F693   BD               CMP     L               ;COMPARE TO BKPT
4093   F694   C2AFF6           JNZ     LF6AF           ;BKPT NOT REACHED
4094                   ;
4095                   ;COME HERE WHEN BREAKPOINT IS REACHED
4096                   ;
4097   F697   CDCAF6   LF697:  CALL    LF6CA           ;PRINT REGS, P.C., ETC.
4098   F69A   C374F7           JMP     LF774           ;RESTART SIMULATOR
4099                   ;
4100                   ;GET HERE AFTER EA. INST IN SIMULATED CONT. RUN MODE
4101                   ;
4102   F69D   CDCAF6   LF69D:  CALL    LF6CA           ;PRINT REGS, PC, ETC
4103   F6A0   DBFF             IN      0FFH            ;GET SENSE SWITCHES
4104   F6A2   E640             ANI     40H             ;MASK CONTINUOUS RUN BIT
4105   F6A4   CCCCD0           CZ      IN8             ;IF CONT RUN, CK KYBD PORT
4106   F6A7   FE18             CPI     'X'-40H         ;CONTROL-X WAITING ?
4107   F6A9   CA74F7           JZ      LF774           ;YES - RETURN TO SIM COMND MODE
4108                   ;
4109                   ;SIMULATOR "GO" COMMAND
4110                   ;
4111   F6AC   CD16E2   LF6AC:  CALL    CRLF            ;DO CR/LF
4112   F6AF   2A3ED1   LF6AF:  LHLD    LD13E           ;GET ADDR OF INST TO SIMULATE
4113   F6B2   223CD1           SHLD    LD13C           ;AND SAVE IT AS SIM PGM COUNTER
4114   F6B5   C300F4           JMP     LF400           ;SIMULATE THE INSTRUCTION
4115                   ;
4116                   ;ROUTINE TO PRINT OUT SIMULATORS P.C. AND TWO SPACES
4117                   ;
4118   F6B8   3A3DD1   LF6B8:  LDA     LD13C+1         ;GET HIGH ORDER SIM P.C. BYTE
41191
4120 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4121+                                                      21:15  07/30/2018
4122+                                                                                      PAGE 72
4123
4124
4125
4126   F6BB   57               MOV     D,A             ;TO D
4127   F6BC   3A3CD1           LDA     LD13C           ;NOW LOW ORDER BYTE
4128   F6BF   5F               MOV     E,A             ;D,E HAVE P.C.
4129   F6C0   CD5CE5           CALL    ADOUT           ;PRINT IT IN HEX
4130   F6C3   CD5CE3           CALL    LE35C           ;PRINT SPACE
4131   F6C6   CD5CE3           CALL    LE35C           ;PRINT SPACE
4132   F6C9   C9               RET                     ;DONE
4133                   ;
4134                   ;ROUTINE TO PRINT OUT SIMULATORS PC AND ALL FLAGS & REGS
4135                   ;
4136   F6CA   CDB8F6   LF6CA:  CALL    LF6B8           ;PRINT PC & SPACES
4137   F6CD   3A42D1           LDA     LD142           ;GET FLAG REGISTER
4138   F6D0   4F               MOV     C,A             ;SAVE IT IN C
4139   F6D1   E601             ANI     01H             ;MASK CARRY BIT
4140   F6D3   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
4141   F6D6   E680             ANI     80H             ;MASK SIGN BIT
4142   F6D8   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
4143   F6DB   E610             ANI     10H             ;MASK AUX CARRY BIT
4144   F6DD   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
4145   F6E0   E604             ANI     04H             ;MASK PARITY BIT
4146   F6E2   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
4147   F6E5   E640             ANI     40H             ;MASK ZERO BIT
4148   F6E7   CD3CF7           CALL    LF73C           ;PRINT A 0 OR 1
4149   F6EA   CD5CE3           CALL    LE35C           ;PRINT A SPACE
4150   F6ED   114AD1           LXI     D,LD14A         ;POINT TO ACCUM
4151   F6F0   1A               LDAX    D               ;GET IT
4152   F6F1   CD56F7           CALL    LF756           ;PRINT IT USING CUR. MODE
4153   F6F4   CD5CE3           CALL    LE35C           ;PRINT SPACE
4154   F6F7   0E04             MVI     C,04H           ;NO OF REGS TO OUTPUT
4155   F6F9   1B       LF6F9:  DCX     D               ;POINT TO NEXT REG
4156   F6FA   1A               LDAX    D               ;GET IT
4157   F6FB   CD56F7           CALL    LF756           ;PRINT IT USING CUR MODE
4158   F6FE   0D               DCR     C               ;NO OF REGS LEFT
4159   F6FF   C2F9F6           JNZ     LF6F9           ;DO NEXT IF NOT DONE
4160   F702   CD5CE3           CALL    LE35C           ;PRINT SPACE
4161   F705   1B               DCX     D               ;POINT TO H
4162   F706   1A               LDAX    D               ;GET IT
4163   F707   CD56F7           CALL    LF756           ;PRINT IT
4164   F70A   1B               DCX     D               ;POINT TO L
4165   F70B   1A               LDAX    D               ;GET IT
4166   F70C   CD56F7           CALL    LF756           ;PRINT IT
4167   F70F   2A44D1           LHLD    LD144           ;GET H,L
4168   F712   7E               MOV     A,M             ;GET "M" CHAR
4169   F713   CD56F7           CALL    LF756           ;PRINT IT
4170   F716   CD5CE3           CALL    LE35C           ;SPACE
4171   F719   3A41D1           LDA     LD140+1         ;STACK PTR HIGH BYTE
4172   F71C   57               MOV     D,A             ;TO D
4173   F71D   3A40D1           LDA     LD140           ;STACK PTR LOW BYTE
4174   F720   5F               MOV     E,A             ;D,E HAS STK PTR ADDR
4175   F721   CD5CE5           CALL    ADOUT           ;PRINT STACK POINTER
4176   F724   114CD1           LXI     D,LD14C         ;POINT TO CURRENT INST
41771
4178 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4179+                                                      21:15  07/30/2018
4180+                                                                                      PAGE 73
4181
4182
4183
4184   F727   CD5CE3           CALL    LE35C           ;PRINT SPACE
4185   F72A   CD33F7           CALL    LF733           ;PRINT BYTE & SPACE
4186   F72D   CD33F7           CALL    LF733           ;PRINT BYTE & SPACE
4187   F730   C333F7           JMP     LF733           ;A BIT OF SLOPPY CODE
4188   F733   CD5CE3   LF733:  CALL    LE35C           ;PRINT A SPACE
4189   F736   1A               LDAX    D               ;GET BYTE POINTED TO BY D,E
4190   F737   13               INX     D               ;POINT TO NEXT
4191   F738   CD47F7           CALL    LF747           ;PRINT THE BYTE
4192   F73B   C9               RET                     ;DONE
4193                   ;
4194                   ;PRINT A 1 OR A ZERO (USED TO PRINT FLAG BYTES)
4195                   ;
4196   F73C   0631     LF73C:  MVI     B,'1'           ;ASSUME 1
4197   F73E   C242F7           JNZ     LF742           ;MUST BE IF IT'S NOT ZERO
4198   F741   05               DCR     B               ;NOT 1, MAKE IT 0
4199   F742   CDCFD0   LF742:  CALL    OUT8            ;PRINT IT, WHATEVER
4200   F745   79               MOV     A,C             ;RESTORE THE FLAG BYTE IN A
4201   F746   C9               RET                     ;DONE
4202                   ;
4203                   ;PRINT A BYTE USING CURRENT SIMULATOR MODE
4204                   ;
4205   F747   214BD1   LF747:  LXI     H,LD14B         ;POINT TO SIMULATOR MODE
4206   F74A   46               MOV     B,M             ;GET IT
4207   F74B   05               DCR     B               ;SETTING FLAGS
4208   F74C   F253F7           JP      LF753           ;IF MODE WASN'T ZERO
4209   F74F   CD6FE5           CALL    DUMO            ;USE ALS-8 MODE
4210   F752   C9               RET                     ;DONE
4211   F753   C348E3   LF753:  JMP     DOUT            ;USE DECIMAL
4212                   ;
4213                   ;ROUTINE TO PRINT BYTE FOLLOWED BY SPACE
4214                   ;
4215   F756   CD47F7   LF756:  CALL    LF747           ;PRINT THE BYTE
4216   F759   C35CE3           JMP     LE35C           ;THEN DO SPACE & RETURN
4217                   ;
4218                   ;THIS IS THE SIMULATOR MAIN ENTRY POINT
4219                   ;
4220   F75C   3AE8D1   SIMU:   LDA     IBUF+4          ;GET CHAR AFTER 'SIMU'
4221   F75F   FE21             CPI     ' '+1           ;COMPARE TO BLANK
4222   F761   D274F7           JNC     LF774           ;SKIP INIT. IF NOT BLANK
4223   F764   AF               XRA     A               ;ELSE GET A ZERO
4224   F765   3236D1           STA     LD136           ;CLEAR INPUT PORT ASSIGN FLAG
4225   F768   324BD1           STA     LD14B           ;CLEAR SIMULATOR MODE
4226   F76B   3237D1           STA     LD137           ;CLEAR OUTPUT PORT ASSIGN FLAGS
4227   F76E   3235D1           STA     LD135           ;CLEAR REAL TIME RUN FLAG
4228   F771   3234D1   LF771:  STA     LD134           ;CLEAR BRKPT FLAG
4229                   ;
4230                   ;WARM RESTART ENTRY POINT
4231                   ;
4232   F774   312FD1   LF774:  LXI     SP,SMODE        ;SET STACK
4233   F777   CD16E2           CALL    CRLF            ;DO CR/LF
4234   F77A   062A             MVI     B,'*'           ;PROMPT
42351
4236 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4237+                                                      21:15  07/30/2018
4238+                                                                                      PAGE 74
4239
4240
4241
4242   F77C   CDCFD0           CALL    OUT8            ;PRINT IT
4243   F77F   CD72E1           CALL    READ            ;GET A COMND LINE IN IBUF
4244   F782   3AE4D1           LDA     IBUF            ;GET 1ST CHAR
4245   F785   FE50             CPI     'P'             ;SET PGM COUNTER ?
4246   F787   C296F7           JNZ     LF796           ;NO - TRY OTHER COMMANDS
4247   F78A   CD32F9           CALL    LF932           ;GET OPERAND VALUE TO H,L
4248   F78D   223ED1           SHLD    LD13E           ;? - THIS IS NOT THE SIM P.C.
4249   F790   223CD1           SHLD    LD13C           ;THE SIMULATORS PGM. COUNTER
4250   F793   C374F7           JMP     LF774           ;GET NEXT COMMAND
4251   F796   FE42     LF796:  CPI     'B'             ;SET BREAKPOINT ?
4252   F798   C2A4F7           JNZ     LF7A4           ;NO - TRY ANOTHER COMMAND
4253   F79B   CD32F9           CALL    LF932           ;GET ADDR TO H,L
4254   F79E   2238D1           SHLD    LD138           ;SET BREAKPOINT ADDR
4255   F7A1   C371F7           JMP     LF771           ;SET BKPT FLAG & RESTART
4256   F7A4   FE52     LF7A4:  CPI     'R'             ;SET REAL-TIME RUN ADDR ?
4257   F7A6   C2B7F7           JNZ     LF7B7           ;NO - TRY ANOTHER COMMAND
4258   F7A9   CD32F9           CALL    LF932           ;GET ADDR TO H,L
4259   F7AC   223AD1           SHLD    LD13A           ;SET REAL-TIME RUN ADDR
4260   F7AF   3E01             MVI     A,1             ;GET A ONE
4261   F7B1   3235D1           STA     LD135           ;AND USE IT TO SET R.T. RUN FLG
4262   F7B4   C374F7           JMP     LF774           ;RESTART & GET NEXT COMMAND
4263                   ;
4264                   ;TEST FOR AND PROCESS THE CLEAR COMMANDS
4265                   ;
4266   F7B7   FE43     LF7B7:  CPI     'C'             ;CLEAR COMMAND ?
4267   F7B9   C2DEF7           JNZ     LF7DE           ;NO - TRY OTHER COMMANDS
4268   F7BC   3AE5D1           LDA     IBUF+1          ;YES - GET NEXT CHAR
4269   F7BF   2134D1           LXI     H,LD134         ;POINT TO BKPT FLAG
4270   F7C2   FE42             CPI     'B'             ;CLEAR BREAKPOINT ?
4271   F7C4   CAD9F7           JZ      LF7D9           ;YES - DO IT
4272   F7C7   23               INX     H               ;NO, POINT TO R.T. RUN FLAG
4273   F7C8   FE52             CPI     'R'             ;CLEAR R.T. RUN ADDR ?
4274   F7CA   CAD9F7           JZ      LF7D9           ;YES - DO IT
4275   F7CD   23               INX     H               ;NO, POINT TO INPT PT ASGN FLAG
4276   F7CE   FE49             CPI     'I'             ;CLEAR INPUT PORT ASSIGNMENTS ?
4277   F7D0   CAD9F7           JZ      LF7D9           ;YES - DO IT
4278   F7D3   23               INX     H               ;NO, POINT TO OUTP PT ASGN FLAG
4279   F7D4   FE4F             CPI     'O'             ;CLEAR OUTPUT PORT ASSGNMENTS ?
4280   F7D6   C249F9           JNZ     LF949           ;NO - INVALID CLEAR COMMAND
4281   F7D9   3600     LF7D9:  MVI     M,0             ;CLEAR FLG H,L POINT TO
4282   F7DB   C374F7           JMP     LF774           ;AND RESTART SIMULATOR
4283   F7DE   FE47     LF7DE:  CPI     'G'             ;GO COMMAND ?
4284   F7E0   CAACF6           JZ      LF6AC           ;YES - DO IT
4285   F7E3   FE44             CPI     'D'             ;DUMP COMMAND ?
4286   F7E5   C2F1F7           JNZ     LF7F1           ;NO - TRY NEXT COMMAND
4287   F7E8   CD32F9           CALL    LF932           ;GET ADDR IN H,L
4288   F7EB   CD27E5           CALL    DUMP+3          ;AND USE ALS-8 DUMP CODE
4289   F7EE   C374F7           JMP     LF774           ;THEN RESTART THE SIMULATOR
4290   F7F1   FE45     LF7F1:  CPI     'E'             ;ENTER COMMAND ?
4291   F7F3   C202F8           JNZ     LF802           ;NO, TEST OTHER COMMANDS
4292   F7F6   CD32F9           CALL    LF932           ;GET ADDRESS TO H,L
42931
4294 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4295+                                                      21:15  07/30/2018
4296+                                                                                      PAGE 75
4297
4298
4299
4300   F7F9   CD0BE8           CALL    ENTS            ;USE ALS-8 ENTER CODE
4301   F7FC   DA49F9           JC      LF949           ;IF ERROR
4302   F7FF   C374F7           JMP     LF774           ;ELSE RESTART
4303   F802   FE58     LF802:  CPI     'X'             ;EXIT SIMULATOR COMMAND ?
4304   F804   CA60E0           JZ      EORMS           ;YES - RET TO ALS-8
4305   F807   FE4D             CPI     'M'             ;MODE COMMAND ?
4306   F809   C21FF8           JNZ     LF81F           ;NO - TEST OTHER COMMANDS
4307   F80C   CD32F9           CALL    LF932           ;GET VALUE IN H,L
4308   F80F   7D               MOV     A,L             ;NOW TO A
4309   F810   0601             MVI     B,1             ;ASSUME HEX
4310   F812   FE10             CPI     16              ;HEX ?
4311   F814   CA18F8           JZ      LF818           ;YES - SKIP NEXT STMNT
4312   F817   05               DCR     B               ;MAKE IT 0 ==> OCTAL
4313   F818   78       LF818:  MOV     A,B             ;GET FLAG TO A
4314   F819   324BD1           STA     LD14B           ;AND UPDATE MODE
4315   F81C   C374F7           JMP     LF774           ;THEN RESTART SIMULATOR
4316                   ;
4317                   ;PROCESS THE VARIOUS INPUT COMMANDS
4318                   ;
4319   F81F   FE49     LF81F:  CPI     'I'             ;SET INPUT COMMAND ?
4320   F821   C263F8           JNZ     LF863           ;NO - TRY OTHER COMMANDS
4321   F824   CD32F9           CALL    LF932           ;GET VALUE TO H,L
4322   F827   7C               MOV     A,H             ;HIGH ORDER BYTE TO A
4323   F828   B7               ORA     A               ;SET FLAGS
4324   F829   C249F9           JNZ     LF949           ;ERROR IF > 256
4325   F82C   7D               MOV     A,L             ;PORT TO A
4326   F82D   CDA1F8           CALL    LF8A1           ;SEARCH INPUT PORT TABLE
4327   F830   79               MOV     A,C             ;GET NO OF PORTS IN TABLE
4328   F831   FE10             CPI     16              ;TABLE FULL ?
4329   F833   D249F9           JNC     LF949           ;ERROR THEN
4330   F836   3236D1           STA     LD136           ;ELSE UPDATE # OF TABLE ENTRIES
4331   F839   36FF             MVI     M,0FFH          ;AND MAKE PORT REAL-TIME
4332   F83B   3AE5D1           LDA     IBUF+1          ;GET CHAR AFTER 'I'
4333   F83E   FE53             CPI     'S'             ;PRESET ?
4334   F840   C254F8           JNZ     LF854           ;NO - TRY REAL-TIME & CLEAR
4335   F843   EB               XCHG                    ;SAVE TABLE POINTER IN D,E
4336   F844   2AF1D0           LHLD    BBUF+2          ;GET VALUE OF PRESET
4337   F847   7C               MOV     A,H             ;GET HIGH BYTE
4338   F848   B7               ORA     A               ;SET FLAGS
4339   F849   C249F9           JNZ     LF949           ;ERROR IF > 255
4340   F84C   EB               XCHG                    ;TABLE POINTER BACK TO H,L
4341   F84D   3601             MVI     M,1             ;SAY PRESET
4342   F84F   23               INX     H               ;MOVE 1 BEYOND INPUT TYPE
4343   F850   73               MOV     M,E             ;AND STORE PRESET VALUE
4344   F851   C374F7           JMP     LF774           ;THEN RESTART SIMULATOR
4345   F854   FE52     LF854:  CPI     'R'             ;REAL-TIME INPUT ?
4346   F856   CA74F7           JZ      LF774           ;RESTART SIMULATR - ALREADY SET
4347   F859   3600             MVI     M,0             ;ELSE ASSUME SIMULATED
4348   F85B   FE43             CPI     'C'             ;TEST FOR SIMULATED
4349   F85D   CA74F7           JZ      LF774           ;OK IF IT REALLY IS
4350   F860   C349F9           JMP     LF949           ;ELSE ERROR
43511
4352 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4353+                                                      21:15  07/30/2018
4354+                                                                                      PAGE 76
4355
4356
4357
4358                   ;
4359                   ;TEST FOR AND PROCESS THE OUTPUT COMMANDS
4360                   ;
4361   F863   FE4F     LF863:  CPI     'O'             ;SET OUTPUT INST ?
4362   F865   C2BCF8           JNZ     LF8BC           ;NO - TRY OTHER COMMANDS
4363   F868   CD32F9           CALL    LF932           ;ELSE GET PORT NO IN H,L
4364   F86B   7C               MOV     A,H             ;HIGH BYTE TO A
4365   F86C   B7               ORA     A               ;SET FLAGS
4366   F86D   C249F9           JNZ     LF949           ;ERROR IF > 255
4367   F870   7D               MOV     A,L             ;PORT TO A
4368   F871   CD97F8           CALL    LF897           ;LOOK UP PORT IN TABLE
4369   F874   79               MOV     A,C             ;GET NO OF PORTS IN TABLE
4370   F875   FE10             CPI     16              ;TABLE FULL ?
4371   F877   D249F9           JNC     LF949           ;ERROR THEN
4372   F87A   3237D1           STA     LD137           ;ELSE UPDATE # OF TABLE ENTRIES
4373   F87D   06FF             MVI     B,0FFH          ;ASSUME REAL-TIME
4374   F87F   3AE5D1           LDA     IBUF+1          ;GET NEXT CHAR OF COMMAND
4375   F882   FE52             CPI     'R'             ;REAL-TIME ?
4376   F884   CA90F8           JZ      LF890           ;ENTER R.T. IN TABLE & RESTART
4377   F887   04               INR     B               ;NOT R.T., ASSUME ASCII
4378   F888   FE41             CPI     'A'             ;ASCII ?
4379   F88A   CA90F8           JZ      LF890           ;YES - PUT IN TABLE
4380   F88D   04               INR     B               ;NOT R.T. OR ASCII - SIMULATED?
4381   F88E   FE43             CPI     'C'             ;CLEAR (SIMULATED) ?
4382   F890   70       LF890:  MOV     M,B             ;SET OUTPUT MODE
4383   F891   CA74F7           JZ      LF774           ;MODE SET, RESTART
4384   F894   C349F9           JMP     LF949           ;ERROR, SIMULATED ASSUMED
4385   F897   2162D1   LF897:  LXI     H,LD162         ;POINT TO OUTPUT TABLE
4386   F89A   47               MOV     B,A             ;PORT NO TO B
4387   F89B   3A37D1           LDA     LD137           ;NO OF TABLE ENTRIES
4388   F89E   C3A8F8           JMP     LF8A8           ;SEARCH TABLE
4389   F8A1   2152D1   LF8A1:  LXI     H,LD152         ;POINT TO INPUT TABLE
4390   F8A4   47               MOV     B,A             ;PORT NO TO B
4391   F8A5   3A36D1           LDA     LD136           ;NO OF TABLE ENTRIES
4392   F8A8   4F       LF8A8:  MOV     C,A             ;TABLE ENTRIES TO C
4393   F8A9   B7               ORA     A               ;SET FLAGS
4394   F8AA   78               MOV     A,B             ;PORT NO BACK TO A
4395   F8AB   41               MOV     B,C             ;NO OF ENTRIES TO B
4396   F8AC   CAB8F8           JZ      LF8B8           ;IF TABLE CURRENTLY EMPTY
4397   F8AF   BE       LF8AF:  CMP     M               ;POINTING AT CORRECT PORT ?
4398   F8B0   23               INX     H               ;POINT TO I/O TYPE FOR PORT
4399   F8B1   C8               RZ                      ;IF WE HAVE PORT
4400   F8B2   23               INX     H               ;POINT TO I/O BYTE VALUE
4401   F8B3   23               INX     H               ;AND TO NEXT PORT
4402   F8B4   05               DCR     B               ;DCR NO OF TABLE ENTRIES LEFT
4403   F8B5   C2AFF8           JNZ     LF8AF           ;AND CHECK REMAINING ENTRIES
4404   F8B8   77       LF8B8:  MOV     M,A             ;PUT PORT IN TABLE
4405   F8B9   23               INX     H               ;AND POINT TO I/O TYPE
4406   F8BA   0C               INR     C               ;INR NO OF ENTRIES IN TABLE
4407   F8BB   C9               RET                     ;AND RETURN DONE
4408                   ;
44091
4410 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4411+                                                      21:15  07/30/2018
4412+                                                                                      PAGE 77
4413
4414
4415
4416                   ;PROCESS THE SET REGISTER/FLAG COMMANDS
4417                   ;
4418   F8BC   FE53     LF8BC:  CPI     'S'             ;SET REGISTERS ?
4419   F8BE   C249F9           JNZ     LF949           ;THERE AREN'T ANY COMMANDS LEFT
4420   F8C1   21E5D1           LXI     H,IBUF+1        ;POINT TO NEXT BYTE
4421   F8C4   2201D1           SHLD    PNTR            ;AND SAVE CHAR POINTER
4422   F8C7   CD6AE2   LF8C7:  CALL    ZBUF            ;CLEAR ABUF
4423   F8CA   CDCCEE           CALL    SBLK            ;SCAN TO TEXT
4424   F8CD   DA74F7           JC      LF774           ;RESTART IF C/R FOUND
4425   F8D0   EB               XCHG                    ;LINE PTR TO D,E
4426   F8D1   0E0A             MVI     C,10            ;NO OF REGISTERS IN TABLE
4427   F8D3   2154F9           LXI     H,LF954         ;POINT TO TABLE
4428   F8D6   BE       LF8D6:  CMP     M               ;SAME ?
4429   F8D7   CAE2F8           JZ      LF8E2           ;FOUND REGISTER TO SET
4430   F8DA   23               INX     H               ;ELSE POINT TO NEXT REGISTER
4431   F8DB   0D               DCR     C               ;AND DCR COUNT
4432   F8DC   C2D6F8           JNZ     LF8D6           ;THEN TEST IT FOR MATCH
4433   F8DF   C349F9           JMP     LF949           ;NO MATCH IN TABLE, ERROR
4434   F8E2   79       LF8E2:  MOV     A,C             ;GET DISPLACEMENT INTO TABLE
4435   F8E3   3209D1           STA     TEMP            ;AND SAVE IT
4436   F8E6   EB               XCHG                    ;POINTER TO H,L
4437   F8E7   23               INX     H               ;POINT TO NEXT CHAR
4438   F8E8   7E               MOV     A,M             ;GET IT
4439   F8E9   FE3D             CPI     '='             ;EQUALS SIGN ?
4440   F8EB   C249F9           JNZ     LF949           ;ERROR IF NOT
4441   F8EE   23               INX     H               ;POINT TO ARGUMENT
4442   F8EF   7E               MOV     A,M             ;GET IT
4443   F8F0   11DFD0           LXI     D,ABUF          ;POINT TO ABUF
4444   F8F3   CD12F9           CALL    LF912           ;CONVERT ARGUMENT TO BINARY
4445   F8F6   DA49F9           JC      LF949           ;IF ERROR
4446   F8F9   3A09D1           LDA     TEMP            ;GET DISP. INTO TABLE BACK
4447   F8FC   FE01             CPI     1               ;SETTING STACK POINTER ?
4448   F8FE   CA2CF9           JZ      LF92C           ;HANDLE THAT SEPARATELY
4449   F901   4F               MOV     C,A             ;DISPLACEMENT TO C
4450   F902   7C               MOV     A,H             ;GET HIGH ORDER BYTE OF VALUE
4451   F903   B7               ORA     A               ;SET FLAGS
4452   F904   C249F9           JNZ     LF949           ;ERROR IF > 255
4453   F907   7D               MOV     A,L             ;GET VALUE TO A
4454   F908   2140D1           LXI     H,LD140         ;REGISTER TABLE IN RAM
4455   F90B   0600             MVI     B,0             ;B,C HAS DISPLACEMENT INTO TBL
4456   F90D   09               DAD     B               ;H,L HAS ABSOLUTE ADDR
4457   F90E   77               MOV     M,A             ;UPDATE SIM/8080 REGISTER
4458   F90F   C3C7F8           JMP     LF8C7           ;DO NEXT REGISTER(S) IF ANY
4459                   ;
4460                   ;ROUTINE TO CONVERT KEYED IN VALUE TO 16 BIT VALUE IN H,L
4461                   ;
4462   F912   CD3EF1   LF912:  CALL    ALPS            ;PUT ARGUMENT INTO ABUF
4463   F915   1B               DCX     D               ;POINT TO LAST CHAR
4464   F916   1A               LDAX    D               ;GET IT
4465   F917   01DFD0           LXI     B,ABUF          ;POINT TO ARGUMENT
4466   F91A   FE44             CPI     'D'             ;DECIMAL ?
44671
4468 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4469+                                                      21:15  07/30/2018
4470+                                                                                      PAGE 78
4471
4472
4473
4474   F91C   CA02F3           JZ      NUM1            ;YES
4475   F91F   FE51             CPI     'Q'             ;OCTAL ?
4476   F921   CA0CF3           JZ      NUM3            ;YES
4477   F924   FE48             CPI     'H'             ;HEX ?
4478   F926   C2F3E2           JNZ     EMODE           ;NO, USE STD MODE
4479   F929   C307F3           JMP     NUM2            ;ELSE HEX
4480   F92C   2240D1   LF92C:  SHLD    LD140           ;UPDATE SIM/8080 STACK PNTR
4481   F92F   C3C7F8           JMP     LF8C7           ;AND DO NEXT REGISTER(S) IF ANY
4482                   ;
4483                   ;ROUTINE TO SET SIMULATED PROGRAM COUNTER
4484                   ;
4485   F932   CD81E2   LF932:  CALL    ETRA            ;GET VALUES FROM COMMAND LINE
4486   F935   DA49F9           JC      LF949           ;IF ERROR
4487   F938   CD1EE3           CALL    LE31E           ;VALUES TO BIN IN BBUF & BBUF+2
4488   F93B   DA49F9           JC      LF949           ;ON ERROR
4489   F93E   3ADFD0           LDA     ABUF            ;GET FIRST CHAR OF VALUE
4490   F941   B7               ORA     A               ;AND SET FLAGS
4491   F942   CA49F9           JZ      LF949           ;ERROR IF NO VALUE GIVEN
4492   F945   2AEFD0           LHLD    BBUF            ;GET VALUE
4493   F948   C9               RET                     ;AND RETURN WITH IT IN H,L
4494                   ;
4495                   ;ERROR HANDLER ROUTINE
4496                   ;
4497   F949   CD16E2   LF949:  CALL    CRLF            ;DO CR/LF
4498   F94C   063F             MVI     B,'?'           ;GET QUESTION MARK
4499   F94E   CDCFD0           CALL    OUT8            ;AND PRINT IT
4500   F951   C374F7           JMP     LF774           ;THEN RESTART SIMULATOR
4501                   ;
4502                   ;TABLE OF REGISTER NAMES FOR THE SET COMMANDS
4503                   ;VALUES ARE STORED IN A TABLE IN MEMORY AT D143, BUT
4504                   ;IN REVERSE ORDER.  THERE IS ONE ENTRY HERE FOR EACH
4505                   ;ENTRY IN THAT TABLE.  NOTE THAT THE ACCUM. APPEARS
4506                   ;TWICE, ONCE BY ITSELF & ONCE WITH THE FLAGS (AS PSW)
4507                   ;
4508   F954   41       LF954:  DB      'A'
4509   F955   42               DB      'B'
4510   F956   43               DB      'C'
4511   F957   44               DB      'D'
4512   F958   45               DB      'E'
4513   F959   48               DB      'H'
4514   F95A   4C               DB      'L'
4515   F95B   41               DB      'A'
4516   F95C   46               DB      'F'
4517   F95D   53               DB      'S'
4518   F95E   00               NOP
4519   F95F   00               NOP
4520   F960   00               NOP
4521   F961   00               NOP
4522   F962   00               NOP
4523   F963   00               NOP
4524   F964   00               NOP
45251
4526 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4527+                                                      21:15  07/30/2018
4528+                                                                                      PAGE 79
4529
4530
4531
4532   F965   00               NOP
4533   F966   00               NOP
4534   F967   00               NOP
4535   F968   00               NOP
4536   F969   00               NOP
4537                   ;
4538                   ;COME HERE TO EXECUTE AUTO-NUMBER INPUT MODE
4539                   ;
4540                   ;WHAT THIS CODE ACTUALLY DOES IS TO MODIFY THE INPUT ROUTINE
4541                   ;TO COME INTO A PRE-PROCESSOR AT F99A INSTEAD OF THE NORMAL
4542                   ;IN8 INPUT ROUTINE.  THAT ROUTINE ACTUALLY DOES THE LINE
4543                   ;NUMBER PROCESSING.
4544                   ;
4545   F96A   2ACDD0   AUTO:   LHLD    IN8+1           ;GET ADDR OF CUR INPUT DRIVER
4546   F96D   22F0D0           SHLD    BBUF+1          ;AND SAVE IN BBUF
4547   F970   3ADFD0           LDA     ABUF            ;SEE IF OPT PARAMETER GIVEN
4548   F973   B7               ORA     A               ;SET FLAGS
4549   F974   CA83F9           JZ      LF983           ;NOT GIVEN, START WITH 1
4550   F977   2A09D0           LHLD    MAXL            ;GET HALF OF CUR MAX LINE NO
4551   F97A   22DFD0           SHLD    ABUF            ;SAVE IT
4552   F97D   2A0BD0           LHLD    MAXL+2          ;GET OTHER HALF
4553   F980   C389F9           JMP     LF989           ;SKIP INITIALIZATION
4554   F983   213030   LF983:  LXI     H,3030H         ;TWO ZERO'S
4555   F986   22DFD0           SHLD    ABUF            ;SAVE AS TWO HIGH DIGITS
4556   F989   22E1D0   LF989:  SHLD    ABUF+2          ;AND SAVE H,L AS LOW ORDER DGTS
4557   F98C   3EC3             MVI     A,0C3H          ;JUMP INST
4558   F98E   32EFD0           STA     BBUF            ;BBUF = JUMP INTO AUTO CODE NOW
4559   F991   219AF9           LXI     H,LF99A         ;GET ADDR OF LINE NO PROCESSOR
4560   F994   22CDD0           SHLD    IN8+1           ;USE IT FOR NEW INPUT ROUTINE
4561   F997   C3D1E0           JMP     EORNS           ;EVERYTHING'S SET UP
4562                   ;
4563                   ;HERE IS THE ROUTINE WHICH ACTUALLY PUTS LINE NOS. ON LINES.
4564                   ;IT IS SUBSTITUTED FOR THE STANDARD ROUTINE BY THE CODE ABOVE.
4565                   ;
4566   F99A   CDEFD0   LF99A:  CALL    BBUF            ;CALL THE STD. INPUT ROUTINE
4567   F99D   7D               MOV     A,L             ;GET LOW BYTE ADDR OF CHAR PTR
4568   F99E   FEE4             CPI     IBUF AND 0FFH   ;AT 1ST CHAR OF INPUT BUFFER ?
4569   F9A0   C2AEF9           JNZ     LF9AE           ;NO - SKIP BEG OF LINE PROC.
4570   F9A3   3E1B             MVI     A,1BH           ;YES - SEE IF ESCAPE CHAR
4571   F9A5   B8               CMP     B               ;
4572   F9A6   CA60E0           JZ      EORMS           ;IT IS ESC - DO COMPLETE RESET
4573   F9A9   21E9D1           LXI     H,IBUF+5        ;POINT TO NEW CHAR DEST
4574   F9AC   1E07             MVI     E,7             ;AND RESET LINE LENGTH
4575   F9AE   3E0D     LF9AE:  MVI     A,0DH           ;GET ASCII CAR. RET.
4576   F9B0   B8               CMP     B               ;END OF LINE ?
4577   F9B1   78               MOV     A,B             ;PUT CHAR IN ACCUM.
4578   F9B2   C0               RNZ                     ;AND RETURN IF NOT END OF LINE
4579   F9B3   E5               PUSH    H               ;ELSE SAVE IBUF POINTER
4580   F9B4   D5               PUSH    D               ;AND LINE LENGTH
4581   F9B5   11DFD0           LXI     D,ABUF          ;POINT TO CUR LINE NO.
4582   F9B8   21E2D0           LXI     H,ABUF+3        ;AND TO END OF LINE NO.
45831
4584 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4585+                                                      21:15  07/30/2018
4586+                                                                                      PAGE 80
4587
4588
4589
4590   F9BB   7E       LF9BB:  MOV     A,M             ;GET RIGHT-HAND DIGIT
4591   F9BC   3C               INR     A               ;INCREMENT IT
4592   F9BD   FE3A             CPI     '9'+1           ;GONE PAST 9 ?
4593   F9BF   D2D8F9           JNC     LF9D8           ;YES - FIX IT UP
4594   F9C2   77               MOV     M,A             ;ELSE PUT IT BACK
4595   F9C3   21E4D1           LXI     H,IBUF          ;POINT TO IBUF
4596   F9C6   0604             MVI     B,4             ;LENGTH OF LINE NO
4597   F9C8   1A       LF9C8:  LDAX    D               ;GET CHAR FROM LINE NO.
4598   F9C9   77               MOV     M,A             ;AND PUT IT INTO IBUF
4599   F9CA   23               INX     H               ;INR IBUF POINTER
4600   F9CB   13               INX     D               ;INR LINE NO. POINTER
4601   F9CC   05               DCR     B               ;DCR COUNT
4602   F9CD   C2C8F9           JNZ     LF9C8           ;AND CONTINUE TILL DONE
4603   F9D0   3620             MVI     M,' '           ;THEN PUT A SPACE IN IBUF
4604   F9D2   D1               POP     D               ;AND RESTORE REGISTERS
4605   F9D3   060D             MVI     B,0DH           ;AND CHARACTER
4606   F9D5   78               MOV     A,B             ;WHICH READ WANTS IN ACCUM
4607   F9D6   E1               POP     H               ;RESTORE REGS
4608   F9D7   C9               RET                     ;AND GO HOME, DONE
4609   F9D8   3E30     LF9D8:  MVI     A,'0'           ;REPLACE DIGIT WITH A ZERO
4610   F9DA   77               MOV     M,A             ;AND PUT IT BACK
4611   F9DB   2B               DCX     H               ;POINT TO HIGHER DIGIT
4612   F9DC   C3BBF9           JMP     LF9BB           ;AND TRY TO INR IT
4613   F9DF   00               NOP
4614   F9E0   00               NOP
4615   F9E1   00               NOP
4616   F9E2   00               NOP
4617   F9E3   00               NOP
4618   F9E4   00               NOP
4619   F9E5   00               NOP
4620   F9E6   00               NOP
4621   F9E7   00               NOP
4622   F9E8   00               NOP
4623   F9E9   00               NOP
4624   F9EA   00               NOP
4625   F9EB   00               NOP
4626   F9EC   00               NOP
4627   F9ED   00               NOP
4628   F9EE   00               NOP
4629   F9EF   00               NOP
4630   F9F0   00               NOP
4631   F9F1   00               NOP
4632   F9F2   00               NOP
4633   F9F3   00               NOP
4634   F9F4   00               NOP
4635   F9F5   00               NOP
4636   F9F6   00               NOP
4637   F9F7   00               NOP
4638   F9F8   00               NOP
4639   F9F9   00               NOP
4640   F9FA   00               NOP
46411
4642 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4643+                                                      21:15  07/30/2018
4644+                                                                                      PAGE 81
4645
4646
4647
4648   F9FB   00               NOP
4649   F9FC   00               NOP
4650   F9FD   00               NOP
4651   F9FE   00               NOP
4652   F9FF   00               NOP
4653                   ;
4654                   ; ****END OF ALS8SIM MODULE
4655                   ;
4656                   ;
4657                   ;THE TXT-2 TEXT EDITOR STARTS HERE BUT ENTRY IS AT TXT2 (FA0B)
4658                   ;
4659                   ;ROUTINE TO CREATE A ONE LINE FILE NECESSARY FOR THE
4660                   ;EDITOR WHEN STARTING A NEW (E.G. NULL OR EMPTY) FILE
4661                   ;
4662   FA00   3602     LFA00:  MVI     M,2             ;LENGTH BYTE
4663   FA02   23               INX     H               ;POINT TO NEXT BYTE
4664   FA03   360D             MVI     M,0DH           ;CARRIAGE RETURN
4665   FA05   23               INX     H               ;POINT TO NEXT
4666   FA06   3601             MVI     M,1             ;END OF FILE MARK
4667   FA08   2207D0           SHLD    EOFP            ;NOW WE HAVE A NON-EMPTY FILE
4668                   ;
4669                   ;THIS IS THE EDITOR ENTRY POINT
4670                   ;
4671   FA0B   312FD1   TXT2:   LXI     SP,SMODE        ;SET STACK POINTER
4672   FA0E   2A05D0           LHLD    BOFP            ;GET BEG OF FILE POINTER
4673   FA11   1107D0           LXI     D,EOFP          ;AND POINT TO END OF FILE PTR
4674   FA14   CD42FD           CALL    LFD42           ;COMPARE THEM
4675   FA17   CA00FA           JZ      LFA00           ;CREATE ONE LINE FILE IF EMPTY
4676   FA1A   DADDE7           JC      WHAT            ;ERROR IF BOFP > EOFP
4677   FA1D   E5               PUSH    H               ;SAVE BEG. OF FILE POINTER
4678   FA1E   CD4EFD           CALL    LFD4E           ;CLEAR SCREEN & INITIALIZE VARS
4679   FA21   97               SUB     A               ;GET A ZERO
4680   FA22   47               MOV     B,A             ;MAKE IT ROW
4681   FA23   CD1AFF           CALL    LFF1A           ;CALC CUR ADDR & TURN IT ON
4682   FA26   E1               POP     H               ;RESTORE BEG OF FILE PNTR
4683   FA27   229AD1   LFA27:  SHLD    LD19A           ;
4684   FA2A   CDD9FA           CALL    LFAD9
4685                   ;
4686                   ;THIS IS THE BEGINNING OF THE MAIN EDITOR COMMAND LOOP
4687                   ;
4688   FA2D   CD33FA   LFA2D:  CALL    LFA33           ;GET AND EXECUTE A COMMAND
4689   FA30   C32DFA           JMP     LFA2D           ;DO IT AGAIN
4690                   ;
4691                   ;AND THAT WAS THE END OF IT
4692                   ;
4693   FA33   CD13FF   LFA33:  CALL    LFF13           ;CALC CUR ADDR & TURN CURSR ON
4694   FA36   CDCCD0           CALL    IN8             ;GET A CHAR OF COMMAND
4695   FA39   FE20     LFA39:  CPI     ' '             ;CONTROL CHAR ?
4696   FA3B   D204FC           JNC     LFC04           ;PROCESS PRINTING CHAR IF NOT
4697   FA3E   FE01             CPI     'A'-40H         ;CURSOR LEFT COMMAND ?
4698   FA40   CA57FB           JZ      LFB57           ;PROCESS IF SO
46991
4700 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4701+                                                      21:15  07/30/2018
4702+                                                                                      PAGE 82
4703
4704
4705
4706   FA43   FE13             CPI     'S'-40H         ;CURSOR RIGHT COMMAND ?
4707   FA45   CA10FC           JZ      LFC10           ;PROCESS IF SO
4708   FA48   F5               PUSH    PSW             ;SAVE COMMAND
4709   FA49   CDA4FC           CALL    LFCA4
4710   FA4C   C1               POP     B               ;RESTORE COMMAND TO B
4711   FA4D   2165FA           LXI     H,LFA65         ;EDITOR COMMAND TABLE
4712   FA50   7E       LFA50:  MOV     A,M             ;GET TABLE COMMAND
4713   FA51   B7               ORA     A               ;END OF TABLE ?
4714   FA52   C8               RZ                      ;YES
4715   FA53   B8               CMP     B               ;NO - SAME AS COMMAND ?
4716   FA54   23               INX     H               ;POINT TO COMMAND ADDR
4717   FA55   CA60FA           JZ      LFA60           ;DISPATCH TO IT ON MATCH
4718   FA58   23               INX     H               ;NO MATCH - POINT PAST COMMAND
4719   FA59   23               INX     H               ;TO NEXT COMMAND
4720   FA5A   C350FA           JMP     LFA50           ;AND TEST NEXT COMMAND
4721                   ;
4722                   ;ROUTINE TO DISPATCH TO COMMAND IN TABLE
4723                   ;
4724   FA5D   21A1D1   LFA5D:  LXI     H,LD1A1         ;POINT TO UNDEFINED COMMAND
4725   FA60   7E       LFA60:  MOV     A,M             ;COMMAND LOW BYTE TO A
4726   FA61   23               INX     H               ;POINT TO HIGH BYTE
4727   FA62   66               MOV     H,M             ;HIGH BYTE TO H
4728   FA63   6F               MOV     L,A             ;H,L NOW HAS COMPLETE ADDR
4729   FA64   E9               PCHL                    ;DISPATCH TO COMMAND ROUTINE
4730                   ;
4731                   ;HERE IS THE COMMAND TABLE FOR THE EDITOR COMMANDS
4732                   ;
4733   FA65   17       LFA65:  DB      'W'-40H         ;UP
4734   FA66   CCFA             DW      LFACC
4735   FA68   1A               DB      'Z'-40H         ;DOWN
4736   FA69   62FB             DW      LFB62
4737   FA6B   05               DB      'E'-40H         ;SCROLL UP ONE LINE
4738   FA6C   8EFB             DW      LFB8E
4739   FA6E   18               DB      'X'-40H         ;SCROLL DOWN ONE LINE
4740   FA6F   C6FA             DW      LFAC6
4741   FA71   12               DB      'R'-40H         ;SCROLL UP 1 PAGE
4742   FA72   12FB             DW      LFB12
4743   FA74   03               DB      'C'-40H         ;SCROLL DOWN 1 PAGE
4744   FA75   21FB             DW      LFB21
4745   FA77   0A               DB      'J'-40H         ;ERASE EOF & SCROLL UP (L/F)
4746   FA78   7BFB             DW      LFB7B
4747   FA7A   02               DB      'B'-40H         ;INSERT LINE
4748   FA7B   C8FB             DW      LFBC8
4749   FA7D   0D               DB      'M'-40H         ;SCROLL UP & INSERT LINE (C/R)
4750   FA7E   9DFB             DW      LFB9D
4751   FA80   14               DB      'T'-40H         ;TOGGLE INSERT MODE SW
4752   FA81   72FB             DW      LFB72
4753   FA83   10               DB      'P'-40H         ;DELETE LINE
4754   FA84   D2FB             DW      LFBD2
4755   FA86   08               DB      'H'-40H         ;DELETE CHAR
4756   FA87   2EFC             DW      LFC2E
47571
4758 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4759+                                                      21:15  07/30/2018
4760+                                                                                      PAGE 83
4761
4762
4763
4764   FA89   06               DB      'F'-40H         ;EXIT TO ALS-8
4765   FA8A   A5FA             DW      LFAA5
4766   FA8C   0F               DB      'O'-40H         ;EDITOR SEARCH
4767   FA8D   58FF             DW      LFF58
4768   FA8F   09               DB      'I'-40H         ;CONTINUE SEARCH
4769   FA90   64FF             DW      LFF64
4770   FA92   19               DB      'Y'-40H         ;REPEAT COMMAND
4771   FA93   AEFA             DW      LFAAE
4772   FA95   11               DB      'Q'-40H         ;HOME COMMAND
4773   FA96   9CFA             DW      LFA9C
4774   FA98   15               DB      'U'-40H         ;UNDEFINED COMMAND
4775   FA99   5DFA             DW      LFA5D
4776   FA9B   00               DB      0
4777                   ;
4778                   ;HOME CURSOR
4779                   ;
4780   FA9C   AF       LFA9C:  XRA     A               ;GET A ZERO
4781   FA9D   3296D1           STA     NCHAR           ;MAKE IT THE COLUMN
4782   FAA0   3E06             MVI     A,6             ;HOME=LINE 7 (START W/0 AT TOP)
4783   FAA2   C3D6FA           JMP     LFAD6           ;PUT THE CURSOR THERE
4784                   ;
4785                   ;EXIT EDITOR TO ALS-8
4786                   ;
4787   FAA5   CD4EFD   LFAA5:  CALL    LFD4E           ;CLEAR VDM-1 SCREEN
4788   FAA8   CDD3E6           CALL    FCHK            ;FCHK FILE
4789   FAAB   C360E0           JMP     EORMS           ;GO BACK TO ALS-8
4790                   ;
4791                   ;REPEAT COMMAND
4792                   ;
4793   FAAE   CDCCD0   LFAAE:  CALL    IN8             ;GET COMMAND TO REPEAT
4794   FAB1   32EFD0           STA     BBUF            ;SAVE COMMAND
4795   FAB4   CDCCD0           CALL    IN8             ;GET REPEAT COUNT
4796   FAB7   D630             SUI     30H             ;CONVERT TO BINARY
4797   FAB9   F5       LFAB9:  PUSH    PSW             ;SAVE COUNT
4798   FABA   3AEFD0           LDA     BBUF            ;GET COMMAND
4799   FABD   CD39FA           CALL    LFA39           ;EXECUTE IT ONE TIME
4800   FAC0   F1               POP     PSW             ;RESTORE COUNT
4801   FAC1   3D               DCR     A               ;DECREMENT COUNT
4802   FAC2   C8               RZ                      ;DONE IF COUNT=0
4803   FAC3   C3B9FA           JMP     LFAB9           ;ELSE DO IT AGAIN
4804                   ;
4805                   ;SCROLL DOWN 1 LINE
4806                   ;
4807   FAC6   CD72FC   LFAC6:  CALL    LFC72
4808   FAC9   C2D9FA           JNZ     LFAD9
4809                   ;
4810                   ;CURSOR UP
4811                   ;
4812   FACC   3A95D1   LFACC:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
4813   FACF   3D               DCR     A
4814   FAD0   F2D6FA           JP      LFAD6
48151
4816 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4817+                                                      21:15  07/30/2018
4818+                                                                                      PAGE 84
4819
4820
4821
4822   FAD3   3A99D1           LDA     LD199
4823   FAD6   3295D1   LFAD6:  STA     SLINE
4824   FAD9   2A9AD1   LFAD9:  LHLD    LD19A
4825   FADC   229CD1           SHLD    LD19C
4826   FADF   AF               XRA     A
4827   FAE0   3298D1           STA     LD198           ;CLEAR INSERT MODE
4828   FAE3   F5               PUSH    PSW
4829   FAE4   3299D1   LFAE4:  STA     LD199
4830   FAE7   EB               XCHG
4831   FAE8   2195D1           LXI     H,SLINE
4832   FAEB   BE               CMP     M
4833   FAEC   EB               XCHG
4834   FAED   C2F3FA           JNZ     LFAF3
4835   FAF0   229ED1           SHLD    LD19E
4836   FAF3   CD07FE   LFAF3:  CALL    LFE07
4837   FAF6   F1       LFAF6:  POP     PSW
4838   FAF7   3C               INR     A
4839   FAF8   FE10             CPI     16
4840   FAFA   C8               RZ
4841   FAFB   47               MOV     B,A
4842   FAFC   CD5FFC           CALL    LFC5F
4843   FAFF   EB               XCHG
4844   FB00   78               MOV     A,B
4845   FB01   F5               PUSH    PSW
4846   FB02   C2E4FA           JNZ     LFAE4
4847   FB05   0600             MVI     B,0
4848   FB07   0E23             MVI     C,'#'
4849   FB09   210140           LXI     H,4001H
4850   FB0C   CD4EFE           CALL    LFE4E
4851   FB0F   C3F6FA           JMP     LFAF6
4852                   ;
4853                   ;SCROLL UP 1 PAGE (16 LINES)
4854                   ;
4855   FB12   3E10     LFB12:  MVI     A,16
4856   FB14   F5       LFB14:  PUSH    PSW
4857   FB15   CD5FFC           CALL    LFC5F
4858   FB18   C494FB           CNZ     LFB94
4859   FB1B   F1               POP     PSW
4860   FB1C   3D               DCR     A
4861   FB1D   C214FB           JNZ     LFB14
4862   FB20   C9               RET
4863                   ;
4864                   ;SCROLL DOWN 1 PAGE (16 LINES)
4865                   ;
4866   FB21   3E10     LFB21:  MVI     A,16
4867   FB23   F5       LFB23:  PUSH    PSW
4868   FB24   CD72FC           CALL    LFC72
4869   FB27   C4D9FA           CNZ     LFAD9
4870   FB2A   F1               POP     PSW
4871   FB2B   3D               DCR     A
4872   FB2C   C223FB           JNZ     LFB23
48731
4874 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4875+                                                      21:15  07/30/2018
4876+                                                                                      PAGE 85
4877
4878
4879
4880   FB2F   C9               RET
4881                   ;
4882                   ;ROUTINE TO GIVE WARNING WHEN TEXT BUFFER GETS FULL
4883                   ;
4884   FB30   1146FB   LFB30:  LXI     D,LFB46         ;POINT TO WARNING MESSAGE
4885   FB33   0E11             MVI     C,17            ;LENGTH OF MESSAGE
4886   FB35   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
4887   FB38   CD0CFE           CALL    LFE0C           ;PRINT MESSAGE
4888   FB3B   CDCCD0   LFB3B:  CALL    IN8             ;GET CHAR FROM CONSOLE
4889   FB3E   FE11             CPI     'Q'-40H         ;CONTROL-Q ?
4890   FB40   C23BFB           JNZ     LFB3B           ;NO - WAIT INDEFINATELY
4891   FB43   C30BFA           JMP     TXT2            ;YES - RESTART EDITOR
4892                   ;
4893   FB46   46554C4C LFB46:  DB      'FULL--TYPE CTRL Q'
4894   FB4A   2D2D5459
4895   FB4E   50452043
4896   FB52   54524C20
4897   FB56   51
4898                   ;
4899                   ;CURSOR LEFT COMMAND
4900                   ;
4901   FB57   CD2DFF   LFB57:  CALL    LFF2D           ;CURSOR OFF
4902   FB5A   78               MOV     A,B             ;COLUMN TO A
4903   FB5B   3D               DCR     A               ;DECREMENT IT
4904   FB5C   E63F     LFB5C:  ANI     3FH             ;KEEP IT TO 0-63
4905   FB5E   77               MOV     M,A             ;PUT IT BACK AS NEW COLUMN
4906   FB5F   C316FF           JMP     LFF16           ;TURN CURSOR ON & RET
4907                   ;
4908                   ;CURSOR DOWN
4909                   ;
4910   FB62   3A95D1   LFB62:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
4911   FB65   2199D1           LXI     H,LD199
4912   FB68   BE               CMP     M
4913   FB69   C26EFB           JNZ     LFB6E
4914   FB6C   3EFF             MVI     A,0FFH
4915   FB6E   3C       LFB6E:  INR     A
4916   FB6F   C3D6FA           JMP     LFAD6
4917                   ;
4918                   ;TOGGLE CHAR INSERT MODE
4919                   ;
4920   FB72   3A98D1   LFB72:  LDA     LD198           ;GET INSERT MODE SWITCH
4921   FB75   EE01             XRI     1               ;TOGGLE LOW ORDER BIT
4922   FB77   3298D1           STA     LD198           ;PUT IT BACK
4923   FB7A   C9               RET                     ;DONE
4924                   ;
4925                   ;ERASE TO THE END OF LINE AND SCROLL UP
4926                   ;
4927   FB7B   CDEDFD   LFB7B:  CALL    LFDED           ;CALC CURSOR ADDR
4928   FB7E   3620     LFB7E:  MVI     M,' '           ;MOVE SPACE TO LINE
4929   FB80   2C               INR     L               ;INR LINE POINTER
4930   FB81   7D               MOV     A,L             ;MOVE IT TO A
49311
4932 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4933+                                                      21:15  07/30/2018
4934+                                                                                      PAGE 86
4935
4936
4937
4938   FB82   E63F             ANI     3FH             ;END OF LINE YET ?
4939   FB84   C27EFB           JNZ     LFB7E           ;MORE SPACES IF NOT
4940   FB87   CDA4FC           CALL    LFCA4           ;YES - NOW UPDATE FILE
4941   FB8A   97               SUB     A               ;GET A ZERO
4942   FB8B   3296D1           STA     NCHAR           ;AND MAKE IT NEW COLUMN
4943                   ;
4944                   ;SCROLL UP 1 LINE
4945                   ;
4946   FB8E   CD5FFC   LFB8E:  CALL    LFC5F
4947   FB91   CA62FB           JZ      LFB62
4948   FB94   219AD1   LFB94:  LXI     H,LD19A
4949   FB97   CD62FC           CALL    LFC62
4950   FB9A   C3D9FA           JMP     LFAD9
4951                   ;
4952                   ;SCROLL UP AND INSERT 1 LINE
4953                   ;
4954   FB9D   219ED1   LFB9D:  LXI     H,LD19E
4955   FBA0   CD62FC           CALL    LFC62
4956   FBA3   C2ACFB           JNZ     LFBAC
4957   FBA6   2A07D0           LHLD    EOFP
4958   FBA9   229ED1           SHLD    LD19E
4959   FBAC   CD51FC   LFBAC:  CALL    LFC51
4960   FBAF   AF               XRA     A
4961   FBB0   3296D1           STA     NCHAR
4962   FBB3   3A99D1           LDA     LD199
4963   FBB6   FE0F             CPI     0FH
4964   FBB8   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
4965   FBBB   C26EFB           JNZ     LFB6E
4966   FBBE   219AD1           LXI     H,LD19A
4967   FBC1   CD62FC           CALL    LFC62
4968   FBC4   C3D9FA           JMP     LFAD9
4969                   ;
4970   FBC7   01               DB      01H             ;THIS IS A FOOL'S BYTE
4971                   ;
4972                   ;INSERT LINE COMMAND
4973                   ;
4974   FBC8   CD51FC   LFBC8:  CALL    LFC51
4975   FBCB   AF               XRA     A
4976   FBCC   3296D1           STA     NCHAR
4977   FBCF   C3D9FA           JMP     LFAD9
4978                   ;
4979                   ;DELETE LINE COMMAND
4980                   ;
4981   FBD2   97       LFBD2:  SUB     A               ;GET A ZERO
4982   FBD3   3298D1           STA     LD198           ;USE IT TO CLEAR INSERT MODE
4983   FBD6   2A05D0           LHLD    BOFP
4984   FBD9   7E               MOV     A,M
4985   FBDA   CD32FD           CALL    LFD32
4986   FBDD   7E               MOV     A,M
4987   FBDE   FE01             CPI     1
4988   FBE0   C8               RZ
49891
4990 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
4991+                                                      21:15  07/30/2018
4992+                                                                                      PAGE 87
4993
4994
4995
4996   FBE1   CD5FFC           CALL    LFC5F
4997   FBE4   C2EAFB           JNZ     LFBEA
4998   FBE7   CD72FC           CALL    LFC72
4999   FBEA   F5       LFBEA:  PUSH    PSW
5000   FBEB   2A9ED1           LHLD    LD19E
5001   FBEE   7E               MOV     A,M
5002   FBEF   2F               CMA
5003   FBF0   3C               INR     A
5004   FBF1   CDD1FC           CALL    LFCD1
5005   FBF4   F1               POP     PSW
5006   FBF5   C2D9FA           JNZ     LFAD9
5007   FBF8   2A9ED1           LHLD    LD19E
5008   FBFB   7E               MOV     A,M
5009   FBFC   FE01             CPI     1
5010   FBFE   CACCFA           JZ      LFACC
5011   FC01   C3D9FA           JMP     LFAD9
5012                   ;
5013                   ;
5014                   ;
5015   FC04   4F       LFC04:  MOV     C,A
5016   FC05   3A98D1           LDA     LD198           ;GET INSERT MODE FLAG
5017   FC08   B7               ORA     A               ;SET CPU FLAGS
5018   FC09   C218FC           JNZ     LFC18           ;JUMP IF IN INSERT MODE
5019   FC0C   CDEDFD           CALL    LFDED
5020   FC0F   71               MOV     M,C
5021                   ;
5022                   ;CURSOR RIGHT COMMAND
5023                   ;
5024   FC10   CD2DFF   LFC10:  CALL    LFF2D           ;TURN CURSOR OFF
5025   FC13   78               MOV     A,B             ;COLUMN TO A
5026   FC14   3C               INR     A               ;INCREMENT IT
5027   FC15   C35CFB           JMP     LFB5C           ;CURSOR BACK ON & RET
5028                   ;
5029                   ;
5030                   ;
5031   FC18   CDEDFD   LFC18:  CALL    LFDED
5032   FC1B   79               MOV     A,C
5033   FC1C   F680             ORI     80H
5034   FC1E   4F               MOV     C,A
5035   FC1F   7E       LFC1F:  MOV     A,M
5036   FC20   E67F             ANI     7FH
5037   FC22   71               MOV     M,C
5038   FC23   4F               MOV     C,A
5039   FC24   2C               INR     L
5040   FC25   7D               MOV     A,L
5041   FC26   E63F             ANI     3FH
5042   FC28   C21FFC           JNZ     LFC1F
5043   FC2B   C310FC           JMP     LFC10
5044                   ;
5045                   ;DELETE CHARACTER
5046                   ;
50471
5048 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5049+                                                      21:15  07/30/2018
5050+                                                                                      PAGE 88
5051
5052
5053
5054   FC2E   CDEDFD   LFC2E:  CALL    LFDED           ;CALC CURSOR POSITION
5055   FC31   3A96D1           LDA     NCHAR           ;GET CURRENT COLUMN
5056   FC34   FE3F             CPI     3FH             ;COLUMN 63 (LAST) ?
5057   FC36   DA3CFC           JC      LFC3C           ;NO - DELETE CHAR
5058   FC39   36A0             MVI     M,' '+80H       ;MAKE LAST COL SPACE W/CURSOR
5059   FC3B   C9               RET                     ;DONE
5060                   ;
5061                   ;ROUTINE TO DELETE A CHAR FROM MIDDLE OF LINE
5062                   ;
5063   FC3C   7D       LFC3C:  MOV     A,L             ;GET LINE POINTER
5064   FC3D   5F               MOV     E,A             ;SAVE IT
5065   FC3E   F63F             ORI     3FH             ;MAKE IT POINT TO LAST COL
5066   FC40   6F               MOV     L,A             ;PUT IT BACK
5067   FC41   7B               MOV     A,E             ;RESTORE ORIG PTR TO A
5068   FC42   0E20             MVI     C,' '           ;SPACE TO C
5069   FC44   46       LFC44:  MOV     B,M             ;GET CHAR FROM LINE
5070   FC45   71               MOV     M,C             ;REPL WITH CHAR ON IT'S RIGHT
5071   FC46   48               MOV     C,B             ;AND MAKE IT NXT CHAR ON RIGHT
5072   FC47   2D               DCR     L               ;DECR COLUMN POINTER
5073   FC48   BD               CMP     L               ;AND COMPARE TO INITIAL COL
5074   FC49   C244FC           JNZ     LFC44           ;AND KEEP UP IF NOT DONE
5075   FC4C   78               MOV     A,B             ;GET LAST CHAR TO STORE IN A
5076                   ;
5077                   ;TURN ON THE CURSOR
5078                   ;
5079   FC4D   F680     LFC4D:  ORI     80H             ;MAKE CURSOR BIT HIGH
5080   FC4F   77               MOV     M,A             ;PUT CHAR W/CURSOR ON SCREEN
5081   FC50   C9               RET                     ;DONE, CURSOR ON
5082                   ;
5083                   ;
5084                   ;
5085   FC51   3E02     LFC51:  MVI     A,2
5086   FC53   CDD1FC           CALL    LFCD1
5087   FC56   2A9ED1           LHLD    LD19E
5088   FC59   3602             MVI     M,2
5089   FC5B   23               INX     H
5090   FC5C   360D             MVI     M,0DH
5091   FC5E   C9               RET
5092                   ;
5093                   ;
5094                   ;
5095   FC5F   219CD1   LFC5F:  LXI     H,LD19C
5096   FC62   5E       LFC62:  MOV     E,M
5097   FC63   23               INX     H
5098   FC64   56               MOV     D,M
5099   FC65   1A               LDAX    D
5100   FC66   EB               XCHG
5101   FC67   CD32FD           CALL    LFD32
5102   FC6A   EB               XCHG
5103   FC6B   1A               LDAX    D
5104   FC6C   3D               DCR     A
51051
5106 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5107+                                                      21:15  07/30/2018
5108+                                                                                      PAGE 89
5109
5110
5111
5112   FC6D   C8               RZ
5113   FC6E   72               MOV     M,D
5114   FC6F   2B               DCX     H
5115   FC70   73               MOV     M,E
5116   FC71   C9               RET
5117                   ;
5118                   ;
5119                   ;
5120   FC72   2A9AD1   LFC72:  LHLD    LD19A
5121   FC75   CD95FC           CALL    LFC95
5122   FC78   C8               RZ
5123   FC79   2B               DCX     H
5124   FC7A   2B       LFC7A:  DCX     H
5125   FC7B   CD95FC           CALL    LFC95
5126   FC7E   CA90FC           JZ      LFC90
5127   FC81   7E               MOV     A,M
5128   FC82   FE0D             CPI     0DH
5129   FC84   C27AFC           JNZ     LFC7A
5130   FC87   2B               DCX     H
5131   FC88   7E               MOV     A,M
5132   FC89   FE0D             CPI     0DH
5133   FC8B   CA8FFC           JZ      LFC8F
5134   FC8E   23               INX     H
5135   FC8F   23       LFC8F:  INX     H
5136   FC90   3C       LFC90:  INR     A
5137   FC91   229AD1           SHLD    LD19A
5138   FC94   C9               RET
5139                   ;
5140                   ;
5141                   ;
5142   FC95   3A05D0   LFC95:  LDA     BOFP
5143   FC98   95               SUB     L
5144   FC99   3A06D0           LDA     BOFP+1
5145   FC9C   9C               SBB     H
5146   FC9D   C0               RNZ
5147   FC9E   3A05D0           LDA     BOFP
5148   FCA1   95               SUB     L
5149   FCA2   B7               ORA     A
5150   FCA3   C9               RET
5151                   ;
5152                   ;
5153                   ;
5154   FCA4   CD2DFF   LFCA4:  CALL    LFF2D           ;TURN ON THE CURSOR
5155   FCA7   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5156   FCAA   CD33FE           CALL    LFE33           ;BACK UP TO LAST NON BLANK CHAR
5157   FCAD   0C               INR     C
5158   FCAE   0C               INR     C
5159   FCAF   79               MOV     A,C
5160   FCB0   FE06             CPI     6
5161   FCB2   D2B8FC           JNC     LFCB8
5162   FCB5   3E06             MVI     A,6
51631
5164 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5165+                                                      21:15  07/30/2018
5166+                                                                                      PAGE 90
5167
5168
5169
5170   FCB7   4F               MOV     C,A
5171   FCB8   2A9ED1   LFCB8:  LHLD    LD19E
5172   FCBB   96               SUB     M
5173   FCBC   CDD1FC           CALL    LFCD1
5174   FCBF   2A9ED1           LHLD    LD19E
5175   FCC2   71               MOV     M,C
5176   FCC3   0D               DCR     C
5177   FCC4   0D               DCR     C
5178   FCC5   23               INX     H
5179   FCC6   EB               XCHG
5180   FCC7   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5181   FCCA   CD24FE           CALL    LFE24
5182   FCCD   EB               XCHG
5183   FCCE   360D             MVI     M,0DH
5184   FCD0   C9               RET
5185                   ;
5186                   ;
5187                   ;
5188   FCD1   47       LFCD1:  MOV     B,A
5189   FCD2   B7               ORA     A
5190   FCD3   C8               RZ
5191   FCD4   FA1AFD           JM      LFD1A
5192   FCD7   2A07D0           LHLD    EOFP
5193   FCDA   CD32FD           CALL    LFD32
5194   FCDD   1191D1           LXI     D,LD191         ;POINT TO ESET BUFFER LIMIT
5195   FCE0   CD42FD           CALL    LFD42
5196   FCE3   DA30FB           JC      LFB30
5197   FCE6   EB               XCHG
5198   FCE7   2A9ED1           LHLD    LD19E
5199   FCEA   2B               DCX     H
5200   FCEB   3681             MVI     M,81H
5201   FCED   2A07D0           LHLD    EOFP
5202   FCF0   7E       LFCF0:  MOV     A,M
5203   FCF1   FE81             CPI     81H
5204   FCF3   CAFCFC           JZ      LFCFC
5205   FCF6   12               STAX    D
5206   FCF7   2B               DCX     H
5207   FCF8   1B               DCX     D
5208   FCF9   C3F0FC           JMP     LFCF0
5209                   ;
5210                   ;
5211                   ;
5212   FCFC   360D     LFCFC:  MVI     M,0DH
5213   FCFE   2A07D0   LFCFE:  LHLD    EOFP
5214   FD01   78               MOV     A,B
5215   FD02   CD32FD           CALL    LFD32
5216   FD05   2207D0           SHLD    EOFP
5217   FD08   2A9CD1           LHLD    LD19C
5218   FD0B   119ED1           LXI     D,LD19E
5219   FD0E   CD42FD           CALL    LFD42
5220   FD11   C8               RZ
52211
5222 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5223+                                                      21:15  07/30/2018
5224+                                                                                      PAGE 91
5225
5226
5227
5228   FD12   78               MOV     A,B
5229   FD13   CD32FD           CALL    LFD32
5230   FD16   229CD1           SHLD    LD19C
5231   FD19   C9               RET
5232                   ;
5233                   ;
5234                   ;
5235   FD1A   2F       LFD1A:  CMA
5236   FD1B   3C               INR     A
5237   FD1C   2A9ED1           LHLD    LD19E
5238   FD1F   CD32FD           CALL    LFD32
5239   FD22   EB               XCHG
5240   FD23   2A9ED1           LHLD    LD19E
5241   FD26   1A       LFD26:  LDAX    D
5242   FD27   77               MOV     M,A
5243   FD28   FE01             CPI     01H
5244   FD2A   CAFEFC           JZ      LFCFE
5245   FD2D   23               INX     H
5246   FD2E   13               INX     D
5247   FD2F   C326FD           JMP     LFD26
5248                   ;
5249                   ;
5250                   ;
5251   FD32   B7       LFD32:  ORA     A
5252   FD33   FA3BFD           JM      LFD3B
5253   FD36   85               ADD     L
5254   FD37   6F               MOV     L,A
5255   FD38   D0               RNC
5256   FD39   24               INR     H
5257   FD3A   C9               RET
5258                   ;
5259                   ;
5260                   ;
5261   FD3B   85       LFD3B:  ADD     L
5262   FD3C   6F               MOV     L,A
5263   FD3D   3EFF             MVI     A,0FFH
5264   FD3F   8C               ADC     H
5265   FD40   67               MOV     H,A
5266   FD41   C9               RET
5267                   ;
5268                   ;
5269                   ;
5270   FD42   1A       LFD42:  LDAX    D
5271   FD43   95               SUB     L
5272   FD44   13               INX     D
5273   FD45   1A               LDAX    D
5274   FD46   9C               SBB     H
5275   FD47   1B               DCX     D
5276   FD48   D8               RC
5277   FD49   C0               RNZ
5278   FD4A   1A               LDAX    D
52791
5280 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5281+                                                      21:15  07/30/2018
5282+                                                                                      PAGE 92
5283
5284
5285
5286   FD4B   95               SUB     L
5287   FD4C   B7               ORA     A
5288   FD4D   C9               RET
5289                   ;
5290                   ;ROUTINE TO CLEAR ALL OR PART OF VDM-1 DISPLAY SCREEN
5291                   ;
5292   FD4E   2100CC   LFD4E:  LXI     H,VDM1          ;ENTER HERE TO CLR WHOLE SCREEN
5293   FD51   3620     LFD51:  MVI     M,' '           ;FILL WITH SPACES
5294   FD53   23               INX     H               ;POINT TO NEXT CHAR POSITION
5295   FD54   7C               MOV     A,H             ;GET HIGH ORDER BYTE
5296   FD55   FED0             CPI     0D0H            ;PAST END OF SCREEN ?
5297   FD57   DA51FD           JC      LFD51           ;CONTINUE IF NOT
5298   FD5A   AF               XRA     A               ;ELSE GET A ZERO TO CLEAR:
5299   FD5B   3294D1           STA     BOSL            ;BEGINNING OF SCREEN LINE (0-F)
5300   FD5E   3293D1           STA     BOTL            ;BEGINNING OF TEXT LINE (0-F)
5301   FD61   3296D1           STA     NCHAR           ;CURRENT COLUMN POSITION
5302   FD64   3E0F             MVI     A,0FH           ;THEN GET A 15
5303   FD66   3295D1           STA     SLINE           ;TO PUT US ON THE BOTTOM LINE
5304                   ;
5305                   ;THIS ROUTINE OUTPUTS A PROPER COMMAND BYTE TO THE VDM-1/SOL-20
5306                   ;VIDEO DISPLAY GENERATOR BASED ON SCREEN PARAMTETERS
5307                   ;
5308   FD69   3A94D1   LFD69:  LDA     BOSL            ;BEGINNING OF SCREEN LINE (0-F)
5309   FD6C   07               RLC                     ;SHIFT LEFT TO HIGH NIBBLE
5310   FD6D   07               RLC                     ;
5311   FD6E   07               RLC                     ;
5312   FD6F   07               RLC                     ;
5313   FD70   2193D1           LXI     H,BOTL          ;BEGINNING OF TEXT LINE (0-F)
5314   FD73   B6               ORA     M               ;A NOW HAS VDM CONTROL BYTE
5315   FD74   D3C8             OUT     0C8H            ;FOR VDM-1
5316   FD76   D3FE             OUT     0FEH            ;FOR SOL'S
5317   FD78   C9               RET                     ;DONE
5318                   ;
5319                   ;
5320                   ;
5321   FD79   2C       LFD79:  INR     L
5322   FD7A   7D               MOV     A,L
5323   FD7B   E63F             ANI     3FH
5324   FD7D   C0               RNZ
5325   FD7E   7D               MOV     A,L
5326   FD7F   C6C0             ADI     0C0H
5327   FD81   6F               MOV     L,A
5328   FD82   C9               RET
5329                   ;
5330                   ;THIS ROUTINE IS PART OF THE VDM-1 DRIVER USED TO DISPLAY
5331                   ;NORMAL CHARS AFTER CHECKING FOR SPEED CNTL HAS BEEN DONE
5332                   ;
5333   FD83   E67F     LFD83:  ANI     7FH             ;CLEAR PARITY BIT
5334   FD85   4F               MOV     C,A             ;SAVE IN C
5335   FD86   2196D1           LXI     H,NCHAR         ;CURRENT COLUMN
5336   FD89   46               MOV     B,M             ;COL IN B
53371
5338 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5339+                                                      21:15  07/30/2018
5340+                                                                                      PAGE 93
5341
5342
5343
5344   FD8A   FE0D             CPI     0DH             ;IS CHAR A C/R ?
5345   FD8C   CAB1FD           JZ      LFDB1           ;PROCESS IT SEPERATELY
5346   FD8F   FE5F             CPI     5FH             ;BACKSPACE ?
5347   FD91   CAEDFE           JZ      LFEED           ;IT GET'S SPECIAL TREATMENT TOO
5348   FD94   FE01             CPI     'A'-40H         ;CURSOR ON-OFF TOGGLE ?
5349   FD96   CA06FF           JZ      LFF06           ;ANOTHER SPECIAL
5350   FD99   FE1A             CPI     'Z'-40H         ;CLEAR SCREEN ?
5351   FD9B   CA4EFD           JZ      LFD4E           ;LAST SPECIAL CHAR
5352   FD9E   FE20             CPI     20H             ;TESTING FOR CONTROL CHAR
5353   FDA0   D8               RC                      ;SKIP THEM IF FOUND
5354   FDA1   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5355   FDA4   CDF4FD           CALL    VDAD            ;AND CALCULATE CHAR ADDRESS
5356   FDA7   71               MOV     M,C             ;PUT CHAR ON SCREEN
5357   FDA8   3A96D1           LDA     NCHAR           ;NOW GET COLUMN
5358   FDAB   3C               INR     A               ;AND INCREMENT IT
5359   FDAC   FE40             CPI     64              ;GONE OFF END OF LINE ?
5360   FDAE   C2BDFD           JNZ     LFDBD           ;NO - OK THEN
5361                   ;
5362                   ;COME HERE TO PROCESS CARRIAGE RETURN
5363                   ;
5364   FDB1   3A95D1   LFDB1:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5365   FDB4   CD46FE           CALL    LFE46           ;TURN CURSOR OFF
5366   FDB7   3E01             MVI     A,1
5367   FDB9   CDCDFD           CALL    LFDCD           ;CLEAR TO END OF LINE & SCROLL
5368   FDBC   97               SUB     A               ;GET A ZERO
5369   FDBD   3296D1   LFDBD:  STA     NCHAR           ;PUT UPDATED COL. POSITION BACK
5370   FDC0   47               MOV     B,A             ;AND MOVE IT TO B
5371   FDC1   3A97D1           LDA     LD197           ;GET CURSOR ON-OFF FLAG
5372   FDC4   FE00             CPI     0               ;SET FLAGS
5373   FDC6   C8               RZ                      ;DONE IF CURSOR OFF
5374   FDC7   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5375   FDCA   C31AFF           JMP     LFF1A           ;TURN CURSOR ON & RETURN
5376                   ;
5377                   ;
5378                   ;
5379   FDCD   2193D1   LFDCD:  LXI     H,BOTL          ;BEGINNING OF TEXT LINE (0-F)
5380   FDD0   B7               ORA     A
5381   FDD1   CAD9FD           JZ      LFDD9
5382   FDD4   7E               MOV     A,M
5383   FDD5   34               INR     M
5384   FDD6   C3DDFD           JMP     LFDDD
5385   FDD9   35       LFDD9:  DCR     M
5386   FDDA   7E               MOV     A,M
5387   FDDB   E60F             ANI     0FH
5388   FDDD   96       LFDDD:  SUB     M
5389   FDDE   0E00             MVI     C,0
5390   FDE0   CD0CFE           CALL    LFE0C
5391   FDE3   2193D1           LXI     H,BOTL          ;BEGINNING OF TEXT LINE (0-F)
5392   FDE6   7E               MOV     A,M
5393   FDE7   E60F             ANI     0FH
5394   FDE9   77               MOV     M,A
53951
5396 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5397+                                                      21:15  07/30/2018
5398+                                                                                      PAGE 94
5399
5400
5401
5402   FDEA   C369FD           JMP     LFD69
5403                   ;
5404                   ;
5405                   ;
5406   FDED   3A95D1   LFDED:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5407   FDF0   2196D1           LXI     H,NCHAR         ;GET COLUMN POSITION
5408   FDF3   46               MOV     B,M             ;TO B
5409                   ;
5410                   ;FOLLOWING ROUTINE CALCULATES ADDR OF CHAR AT LINE
5411                   ;IN "A" AND COL "B"
5412                   ;
5413   FDF4   6F       VDAD:   MOV     L,A             ;LINE NO. (0-F) TO L
5414   FDF5   3A93D1           LDA     BOTL            ;BEGINNING OF TEXT LINE (0-F)
5415   FDF8   85               ADD     L               ;ADD OFFSET TO LINE
5416   FDF9   0F               RRC                     ;DIVIDE BY TWO
5417   FDFA   0F               RRC                     ;AGAIN, NOW /4
5418   FDFB   6F               MOV     L,A             ;SAVE # PAGES (256) OFFSET
5419   FDFC   E603             ANI     3               ;MAKE IT 0-3 ONLY
5420   FDFE   C6CC             ADI     (VDM1 SHR 8) AND 0FFH
5421   FE00   67               MOV     H,A             ;H NOW HI SCREEN ADDR
5422   FE01   7D               MOV     A,L             ;RESTORE # 256 BYTE PGS. OFFSET
5423   FE02   E6C0             ANI     0C0H            ;CHG TO # LINES FROM PG BOUNDRY
5424   FE04   80               ADD     B               ;ADD IN COL ON LINE
5425   FE05   6F               MOV     L,A             ;H,L NOW COMPLETE ADDR
5426   FE06   C9               RET                     ;DONE
5427                   ;
5428                   ;
5429                   ;
5430   FE07   4E       LFE07:  MOV     C,M
5431   FE08   0D               DCR     C
5432   FE09   0D               DCR     C
5433   FE0A   23               INX     H
5434   FE0B   EB               XCHG
5435   FE0C   0600     LFE0C:  MVI     B,0
5436   FE0E   CDF4FD           CALL    VDAD
5437   FE11   0640             MVI     B,64
5438   FE13   AF       LFE13:  XRA     A
5439   FE14   B9               CMP     C
5440   FE15   3E20             MVI     A,' '
5441   FE17   CA1DFE           JZ      LFE1D
5442   FE1A   1A               LDAX    D
5443   FE1B   13               INX     D
5444   FE1C   0D               DCR     C
5445   FE1D   77       LFE1D:  MOV     M,A
5446   FE1E   2C               INR     L
5447   FE1F   05               DCR     B
5448   FE20   C213FE           JNZ     LFE13
5449   FE23   C9               RET
5450                   ;
5451                   ;
5452                   ;
54531
5454 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5455+                                                      21:15  07/30/2018
5456+                                                                                      PAGE 95
5457
5458
5459
5460   FE24   0600     LFE24:  MVI     B,0
5461   FE26   CDF4FD           CALL    VDAD
5462   FE29   0C               INR     C
5463   FE2A   0D       LFE2A:  DCR     C
5464   FE2B   C8               RZ
5465   FE2C   7E               MOV     A,M
5466   FE2D   12               STAX    D
5467   FE2E   23               INX     H
5468   FE2F   13               INX     D
5469   FE30   C32AFE           JMP     LFE2A
5470                   ;
5471                   ;
5472                   ;
5473   FE33   063F     LFE33:  MVI     B,3FH
5474   FE35   CDF4FD           CALL    VDAD
5475   FE38   0E40             MVI     C,40H
5476   FE3A   7E       LFE3A:  MOV     A,M
5477   FE3B   E67F             ANI     7FH
5478   FE3D   FE20             CPI     20H
5479   FE3F   C0               RNZ
5480   FE40   2B               DCX     H
5481   FE41   0D               DCR     C
5482   FE42   C23AFE           JNZ     LFE3A
5483   FE45   C9               RET
5484                   ;
5485                   ;ROUTINE TO TURN CURSOR OFF
5486                   ;
5487   FE46   CDF4FD   LFE46:  CALL    VDAD            ;CALCULATE SCREEN ADDR
5488   FE49   7E               MOV     A,M             ;GET CHAR UNDER CURSOR
5489   FE4A   E67F             ANI     7FH             ;TURN CURSOR BIT OFF
5490   FE4C   77               MOV     M,A             ;PUT IT BACK
5491   FE4D   C9               RET                     ;DONE, CURSOR OFF
5492                   ;
5493                   ;
5494                   ;
5495   FE4E   EB       LFE4E:  XCHG
5496   FE4F   F5       LFE4F:  PUSH    PSW
5497   FE50   D5               PUSH    D
5498   FE51   CDF4FD           CALL    VDAD
5499   FE54   71       LFE54:  MOV     M,C
5500   FE55   CD79FD           CALL    LFD79
5501   FE58   15               DCR     D
5502   FE59   C254FE           JNZ     LFE54
5503   FE5C   D1               POP     D
5504   FE5D   F1               POP     PSW
5505   FE5E   1D               DCR     E
5506   FE5F   C8               RZ
5507   FE60   3C               INR     A
5508   FE61   C34FFE           JMP     LFE4F
5509                   ;
5510                   ;
55111
5512 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5513+                                                      21:15  07/30/2018
5514+                                                                                      PAGE 96
5515
5516
5517
5518                   ;
5519   FE64   FE1B     LFE64:  CPI     1BH             ;ESCAPE CHAR ?
5520   FE66   CA60E0           JZ      EORMS           ;BACK TO ALS-8 THEN
5521   FE69   FE20             CPI     20H             ;SPACE BAR ?
5522   FE6B   C2C1FE           JNZ     LFEC1           ;NO - CLEAR CHRR AND RETURN
5523   FE6E   CDA4D0   LFE6E:  CALL    STAT            ;YES - CHAR TYPED ?
5524   FE71   CA6EFE           JZ      LFE6E           ;NO - WAIT FOREVER IF NECESSARY
5525   FE74   C3C2FE           JMP     LFEC2           ;THEN SAVE THAT CHAR AS CHRR
5526                   ;
5527                   ;VDM-1 DRIVER STARTS HERE
5528                   ;
5529   FE77   78       LFE77:  MOV     A,B             ;GET CHAR TO A
5530   FE78   FE7F             CPI     7FH             ;DELETE CHAR ?
5531   FE7A   C8               RZ                      ;RETURN IF SO
5532   FE7B   E5               PUSH    H               ;ELSE SAVE REGISTERS
5533   FE7C   D5               PUSH    D               ;
5534   FE7D   C5               PUSH    B               ;
5535   FE7E   3AA0D1           LDA     SPEED           ;GET SPEED CONTROL BYTE
5536   FE81   67               MOV     H,A             ;TO H
5537   FE82   2E80             MVI     L,80H           ;COUNTER NOW SET
5538   FE84   CD9DFE           CALL    LFE9D           ;SEE IF CHAR WAITING
5539   FE87   AF               XRA     A               ;MAKE ACC. ZERO
5540   FE88   2B       LFE88:  DCX     H               ;DCR TIMER COUNTER
5541   FE89   BC               CMP     H               ;H = 0 YET ?
5542   FE8A   C288FE           JNZ     LFE88           ;NO - THEN DELAY SOME MORE
5543   FE8D   C1               POP     B               ;RESTORE CHAR TO B
5544   FE8E   C5               PUSH    B               ;AND RE-SAVE B,C
5545   FE8F   78               MOV     A,B             ;GET CHAR AGAIN
5546   FE90   FE13             CPI     'S'-40H         ;CONTROL-S ?
5547   FE92   CCC6FE           CZ      LFEC6           ;CALL SPEED SET ROUTINE
5548   FE95   CD83FD           CALL    LFD83           ;PUT CHAR ON SCREEN
5549   FE98   C1               POP     B               ;RESTORE REGS
5550   FE99   D1               POP     D               ;
5551   FE9A   E1               POP     H               ;
5552   FE9B   78               MOV     A,B             ;PUT CHAR IN ACC ON EXIT
5553   FE9C   C9               RET                     ;DONE
5554                   ;
5555                   ;ROUTINE TO CHECK FOR KEYBOARD INPUT & SCREEN CONTROL VALUE
5556                   ;
5557   FE9D   3A90D1   LFE9D:  LDA     CHRR            ;DEFAULT SPEED
5558   FEA0   47               MOV     B,A             ;SAVE IT IN B
5559   FEA1   CDA4D0           CALL    STAT            ;KEYBOARD CHAR WAITING ?
5560   FEA4   C4CCD0           CNZ     IN8             ;YES - THEN GET IT
5561   FEA7   78               MOV     A,B             ;DEFAULT SPEED OR CHAR TO A
5562   FEA8   B7       LFEA8:  ORA     A               ;SET FLAGS
5563   FEA9   C8               RZ                      ;NO CHG IF CHR/DEFAULT=0
5564   FEAA   FE3A             CPI     '9'+1           ;NUMERIC ?
5565   FEAC   D264FE           JNC     LFE64           ;NO, NOT NUMERIC
5566   FEAF   FE31             CPI     '1'             ;NUMERIC ?
5567   FEB1   DA64FE           JC      LFE64           ;NO, NOT NUMERIC
5568   FEB4   E60F             ANI     0FH             ;CONVERT TO BINARY
55691
5570 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5571+                                                      21:15  07/30/2018
5572+                                                                                      PAGE 97
5573
5574
5575
5576   FEB6   4F               MOV     C,A             ;SAVE IN C
5577   FEB7   AF               XRA     A               ;CLEAR ACC & FLAGS
5578   FEB8   37               STC                     ;SET CARRY
5579   FEB9   32A0D1   LFEB9:  STA     SPEED           ;SPEED CONTROL BYTE
5580   FEBC   17               RAL                     ;MOVE ACCUM/CARRY 1 BIT LEFT
5581   FEBD   0D               DCR     C               ;DCR SPEED COUNT
5582   FEBE   C2B9FE           JNZ     LFEB9           ;IF SPEED COUNT <> 0, CONTINUE
5583   FEC1   AF       LFEC1:  XRA     A               ;GET A ZERO
5584   FEC2   3290D1   LFEC2:  STA     CHRR            ;MAKE IT ZERO FOR NEXT TIME
5585   FEC5   C9               RET                     ;DONE
5586                   ;
5587                   ;ROUTINE TO SET SPEED
5588                   ;
5589   FEC6   0600     LFEC6:  MVI     B,0             ;COLUMN = 0
5590   FEC8   CDB1FD           CALL    LFDB1           ;CLEAR LINE
5591   FECB   21E6FE           LXI     H,LFEE6         ;POINT TO "SPEED ?" MESSAGE
5592   FECE   7E       LFECE:  MOV     A,M             ;GET CHAR FROM MSG
5593   FECF   E5               PUSH    H               ;SAVE H,L
5594   FED0   CD83FD           CALL    LFD83           ;PRINT MESSAGE
5595   FED3   E1               POP     H               ;RESTORE H,L
5596   FED4   23               INX     H               ;POINT TO NEXT CHAR
5597   FED5   7E               MOV     A,M             ;GET IT
5598   FED6   B7               ORA     A               ;SET FLAGS
5599   FED7   C2CEFE           JNZ     LFECE           ;PRINT IT IF NOT ZERO
5600   FEDA   CDCCD0           CALL    IN8             ;GET CHAR
5601   FEDD   CDA8FE           CALL    LFEA8           ;TEST NUMERIC & SET SPEED
5602   FEE0   CD16E2           CALL    CRLF            ;DO CR/LF
5603   FEE3   C3D1E0           JMP     EORNS           ;THEN BACK TO ALS-8
5604                   ;
5605   FEE6   53504545 LFEE6:  DB      'SPEED?'
5606   FEEA   443F
5607   FEEC   00               DB      0
5608                   ;
5609                   ;
5610                   ;ROUTINE TO PROCESS BACKSPACE (5FH)
5611                   ;
5612   FEED   3A96D1   LFEED:  LDA     NCHAR           ;GET COLUMN
5613   FEF0   47               MOV     B,A             ;TO B
5614   FEF1   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5615   FEF4   CD46FE           CALL    LFE46           ;TURN CURSOR OFF
5616   FEF7   2B               DCX     H               ;POINT TO PREV CHAR
5617   FEF8   3620             MVI     M,' '           ;REPLACE IT WITH SPACE
5618   FEFA   78               MOV     A,B             ;OLD COLUMN ADDR TO A
5619   FEFB   B7               ORA     A               ;SET FLAGS
5620   FEFC   CA00FF           JZ      LFF00           ;DON'T BACK INTO PREV LINE
5621   FEFF   05               DCR     B               ;DECREMENT COLUMN
5622   FF00   3A95D1   LFF00:  LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5623   FF03   C31AFF           JMP     LFF1A           ;UPDATE ROW, COL, CUR ON & RET
5624                   ;
5625                   ;CURSOR ON-OFF TOGGLE ROUTINES
5626                   ;
56271
5628 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5629+                                                      21:15  07/30/2018
5630+                                                                                      PAGE 98
5631
5632
5633
5634   FF06   3A97D1   LFF06:  LDA     LD197           ;GET CURSOR ON-OFF FLAG
5635   FF09   EE01             XRI     01H             ;TOGGLE LOW ORDER BIT
5636   FF0B   3297D1           STA     LD197           ;PUT IT BACK
5637   FF0E   E601             ANI     01H             ;MASK LOW ORDER BIT
5638   FF10   C22AFF           JNZ     LFF2A           ;JUMP IF CURSOR OFF
5639   FF13   3A96D1   LFF13:  LDA     NCHAR           ;GET COLUMN
5640   FF16   47       LFF16:  MOV     B,A             ;TO A
5641   FF17   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5642   FF1A   E60F     LFF1A:  ANI     0FH             ;KEEP IT TO 0-15
5643   FF1C   3295D1           STA     SLINE           ;UPDATE IT
5644   FF1F   CDF4FD           CALL    VDAD            ;CALCULATE CURSOR ADDRESS
5645   FF22   78               MOV     A,B             ;COLUMN TO A
5646   FF23   3296D1           STA     NCHAR           ;UPDATE IT
5647   FF26   7E               MOV     A,M             ;GET CHAR TO A
5648   FF27   C34DFC           JMP     LFC4D           ;TURN ON CURSOR & RETURN
5649   FF2A   3297D1   LFF2A:  STA     LD197           ;UPDATE CURSOR FLAG
5650   FF2D   2196D1   LFF2D:  LXI     H,NCHAR         ;POINT TO COLUMN
5651   FF30   46               MOV     B,M             ;GET IT TO B
5652   FF31   3A95D1           LDA     SLINE           ;GET CURRENT LINE NO (0-F)
5653   FF34   CD46FE           CALL    LFE46           ;TURN CURSOR OFF
5654   FF37   2196D1           LXI     H,NCHAR         ;FOR PROPER EXIT
5655   FF3A   C9               RET                     ;DONE, CURSOR OFF
5656                   ;
5657                   ;THIS IS THE ALS-8 (NOT TXT-2) FIND COMMAND
5658                   ;
5659   FF3B   CD16E2   FIND2:  CALL    CRLF            ;DO CR/LF
5660   FF3E   CD80FF           CALL    LFF80           ;GET SEARCH STRING
5661   FF41   2A05D0           LHLD    BOFP            ;LOAD SEARCH STARTING POINT
5662   FF44   CDC2FF   LFF44:  CALL    LFFC2           ;SEARCH FOR STRING
5663   FF47   FE01             CPI     1               ;EOF FOUND ?
5664   FF49   C8               RZ                      ;DONE IF YES
5665   FF4A   2AD2D0           LHLD    INSP            ;ELSE POINT TO LINE W/STRING
5666   FF4D   23               INX     H               ;POINT PAST LENGTH BYTE
5667   FF4E   CD80E3           CALL    SCRN            ;PRINT LINE
5668   FF51   CD16E2           CALL    CRLF            ;CAR. RET AT END OF LINE
5669   FF54   23               INX     H               ;INR TO NEXT LINE
5670   FF55   C344FF           JMP     LFF44           ;AND CONTINUE SEARCH
5671                   ;
5672                   ;EDITOR STRING SEARCH
5673                   ;
5674   FF58   CD4EFD   LFF58:  CALL    LFD4E           ;CLEAR SCREEN
5675   FF5B   CD80FF           CALL    LFF80           ;GET SEARCH STRING
5676   FF5E   2A05D0           LHLD    BOFP            ;POINT TO BEGINNING OF FILE
5677   FF61   229CD1           SHLD    LD19C           ;SAVE AS SEARCH STARTING POINT
5678                   ;
5679                   ;CONTINUE SEARCH
5680                   ;
5681   FF64   312FD1   LFF64:  LXI     SP,SMODE        ;RESET STACK POINTER
5682   FF67   2A9CD1           LHLD    LD19C           ;GET SEARCH STARTING PT.
5683   FF6A   CDC2FF           CALL    LFFC2           ;SEARCH FROM H,L FOR STRING
5684   FF6D   FE01             CPI     1               ;END OF FILE FOUND ?
56851
5686 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5687+                                                      21:15  07/30/2018
5688+                                                                                      PAGE 99
5689
5690
5691
5692   FF6F   CA0BFA           JZ      TXT2            ;RESTART EDITOR THEN
5693   FF72   CD4EFD           CALL    LFD4E           ;
5694   FF75   AF               XRA     A               ;GET A ZERO
5695   FF76   47               MOV     B,A             ;MAKE IT THE ROW
5696   FF77   CD1AFF           CALL    LFF1A           ;TURN CURSOR ON
5697   FF7A   2AD2D0           LHLD    INSP            ;GET POINTER TO LINE W/STRING
5698   FF7D   C327FA           JMP     LFA27           ;PUT TEXT ON SCRN & RET
5699                   ;
5700                   ;ROUTINE TO FIND STRING
5701                   ;
5702   FF80   063A     LFF80:  MVI     B,':'           ;GET PROMPT
5703   FF82   CDCFD0           CALL    OUT8            ;PRINT IT
5704   FF85   1E00             MVI     E,0             ;INITIALIZE STRING LENGTH
5705   FF87   2135D2           LXI     H,IBUF+81       ;POINT TO STRING LOCATION
5706   FF8A   CDCCD0   LFF8A:  CALL    IN8             ;GET STRING CHAR
5707   FF8D   FE7F             CPI     7FH             ;DELETE ?
5708   FF8F   C2A1FF           JNZ     LFFA1           ;NO - MUST BE CHAR
5709   FF92   7B               MOV     A,E             ;ELSE MOVE LENGTH TO A
5710   FF93   B7               ORA     A               ;ZERO ?
5711   FF94   CA8AFF           JZ      LFF8A           ;NO ACTION IF ZERO
5712   FF97   1D               DCR     E               ;ELSE DCR STRING LENGTH
5713   FF98   2B               DCX     H               ;AND STRING POINTER
5714   FF99   065F             MVI     B,5FH           ;GET A BACKSPACE CHAR
5715   FF9B   CDCFD0   LFF9B:  CALL    OUT8            ;AND PRINT IT
5716   FF9E   C38AFF           JMP     LFF8A           ;THEN GET THE NEXT CHAR
5717   FFA1   FE0D     LFFA1:  CPI     0DH             ;CARRIAGE RETURN ?
5718   FFA3   C2B6FF           JNZ     LFFB6           ;NO - MUST BE CHAR
5719   FFA6   7B               MOV     A,E             ;ELSE GET LENGTH TO A
5720   FFA7   B7               ORA     A               ;SET FLAGS
5721   FFA8   C2B1FF           JNZ     LFFB1           ;IF NOT ZERO, DONE
5722   FFAB   CD16E2           CALL    CRLF            ;ELSE PRINT CRLF
5723   FFAE   C380FF           JMP     LFF80           ;AND GET STRING (AGAIN)
5724   FFB1   70       LFFB1:  MOV     M,B             ;MOVE C/R TO STRING BUFFER
5725   FFB2   CD16E2           CALL    CRLF            ;PRINT CR/LF
5726   FFB5   C9               RET                     ;AND RETURN W/STRING IN BUFFER
5727   FFB6   FE20     LFFB6:  CPI     20H             ;IS CHAR A CNTL CHAR ?
5728   FFB8   DA8AFF           JC      LFF8A           ;IGNORE IT THEN
5729   FFBB   1C               INR     E               ;ELSE INR LENGTH
5730   FFBC   70               MOV     M,B             ;PUT CHAR IN STRING
5731   FFBD   23               INX     H               ;INR POINTER
5732   FFBE   C39BFF           JMP     LFF9B           ;AND DO NEXT CHAR
5733                   ;
5734                   ;ROUTINE TO SEARCH FOR STRING
5735                   ;
5736   FFC1   23       LFFC1:  INX     H               ;POINT PAST LENGTH BYTE
5737   FFC2   22D2D0   LFFC2:  SHLD    INSP            ;AND SAVE AS POINTER
5738   FFC5   0E00             MVI     C,0             ;INITIALIZE COUNTER
5739   FFC7   1135D2   LFFC7:  LXI     D,IBUF+81       ;GET STRING LENGTH
5740   FFCA   7E               MOV     A,M             ;GET CHAR FROM LINE
5741   FFCB   FE01             CPI     1               ;END OF FILE ?
5742   FFCD   C8               RZ                      ;IF SO, RETURN
57431
5744 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5745+                                                      21:15  07/30/2018
5746+                                                                                      PAGE 100
5747
5748
5749
5750   FFCE   23       LFFCE:  INX     H               ;ELSE INCR LINE POINTER
5751   FFCF   0C               INR     C               ;AND COUNT OF CHARS TESTED
5752   FFD0   1A               LDAX    D               ;GET CHAR FROM STRING
5753   FFD1   BE               CMP     M               ;STRING & LINE AGREE ?
5754   FFD2   13               INX     D               ;INR STRING POINTER
5755   FFD3   CAE7FF           JZ      LFFE7           ;AND KEEP TESTING
5756   FFD6   FE0D             CPI     0DH             ;WAS NON-MATCH DUE TO C/R ?
5757   FFD8   C8               RZ                      ;YES - STRING MATCHED THEN
5758   FFD9   7E               MOV     A,M             ;ELSE MOVE LINE CHAR TO A
5759   FFDA   FE0D             CPI     0DH             ;AND SEE IF END OF LINE
5760   FFDC   CAC1FF           JZ      LFFC1           ;IT WAS - GO TO NEXT LINE
5761   FFDF   0D       LFFDF:  DCR     C               ;ELSE DCR MATCH COUNT
5762   FFE0   CAC7FF           JZ      LFFC7           ;BACK TO WHERE WE STARTED ?
5763   FFE3   2B               DCX     H               ;NO - DCR LINE POINTER
5764   FFE4   C3DFFF           JMP     LFFDF           ;AND TEST AGAIN
5765   FFE7   FE0D     LFFE7:  CPI     0DH             ;MATCH - END OF STRING TOO ?
5766   FFE9   C8               RZ                      ;THAT'S STILL A MATCH
5767   FFEA   7E               MOV     A,M             ;ELSE GET LINE CHAR
5768   FFEB   FE0D             CPI     0DH             ;AND SEE IF END OF LINE
5769   FFED   CAC1FF           JZ      LFFC1           ;IF SO TEST NEXT LINE
5770   FFF0   C3CEFF           JMP     LFFCE           ;ELSE GO ON WITH TEST
5771                   ;
5772                   ;ESET COMMAND TO SET UPPER LIMIT ON EDITOR TEXT BUFFER
5773                   ;
5774   FFF3   2AEFD0   LFFF3:  LHLD    BBUF            ;GET VALUE OF UPPER LIMIT
5775   FFF6   2291D1           SHLD    LD191           ;SAVE IT
5776   FFF9   C360E0           JMP     EORMS           ;AND GO BACK TO ALS-8
5777                   ;
5778                   ; **** END OF ALS8TXT MODULE
5779                   ;
5780                   ;
5781   D000                    ORG     DATA            ;START OF SYSTEM GLOBAL
5782                   ;
5783                   ;SYSTEM GLOBAL AREA
5784                   ;
5785   0001            UDATA   EQU     1               ;DATA PORT NUMBER
5786                   ;DAV    EQU     40H             ;DATA AVAILABLE AT BIT 6
5787   0001            DAV     EQU     01H             ;*UM*
5788   0080            TBE     EQU     80H             ;TRANS. BUFFER EMPTY AT BIT 7
5789   0000            USTA    EQU     0               ;UART STATUS PORT
5790   0001            UDAI    EQU     1               ;UART DATA
5791   0001            UDAO    EQU     1               ;UART DATA
5792   00FF            SWCH    EQU     0FFH            ;SENSE SWITCH
5793                   ;
5794                   ;FILE AREA PARAMETERS
5795                   ;
5796   0006            MAXFIL  EQU     6               ;MAX # OF FILES
5797   0005            NMLEN   EQU     5               ;NAME LENGTH
5798   000D            FELEN   EQU     NMLEN+8         ;DIRECTORY ENTRY LENGTH
5799                   ;
5800                   ;FILE TABLE
58011
5802 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5803+                                                      21:15  07/30/2018
5804+                                                                                      PAGE 101
5805
5806
5807
5808                   ;
5809                   ;FILE 0 IS THE "CURRENT FILE" ALL OTHER FILES
5810                   ;ARE STORED IN THE FILE TABLE IN THIS FORMAT
5811                   ;
5812   D000            FILE0:  DS      NMLEN           ;CURRENT FILE LOCATION
5813   D005            BOFP:   DS      2               ;BEGINNING OF FILE POINTER
5814   D007            EOFP:   DS      2               ;END OF FILE POINTER
5815   D009            MAXL:   DS      4               ;MAXIMUM LINE NUMBER IN FILE
5816                   ;
5817   D00D            FILTB:  DS      (MAXFIL-1)*FELEN;REST OF FILE TABLE
5818                   ;
5819                   ;I/O DRIVER TABLES
5820                   ;
5821   D04E            IOFLE:  DS      (MAXFIL-1)*FELEN
5822   D08F            SYSIO:  DS      NMLEN
5823   D094            SYSIN:  DS      2
5824   D096            SYSOT:  DS      2               ;OUTPUT DRIVER ADDRESS
5825                   ;
5826                   ;THE INPUT DRIVER
5827                   ;
5828   D098            INDR:   DS      OUTP8-INP8
5829                   ;
5830                   ;THE OUTPUT DRIVER
5831                   ;
5832   D0A9            OUTDR:  DS      CRLF-OUTP8      ;OUTPUT DRIVER
5833   D0CC            IN8:    DS      3               ;DRIVER JUMP POINTS
5834   D0CF            OUT8:   DS      3
5835   D0A4            STAT    EQU     INDR+12
5836   D0B8            NOCHR   EQU     OUTDR+0FH
5837                   ;
5838                   ;SYSTEM PARAMETERS
5839                   ;
5840   D0D2            INSP:   DS      2               ;INSERT LINE POSITION
5841   D0D2            DELP    EQU     INSP            ;DELETE LINE POSITION
5842   000D            ASCR    EQU     13
5843   001B            ESC     EQU     1BH
5844   002A            COMCHR  EQU     '*'             ;ASSEMBLER COMMENT CHARACTER
5845   D0D4            HCON:   DS      3               ;CONVERSION AREA
5846   D0D4            ADDS    EQU     HCON            ;FIND ADDRESS
5847   D0D7            FBUF:   DS      NMLEN           ;FILE NAME BUFFER
5848   D0DC            FREAD:  DS      2               ;FREE ADDRESS IN DIRECTORY
5849   D0DE            FEF:    DS      1               ;FREE ENTRY FOUND FLAG
5850   D0DE            FOCNT   EQU     FEF             ;OUTPUT COUNTER
5851   D0DF            ABUF:   DS      16              ;ASCII BUFFER AREA
5852   D0EF            BBUF:   DS      4               ;BINARY BUFFER
5853   D0F3            SCNT:   DS      1               ;SYMBOL COUNT
5854   D0F4            DCNT:   DS      1               ;DUMP ROUTINE COUNTER
5855   D0F5            TABA:   DS      2               ;SYMBOL TABLE END ADDRESS
5856   D0F7            ASPC:   DS      2               ;ASSEMBLER PROGRAM COUNTER
5857   D0F9            PASI:   DS      1               ;PASS INDICATOR
5858   D0FA            LFMT:   DS      1               ;FORMAT CONTROL
58591
5860 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5861+                                                      21:15  07/30/2018
5862+                                                                                      PAGE 102
5863
5864
5865
5866   D0FB            NOLIN:  DS      1
5867   D0FC            IOSWC:  DS      1               ;I/O SWITCH INDICATOR
5868   D0FD            SWCH1:  DS      1
5869   D0FE            SWCH2:  DS      1
5870   D0FF            XOUT:   DS      1               ;SCRN PARAMETER
5871   D100            ASMTY:  DS      1               ;ASSEMBLY TYPE FLAG
5872   D101            PNTR:   DS      2               ;LINE POINTER STORAGE
5873   D103            NOLA:   DS      1               ;NUMBER OF LABELS
5874   D104            SIGN:   DS      1               ;SIGN STORAGE FOR SCAN
5875   D105            OPRD:   DS      2
5876   D107            OPRI:   DS      1
5877   D108            GTLT:   DS      1
5878   D109            TEMP:   DS      1
5879   D0D2            APNT    EQU     INSP
5880   D0F4            AERR    EQU     DCNT
5881   D10A            ALST:   DS      1
5882   D10B            OIND:   DS      2
5883   0005            LLAB    EQU     5
5884   D10D                    DS      16
5885   D11D            AREA:   DS      14
5886   D12B            LD12B:  DS      4
5887   D12F            SMODE:  DS      1
5888   D130            SYMSV:  DS      2
5889   D0F3            CCNT    EQU     SCNT
5890   D0F4            SYMX    EQU     AERR
5891   D132            SYMADD: DS      2
5892   D134            LD134:  DS      1               ;SIM. BREAKPOINT FLAG
5893   D135            LD135:  DS      1               ;SIM. REAL-TIME RUN FLAG
5894   D136            LD136:  DS      1               ;SIM. INPUT PORT ASSIG. FLAG
5895   D137            LD137:  DS      1               ;SIM. OUTPUT PORT ASSIG. FLAG
5896   D138            LD138:  DS      2               ;SIM. BREAKPOINT ADDR.
5897   D13A            LD13A:  DS      2               ;SIM. REAL TIME RUN ADDR
5898   D13C            LD13C:  DS      2               ;SIM. PROGRAM COUNTER
5899   D13E            LD13E:  DS      2               ;ADDR FOR NEXT INST TO EXECUTE
5900   D140            LD140:  DS      2               ;SIM. STACK POINTER
5901   D142            LD142:  DS      2               ;SIM. FLAG REGISTER & ACCUM.
5902   D144            LD144:  DS      1               ;SIM. "L" REGISTER
5903   D145            LD145:  DS      1               ;SIM. "H" REGISTER
5904   D146            LD146:  DS      1               ;SIM. "E" REGISTER
5905   D147            LD147:  DS      1               ;SIM. "D" REGISTER
5906   D148            LD148:  DS      1               ;SIM. "C" REGISTER
5907   D149            LD149:  DS      1               ;SIM. "B" REGISTER
5908   D14A            LD14A:  DS      1               ;SIM. ACCUM (2ND COPY)
5909   D14B            LD14B:  DS      1               ;SIM. MODE
5910   D14C            LD14C:  DS      3               ;STORAGE FOR INST TO BE SIM.
5911   D14F            LD14F:  DS      3               ;STORAGE FOR JMP RETN TO SIM.
5912   D152            LD152:  DS      16              ;SIMULATOR'S INPUT TABLE
5913   D162            LD162:  DS      16              ;SIMULATOR'S OUTPUT TABLE
5914   D18F                    ORG     DATA+18FH
5915   D18F            TERMW:  DS      1
5916   D190            CHRR:   DS      1
59171
5918 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5919+                                                      21:15  07/30/2018
5920+                                                                                      PAGE 103
5921
5922
5923
5924   D191            LD191:  DS      2               ;ESET UPPER TEXT BUFFER LIMIT
5925   D193            BOTL:   DS      1               ;BEGINNING OF TEXT LINE (0-F)
5926   D194            BOSL:   DS      1               ;BEGINNING OF SCREEN LINE (0-F)
5927   D195            SLINE:  DS      1               ;CURRENT LINE (0-F)
5928   D196            NCHAR:  DS      1               ;CURRENT COLUMN POSITION (0-63)
5929   D197            LD197:  DS      1               ;CURSOR ON-OFF FLAG
5930   D198            LD198:  DS      1               ;INSERT MODE FLAG
5931   D199            LD199:  DS      1
5932   D19A            LD19A:  DS      2
5933   D19C            LD19C:  DS      2
5934   D19E            LD19E:  DS      2
5935   D1A0            SPEED:  DS      1               ;DISPLAY DRIVER SPEED BYTE
5936   D1A1            LD1A1:  DS      2               ;UNDEFINED COMMAND ADDRESS
5937   D1A3            USARE:  DS      38              ;USER AREA
5938   D1C9            OBUF:   DS      22
5939   D1DF                    DS      5
5940   D1E4            IBUF:   DS      120             ;INPUT BUFFER
5941   FA0E            EDIT    EQU     0FA0EH
5942   D1C9            SAVL    EQU     OBUF
5943   D25C            CUCOM:  DS      70              ;CUSTOM COMMAND TABLE
5944   D300                    ORG     DATA+300H
5945   D300            SYSYM:  DS      2               ;START OF SYSTEM SYMBOL TABLE
5946   E000            SYMT    EQU     CODE
5947                   ;
5948                           END
5949 NO PROGRAM ERRORS
59501
5951 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
5952+                                                      21:15  07/30/2018
5953+                                                                                      PAGE 104
5954
5955
5956
5957                        SYMBOL TABLE
5958
5959  * 01
5960
5961  A      0007      ABUF   D0DF      ACH1   E37B      ACHK   E369
5962  ACO1   EBE0      ACO2   EC8F *    ADDS   D0D4      ADE1   E00D
5963  ADEC   E00A      ADOUT  E55C      ADR    E96B      AERR   D0F4
5964  AHE1   E2FD      AHEX   E2FA      AHS1   E311      ALAB   F274
5965  ALP1   F140      ALPS   F13E      ALS8   E000      ALST   D10A
5966  AOCT   E333      AOUT   EB2E      APNT   D0D2      AREA   D11D *
5967  ASBL   F15D      ASC1   F1AA *    ASC2   F1BA      ASC3   F1C8 *
5968  ASC4   F1D2      ASC5   F1F4      ASC7   F218      ASCN   F160
5969  ASCR   000D *    ASM2   EB22      ASM4   EABF      ASMTY  D100
5970  ASPC   D0F7      ASSM   EAAF      ASTO   EE1D      ASUB   F21E
5971  AUTO   F96A      AVAL   F204      B      0000      BBUF   D0EF
5972  BID1   E3BE      BIN1   E3A3      BIND   E3AD      BINH   E390
5973  BINO   E3C8      BITBK  E12C      BLKO   E361      BOFP   D005
5974  BOSL   D194      BOTL   D193      BSPA   E1B4      C      0001
5975  C01    E997      C02    E99D      CCNT   D0F3      CHAR   E1BC
5976  CHRR   D190      CLER   E1D1      CODE   E000      COM0   E992
5977  COM1   E994      COMCH  002A      COMS   E228      COND   EEDA
5978  COP1   F034      COPC   F022      CR     E188      CRLF   E216
5979  CTAB   E3E6      CUCOM  D25C      CUST   E4F5      D      0002
5980  DAT2   ECA5      DAT2A  ECA8      DATA   D000      DAV    0001
5981  DCNT   D0F4      DEL    E1A7      DEL2   EA5C      DEL3   EA7B
5982  DEL4   EA85      DELP   D0D2      DELT   EA2C      DONE   E2C6
5983  DOUT   E348      DUMO   E56F      DUMP   E524      E      0003
5984  E01    E964      EDIT   FA0E *    EMES   E7F1      EMES1  E7F7
5985  EMES2  E7FC      EMODE  E2F3      ENT1   E817      ENTR   E20D
5986  ENTS   E80B      EOF    E963 *    EOFP   D007      EOR    E0B7
5987  EORMS  E060      EORNS  E0D1      EQU1   EBFB      EQUL   E8E1
5988  EQUS   EC06      ERO1   F348      ERRA   F337      ERRD   F356
5989  ERRL   F351      ERRM   F32F      ERRO   F33C      ERRR   F311
5990  ERRS   F31A      ERRU   F325      ERRV   F32A      ESC    001B
5991  ETRA   E281      EXEC   E277      FAST   E64B      FBUF   D0D7
5992  FCHK   E6D3      FEET   E65A      FEF    D0DE      FELEN  000D
5993  FERR   E801      FI1    E94A      FI2    E95C      FIL35  E611
5994  FILE   E5B0      FILE0  D000      FILTB  D00D *    FIND   E941
5995  FIND1  E944 *    FIND2  FF3B      FINE   E62B      FMOV   E731
5996  FOCNT  D0DE      FOOD   E645      FOOT   E625      FORM   E6CC
5997  FOUL   E627      FOUT   E618      FREAD  D0DC      FSE10  E693
5998  FSE15  E6B6      FSE20  E6C0      FSEA   E68A      GT     E909
5999  GTLT   D108      H      0004      HCON   D0D4      HOTB   E586 *
6000  HOUT   E577      IBUF   D1E4      IN8    D0CC      INCA   E263
6001  INDR   D098      INIT2  E029      INITA  E024 *    INP8   E1E2
6002  INSP   D0D2      INSRT  E8D8      IODR   E0DE      IOFLE  D04E
6003  IONME  E1D9      IOSWC  D0FC      L      0005      LCHK   EBB3
6004  LD12B  D12B      LD134  D134      LD135  D135      LD136  D136
6005  LD137  D137      LD138  D138      LD13A  D13A      LD13C  D13C
6006  LD13E  D13E      LD140  D140      LD142  D142      LD144  D144
6007  LD145  D145 *    LD146  D146 *    LD147  D147 *    LD148  D148 *
60081
6009 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
6010+                                                      21:15  07/30/2018
6011+                                                                                      PAGE 105
6012                              SYMBOL TABLE
6013
6014
6015  LD149  D149 *    LD14A  D14A      LD14B  D14B      LD14C  D14C
6016  LD14F  D14F      LD152  D152      LD162  D162      LD191  D191
6017  LD197  D197      LD198  D198      LD199  D199      LD19A  D19A
6018  LD19C  D19C      LD19E  D19E      LD1A1  D1A1      LE004  E004
6019  LE03B  E03B      LE046  E046      LE072  E072      LE078  E078
6020  LE0A5  E0A5      LE0AC  E0AC      LE0CB  E0CB      LE0DD  E0DD
6021  LE0FE  E0FE      LE119  E119      LE12D  E12D      LE130  E130
6022  LE148  E148      LE14C  E14C      LE151  E151      LE157  E157
6023  LE15A  E15A      LE23E  E23E      LE240  E240      LE2D7  E2D7
6024  LE31E  E31E      LE336  E336      LE34B  E34B      LE35C  E35C
6025  LE48F  E48F      LE497  E497      LE4AB  E4AB      LE4AE  E4AE
6026  LE4B4  E4B4      LE4B7  E4B7      LE4BF  E4BF      LE4C2  E4C2
6027  LE4CE  E4CE      LE4EE  E4EE      LE509  E509      LE50C  E50C
6028  LE52C  E52C      LE541  E541      LE565  E565      LE57A  E57A
6029  LE5AB  E5AB      LE5CC  E5CC      LE5E1  E5E1      LE62A  E62A
6030  LE666  E666      LE68D  E68D      LE6E0  E6E0      LE6F3  E6F3
6031  LE704  E704      LE712  E712      LE718  E718      LE725  E725
6032  LE72B  E72B      LE760  E760      LE765  E765      LE785  E785
6033  LE78B  E78B      LE797  E797      LE7B5  E7B5      LE7C9  E7C9
6034  LE7CC  E7CC      LE7CE  E7CE      LE837  E837      LE83A  E83A
6035  LE84C  E84C      LE86A  E86A      LE87C  E87C      LE889  E889
6036  LE893  E893      LE896  E896      LE92B  E92B      LE947  E947
6037  LE9EF  E9EF      LE9F9  E9F9      LE9FF  E9FF      LEA23  EA23
6038  LEA2F  EA2F      LEA40  EA40      LEA50  EA50      LEA7A  EA7A
6039  LEAD6  EAD6      LEAEA  EAEA      LEAF6  EAF6      LEB12  EB12
6040  LEB15  EB15      LEB41  EB41      LEBA5  EBA5      LEC26  EC26
6041  LEC2E  EC2E      LECC3  ECC3      LECCD  ECCD      LECD3  ECD3
6042  LECE2  ECE2      LECE5  ECE5      LECF9  ECF9      LED01  ED01
6043  LED15  ED15      LED4F  ED4F      LED57  ED57      LEE39  EE39
6044  LEE4C  EE4C      LEE58  EE58      LEE5C  EE5C      LEE64  EE64
6045  LEE7E  EE7E      LEE82  EE82      LEE9D  EE9D      LEEA8  EEA8
6046  LEEAA  EEAA      LEEB1  EEB1      LF     E21B *    LF0DB  F0DB
6047  LF0E0  F0E0      LF154  F154      LF1A6  F1A6      LF227  F227
6048  LF238  F238      LF23A  F23A      LF242  F242      LF247  F247
6049  LF253  F253      LF255  F255      LF260  F260      LF26C  F26C
6050  LF291  F291      LF2B1  F2B1      LF2B6  F2B6      LF2C2  F2C2
6051  LF2DE  F2DE      LF2E3  F2E3      LF361  F361      LF37A  F37A
6052  LF37C  F37C      LF38E  F38E      LF392  F392      LF396  F396
6053  LF397  F397      LF3A4  F3A4      LF3C5  F3C5      LF3D3  F3D3
6054  LF3DF  F3DF      LF400  F400      LF41B  F41B      LF422  F422
6055  LF431  F431      LF439  F439      LF444  F444      LF451  F451
6056  LF459  F459      LF461  F461      LF470  F470      LF475  F475
6057  LF49F  F49F      LF4A5  F4A5      LF4B0  F4B0      LF4CA  F4CA
6058  LF4CD  F4CD      LF4D9  F4D9      LF4DA  F4DA      LF4DB  F4DB
6059  LF4E1  F4E1      LF4EF  F4EF      LF505  F505      LF50B  F50B
6060  LF511  F511      LF51A  F51A      LF521  F521      LF527  F527
6061  LF542  F542      LF551  F551      LF55A  F55A      LF565  F565
6062  LF572  F572      LF577  F577      LF579  F579      LF57F  F57F
6063  LF589  F589      LF58F  F58F      LF5AE  F5AE      LF5D2  F5D2
6064  LF5D9  F5D9      LF5F2  F5F2      LF604  F604      LF618  F618
6065  LF61E  F61E      LF626  F626      LF62C  F62C      LF634  F634
60661
6067 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
6068+                                                      21:15  07/30/2018
6069+                                                                                      PAGE 106
6070                              SYMBOL TABLE
6071
6072
6073  LF652  F652      LF66A  F66A      LF67F  F67F      LF697  F697
6074  LF69D  F69D      LF6AC  F6AC      LF6AF  F6AF      LF6B8  F6B8
6075  LF6CA  F6CA      LF6F9  F6F9      LF733  F733      LF73C  F73C
6076  LF742  F742      LF747  F747      LF753  F753      LF756  F756
6077  LF771  F771      LF774  F774      LF796  F796      LF7A4  F7A4
6078  LF7B7  F7B7      LF7D9  F7D9      LF7DE  F7DE      LF7F1  F7F1
6079  LF802  F802      LF818  F818      LF81F  F81F      LF854  F854
6080  LF863  F863      LF890  F890      LF897  F897      LF8A1  F8A1
6081  LF8A8  F8A8      LF8AF  F8AF      LF8B8  F8B8      LF8BC  F8BC
6082  LF8C7  F8C7      LF8D6  F8D6      LF8E2  F8E2      LF912  F912
6083  LF92C  F92C      LF932  F932      LF949  F949      LF954  F954
6084  LF983  F983      LF989  F989      LF99A  F99A      LF9AE  F9AE
6085  LF9BB  F9BB      LF9C8  F9C8      LF9D8  F9D8      LFA00  FA00
6086  LFA27  FA27      LFA2D  FA2D      LFA33  FA33      LFA39  FA39
6087  LFA50  FA50      LFA5D  FA5D      LFA60  FA60      LFA65  FA65
6088  LFA9C  FA9C      LFAA5  FAA5      LFAAE  FAAE      LFAB9  FAB9
6089  LFAC6  FAC6      LFACC  FACC      LFAD6  FAD6      LFAD9  FAD9
6090  LFAE4  FAE4      LFAF3  FAF3      LFAF6  FAF6      LFB12  FB12
6091  LFB14  FB14      LFB21  FB21      LFB23  FB23      LFB30  FB30
6092  LFB3B  FB3B      LFB46  FB46      LFB57  FB57      LFB5C  FB5C
6093  LFB62  FB62      LFB6E  FB6E      LFB72  FB72      LFB7B  FB7B
6094  LFB7E  FB7E      LFB8E  FB8E      LFB94  FB94      LFB9D  FB9D
6095  LFBAC  FBAC      LFBC8  FBC8      LFBD2  FBD2      LFBEA  FBEA
6096  LFC04  FC04      LFC10  FC10      LFC18  FC18      LFC1F  FC1F
6097  LFC2E  FC2E      LFC3C  FC3C      LFC44  FC44      LFC4D  FC4D
6098  LFC51  FC51      LFC5F  FC5F      LFC62  FC62      LFC72  FC72
6099  LFC7A  FC7A      LFC8F  FC8F      LFC90  FC90      LFC95  FC95
6100  LFCA4  FCA4      LFCB8  FCB8      LFCD1  FCD1      LFCF0  FCF0
6101  LFCFC  FCFC      LFCFE  FCFE      LFD1A  FD1A      LFD26  FD26
6102  LFD32  FD32      LFD3B  FD3B      LFD42  FD42      LFD4E  FD4E
6103  LFD51  FD51      LFD69  FD69      LFD79  FD79      LFD83  FD83
6104  LFDB1  FDB1      LFDBD  FDBD      LFDCD  FDCD      LFDD9  FDD9
6105  LFDDD  FDDD      LFDED  FDED      LFE07  FE07      LFE0C  FE0C
6106  LFE13  FE13      LFE1D  FE1D      LFE24  FE24      LFE2A  FE2A
6107  LFE33  FE33      LFE3A  FE3A      LFE46  FE46      LFE4E  FE4E
6108  LFE4F  FE4F      LFE54  FE54      LFE64  FE64      LFE6E  FE6E
6109  LFE77  FE77 *    LFE88  FE88      LFE9D  FE9D      LFEA8  FEA8
6110  LFEB9  FEB9      LFEC1  FEC1      LFEC2  FEC2      LFEC6  FEC6
6111  LFECE  FECE      LFEE6  FEE6      LFEED  FEED      LFF00  FF00
6112  LFF06  FF06      LFF13  FF13      LFF16  FF16      LFF1A  FF1A
6113  LFF2A  FF2A      LFF2D  FF2D      LFF44  FF44      LFF58  FF58
6114  LFF64  FF64      LFF80  FF80      LFF8A  FF8A      LFF9B  FF9B
6115  LFFA1  FFA1      LFFB1  FFB1      LFFB6  FFB6      LFFC1  FFC1
6116  LFFC2  FFC2      LFFC7  FFC7      LFFCE  FFCE      LFFDF  FFDF
6117  LFFE7  FFE7      LFFF3  FFF3 *    LFMT   D0FA      LINE   E857
6118  LIST   E9DB      LLAB   0005      LMOV   E970      LODM   E982
6119  LT     E8F6      M      0006      MAXFI  0006      MAXL   D009
6120  MESS   E7E0      MLAB   EBAA      MODE   E58C      MOV23  E680
6121  MOVEL  E9B8      MPNT   EDF2      NCHAR  D196      NEXT   E17A
6122  NFOR   E6CD      NMLEN  0005      NOCHR  D0B8      NOLA   D103 *
6123  NOLIN  D0FB      NOR1   E9AB      NORM   E9A5      NOVR   EA8E
61241
6125 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
6126+                                                      21:15  07/30/2018
6127+                                                                                      PAGE 107
6128                              SYMBOL TABLE
6129
6130
6131  NUM1   F302      NUM2   F307      NUM3   F30C      NUMS   F2EB
6132  NXT1   F16F      NXT2   F179      OBUF   D1C9      OCN1   F0C7
6133  OCN2   F0CA      OCNT   F0B3      OERR   F0D8      OIND   D10B
6134  OOTB   E359 *    OOUT   E353      OP1    F053      OP2    F056
6135  OP4    F0AE      OP5    F0B1 *    OPAD   F0AD      OPC    EB8E
6136  OPC2   F05B *    OPC3   F077 *    OPCD   F037      OPRD   D105
6137  OPRI   D107      ORG1   EBE6      ORG2   ECAE      OTAB   EEE5
6138  OUT8   D0CF      OUTDR  D0A9      OUTP8  E1F3      PABL   EC56 *
6139  PAS1   EB57      PAS2   EC3D      PASI   D0F9      PNTR   D101
6140  PSEU   F0E6      PSU1   EBC2      PSU2   EC71      PSW    0006
6141  RDYMG  E0D7      READ   E172      RES2   EC95      RES21  ECA1
6142  RESI   EC16      RMOV   E979      RNUM   E769      ROOM   E676
6143  ROOM1  E5E7      RTAB   F12D      SAVL   D1C9      SBL1   EECF
6144  SBL2   EED3      SBLK   EECC      SCNT   D0F3      SCRN   E380
6145  SEAR   E257      SEN1   F2E5      SEND   F2C8      SIGN   D104
6146  SIMU   F75C      SLA1   F123      SLAB   F0F8      SLINE  D195
6147  SMODE  D12F      SP     0006      SPEED  D1A0      SSTR   F1EB
6148  STAB   EAA3      STAT   D0A4      STOM   E98A      SWAP   E5EF
6149  SWAPS  E5EA      SWCH   00FF *    SWCH1  D0FD      SWCH2  D0FE
6150  SYMAD  D132      SYML   E47E      SYMSV  D130      SYMT   E000 *
6151  SYMX   D0F4      SYSIN  D094      SYSIO  D08F      SYSOT  D096
6152  SYSYM  D300      TABA   D0F5      TBE    0080      TEMP   D109
6153  TERM   F3E4      TERMW  D18F      TEST   E5D2      TEXT   E9DC
6154  TXT2   FA0B      TY31   ED88      TY32   ED8B      TY41   EDB4
6155  TY56   EDE0      TY6    EE11      TYP2   ED64      TYP3   ED77
6156  TYP4   ED96      TYP5   EDCB      TYP6   EE01      TYS5   EDD3
6157  TYS6   EE14      UDAI   0001 *    UDAO   0001 *    UDATA  0001
6158  USARE  D1A3 *    USTA   0000      VAL1   E290      VAL2   E2AB
6159  VAL3   E2BB      VAL4   E2BD      VAL5   E2CB      VALC   E515
6160  VCHK   E51C      VDAD   FDF4      VDM1   CC00      WHAT   E7DD
6161  XOUT   D0FF      ZBU1   E270      ZBUF   E26A      ZERO   E919
6162
6163