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