11
2 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
3+                                                      19:26  09/08/2018
4+                                                                                      PAGE 1
5      IMSAI SCS-1 REV. 2 06 OCT. 1976
6
7
8                           TITLE           'IMSAI SCS-1 REV. 2 06 OCT. 1976'
9                   ;
10                   ;       PAGE    62
11                   ;
12                   ; MODIFIED TO ASSEMBLE WITH INTEL 8080 CROSS ASSEMBLER
13                   ; OCTOBER 2008, UDO MUNK
14                   ;
15   0003            TTS     EQU     03H
16   0002            TTI     EQU     02H
17   0002            TTO     EQU     02H
18   0002            TTYDA   EQU     02H
19   0001            TTYTR   EQU     01H
20                   ;
21   0000                    ORG     0H
22   0000   C34000           JMP     INITA           ;DEAD START
23   0003   C36700           JMP     EOR             ;RESTART MONITOR
24                   ;
25   0008                    ORG     08H
26   0008   C32E0D           JMP     BRKP            ;BREAKPOINT RESTART
27                   ;
28   0040                    ORG     40H;
29                   ;
30                   ; THIS ROUTINE SETS UP THE SIO BOARD
31                   ;
32   0040   3EAA     INITA:  MVI     A,0AAH          ;GET DUMMY MODE WORD
33   0042   D303             OUT     TTS             ;OUTPUT IT
34   0044   3E40             MVI     A,40H           ;GET RESET BIT
35   0046   D303             OUT     TTS             ;RESET SIO BOARD
36   0048   3ECE             MVI     A,0CEH          ;GET REAL MODE WORD
37   004A   D303             OUT     TTS             ;SET THE MODE FOR REAL
38   004C   3E37             MVI     A,37H           ;GET THE COMMAND
39   004E   D303             OUT     TTS             ;OUTPUT IT
40                   ;
41                   ; THIS ROUTINE INITIALIZES THE FILE AREAD FOR SUBSEQUENT
42                   ; PROCESSING
43                   ;
44   0050   212410           LXI     H,FILE0
45   0053   0E4E             MVI     C,MAXFIL*FELEN
46   0055   AF               XRA     A
47   0056   77       INIT2:  MOV     M,A
48   0057   23               INX     H
49   0058   0D               DCR     C
50   0059   C25600           JNZ     INIT2
51                   ;
52                   ; CLEAR THE BREAKPOINT TABLE
53                   ;
54   005C   0618             MVI     B,NBR*3
55   005E   210C10           LXI     H,BRT
56   0061   77       INIT3:  MOV     M,A
57   0062   23               INX     H
58   0063   05               DCR     B
591
60 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
61+                                                      19:26  09/08/2018
62+                                                                                      PAGE 2
63      IMSAI SCS-1 REV. 2 06 OCT. 1976
64
65
66   0064   C26100           JNZ     INIT3
67                   ;
68                   ; THIS IS THE STARTING POINT OF THE SELF CONTAINED
69                   ; SYSTEM ONCE THE SYSTEM HAS BEEN INITIALIZED.  COMMANDS
70                   ; ARE READ FROM THE USER, EXECUTED, AND CONTROL RETURNS
71                   ; BACK TO THIS POINT TO READ ANOTHER COMMAND.
72                   ;
73   0067   31B210   EOR:    LXI     SP,AREA+18
74   006A   CD0E01           CALL    CRLF            ;PRINT C/R, LINE FEED
75   006D   CD8000           CALL    READ            ;READ INPUT LINE
76   0070   23               INX     H
77   0071   7E               MOV     A,M             ;FETCH FIRST CHARACTER
78   0072   FE3A             CPI     '9'+1           ;COMMAND OR LINE NUMBER?
79   0074   DAB504           JC      LINE            ;JUMP IF LINE FOR FILE
80   0077   CD7301           CALL    VALC
81   007A   CD2B01           CALL    COMM
82   007D   C36700           JMP     EOR
83                   ;
84                   ; THIS ROUTINE READS IN A LINE FROM THE TTY AND PLACES
85                   ; IT IN AN INPUT BUFFER.
86                   ; THE FOLLOWING ARE SPECIAL CHARACTERS
87                   ;   CR          TERMINATES READ ROUTINE
88                   ;   LF          NOT RECOGNIZED BY ROUTINE
89                   ;   CTRL X      DELETES CURRENT LINE
90                   ;   DEL         DELETES CHARACER
91                   ; ALL DISPLAYABLE CHARACTERS BETWEEN BLANK & Z AND THE
92                   ; ABOVE ARE RECOGNIZED BY THE READ ROUTINE, ALL OTHERS
93                   ; ARE SKIPPED OVER.  THE ROUTINE WILL NOT ACCEPT MORE
94                   ; CHARACTERS THAN THE INPUT BUFFER WILL HOLD.
95                   ;
96   0080   21C710   READ:   LXI     H,IBUF          ;GET INPUT BUFFER ADDRESS
97   0083   227410           SHLD    ADDS            ;SAVE ADDRESS
98   0086   1E02             MVI     E,2             ;INITIALIZE CHARACTER COUNT
99   0088   CDF600   NEXT:   CALL    IN8             ;READ A LINE
100   008B   78               MOV     A,B
101   008C   FE18             CPI     24              ;CHECK FOR CTRL X
102   008E   C29700           JNZ     CR
103   0091   CD0E01           CALL    CRLF            ;OUTPUT A CRLF
104   0094   C38000           JMP     READ
105   0097   FE0D     CR:     CPI     ASCR            ;GET AN ASCII CR
106   0099   C2B200           JNZ     DEL
107   009C   7D               MOV     A,L
108   009D   FEC7             CPI     IBUF AND 00FFH  ;CHECK FOR FIRST CHAR
109   009F   CA8000           JZ      READ
110   00A2   360D             MVI     M,ASCR          ;PLACE CR AT END OF LINE
111   00A4   23               INX     H
112   00A5   3601             MVI     M,1             ;PLACE EOF INDICATOR IN LINE
113   00A7   23               INX     H
114   00A8   3E1A             MVI     A,IBUF+83 AND 00FFH
115   00AA   CDE100           CALL    CLER            ;CLEAR REMAINING BUFFER
116   00AD   21C610           LXI     H,IBUF-1
1171
118 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
119+                                                      19:26  09/08/2018
120+                                                                                      PAGE 3
121      IMSAI SCS-1 REV. 2 06 OCT. 1976
122
123
124   00B0   73               MOV     M,E             ;SAVE CHARACTER COUNT
125   00B1   C9               RET
126   00B2   FE7F     DEL:    CPI     127             ;CHECK FOR DELETE CHARACTER
127   00B4   C2C700           JNZ     CHAR
128   00B7   3EC7             MVI     A,IBUF AND 00FFH
129   00B9   BD               CMP     L               ;IS IT 1ST CHARACTER
130   00BA   CA8800           JZ      NEXT
131   00BD   2B               DCX     H               ;DECREMENT POINTER
132   00BE   1D               DCR     E               ;DECREMENT COUNT
133   00BF   065F     BSPA:   MVI     B,5FH
134   00C1   CD0301           CALL    OUT8
135   00C4   C38800           JMP     NEXT
136   00C7   FE20     CHAR:   CPI     ' '             ;CHECK FOR LEGAL CHARACTER
137   00C9   DA8800           JC      NEXT
138   00CC   FE5B             CPI     'Z'+1
139   00CE   D28800           JNC     NEXT
140   00D1   47               MOV     B,A
141   00D2   CD0301           CALL    OUT8            ;ECHO CHARACTER
142   00D5   70               MOV     M,B
143   00D6   3E18             MVI     A,IBUF+81 AND 00FFH
144   00D8   BD               CMP     L               ;CHECK FOR END OF LINE
145   00D9   CABF00           JZ      BSPA
146   00DC   23               INX     H
147   00DD   1C               INR     E               ;INCREMENT CHARACTER COUNT
148   00DE   C38800           JMP     NEXT
149                   ;
150                   ; THIS ROUTINE IS USED TO BLANK OUT A PORTION OF MEMORY
151                   ;
152   00E1   BD       CLER:   CMP     L
153   00E2   C8               RZ
154   00E3   3620             MVI     M,' '           ;PLACE BLANK IN MEMORY
155   00E5   23               INX     H
156   00E6   C3E100           JMP     CLER
157                   ;
158                   ; SEE IF TTY INPUT READY AND CHECK FOR CTRL X.
159                   ;
160   00E9   DB03     INK:    IN      TTS             ;GET TTY STATUS
161   00EB   2F               CMA                     ;INVERT STATUS
162   00EC   E602             ANI     TTYDA           ;IS DATA AVAILABLE?
163   00EE   C0               RNZ                     ;RETURN IF NOT
164   00EF   DB02             IN      TTI             ;GET THE CHAR
165   00F1   E67F             ANI     07FH            ;STRIP OFF PARITY
166   00F3   FE18             CPI     'X'-40H         ;IS IT A CTRL X?
167   00F5   C9               RET
168                   ;
169                   ; THIS ROUTINE READS A BYTE OF DATA FROM THE USART
170                   ;
171   00F6   DB03     IN8:    IN      TTS             ;READ USART STATUS
172   00F8   E602             ANI     TTYDA
173   00FA   CAF600           JZ      IN8
174   00FD   DB02             IN      TTI             ;READ DATA
1751
176 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
177+                                                      19:26  09/08/2018
178+                                                                                      PAGE 4
179      IMSAI SCS-1 REV. 2 06 OCT. 1976
180
181
182   00FF   E67F             ANI     127             ;STRIP OFF PARITY
183   0101   47               MOV     B,A
184   0102   C9               RET
185
186                   ;
187                   ; THIS ROUTINE OUTPUTS A BYTE OF DATA TO THE USART
188                   ;
189   0103   DB03     OUT8:   IN      TTS             ;READ STATUS
190   0105   E601             ANI     TTYTR
191   0107   CA0301           JZ      OUT8
192   010A   78       OK:     MOV     A,B
193   010B   D302             OUT     TTO             ;TRANSMIT DATA
194   010D   C9               RET
195                   ;
196                   ; THIS ROUTINE WILL OUTPUT A CARRIAGE RETURN AND
197                   ; LINE FEED FOLLOWED BY TWO DELETE CHARACTERS WHICH
198                   ; PROVIDE TIME FOR PRINT HEAD TO RETURN.
199                   ;
200   010E   060D     CRLF:   MVI     B,13            ;CR
201   0110   CD0301           CALL    OUT8
202   0113   060A     LF:     MVI     B,10            ;LF
203   0115   CD0301           CALL    OUT8
204   0118   067F             MVI     B,127
205   011A   CD0301           CALL    OUT8
206   011D   CD0301           CALL    OUT8
207   0120   C9               RET
208                   ;
209                   ; THIS ROUTINE JUMPS TO A LOCATION IN MEMORY GIVEN BY
210                   ; THE INPUT COMMAND AND BEGINS EXECUTION OF PROGRAM
211                   ; THERE.
212                   ;
213   0121   CD0003   EXEC:   CALL    VCHK            ;CHECK FOR PARAMETERS
214   0124   CD0E01           CALL    CRLF
215   0127   2A8A10           LHLD    BBUF            ;FETCH ADDRESS
216   012A   E9               PCHL                    ;JUMP TO PROGRAM
217                   ;
218                   ; THIS ROUTINE CHECKS THE INPUT COMMAND AGAINS ALL
219                   ; LEGAL COMMANDS STORED IN A TABLE.  IF A LEGAL COMMAND
220                   ; IS FOUND, A JUMP IS MADE TO THAT ROUTINE.  OTHERWISE
221                   ; AN ERROR MESSAGE IS OUTPUT TO THE USER.
222                   ;
223   012B   11BE02   COMM:   LXI     D,CTAB          ;COMMAND TABLE ADDRESS
224   012E   060B             MVI     B,NCOM          ;NUMBER OF COMMANDS
225   0130   3E04             MVI     A,4             ;LENGTH OF COMMAND
226   0132   329510           STA     NCHR            ;SAVE
227   0135   CD3C01           CALL    COMS            ;SEARCH TABLE
228   0138   C25A04           JNZ     WHAT            ;JUMP IF ILLEGAL COMMAND
229   013B   E9               PCHL                    ;BE HERE NOW
230                   ;
231                   ; THIS ROUTINE CHECKS TO SEE IF A BASE CHARACTER STRING
232                   ; IS EQUAL TO ANY OF THE STRINGS CONTAINED IN A TABLE
2331
234 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
235+                                                      19:26  09/08/2018
236+                                                                                      PAGE 5
237      IMSAI SCS-1 REV. 2 06 OCT. 1976
238
239
240                   ; POINTED TO BY D,E.   HE TABLE CONSISTS OF ANY NUMBER
241                   ; OF CHARS, WITH 2 BYTES CONTAINING VALUES ASSOCIATED
242                   ; WITH IT.  REG B CONTAINS THE # OF STRINGS TO COMPARE.
243                   ; THIS ROUTINE CAN BE USED TO SEARCH THROUGH A COMMAND
244                   ; OR SYMBOL TABLE.  ON RETURN, IF THE ZERO FLAG IS SET,
245                   ; A MATCH WAS FOUND; IF NOT, NO MATCH WAS FOUND.  IF
246                   ; A MATCH WAS FOUND, D,E POINT TO THE LAST BYTE
247                   ; ASSOCIATED WITH THE CHARACTER STRING.   F NOT, D,E
248                   ; POINT TO THE NEXT LOCATION AFTER THE END FO THE TABLE.
249                   ;
250   013C   2A7410   COMS:   LHLD    ADDS            ;FETCH COMPARE ADDRESS
251   013F   3A9510           LDA     NCHR            ;GET LENGTH OF STRING
252   0142   4F               MOV     C,A
253   0143   CD5301           CALL    SEAR            ;COMPARE STRINGS
254   0146   1A               LDAX    D               ;FETCH VALUE
255   0147   6F               MOV     L,A
256   0148   13               INX     D
257   0149   1A               LDAX    D               ;FETCH VALUE
258   014A   67               MOV     H,A
259   014B   C8               RZ
260   014C   13               INX     D               ;SET TO NEXT STRING
261   014D   05               DCR     B               ;DECREMENT COUNT
262   014E   C23C01           JNZ     COMS
263   0151   04               INR     B               ;CLEAR ZERO FLAG
264   0152   C9               RET
265                   ;
266                   ; THIS ROUTINE CHECKS TO SEE IF TWO CHARACTER STRINGS IN
267                   ; MEMORY ARE EQUAL.   HE STRINGS ARE POINTED TO BY D,E
268                   ; AND H,L.  ON RETURN, THE ZERO FLAG SET INDICATES A
269                   ; MATCH.  REG C INDICATES THE LENGTH OF THE STRINGS.  ON
270                   ; RETURN, THE POINTERS POINT TO THE NEXT ADDRESS AFTER
271                   ; THE CHARACTER STRINGS.
272                   ;
273   0153   1A       SEAR:   LDAX    D               ;FETCH CHARACTER
274   0154   BE               CMP     M               ;COMPARE CHARACTERS
275   0155   C25F01           JNZ     INCA
276   0158   23               INX     H
277   0159   13               INX     D
278   015A   0D               DCR     C               ;DECREMENT CHARACTER COUNT
279   015B   C25301           JNZ     SEAR
280   015E   C9               RET
281   015F   13       INCA:   INX     D
282   0160   0D               DCR     C
283   0161   C25F01           JNZ     INCA
284   0164   0C               INR     C               ;CLEAR ZERO FLAG
285   0165   C9               RET
286                   ;
287                   ; THIS ROUTINE ZEROES OUT A BUFFER IN MEMORY WHICH IS
288                   ; THEN USED BY OTHER SCANNING ROUTINES
289                   ;
290   0166   AF       ZBUF:   XRA     A               ;GET A ZERO
2911
292 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
293+                                                      19:26  09/08/2018
294+                                                                                      PAGE 6
295      IMSAI SCS-1 REV. 2 06 OCT. 1976
296
297
298   0167   118A10           LXI     D,ABUF+12       ;BUFFER ADDRESS
299   016A   060C             MVI     B,12            ;BUFFER LENGTH
300   016C   1B       ZBU1:   DCX     D               ;DECREMENT ADDRESS
301   016D   12               STAX    D               ;ZERO BUFFER
302   016E   05               DCR     B
303   016F   C26C01           JNZ     ZBU1
304   0172   C9               RET
305                   ;
306                   ; THIS ROUTINE CALLS ETRA TO OBTAIN THE INPUT PARAMETER
307                   ; VALUES AND CALLS AN ERROR ROUTINE IF AN ERROR OCCURED
308                   ; IN THAT ROUTINE
309                   ;
310   0173   CD7A01   VALC:   CALL    ETRA            ;GET INPUT PARAMETERS
311   0176   DA5A04           JC      WHAT            ;JUMP IF ERROR
312   0179   C9               RET
313                   ;
314                   ; THIS ROUTINE EXTRACTS THE VALUES ASSOCIATED WITH A
315                   ; COMMAND FROM THE INPUT STREAM AND PLACES THEM IN THE
316                   ; ASCII BUFFER (ABUF).  IT ALSO CALLS A ROUTINE TO
317                   ; CONVERT THE ASCII HEXADECIMALS TO BINARY AND STORES
318                   ; THEM IN THE BINARY BUFFER (BBUF).  ON RETURN, CARRY
319                   ; SET INDICATES AN ERROR IN INPUT PARAMETERS.
320                   ;
321   017A   210000   ETRA:   LXI     H,0             ;GET A ZERO
322   017D   228C10           SHLD    BBUF+2          ;ZERO VALUE
323   0180   227610           SHLD    FBUF            ;SET NO FILE NAME
324   0183   CD6601           CALL    ZBUF            ;ZERO BUFFER
325   0186   21C610           LXI     H,IBUF-1
326   0189   23       VAL1:   INX     H
327   018A   7E               MOV     A,M             ;FETCH INPUT CHARACTER
328   018B   FE20             CPI     ' '             ;LOOK FOR FIRST CHARACTER
329   018D   3F               CMC
330   018E   D0               RNC                     ;RETURN IF NO CARRY
331   018F   C28901           JNZ     VAL1            ;JUMP IF NO BLACK
332   0192   229610           SHLD    PNTR            ;SAVE POINTER
333   0195   CD0D09           CALL    SBLK            ;SCAN TO FIRST PARAMETER
334   0198   3F               CMC
335   0199   D0               RNC                     ;RETURN IF CR
336   019A   FE2F             CPI     '/'
337   019C   C2C401           JNZ     VAL5            ;NO FILE NAME
338   019F   117610           LXI     D,FBUF          ;NAME FOLLOWS PUT IN FBUF
339   01A2   0E05             MVI     C,NMLEN
340   01A4   23       VAL2:   INX     H
341   01A5   7E               MOV     A,M
342   01A6   FE2F             CPI     '/'
343   01A8   CAB401           JZ      VAL3
344   01AB   0D               DCR     C
345   01AC   FA5A04           JM      WHAT
346   01AF   12               STAX    D               ;STORE FILE NAME
347   01B0   13               INX     D
348   01B1   C3A401           JMP     VAL2
3491
350 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
351+                                                      19:26  09/08/2018
352+                                                                                      PAGE 7
353      IMSAI SCS-1 REV. 2 06 OCT. 1976
354
355
356   01B4   3E20     VAL3:   MVI     A,' '           ;GET AN ASCII SPACE
357   01B6   0D       VAL4:   DCR     C
358   01B7   FABF01           JM      DONE
359   01BA   12               STAX    D               ;FILL IN WITH SPACES
360   01BB   13               INX     D
361   01BC   C3B601           JMP     VAL4
362   01BF   CD1409   DONE:   CALL    SBL2
363   01C2   3F               CMC
364   01C3   D0               RNC
365   01C4   117E10   VAL5:   LXI     D,ABUF
366   01C7   CD750B           CALL    ALPS            ;PLACE PARAMETER IN BUFFER
367   01CA   78               MOV     A,B             ;GET DIGIT COUNT
368   01CB   FE05             CPI     5               ;CHECK NUMBER OF DIGITS
369   01CD   3F               CMC
370   01CE   D8               RC                      ;RETURN IF TOO MANY DIGITS
371   01CF   017E10           LXI     B,ABUF
372   01D2   CD1B02           CALL    AHEX            ;CONVERT VALUE
373   01D5   D8               RC                      ;ILLEGAL CHARACTER
374   01D6   228A10           SHLD    BBUF            ;SAVE IN BINARY BUFFER
375   01D9   217E10           LXI     H,ABUF
376   01DC   CDBD05           CALL    NORM            ;NORMALIZE ASCII VALUE
377   01DF   CD0D09           CALL    SBLK            ;SCAN TO NEXT PARAMETER
378   01E2   3F               CMC
379   01E3   D0               RNC                     ;RETURN IF
380   01E4   118210           LXI     D,ABUF+4
381   01E7   CD750B           CALL    ALPS            ;PLACE PARAMETERS IN BUFFER
382   01EA   78               MOV     A,B             ;GET DIGIT COUNT
383   01EB   FE05             CPI     5               ;CHECK NUMBER OF DIGITS
384   01ED   3F               CMC
385   01EE   D8               RC                      ;RETURN IF TOO MANY DIGITS
386   01EF   018210           LXI     B,ABUF+4
387   01F2   CD1B02           CALL    AHEX            ;CONVERT VALUE
388   01F5   D8               RC                      ;ILLEGAL VALUE
389   01F6   228C10           SHLD    BBUF+2          ;SAVE IN BINARY BUFFER
390   01F9   218210           LXI     H,ABUF+4
391   01FC   CDBD05           CALL    NORM            ;NORMALIZE ASCII VALUE
392   01FF   B7               ORA     A               ;CLEAR CARRY
393   0200   C9               RET
394                   ;
395                   ; THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED
396                   ; BY B,C AND CONVERTS THE ASCII DECIMAL DIGITS INTO
397                   ; BINARY.  UP TO A 16-BIT VALUE CAN BE CONVERTED.  THE
398                   ; SCAN STOPS WHEN A BINARY ZERO IS FOUND IN THE BUFFER.
399                   ;
400   0201   210000   ADEC:   LXI     H,0             ;GET A 16 BIT ZERO
401   0204   0A       ADE1:   LDAX    B               ;FETCH ASCII DIGIT
402   0205   B7               ORA     A               ;SET ZERO FLAG
403   0206   C8               RZ                      ;RETURN IFF FINISHED
404   0207   54               MOV     D,H             ;SAVE CURRENT VALUE
405   0208   5D               MOV     E,L             ;SAVE CURRENT VALUE
406   0209   29               DAD     H               ;TIMES TWO
4071
408 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
409+                                                      19:26  09/08/2018
410+                                                                                      PAGE 8
411      IMSAI SCS-1 REV. 2 06 OCT. 1976
412
413
414   020A   29               DAD     H               ;TIMES TWO
415   020B   19               DAD     D               ;ADD IN ORIGINAL VALUE
416   020C   29               DAD     H               ;TIMES TWO
417   020D   D630             SUI     48              ;ASCII BIAS
418   020F   FE0A             CPI     10              ;CHECK FOR LEGAL VALUE
419   0211   3F               CMC
420   0212   D8               RC                      ;RETURN IF ERROR
421   0213   5F               MOV     E,A
422   0214   1600             MVI     D,0
423   0216   19               DAD     D               ;ADD IN NEXT DIGIT
424   0217   03               INX     B               ;INCREMENT POINTER
425   0218   C30402           JMP     ADE1
426                   ;
427                   ; THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED
428                   ; BY B,C AND CONVERTS THE ASCII HEXADECIMAL DIGITS INTO
429                   ; BINARY.  UP TO A 16-BIT VALUE CAN BE CONVERTED.  THE
430                   ; SCAN STOPS WHEN A BINARY ZERO IS FOUNDIN THE BUFFER.
431                   ;
432   021B   210000   AHEX:   LXI     H,0             ;GET A 16 BIT ZERO
433   021E   0A       AHE1:   LDAX    B               ;FETCH ASCII DIGIT
434   021F   B7               ORA     A               ;SET ZERO FLAG
435   0220   C8               RZ                      ;RETURN IF DONE
436   0221   29               DAD     H               ;LEFT SHIFT
437   0222   29               DAD     H               ;LEFT SHIFT
438   0223   29               DAD     H               ;LEFT SHIFT
439   0224   29               DAD     H               ;LEFT SHIFT
440   0225   CD3202           CALL    AHS1            ;CONVERT TO BINARY
441   0228   FE10             CPI     10H             ;CHECK FOR LEGAL VALUE
442   022A   3F               CMC
443   022B   D8               RC                      ;RETURN IF ERROR
444   022C   85               ADD     L
445   022D   6F               MOV     L,A
446   022E   03               INX     B               ;INCREMENT POINTER
447   022F   C31E02           JMP     AHE1
448                   ;
449                   ; THIS ROUTINE CONVERTS ASCII HEX DIGITS INTO BINARY
450                   ;
451   0232   D630     AHS1:   SUI     48              ;ASCII BIAS
452   0234   FE0A             CPI     10              ;DIGIT 0-10
453   0236   D8               RC
454   0237   D607             SUI     7               ;ALPHA BIAS
455   0239   C9               RET
456                   ;
457                   ; THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII
458                   ; HEXADECIMAL AND OUTPUTS THE CHARACTERS TO THE TTY.
459                   ;
460   023A   CD8602   HOUT:   CALL    BINH
461   023D   217410           LXI     H,HCON
462   0240   46       CHOT:   MOV     B,M
463   0241   CD0301           CALL    OUT8
464   0244   23               INX     H
4651
466 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
467+                                                      19:26  09/08/2018
468+                                                                                      PAGE 9
469      IMSAI SCS-1 REV. 2 06 OCT. 1976
470
471
472   0245   46               MOV     B,M
473   0246   CD0301           CALL    OUT8
474   0249   C9               RET
475                   ;
476                   ; THIS ROUTINE DOES THE SAME AS ABOVE BUT OUTPUTS A
477                   ; BLANK AFTER THE LAST CHARACTER
478                   ;
479   024A   CD3A02   HOTB:   CALL    HOUT            ;CONVERT AND OUTPUT
480   024D   CD5D02           CALL    BLK1            ;OUTPUT A BLANK
481   0250   C9               RET
482                   ;
483                   ; THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII
484                   ; DECIMAL DIGITS AND OPTPUTS THE CHARACTERS TO THE TTY
485                   ;
486
487   0251   CDA302   DOUT:   CALL    BIND            ;CONVERT VALUE
488   0254   CD3D02           CALL    HOUT+3          ;OUTPUT VALUE (2 DIGITS)
489   0257   23               INX     H
490   0258   46               MOV     B,M             ;GET LAST DIGIT
491   0259   CD0301           CALL    OUT8            ;OUTPUT
492   025C   C9               RET
493                   ;
494                   ; THIS ROUTINE OUTPUTS A BLANK
495                   ;
496   025D   0620     BLK1:   MVI     B,' '           ;GET A BLANK
497   025F   CD0301           CALL    OUT8
498   0262   C9               RET
499                   ;
500                   ; THIS ROUTINE IS USED BY OTHER ROUTINES TO INCREMENT
501                   ; THE STARTING ADDRESS IN A COMMAND AND COMPARE IT WITH
502                   ; THE FINAL ADDRESS IN THE COMMAND.  ON RETURN, THE
503                   ; CARRY FLAG SET INDICATES THAT THE FINAL ADDRESS HAS
504                   ; BEEN REACHED.
505                   ;
506   0263   2A8A10   ACHK:   LHLD    BBUF            ;FETCH START ADDRESS
507   0266   3A8D10           LDA     BBUF+3          ;STOP ADDRESS (HIGH)
508   0269   BC               CMP     H               ;COMPARE ADDRESSES
509   026A   C27502           JNZ     ACH1
510   026D   3A8C10           LDA     BBUF+2          ;STOP ADDRESS (LOW)
511   0270   BD               CMP     L               ;COMPARE ADDRESSES
512   0271   C27502           JNZ     ACH1
513   0274   37               STC                     ;SET CARRY IF EQUAL
514   0275   23       ACH1:   INX     H               ;INCREMENT START ADDRESSES
515   0276   228A10           SHLD    BBUF            ;STORE START ADDRESS
516   0279   C9               RET
517                   ;
518                   ; THIS ROUTINE OUTPUTS CHARACTER OF A STRING
519                   ; UNTIL A CARRIAGE RETURN IS FOUND
520                   ;
521   027A   46       SCRN:   MOV     B,M             ;FETCH CHARACTER
522   027B   3E0D             MVI     A,13            ;CARRIAGE RETURN
5231
524 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
525+                                                      19:26  09/08/2018
526+                                                                                      PAGE 10
527      IMSAI SCS-1 REV. 2 06 OCT. 1976
528
529
530   027D   B8               CMP     B               ;CHARACTER = CR?
531   027E   C8               RZ
532   027F   CD0301           CALL    OUT8
533   0282   23               INX     H
534   0283   C37A02           JMP     SCRN
535                   ;
536                   ; THIS ROUTINE CONVERTS THE BINARY VALUE IN REG A INTO
537                   ; ASCII HEXADECIMAL DIGITS AND STORES THEM IN MEMORY
538                   ;
539   0286   217410   BINH:   LXI     H,HCON          ;CONVERSION
540   0289   47               MOV     B,A             ;SAVE VALUE
541   028A   1F               RAR
542   028B   1F               RAR
543   028C   1F               RAR
544   028D   1F               RAR
545   028E   CD9902           CALL    BIN1
546   0291   77               MOV     M,A
547   0292   23               INX     H
548   0293   78               MOV     A,B
549   0294   CD9902           CALL    BIN1            ;CONVERT TO ASCII
550   0297   77               MOV     M,A
551   0298   C9               RET
552                   ;
553                   ; THIS ROUTINE CONVERTS A VALUE TO HEXADECIMAL
554                   ;
555   0299   E60F     BIN1:   ANI     0FH             ;LOW 4 BITS
556   029B   C630             ADI     48              ;CONVERT TO ASCII
557   029D   FE3A             CPI     58              ;DIGIT 0-9
558   029F   D8               RC
559   02A0   C607             ADI     7               ;MODIFY FOR A-F
560   02A2   C9               RET
561                   ;
562                   ; THIS ROUTINE CONVERTS THE BINARY VALUE IN REG A INTO
563                   ; ASCII DECIMAL DIGITS AND STORES THEM IN MEMORY
564                   ;
565   02A3   217410   BIND:   LXI     H,HCON          ;CONVERSION ADDRESS
566   02A6   0664             MVI     B,100
567   02A8   CDB402           CALL    BID1            ;CONVERT HUNDREDS DIGIT
568   02AB   060A             MVI     B,10
569   02AD   CDB402           CALL    BID1            ;CONVERT TENS DIGIT
570   02B0   C630             ADI     '0'             ;GET UNITS DIGIT
571   02B2   77               MOV     M,A             ;STORE IN MEMORY
572   02B3   C9               RET
573                   ;
574                   ; THIS ROUTINE CONVERTS A VALUE TO DECIMAL
575                   ;
576   02B4   362F     BID1:   MVI     M,'0'-1         ;INITIALIZE DIGIT COUNT
577   02B6   34               INR     M
578   02B7   90               SUB     B               ;CHECK DIGIT
579   02B8   D2B602           JNC     BID1+2
580   02BB   80               ADD     B               ;RESTORE VALUE
5811
582 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
583+                                                      19:26  09/08/2018
584+                                                                                      PAGE 11
585      IMSAI SCS-1 REV. 2 06 OCT. 1976
586
587
588   02BC   23               INX     H
589   02BD   C9               RET
590                   ;
591                   ; LEGAL COMMAND TABLE
592                   ;
593   02BE   44554D50 CTAB:   DB      'DUMP'
594   02C2   0803             DW      DUMP
595   02C4   45584543         DB      'EXEC'
596   02C8   2101             DW      EXEC
597   02CA   454E5452         DB      'ENTR'
598   02CE   7604             DW      ENTR
599   02D0   46494C45         DB      'FILE'
600   02D4   3E03             DW      FILE
601   02D6   4C495354         DB      'LIST'
602   02DA   D005             DW      LIST
603   02DC   44454C54         DB      'DELT'
604   02E0   E705             DW      DELL
605   02E2   4153534D         DB      'ASSM'
606   02E6   5E06             DW      ASSM
607   02E8   50414745         DB      'PAGE'
608   02EC   2203             DW      PAGEMOV
609   02EE   43555354         DB      'CUST'
610   02F2   0020             DW      2000H
611   02F4   4252454B         DB      'BREK'
612   02F8   D20C             DW      BREAK
613   02FA   50524F43         DB      'PROC'
614   02FE   8F0D             DW      PROC
615                   ;
616                   ; THIS ROUTINE CHECKS IF ANY PARAMETERS WERE ENTERED
617                   ; WITH THE COMMAND, IF NOT AN ERROR MESSAGE IS ISSUED
618                   ;
619   0300   3A7E10   VCHK:   LDA     ABUF            ;FETCH PARAMETER BYTE
620   0303   B7               ORA     A               ;SET FLAGS
621   0304   CA5A04           JZ      WHAT            ;NO PARAMETER
622   0307   C9               RET
623                   ;
624                   ; THIS ROUTINE DUMPS OUT THE FONTENTS OF MEMORY FROM
625                   ; THE START TO FINAL ADDRESSES GIVEN IN THE COMMAND.
626                   ;
627   0308   CD0003   DUMP:   CALL    VCHK            ;CHECK FOR PARAMETERS
628   030B   CD0E01   DUMS:   CALL    CRLF            ;START NEW LINE
629   030E   2A8A10   DUM1:   LHLD    BBUF            ;FETCH MEMORY ADDRESS
630   0311   7E               MOV     A,M
631   0312   CD4A02           CALL    HOTB            ;OUTPUT VALUE
632   0315   CD6302           CALL    ACHK            ;CHECK ADDRESS
633   0318   D8               RC                      ;RETURN IF FINISHED
634   0319   7D               MOV     A,L             ;IS NEXT ADDRESS
635   031A   E60F             ANI     0FH             ; DIVISIBLE BY 16?
636   031C   C20E03           JNZ     DUM1
637   031F   C30B03           JMP     DUMS
638                   ;
6391
640 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
641+                                                      19:26  09/08/2018
642+                                                                                      PAGE 12
643      IMSAI SCS-1 REV. 2 06 OCT. 1976
644
645
646                   ; THIS ROUTINE WILL MOVE 256 BYTES FROM 1ST ADDRESS
647                   ; GIVEN IN COMMAND TO 2ND ADDRESS IN COMMAND.
648                   ;
649   0322   CD0003   PAGEMOV:CALL    VCHK            ;CHECK FOR PARAMETER
650   0325   3A8210           LDA     ABUF+4          ;FETCH 2ND PARAMETER
651   0328   B7               ORA     A               ;DOES 2ND PARAMETER EXIST?
652   0329   CA5A04           JZ      WHAT
653   032C   2A8A10           LHLD    BBUF            ;FETCH MOVE TO ADDRESS
654   032F   EB               XCHG
655   0330   2A8C10           LHLD    BBUF+2          ;FETCH MOVE TO ADDRESS
656   0333   0600             MVI     B,0             ;SET COUNTER
657   0335   1A       PAG1:   LDAX    D
658   0336   77               MOV     M,A
659   0337   23               INX     H
660   0338   13               INX     D
661   0339   05               DCR     B               ;DECREMENT COUNTER
662   033A   C23503           JNZ     PAG1
663   033D   C9               RET
664                   ;
665                   ; THIS COMMAND INITIALIZES THE BEGINNING OF FILE ADDRESS
666                   ; AND END OF FILE ADDRESS AS WELL AS THE FILE AREA
667                   ; WHEN THE FILE COMMAND IS USED
668                   ;
669   033E   CD0E01   FILE:   CALL    CRLF
670                   ; CHECK FOR FILE PARAMETERS
671   0341   3A7610           LDA     FBUF
672   0344   B7               ORA     A
673   0345   CAB903           JZ      FOUT            ;NO ? GO LIST
674   0348   CD1804           CALL    FSEA            ;LOOK UP FILE
675   034B   EB               XCHG                    ;PNTR IN DE
676   034C   C26303           JNZ     TEST
677                   ; NO ENTRY
678   034F   3A7E10           LDA     ABUF            ;CHECK FOR PARAM
679   0352   B7               ORA     A
680   0353   CA5D04           JZ      WHA1            ;NO?? - ERROR
681                   ; CHECK FOR ROOM IN DIRECTORY
682   0356   3A7D10           LDA     FEF
683   0359   B7               ORA     A
684   035A   C27803           JNZ     ROOM
685   035D   216B04           LXI     H,EMES1
686   0360   C36004           JMP     MESS
687                   ; ENTRY FOUND ARE THESE PARAMETERS
688   0363   3A7E10   TEST:   LDA     ABUF
689   0366   B7               ORA     A
690   0367   CA8B03           JZ      SWAPS
691   036A   2A8A10           LHLD    BBUF
692   036D   7C               MOV     A,H
693   036E   B5               ORA     L
694   036F   CA8B03           JZ      SWAPS
695   0372   217004           LXI     H,EMES2         ;NO-NO CAN?T DO
696   0375   C36004           JMP     MESS            ;IT - DELETE FIRST
6971
698 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
699+                                                      19:26  09/08/2018
700+                                                                                      PAGE 13
701      IMSAI SCS-1 REV. 2 06 OCT. 1976
702
703
704                   ; MOVE FILE NAME TO BLOCK POINTED TO BY FREAD
705   0378   2A7B10   ROOM:   LHLD    FREAD
706   037B   EB               XCHG
707   037C   217610           LXI     H,FBUF          ;FILE NAME POINTER IN H,L
708   037F   D5               PUSH    D
709   0380   0E05             MVI     C,NMLEN         ;NAME LENGTH COUNT
710   0382   7E       MOV23:  MOV     A,M
711   0383   12               STAX    D
712   0384   13               INX     D
713   0385   0D               DCR     C               ;TEST COUNT
714   0386   23               INX     H
715   0387   C28203           JNZ     MOV23
716   038A   D1               POP     D               ;RESTORE ENTRY POINTER
717                   ; MAKE FILE POINTED TO BY D,E CURRENT
718   038B   212410   SWAPS:  LXI     H,FILE0
719   038E   0E0D             MVI     C,FELEN         ;ENTRY LENGTH
720   0390   1A       SWAP:   LDAX    D
721   0391   46               MOV     B,M
722   0392   77               MOV     M,A             ;EXCHANGE
723   0393   78               MOV     A,B
724   0394   12               STAX    D
725   0395   13               INX     D
726   0396   23               INX     H               ;BUMP POINTER
727   0397   0D               DCR     C               ;TEST COUNT
728   0398   C29003           JNZ     SWAP
729
730                   ; CHECK FOR 2ND PARAMETER
731   039B   3A7E10               LDA ABUF
732   039E   B7               ORA     A
733   039F   CAC303           JZ      FOOT            ;NO SECOND PARAMETER
734                   ; PROCESS 2ND PARAMETER
735   03A2   2A8A10           LHLD    BBUF            ;GET ADDRESS
736   03A5   222910           SHLD    BOFP            ;SET BEGIN
737   03A8   222B10           SHLD    EOFP            ;SET END
738   03AB   7D               MOV     A,L             ;IS ADDRESS ZERO
739   03AC   B4               ORA     H
740   03AD   CAB203           JZ      FIL35           ;YES
741   03B0   3601     FIL30:  MVI     M,1             ;NON-ZERO ? SET EOF
742   03B2   AF       FIL35:  XRA     A               ;AND MAX LINE #
743   03B3   322D10           STA     MAXL
744   03B6   C3C303           JMP     FOOT            ;OUTPUT PARAMETERS
745   03B9   3ACB10   FOUT:   LDA     IBUF+4
746   03BC   FE53             CPI     'S'             ;IS COMMAND FILES?
747   03BE   0E06             MVI     C,MAXFIL
748   03C0   CAC503           JZ      FOUL
749   03C3   0E01     FOOT:   MVI     C,1
750                   ; OUTPUT THE # OF ENTRIES IN C
751   03C5   212410   FOUL:   LXI     H,FILE0
752   03C8   79               MOV     A,C
753   03C9   327D10   FINE:   STA     FOCNT           ;SAVE COUNT
754   03CC   E5               PUSH    H
7551
756 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
757+                                                      19:26  09/08/2018
758+                                                                                      PAGE 14
759      IMSAI SCS-1 REV. 2 06 OCT. 1976
760
761
762   03CD   110500           LXI     D,NMLEN
763   03D0   19               DAD     D
764   03D1   7E               MOV     A,M
765   03D2   B7               ORA     A
766   03D3   C2E303           JNZ     FOOD
767   03D6   23               INX     H
768   03D7   86               ADD     M
769   03D8   23               INX     H
770   03D9   C2E303           JNZ     FOOD            ;NON ZERO, OK TO OUTPUT
771   03DC   33               INX     SP
772   03DD   33               INX     SP
773   03DE   23               INX     H
774   03DF   23               INX     H
775   03E0   C3F803           JMP     FEET
776                   ; HAVE AN ENTRY TO OUTPUT
777   03E3   E1       FOOD:   POP     H               ;PTR
778   03E4   0E05             MVI     C,NMLEN
779   03E6   46       FAST:   MOV     B,M             ;LOAD CHARACTER TO B
780   03E7   CD0301           CALL    OUT8
781   03EA   0D               DCR     C
782   03EB   23               INX     H
783   03EC   C2E603           JNZ     FAST            ;DO THE REST
784                   ; NOW OUTPUT BEGIN-END PTRS
785   03EF   CD0404           CALL    FOOL            ;OUTPUT BEGIN
786   03F2   CD0404           CALL    FOOL            ;OUTPUT END
787   03F5   CD0E01           CALL    CRLF            ;AND C/R
788                   ; TEST COUNT, H,L POINTS PAST EOFP
789   03F8   110400   FEET:   LXI     D,FELEN-NMLEN-4
790   03FB   19               DAD     D               ;MOVE TO NEXT ENTRY
791   03FC   3A7D10           LDA     FOCNT
792   03FF   3D               DCR     A               ;TEST COUNT
793   0400   C2C903           JNZ     FINE            ;MORE TO DO
794   0403   C9               RET                     ;DONE!
795                   ; OUTPUT NUMBER POINTED TO BY H,L
796                   ; ON RET, H,L POINT 2 WORDS LATER
797   0404   CD5D02   FOOL:   CALL    BLK1            ;SPACE
798   0407   23               INX     H
799   0408   7E               MOV     A,M
800   0409   2B               DCX     H
801   040A   E5               PUSH    H
802   040B   CD3A02           CALL    HOUT            ;OUTPUT
803   040E   E1               POP     H
804   040F   7E               MOV     A,M
805   0410   23               INX     H
806   0411   23               INX     H
807   0412   E5               PUSH    H
808   0413   CD4A02           CALL    HOTB            ;OUTPUT
809   0416   E1               POP     H               ;RESTORE H,L
810   0417   C9               RET
811                   ;
812                   ; SEARCH THE FILE DIRECTORY FOR THE FILE
8131
814 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
815+                                                      19:26  09/08/2018
816+                                                                                      PAGE 15
817      IMSAI SCS-1 REV. 2 06 OCT. 1976
818
819
820                   ; WHOSE NAME IS IN FBUF.
821                   ; RETURN IF FOUND, ZERO IF OFF, H,L POINT TO
822                   ; ENTRY WHILE SEARCHING, ON ENTRY FOUND WITH ADDR
823                   ; ZERO, SET FEF TO >0 AND FREAD TO THE ADDR OF ENTRY
824                   ;
825   0418   AF       FSEA:   XRA     A
826   0419   327D10           STA     FEF             ;CLAIM NO FREE ENTRIES
827   041C   0606             MVI     B,MAXFIL        ;COUNT OF ENTRIES
828   041E   112410           LXI     D,FILE0         ;TABLE ADDRESS
829   0421   217610   FSE10:  LXI     H,FBUF
830   0424   0E05             MVI     C,NMLEN
831   0426   CD5301           CALL    SEAR            ;TEST STRINGS
832   0429   F5               PUSH    PSW             ;SAVE FLAG
833   042A   D5               PUSH    D
834   042B   1A               LDAX    D               ;GET BOFP
835   042C   B7               ORA     A               ;EMPTY ENTRY?
836   042D   C24E04           JNZ     FSE20
837   0430   13               INX     D               ;STORE OTHER WORD
838   0431   1A               LDAX    D
839   0432   B7               ORA     A
840   0433   C24E04           JNZ     FSE20           ;NOPE-GO TEST FOR MATCH
841   0436   EB               XCHG
842   0437   11FAFF           LXI     D,-NMLEN-1
843   043A   19               DAD     D               ;MOVE TO BEGINNING
844   043B   227B10           SHLD    FREAD           ;SAVE ADDR
845   043E   7A               MOV     A,D
846   043F   327D10           STA     FEF             ;SET FREE ENTRY FOUND
847   0442   E1               POP     H               ;RESTORE INTERIM PTR
848   0443   F1               POP     PSW             ;UNJUNK STACK
849                   ; MOVE TO NEXT ENTRY
850   0444   110800   FSE15:  LXI     D,FELEN-NMLEN
851   0447   19               DAD     D
852   0448   EB               XCHG                    ;NEXT ENTRY IN DE
853   0449   05               DCR     B               ;TEST COUNT
854   044A   C8               RZ                      ;DONE--NOPE
855   044B   C32104           JMP     FSE10           ;TRY NEXT
856                   ; ENTRY WASN?T FREE, TEST FOR MATCH
857   044E   E1       FSE20:  POP     H
858   044F   F1               POP     PSW
859   0450   C24404           JNZ     FSE15           ;IF ZERO CLEAR, NO MATCH
860                   ; ENTRY FOUND
861   0453   11FBFF           LXI     D,-NMLEN        ;BACKUP
862   0456   19               DAD     D               ;H,L POINTS TO ENTRY
863   0457   7A               MOV     A,D
864   0458   B7               ORA     A               ;CLEAR ZERO
865   0459   C9               RET                     ;THAT?S ALL
866                   ;
867                   ; OUTPUT ERROR MESSAGE FOR ILLEGAL COMMAND
868                   ;
869   045A   CD0E01   WHAT:   CALL    CRLF            ;OUT CRLF
870   045D   216604   WHA1:   LXI     H,EMES          ;MESSAGE ADDRESS
8711
872 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
873+                                                      19:26  09/08/2018
874+                                                                                      PAGE 16
875      IMSAI SCS-1 REV. 2 06 OCT. 1976
876
877
878   0460   CD7A02   MESS:   CALL    SCRN
879   0463   C36700           JMP     EOR
880                   ;
881   0466   57484154 EMES:   DB      'WHAT'
882   046A   0D               DB      13
883   046B   46554C4C EMES1:  DB      'FULL',13
884   046F   0D
885   0470   4E4F204E EMES2:  DB      'NO NO',13
886   0474   4F0D
887                   ;
888                   ; CALL ROUTINE TO ENTER DATA INTO MEMORY
889                   ; AND CHECK FOR ERROR ON RETURN
890                   ;
891                   ; THIS ROUTINE IS USED TO ENTER DATA VALUES INTO MEMORY.
892                   ; EACH VALUE IS ONE BYTE AND IS WRITTEN IN HEXADECIMAL
893                   ; VALUES GREATER THAN 255 WILL CAUSE CARRY TO BE SET
894                   ; AND RETURN TO BE MADE TO CALLING PROGRAM
895                   ;
896   0476   CD0003   ENTR:   CALL    VCHK            ;CHECK FOR PARAMETERS
897   0479   CD8304           CALL    ENTS
898   047C   DA5A04           JC      WHAT
899   047F   CD0E01           CALL    CRLF
900   0482   C9               RET
901                   ;
902   002F            EEND    EQU     '/'             ;TERMINATION CHARACTER
903   0483   CD0E01   ENTS:   CALL    CRLF
904   0486   CD8000           CALL    READ            ;READ INPUT DATA
905   0489   21C710           LXI     H,IBUF          ;SET LINE POINTER
906   048C   229610           SHLD    PNTR            ;SAVE POINTER
907   048F   CD6601   ENT1:   CALL    ZBUF            ;CLEAR BUFFER
908   0492   CD0D09           CALL    SBLK            ;SCAN TO FIRST VALUE
909   0495   DA8304           JC      ENTS            ;JUMP IF CR FOUND
910   0498   FE2F             CPI     EEND
911   049A   C8               RZ                      ;RETURN CARRY IS ZERO
912   049B   CD750B           CALL    ALPS            ;PLACE VALUE IN BUFFER
913   049E   78               MOV     A,B             ;GET DIGIT COUNT
914   049F   FE03             CPI     3               ;CHECK NMBR OF DIGITS
915   04A1   3F               CMC
916   04A2   D8               RC                      ;RETURN IF MORE THAN 2 DIGITS
917   04A3   017E10           LXI     B,ABUF          ;CONVERSION ADDRESS
918   04A6   CD1B02           CALL    AHEX            ;CONVERT VALUE
919   04A9   D8               RC                      ;ERROR IN HEX CHARACTER
920   04AA   7D               MOV     A,L
921   04AB   2A8A10           LHLD    BBUF            ;FETCH MEMORY ADDRESS
922   04AE   77               MOV     M,A             ;PUT IN MEMORY
923   04AF   CD7502           CALL    ACH1            ;INCREMENT MEMORY LOCATION
924   04B2   C38F04           JMP     ENT1
925                   ;
926                   ; THIS ROUTINE IS USED TO ENTER LINES INTO THE FILE
927                   ; AREA.  THE LINE NUMBER IS FIRST CHECKED TO SEE IF IT IS
928                   ; A VALID NUMBER (0000-9999).  NEXT IT IS CHECKED TO SEE
9291
930 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
931+                                                      19:26  09/08/2018
932+                                                                                      PAGE 17
933      IMSAI SCS-1 REV. 2 06 OCT. 1976
934
935
936                   ; IF IT IS GREATER THAN THE MAXIMUM CURRENT LINE NUMBER.
937                   ; IF IT IS, THE NEXT LINE IS INSERTED AT THE END OF THE
938                   ; CURRENT FILE AND THE MAXIMUM LINE NUMBER IS UPDATED AS
939                   ; WELL AS THE END OF FILE POSITION.  LINE NUMBERS THAT
940                   ; ALREADY EXIST ARE INSERTED INTO THE FILE AREA AT THE
941                   ; APPROPRIATE PLACE AND ANY EXTRA CHARACTERS IN THE OLD
942                   ; LINE ARE DELETED.
943                   ;
944   04B5   3A2410   LINE:   LDA     FILE0           ;IS A FILE DEFINED?
945   04B8   B7               ORA     A
946   04B9   CA5A04           JZ      WHAT            ;ABORT IF NOT
947   04BC   0E04             MVI     C,4             ;NO OF DIGITS TO CHECK
948   04BE   21C610           LXI     H,IBUF-1                ;INITIALIZE ADDRESS
949   04C1   23       LICK:   INX     H
950   04C2   7E               MOV     A,M             ;FETCH LINE DIGIT
951   04C3   FE30             CPI     '0'             ;CHECK FOR VALID NUMBER
952   04C5   DA5A04           JC      WHAT
953   04C8   FE3A             CPI     '9'+1
954   04CA   D25A04           JNC     WHAT
955   04CD   0D               DCR     C
956   04CE   C2C104           JNZ     LICK
957   04D1   227410           SHLD    ADDS            ;FIND ADDRESS
958   04D4   113010           LXI     D,MAXL+3                ;GET ADDRESS
959   04D7   CDA205           CALL    COM0
960   04DA   D2FA04           JNC     INSR
961                   ; GET HERE IF NEW LINE IS GREATER THAN MAXIMUM LINE #
962   04DD   23               INX     H
963   04DE   CD9205           CALL    LODM            ;GET NEW LINE NUMBER
964   04E1   213010           LXI     H,MAXL+3
965   04E4   CD9A05           CALL    STOM            ;MAKE IT MAXIMUM LINE NUMBER
966   04E7   11C610           LXI     D,IBUF-1
967   04EA   2A2B10           LHLD    EOFP            ;END OF FILE POSITION
968   04ED   0E01             MVI     C,1
969   04EF   CD8005           CALL    LMOV            ;PLACE LINE IN FILE
970   04F2   3601     SEOF:   MVI     M,1             ;END OF FILE INDICATOR
971   04F4   222B10           SHLD    EOFP            ;END OF FILE ADDRESS
972   04F7   C36700           JMP     EOR
973                   ; GET HERE IF NEW LINE MUST BE INSERTED INTO ALREADY
974                   ; EISTING FILE AREA
975   04FA   CD5205   INSR:   CALL    FIN1            ;FIND LINE IN FILE
976   04FD   0E02             MVI     C,2
977   04FF   CA0305           JZ      EQUL
978   0502   0D               DCR     C               ;NEW LN NOT EQUAL TO SOME OLD LN
979   0503   46       EQUL:   MOV     B,M
980   0504   2B               DCX     H
981   0505   3602             MVI     M,2             ;MOVE LINE INDICATOR
982   0507   227210           SHLD    INSP            ;INSERT LINE POSITION
983   050A   3AC610           LDA     IBUF-1          ;NEW LINE COUNT
984   050D   0D               DCR     C
985   050E   CA1805           JZ      LESS            ;NEW LN NOT = OLD LN
986   0511   90               SUB     B               ;COUNT DIFFERENCE
9871
988 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
989+                                                      19:26  09/08/2018
990+                                                                                      PAGE 18
991      IMSAI SCS-1 REV. 2 06 OCT. 1976
992
993
994   0512   CA3B05           JZ      ZERO            ;LINE LENGTHS EQUAL
995   0515   DA2B05           JC      MORE
996                   ; GET HERE IF # OF CHARS IN OLD LINE > # OF CHARS IN
997                   ; NEW LINE OR NEW LINE # WAS NOT EQUAL TO SOLD OLD
998                   ; LINE #
999   0518   2A2B10   LESS:   LHLD    EOFP            ;END OF FILE ADDRESS
1000   051B   54               MOV     D,H
1001   051C   5D               MOV     E,L
1002   051D   CD7B05           CALL    ADR             ;MOVE TO ADDRESS
1003   0520   222B10           SHLD    EOFP            ;NEW END OF FILE ADDRESS
1004   0523   0E02             MVI     C,2
1005   0525   CD8905           CALL    RMOV            ;OPEN UP FILE AREA
1006   0528   C33B05           JMP     ZERO
1007                   ; GET HERE IF # OF CHARS IN OLD LINE < # OF CHARS IN
1008                   ; NEW LINE
1009   052B   2F       MORE:   CMA
1010   052C   3C               INR     A               ;COUNT DIFFERENCE
1011   052D   54               MOV     D,H
1012   052E   5D               MOV     E,L
1013   052F   CD7B05           CALL    ADR
1014   0532   EB               XCHG
1015   0533   CD8005           CALL    LMOV            ;DELETE EXCESS CHAR IN FILE
1016   0536   3601             MVI     M,1             ;E-O-F INDICATOR
1017   0538   222B10           SHLD    EOFP            ;E-O-F ADDRESS
1018                   ; GET HERE TO INSERT LINE INTO FILE AREA
1019   053B   2A7210   ZERO:   LHLD    INSP            ;INSERT ADDRESS
1020   053E   360D             MVI     M,ASCR
1021   0540   23               INX     H
1022   0541   11C610           LXI     D,IBUF-1                ;NEW LINE ADDRESS
1023   0544   0E01             MVI     C,1             ;CHECK VALUE
1024   0546   CD8005           CALL    LMOV            ;PLACE LINE IN FILE
1025   0549   C36700           JMP     EOR
1026                   ;
1027                   ; THIS ROUTINE IS USED TO FIND A LN IN THE FILE AREA
1028                   ; WHICH IS GREATER THAN OR EQUAL TO THE CURRENT LINE #
1029                   ;
1030   054C   218110   FIND:   LXI     H,ABUF+3                ;BUFFER ADDRESS
1031   054F   227410           SHLD    ADDS            ;SAVE ADDRESS
1032   0552   2A2910   FIN1:   LHLD    BOFP            ;BEGIN FILE ADDRESS
1033   0555   7C               MOV     A,H             ;RETURN TO MONITOR IF
1034   0556   B5               ORA     L               ;  FILE IS EMPTY...
1035   0557   CA6700           JZ      EOR
1036   055A   CD7405   FI1:    CALL    EO1             ;CHECK FOR END OF FILE
1037   055D   EB               XCHG
1038   055E   2A7410           LHLD    ADDS            ;FETCH FIND ADDRESS
1039   0561   EB               XCHG
1040   0562   3E04             MVI     A,4
1041   0564   CD7B05           CALL    ADR             ;BUMP LINE ADDRESS
1042   0567   CDA205           CALL    COM0            ;COMPARE LINE NUMBERS
1043   056A   D8               RC
1044   056B   C8               RZ
10451
1046 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1047+                                                      19:26  09/08/2018
1048+                                                                                      PAGE 19
1049      IMSAI SCS-1 REV. 2 06 OCT. 1976
1050
1051
1052   056C   7E       FI2:    MOV     A,M
1053   056D   CD7B05           CALL    ADR             ;NEXT LINE ADDRESS
1054   0570   C35A05           JMP     FI1
1055                   ;
1056                   ; WHEN SEARCHING THROUGH THE FILE AREA, THIS ROUTINE
1057                   ; CHECKS TO SEE IF THE CURRENT ADDRESS IS THE END OF
1058                   ; FILE
1059                   ;
1060   0573   23       EOF:    INX     H
1061   0574   3E01     EO1:    MVI     A,1             ;E-O-F INDICATOR
1062   0576   BE               CMP     M
1063   0577   C0               RNZ
1064   0578   C36700           JMP     EOR
1065                   ;
1066                   ; THIS ROUTINE IS USED TO ADD A VALUE TO AN ADDRESS
1067                   ; CONTAINED IN REGISTER H,L
1068                   ;
1069   057B   85       ADR:    ADD     L
1070   057C   6F               MOV     L,A
1071   057D   D0               RNC
1072   057E   24               INR     H
1073   057F   C9               RET
1074                   ;
1075                   ; THIS ROUTINE WILL MOVE CHARACTER STRINGS FROM ONE
1076                   ; LOCATION OF MEMORY TO ANOTHER
1077                   ; CHARACTERS ARE MOVED FROM LOCATION ADDRESSED BY D,E
1078                   ; TO LOCATION ADDRESSED BY H,L.  ADDITIONAL CHARACTERS
1079                   ; ARE MOVED BY BUMPING POINTERS UNTIL THE CHARACTER IN
1080                   ; REG C IS FETCHED.
1081                   ;
1082   0580   1A       LMOV:   LDAX    D               ;FETCH CHARACTER
1083   0581   13               INX     D               ;INCREMENT FETCH ADDRESS
1084   0582   B9               CMP     C               ;TERMINATION CHARACTER
1085   0583   C8               RZ
1086   0584   77               MOV     M,A             ;STORE CHARACTER
1087   0585   23               INX     H               ;INCREMENT STORE ADDRESS
1088   0586   C38005           JMP     LMOV
1089                   ;
1090                   ; THIS ROUTINE IS SIMILAR TO ABOVE EXCEPT THAT THE
1091                   ; CHARACTER ADDRESS IS DECREMENTED AFTER EACH FETCH
1092                   ; AND STORE
1093                   ;
1094   0589   1A       RMOV:   LDAX    D               ;FETCH CHARACTER
1095   058A   1B               DCX     D               ;DECREMENT FETCH CHARACTER
1096   058B   B9               CMP     C               ;TERMINATION CHARACTER
1097   058C   C8               RZ
1098   058D   77               MOV     M,A             ;STORE CHARACTER
1099   058E   2B               DCX     H               ;DECREMENT STORE ADDRESS
1100   058F   C38905           JMP     RMOV
1101                   ;
1102                   ; THIS ROUTINE IS USED TO LOAD FOUR CHARACTERS FROM
11031
1104 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1105+                                                      19:26  09/08/2018
1106+                                                                                      PAGE 20
1107      IMSAI SCS-1 REV. 2 06 OCT. 1976
1108
1109
1110                   ; MEMORY INTO REGISTERS
1111                   ;
1112
1113   0592   46       LODM:   MOV     B,M             ;FETCH CHARACTER
1114   0593   23               INX     H
1115   0594   4E               MOV     C,M             ;FETCH CHARACTER
1116   0595   23               INX     H
1117   0596   56               MOV     D,M             ;FETCH CHARACTER
1118   0597   23               INX     H
1119   0598   5E               MOV     E,M             ;FETCH CHARACTER
1120   0599   C9               RET
1121                   ;
1122                   ; THIS ROUTINE STORES FOUR CHARACTERS FROM THE REGISTERS
1123                   ; INTO MEMORY
1124                   ;
1125   059A   73       STOM:   MOV     M,E             ;STORE CHARACTER
1126   059B   2B               DCX     H
1127   059C   72               MOV     M,D             ;STORE CHARACTER
1128   059D   2B               DCX     H
1129   059E   71               MOV     M,C             ;STORE CHARACTER
1130   059F   2B               DCX     H
1131   05A0   70               MOV     M,B             ;STORE CHARACTER
1132   05A1   C9               RET
1133                   ;
1134                   ; THIS ROUTINE IS USED TO COMPARE TWO CHARACTER STRINGS
1135                   ; OF LENGTH 4, ON RETURN ZERO FLAG SET MEANS BOTH
1136                   ; STRINGS ARE EQUAL.  CARRY FLAG =0 MEANS STRING ADDRESS
1137                   ; BY D,E WAS GREATER THAN OR EQUAL TO CHARACTER STRING
1138                   ; ADDRESSED BY H,L
1139                   ;
1140   05A2   0601     COM0:   MVI     B,1             ;EQUAL COUNTER
1141   05A4   0E04             MVI     C,4             ;STRING LENGTH
1142   05A6   B7               ORA     A               ;CLEAR CARRY
1143   05A7   1A       CO1:    LDAX    D               ;FETCH CHARACTER
1144   05A8   9E               SBB     M               ;COMPARE CHARACTERS
1145   05A9   CAAD05           JZ      CO2
1146   05AC   04               INR     B               ;INCREMENT EQUAL COUNTER
1147   05AD   1B       CO2:    DCX     D
1148   05AE   2B               DCX     H
1149   05AF   0D               DCR     C
1150   05B0   C2A705           JNZ     CO1
1151   05B3   05               DCR     B
1152   05B4   C9               RET
1153                   ;
1154                   ; THIS ROUTINE IS SIMILAR TO THE ABOVE ROUTINE EXCEPT ON
1155                   ; RETURN CARRY FLAG = 0 MEANS THAT CHARACTER STRING
1156                   ; ADDRESSED BY D,E IS ONLY > STRING ADDRESSED BY H,L.
1157                   ;
1158   05B5   0E04     COM1:   MVI     C,4             ;STRING LENGTH
1159   05B7   1A               LDAX    D               ;TCH CHARACTER
1160   05B8   D601             SUI     1
11611
1162 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1163+                                                      19:26  09/08/2018
1164+                                                                                      PAGE 21
1165      IMSAI SCS-1 REV. 2 06 OCT. 1976
1166
1167
1168   05BA   C3A805           JMP     CO1+1
1169                   ;
1170                   ; THIS ROUTINE WILL TAKE ASCII CHARACTERS AND ADD ANY
1171                   ; NECESSARY ASCII ZEROES SO THE RESULT IS A 4 CHARACTER
1172                   ; ASCII VALUE
1173                   ;
1174   05BD   CD9205   NORM:   CALL    LODM            ;LOAD CHARACTERS
1175   05C0   AF               XRA     A               ;FETCH A ZERO
1176   05C1   B8               CMP     B
1177   05C2   C8               RZ
1178   05C3   BB       NOR1:   CMP     E
1179   05C4   C49A05           CNZ     STOM            ;STORE VALUES
1180   05C7   C0               RNZ
1181   05C8   5A               MOV     E,D             ;NORMALIZE VALUE
1182   05C9   51               MOV     D,C
1183   05CA   48               MOV     C,B
1184   05CB   0630             MVI     B,'0'
1185   05CD   C3C305           JMP     NOR1
1186                   ;
1187                   ; THIS ROUTINE IS USED TO LIST THE CONTENTS OF THE FILE
1188                   ; AREA STARTING AT THE LINE NUMBER GIVEN IN THE COMMAND
1189                   ;
1190   05D0   CD0E01   LIST:   CALL    CRLF
1191   05D3   CD4C05           CALL    FIND            ;FIND STARTING LINE NUMBER
1192   05D6   23       LIST0:  INX     H               ;OUTPUT LINE...
1193   05D7   CD7A02           CALL    SCRN
1194   05DA   CD0E01           CALL    CRLF
1195   05DD   CD7305           CALL    EOF             ;CHECK FOR END OF FILE
1196   05E0   CDE900           CALL    INK             ;CHECK FOR ?X
1197   05E3   C2D605           JNZ     LIST0           ;LOOP IF NO ?X
1198   05E6   C9               RET
1199                   ;
1200                   ; THIS ROUTINE IS USED TO DELETE LINES FROM THE
1201                   ; FILE AREA.  THE REMAINING FILE AREA IS THEN MOVED IN
1202                   ; MEMORY SO THAT THERE IS NO EXCESS SPACE.
1203                   ;
1204   05E7   CD0003   DELL:   CALL    VCHK            ;CHECK FOR PARAMETER
1205   05EA   CD4C05           CALL    FIND            ;FIND LINE IN FILE AREA
1206   05ED   227210           SHLD    DELP            ;SAVE DELETE POSITION
1207   05F0   218510           LXI     H,ABUF+7
1208   05F3   7E               MOV     A,M             ;CHECK FOR 2ND PARAMETER
1209   05F4   B7               ORA     A               ;SET FLAGS
1210   05F5   C2FB05           JNZ     DEL1
1211   05F8   218110           LXI     H,ABUF+3                ;USE FIRST PARAMETER
1212   05FB   227410   DEL1:   SHLD    ADDS            ;SAVE FIND ADDRESS
1213   05FE   EB               XCHG
1214   05FF   213010           LXI     H,MAXL+3
1215   0602   CDA205           CALL    COM0            ;COMPARE LINE NUMBERS
1216   0605   2A7210           LHLD    DELP            ;LOAD DELETE POSITION
1217   0608   DA4906           JC      NOVR
1218                   ; GET HERE IF DELETION INVOLVES END OF FILE
12191
1220 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1221+                                                      19:26  09/08/2018
1222+                                                                                      PAGE 22
1223      IMSAI SCS-1 REV. 2 06 OCT. 1976
1224
1225
1226   060B   222B10           SHLD    EOFP            ;CHANGE E-O-F POSITION
1227   060E   3601             MVI     M,1             ;SET E-O-F INDICATOR
1228   0610   EB               XCHG
1229   0611   2A2910           LHLD    BOFP
1230   0614   EB               XCHG
1231   0615   060D             MVI     B,13            ;SET SCAN SWITCH
1232   0617   2B               DCX     H               ;CHECK FOR BOFP
1233   0618   7D       DEL2:   MOV     A,L
1234   0619   93               SUB     E
1235   061A   7C               MOV     A,H
1236   061B   9A               SBB     D
1237   061C   3E0D             MVI     A,ASCR          ;LOOK FOR CR
1238   061E   DA4006           JC      DEL4            ;DECREMENTED PAST BOF
1239   0621   05               DCR     B
1240   0622   2B               DCX     H
1241   0623   BE               CMP     M               ;FIND NEW MAX LN
1242   0624   C21806           JNZ     DEL2
1243   0627   2B               DCX     H
1244   0628   7D               MOV     A,L
1245   0629   93               SUB     E
1246   062A   7C               MOV     A,H
1247   062B   9A               SBB     D
1248   062C   DA4106           JC      DEL5
1249   062F   BE               CMP     M               ;END OF PREVIOUS LINE
1250   0630   23               INX     H
1251   0631   23               INX     H
1252   0632   CA3606           JZ      DEL3
1253   0635   23               INX     H
1254   0636   CD9205   DEL3:   CALL    LODM            ;LOAD NEW MAX LN
1255   0639   213010           LXI     H,MAXL+3                ;SET ADDRESS
1256   063C   CD9A05           CALL    STOM            ;STORE NEW MAX LN
1257   063F   C9               RET
1258   0640   B8       DEL4:   CMP     B               ;CHECK SWITCH
1259   0641   EB       DEL5:   XCHG
1260   0642   C23506           JNZ     DEL3-1
1261   0645   322D10           STA     MAXL            ;MAKE MAX LN A SMALL NUMBER
1262   0648   C9               RET
1263                   ; GET HERE IF DELETION IS IN THE MIDDLE OF FILE AREA
1264   0649   CD5A05   NOVR:   CALL    FI1             ;FIND END OF DELETE AREA
1265   064C   CC6C05           CZ      FI2             ;NEXT LINE IF THIS LN EQUAL
1266   064F   EB       NOV1:   XCHG
1267   0650   2A7210           LHLD    DELP            ;CHAR MOVE TO POSITION
1268   0653   0E01             MVI     C,1             ;MOVE TERMINATOR
1269   0655   CD8005           CALL    LMOV            ;COMPACT FILE AREA
1270   0658   222B10           SHLD    EOFP            ;SET EOF POSITION
1271   065B   3601             MVI     M,1             ;SET EOF INDICATOR
1272   065D   C9               RET
1273                   ;
1274                   ; STARTING HERE IS THE SELF ASSEMBLER PROGRAM
1275                   ; THIS PROGRAM ASSEMBLES PROGRAMS WHICH ARE
1276                   ; IN THE FILE AREA
12771
1278 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1279+                                                      19:26  09/08/2018
1280+                                                                                      PAGE 23
1281      IMSAI SCS-1 REV. 2 06 OCT. 1976
1282
1283
1284                   ;
1285   065E   CD0003   ASSM:   CALL    VCHK            ;CHECK FOR PARAMETERS
1286   0661   3A8210           LDA     ABUF+4          ;GET 2ND PARAMETER
1287   0664   B7               ORA     A               ;CHECK FOR PRARMETERS
1288   0665   C26E06           JNZ     ASM4
1289   0668   2A8A10           LHLD    BBUF            ;FETCH 1ST PARAMETER
1290   066B   228C10           SHLD    BBUF+2          ;STORE INTO 2ND PARAMETER
1291   066E   3ACB10   ASM4:   LDA     IBUF+4          ;FETCH INPUT CHARACTER
1292   0671   D645             SUI     'E'             ;RESET   IF ERRORS ONLY
1293   0673   328E10           STA     AERR            ;SAVE ERROR FLAG
1294   0676   AF               XRA     A               ;GET A ZERO
1295   0677   329810           STA     NOLA            ;INITIALIZE LABEL COUNT
1296   067A   329410   ASM3:   STA     PASI            ;SET PASS INDICATOR
1297   067D   CD0E01           CALL    CRLF            ;INDICATE START OF PASS
1298   0680   2A8A10           LHLD    BBUF            ;FETCH ORIGIN
1299   0683   229210           SHLD    ASPC            ;INITIALIZE PC
1300   0686   2A2910           LHLD    BOFP            ;GET START OF FILE
1301   0689   227210           SHLD    APNT
1302   068C   2A7210   ASM1:   LHLD    APNT            ;FETCH LINE POINTER
1303   068F   31B210           LXI     SP,AREA+18
1304   0692   7E               MOV     A,M             ;FETCH CHARACTER
1305   0693   FE01             CPI     1               ;END OF FILE?
1306   0695   CA0109           JZ      EASS            ;JUMP IF END OF FILE
1307   0698   EB               XCHG
1308   0699   13               INX     D               ;INCREMENT ADDRESS
1309   069A   21B210           LXI     H,OBUF          ;BLANK START ADDRESS
1310   069D   3EC2             MVI     A,IBUF-5 AND 0FFH       ;BLANK END ADDRESS
1311   069F   CDE100           CALL    CLER            ;BLANK OUT BUFFER
1312   06A2   0E0D             MVI     C,ASCR          ;STOP CHARACTER
1313   06A4   CD8005           CALL    LMOV            ;MOVE LINE INTO BUFFER
1314   06A7   71               MOV     M,C             ;PLACE CR IN BUFFER
1315   06A8   EB               XCHG
1316   06A9   227210           SHLD    APNT            ;SAVE ADDRESS
1317   06AC   3A9410           LDA     PASI            ;FETCH PASS INDICATOR
1318   06AF   B7               ORA     A               ;SET FLAGW
1319   06B0   C2B906           JNZ     ASM2            ;JUMP IF PASS 2
1320   06B3   CDDC06           CALL    PAS1
1321   06B6   C38C06           JMP     ASM1
1322                   ;
1323   06B9   CD9307   ASM2:   CALL    PAS2
1324   06BC   21B210           LXI     H,OBUF          ;OUTPUT BUFFER ADDRESS
1325   06BF   CDC506           CALL    AOUT            ;OUTPUT LINE
1326   06C2   C38C06           JMP     ASM1
1327                   ;
1328                   ; THIS ROUTINE IS USED TO OUTPUT THE LISTING FOR
1329                   ; AN ASSEMBLY.  IT CHECKS THE ERROR SWITCH TO SEE IF
1330                   ; ALL LINES ARE TO BE PRINTED OR JUST THOSE WITH
1331                   ; ERRORS.
1332                   ;
1333   06C5   3A8E10   AOUT:   LDA     AERR            ;FETCH ERROR SWITCH
1334   06C8   B7               ORA     A               ;SET FLAGS
13351
1336 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1337+                                                      19:26  09/08/2018
1338+                                                                                      PAGE 24
1339      IMSAI SCS-1 REV. 2 06 OCT. 1976
1340
1341
1342   06C9   C2D206           JNZ     AOU1            ;OUTPUT ALL LINES
1343   06CC   3AB210   AOU2:   LDA     OBUF            ;FETCH ERROR INDICATOR
1344   06CF   FE20             CPI     ' '             ;CHECK FOR AN ERROR
1345   06D1   C8               RZ                      ;RETURN IF NO ERROR
1346   06D2   21B210   AOU1:   LXI     H,OBUF          ;OUTPUT BUFFER ADDRESS
1347   06D5   CD7A02           CALL    SCRN            ;OUTPUT LINE...
1348   06D8   CD0E01           CALL    CRLF
1349   06DB   C9               RET
1350                   ;
1351                   ; PASS 1 OF ASSEMBLER, USED TO FORM SYMBOL TABLE
1352                   ;
1353   06DC   CD6601   PAS1:   CALL    ZBUF            ;CLEAR BUFFER
1354   06DF   329410           STA     PASI            ;SET FOR PASS1
1355   06E2   21C710           LXI     H,IBUF          ;INITIALIZE LINE POINTER
1356   06E5   229610           SHLD    PNTR
1357   06E8   7E               MOV     A,M             ;FETCH CHARACTER
1358   06E9   FE20             CPI     ' '             ;CHECK FOR A BLANK
1359   06EB   CA1E07           JZ      OPC             ;JUMP IF NO LABLE
1360   06EE   FE2A             CPI     '*'             ;CHECK FOR COMMENT
1361   06F0   C8               RZ                      ;RETURN IF COMMENT
1362                   ;
1363                   ; PROCESS LABEL
1364                   ;
1365   06F1   CD200B           CALL    SLAB            ;GET AND CHECK LABEL
1366   06F4   DADF0A           JC      OP5             ;ERROR IN LABEL
1367   06F7   CAC70C           JZ      ERRD            ;DUPLICATE LABEL
1368   06FA   CD3507           CALL    LCHK            ;CHECK CHARACTER AFTER LABEL
1369   06FD   C2DF0A           JNZ     OP5             ;ERROR IF NO BLANK
1370   0700   0E05             MVI     C,LLAB          ;LENGTH OF LABELS
1371   0702   217E10           LXI     H,ABUF          ;SET BUFFER ADDRESS
1372   0705   7E       MLAB:   MOV     A,M             ;FETCH NEXT CHARACTER
1373   0706   12               STAX    D               ;STORE IN SYMBOL TABLE
1374   0707   13               INX     D
1375   0708   23               INX     H
1376   0709   0D               DCR     C
1377   070A   C20507           JNZ     MLAB
1378   070D   EB               XCHG
1379   070E   229010           SHLD    TABA            ;SAVE TABLE ADDRESS FOR EQU
1380   0711   3A9310           LDA     ASPC+1          ;FETCH PC (HIGH)
1381   0714   77               MOV     M,A
1382   0715   23               INX     H
1383   0716   3A9210           LDA     ASPC            ;FETCH PC (LOW)
1384   0719   77               MOV     M,A             ;STORE IN TABLE
1385   071A   219810           LXI     H,NOLA
1386   071D   34               INR     M               ;INCREMENT NUMBER OF LABELS
1387                   ;
1388                   ; PROCESS OPCODE
1389                   ;
1390   071E   CD6601   OPC:    CALL    ZBUF            ;ZERO WORKING BUFFER
1391   0721   CD0D09           CALL    SBLK            ;SCAN TO OPCODE
1392   0724   DA060B           JC      OERR            ;FOUND CARRIAGE RETURN
13931
1394 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1395+                                                      19:26  09/08/2018
1396+                                                                                      PAGE 25
1397      IMSAI SCS-1 REV. 2 06 OCT. 1976
1398
1399
1400   0727   CD750B           CALL    ALPS            ;PLACE OPCODE IN BUFFER
1401   072A   FE20             CPI     ' '             ;CHECK FOR BLANK AFTER OPCODE
1402   072C   DA650A           JC      OPCD            ;CR AFTER OPCODE
1403   072F   C2060B           JNZ     OERR            ;ERROR IF NO BLANK
1404   0732   C3650A           JMP     OPCD            ;CHECK OPCODE
1405                   ;
1406                   ; THIS ROUTINE CHECKS THE CHARACTER AFTER A LABEL
1407                   ; FOR A BLANK OR COLON
1408                   ;
1409   0735   2A9610   LCHK:   LHLD    PNTR
1410   0738   7E               MOV     A,M             ;GET CHARACTER AFTER LABEL
1411   0739   FE20             CPI     ' '             ;CHECK FOR BLANK
1412   073B   C8               RZ                      ;RETURN IF A BLANK
1413   073C   FE3A             CPI     ':'             ;CHECK FOR COLON
1414   073E   C0               RNZ
1415   073F   23               INX     H
1416   0740   229610           SHLD    PNTR            ;SAVE POINTER
1417   0743   C9               RET
1418                   ;
1419                   ; PROCESS ANY PSEUDO OPS THAT NEED TO BE IN PASS 1
1420                   ;
1421   0744   CD0D09   PSU1:   CALL    SBLK            ;SCAN TO OPERAND
1422   0747   1A               LDAX    D               ;FETCH VALUE
1423   0748   B7               ORA     A               ;SET FLAGS
1424   0749   CA6007           JZ      ORG1            ;ORG OPCODE
1425   074C   FA9007           JM      DAT1            ;DATA STATEMENT
1426   074F   E27507           JPO     EQU1            ;EQU OPCODE
1427   0752   FE05             CPI     5
1428   0754   DA8807           JC      RES1            ;RES OPCODE
1429   0757   C20109           JNZ     EASS            ;JUMP IF END
1430                   ; DO DW PSEUDO/OP
1431   075A   0E02     ACO1:   MVI     C,2             ;2 BYTE INSTRUCTION
1432   075C   AF               XRA     A               ;GET A ZERO
1433   075D   C3F50A           JMP     OCN1            ;ADD VALUE TO PROGRAM COUNTER
1434                   ; DO ORG PSUEDO OP
1435   0760   CD970B   ORG1:   CALL    ASCN            ;GET OPERAND
1436   0763   3AB210           LDA     OBUF            ;FETCH ERROR INDICATOR
1437   0766   FE20             CPI     ' '             ;CHECK FOR AN ERROR
1438   0768   C0               RNZ
1439   0769   229210           SHLD    ASPC            ;STORE NEW ORIGIN
1440   076C   3AC710           LDA     IBUF            ;GET FIRST CHARACTER
1441   076F   FE20             CPI     ' '             ;CHECK FOR AN ERROR
1442   0771   C8               RZ                      ;NO LABEL
1443   0772   C38007           JMP     EQUS            ;CHANGE LABEL VALUE
1444                   ; DO EQU PSUEDO-OP
1445   0775   CD970B   EQU1:   CALL    ASCN            ;GET OPERAND
1446   0778   3AC710           LDA     IBUF            ;FETCH 1ST CHARACTER
1447   077B   FE20             CPI     ' '             ;CHECK FOR LABEL
1448   077D   CA9F0C           JZ      ERRM            ;MISSING LABEL
1449   0780   EB       EQUS:   XCHG
1450   0781   2A9010           LHLD    TABA            ;SYMBOL TABLE ADDRESS
14511
1452 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1453+                                                      19:26  09/08/2018
1454+                                                                                      PAGE 26
1455      IMSAI SCS-1 REV. 2 06 OCT. 1976
1456
1457
1458   0784   72               MOV     M,D             ;STORE LABEL VALUE
1459   0785   23               INX     H
1460   0786   73               MOV     M,E
1461   0787   C9               RET
1462                   ; DO DS PSEUDO-OP
1463   0788   CD970B   RES1:   CALL    ASCN            ;GET OPERAND
1464   078B   44               MOV     B,H
1465   078C   4D               MOV     C,L
1466   078D   C3ED07           JMP     RES21           ;ADD VALUE TO PROGRAM COUNTER
1467                   ;
1468                   ; DO DB PSEUDO-OP
1469                   ;
1470   0790   C3F407   DAT1:   JMP     DAT2A
1471                   ;
1472                   ; PERFORM PASS 2 OF THE ASSEMBLER
1473                   ;
1474   0793   21B410   PAS2:   LXI     H,OBUF+2                ;SET OUTPUT BUFFER ADDRESS
1475   0796   3A9310           LDA     ASPC+1          ;FETCH PC (HIGH)
1476   0799   CD8902           CALL    BINH+3          ;CONVERT FOR OUTPUT
1477   079C   23               INX     H
1478   079D   3A9210           LDA     ASPC            ;FETCH PC(LOW)
1479   07A0   CD8902           CALL    BINH+3          ;CONVERT FOR OUTPUT
1480   07A3   23               INX     H
1481   07A4   229E10           SHLD    OIND            ;SAVE OUTPUT ADDRESS
1482   07A7   CD6601           CALL    ZBUF            ;CLEAR BUFFER
1483   07AA   21C710           LXI     H,IBUF          ;INITIALIZE LINE POINTER
1484   07AD   229610   PABL:   SHLD    PNTR            ;SAVE POINTER
1485   07B0   7E               MOV     A,M             ;FETCH FIRST CHARACTER
1486   07B1   FE20             CPI     ' '             ;CHECK FOR LABEL
1487   07B3   CA1E07           JZ      OPC             ;GET OPCODE
1488   07B6   FE2A             CPI     '*'             ;CHECK FOR COMMENT
1489   07B8   C8               RZ                      ;RETURN IF COMMENT
1490   07B9   CD200B           CALL    SLAB            ;SCAN OFF LABEL
1491   07BC   DAC20C           JC      ERRL            ;ERROR IN LABEL
1492   07BF   CD3507           CALL    LCHK            ;CHECK FOR A BLANK OR COLON
1493   07C2   C2C20C           JNZ     ERRL            ;ERROR IF NOT A BLANK
1494   07C5   C31E07           JMP     OPC
1495                   ;
1496                   ; PROCESS PSEUDO OPS FOR PASS2
1497                   ;
1498   07C8   1A       PSU2:   LDAX    D
1499   07C9   B7               ORA     A               ;SET FLAGS
1500   07CA   CA0C08           JZ      ORG2            ;ORG OPCODE
1501   07CD   FAF107           JM      DAT2            ;DATA OPCODE
1502   07D0   E2FA07           JPO     EQU2            ;EQUATE PSEUDO-OP
1503   07D3   FE05             CPI     5
1504   07D5   DAE107           JC      RES2            ;RES OPCODE
1505   07D8   C20109           JNZ     EASS            ;END OPCODE
1506                   ; DO DW OPCODE
1507   07DB   CDE108   ACO2:   CALL    TYS6            ;GET VALUE
1508   07DE   C35A07           JMP     ACO1
15091
1510 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1511+                                                      19:26  09/08/2018
1512+                                                                                      PAGE 27
1513      IMSAI SCS-1 REV. 2 06 OCT. 1976
1514
1515
1516                   ; DO DS PSEUDO-OP
1517   07E1   CD940B   RES2:   CALL    ASBL            ;GET OPERAND
1518   07E4   44               MOV     B,H
1519   07E5   4D               MOV     C,L
1520   07E6   2A8C10           LHLD    BBUF+2          ;FETCH STORAGE COUNTER
1521   07E9   09               DAD     B               ;ADD VALUE
1522   07EA   228C10           SHLD    BBUF+2
1523   07ED   AF       RES21:  XRA     A               ;GET A ZERO
1524   07EE   C3F80A           JMP     OCN2
1525                   ; DO DB PSEUDO-OP
1526   07F1   CDA008   DAT2:   CALL    TY55            ;GET OPERAND
1527   07F4   AF       DAT2A:  XRA     A               ;MAKE ZERO
1528   07F5   0E01             MVI     C,1             ;BYTE COUNT
1529   07F7   C3F50A           JMP     OCN1
1530                   ;
1531                   ; HANDLE EQUATES ON 2ND PASS
1532                   ;
1533   07FA   CD940B   EQU2:   CALL    ASBL            ;GET OPERAND INTO HL AND
1534                                                   ;  FALL INTO NEXT ROUTINE
1535                   ;
1536                   ; STORE CONTENTS OF HL AS HEX ASCII AT OBUF+2
1537                   ;   ON RETURN, DE HOLDS VALUE WHICH WAS IN HL.
1538                   ;
1539   07FD   EB       BINAD:  XCHG                    ;PUT VALUE INTO DE
1540   07FE   21B410           LXI     H,OBUF+2                ;POINTER TO ADDR IN OBUF
1541   0801   7A               MOV     A,D             ;STORE HI BYTE
1542   0802   CD8902           CALL    BINH+3
1543   0805   23               INX     H
1544   0806   7B               MOV     A,E             ;STORE LOW BYTE...
1545   0807   CD8902           CALL    BINH+3
1546   080A   23               INX     H
1547   080B   C9               RET
1548                   ; DO ORG PSEUDO-OP
1549   080C   CD940B   ORG2:   CALL    ASBL            ;GET NEW ORIGIN
1550   080F   3AB210           LDA     OBUF            ;GET ERROR INDICATOR
1551   0812   FE20             CPI     ' '             ;CHECK FOR AN ERROR
1552   0814   C0               RNZ                     ;DON?T MODIFY PC IF ERROR
1553   0815   CDFD07           CALL    BINAD           ;STORE NEW ADDR IN OBUF
1554   0818   2A9210           LHLD    ASPC            ;FETCH PC
1555   081B   EB               XCHG
1556   081C   229210           SHLD    ASPC            ;STORE NEW PC
1557   081F   7D               MOV     A,L
1558   0820   93               SUB     E               ;FORM DIFFERENCE OF ORIGINS
1559   0821   5F               MOV     E,A
1560   0822   7C               MOV     A,H
1561   0823   9A               SBB     D
1562   0824   57               MOV     D,A
1563   0825   2A8C10           LHLD    BBUF+2          ;FETCH STORAGE POINTER
1564   0828   19               DAD     D               ;MODIFY
1565   0829   228C10           SHLD    BBUF+2          ;SAVE
1566   082C   C9               RET
15671
1568 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1569+                                                      19:26  09/08/2018
1570+                                                                                      PAGE 28
1571      IMSAI SCS-1 REV. 2 06 OCT. 1976
1572
1573
1574                   ;
1575                   ; PROCESS 1 BYTE INSTRUCTIONS WITHOUT OPERANDS
1576                   ;
1577   082D   CDEE08   TYP1:   CALL    ASTO            ;STORE VALUE IN MEMORY
1578   0830   C9               RET
1579                   ;
1580                   ; PROCESS STAX AND LDAX INSTRUCTIONS
1581                   ;
1582   0831   CD940B   TYP2:   CALL    ASBL            ;FETCH OPERAND
1583   0834   C4810C           CNZ     ERRR            ;ILLEGAL REGISTER
1584   0837   7D               MOV     A,L             ;GET LOW ORDER OPERAND
1585   0838   B7               ORA     A               ;SET FLAGS
1586   0839   CA5508           JZ      TY31            ;OPERAND = 0
1587   083C   FE02             CPI     2               ;OPERAND = 2
1588   083E   C4810C           CNZ     ERRR            ;ILLEGAL REGISTER
1589   0841   C35508           JMP     TY31
1590                   ;
1591                   ; PROCESS PUSH, POP, INX, DCX, DAD INSTRUCTIONS
1592                   ;
1593   0844   CD940B   TYP3:   CALL    ASBL            ;FETCH OPERAND
1594   0847   C4810C           CNZ     ERRR            ;ILLEGAL REGISTER
1595   084A   7D               MOV     A,L             ;GET LOW ORDER OPERAND
1596   084B   0F               RRC                     ;CHECK LOW ORDER BIT
1597   084C   DC810C           CC      ERRR            ;ILLEGAL REGISTER
1598   084F   17               RAL                     ;RESTORE
1599   0850   FE08             CPI     8
1600   0852   D4810C           CNC     ERRR            ;ILLEGAL REGISTER
1601   0855   07       TY31:   RLC                     ;MULTIPLY BY 8
1602   0856   17               RAL
1603   0857   17               RAL
1604   0858   47       TY32:   MOV     B,A
1605   0859   1A               LDAX    D               ;FETCH OPCODE BASE
1606   085A   80               ADD     B               ;FORM OPCODE
1607   085B   FE76             CPI     118             ;CHECK FOR MOV M,M
1608   085D   CC810C           CZ      ERRR            ;ILLEGAL REGISTER
1609   0860   C32D08           JMP     TYP1
1610                   ;
1611                   ; PROCESS ACCUMULATOR, INR,DCR,MOV,RST INSTRUCTIONS
1612                   ;
1613   0863   CD940B   TYP4:   CALL    ASBL            ;FETCH OPERAND
1614   0866   C4810C           CNZ     ERRR            ;ILLEGAL REGISTER
1615   0869   7D               MOV     A,L             ;GET LOW ORDER OPERAND
1616   086A   FE08             CPI     8
1617   086C   D4810C           CNC     ERRR            ;ILLEGAL REGISTER
1618   086F   1A               LDAX    D               ;FETCH OPCODE BASE
1619   0870   FE40             CPI     64              ;CHECK FOR MOV INSTRUCTION
1620   0872   CA8108           JZ      TY41
1621   0875   FEC7             CPI     199
1622   0877   7D               MOV     A,L
1623   0878   CA5508           JZ      TY31            ;RST INSTRUCTION
1624   087B   FA5808           JM      TY32            ;ACCUMULATOR INSTRUCTION
16251
1626 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1627+                                                      19:26  09/08/2018
1628+                                                                                      PAGE 29
1629      IMSAI SCS-1 REV. 2 06 OCT. 1976
1630
1631
1632   087E   C35508           JMP     TY31            ;INR, DCR
1633                   ; PROCESS MOV INSTRUCTION
1634   0881   29       TY41:   DAD     H               ;MULTIPLY OPERAND BY 8
1635   0882   29               DAD     H
1636   0883   29               DAD     H
1637   0884   85               ADD     L               ;FORM OPCODE
1638   0885   12               STAX    D               ;SAVE OPCODE
1639   0886   CDBF08           CALL    MPNT
1640   0889   CD970B           CALL    ASCN
1641   088C   C4810C           CNZ     ERRR            ;INCREMENT POINTER
1642   088F   7D               MOV     A,L
1643   0890   FE08             CPI     8
1644   0892   D4810C           CNC     ERRR            ;ILLEGAL REGISTER
1645   0895   C35808           JMP     TY32
1646                   ;
1647                   ; PROCESS IMMEDIATE INSTRUCTIONS
1648                   ; IMMEDIATE BYTE CAN BETWEEN -256 AND +255
1649                   ; MVI INSTRUCTION IS A SPECIAL CASE AND CONTAINS
1650                   ; 2 ARGUMENTS IN OPERAND
1651                   ;
1652   0898   FE06     TYP5:   CPI     6               ;CHECK FOR MVI
1653   089A   CCAD08           CZ      TY56
1654   089D   CDEE08           CALL    ASTO            ;STORE OBJECT BYTE
1655   08A0   CD940B   TY55:   CALL    ASBL            ;GET IMMEDIATE ARGUMENT
1656   08A3   3C               INR     A
1657   08A4   FE02             CPI     2               ;CHECK OPERAND FOR RANGE
1658   08A6   D49A0C           CNC     ERRV
1659   08A9   7D               MOV     A,L
1660   08AA   C32D08           JMP     TYP1
1661                   ;
1662                   ; FETCH 1ST ARG FOR MVI AND LXI INSTRUCTIONS
1663                   ;
1664   08AD   CD940B   TY56:   CALL    ASBL            ;FETCH ARG
1665   08B0   C4810C           CNZ     ERRR            ;ILLEGAL REGISTER
1666   08B3   7D               MOV     A,L             ;GET LOW ORDER ARGUMENT
1667   08B4   FE08             CPI     8
1668   08B6   D4810C           CNC     ERRR            ;ILLEGAL REGISTER
1669   08B9   29               DAD     H
1670   08BA   29               DAD     H
1671   08BB   29               DAD     H
1672   08BC   1A               LDAX    D               ;FETCH OPCODE BASE
1673   08BD   85               ADD     L               ;FOR OPCODE
1674   08BE   5F               MOV     E,A             ;SAVE OBJECT BYTE
1675   08BF   2A9610   MPNT:   LHLD    PNTR            ;FETCH POINTER
1676   08C2   7E               MOV     A,M             ;FETCH CHARACTER
1677   08C3   FE2C             CPI     ','             ;CHECK FOR COMMA
1678   08C5   23               INX     H               ;INCREMENT POINTER
1679   08C6   229610           SHLD    PNTR
1680   08C9   C28A0C           JNZ     ERRS            ;SYNTAX ERROR IF NO COMMA
1681   08CC   7B               MOV     A,E
1682   08CD   C9               RET
16831
1684 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1685+                                                      19:26  09/08/2018
1686+                                                                                      PAGE 30
1687      IMSAI SCS-1 REV. 2 06 OCT. 1976
1688
1689
1690                   ;
1691                   ; PROCESS 3 BYTE INSTRUCTIONS
1692                   ; LXI INSTRUCTION IS A SPECIAL CASE
1693                   ;
1694   08CE   FE01     TYP6:   CPI     1               ;CHECK FOR LXI INSTRUCTION
1695   08D0   C2DE08           JNZ     TY6             ;JUMP IF NOT LXI
1696   08D3   CDAD08           CALL    TY56            ;GET REGISTER
1697   08D6   E608             ANI     08H             ;CHECK FOR ILLEGAL REGISTER
1698   08D8   C4810C           CNZ     ERRR            ;REGISTER ERROR
1699   08DB   7B               MOV     A,E             ;GET OPCODE
1700   08DC   E6F7             ANI     0F7H            ;CLEAR BIT IN ERROR
1701   08DE   CDEE08   TY6:    CALL    ASTO            ;STORE OBJECT BYTE
1702   08E1   CD940B   TYS6:   CALL    ASBL            ;FETCH OPERAND
1703   08E4   7D               MOV     A,L
1704   08E5   54               MOV     D,H
1705   08E6   CDEE08           CALL    ASTO            ;STORE 2ND BYTE
1706   08E9   7A               MOV     A,D
1707   08EA   C32D08           JMP     TYP1
1708   08ED   C9               RET
1709                   ;
1710                   ; THIS ROUTINE IS USED TO STORE OBJECT CODE PRODUCED
1711                   ; BY THE ASSEMBLER DURING PASS 2 INTO MEMORY
1712                   ;
1713   08EE   2A8C10   ASTO:   LHLD    BBUF+2          ;FETCH STORAGE ADDRESS
1714   08F1   77               MOV     M,A             ;STORE OBJECT BYTE
1715   08F2   23               INX     H               ;INCREMENT LOCATION
1716   08F3   228C10           SHLD    BBUF+2
1717   08F6   2A9E10           LHLD    OIND            ;FETCH OUTPUT ADDRESS
1718   08F9   23               INX     H
1719   08FA   CD8902           CALL    BINH+3          ;CONVERT OBJECT BYTE
1720   08FD   229E10           SHLD    OIND
1721   0900   C9               RET
1722                   ;
1723                   ; GET HERE WHEN END PSEUDO-OP IS FOUND OR WHEN
1724                   ; END-OF-FILE OCCURS IN SOURCE FILE.  CONTROL IS SET
1725                   ; FOR EITHER PASS 2 OR ASSEMBLY TERMINATOR IF FINISHED
1726                   ;
1727   0901   3A9410   EASS:   LDA     PASI            ;FETCH PASS INDICATOR
1728   0904   B7               ORA     A               ;SET FLAGS
1729   0905   C26700           JNZ     EOR             ;JUMP IF FINISHED
1730   0908   3E01             MVI     A,1             ;PASS INDICATOR FOR 2ND PASS
1731   090A   C37A06           JMP     ASM3            ;DO 2ND PASS
1732                   ;
1733                   ; THIS ROUTINE SCANS THROUGH A CHARACTER STRING UNTIL
1734                   ; THE FIRST NON-BLANK CHARACTER IS FOUND
1735                   ;
1736                   ; ON RETURN, CARRY SET INDICATES A CARRIAGE RETURN
1737                   ; AS  FIRST NON-BLANK CHARACTER.
1738                   ;
1739   090D   2A9610   SBLK:   LHLD    PNTR            ;FETCH ADDRESS
1740   0910   7E       SBL1:   MOV     A,M             ;FETCH CHARACTER
17411
1742 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1743+                                                      19:26  09/08/2018
1744+                                                                                      PAGE 31
1745      IMSAI SCS-1 REV. 2 06 OCT. 1976
1746
1747
1748   0911   FE20             CPI     ' '             ;CHECK FOR BLANK
1749   0913   C0               RNZ                     ;RETURN IF NON-BLANK
1750   0914   23       SBL2:   INX     H               ;INCREMENT
1751   0915   229610           SHLD    PNTR            ;SAVE POINTER
1752   0918   C31009           JMP     SBL1
1753                   ;
1754                   ; THIS ROUTINE IS USED TO CHECK THE CONDITION
1755                   ; CODE NMEUMONICS FOR CONDITIONAL JUMPS, CALLS,
1756                   ; AND RETURNS.
1757                   ;
1758   091B   217F10   COND:   LXI     H,ABUF+1
1759   091E   227410           SHLD    ADDS
1760   0921   0602             MVI     B,2             ;2 CHARACTERS
1761   0923   CD500A           CALL    COPC
1762   0926   C9               RET
1763                   ;
1764                   ; THE FOLLOWING IS THE OPCODE TABLE
1765                   ;
1766   0927   4F5247   OTAB:   DB      'ORG'
1767   092A   00               DB      0
1768   092B   00               DB      0
1769   092C   455155           DB      'EQU'
1770   092F   00               DB      0
1771   0930   01               DB      1
1772   0931   4442             DB      'DB'
1773   0933   00               DB      0
1774   0934   00               DB      0
1775   0935   FF               DB      -1 AND 0FFH
1776   0936   4453             DB      'DS'
1777   0938   00               DB      0
1778   0939   00               DB      0
1779   093A   03               DB      3
1780   093B   4457             DB      'DW'
1781   093D   00               DB      0
1782   093E   00               DB      0
1783   093F   05               DB      5
1784   0940   454E44           DB      'END'
1785   0943   00               DB      0
1786   0944   06               DB      6
1787   0945   00               DB      0
1788   0946   484C54           DB      'HLT'
1789   0949   76               DB      118
1790   094A   524C43           DB      'RLC'
1791   094D   07               DB      7
1792   094E   525243           DB      'RRC'
1793   0951   0F               DB      15
1794   0952   52414C           DB      'RAL'
1795   0955   17               DB      23
1796   0956   524152           DB      'RAR'
1797   0959   1F               DB      31
1798   095A   524554           DB      'RET'
17991
1800 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1801+                                                      19:26  09/08/2018
1802+                                                                                      PAGE 32
1803      IMSAI SCS-1 REV. 2 06 OCT. 1976
1804
1805
1806   095D   C9               DB      201
1807   095E   434D41           DB      'CMA'
1808   0961   2F               DB      47
1809   0962   535443           DB      'STC'
1810   0965   37               DB      55
1811   0966   444141           DB      'DAA'
1812   0969   27               DB      39
1813   096A   434D43           DB      'CMC'
1814   096D   3F               DB      63
1815   096E   4549             DB      'EI'
1816   0970   00               DB      0
1817   0971   FB               DB      251
1818   0972   4449             DB      'DI'
1819   0974   00               DB      0
1820   0975   F3               DB      243
1821   0976   4E4F50           DB      'NOP'
1822   0979   00               DB      0
1823   097A   00               DB      0
1824   097B   58434847         DB      'XCHG'
1825   097F   EB               DB      235
1826   0980   5854484C         DB      'XTHL'
1827   0984   E3               DB      227
1828   0985   5350484C         DB      'SPHL'
1829   0989   F9               DB      249
1830   098A   5043484C         DB      'PCHL'
1831   098E   E9               DB      233
1832   098F   00               DB      0
1833   0990   53544158         DB      'STAX'
1834   0994   02               DB      2
1835   0995   4C444158         DB      'LDAX'
1836   0999   0A               DB      10
1837   099A   00               DB      0
1838   099B   50555348         DB      'PUSH'
1839   099F   C5               DB      197
1840   09A0   504F50           DB      'POP'
1841   09A3   00               DB      0
1842   09A4   C1               DB      193
1843   09A5   494E58           DB      'INX'
1844   09A8   00               DB      0
1845   09A9   03               DB      3
1846   09AA   444358           DB      'DCX'
1847   09AD   00               DB      0
1848   09AE   0B               DB      11
1849   09AF   444144           DB      'DAD'
1850   09B2   00               DB      0
1851   09B3   09               DB      9
1852   09B4   00               DB      0
1853   09B5   494E52           DB      'INR'
1854   09B8   04               DB      4
1855   09B9   444352           DB      'DCR'
1856   09BC   05               DB      5
18571
1858 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1859+                                                      19:26  09/08/2018
1860+                                                                                      PAGE 33
1861      IMSAI SCS-1 REV. 2 06 OCT. 1976
1862
1863
1864   09BD   4D4F56           DB      'MOV'
1865   09C0   40               DB      64
1866   09C1   414444           DB      'ADD'
1867   09C4   80               DB      128
1868   09C5   414443           DB      'ADC'
1869   09C8   88               DB      136
1870   09C9   535542           DB      'SUB'
1871   09CC   90               DB      144
1872   09CD   534242           DB      'SBB'
1873   09D0   98               DB      152
1874   09D1   414E41           DB      'ANA'
1875   09D4   A0               DB      160
1876   09D5   585241           DB      'XRA'
1877   09D8   A8               DB      168
1878   09D9   4F5241           DB      'ORA'
1879   09DC   B0               DB      176
1880   09DD   434D50           DB      'CMP'
1881   09E0   B8               DB      184
1882   09E1   525354           DB      'RST'
1883   09E4   C7               DB      199
1884   09E5   00               DB      0
1885   09E6   414449           DB      'ADI'
1886   09E9   C6               DB      198
1887   09EA   414349           DB      'ACI'
1888   09ED   CE               DB      206
1889   09EE   535549           DB      'SUI'
1890   09F1   D6               DB      214
1891   09F2   534249           DB      'SBI'
1892   09F5   DE               DB      222
1893   09F6   414E49           DB      'ANI'
1894   09F9   E6               DB      230
1895   09FA   585249           DB      'XRI'
1896   09FD   EE               DB      238
1897   09FE   4F5249           DB      'ORI'
1898   0A01   F6               DB      246
1899   0A02   435049           DB      'CPI'
1900   0A05   FE               DB      254
1901   0A06   494E             DB      'IN'
1902   0A08   00               DB      0
1903   0A09   DB               DB      219
1904   0A0A   4F5554           DB      'OUT'
1905   0A0D   D3               DB      211
1906   0A0E   4D5649           DB      'MVI'
1907   0A11   06               DB      6
1908   0A12   00               DB      0
1909   0A13   4A4D50           DB      'JMP'
1910   0A16   00               DB      0
1911   0A17   C3               DB      195
1912   0A18   43414C4C         DB      'CALL'
1913   0A1C   CD               DB      205
1914   0A1D   4C5849           DB      'LXI'
19151
1916 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1917+                                                      19:26  09/08/2018
1918+                                                                                      PAGE 34
1919      IMSAI SCS-1 REV. 2 06 OCT. 1976
1920
1921
1922   0A20   00               DB      0
1923   0A21   01               DB      1
1924   0A22   4C4441           DB      'LDA'
1925   0A25   00               DB      0
1926   0A26   3A               DB      58
1927   0A27   535441           DB      'STA'
1928   0A2A   00               DB      0
1929   0A2B   32               DB      50
1930   0A2C   53484C44         DB      'SHLD'
1931   0A30   22               DB      34
1932   0A31   4C484C44         DB      'LHLD'
1933   0A35   2A               DB      42
1934   0A36   00               DB      0
1935                   ;       CONDITION       CODE    TABLE
1936   0A37   4E5A             DB      'NZ'
1937   0A39   00               DB      0
1938   0A3A   5A               DB      'Z'
1939   0A3B   00               DB      0
1940   0A3C   08               DB      8
1941   0A3D   4E43             DB      'NC'
1942   0A3F   10               DB      16
1943   0A40   43               DB      'C'
1944   0A41   00               DB      0
1945   0A42   18               DB      24
1946   0A43   504F             DB      'PO'
1947   0A45   20               DB      32
1948   0A46   5045             DB      'PE'
1949   0A48   28               DB      40
1950   0A49   50               DB      'P'
1951   0A4A   00               DB      0
1952   0A4B   30               DB      48
1953   0A4C   4D               DB      'M'
1954   0A4D   00               DB      0
1955   0A4E   38               DB      56
1956   0A4F   00               DB      0
1957                   ;
1958                   ; THIS ROUTINE IS USED TO CHECK A GIVEN OPCODE
1959                   ; AGAINST THE LEGAL OPCODES IN THE OPCODE TABLE
1960                   ;
1961   0A50   2A7410   COPC:   LHLD    ADDS
1962   0A53   1A               LDAX    D               ;FETCH CHARACTER
1963   0A54   B7               ORA     A               ;SET FLAGS
1964   0A55   CA620A           JZ      COP1            ;JUMP IF TERMINATION CHARACTER
1965   0A58   48               MOV     C,B
1966   0A59   CD5301           CALL    SEAR
1967   0A5C   1A               LDAX    D
1968   0A5D   C8               RZ                      ;RETURN IF A MATCH
1969   0A5E   13               INX     D               ; NEXT STRING
1970   0A5F   C3500A           JMP     COPC            ;CONTINUE SEARCH
1971   0A62   3C       COP1:   INR     A               ;CLEAR ZERO FLAG
1972   0A63   13               INX     D               ;INCREMENT ADDRESS
19731
1974 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
1975+                                                      19:26  09/08/2018
1976+                                                                                      PAGE 35
1977      IMSAI SCS-1 REV. 2 06 OCT. 1976
1978
1979
1980   0A64   C9               RET
1981                   ;
1982                   ; THIS ROUTINE CHECKS THE LEGAL OPCODES IN BOTH PASS 1
1983                   ; AND PASS 2.  IN PASS 1 THE PROGRAM COUNTER IS INCRE-
1984                   ; MENTED BY THE CORRECT NUMBER OF BYTES.  AN ADDRESS IS
1985                   ; ALSO SET SO THAT AN INDEXED JUMP CAN BE MADE TO
1986                   ; PROCESS THE OPCODE FOR PASS 2.
1987                   ;
1988   0A65   217E10   OPCD:   LXI     H,ABUF          ;GET ADDRESS
1989   0A68   227410           SHLD    ADDS
1990   0A6B   112709           LXI     D,OTAB          ;OPCODE TABLE ADDRESS
1991   0A6E   0604             MVI     B,4             ;CHARACTER COUNT
1992   0A70   CD500A           CALL    COPC            ;CHECK OPCODE
1993   0A73   CA0E0B           JZ      PSEU            ;JUMP IF PSEUDO-OP
1994   0A76   05               DCR     B               ;3-CHARACTER OPCODES
1995   0A77   CD500A           CALL    COPC
1996   0A7A   CA810A           JZ      OP1
1997   0A7D   04               INR     B               ;4 CHARACTER OPCODES
1998   0A7E   CD500A           CALL    COPC
1999   0A81   212D08   OP1:    LXI     H,TYP1          ;TYPE 1 INSTRUCTIONS
2000   0A84   0E01     OP2:    MVI     C,1             ;1 BYTE INSTRUCTIONS
2001   0A86   CAE10A           JZ      OCNT
2002                   ;
2003   0A89   CD500A   OPC2:   CALL    COPC            ;CHECK FOR STAX, LDAX
2004   0A8C   213108           LXI     H,TYP2
2005   0A8F   CA840A           JZ      OP2
2006   0A92   CD500A           CALL    COPC            ;CHECK FOR PUSH,POP,INX
2007                                                   ; DCX AND DAD
2008   0A95   214408           LXI     H,TYP3
2009   0A98   CA840A           JZ      OP2
2010   0A9B   05               DCR     B               ;3 CHAR OPCODES
2011   0A9C   CD500A           CALL    COPC            ;ACCUMULATOR INSTRUCTIONS,
2012                                                   ; INR, DCR, MOV, RST
2013   0A9F   216308           LXI     H,TYP4
2014   0AA2   CA840A           JZ      OP2
2015                   ;
2016   0AA5   CD500A   OPC3:   CALL    COPC            ;IMMEDIATE INSTRUCTIONS
2017   0AA8   219808           LXI     H,TYP5
2018   0AAB   0E02             MVI     C,2             ;2 BYTE INSTRUCTIONS
2019   0AAD   CAE10A           JZ      OCNT
2020   0AB0   04               INR     B               ;4 CHARACTER OPCODES
2021   0AB1   CD500A           CALL    COPC            ;JMP, CALL, LIX, LDA, STA,
2022                                                   ; LHLD, SHLD OPCODES
2023   0AB4   CADC0A           JZ      OP4
2024   0AB7   CD1B09           CALL    COND            ;CONDITIONAL INSTRUCTIONS
2025   0ABA   C2060B           JNZ     OERR            ;ILLEGAL OPCODE
2026   0ABD   C6C0             ADI     192             ;ADD BASE VALUE TO RETURN
2027   0ABF   57               MOV     D,A
2028   0AC0   0603             MVI     B,3             ;3 CHARACTER OPCODES
2029   0AC2   3A7E10           LDA     ABUF            ;FETCH FIRST CHARACTER
2030   0AC5   4F               MOV     C,A             ;SAVE CHARACTER
20311
2032 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2033+                                                      19:26  09/08/2018
2034+                                                                                      PAGE 36
2035      IMSAI SCS-1 REV. 2 06 OCT. 1976
2036
2037
2038   0AC6   FE52             CPI     'R'             ;CONDITIONAL RETURN
2039   0AC8   7A               MOV     A,D
2040   0AC9   CA810A           JZ      OP1
2041   0ACC   79               MOV     A,C
2042   0ACD   14               INR     D               ;FORM CONDITIONAL JUMP
2043   0ACE   14               INR     D
2044   0ACF   FE4A             CPI     'J'             ;CONDITIONAL JUMP
2045   0AD1   CADB0A           JZ      OPAD
2046   0AD4   FE43             CPI     'C'             ;CONDITIONAL CALL
2047   0AD6   C2060B           JNZ     OERR            ;ILLEGAL OPCODE
2048   0AD9   14               INR     D               ;FORM CONDITIONAL CALL
2049   0ADA   14               INR     D
2050   0ADB   7A       OPAD:   MOV     A,D             ;GET OPCODE
2051   0ADC   21CE08   OP4:    LXI     H,TYP6
2052   0ADF   0E03     OP5:    MVI     C,3             ;3 BYTE INSTRUCTION
2053   0AE1   329D10   OCNT:   STA     TEMP            ;SAVE OPCODE
2054                   ;
2055                   ; CHECK FOR OPCODE ONLY CONTAINING THE CORRECT NUMBER OF
2056                   ; CHARACTERS.  THUS ADDQ, SAY, WOULD GIVE AN ERROR
2057                   ;
2058   0AE4   3E7E             MVI     A,ABUF AND 0FFH ;LOAD BUFFER ADDRESS
2059   0AE6   80               ADD     B               ;ADD LENGTH OF BUFFER
2060   0AE7   5F               MOV     E,A
2061   0AE8   3E10             MVI     A,ABUF/256
2062   0AEA   CE00             ACI     0               ;GET HIGH ORDER ADDRESS
2063   0AEC   57               MOV     D,A
2064   0AED   1A               LDAX    D               ;FETCH CHARACTER AFTER OPCODE
2065   0AEE   B7               ORA     A               ;IT SHOULD BE ZERO
2066   0AEF   C2060B           JNZ     OERR            ;OPCODE ERROR
2067   0AF2   3A9410           LDA     PASI            ;FETCH PASS INDICATOR
2068   0AF5   0600     OCN1:   MVI     B,0
2069   0AF7   EB               XCHG
2070   0AF8   2A9210   OCN2:   LHLD    ASPC            ;FETCH PROGRAM COUNTER
2071   0AFB   09               DAD     B               ;ADD IN BYTE COUNT
2072   0AFC   229210           SHLD    ASPC            ;STORE PC
2073   0AFF   B7               ORA     A               ;WHICH PASS?
2074   0B00   C8               RZ                      ;RETURN IF PASS 1
2075   0B01   3A9D10           LDA     TEMP            ;FETCH OPCODE
2076   0B04   EB               XCHG
2077   0B05   E9               PCHL
2078                   ;
2079   0B06   21AD0C   OERR:   LXI     H,ERRO          ;GET ERROR ADDRESS
2080   0B09   0E03             MVI     C,3             ;LEAVE 3 BYTES FOR PATCH
2081   0B0B   C3F20A           JMP     OCN1-3
2082                   ;
2083   0B0E   218210   PSEU:   LXI     H,ABUF+4                ;SET BUFFER ADDRESS
2084   0B11   7E               MOV     A,M             ;FETCH CHARACTER AFTER OPCODE
2085   0B12   B7               ORA     A               ;SHOULD BE A ZERO
2086   0B13   C2060B           JNZ     OERR
2087   0B16   3A9410           LDA     PASI            ;FETCH PASS INDICATOR
2088   0B19   B7               ORA     A
20891
2090 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2091+                                                      19:26  09/08/2018
2092+                                                                                      PAGE 37
2093      IMSAI SCS-1 REV. 2 06 OCT. 1976
2094
2095
2096   0B1A   CA4407           JZ      PSU1
2097   0B1D   C3C807           JMP     PSU2
2098                   ;
2099                   ; THIS ROUTINE IS USED TO PROCESS LABELS.
2100                   ; IT CHECKS TO SEE IF A LABEL IS IN THE SYMBOL TABLE
2101                   ; OR NOT.  ON RETURN, Z=1 INDICATES A MATCH WAS FOUND
2102                   ; AND H,L CONTAIN THE VALUE ASSOCIATED WITH THE LABEL.
2103                   ; THE REGISTER NAMES A, B, C, D, E, H, L, P, AND S ARE
2104                   ; PRE-DEFINED AND NEED NOT BE ENTERED BY THE USER.
2105                   ; ON RETURN, C=1 INDICATES A LABEL ERROR.
2106                   ;
2107   0B20   FE41     SLAB:   CPI     'A'             ;CHECK FOR LEGAL CHARACTER
2108   0B22   D8               RC
2109   0B23   FE5B             CPI     'Z'+1           ;CHECK FOR ILLEGAL CHARACTER
2110   0B25   3F               CMC
2111   0B26   D8               RC                      ;RETURN IF ILLEGAL CHARACTER
2112   0B27   CD750B           CALL    ALPS            ;PLACE SYMBOL IN BUFFER
2113   0B2A   217E10           LXI     H,ABUF          ;SET BUFFER ADDRESS
2114   0B2D   227410           SHLD    ADDS            ;SAVE ADDRESS
2115   0B30   05               DCR     B               ;CHECK IF ONE CHARACTER
2116   0B31   C2440B           JNZ     SLA1
2117                   ; CHECK IF PREFEFINED REGISTER NAME
2118   0B34   04               INR     B               ;SET B=1
2119   0B35   11600B           LXI     D,RTAB          ;REGISTER NAME TABLE
2120   0B38   CD500A           CALL    COPC            ;CHECK NAME OF REGISTER
2121   0B3B   C2440B           JNZ     SLA1            ;NOT A PREFEFINED REGIGTER
2122   0B3E   6F               MOV     L,A             ;SET VALUE (HIGH)
2123   0B3F   2600             MVI     H,0
2124   0B41   C35A0B           JMP     SLA2
2125   0B44   3A9810   SLA1:   LDA     NOLA            ;FETCH SYMBOL COUNT
2126   0B47   47               MOV     B,A
2127   0B48   111A11           LXI     D,SYMT          ;SET SYMBOL TABLE ADDRESS
2128   0B4B   B7               ORA     A               ;ARE THERE ANY LABELS?
2129   0B4C   CA5D0B           JZ      SLA3            ;JUMP IF NO LABELS
2130   0B4F   3E05             MVI     A,LLAB          ;FETCH LENGTH OF LABEL
2131   0B51   329510           STA     NCHR
2132   0B54   CD3C01           CALL    COMS            ;CHECK TABLE
2133   0B57   4C               MOV     C,H             ;SWAP H AND L
2134   0B58   65               MOV     H,L
2135   0B59   69               MOV     L,C
2136   0B5A   37       SLA2:   STC                     ;SET CARRY
2137   0B5B   3F               CMC                     ;CLEAR CARRY
2138   0B5C   C9               RET                     ;RETURN
2139   0B5D   3C       SLA3:   INR     A               ;CLEAR ZERO FLAG
2140   0B5E   B7               ORA     A               ;CLEAR CARRY
2141   0B5F   C9               RET
2142                   ;
2143                   ; PREDEFINE REGISTER VALUES IN THIS TABLE
2144                   ;
2145   0B60   41       RTAB:   DB      'A'
2146   0B61   07               DB      7
21471
2148 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2149+                                                      19:26  09/08/2018
2150+                                                                                      PAGE 38
2151      IMSAI SCS-1 REV. 2 06 OCT. 1976
2152
2153
2154   0B62   42               DB      'B'
2155   0B63   00               DB      0
2156   0B64   43               DB      'C'
2157   0B65   01               DB      1
2158   0B66   44               DB      'D'
2159   0B67   02               DB      2
2160   0B68   45               DB      'E'
2161   0B69   03               DB      3
2162   0B6A   48               DB      'H'
2163   0B6B   04               DB      4
2164   0B6C   4C               DB      'L'
2165   0B6D   05               DB      5
2166   0B6E   4D               DB      'M'
2167   0B6F   06               DB      6
2168   0B70   50               DB      'P'
2169   0B71   06               DB      6
2170   0B72   53               DB      'S'
2171   0B73   06               DB      6
2172   0B74   00               DB      0               ;END OF TABLE INDICATOR.
2173                   ;
2174                   ; THIS ROUTINE SCANS THE INPUT LINE AND PLACES TH
2175                   ; OPCODES AND LABELS IN THE BUFFER.  THE SCAN TERMINATES
2176                   ; WHEN A CHARACTER OTHER THAN 0-9 OR A-Z IS FOUND.
2177                   ;
2178   0B75   0600     ALPS:   MVI     B,0             ;SET COUNT
2179   0B77   12       ALP1:   STAX    D               ;STORE CHARACTER IN BUFFER
2180   0B78   04               INR     B               ;INCREMENT COUNT
2181   0B79   78               MOV     A,B             ;FETCH COUNT
2182   0B7A   FE0B             CPI     11              ;MAXIMUM BUFFER SIZE
2183   0B7C   D0               RNC                     ;RETURN IF BUFFER FILLED
2184   0B7D   13               INX     D               ;INCREMENT BUFFER
2185   0B7E   23               INX     H               ;INCREMENT INPUT POINTER
2186   0B7F   229610           SHLD    PNTR            ;SAVE LINE POINTER
2187   0B82   7E               MOV     A,M             ;FETCH CHARACTER
2188   0B83   FE30             CPI     '0'             ;CHECK FOR ILLEGAL CHARACTERS
2189   0B85   D8               RC
2190   0B86   FE3A             CPI     '9'+1
2191   0B88   DA770B           JC      ALP1
2192   0B8B   FE41             CPI     'A'
2193   0B8D   D8               RC
2194   0B8E   FE5B             CPI     'Z'+1
2195   0B90   DA770B           JC      ALP1
2196   0B93   C9               RET
2197                   ;
2198                   ; THIS ROUTINE IS USED TO SCAN THROUGH THE INPUT LINE
2199                   ; TO FETCH THE VALUE OF THE OPERAND FIELD.  ON RETURN,
2200                   ; THE VALUE OF THE OPERAND IS CONTAINED IN REG?S H,L
2201                   ;
2202   0B94   CD0D09   ASBL:   CALL    SBLK            ;GET 1ST ARGUMENT
2203   0B97   210000   ASCN:   LXI     H,0             ;GET A ZERO
2204   0B9A   229A10           SHLD    OPRD            ;INITIALIZE OPERAND
22051
2206 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2207+                                                      19:26  09/08/2018
2208+                                                                                      PAGE 39
2209      IMSAI SCS-1 REV. 2 06 OCT. 1976
2210
2211
2212   0B9D   24               INR     H
2213   0B9E   229B10           SHLD    OPRI-1          ;INITIALIZE OPERAND INDICATOR
2214   0BA1   2A9610   NXT1:   LHLD    PNTR            ;FETCH SCAN POINTER
2215   0BA4   2B               DCX     H
2216   0BA5   CD6601           CALL    ZBUF            ;CLEAR BUFFER
2217   0BA8   329910           STA     SIGN            ;ZERO SIGN INDICATOR
2218   0BAB   23       NXT2:   INX     H               ;INCREMENT POINTER
2219   0BAC   7E               MOV     A,M             ;FETCH NEXT CHARACTER
2220   0BAD   FE21             CPI     ' '+1
2221   0BAF   DA530C           JC      SEND            ;JUMP IF CR OR BLANK
2222   0BB2   FE2C             CPI     ','             ;FIELD SEPARATOR
2223   0BB4   CA530C           JZ      SEND
2224                   ; CHECK FOR OPERATOR
2225   0BB7   FE2B             CPI     '+'             ;CHECK FOR PLUS
2226   0BB9   CAC40B           JZ      ASC1
2227   0BBC   FE2D             CPI     '-'             ;CHECK FOR MINUS
2228   0BBE   C2D40B           JNZ     ASC2
2229   0BC1   329910           STA     SIGN
2230   0BC4   3A9C10   ASC1:   LDA     OPRI            ;FETCH OPERAND INDICATOR
2231   0BC7   FE02             CPI     2               ;CHECK FOR 2 OPERATORS
2232   0BC9   CA8A0C           JZ      ERRS            ;SYNTAX ERROR
2233   0BCC   3E02             MVI     A,2
2234   0BCE   329C10           STA     OPRI            ;SET INDICATOR
2235   0BD1   C3AB0B           JMP     NXT2
2236                   ; CHECK FOR OPERANDS
2237   0BD4   4F       ASC2:   MOV     C,A             ;SAVE CHARACTER
2238   0BD5   3A9C10           LDA     OPRI            ;GET INDICATOR
2239   0BD8   B7               ORA     A               ;CHECK FOR 2 OPERANDS
2240   0BD9   CA8A0C           JZ      ERRS            ;SYNTAX ERROR
2241   0BDC   79               MOV     A,C
2242   0BDD   FE24             CPI     '$'             ;LC EXPRESSION
2243   0BDF   C2EC0B           JNZ     ASC3
2244   0BE2   23               INX     H               ;INCREMENT POINTER
2245   0BE3   229610           SHLD    PNTR            ;SAVE POINTER
2246   0BE6   2A9210           LHLD    ASPC            ;FETCH LOCATION COUNTER
2247   0BE9   C3280C           JMP     AVAL
2248                   ;CHECK FOR ASCII CHARACTERS
2249   0BEC   FE27     ASC3:   CPI     27H             ;CHECK FOR SINGLE QUOTE
2250   0BEE   C2180C           JNZ     ASC5            ;JUMP IF NOT QUOTE
2251   0BF1   110000           LXI     D,0             ;GET A ZERO
2252   0BF4   0E03             MVI     C,3             ;CHARACTER COUNT
2253   0BF6   23       ASC4:   INX     H               ;BUMP POINTER
2254   0BF7   229610           SHLD    PNTR            ;SAVE
2255   0BFA   7E               MOV     A,M             ;FETCH NEXT CHARACTER
2256   0BFB   FE0D             CPI     ASCR            ;IS IT A CARRIAGE RETURN?
2257   0BFD   CAA80C           JZ      ERAR            ;ARGUMENT ERROR
2258   0C00   FE27             CPI     27H             ;IS IT A QUOTE?
2259   0C02   C20F0C           JNZ     SSTR
2260   0C05   23               INX     H               ;INCREMENT POINTER
2261   0C06   229610           SHLD    PNTR            ;SAVE
2262   0C09   7E               MOV     A,M             ;FETCH NEXT CHAR
22631
2264 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2265+                                                      19:26  09/08/2018
2266+                                                                                      PAGE 40
2267      IMSAI SCS-1 REV. 2 06 OCT. 1976
2268
2269
2270   0C0A   FE27             CPI     27H             ;CHECK FOR 2 QUOTES IN A ROW
2271   0C0C   C2290C           JNZ     AVAL+1          ;TERMINAL QUOTE
2272   0C0F   0D       SSTR:   DCR     C               ;CHECK COUNT
2273   0C10   CAA80C           JZ      ERAR            ;TOO MANY CHARACTERS
2274   0C13   53               MOV     D,E
2275   0C14   5F               MOV     E,A             ;SET CHARACTER IN BUFFER
2276   0C15   C3F60B           JMP     ASC4
2277   0C18   FE30     ASC5:   CPI     '0'             ;CHECK FOR NUMERIC
2278   0C1A   DAA80C           JC      ERAR            ;ILLEGAL CHARACTER
2279   0C1D   FE3A             CPI     '9'+1
2280   0C1F   D2470C           JNC     ALAB
2281   0C22   CD630C           CALL    NUMS            ;GET NUMERIC VALUE
2282   0C25   DAA80C           JC      ERAR            ;ARGUMENT ERROR
2283   0C28   EB       AVAL:   XCHG
2284   0C29   2A9A10           LHLD    OPRD            ;FETCH OPERAND
2285   0C2C   AF               XRA     A               ;GET A ZERO
2286   0C2D   329C10           STA     OPRI            ;STOR IN OPERAND INDICATOR
2287   0C30   3A9910           LDA     SIGN            ;GET SIGN INDICATOR
2288   0C33   B7               ORA     A               ;SET FLAGS
2289   0C34   C23E0C           JNZ     ASUB
2290   0C37   19               DAD     D               ;FORM RESULT
2291   0C38   229A10   ASC7:   SHLD    OPRD            ;SAVE RESULT
2292   0C3B   C3A10B           JMP     NXT1
2293   0C3E   7D       ASUB:   MOV     A,L
2294   0C3F   93               SUB     E
2295   0C40   6F               MOV     L,A
2296   0C41   7C               MOV     A,H
2297   0C42   9A               SBB     D
2298   0C43   67               MOV     H,A
2299   0C44   C3380C           JMP     ASC7
2300   0C47   CD200B   ALAB:   CALL    SLAB
2301   0C4A   CA280C           JZ      AVAL
2302   0C4D   DAA80C           JC      ERAR            ;ILLEGAL SYMBOL
2303   0C50   C3950C           JMP     ERRU            ;UNDEFINED SYMBOL
2304                   ;
2305                   ; GET HERE WHEN TERMINATING CHARACTER IS FOUND.
2306                   ; CHECK FOR LEADING FIELD SEPARATOR
2307                   ;
2308   0C53   3A9C10   SEND:   LDA     OPRI            ;FETCH OPERAND INDICATOR
2309   0C56   B7               ORA     A               ;SET FLAGS
2310   0C57   C28A0C           JNZ     ERRS            ;SYNTAX ERROR
2311   0C5A   2A9A10           LHLD    OPRD
2312   0C5D   7C       SEN1:   MOV     A,H             ;GET HIGH ORDER BYTE
2313   0C5E   119D10           LXI     D,TEMP          ;GET ADDRESS
2314   0C61   B7               ORA     A               ;SET FLAGS
2315   0C62   C9               RET
2316                   ;
2317                   ; GET A NUMERIC VALUE WHICH IS EITHER HEXADECIMAL OR
2318                   ; DECIMAL.  ON RETURN, CARRY SET INDICATES AN ERROR.
2319                   ;
2320   0C63   CD750B   NUMS:   CALL    ALPS            ;GET NUMERIC
23211
2322 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2323+                                                      19:26  09/08/2018
2324+                                                                                      PAGE 41
2325      IMSAI SCS-1 REV. 2 06 OCT. 1976
2326
2327
2328   0C66   1B               DCX     D
2329   0C67   1A               LDAX    D               ;GET LAST CHARACTER
2330   0C68   017E10           LXI     B,ABUF          ;SET BUFFER ADDRESS
2331   0C6B   FE48             CPI     'H'             ;IS IT HEXADECIMAL?
2332   0C6D   CA7B0C           JZ      NUM2
2333   0C70   FE44             CPI     'D'             ;IS IT DECIMAL
2334   0C72   C2770C           JNZ     NUM1
2335   0C75   AF               XRA     A               ;GET A ZERO
2336   0C76   12               STAX    D               ;CLEAR D FROM BUFFER
2337   0C77   CD0102   NUM1:   CALL    ADEC            ;CONVERT DECIMAL VALUE
2338   0C7A   C9               RET
2339   0C7B   AF       NUM2:   XRA     A               ;GET A ZERO
2340   0C7C   12               STAX    D               ;CLEAR H FROM BUFFER
2341   0C7D   CD1B02           CALL    AHEX
2342   0C80   C9               RET
2343                   ;
2344                   ; PROCESS REGISTER ERROR
2345                   ;
2346   0C81   3E52     ERRR:   MVI     A,'R'           ;GET INDICATOR
2347   0C83   210000           LXI     H,0             ;GET A ZERO
2348   0C86   32B210           STA     OBUF            ;SET IN OUTPUT BUFFER
2349   0C89   C9               RET
2350                   ;
2351                   ; PROCESS SYNTAX ERROR
2352                   ;
2353   0C8A   3E53     ERRS:   MVI     A,'S'           ;GET INDICATOR
2354   0C8C   32B210           STA     OBUF            ;STORE IN OUTPUT BUFFER
2355   0C8F   210000           LXI     H,0
2356   0C92   C35D0C           JMP     SEN1
2357                   ;
2358                   ; PROCESS UNDEFINED SYMBOL ERROR
2359                   ;
2360   0C95   3E55     ERRU:   MVI     A,'U'           ;GET INDICATOR
2361   0C97   C38C0C           JMP     ERRS+2
2362                   ;
2363                   ; PROCESS VALUE ERROR
2364                   ;
2365   0C9A   3E56     ERRV:   MVI     A,'V'           ;GET INDICATOR
2366   0C9C   C3830C           JMP     ERRR+2
2367                   ;
2368                   ; PROCESS MISSING LABEL ERROR
2369                   ;
2370   0C9F   3E4D     ERRM:   MVI     A,'M'           ;GET INDICATOR
2371   0CA1   32B210           STA     OBUF            ;STORE IN OUTPUT BUFFER
2372   0CA4   CDD206           CALL    AOU1            ;DISPLAY ERROR
2373   0CA7   C9               RET
2374                   ;
2375                   ;PROCESS ARGUMENT ERROR
2376                   ;
2377   0CA8   3E41     ERAR:   MVI     A,'A'           ;GET INDICATOR
2378   0CAA   C38C0C           JMP     ERRS+2
23791
2380 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2381+                                                      19:26  09/08/2018
2382+                                                                                      PAGE 42
2383      IMSAI SCS-1 REV. 2 06 OCT. 1976
2384
2385
2386                   ;
2387                   ; PROCESS OPCODE ERROR
2388                   ; STORE 3 BYTES OF ZERO IN OBJECT CODE TO PROVIDE
2389                   ; FOR A PATCH
2390                   ;
2391   0CAD   3E4F     ERRO:   MVI     A,'O'           ;GET INDICATOR
2392   0CAF   32B210           STA     OBUF            ;STORE IN OUTPUT BUFFER
2393   0CB2   3A9410           LDA     PASI            ;FETCH PASS INDICATOR
2394   0CB5   B7               ORA     A               ;WHICH PASS
2395   0CB6   C8               RZ                      ;RETURN IF PASS 1
2396   0CB7   0E03             MVI     C,3             ;NEED 3 BYTES
2397   0CB9   AF       ERO1:   XRA     A               ;GET A ZERO
2398   0CBA   CDEE08           CALL    ASTO            ;PUT IN LISTING AND MEMORY
2399   0CBD   0D               DCR     C
2400   0CBE   C2B90C           JNZ     ERO1
2401   0CC1   C9               RET
2402                   ;
2403                   ; PROCESS LABEL ERROR
2404                   ;
2405   0CC2   3E4C     ERRL:   MVI     A,'L'           ;GET INDICATOR
2406   0CC4   C3AF0C           JMP     ERRO+2
2407                   ;
2408                   ; PROCESS DUPLICATE LABEL ERROR
2409                   ;
2410   0CC7   3E44     ERRD:   MVI     A,'D'           ;GET INDICATOR
2411   0CC9   32B210           STA     OBUF
2412   0CCC   CDC506           CALL    AOUT
2413   0CCF   C31E07           JMP     OPC
2414                   ;
2415                   ; THIS ROUTINE SETS OR CLEARS BREAKPOINTS
2416                   ;
2417   0CD2   3A7E10   BREAK:  LDA     ABUF            ;CHECK FOR AN ARG
2418   0CD5   B7               ORA     A
2419   0CD6   CA140D           JZ      CLRB            ;IF NO ARGUMENT, GO CLEAR BREAKPOINT
2420   0CD9   1608             MVI     D, NBR          ;ELSE GET NUMBER OF BREAKPOINTS
2421   0CDB   210C10           LXI     H,BRT           ;AND ADDR OF TABLE
2422   0CDE   7E       B1:     MOV     A,M             ;GET HI BYTE OF ENTRY
2423   0CDF   23               INX     H
2424   0CE0   46               MOV     B,M             ;GET LOW BYTE OF ENTRY
2425   0CE1   B0               ORA     B               ;CHECK FOR EMPTY ENTRY
2426   0CE2   CAEE0C           JZ      B2              ;BRANCH IF EMPTY
2427   0CE5   23               INX     H               ;ELSE GO ON TO NEXT ENTRY
2428   0CE6   23               INX     H
2429   0CE7   15               DCR     D               ;BUMP COUNT
2430   0CE8   C2DE0C           JNZ     B1              ;AND TRY AGAIN
2431   0CEB   C35A04           JMP     WHAT            ;OOPS NO ROOM
2432   0CEE   2B       B2:     DCX     H
2433   0CEF   EB               XCHG
2434   0CF0   2A8A10           LHLD    BBUF            ;GET ADDRESS
2435   0CF3   EB               XCHG                    ;IN D,E
2436   0CF4   7A               MOV     A,D             ;CHECK FOR ADDR > 11D
24371
2438 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2439+                                                      19:26  09/08/2018
2440+                                                                                      PAGE 43
2441      IMSAI SCS-1 REV. 2 06 OCT. 1976
2442
2443
2444   0CF5   B7               ORA     A
2445   0CF6   C2FF0C           JNZ     B3
2446   0CF9   7B               MOV     A,E
2447   0CFA   FE0B             CPI     11
2448   0CFC   DA5A04               JC  WHAT            ;OOPS, TOO LOW
2449   0CFF   72       B3:     MOV     M,D             ;SAVE ADDRESS
2450   0D00   23               INX     H
2451   0D01   73               MOV     M,E
2452   0D02   23               INX     H
2453   0D03   1A               LDAX    D               ;PICK UP INSTRUCTION
2454   0D04   77               MOV     M,A             ;SAVE IT
2455   0D05   3ECF             MVI     A,0CFH          ;RST 1 INSTRUCTION
2456   0D07   12               STAX    D
2457   0D08   3EC3             MVI     A,0C3H          ;SET UP LO MEMORY
2458   0D0A   320800           STA     8               ;WITH A JUMP TO BREAKPOINT
2459   0D0D   212E0D           LXI     H,BRKP
2460   0D10   220900           SHLD    9
2461   0D13   C9               RET                     ;THEN RETURN
2462                   ;
2463                   ; THIS ROUTINE CLEARS ALL BREAKPOINTS
2464                   ;
2465   0D14   210C10   CLRB:   LXI     H,BRT           ;GET TABLE ADDRESS
2466   0D17   0608             MVI     B,NBR           ;GET NUMBER OF BREAKPOINTS
2467   0D19   AF       CLBL:   XRA     A               ;GET A ZERO
2468   0D1A   56               MOV     D,M             ;GET HI-BYTE OF ENTRY
2469   0D1B   77               MOV     M,A
2470   0D1C   23               INX     H
2471   0D1D   5E               MOV     E,M             ;GET LO-BYTE OF ENTRY
2472   0D1E   77               MOV     M,A
2473   0D1F   23               INX     H
2474   0D20   46               MOV     B,M             ;GET INST BYTE
2475   0D21   23               INX     H
2476   0D22   7A               MOV     A,D             ;WAS THIS A NULL ENTRY
2477   0D23   B3               ORA     E
2478   0D24   CA290D           JZ      CL2             ;BRANCH IF IT WAS
2479   0D27   78               MOV     A,B
2480   0D28   12               STAX    D               ;ELSE PLUG INST BACK IN
2481   0D29   05       CL2:    DCR     B               ;BUMP COUNT
2482   0D2A   C2190D           JNZ     CLBL            ;GO DO NEXT ONE
2483   0D2D   C9               RET
2484                   ;
2485                   ; COME HERE WHEN WE HIT A BREAKPOINT
2486                   ;
2487   0D2E   220810   BRKP:   SHLD    HOLD+8          ;SAVE H,L
2488   0D31   E1               POP     H               ;GET PC
2489   0D32   2B               DCX     H               ;ADJUST IT
2490   0D33   220A10           SHLD    HOLD+10         ;SAVE IT
2491   0D36   F5               PUSH    PSW             ;SAVE FLAGS
2492   0D37   E1               POP     H               ;GET THEM INTO H,L
2493   0D38   220010           SHLD    HOLD            ;NOW STORE THEM FOR USER
2494   0D3B   210000           LXI     H,0
24951
2496 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2497+                                                      19:26  09/08/2018
2498+                                                                                      PAGE 44
2499      IMSAI SCS-1 REV. 2 06 OCT. 1976
2500
2501
2502   0D3E   39               DAD     SP              ;GET STACK POINTER
2503   0D3F   310810           LXI     SP,HOLD+8       ;SET STACK POINTER AGAIN
2504   0D42   E5               PUSH    H               ;SAVE OLD SP
2505   0D43   D5               PUSH    D               ;SAVE D,E
2506   0D44   C5               PUSH    B               ;SAVE B,C
2507   0D45   2F               CMA                     ;COMPLEMENT ACCUMULATOR
2508   0D46   D3FF             OUT     0FFH            ;DISPLAY IT IN LIGHTS
2509   0D48   31B210           LXI     SP,AREA+18      ;SET SP AGAIN
2510   0D4B   2A0A10           LHLD    HOLD+10         ;GET PC
2511   0D4E   EB               XCHG                    ;INTO D,E
2512   0D4F   210C10           LXI     H,BRT           ;GET ADDR OF TABLE
2513   0D52   0608             MVI     B,NBR           ;AND NUMBER OF ENTRIES
2514   0D54   7E       BL1:    MOV     A,M             ;GET AN ENTRY FROM THE TABLE
2515   0D55   23               INX     H
2516   0D56   BA               CMP     D               ;DOES IT MATCH?
2517   0D57   C25F0D           JNZ     BL2             ;BRANCH IF NOT
2518   0D5A   7E               MOV     A,M             ;ELSE GET NEXT BYTE
2519   0D5B   BB               CMP     E               ;CHECK IT
2520   0D5C   CA680D           JZ      BL3             ;IT MATCHES!
2521   0D5F   23       BL2:    INX     H               ;BUMP AROUND THIS ENTRY
2522   0D60   23               INX     H
2523   0D61   05               DCR     B               ;BUMP COUNT
2524   0D62   CA5A04           JZ      WHAT            ;NOT IN OUR TABLE
2525   0D65   C3540D           JMP     BL1
2526                   ;
2527   0D68   23       BL3:    INX     H
2528   0D69   7E               MOV     A,M             ;GET INSTR BYTE
2529   0D6A   12               STAX    D               ;PUT IT BACK
2530   0D6B   AF               XRA     A               ;CLEAR ENTRY IN TABLE
2531   0D6C   2B               DCX     H
2532   0D6D   77               MOV     M,A
2533   0D6E   2B               DCX     H
2534   0D6F   77               MOV     M,A
2535   0D70   CD0E01           CALL    CRLF            ;RESTORE THE CARRIAGE
2536   0D73   3A0B10           LDA     HOLD+11         ;GET HI-BYTE OF PC
2537   0D76   CD3A02           CALL    HOUT            ;TYPE IT
2538   0D79   3A0A10           LDA     HOLD+10         ;GET LO-BYTE OF PC
2539   0D7C   CD3A02           CALL    HOUT            ;TYPE IT
2540   0D7F   21880D           LXI     H,BMES          ;TELL USER WHAT IT IS
2541   0D82   CD7A02           CALL    SCRN
2542   0D85   C36700           JMP     EOR             ;GO BACK TO COMMAND LEVEL
2543                   ;
2544   0D88   20425245 BMES:   DB      ' BREAK',13
2545   0D8C   414B0D
2546                   ;
2547                   ; THIS ROUTINE PROCEEDS FROM A BREAKPOINT
2548                   ;
2549   0D8F   3A7E10   PROC:   LDA     ABUF            ;CHECK FOR ARG
2550   0D92   B7               ORA     A
2551   0D93   CA9C0D           JZ      P1              ;JUMP IF NO ARG
2552   0D96   2A8A10           LHLD    BBUF            ;ELSE GET ARG
25531
2554 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2555+                                                      19:26  09/08/2018
2556+                                                                                      PAGE 45
2557      IMSAI SCS-1 REV. 2 06 OCT. 1976
2558
2559
2560   0D99   220A10           SHLD    HOLD+10         ;PLUG IT INTO PC SLOT
2561   0D9C   310010   P1:     LXI     SP,HOLD         ;SET SP TO POINT AT REG?S
2562   0D9F   F1               POP     PSW             ;RESTORE PSW
2563   0DA0   C1               POP     B               ;RESTORE B,C
2564   0DA1   D1               POP     D               ;RESTORE D,E
2565   0DA2   E1               POP     H               ;GET OLD SP
2566   0DA3   F9               SPHL                    ;RESTORE IT
2567   0DA4   2A0A10           LHLD    HOLD+10         ;GET PC
2568   0DA7   E5               PUSH    H               ;PUT IT ON STACK
2569   0DA8   2A0810           LHLD    HOLD+8          ;RESTORE H,L
2570   0DAB   C9               RET                     ;AND PROCEED
2571                   ;
2572                   ; SYSTEM RAM
2573                   ;
2574   1000                    ORG     1000H
2575                   ;
2576                   ; DEFINE BREAKPOINT REGION
2577                   ;
2578   0008            NBR     EQU     8               ;NUMBER OF BREAKPOINTS
2579   1000            HOLD:   DS      12              ;REGISTER HOLD AREA
2580   100C            BRT:    DS      3*NBR           ;BREAKPOINT TABLE
2581                   ;
2582                   ; FILE AREA PARAMETERS
2583                   ;
2584   0006            MAXFIL  EQU     6
2585   0005            NMLEN   EQU     5
2586   000D            FELEN   EQU     NMLEN+8
2587   1024            FILE0:  DS      NMLEN
2588   1029            BOFP:   DS      2
2589   102B            EOFP:   DS      2
2590   102D            MAXL:   DS      4
2591   1031            FILTB:  DS      (MAXFIL-1)*FELEN
2592   1072            INSP:   DS      2
2593   1072            DELP    EQU     INSP
2594   000D            ASCR    EQU     13
2595   1074            HCON:   DS      2
2596   1074            ADDS    EQU     HCON
2597   1076            FBUF:   DS      NMLEN
2598   107B            FREAD:  DS      2
2599   107D            FEF:    DS      1
2600   107D            FOCNT   EQU     FEF
2601   107E            ABUF:   DS      12
2602   108A            BBUF:   DS      4
2603   108E            SCNT:   DS      1
2604   108F            DCNT:   DS      1
2605   000B            NCOM    EQU     11
2606   1090            TABA:   DS      2
2607   1092            ASPC:   DS      2
2608   1094            PASI:   DS      1
2609   1095            NCHR:   DS      1
2610   1096            PNTR:   DS      2
26111
2612 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2613+                                                      19:26  09/08/2018
2614+                                                                                      PAGE 46
2615      IMSAI SCS-1 REV. 2 06 OCT. 1976
2616
2617
2618   1098            NOLA:   DS      1
2619   1099            SIGN:   DS      1
2620   109A            OPRD:   DS      2
2621   109C            OPRI:   DS      1
2622   109D            TEMP:   DS      1
2623   1072            APNT    EQU     INSP
2624   108E            AERR    EQU     SCNT
2625   109E            OIND:   DS      2
2626   0005            LLAB    EQU     5
2627   10A0            AREA:   DS      18
2628   10B2            OBUF:   DS      16
2629   10C2                    DS      5
2630   10C7            IBUF:   DS      83
2631   00FF            SWCH    EQU     0FFH
2632   111A            SYMT    EQU     $
2633                           END
2634 NO PROGRAM ERRORS
26351
2636 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2637+                                                      19:26  09/08/2018
2638+                                                                                      PAGE 47
2639      IMSAI SCS-1 REV. 2 06 OCT. 1976
2640
2641
2642                        SYMBOL TABLE
2643
2644  * 01
2645
2646  A      0007      ABUF   107E      ACH1   0275      ACHK   0263
2647  ACO1   075A      ACO2   07DB *    ADDS   1074      ADE1   0204
2648  ADEC   0201      ADR    057B      AERR   108E      AHE1   021E
2649  AHEX   021B      AHS1   0232      ALAB   0C47      ALP1   0B77
2650  ALPS   0B75      AOU1   06D2      AOU2   06CC *    AOUT   06C5
2651  APNT   1072      AREA   10A0      ASBL   0B94      ASC1   0BC4
2652  ASC2   0BD4      ASC3   0BEC      ASC4   0BF6      ASC5   0C18
2653  ASC7   0C38      ASCN   0B97      ASCR   000D      ASM1   068C
2654  ASM2   06B9      ASM3   067A      ASM4   066E      ASPC   1092
2655  ASSM   065E      ASTO   08EE      ASUB   0C3E      AVAL   0C28
2656  B      0000      B1     0CDE      B2     0CEE      B3     0CFF
2657  BBUF   108A      BID1   02B4      BIN1   0299      BINAD  07FD
2658  BIND   02A3      BINH   0286      BL1    0D54      BL2    0D5F
2659  BL3    0D68      BLK1   025D      BMES   0D88      BOFP   1029
2660  BREAK  0CD2      BRKP   0D2E      BRT    100C      BSPA   00BF
2661  C      0001      CHAR   00C7      CHOT   0240 *    CL2    0D29
2662  CLBL   0D19      CLER   00E1      CLRB   0D14      CO1    05A7
2663  CO2    05AD      COM0   05A2      COM1   05B5 *    COMM   012B
2664  COMS   013C      COND   091B      COP1   0A62      COPC   0A50
2665  CR     0097      CRLF   010E      CTAB   02BE      D      0002
2666  DAT1   0790      DAT2   07F1      DAT2A  07F4      DCNT   108F *
2667  DEL    00B2      DEL1   05FB      DEL2   0618      DEL3   0636
2668  DEL4   0640      DEL5   0641      DELL   05E7      DELP   1072
2669  DONE   01BF      DOUT   0251 *    DUM1   030E      DUMP   0308
2670  DUMS   030B      E      0003      EASS   0901      EEND   002F
2671  EMES   0466      EMES1  046B      EMES2  0470      ENT1   048F
2672  ENTR   0476      ENTS   0483      EO1    0574      EOF    0573
2673  EOFP   102B      EOR    0067      EQU1   0775      EQU2   07FA
2674  EQUL   0503      EQUS   0780      ERAR   0CA8      ERO1   0CB9
2675  ERRD   0CC7      ERRL   0CC2      ERRM   0C9F      ERRO   0CAD
2676  ERRR   0C81      ERRS   0C8A      ERRU   0C95      ERRV   0C9A
2677  ETRA   017A      EXEC   0121      FAST   03E6      FBUF   1076
2678  FEET   03F8      FEF    107D      FELEN  000D      FI1    055A
2679  FI2    056C      FIL30  03B0 *    FIL35  03B2      FILE   033E
2680  FILE0  1024      FILTB  1031 *    FIN1   0552      FIND   054C
2681  FINE   03C9      FOCNT  107D      FOOD   03E3      FOOL   0404
2682  FOOT   03C3      FOUL   03C5      FOUT   03B9      FREAD  107B
2683  FSE10  0421      FSE15  0444      FSE20  044E      FSEA   0418
2684  H      0004      HCON   1074      HOLD   1000      HOTB   024A
2685  HOUT   023A      IBUF   10C7      IN8    00F6      INCA   015F
2686  INIT2  0056      INIT3  0061      INITA  0040      INK    00E9
2687  INSP   1072      INSR   04FA      L      0005      LCHK   0735
2688  LESS   0518      LF     0113 *    LICK   04C1      LINE   04B5
2689  LIST   05D0      LIST0  05D6      LLAB   0005      LMOV   0580
2690  LODM   0592      M      0006      MAXFI  0006      MAXL   102D
2691  MESS   0460      MLAB   0705      MORE   052B      MOV23  0382
2692  MPNT   08BF      NBR    0008      NCHR   1095      NCOM   000B
26931
2694 8080 MACRO ASSEMBLER, VER 3.0        ERRORS = 0
2695+                                                      19:26  09/08/2018
2696+                                                                                      PAGE 48
2697                              SYMBOL TABLE
2698
2699
2700  NEXT   0088      NMLEN  0005      NOLA   1098      NOR1   05C3
2701  NORM   05BD      NOV1   064F *    NOVR   0649      NUM1   0C77
2702  NUM2   0C7B      NUMS   0C63      NXT1   0BA1      NXT2   0BAB
2703  OBUF   10B2      OCN1   0AF5      OCN2   0AF8      OCNT   0AE1
2704  OERR   0B06      OIND   109E      OK     010A *    OP1    0A81
2705  OP2    0A84      OP4    0ADC      OP5    0ADF      OPAD   0ADB
2706  OPC    071E      OPC2   0A89 *    OPC3   0AA5 *    OPCD   0A65
2707  OPRD   109A      OPRI   109C      ORG1   0760      ORG2   080C
2708  OTAB   0927      OUT8   0103      P1     0D9C      PABL   07AD *
2709  PAG1   0335      PAGEM  0322      PAS1   06DC      PAS2   0793
2710  PASI   1094      PNTR   1096      PROC   0D8F      PSEU   0B0E
2711  PSU1   0744      PSU2   07C8      PSW    0006      READ   0080
2712  RES1   0788      RES2   07E1      RES21  07ED      RMOV   0589
2713  ROOM   0378      RTAB   0B60      SBL1   0910      SBL2   0914
2714  SBLK   090D      SCNT   108E      SCRN   027A      SEAR   0153
2715  SEN1   0C5D      SEND   0C53      SEOF   04F2 *    SIGN   1099
2716  SLA1   0B44      SLA2   0B5A      SLA3   0B5D      SLAB   0B20
2717  SP     0006      SSTR   0C0F      STOM   059A      SWAP   0390
2718  SWAPS  038B      SWCH   00FF *    SYMT   111A      TABA   1090
2719  TEMP   109D      TEST   0363      TTI    0002      TTO    0002
2720  TTS    0003      TTYDA  0002      TTYTR  0001      TY31   0855
2721  TY32   0858      TY41   0881      TY55   08A0      TY56   08AD
2722  TY6    08DE      TYP1   082D      TYP2   0831      TYP3   0844
2723  TYP4   0863      TYP5   0898      TYP6   08CE      TYS6   08E1
2724  VAL1   0189      VAL2   01A4      VAL3   01B4      VAL4   01B6
2725  VAL5   01C4      VALC   0173      VCHK   0300      WHA1   045D
2726  WHAT   045A      ZBU1   016C      ZBUF   0166      ZERO   053B
2727
2728