Files
Paterson-Listings/2_printed_files/bundle_06/ASM.PRN
T
Yufeng GaoandRichCini 8065d4d8be Initial commit
Initial import of the transcribed source code from Tim Paterson's
DOS listings.

Co-authored-by: RichCini <rich.cini@gmail.com>
2026-04-22 01:04:31 +10:00

4253 lines
196 KiB
Plaintext

0000 0001 ; Seattle Computer Products 8086 Assembler version 2.43
0000 0002 ; by Tim Paterson
0000 0003 ; Runs on the 8086 under MS-DOS
0000 0004
0000 0005 ;* * * * * * REVISION HISTORY * * * * * *
0000 0006 ;
0000 0007 ; 12/29/80 2.01 General release with 86-DOS version 0.34
0000 0008 ; 02/22/81 2.10 Increased buffer size from 128 bytes to 1024 bytes
0000 0009 ; 03/18/81 2.11 General cleanup and more documentation
0000 0010 ; 03/24/81 2.20 Modify ESC handling for full 8087 operation
0000 0011 ; 04/01/81 2.21 Fix date in HEX and PRN files; modify buffer handling
0000 0012 ; 04/03/81 2.22 Fix 2.21 buffer handling
0000 0013 ; 04/13/81 2.23 Re-open source file for listing to allow assembling CON:
0000 0014 ; 04/28/81 2.24 Allow nested IFs
0000 0015 ; 07/30/81 2.25 Add Intel string mnemonics; clean up a little
0000 0016 ; 08/02/81 2.30 Re-write pass 2:
0000 0017 ; Always report errors to console
0000 0018 ; Exact byte lengths for HEX and PRN files
0000 0019 ; 11/08/81 2.40 Add 8087 mnemonics; print full error messages;
0000 0020 ; allow expressions with *, /, and ()
0000 0021 ; 07/04/82 2.41 Fix Intel's 8087 "reverse-bit" bug; don't copy date
0000 0022 ; 08/18/82 2.42 Increase stack from 80 to 256 (Damn! Overflowed again!)
0000 0023 ; 01/05/82 2.43 Correct over-zealous optimization in 2.42
0000 0024 ;
0000 0025 ;* * * * * * * * * * * * * * * * * * * * *
0000 0026
0000 0027 SYMWID: EQU 5 ;5 symbols per line in dump
0000 0028 FCB: EQU 5CH
0000 0029 BUFSIZ: EQU 1024 ;Source code buffer
0000 0030 LSTBUFSIZ:EQU BUFSIZ ;List file buffer
0000 0031 HEXBUFSIZ:EQU 70 ;Hex file buffer (26*2 + 5*2 + 3 + EXTRA)
0000 0032 EOL: EQU 13 ;ASCII carriage return
0000 0033 OBJECT: EQU 100H ;DEFAULT "PUT" ADDRESS
0000 0034
0000 0035 ;System call function codes
0000 0036 PRINTMES: EQU 9
0000 0037 OPEN: EQU 15
0000 0038 CLOSE: EQU 16
0000 0039 READ: EQU 20
0000 0040 SETDMA: EQU 26
0000 0041 MAKE: EQU 22
0000 0042 BLKWRT: EQU 40
0000 0043
0000 0044 ;The following equates define some token values returned by GETSYM
0000 0045 UNDEFID:EQU 0 ;Undefined identifier (including no nearby RET)
0000 0046 CONST: EQU 1 ;Constant (including $)
0000 0047 REG: EQU 2 ;8-bit register
0000 0048 XREG: EQU 3 ;16-bit register (except segment registers)
0000 0049 SREG: EQU 4 ;Segment register
0000 0050 FREG: EQU 6 ;8087 floating point register
0000 0051
0000 0052 ;Bits to build 8087 opcode table entries
0000 0053 ONEREG: EQU 40H ;Single ST register OK as operand
0000 0054 NEEDOP: EQU 80H ;Must have an operand
0000 0055 INTEGER:EQU 20H ;For integer operations
0000 0056 REAL: EQU 28H ;For real operations
0000 0057 EXTENDED EQU 10H ;For Long integers or Temporary real
0000 0058 MEMORY: EQU 18H ;For general memory operations
0000 0059 STACKOP:EQU 10H ;Two register arithmetic with pop
0000 0060 ARITH: EQU 8 ;Non-pop arithmetic operations
0000 0061
0000 0062 ORG 100H
0100 0063 PUT 100H
0100 0064
0100 EB 74 0065 JMPS BEGIN
0102 0066
0102 0D 0A 53 65 61 74 74 0067 HEADER: DB 13,10,'Seattle Computer Products 8086 Assembler Version 2.43'
6C 65 20 43 6F 6D 70
75 74 65 72 20 50 72
6F 64 75 63 74 73 20
38 30 38 36 20 41 73
73 65 6D 62 6C 65 72
20 56 65 72 73 69 6F
6E 20 32 2E 34 33
0139 0D 0A 43 6F 70 79 72 0068 DB 13,10,'Copyright 1979-1982 by Seattle Computer Products, Inc.'
69 67 68 74 20 31 39
37 39 2D 31 39 38 32
20 62 79 20 53 65 61
74 74 6C 65 20 43 6F
6D 70 75 74 65 72 20
50 72 6F 64 75 63 74
73 2C 20 49 6E 63 2E
0171 0D 0A 0D 0A 24 0069 DB 13,10,13,10,'$'
0176 0070
0176 0071 BEGIN:
0176 BC A6 2A 0072 MOV SP,STACK
0179 BA 02 01 0073 MOV DX,HEADER
017C B4 09 0074 MOV AH,PRINTMES
017E CD 21 0075 INT 33
0180 A0 6D 00 0076 MOV AL,[FCB+17]
0183 A2 35 21 0077 MOV [SYMFLG],AL ;Save symbol table request flag
0186 BE 65 00 0078 MOV SI,FCB+9 ;Point to file extension
0189 AC 0079 LODB ;Get source drive letter
018A E8 13 01 0080 CALL CHKDSK ;Valid drive?
018D 0A C0 0081 OR AL,AL
018F 74 03 0082 JZ DEFAULT ;If no extension, use existing drive spec
0191 A2 5C 00 0083 MOV [FCB],AL
0194 0084 DEFAULT:
0194 AC 0085 LODB ;Get HEX file drive letter
0195 3C 5A 0086 CMP AL,'Z' ;Suppress HEX file?
0197 74 03 0087 JZ L0000
0199 E8 04 01 0088 CALL CHKDSK
019C 0089 L0000:
019C A2 80 20 0090 MOV [HEXFCB],AL
019F AC 0091 LODB ;Get PRN file drive letter
01A0 B4 00 0092 MOV AH,0 ;Signal no PRN file
01A2 3C 5A 0093 CMP AL,'Z' ;Suppress PRN file?
01A4 74 15 0094 JZ NOPRN
01A6 3C 59 0095 CMP AL,'Y' ;Print errors only on console?
01A8 74 11 0096 JZ NOPRN
01AA B4 02 0097 MOV AH,2
01AC 3C 58 0098 CMP AL,'X' ;PRN file to console?
01AE 74 0B 0099 JZ NOPRN
01B0 B4 04 0100 MOV AH,4
01B2 3C 50 0101 CMP AL,'P' ;PRN file to printer?
01B4 74 05 0102 JZ NOPRN
01B6 E8 E7 00 0103 CALL CHKDSK
01B9 B4 80 0104 MOV AH,80H
01BB 0105 NOPRN:
01BB A2 A5 20 0106 MOV [LSTFCB],AL
01BE 88 26 52 21 0107 MOV [LSTDEV],AH ;Flag device for list ouput
01C2 BE 6F 20 0108 MOV SI,EXTEND
01C5 BF 65 00 0109 MOV DI,FCB+9
01C8 A5 0110 MOVW
01C9 A4 0111 MOVB ;Set extension to ASM
01CA A5 0112 MOVW ;Zero extent field
01CB BA 5C 00 0113 MOV DX,FCB
01CE B4 0F 0114 MOV AH,OPEN
01D0 CD 21 0115 INT 33
01D2 BB 14 20 0116 MOV BX,NOFILE
01D5 0A C0 0117 OR AL,AL
01D7 74 03 0118 JZ $+5
01D9 E9 9A 00 0119 JMP PRERR
01DC BA 80 20 0120 MOV DX,HEXFCB
01DF E8 9C 00 0121 CALL MAKFIL
01E2 BA A5 20 0122 MOV DX,LSTFCB
01E5 E8 96 00 0123 CALL MAKFIL
01E8 33 C0 0124 XOR AX,AX
01EA A3 68 00 0125 MOV [FCB+12],AX ;Zero CURRENT BLOCK field
01ED A2 7C 00 0126 MOV [FCB+32],AL ;Zero Next Record field
01F0 C7 06 6A 00 00 04 0127 MOV [FCB+14],BUFSIZ ;Set record size
01F6 C7 06 A4 25 A6 25 0128 MOV [BUFPT],SRCBUF ;Initialize buffer pointer
01FC C7 06 37 21 A7 2A 0129 MOV [CODE],START+1 ;POINTER TO NEXT BYTE OF INTERMEDIATE CODE
0202 C7 06 58 21 A6 2A 0130 MOV [IY],START ;POINTER TO CURRENT RELOCATION BYTE
0208 33 C0 0131 XOR AX,AX
020A A3 CA 20 0132 MOV [PC],AX ;DEFAULT PROGRAM COUNTER
020D A3 31 21 0133 MOV [BASE],AX ;POINTER TO ROOT OF ID TREE=NIL
0210 A3 50 21 0134 MOV [RETPT],AX ;Pointer to last RET record
0213 A2 4A 21 0135 MOV [IFFLG],AL ;NOT WITHIN IF/ENDIF
0216 A2 4B 21 0136 MOV [CHKLAB],AL ;LOOKUP ALL LABELS
0219 48 0137 DEC AX
021A A3 4E 21 0138 MOV [LSTRET],AX ;Location of last RET
021D A1 06 00 0139 MOV AX,[6] ;HL=END OF MEMORY
0220 A3 33 21 0140 MOV [HEAP],AX ;BACK END OF SYMBOL TABLE SPACE
0223 C7 06 3B 21 04 00 0141 MOV [BCOUNT],4 ;CODE BYTES PER RELOCATION BYTE
0229 0142
0229 0143 ;Assemble each line of code
0229 0144
0229 0145 LOOP:
0229 E8 8A 00 0146 CALL NEXTCHR ;Get first character on line
022C 3C 1A 0147 CMP AL,1AH
022E 74 1E 0148 JZ ENDJ
0230 B0 FF 0149 MOV AL,-1 ;Flag that no tokens have been read yet
0232 A2 30 21 0150 MOV [SYM],AL
0235 E8 1C 07 0151 CALL ASMLIN ;Assemble the line
0238 A0 30 21 0152 MOV AL,[SYM]
023B 3C FF 0153 CMP AL,-1 ;Any tokens found on line?
023D 75 03 0154 JNZ L0002
023F E8 C0 03 0155 CALL GETSYM ;If no tokens read yet, read first one
0242 0156 L0002:
0242 3C 3B 0157 CMP AL,';'
0244 74 0B 0158 JZ ENDLN
0246 3C 0D 0159 CMP AL,EOL
0248 74 07 0160 JZ ENDLN
024A B0 14 0161 MOV AL,14H ;Garbage at end of line error
024C EB 05 0162 JP ENDLIN
024E E9 09 0F 0163 ENDJ: JMP END
0251 0164
0251 0165 ENDLN:
0251 32 C0 0166 XOR AL,AL ;Flag no errors on line
0253 0167 ENDLIN:
0253 0168 ;AL = error code for line. Stack depth unknown
0253 BC A6 2A 0169 MOV SP,STACK
0256 E8 02 00 0170 CALL NEXLIN
0259 EB CE 0171 JP LOOP
025B 0172
025B 0173 NEXLIN:
025B B5 C0 0174 MOV CH,0C0H ;Put end of line marker and error code (AL)
025D E8 81 09 0175 CALL PUTCD
0260 E8 46 09 0176 CALL GEN1
0263 A0 2F 21 0177 MOV AL,[CHR]
0266 0178 GETEOL:
0266 3C 0A 0179 CMP AL,10
0268 74 35 0180 JZ RET
026A 3C 1A 0181 CMP AL,1AH
026C 74 E0 0182 JZ ENDJ
026E E8 45 00 0183 CALL NEXTCHR ;Scan over comments for linefeed
0271 EB F3 0184 JP GETEOL
0273 0185
0273 0186 ABORT:
0273 BB FC 1F 0187 MOV BX,NOMEM
0276 0188 PRERR:
0276 8B D3 0189 MOV DX,BX
0278 B4 09 0190 MOV AH,PRINTMES
027A CD 21 0191 INT 33
027C CD 20 0192 INT 32
027E 0193
027E 0194 MAKFIL:
027E 8B F2 0195 MOV SI,DX
0280 AC 0196 LODB ;Get drive select byte
0281 3C 20 0197 CMP AL,20H ;If not valid, don't make file
0283 73 1A 0198 JNC RET
0285 B9 04 00 0199 MOV CX,4
0288 8B FE 0200 MOV DI,SI
028A BE 5D 00 0201 MOV SI,FCB+1
028D F3 0202 REP
028E A5 0203 MOVW ;Copy source file name
028F B4 16 0204 MOV AH,MAKE
0291 CD 21 0205 INT 33
0293 C7 45 05 01 00 0206 MOV [DI-9+14],1 ;Set record length to 1 byte
0298 BB E4 1F 0207 MOV BX,NOSPAC
029B 0A C0 0208 OR AL,AL ;Success?
029D 75 D7 0209 JNZ PRERR
029F C3 0210 RET
02A0 0211
02A0 0212 CHKDSK:
02A0 2C 20 0213 SUB AL,' ' ;If not present, set zero flag
02A2 74 FB 0214 JZ RET
02A4 2C 20 0215 SUB AL,20H
02A6 74 04 0216 JZ DSKERR ;Must be in range A-O
02A8 3C 10 0217 CMP AL,'P'-'@'
02AA 72 F3 0218 JC RET
02AC 0219 DSKERR:
02AC BB 35 20 0220 MOV BX,BADDSK
02AF EB C5 0221 JP PRERR
02B1 0222
02B1 0223 ERROR:
02B1 8A C1 0224 MOV AL,CL
02B3 E9 9D FF 0225 JMP ENDLIN
02B6 0226
02B6 0227 NEXTCHR:
02B6 8B 36 A4 25 0228 MOV SI,[BUFPT]
02BA 81 FE A6 25 0229 CMP SI,SRCBUF
02BE 75 1A 0230 JNZ GETCH
02C0 0231 ;Buffer empty so refill it
02C0 52 0232 PUSH DX
02C1 50 0233 PUSH AX ;AH must be saved
02C2 8B D6 0234 MOV DX,SI
02C4 B4 1A 0235 MOV AH,SETDMA
02C6 CD 21 0236 INT 33
02C8 BA 5C 00 0237 MOV DX,FCB
02CB B4 14 0238 MOV AH,READ
02CD CD 21 0239 INT 33
02CF 92 0240 XCHG AX,DX ;Put error code in DL
02D0 58 0241 POP AX ;Restore AH
02D1 8A C2 0242 MOV AL,DL ;Error code back in AL
02D3 5A 0243 POP DX
02D4 3C 01 0244 CMP AL,1
02D6 B0 1A 0245 MOV AL,1AH ;Possibly signal End of File
02D8 74 0A 0246 JZ NOMOD ;If nothing read
02DA 0247 GETCH:
02DA AC 0248 LODB
02DB 81 FE A6 29 0249 CMP SI,SRCBUF+BUFSIZ
02DF 75 03 0250 JNZ NOMOD
02E1 BE A6 25 0251 MOV SI,SRCBUF
02E4 0252 NOMOD:
02E4 89 36 A4 25 0253 MOV [BUFPT],SI
02E8 A2 2F 21 0254 MOV [CHR],AL
02EB C3 0255 RET
02EC 0256
02EC 0257
02EC 0258 MROPS:
02EC 0259
02EC 0260 ; Get two operands and check for certain types, according to flag byte
02EC 0261 ; in CL. OP code in CH. Returns only if immediate operation.
02EC 0262
02EC 51 0263 PUSH CX ;Save type flags
02ED E8 D8 00 0264 CALL GETOP
02F0 52 0265 PUSH DX ;Save first operand
02F1 E8 CB 00 0266 CALL GETOP2
02F4 5B 0267 POP BX ;First op in BX, second op in DX
02F5 B0 04 0268 MOV AL,SREG ;Check for a segment register
02F7 3A C7 0269 CMP AL,BH
02F9 74 41 0270 JZ SEGCHK
02FB 3A C6 0271 CMP AL,DH
02FD 74 3D 0272 JZ SEGCHK
02FF B0 01 0273 MOV AL,CONST ;Check if the first operand is immediate
0301 B1 1A 0274 MOV CL,26
0303 3A C7 0275 CMP AL,BH
0305 74 AA 0276 JZ ERROR ;Error if so
0307 59 0277 POP CX ;Restore type flags
0308 3A C6 0278 CMP AL,DH ;If second operand is immediate, then done
030A 74 DF 0279 JZ RET
030C B0 00 0280 MOV AL,UNDEFID ;Check for memory reference
030E 3A C7 0281 CMP AL,BH
0310 74 4F 0282 JZ STORE ;Is destination memory?
0312 3A C6 0283 CMP AL,DH
0314 74 55 0284 JZ LOAD ;Is source memory?
0316 F6 C1 01 0285 TEST CL,1 ;Check if register-to-register operation OK
0319 B1 1B 0286 MOV CL,27
031B 74 94 0287 JZ ERROR
031D 8A C6 0288 MOV AL,DH
031F 3A C7 0289 CMP AL,BH ;Registers must be of same length
0321 0290 RR:
0321 B1 16 0291 MOV CL,22
0323 75 8C 0292 JNZ ERROR
0325 0293 RR1:
0325 24 01 0294 AND AL,1 ;Get register length (1=16 bits)
0327 0A C5 0295 OR AL,CH ;Or in to OP code
0329 E8 70 08 0296 CALL PUT ;And write it
032C 59 0297 POP CX ;Dump return address
032D 8A C3 0298 MOV AL,BL
032F 02 C0 0299 ADD AL,AL ;Rotate register number into middle position
0331 02 C0 0300 ADD AL,AL
0333 02 C0 0301 ADD AL,AL
0335 0C C0 0302 OR AL,0C0H ;Set register-to-register mode
0337 0A C2 0303 OR AL,DL ;Combine with other register number
0339 E9 60 08 0304 JMP PUT
033C 0305
033C 0306 SEGCHK:
033C 0307 ;Come here if at least one operand is a segment register
033C 59 0308 POP CX ;Restore flags
033D F6 C1 08 0309 TEST CL,8 ;Check if segment register OK
0340 B1 16 0310 MOV CL,22
0342 74 78 0311 JZ ERR1
0344 B9 03 8E 0312 MOV CX,8E03H ;Segment register move OP code
0347 B0 00 0313 MOV AL,UNDEFID
0349 3A C6 0314 CMP AL,DH ;Check if source is memory
034B 74 1E 0315 JZ LOAD
034D 3A C7 0316 CMP AL,BH ;Check if destination is memory
034F 74 10 0317 JZ STORE
0351 B0 03 0318 MOV AL,XREG
0353 2A C6 0319 SUB AL,DH ;Check if source is 16-bit register
0355 74 CA 0320 JZ RR ;If so, AL must be zero
0357 B5 8C 0321 MOV CH,8CH ;Change direction
0359 87 DA 0322 XCHG DX,BX ;Flip which operand is first and second
035B B0 03 0323 MOV AL,XREG
035D 2A C6 0324 SUB AL,DH ;Let RR perform finish the test
035F EB C0 0325 JP RR
0361 0326
0361 0327 STORE:
0361 F6 C1 04 0328 TEST CL,004H ;Check if storing is OK
0364 75 52 0329 JNZ STERR
0366 87 DA 0330 XCHG DX,BX ;If so, flip operands
0368 80 E5 FD 0331 AND CH,0FDH ; and zero direction bit
036B 0332 LOAD:
036B B6 19 0333 MOV DH,25
036D 3A C7 0334 CMP AL,BH ;Check if memory-to-memory
036F 74 49 0335 JZ MRERR
0371 8A C7 0336 MOV AL,BH
0373 3C 02 0337 CMP AL,REG ;Check if 8-bit operation
0375 75 07 0338 JNZ XRG
0377 B6 16 0339 MOV DH,22
0379 F6 C1 01 0340 TEST CL,1 ;See if 8-bit operation is OK
037C 74 3C 0341 JZ MRERR
037E 0342 XRG:
037E 8A C2 0343 MOV AL,DL
0380 2C 06 0344 SUB AL,6 ;Check for R/M mode 6 and register 0
0382 0A C3 0345 OR AL,BL ; meaning direct load/store of accumulator
0384 75 19 0346 JNZ NOTAC
0386 F6 C1 08 0347 TEST CL,8 ;See if direct load/store of accumulator
0389 74 14 0348 JZ NOTAC ; means anything in this case
038B 0349 ; Process direct load/store of accumulator
038B 8A C5 0350 MOV AL,CH
038D 24 02 0351 AND AL,2 ;Preserve direction bit only
038F 34 02 0352 XOR AL,2 ; but flip it
0391 0C A0 0353 OR AL,0A0H ;Combine with OP code
0393 8A E8 0354 MOV CH,AL
0395 8A C7 0355 MOV AL,BH ;Check byte/word operation
0397 24 01 0356 AND AL,1
0399 0A C5 0357 OR AL,CH
039B 59 0358 POP CX ;Dump return address
039C E9 BD 08 0359 JMP PUTADD ;Write the address
039F 0360
039F 0361 NOTAC:
039F 8A C7 0362 MOV AL,BH
03A1 24 01 0363 AND AL,1 ;Get byte/word bit
03A3 22 C1 0364 AND AL,CL ;But don't use it in word-only operations
03A5 0A C5 0365 OR AL,CH ;Combine with OP code
03A7 E8 F2 07 0366 CALL PUT
03AA 8A C3 0367 MOV AL,BL
03AC 02 C0 0368 ADD AL,AL ;Rotate to middle position
03AE 02 C0 0369 ADD AL,AL
03B0 02 C0 0370 ADD AL,AL
03B2 0A C2 0371 OR AL,DL ;Combine register field
03B4 59 0372 POP CX ;Dump return address
03B5 E9 A4 08 0373 JMP PUTADD ;Write the address
03B8 0374
03B8 0375 STERR:
03B8 B6 1D 0376 MOV DH,29
03BA 0377 MRERR:
03BA 8A CE 0378 MOV CL,DH
03BC 0379
03BC E9 F2 FE 0380 ERR1: JMP ERROR
03BF 0381
03BF 0382 GETOP2:
03BF 0383 ;Get the second operand: look for a comma and drop into GETOP
03BF A0 30 21 0384 MOV AL,[SYM]
03C2 3C 2C 0385 CMP AL,','
03C4 B1 15 0386 MOV CL,21
03C6 75 F4 0387 JNZ ERR1
03C8 0388
03C8 0389
03C8 0390 GETOP:
03C8 0391
03C8 0392 ; Get one operand. Operand may be a memory reference in brackets, a register,
03C8 0393 ; or a constant. If a flag (such as "B" for byte operation) is encountered,
03C8 0394 ; it is noted and processing continues to find the operand.
03C8 0395 ;
03C8 0396 ; On exit, AL (=DH) has the type of operand. Other information depends
03C8 0397 ; on the actual operand:
03C8 0398 ;
03C8 0399 ; AL=DH=0 Memory Reference. DL has the address mode properly prepared in
03C8 0400 ; the 8086 R/M format (middle bits zero). The constant part of the address
03C8 0401 ; is in ADDR. If an undefined label needs to be added to this, a pointer to
03C8 0402 ; its information fields is in ALABEL, otherwise ALABEL is zero.
03C8 0403 ;
03C8 0404 ; AL=DH=1 Value. The constant part is in DATA. If an undefined label needs
03C8 0405 ; to be added to this, a pointer to its information fields is in DLABEL,
03C8 0406 ; otherwise DLABEL is zero. "$" and "RET" are in this class.
03C8 0407 ;
03C8 0408 ; AL=DH=2 8-bit Register. DL has the register number.
03C8 0409 ;
03C8 0410 ; AL=DH=3 16-bit Register. DL has the register number.
03C8 0411 ;
03C8 0412 ; AL=DH=4 Segment Register. DL has the register number.
03C8 0413
03C8 E8 37 02 0414 CALL GETSYM
03CB 0415 GETOP1:
03CB 0416 ;Enter here if we don't need a GETSYM first
03CB 3C 5B 0417 CMP AL,'[' ;Memory reference?
03CD 74 30 0418 JZ MEM
03CF 3C 05 0419 CMP AL,5 ;Flag ("B", "W", etc.)?
03D1 74 57 0420 JZ FLG
03D3 3C 02 0421 CMP AL,REG ;8-Bit register?
03D5 74 20 0422 JZ NREG
03D7 3C 03 0423 CMP AL,XREG ;16-Bit register?
03D9 74 1C 0424 JZ NREG
03DB 3C 04 0425 CMP AL,SREG ;Segment register?
03DD 74 18 0426 JZ NREG
03DF 0427 VAL: ;Must be immediate
03DF 32 C0 0428 XOR AL,AL ;No addressing modes allowed
03E1 0429 VAL1:
03E1 E8 57 00 0430 CALL GETVAL
03E4 A1 DA 20 0431 MOV AX,[CON] ;Defined part
03E7 A3 D6 20 0432 MOV [DATA],AX
03EA A1 DC 20 0433 MOV AX,[UNDEF] ;Undefined part
03ED A3 D8 20 0434 MOV [DLABEL],AX
03F0 8A D5 0435 MOV DL,CH
03F2 B6 01 0436 MOV DH,CONST
03F4 8A C6 0437 MOV AL,DH
03F6 C3 0438 RET
03F7 0439 NREG:
03F7 52 0440 PUSH DX
03F8 E8 07 02 0441 CALL GETSYM
03FB 5A 0442 POP DX
03FC 8A C6 0443 MOV AL,DH
03FE C3 0444 RET
03FF 0445 MEM:
03FF E8 00 02 0446 CALL GETSYM
0402 B0 01 0447 MOV AL,1
0404 E8 34 00 0448 CALL GETVAL
0407 A0 30 21 0449 MOV AL,[SYM]
040A 3C 5D 0450 CMP AL,']'
040C B1 18 0451 MOV CL,24
040E 75 AC 0452 JNZ ERR1
0410 E8 EF 01 0453 CALL GETSYM
0413 8B 1E DA 20 0454 MOV BX,[CON]
0417 89 1E D2 20 0455 MOV [ADDR],BX
041B 8B 1E DC 20 0456 MOV BX,[UNDEF]
041F 89 1E D4 20 0457 MOV [ALABEL],BX
0423 8A D5 0458 MOV DL,CH
0425 B6 00 0459 MOV DH,UNDEFID
0427 8A C6 0460 MOV AL,DH
0429 C3 0461 RET
042A 0462 FLG:
042A 3A 16 D1 20 0463 CMP DL,[MAXFLG] ;Invalid flag for this operation?
042E B1 27 0464 MOV CL,27H
0430 7F 8A 0465 JG ERR1
0432 E8 CD 01 0466 CALL GETSYM
0435 3C 2C 0467 CMP AL,','
0437 74 8F 0468 JZ GETOP
0439 EB 90 0469 JP GETOP1
043B 0470
043B 0471
043B 0472 GETVAL:
043B 0473
043B 0474 ; Expression analyzer. On entry, if AL=0 then do not allow base or index
043B 0475 ; registers. If AL=1, we are analyzing a memory reference, so allow base
043B 0476 ; and index registers, and compute addressing mode when done. The constant
043B 0477 ; part of the expression will be found in CON. If an undefined label is to
043B 0478 ; be added to this, a pointer to its information fields will be found in
043B 0479 ; UNDEF.
043B 0480
043B 8A E0 0481 MOV AH,AL ;Flag is kept in AH
043D C7 06 DC 20 00 00 0482 MOV [UNDEF],0
0443 A0 30 21 0483 MOV AL,[SYM]
0446 E8 51 00 0484 CALL EXPRESSION
0449 89 16 DA 20 0485 MOV [CON],DX
044D 8A C4 0486 MOV AL,AH
044F B5 00 0487 MOV CH,0 ;Initial mode
0451 A8 10 0488 TEST AL,10H ;Test INDEX bit
0453 D0 D0 0489 RCL AL ;BASE bit (zero flag not affected)
0455 74 37 0490 JZ NOIND ;Jump if not indexed, with BASE bit in carry
0457 F5 0491 CMC
0458 D0 D5 0492 RCL CH ;Rotate in BASE bit
045A D0 D0 0493 RCL AL ;BP bit
045C D0 D5 0494 RCL CH
045E D0 D0 0495 RCL AL ;DI bit
0460 D0 D5 0496 RCL CH ;The low 3 bits now have indexing mode
0462 0497 MODE:
0462 80 CD 80 0498 OR CH,080H ;If undefined label, force 16-bit displacement
0465 F7 06 DC 20 FF FF 0499 TEST [UNDEF],-1
046B 75 BC 0500 JNZ RET
046D 8B 1E DA 20 0501 MOV BX,[CON]
0471 8A C3 0502 MOV AL,BL
0473 98 0503 CBW ;Extend sign
0474 3B C3 0504 CMP AX,BX ;Is it a signed 8-bit number?
0476 75 B1 0505 JNZ RET ;If not, use 16-bit displacement
0478 80 E5 7F 0506 AND CH,07FH ;Reset 16-bit displacement
047B 80 CD 40 0507 OR CH,040H ;Set 8-bit displacement
047E 0B DB 0508 OR BX,BX
0480 75 A7 0509 JNZ RET ;Use it if not zero displacement
0482 80 E5 07 0510 AND CH,7 ;Specify no displacement
0485 82 FD 06 0511 CMP CH,6 ;Check for BP+0 addressing mode
0488 75 9F 0512 JNZ RET
048A 80 CD 40 0513 OR CH,040H ;If BP+0, use 8-bit displacement
048D C3 0514 RET
048E 0515
048E 0516 NOIND:
048E B5 06 0517 MOV CH,6 ;Try direct address mode
0490 73 FB 0518 JNC RET ;If no base register, that's right
0492 D0 D0 0519 RCL AL ;Check BP bit
0494 72 CC 0520 JC MODE
0496 FE C5 0521 INC CH ;If not, must be BX
0498 EB C8 0522 JP MODE
049A 0523
049A 0524 EXPRESSION:
049A 0525 ;Analyze arbitrary expression. Flag byte in AH.
049A 0526 ;On exit, AL has type byte: 0=register or undefined label
049A B5 FF 0527 MOV CH,-1 ;Initial type
049C 8B FA 0528 MOV DI,DX
049E 33 D2 0529 XOR DX,DX ;Initial value
04A0 3C 2B 0530 CMP AL,'+'
04A2 74 0C 0531 JZ PLSMNS
04A4 3C 2D 0532 CMP AL,'-'
04A6 74 08 0533 JZ PLSMNS
04A8 B1 2B 0534 MOV CL,'+'
04AA 52 0535 PUSH DX
04AB 51 0536 PUSH CX
04AC 8B D7 0537 MOV DX,DI
04AE EB 0A 0538 JP OPERATE
04B0 0539 PLSMNS:
04B0 8A C8 0540 MOV CL,AL
04B2 52 0541 PUSH DX
04B3 51 0542 PUSH CX
04B4 80 CC 04 0543 OR AH,4 ;Flag that a sign was found
04B7 E8 48 01 0544 CALL GETSYM
04BA 0545 OPERATE:
04BA E8 2B 00 0546 CALL TERM
04BD 59 0547 POP CX ;Recover operator
04BE 5B 0548 POP BX ;Recover current value
04BF 87 DA 0549 XCHG DX,BX
04C1 22 E8 0550 AND CH,AL
04C3 0A C0 0551 OR AL,AL ;Is it register or undefined label?
04C5 74 17 0552 JZ NOCON ;If so, then no constant part
04C7 82 F9 2D 0553 CMP CL,"-" ;Subtract it?
04CA 75 02 0554 JNZ ADD
04CC F7 DB 0555 NEG BX
04CE 0556 ADD:
04CE 03 D3 0557 ADD DX,BX
04D0 0558 NEXTERM:
04D0 A0 30 21 0559 MOV AL,[SYM]
04D3 3C 2B 0560 CMP AL,'+'
04D5 74 D9 0561 JZ PLSMNS
04D7 3C 2D 0562 CMP AL,'-'
04D9 74 D5 0563 JZ PLSMNS
04DB 8A C5 0564 MOV AL,CH
04DD C3 0565 RET
04DE 0566 NOCON:
04DE 82 F9 2D 0567 CMP CL,"-"
04E1 75 ED 0568 JNZ NEXTERM
04E3 0569 BADOP:
04E3 B1 05 0570 MOV CL,5
04E5 E9 C9 FD 0571 JMP ERROR
04E8 0572
04E8 0573 TERM:
04E8 E8 40 00 0574 CALL FACTOR
04EB 0575 MULOP:
04EB 52 0576 PUSH DX ;Save value
04EC 50 0577 PUSH AX ;Save type
04ED E8 12 01 0578 CALL GETSYM
04F0 59 0579 POP CX
04F1 3C 2A 0580 CMP AL,"*"
04F3 74 04 0581 JZ GETFACT
04F5 3C 2F 0582 CMP AL,"/"
04F7 75 2E 0583 JNZ ENDTERM
04F9 0584 GETFACT:
04F9 0A C9 0585 OR CL,CL ;Can we operate on this type?
04FB 74 E6 0586 JZ BADOP
04FD 50 0587 PUSH AX ;Save operator
04FE E8 01 01 0588 CALL GETSYM ;Get past operator
0501 E8 27 00 0589 CALL FACTOR
0504 0A C0 0590 OR AL,AL
0506 74 DB 0591 JZ BADOP
0508 59 0592 POP CX ;Recover operator
0509 5D 0593 POP BP ;And current value
050A 95 0594 XCHG AX,BP ;Save AH in BP
050B 82 F9 2F 0595 CMP CL,"/" ;Do we divide?
050E 75 0E 0596 JNZ DOMUL
0510 0B D2 0597 OR DX,DX ;Dividing by zero?
0512 B1 29 0598 MOV CL,29H
0514 74 51 0599 JZ ERR2
0516 8B DA 0600 MOV BX,DX
0518 33 D2 0601 XOR DX,DX ;Make 32-bit dividend
051A F7 F3 0602 DIV AX,BX
051C EB 02 0603 JMPS NEXFACT
051E 0604 DOMUL:
051E F7 E2 0605 MUL AX,DX
0520 0606 NEXFACT:
0520 8B D0 0607 MOV DX,AX ;Result in DX
0522 95 0608 XCHG AX,BP ;Restore flags to AH
0523 B0 FF 0609 MOV AL,-1 ;Indicate a number
0525 EB C4 0610 JMPS MULOP
0527 0611 ENDTERM:
0527 5A 0612 POP DX
0528 8A C1 0613 MOV AL,CL
052A C3 0614 RET
052B 0615
052B 0616 FACTOR:
052B A0 30 21 0617 MOV AL,[SYM]
052E 3C 01 0618 CMP AL,CONST
0530 74 F8 0619 JZ RET
0532 3C 00 0620 CMP AL,UNDEFID
0534 74 5C 0621 JZ UVAL
0536 3C 28 0622 CMP AL,"("
0538 74 48 0623 JZ PAREN
053A 3C 22 0624 CMP AL,'"'
053C 74 66 0625 JZ STRING
053E 3C 27 0626 CMP AL,"'"
0540 74 62 0627 JZ STRING
0542 3C 03 0628 CMP AL,XREG ;Only 16-bit register may index
0544 B1 14 0629 MOV CL,20
0546 75 1F 0630 JNZ ERR2
0548 F6 C4 01 0631 TEST AH,1 ;Check to see if indexing is OK
054B B1 01 0632 MOV CL,1
054D 74 18 0633 JZ ERR2
054F 8A C2 0634 MOV AL,DL
0551 B1 03 0635 MOV CL,3
0553 2C 03 0636 SUB AL,3 ;Check for BX
0555 74 22 0637 JZ BXJ
0557 2C 02 0638 SUB AL,2 ;Check for BP
0559 74 1B 0639 JZ BPJ
055B FE C8 0640 DEC AL ;Check for SI
055D B1 04 0641 MOV CL,4
055F 74 0C 0642 JZ SIJ
0561 FE C8 0643 DEC AL ;Check for DI
0563 74 05 0644 JZ DIJ
0565 B1 02 0645 MOV CL,2 ;Invalid base/index register
0567 E9 47 FD 0646 ERR2: JMP ERROR
056A 0647
056A 0648 DIJ:
056A 80 CC 20 0649 OR AH,20H ;Flag seeing index register DI
056D 0650 SIJ:
056D F6 C4 10 0651 TEST AH,10H ;Check if already seen index register
0570 75 F5 0652 JNZ ERR2
0572 80 CC 10 0653 OR AH,10H ;Flag seeing index register
0575 C3 0654 RET
0576 0655
0576 0656 BPJ:
0576 80 CC 40 0657 OR AH,40H ;Flag seeing base register BP
0579 0658 BXJ:
0579 F6 C4 80 0659 TEST AH,80H ;Check if already seen base register
057C 75 E9 0660 JNZ ERR2
057E 80 CC 80 0661 OR AH,80H ;Flag seeing base register
0581 C3 0662 RET
0582 0663
0582 0664 PAREN:
0582 E8 7D 00 0665 CALL GETSYM ;Eat the "("
0585 E8 12 FF 0666 CALL EXPRESSION
0588 82 3E 30 21 29 0667 CMP B,[SYM],")" ;Better have closing paren
058D B1 14 0668 MOV CL,20
058F 75 10 0669 JNZ ERR30
0591 C3 0670 RET
0592 0671
0592 0672 UVAL:
0592 B1 06 0673 MOV CL,6
0594 F6 C4 08 0674 TEST AH,8 ;Check if undefined label has been seen
0597 75 08 0675 JNZ ERR30
0599 80 CC 08 0676 OR AH,8 ;Flag seeing undefined label
059C 89 1E DC 20 0677 MOV [UNDEF],BX
05A0 C3 0678 RET
05A1 0679
05A1 E9 0D FD 0680 ERR30: JMP ERROR
05A4 0681
05A4 0682 STRING:
05A4 8A E8 0683 MOV CH,AL
05A6 A0 2F 21 0684 MOV AL,[CHR]
05A9 3A C5 0685 CMP AL,CH
05AB B1 23 0686 MOV CL,35
05AD 8A D0 0687 MOV DL,AL
05AF B6 00 0688 MOV DH,0
05B1 75 03 0689 JNZ L0003
05B3 E8 32 00 0690 CALL ZERLEN
05B6 0691 L0003:
05B6 E8 37 00 0692 CALL GETCHR
05B9 B1 25 0693 MOV CL,37
05BB F6 C4 02 0694 TEST AH,2
05BE 74 E1 0695 JZ ERR30
05C0 F6 C4 04 0696 TEST AH,4
05C3 B1 26 0697 MOV CL,38
05C5 75 DA 0698 JNZ ERR30
05C7 0699 STRGDAT:
05C7 8A C2 0700 MOV AL,DL
05C9 3C 0D 0701 CMP AL,EOL
05CB B1 27 0702 MOV CL,39
05CD 74 D2 0703 JZ ERR30
05CF E8 CA 05 0704 CALL PUT
05D2 A0 39 21 0705 MOV AL,[DATSIZ]
05D5 0A C0 0706 OR AL,AL
05D7 75 05 0707 JNZ BYTSIZ
05D9 8A C6 0708 MOV AL,DH
05DB E8 BE 05 0709 CALL PUT
05DE 0710 BYTSIZ:
05DE A0 2F 21 0711 MOV AL,[CHR]
05E1 8A D0 0712 MOV DL,AL
05E3 E8 0A 00 0713 CALL GETCHR
05E6 EB DF 0714 JP STRGDAT
05E8 0715
05E8 0716 ZERLEN:
05E8 E8 CB FC 0717 CALL NEXTCHR
05EB 3A C5 0718 CMP AL,CH
05ED 75 B2 0719 JNZ ERR30
05EF C3 0720 RET
05F0 0721
05F0 0722 GETCHR:
05F0 E8 C3 FC 0723 CALL NEXTCHR
05F3 3A C5 0724 CMP AL,CH
05F5 75 F8 0725 JNZ RET
05F7 E8 BC FC 0726 CALL NEXTCHR
05FA 3A C5 0727 CMP AL,CH
05FC 74 F1 0728 JZ RET
05FE 5B 0729 POP BX ;Kill return address to STRGDAT loop
05FF B0 FF 0730 MOV AL,-1 ;Flag type as constant
0601 C3 0731 RET
0602 0732
0602 0733
0602 0734 GETSYM:
0602 0735
0602 0736 ; The lexical scanner. Used only in the operand field. Returns with the token
0602 0737 ; in SYM and AL, sometimes with additional info in BX or DX.
0602 0738 ;
0602 0739 ; AL=SYM=0 Undefined label. BX has pointer to information fields.
0602 0740 ;
0602 0741 ; AL=SYM=1 Constant (or defined label). DX has value.
0602 0742 ;
0602 0743 ; AL=SYM=2,3,4 8-bit register, 16-bit register, or segment register,
0602 0744 ; respectively. DL has register number.
0602 0745 ;
0602 0746 ; AL=SYM=5 A mode flag (such as "B" for byte operation). Type of flag in DL
0602 0747 ; and also stored in FLAG: -1=no flags, 0=B, 1=W, 2=S, 3=L, 4=T.
0602 0748 ;
0602 0749 ; AL=SYM=6 8087 floating point register, ST(n) or ST. DL has register number.
0602 0750 ;
0602 0751 ; All other values are the ASCII code of the character. Note that this may
0602 0752 ; never be a letter or number.
0602 0753
0602 50 0754 PUSH AX ;Save AH
0603 E8 21 00 0755 CALL GETSY
0606 58 0756 POP AX
0607 A0 30 21 0757 MOV AL,[SYM]
060A C3 0758 RET
060B 0759
060B 0760 SCANB:
060B A0 2F 21 0761 MOV AL,[CHR]
060E 0762 SCANT:
060E 3C 20 0763 CMP AL,' '
0610 74 04 0764 JZ NEXB
0612 3C 09 0765 CMP AL,9
0614 75 F4 0766 JNZ RET
0616 0767 NEXB:
0616 E8 9D FC 0768 CALL NEXTCHR
0619 EB F3 0769 JP SCANT
061B 0770
061B 0771 DOLLAR:
061B 8B 16 CC 20 0772 MOV DX,[OLDPC]
061F B0 01 0773 MOV AL,CONST
0621 A2 30 21 0774 MOV [SYM],AL
0624 0775 NEXTCHJ:
0624 E9 8F FC 0776 JMP NEXTCHR
0627 0777
0627 0778 GETSY:
0627 E8 E1 FF 0779 CALL SCANB
062A 3C 24 0780 CMP AL,'$'
062C 74 ED 0781 JZ DOLLAR
062E A2 30 21 0782 MOV [SYM],AL
0631 0C 20 0783 OR AL,20H
0633 3C 7B 0784 CMP AL,'z'+1
0635 73 ED 0785 JNC NEXTCHJ
0637 3C 61 0786 CMP AL,'a'
0639 72 03 0787 JC $+5
063B E9 BF 00 0788 JMP LETTER
063E 3C 3A 0789 CMP AL,'9'+1
0640 73 E2 0790 JNC NEXTCHJ
0642 3C 30 0791 CMP AL,'0'
0644 72 DE 0792 JC NEXTCHJ
0646 BB 30 21 0793 MOV BX,SYM
0649 C6 07 01 0794 MOV B,[BX],CONST
064C E8 83 00 0795 CALL READID
064F 4B 0796 DEC BX
0650 8A 07 0797 MOV AL,[BX]
0652 B1 07 0798 MOV CL,7
0654 BB 00 00 0799 MOV BX,0
0657 3C 68 0800 CMP AL,'h'
0659 75 03 0801 JNZ $+5
065B E9 32 00 0802 JMP HEX
065E FE C1 0803 INC CL
0660 C7 06 56 21 DF 20 0804 MOV [IX],ID
0666 0805 DEC:
0666 8B 36 56 21 0806 MOV SI,[IX]
066A 8A 04 0807 MOV AL,[SI]
066C FF 06 56 21 0808 INC [IX]
0670 3C 3A 0809 CMP AL,'9'+1
0672 72 03 0810 JC $+5
0674 E9 3A FC 0811 JMP ERROR
0677 2C 30 0812 SUB AL,'0'
0679 8B D3 0813 MOV DX,BX
067B D1 E3 0814 SHL BX
067D D1 E3 0815 SHL BX
067F 03 DA 0816 ADD BX,DX
0681 D1 E3 0817 SHL BX
0683 8A D0 0818 MOV DL,AL
0685 B6 00 0819 MOV DH,0
0687 03 DA 0820 ADD BX,DX
0689 FE CD 0821 DEC CH
068B 75 D9 0822 JNZ DEC
068D 87 DA 0823 XCHG DX,BX
068F C3 0824 RET
0690 0825
0690 0826 HEX:
0690 BA DF 20 0827 MOV DX,ID
0693 FE CD 0828 DEC CH
0695 0829 HEX1:
0695 8B F2 0830 MOV SI,DX
0697 AC 0831 LODB
0698 42 0832 INC DX
0699 2C 30 0833 SUB AL,'0'
069B 3C 0A 0834 CMP AL,10
069D 72 06 0835 JC GOTIT
069F 3C 37 0836 CMP AL,'g'-'0'
06A1 73 13 0837 JNC ERR4
06A3 2C 27 0838 SUB AL,'a'-10-'0'
06A5 0839 GOTIT:
06A5 D1 E3 0840 SHL BX
06A7 D1 E3 0841 SHL BX
06A9 D1 E3 0842 SHL BX
06AB D1 E3 0843 SHL BX
06AD 02 D8 0844 ADD BL,AL
06AF FE CD 0845 DEC CH
06B1 75 E2 0846 JNZ HEX1
06B3 87 DA 0847 XCHG DX,BX
06B5 C3 0848 RET
06B6 0849
06B6 E9 F8 FB 0850 ERR4: JMP ERROR
06B9 0851
06B9 0852 GETLET:
06B9 E8 4F FF 0853 CALL SCANB
06BC 3C 0D 0854 CMP AL,EOL
06BE F9 0855 STC
06BF 74 F4 0856 JZ RET
06C1 3C 3B 0857 CMP AL,';'
06C3 F9 0858 STC
06C4 74 EF 0859 JZ RET
06C6 B1 0A 0860 MOV CL,10
06C8 0C 20 0861 OR AL,20H
06CA 3C 61 0862 CMP AL,'a'
06CC 72 E8 0863 JC ERR4
06CE 3C 7B 0864 CMP AL,'z'+1
06D0 73 E4 0865 JNC ERR4
06D2 0866 READID:
06D2 BB DF 20 0867 MOV BX,ID
06D5 B5 00 0868 MOV CH,0
06D7 0869 MOREID:
06D7 88 07 0870 MOV [BX],AL
06D9 FE C5 0871 INC CH
06DB 43 0872 INC BX
06DC E8 D7 FB 0873 CALL NEXTCHR
06DF 3C 30 0874 CMP AL,'0'
06E1 72 0E 0875 JC NOMORE
06E3 0C 20 0876 OR AL,20H
06E5 3C 7B 0877 CMP AL,'z'+1
06E7 73 08 0878 JNC NOMORE
06E9 3C 3A 0879 CMP AL,'9'+1
06EB 72 EA 0880 JC MOREID
06ED 3C 61 0881 CMP AL,'a'
06EF 73 E6 0882 JNC MOREID
06F1 0883 NOMORE:
06F1 8A C8 0884 MOV CL,AL
06F3 8A C5 0885 MOV AL,CH
06F5 A2 DE 20 0886 MOV [LENID],AL
06F8 0A C0 0887 OR AL,AL
06FA 8A C1 0888 MOV AL,CL
06FC C3 0889 RET
06FD 0890
06FD 0891 LETTER:
06FD E8 D2 FF 0892 CALL READID
0700 8A C5 0893 MOV AL,CH
0702 FE C8 0894 DEC AL
0704 75 14 0895 JNZ NOFLG
0706 A0 DF 20 0896 MOV AL,[ID]
0709 B9 05 00 0897 MOV CX,5
070C BF 40 07 0898 MOV DI,FLGTAB
070F FC 0899 UP
0710 F2 0900 REPNE
0711 AE 0901 SCAB ;See if one of B,W,S,L,T
0712 74 1A 0902 JZ SAVFLG ;Go save flag
0714 32 C0 0903 XOR AL,AL
0716 8A 2E DE 20 0904 MOV CH,[LENID]
071A 0905 NOFLG:
071A FE C8 0906 DEC AL
071C 53 0907 PUSH BX
071D 75 03 0908 JNZ L0004
071F E8 5A 00 0909 CALL REGCHK
0722 0910 L0004:
0722 5B 0911 POP BX
0723 8A C6 0912 MOV AL,DH
0725 74 03 0913 JZ SYMSAV
0727 E8 F9 00 0914 CALL LOOKRET
072A 0915 SYMSAV:
072A A2 30 21 0916 MOV [SYM],AL
072D C3 0917 RET
072E 0918
072E 0919 SAVFLG:
072E 8A D1 0920 MOV DL,CL ;Need flag type in DL
0730 86 0E D0 20 0921 XCHG [FLAG],CL
0734 82 F9 FF 0922 CMP CL,-1
0737 B1 20 0923 MOV CL,32
0739 B0 05 0924 MOV AL,5
073B 74 ED 0925 JZ SYMSAV
073D E9 71 FB 0926 ERRJ3: JMP ERROR
0740 0927
0740 74 6C 73 77 62 0928 FLGTAB: DB "tlswb"
0745 0929
0745 0930 FPREG:
0745 0931 ;Have detected "ST" for 8087 floating point stack register
0745 B2 00 0932 MOV DL,0 ;Default is ST(0)
0747 E8 C1 FE 0933 CALL SCANB ;Get next character
074A 3C 28 0934 CMP AL,"(" ;Specifying register number?
074C 75 29 0935 JNZ HAVREG
074E 0936 ;Get register number
074E E8 65 FB 0937 CALL NEXTCHR ;Skip over the "("
0751 E8 74 FC 0938 CALL GETOP ;A little recursion never hurt anybody
0754 3C 01 0939 CMP AL,CONST ;Better have found a constant
0756 B1 14 0940 MOV CL,20 ;Operand error if not
0758 75 E3 0941 JNZ ERRJ3
075A 83 3E D8 20 00 0942 CMP [DLABEL],0 ;Constant must be defined
075F B1 1E 0943 MOV CL,30
0761 75 DA 0944 JNZ ERRJ3
0763 8B 16 D6 20 0945 MOV DX,[DATA] ;Get constant
0767 83 FA 07 0946 CMP DX,7 ;Constant must be in range 0-7
076A B1 1F 0947 MOV CL,31
076C 77 CF 0948 JA ERRJ3
076E A0 30 21 0949 MOV AL,[SYM]
0771 3C 29 0950 CMP AL,")"
0773 B1 18 0951 MOV CL,24
0775 75 C6 0952 JNZ ERRJ3
0777 0953 HAVREG:
0777 B6 06 0954 MOV DH,FREG
0779 32 C0 0955 XOR AL,AL ;Zero set means register found
077B C3 0956 RET
077C 0957
077C 0958 REGCHK:
077C BB DF 20 0959 MOV BX,ID
077F 81 3F 73 74 0960 CMP [BX],"s"+7400H ;"st"
0783 74 C0 0961 JZ FPREG
0785 8A 0F 0962 MOV CL,[BX]
0787 43 0963 INC BX
0788 8A 07 0964 MOV AL,[BX]
078A BB E7 07 0965 MOV BX,REGTAB
078D B6 03 0966 MOV DH,XREG
078F B2 00 0967 MOV DL,0
0791 3C 78 0968 CMP AL,'x'
0793 74 3B 0969 JZ SCANREG
0795 B6 02 0970 MOV DH,REG
0797 3C 6C 0971 CMP AL,'l'
0799 74 35 0972 JZ SCANREG
079B B2 04 0973 MOV DL,4
079D 3C 68 0974 CMP AL,'h'
079F 74 2F 0975 JZ SCANREG
07A1 B6 04 0976 MOV DH,SREG
07A3 B2 00 0977 MOV DL,0
07A5 BB EB 07 0978 MOV BX,SEGTAB
07A8 3C 73 0979 CMP AL,'s'
07AA 74 24 0980 JZ SCANREG
07AC B6 03 0981 MOV DH,XREG
07AE 3C 70 0982 CMP AL,'p'
07B0 74 11 0983 JZ PREG
07B2 3C 69 0984 CMP AL,'i'
07B4 75 C5 0985 JNZ RET
07B6 B2 06 0986 MOV DL,6
07B8 8A C1 0987 MOV AL,CL
07BA 3C 73 0988 CMP AL,'s'
07BC 74 BD 0989 JZ RET
07BE FE C2 0990 INC DL
07C0 3C 64 0991 CMP AL,'d'
07C2 C3 0992 RET
07C3 0993 PREG:
07C3 B2 04 0994 MOV DL,4
07C5 8A C1 0995 MOV AL,CL
07C7 3C 73 0996 CMP AL,'s'
07C9 74 F7 0997 JZ RET
07CB FE C2 0998 INC DL
07CD 3C 62 0999 CMP AL,'b'
07CF C3 1000 RET
07D0 1001 SCANREG:
07D0 8A C1 1002 MOV AL,CL
07D2 B9 04 00 1003 MOV CX,4
07D5 FC 1004 UP
07D6 8B FB 1005 MOV DI,BX
07D8 F2 1006 REPNZ
07D9 AE 1007 SCAB
07DA 8B DF 1008 MOV BX,DI
07DC 75 F1 1009 JNZ RET
07DE 8A C1 1010 MOV AL,CL
07E0 02 C2 1011 ADD AL,DL
07E2 8A D0 1012 MOV DL,AL
07E4 32 C0 1013 XOR AL,AL
07E6 C3 1014 RET
07E7 1015
07E7 62 64 63 61 1016 REGTAB: DB 'bdca'
07EB 1017
07EB 64 73 63 65 1018 SEGTAB: DB 'dsce'
07EF 1019
07EF 1020 LOOK:
07EF 8A 2F 1021 MOV CH,[BX]
07F1 43 1022 INC BX
07F2 BA DF 20 1023 MOV DX,ID
07F5 E8 FA 00 1024 CALL CPSLP
07F8 74 EC 1025 JZ RET
07FA 34 80 1026 XOR AL,80H
07FC D0 C0 1027 ROL AL ;Make end-of-symbol bit least significant
07FE 8A C8 1028 MOV CL,AL
0800 4B 1029 DEC BX
0801 8A 07 1030 MOV AL,[BX]
0803 34 80 1031 XOR AL,80H
0805 D0 C0 1032 ROL AL
0807 3A C1 1033 CMP AL,CL
0809 73 04 1034 JNC SMALL
080B FE C5 1035 INC CH
080D FE C5 1036 INC CH
080F 1037 SMALL:
080F 8A D5 1038 MOV DL,CH
0811 B6 00 1039 MOV DH,0
0813 03 DA 1040 ADD BX,DX
0815 8B 17 1041 MOV DX,[BX]
0817 43 1042 INC BX
0818 8A C2 1043 MOV AL,DL
081A 0A C6 1044 OR AL,DH
081C F9 1045 STC
081D 74 C7 1046 JZ RET
081F 87 DA 1047 XCHG DX,BX
0821 EB CC 1048 JP LOOK
0823 1049
0823 1050 LOOKRET:
0823 8A C5 1051 MOV AL,CH
0825 3C 03 1052 CMP AL,3 ;RET has 3 letters
0827 75 4F 1053 JNZ LOOKUP
0829 4B 1054 DEC BX
082A 80 0F 80 1055 OR B,[BX],080H
082D BA 7F 20 1056 MOV DX,RETSTR+2
0830 1057 CHKRET:
0830 8B F2 1058 MOV SI,DX
0832 AC 1059 LODB
0833 3A 07 1060 CMP AL,[BX]
0835 75 45 1061 JNZ LOOKIT
0837 4B 1062 DEC BX
0838 4A 1063 DEC DX
0839 FE CD 1064 DEC CH
083B 75 F3 1065 JNZ CHKRET
083D 8B 16 4E 21 1066 MOV DX,[LSTRET]
0841 8A C2 1067 MOV AL,DL
0843 22 C6 1068 AND AL,DH
0845 FE C0 1069 INC AL
0847 74 0F 1070 JZ ALLRET
0849 8B 1E CA 20 1071 MOV BX,[PC]
084D 2B DA 1072 SUB BX,DX
084F 8A C3 1073 MOV AL,BL
0851 98 1074 CBW
0852 3B C3 1075 CMP AX,BX ;Signed 8-bit number?
0854 B0 01 1076 MOV AL,1
0856 74 8E 1077 JZ RET
0858 1078 ALLRET:
0858 8B 1E 50 21 1079 MOV BX,[RETPT]
085C 8A C7 1080 MOV AL,BH
085E 0A C3 1081 OR AL,BL
0860 B0 00 1082 MOV AL,0
0862 75 82 1083 JNZ RET
0864 8B 1E 33 21 1084 MOV BX,[HEAP]
0868 4B 1085 DEC BX
0869 4B 1086 DEC BX
086A 4B 1087 DEC BX
086B 89 1E 33 21 1088 MOV [HEAP],BX
086F 32 C0 1089 XOR AL,AL
0871 88 07 1090 MOV [BX],AL
0873 89 1E 50 21 1091 MOV [RETPT],BX
0877 C3 1092 RET
0878 1093
0878 1094 LOOKUP:
0878 4B 1095 DEC BX
0879 80 0F 80 1096 OR B,[BX],080H
087C 1097 LOOKIT:
087C 8B 1E 31 21 1098 MOV BX,[BASE]
0880 8A C7 1099 MOV AL,BH
0882 0A C3 1100 OR AL,BL
0884 74 1E 1101 JZ EMPTY
0886 E8 66 FF 1102 CALL LOOK
0889 72 10 1103 JC ENTER
088B BA 04 00 1104 MOV DX,4
088E 03 DA 1105 ADD BX,DX
0890 8A 07 1106 MOV AL,[BX]
0892 0A C0 1107 OR AL,AL
0894 74 E1 1108 JZ RET
0896 43 1109 INC BX
0897 8B 17 1110 MOV DX,[BX]
0899 43 1111 INC BX
089A C3 1112 RET
089B 1113
089B 1114 ENTER:
089B 53 1115 PUSH BX ;Save pointer to link field
089C E8 0D 00 1116 CALL CREATE ;Add the node
089F 5E 1117 POP SI
08A0 89 54 FF 1118 MOV [SI-1],DX ;Link new node
08A3 C3 1119 RET ;Zero was set by CREATE
08A4 1120
08A4 1121 EMPTY:
08A4 E8 05 00 1122 CALL CREATE
08A7 89 16 31 21 1123 MOV [BASE],DX
08AB C3 1124 RET
08AC 1125
08AC 1126
08AC 1127 CREATE:
08AC 1128
08AC 1129 ; Add a new node to the identifier tree. The identifier is at ID with
08AC 1130 ; bit 7 of the last character set to one. The length of the identifier is
08AC 1131 ; in LENID, which is ID-1.
08AC 1132 ;
08AC 1133 ; Node format:
08AC 1134 ; 1. Length of identifier (1 byte)
08AC 1135 ; 2. Identifier (1-80 bytes)
08AC 1136 ; 3. Left link (2-byte pointer to alphabetically smaller identifiers)
08AC 1137 ; 4. Right link (0 if none larger)
08AC 1138 ; 5. Data field:
08AC 1139 ; a. Defined flag (0=undefined, 1=defined)
08AC 1140 ; b. Value (2 bytes)
08AC 1141 ;
08AC 1142 ; This routine returns with AL=zero and zero flag set (which indicates
08AC 1143 ; on return from LOOKUP that it has not yet been defined), DX points
08AC 1144 ; to start of new node, and BX points to data field of new node.
08AC 1145
08AC A0 DE 20 1146 MOV AL,[LENID]
08AF 04 08 1147 ADD AL,8 ;Storage needed for the node
08B1 8B 1E 33 21 1148 MOV BX,[HEAP]
08B5 8A D0 1149 MOV DL,AL
08B7 B6 00 1150 MOV DH,0
08B9 2B DA 1151 SUB BX,DX ;Heap grows downward
08BB 89 1E 33 21 1152 MOV [HEAP],BX
08BF 87 DA 1153 XCHG DX,BX
08C1 8B 1E 37 21 1154 MOV BX,[CODE] ;Check to make sure there's enough
08C5 3B DA 1155 CMP BX,DX
08C7 72 03 1156 JB $+5
08C9 E9 A7 F9 1157 JMP ABORT
08CC 52 1158 PUSH DX
08CD BB DE 20 1159 MOV BX,LENID
08D0 8A 0F 1160 MOV CL,[BX]
08D2 FE C1 1161 INC CL
08D4 B5 00 1162 MOV CH,0
08D6 FC 1163 UP
08D7 8B F3 1164 MOV SI,BX
08D9 8B FA 1165 MOV DI,DX
08DB F3 1166 REP
08DC A4 1167 MOVB ;Move identifier and length into node
08DD 8B D7 1168 MOV DX,DI
08DF 8B DE 1169 MOV BX,SI
08E1 B5 04 1170 MOV CH,4
08E3 87 DA 1171 XCHG DX,BX
08E5 1172 NILIFY:
08E5 88 0F 1173 MOV [BX],CL ;Zero left and right links
08E7 43 1174 INC BX
08E8 FE CD 1175 DEC CH
08EA 75 F9 1176 JNZ NILIFY
08EC 32 C0 1177 XOR AL,AL ;Set zero flag
08EE 88 07 1178 MOV [BX],AL ;Zero defined flag
08F0 5A 1179 POP DX ;Restore pointer to node
08F1 C3 1180 RET
08F2 1181
08F2 1182 CPSLP:
08F2 8B F2 1183 MOV SI,DX
08F4 AC 1184 LODB
08F5 3A 07 1185 CMP AL,[BX]
08F7 9F 1186 LAHF
08F8 42 1187 INC DX
08F9 43 1188 INC BX
08FA 9E 1189 SAHF
08FB 75 F4 1190 JNZ RET
08FD FE CD 1191 DEC CH
08FF 75 F1 1192 JNZ CPSLP
0901 C3 1193 RET
0902 1194
0902 1195 GETLAB:
0902 BB 00 00 1196 MOV BX,0
0905 89 1E CE 20 1197 MOV [LABPT],BX
0909 C6 06 D0 20 FF 1198 MOV B,[FLAG],-1
090E B6 00 1199 MOV DH,0
0910 A0 2F 21 1200 MOV AL,[CHR]
0913 3C 21 1201 CMP AL,' '+1
0915 72 03 1202 JC NOT1
0917 80 CE 01 1203 OR DH,001H
091A 1204 NOT1:
091A E8 9C FD 1205 CALL GETLET
091D 72 E2 1206 JC RET
091F 3C 3A 1207 CMP AL,':'
0921 75 05 1208 JNZ LABCHK
0923 E8 90 F9 1209 CALL NEXTCHR
0926 EB 07 1210 JP LABEL
0928 1211 LABCHK:
0928 0A C0 1212 OR AL,AL
092A F6 C6 01 1213 TEST DH,001H
092D 74 D2 1214 JZ RET
092F 1215 LABEL:
092F A0 4B 21 1216 MOV AL,[CHKLAB]
0932 0A C0 1217 OR AL,AL
0934 74 03 1218 JZ $+5
0936 E9 80 FD 1219 JMP GETLET
0939 E8 3C FF 1220 CALL LOOKUP
093C B1 0B 1221 MOV CL,11
093E 75 11 1222 JNZ ERR5
0940 8B 16 CA 20 1223 MOV DX,[PC]
0944 C6 07 01 1224 MOV B,[BX],1
0947 43 1225 INC BX
0948 89 17 1226 MOV [BX],DX
094A 89 1E CE 20 1227 MOV [LABPT],BX
094E E9 68 FD 1228 JMP GETLET
0951 1229
0951 E9 5D F9 1230 ERR5: JMP ERROR
0954 1231
0954 1232 ASMLIN:
0954 C6 06 D1 20 01 1233 MOV B,[MAXFLG],1 ;Allow only B and W flags normally
0959 8B 1E CA 20 1234 MOV BX,[PC]
095D 89 1E CC 20 1235 MOV [OLDPC],BX
0961 E8 9E FF 1236 CALL GETLAB
0964 73 03 1237 JNC $+5
0966 E9 E8 F8 1238 JMP ENDLN
0969 BB DE 20 1239 MOV BX,LENID
096C 8A 07 1240 MOV AL,[BX]
096E B1 0C 1241 MOV CL,12
0970 2C 02 1242 SUB AL,2
0972 8A E8 1243 MOV CH,AL
0974 72 DB 1244 JC ERR5
0976 43 1245 INC BX
0977 82 3F 66 1246 CMP B,[BX],"f" ;See if an 8087 mnemonic
097A 74 4C 1247 JZ NDPOP
097C 3C 05 1248 CMP AL,5
097E 73 D1 1249 JNC ERR5
0980 8A 07 1250 MOV AL,[BX]
0982 2C 61 1251 SUB AL,'a'
0984 8A C8 1252 MOV CL,AL
0986 02 C0 1253 ADD AL,AL
0988 02 C0 1254 ADD AL,AL
098A 02 C1 1255 ADD AL,CL
098C 02 C5 1256 ADD AL,CH
098E 02 C0 1257 ADD AL,AL
0990 BB D0 1A 1258 MOV BX,OPTAB
0993 8A D0 1259 MOV DL,AL
0995 B6 00 1260 MOV DH,0
0997 03 DA 1261 ADD BX,DX
0999 8B 1F 1262 MOV BX,[BX]
099B FE C5 1263 INC CH
099D 8A CD 1264 MOV CL,CH
099F 8A 27 1265 MOV AH,[BX]
09A1 43 1266 INC BX
09A2 0A E4 1267 OR AH,AH
09A4 74 18 1268 JZ OPERR
09A6 1269 FINDOP:
09A6 8A E9 1270 MOV CH,CL
09A8 BA E0 20 1271 MOV DX,ID+1
09AB 95 1272 XCHG AX,BP ;Save count of opcodes in BP
09AC E8 43 FF 1273 CALL CPSLP
09AF 74 12 1274 JZ HAVOP
09B1 95 1275 XCHG AX,BP
09B2 B6 00 1276 MOV DH,0
09B4 8A D5 1277 MOV DL,CH
09B6 42 1278 INC DX
09B7 42 1279 INC DX
09B8 03 DA 1280 ADD BX,DX
09BA FE CC 1281 DEC AH
09BC 75 E8 1282 JNZ FINDOP
09BE 1283 OPERR:
09BE B1 0C 1284 MOV CL,12
09C0 E9 EE F8 1285 JMP ERROR
09C3 1286
09C3 1287 HAVOP:
09C3 8A 47 02 1288 MOV AL,[BX+2] ;Get opcode
09C6 FF 27 1289 JMP [BX]
09C8 1290
09C8 1291 NDPOP: ;First letter is "F" so must be 8087 opcode ("Numeric Data Processor")
09C8 C6 06 D1 20 04 1292 MOV B,[MAXFLG],4 ;Allow all type flags
09CD 43 1293 INC BX
09CE 82 3F 6E 1294 CMP B,[BX],"n" ;"No-wait" form?
09D1 B4 00 1295 MOV AH,0
09D3 75 05 1296 JNZ SAVNFLG
09D5 B4 01 1297 MOV AH,1
09D7 FE C8 1298 DEC AL
09D9 43 1299 INC BX ;Skip over the "N"
09DA 1300 SAVNFLG:
09DA 88 26 55 21 1301 MOV [NOWAIT],AH ;0 for wait, 1 for no wait
09DE 3C 01 1302 CMP AL,1
09E0 72 DC 1303 JB OPERR ;Not enough char left for valid opcode?
09E2 3C 05 1304 CMP AL,5
09E4 77 D8 1305 JA OPERR ;Too many?
09E6 98 1306 CBW
09E7 92 1307 XCHG AX,DX ;Save length in DX
09E8 8B F2 1308 MOV SI,DX
09EA 80 08 80 1309 OR B,[SI+BX],80H ;Set high bit of last character
09ED 8A 07 1310 MOV AL,[BX] ;Get first char of opcode
09EF 43 1311 INC BX
09F0 2C 61 1312 SUB AL,"a"
09F2 72 28 1313 JB TRY2XM1 ;Go see if opcode starts with "2"
09F4 3C 19 1314 CMP AL,"z"-"a"
09F6 77 C6 1315 JA OPERR
09F8 98 1316 CBW
09F9 D1 E0 1317 SHL AX ;Double to index into address table
09FB 96 1318 XCHG AX,SI ;Put in index register
09FC 8B BC D4 1B 1319 MOV DI,[SI+NDPTAB] ;Get start of opcode table for this letter
0A00 1320 LOOKNDP:
0A00 8A 25 1321 MOV AH,[DI] ;Number of opcodes starting with this letter
0A02 0A E4 1322 OR AH,AH
0A04 74 B8 1323 JZ OPERR ;Any start with this letter?
0A06 1324 FNDNDP:
0A06 47 1325 INC DI
0A07 8B F3 1326 MOV SI,BX ;Pointer to start of opcode
0A09 8B CA 1327 MOV CX,DX ;Get length of opcode
0A0B F3 1328 REPE
0A0C A6 1329 CMPB ;Compare opcode to table entry
0A0D 74 38 1330 JZ HAVNDP
0A0F 4F 1331 DEC DI ;Back up in case that was last letter
0A10 B0 80 1332 MOV AL,80H ;Look for char with high bit set
0A12 1333 ENDOP:
0A12 AE 1334 SCASB
0A13 77 FD 1335 JA ENDOP
0A15 47 1336 INC DI ;Skip over info about opcode
0A16 FE CC 1337 DEC AH
0A18 75 EC 1338 JNZ FNDNDP
0A1A EB A2 1339 OPERRJ: JP OPERR
0A1C 1340
0A1C 1341 TRY2XM1:
0A1C 3C D1 1342 CMP AL,"2"-"a"
0A1E 75 9E 1343 JNZ OPERR
0A20 BF 5E 19 1344 MOV DI,XM1
0A23 EB DB 1345 JP LOOKNDP
0A25 1346
0A25 1347 SPECIALOP:
0A25 24 07 1348 AND AL,7 ;Mask to special op number
0A27 74 16 1349 JZ FWAIT ;If zero, go handle FWAIT
0A29 1350 ;Handle FNOP
0A29 82 3E 55 21 00 1351 CMP B,[NOWAIT],0 ;Was "N" present (If not opcode was "FOP")
0A2E 74 8E 1352 JZ OPERR
0A30 B0 9B 1353 MOV AL,9BH ;Need Wait opcode after all
0A32 E8 67 01 1354 CALL PUT
0A35 B0 D9 1355 MOV AL,0D9H
0A37 E8 62 01 1356 CALL PUT
0A3A B0 D0 1357 MOV AL,0D0H
0A3C E9 5D 01 1358 JMP PUT
0A3F 1359
0A3F 1360 FWAIT:
0A3F 82 3E 55 21 00 1361 CMP B,[NOWAIT],0 ;"FNWAIT" not legal
0A44 75 D4 1362 JNZ OPERRJ
0A46 C3 1363 RET ;Nothing to do - "WAIT" already sent
0A47 1364
0A47 1365 HAVNDP:
0A47 8B F7 1366 MOV SI,DI
0A49 82 3E 55 21 00 1367 CMP B,[NOWAIT],0
0A4E 75 05 1368 JNZ NWAIT
0A50 B0 9B 1369 MOV AL,9BH ;Wait opcode
0A52 E8 47 01 1370 CALL PUT
0A55 1371 NWAIT:
0A55 AD 1372 LODW ;Get opcode info
0A56 A8 F8 1373 TEST AL,0F8H ;Any operand bits set?
0A58 74 66 1374 JZ NOOPS ;If no operands, output code
0A5A A8 78 1375 TEST AL,78H ;Special case?
0A5C 74 C7 1376 JZ SPECIALOP
0A5E 50 1377 PUSH AX
0A5F E8 A0 FB 1378 CALL GETSYM ;See if any operands
0A62 59 1379 POP CX
0A63 3C 3B 1380 CMP AL,";"
0A65 74 52 1381 JZ NOOPCHK
0A67 3C 0D 1382 CMP AL,EOL
0A69 74 4E 1383 JZ NOOPCHK
0A6B 3C 06 1384 CMP AL,FREG ;Is it 8087 register?
0A6D 75 6F 1385 JNZ MEMOP
0A6F 91 1386 XCHG AX,CX
0A70 A8 40 1387 TEST AL,ONEREG ;One register OK as operand?
0A72 75 36 1388 JNZ PUTREG ;Yes - save it
0A74 A8 20 1389 TEST AL,20H ;Memory-only operation?
0A76 B1 14 1390 MOV CL,20
0A78 75 61 1391 JNZ ERRJ4
0A7A A8 18 1392 TEST AL,18H ;Two-register operation?
0A7C 7A 5D 1393 JPE ERRJ4 ;Must be exactly one bit set
0A7E 52 1394 PUSH DX ;Save register number
0A7F 50 1395 PUSH AX ;Save opcode
0A80 E8 7F FB 1396 CALL GETSYM
0A83 3C 2C 1397 CMP AL,","
0A85 B1 15 1398 MOV CL,15H
0A87 75 52 1399 JNZ ERRJ4
0A89 E8 76 FB 1400 CALL GETSYM
0A8C B1 14 1401 MOV CL,20
0A8E 3C 06 1402 CMP AL,FREG
0A90 75 49 1403 JNZ ERRJ4
0A92 58 1404 POP AX
0A93 5B 1405 POP BX
0A94 34 02 1406 XOR AL,2 ;Flip "POP" bit
0A96 24 FB 1407 AND AL,0FBH ;Reset direction bit to ST(0)
0A98 0A DB 1408 OR BL,BL ;Is first register ST(0)?
0A9A 74 0A 1409 JZ ST0DEST
0A9C 87 DA 1410 XCHG DX,BX
0A9E 0A DB 1411 OR BL,BL ;One of these must be ST(0)
0AA0 75 39 1412 JNZ ERRJ4
0AA2 34 04 1413 XOR AL,4 ;Flip direction
0AA4 EB 04 1414 JMPS PUTREG
0AA6 1415 ST0DEST:
0AA6 A8 02 1416 TEST AL,2 ;Is POP bit set?
0AA8 75 31 1417 JNZ ERRJ4 ;Don't allow destination ST(0) then pop
0AAA 1418 PUTREG:
0AAA 80 E4 F8 1419 AND AH,0F8H ;Zero out register field
0AAD 0A E2 1420 OR AH,DL
0AAF 80 CC C0 1421 OR AH,0C0H
0AB2 50 1422 PUSH AX
0AB3 E8 4C FB 1423 CALL GETSYM ;Get to next symbol
0AB6 58 1424 POP AX
0AB7 EB 07 1425 JMPS NOOPS
0AB9 1426
0AB9 1427 NOOPCHK:
0AB9 91 1428 XCHG AX,CX
0ABA A8 80 1429 TEST AL,80H ;Is no operands OK?
0ABC B1 14 1430 MOV CL,20
0ABE 75 1B 1431 JNZ ERRJ4
0AC0 1432 NOOPS:
0AC0 1433 ;First test for FDIV or FSUB and reverse "R" bit if "D" bit is set
0AC0 50 1434 PUSH AX
0AC1 25 05 E0 1435 AND AX,0E005H
0AC4 3D 04 E0 1436 CMP AX,0E004H
0AC7 58 1437 POP AX
0AC8 75 03 1438 JNZ NOREV
0ACA 80 F4 08 1439 XOR AH,8 ;Reverse "R" bit
0ACD 1440 NOREV:
0ACD 24 07 1441 AND AL,7
0ACF 0C D8 1442 OR AL,0D8H ;ESC hook
0AD1 E8 C8 00 1443 CALL PUT
0AD4 8A C4 1444 MOV AL,AH
0AD6 E9 C3 00 1445 JMP PUT
0AD9 1446
0AD9 1447 BADFLAG:
0AD9 B1 20 1448 MOV CL,20H
0ADB E9 D3 F7 1449 ERRJ4: JMP ERROR
0ADE 1450
0ADE 1451 MEMOP:
0ADE 51 1452 PUSH CX ;Save opcode
0ADF E8 E9 F8 1453 CALL GETOP1 ;Get memory operand
0AE2 3C 00 1454 CMP AL,UNDEFID ;Is it?
0AE4 B1 14 1455 MOV CL,20
0AE6 75 F3 1456 JNZ ERRJ4
0AE8 58 1457 POP AX
0AE9 A8 20 1458 TEST AL,20H ;Does it have memory format field?
0AEB 75 08 1459 JNZ GETFORMAT
0AED A8 08 1460 TEST AL,8 ;Check if any memory operand legal
0AEF 74 EA 1461 JZ ERRJ4
0AF1 A8 10 1462 TEST AL,10H ;Check for 2-op arithmetic
0AF3 75 1E 1463 JNZ PUTMEM ;If not, just use as plain memory op
0AF5 1464 GETFORMAT:
0AF5 24 F9 1465 AND AL,0F9H ;Zero memory format bits
0AF7 8A 0E D0 20 1466 MOV CL,[FLAG]
0AFB FE C9 1467 DEC CL ;Must now be in range 0-3
0AFD 7C DA 1468 JL BADFLAG
0AFF 8A E8 1469 MOV CH,AL ;Save opcode byte
0B01 D0 E8 1470 SHR AL ;Put format bits in bits 2 & 3
0B03 24 0C 1471 AND AL,0CH
0B05 0A C1 1472 OR AL,CL ;Combine format bits with flag
0B07 BB 23 0B 1473 MOV BX,FORMATTAB
0B0A D7 1474 XLAT
0B0B 0A C0 1475 OR AL,AL ;Valid combination?
0B0D 78 CA 1476 JS BADFLAG
0B0F 0A E0 1477 OR AH,AL ;Possibly set new bits in second byte
0B11 0A C5 1478 OR AL,CH ;Set memory format bits
0B13 1479 PUTMEM:
0B13 24 07 1480 AND AL,7
0B15 0C D8 1481 OR AL,0D8H
0B17 E8 82 00 1482 CALL PUT
0B1A 8A C4 1483 MOV AL,AH
0B1C 24 38 1484 AND AL,38H
0B1E 0A C2 1485 OR AL,DL ;Combine addressing mode
0B20 E9 39 01 1486 JMP PUTADD
0B23 1487
0B23 1488 FORMATTAB:
0B23 1489 ;There are 16 entries in this table. The 4-bit index is built like this:
0B23 1490 ; Bit 3 0 for normal memory ops, 1 if extended is OK
0B23 1491 ; Bit 2 0 for integer, 1 for real
0B23 1492 ; Bit 0 & 1 Flag: 00=W, 01=S, 10=L, 11=T
0B23 1493 ;
0B23 1494 ;The entries in the table are used as two 3-bit fields. Bits 0-2 are ORed
0B23 1495 ;into the first byte of the opcode for the Memory Format field. Bits 3-6
0B23 1496 ;are ORed into the second byte to modify the opcode for extended operands.
0B23 1497 ;If bit 7 is set, then that combination is illegal.
0B23 1498
0B23 06 02 80 80 1499 DB 6,2,80H,80H ;Normal integers
0B27 80 00 04 80 1500 DB 80H,0,4,80H ;Normal reals
0B2B 06 02 2E 80 1501 DB 6,2,2EH,80H ;Extended integers
0B2F 80 00 04 2B 1502 DB 80H,0,4,2BH ;Extended reals
0B33 1503
0B33 1504 GRP1:
0B33 B9 09 8A 1505 MOV CX,8A09H
0B36 E8 B3 F7 1506 CALL MROPS
0B39 B9 C6 00 1507 MOV CX,0C6H
0B3C 8A C7 1508 MOV AL,BH
0B3E 3C 00 1509 CMP AL,UNDEFID
0B40 75 03 1510 JNZ L0006
0B42 E8 3C 00 1511 CALL STIMM
0B45 1512 L0006:
0B45 24 01 1513 AND AL,1
0B47 74 0A 1514 JZ BYTIMM
0B49 B0 B8 1515 MOV AL,0B8H
0B4B 0A C3 1516 OR AL,BL
0B4D E8 4C 00 1517 CALL PUT
0B50 E9 98 00 1518 JMP PUTWOR
0B53 1519
0B53 1520 BYTIMM:
0B53 B0 B0 1521 MOV AL,0B0H
0B55 0A C3 1522 OR AL,BL
0B57 E8 42 00 1523 CALL PUT
0B5A E9 95 00 1524 PUTBJ: JMP PUTBYT
0B5D 1525
0B5D 1526 IMMED:
0B5D 8A C7 1527 MOV AL,BH
0B5F 3C 00 1528 CMP AL,UNDEFID
0B61 74 1E 1529 JZ STIMM
0B63 8A C3 1530 MOV AL,BL
0B65 0A C0 1531 OR AL,AL
0B67 74 32 1532 JZ RET
0B69 8A C7 1533 MOV AL,BH
0B6B E8 1E 00 1534 CALL IMM
0B6E 0C C0 1535 OR AL,0C0H
0B70 E8 29 00 1536 CALL PUT
0B73 1537 FINIMM:
0B73 8A C1 1538 MOV AL,CL
0B75 59 1539 POP CX
0B76 A8 01 1540 TEST AL,1
0B78 74 E0 1541 JZ PUTBJ
0B7A 3C 83 1542 CMP AL,83H
0B7C 74 DC 1543 JZ PUTBJ
0B7E E9 6A 00 1544 JMP PUTWOR
0B81 1545
0B81 1546 STIMM:
0B81 A0 D0 20 1547 MOV AL,[FLAG]
0B84 E8 05 00 1548 CALL IMM
0B87 E8 D2 00 1549 CALL PUTADD
0B8A EB E7 1550 JP FINIMM
0B8C 1551
0B8C 1552 IMM:
0B8C 24 01 1553 AND AL,1
0B8E 0A C1 1554 OR AL,CL
0B90 8A C8 1555 MOV CL,AL
0B92 E8 07 00 1556 CALL PUT
0B95 8A C5 1557 MOV AL,CH
0B97 24 38 1558 AND AL,38H
0B99 0A C3 1559 OR AL,BL
0B9B C3 1560 RET
0B9C 1561
0B9C 1562 PUT:
0B9C 1563 ;Save byte in AL as pure code, with intermediate code bits 00. AL and
0B9C 1564 ;DI destroyed, no other registers affected.
0B9C 53 1565 PUSH BX
0B9D 51 1566 PUSH CX
0B9E B5 00 1567 MOV CH,0 ;Flag as pure code
0BA0 E8 03 00 1568 CALL GEN
0BA3 59 1569 POP CX
0BA4 5B 1570 POP BX
0BA5 C3 1571 RET
0BA6 1572
0BA6 1573 GEN:
0BA6 1574 ;Save byte of code in AL, given intermediate code bits in bits 7&8 of CH.
0BA6 E8 34 00 1575 CALL PUTINC ;Save it and bump code pointer
0BA9 1576 GEN1:
0BA9 A0 3A 21 1577 MOV AL,[RELOC]
0BAC D0 D5 1578 RCL CH
0BAE D0 D0 1579 RCL AL
0BB0 D0 D5 1580 RCL CH
0BB2 D0 D0 1581 RCL AL
0BB4 A2 3A 21 1582 MOV [RELOC],AL
0BB7 BB 3B 21 1583 MOV BX,BCOUNT
0BBA FE 0F 1584 DEC B,[BX]
0BBC 75 E7 1585 JNZ RET
0BBE C6 07 04 1586 MOV B,[BX],4
0BC1 BB 3A 21 1587 MOV BX,RELOC
0BC4 8A 07 1588 MOV AL,[BX]
0BC6 C6 07 00 1589 MOV B,[BX],0
0BC9 8B 3E 58 21 1590 MOV DI,[IY]
0BCD 88 05 1591 MOV [DI],AL
0BCF 8B 1E 37 21 1592 MOV BX,[CODE]
0BD3 89 1E 58 21 1593 MOV [IY],BX
0BD7 43 1594 INC BX
0BD8 89 1E 37 21 1595 MOV [CODE],BX
0BDC C3 1596 RET
0BDD 1597
0BDD 1598 PUTINC:
0BDD FF 06 CA 20 1599 INC [PC]
0BE1 1600 PUTCD:
0BE1 8B 3E 37 21 1601 MOV DI,[CODE]
0BE5 AA 1602 STOB
0BE6 89 3E 37 21 1603 MOV [CODE],DI
0BEA C3 1604 RET
0BEB 1605
0BEB 1606 PUTWOR:
0BEB 1607 ;Save the word value described by [DLABEL] and [DATA] as code. If defined,
0BEB 1608 ;two bytes of pure code will be produced. Otherwise, appropriate intermediate
0BEB 1609 ;code will be generated.
0BEB 51 1610 PUSH CX
0BEC B5 80 1611 MOV CH,80H
0BEE 52 1612 PUSH DX
0BEF 53 1613 PUSH BX
0BF0 EB 20 1614 JP PUTBW
0BF2 1615
0BF2 1616 PUTBYT:
0BF2 1617 ;Same as PUTWOR, above, but for byte value.
0BF2 51 1618 PUSH CX
0BF3 B5 40 1619 MOV CH,40H
0BF5 52 1620 PUSH DX
0BF6 53 1621 PUSH BX
0BF7 8B 1E D8 20 1622 MOV BX,[DLABEL]
0BFB 8A C7 1623 MOV AL,BH
0BFD 0A C3 1624 OR AL,BL
0BFF 75 11 1625 JNZ PUTBW
0C01 8B 1E D6 20 1626 MOV BX,[DATA]
0C05 0A C7 1627 OR AL,BH
0C07 74 09 1628 JZ PUTBW
0C09 FE C7 1629 INC BH
0C0B 74 05 1630 JZ PUTBW
0C0D B1 1F 1631 MOV CL,31
0C0F E9 9F F6 1632 JMP ERROR
0C12 1633 PUTBW:
0C12 8B 16 D8 20 1634 MOV DX,[DLABEL]
0C16 8B 1E D6 20 1635 MOV BX,[DATA]
0C1A 1636 PUTCHK:
0C1A 0B D2 1637 OR DX,DX
0C1C 74 25 1638 JZ NOUNDEF
0C1E 8A C2 1639 MOV AL,DL
0C20 E8 BE FF 1640 CALL PUTCD
0C23 8A C6 1641 MOV AL,DH
0C25 E8 B9 FF 1642 CALL PUTCD
0C28 8A C3 1643 MOV AL,BL
0C2A E8 B0 FF 1644 CALL PUTINC
0C2D 8A C7 1645 MOV AL,BH
0C2F F6 C5 80 1646 TEST CH,080H
0C32 74 05 1647 JZ SMPUT
0C34 E8 6F FF 1648 CALL GEN
0C37 EB 06 1649 JP PRET
0C39 1650 SMPUT:
0C39 E8 A5 FF 1651 CALL PUTCD
0C3C E8 6A FF 1652 CALL GEN1
0C3F 1653 PRET:
0C3F 5B 1654 POP BX
0C40 5A 1655 POP DX
0C41 59 1656 POP CX
0C42 C3 1657 RET
0C43 1658
0C43 1659 NOUNDEF:
0C43 8A C3 1660 MOV AL,BL
0C45 8A CF 1661 MOV CL,BH
0C47 51 1662 PUSH CX
0C48 B5 00 1663 MOV CH,0
0C4A E8 59 FF 1664 CALL GEN
0C4D 59 1665 POP CX
0C4E 8A C1 1666 MOV AL,CL
0C50 F6 C5 80 1667 TEST CH,080H
0C53 B5 00 1668 MOV CH,0
0C55 74 E8 1669 JZ PRET
0C57 E8 4C FF 1670 CALL GEN
0C5A EB E3 1671 JP PRET
0C5C 1672
0C5C 1673 PUTADD:
0C5C 1674 ;Save complete addressing mode. Addressing mode is in AL; if this is a register
0C5C 1675 ;operation (>=C0), then the one byte will be saved as pure code. Otherwise,
0C5C 1676 ;the details of the addressing mode will be investigated and the optional one-
0C5C 1677 ;or two-byte displacement will be added, as described by [ADDR] and [ALABEL].
0C5C 51 1678 PUSH CX
0C5D 52 1679 PUSH DX
0C5E 53 1680 PUSH BX
0C5F B5 00 1681 MOV CH,0
0C61 8A C8 1682 MOV CL,AL
0C63 E8 40 FF 1683 CALL GEN ;Save the addressing mode as pure code
0C66 8A C1 1684 MOV AL,CL
0C68 B5 80 1685 MOV CH,80H
0C6A 24 C7 1686 AND AL,0C7H
0C6C 3C 06 1687 CMP AL,6
0C6E 74 0A 1688 JZ TWOBT ;Direct address?
0C70 24 C0 1689 AND AL,0C0H
0C72 74 CB 1690 JZ PRET ;Indirect through reg, no displacement?
0C74 3C C0 1691 CMP AL,0C0H
0C76 74 C7 1692 JZ PRET ;Register to register operation?
0C78 8A E8 1693 MOV CH,AL ;Save whether one- or two-byte displacement
0C7A 1694 TWOBT:
0C7A 8B 1E D2 20 1695 MOV BX,[ADDR]
0C7E 8B 16 D4 20 1696 MOV DX,[ALABEL]
0C82 EB 96 1697 JP PUTCHK
0C84 1698
0C84 1699 GRP2:
0C84 E8 41 F7 1700 CALL GETOP
0C87 B9 30 FF 1701 MOV CX,0FF30H
0C8A 3C 00 1702 CMP AL,UNDEFID
0C8C 74 14 1703 JZ PMEM
0C8E B5 50 1704 MOV CH,50H
0C90 3C 03 1705 CMP AL,XREG
0C92 74 1A 1706 JZ PXREG
0C94 B5 06 1707 MOV CH,6
0C96 3C 04 1708 CMP AL,SREG
0C98 75 03 1709 JNZ $+5
0C9A E9 01 04 1710 JMP PACKREG
0C9D B1 14 1711 MOV CL,20
0C9F E9 0F F6 1712 JMP ERROR
0CA2 1713
0CA2 1714 PMEM:
0CA2 8A C5 1715 MOV AL,CH
0CA4 E8 F5 FE 1716 CALL PUT
0CA7 8A C1 1717 MOV AL,CL
0CA9 0A C2 1718 OR AL,DL
0CAB E9 AE FF 1719 JMP PUTADD
0CAE 1720
0CAE 1721 PXREG:
0CAE 8A C5 1722 MOV AL,CH
0CB0 0A C2 1723 OR AL,DL
0CB2 E9 E7 FE 1724 JMP PUT
0CB5 1725
0CB5 1726 GRP3:
0CB5 E8 10 F7 1727 CALL GETOP
0CB8 52 1728 PUSH DX
0CB9 E8 03 F7 1729 CALL GETOP2
0CBC 5B 1730 POP BX
0CBD B9 14 86 1731 MOV CX,8614H
0CC0 B0 04 1732 MOV AL,SREG
0CC2 3A C7 1733 CMP AL,BH
0CC4 74 4C 1734 JZ ERR6
0CC6 3A C6 1735 CMP AL,DH
0CC8 74 48 1736 JZ ERR6
0CCA B0 01 1737 MOV AL,CONST
0CCC 3A C7 1738 CMP AL,BH
0CCE 74 42 1739 JZ ERR6
0CD0 3A C6 1740 CMP AL,DH
0CD2 74 3E 1741 JZ ERR6
0CD4 B0 00 1742 MOV AL,UNDEFID
0CD6 3A C7 1743 CMP AL,BH
0CD8 74 2D 1744 JZ EXMEM
0CDA 3A C6 1745 CMP AL,DH
0CDC 74 2B 1746 JZ EXMEM1
0CDE 8A C7 1747 MOV AL,BH
0CE0 3A C6 1748 CMP AL,DH
0CE2 B1 16 1749 MOV CL,22
0CE4 75 2C 1750 JNZ ERR6
0CE6 3C 03 1751 CMP AL,XREG
0CE8 74 03 1752 JZ L0008
0CEA E8 38 F6 1753 CALL RR1
0CED 1754 L0008: ;RR1 never returns
0CED 8A C3 1755 MOV AL,BL
0CEF 0A C0 1756 OR AL,AL
0CF1 74 0D 1757 JZ EXACC
0CF3 87 DA 1758 XCHG DX,BX
0CF5 8A C3 1759 MOV AL,BL
0CF7 0A C0 1760 OR AL,AL
0CF9 8A C7 1761 MOV AL,BH
0CFB 74 03 1762 JZ EXACC
0CFD E8 25 F6 1763 CALL RR1
0D00 1764 EXACC:
0D00 B0 90 1765 MOV AL,90H
0D02 0A C2 1766 OR AL,DL
0D04 E9 95 FE 1767 JMP PUT
0D07 1768
0D07 1769 EXMEM:
0D07 87 DA 1770 XCHG DX,BX
0D09 1771 EXMEM1:
0D09 3A C7 1772 CMP AL,BH
0D0B 74 05 1773 JZ ERR6
0D0D B1 01 1774 MOV CL,1 ;Flag word as OK
0D0F E8 8D F6 1775 CALL NOTAC ;NOTAC never returns
0D12 E9 9C F5 1776 ERR6: JMP ERROR
0D15 1777
0D15 1778 GRP4:
0D15 50 1779 PUSH AX
0D16 E8 AF F6 1780 CALL GETOP
0D19 59 1781 POP CX
0D1A 86 CD 1782 XCHG CL,CH
0D1C 3C 01 1783 CMP AL,CONST
0D1E 74 13 1784 JZ FIXED
0D20 2C 03 1785 SUB AL,XREG
0D22 FE CA 1786 DEC DL
0D24 FE CA 1787 DEC DL
0D26 0A C2 1788 OR AL,DL
0D28 B1 14 1789 MOV CL,20
0D2A 75 E6 1790 JNZ ERR6
0D2C 8A C5 1791 MOV AL,CH
0D2E 0C 08 1792 OR AL,8
0D30 E9 69 FE 1793 JMP PUT
0D33 1794 FIXED:
0D33 8A C5 1795 MOV AL,CH
0D35 E8 64 FE 1796 CALL PUT
0D38 E9 B7 FE 1797 JMP PUTBYT
0D3B 1798
0D3B 1799 GRP5:
0D3B 50 1800 PUSH AX
0D3C E8 89 F6 1801 CALL GETOP
0D3F B1 14 1802 MOV CL,20
0D41 3C 01 1803 CMP AL,CONST
0D43 75 CD 1804 JNZ ERR6
0D45 8B 1E D8 20 1805 MOV BX,[DLABEL]
0D49 8A C7 1806 MOV AL,BH
0D4B 0A C3 1807 OR AL,BL
0D4D B1 1E 1808 MOV CL,30
0D4F 75 C1 1809 JNZ ERR6
0D51 8B 1E D6 20 1810 MOV BX,[DATA]
0D55 58 1811 POP AX
0D56 0A C0 1812 OR AL,AL
0D58 74 43 1813 JZ ORG
0D5A FE C8 1814 DEC AL
0D5C 74 19 1815 JZ DSJ
0D5E FE C8 1816 DEC AL
0D60 74 27 1817 JZ EQU
0D62 FE C8 1818 DEC AL
0D64 74 03 1819 JZ $+5
0D66 E9 98 03 1820 JMP IF
0D69 1821 PUTOP:
0D69 B0 FD 1822 MOV AL,-3
0D6B EB 36 1823 JP NEWLOC
0D6D 1824 ALIGN:
0D6D A0 CA 20 1825 MOV AL,[PC]
0D70 24 01 1826 AND AL,1
0D72 74 28 1827 JZ RET
0D74 BB 01 00 1828 MOV BX,1
0D77 1829 DSJ:
0D77 87 DA 1830 XCHG DX,BX
0D79 8B 1E CA 20 1831 MOV BX,[PC]
0D7D 03 DA 1832 ADD BX,DX
0D7F 89 1E CA 20 1833 MOV [PC],BX
0D83 87 DA 1834 XCHG DX,BX
0D85 B0 FC 1835 MOV AL,-4
0D87 EB 1A 1836 JP NEWLOC
0D89 1837 EQU:
0D89 87 DA 1838 XCHG DX,BX
0D8B 8B 1E CE 20 1839 MOV BX,[LABPT]
0D8F 8A C7 1840 MOV AL,BH
0D91 0A C3 1841 OR AL,BL
0D93 B1 22 1842 MOV CL,34
0D95 74 27 1843 JZ ERR7
0D97 88 17 1844 MOV [BX],DL
0D99 43 1845 INC BX
0D9A 88 37 1846 MOV [BX],DH
0D9C C3 1847 RET
0D9D 1848 ORG:
0D9D 89 1E CA 20 1849 MOV [PC],BX
0DA1 B0 FE 1850 MOV AL,-2
0DA3 1851 NEWLOC:
0DA3 E8 3B FE 1852 CALL PUTCD
0DA6 8A C3 1853 MOV AL,BL
0DA8 E8 36 FE 1854 CALL PUTCD
0DAB 8A C7 1855 MOV AL,BH
0DAD E8 31 FE 1856 CALL PUTCD
0DB0 B5 C0 1857 MOV CH,0C0H
0DB2 E9 F4 FD 1858 JMP GEN1
0DB5 1859 GRP6:
0DB5 8A E8 1860 MOV CH,AL
0DB7 B1 04 1861 MOV CL,4
0DB9 E8 30 F5 1862 CALL MROPS
0DBC B1 17 1863 MOV CL,23
0DBE E9 F0 F4 1864 ERR7: JMP ERROR
0DC1 1865 GRP7:
0DC1 8A E8 1866 MOV CH,AL
0DC3 B1 01 1867 MOV CL,1
0DC5 E8 24 F5 1868 CALL MROPS
0DC8 B1 80 1869 MOV CL,80H
0DCA 8B 16 D8 20 1870 MOV DX,[DLABEL]
0DCE 8A C6 1871 MOV AL,DH
0DD0 0A C2 1872 OR AL,DL
0DD2 75 12 1873 JNZ ACCJ
0DD4 87 DA 1874 XCHG DX,BX
0DD6 8B 1E D6 20 1875 MOV BX,[DATA]
0DDA 8A C3 1876 MOV AL,BL
0DDC 98 1877 CBW
0DDD 3B C3 1878 CMP AX,BX
0DDF 87 DA 1879 XCHG DX,BX
0DE1 75 03 1880 JNZ ACCJ
0DE3 80 C9 02 1881 OR CL,002H
0DE6 E9 B7 00 1882 ACCJ: JMP ACCIMM
0DE9 1883 GRP8:
0DE9 8A C8 1884 MOV CL,AL
0DEB B5 FE 1885 MOV CH,0FEH
0DED EB 04 1886 JP ONEOP
0DEF 1887 GRP9:
0DEF 8A C8 1888 MOV CL,AL
0DF1 B5 F6 1889 MOV CH,0F6H
0DF3 1890 ONEOP:
0DF3 51 1891 PUSH CX
0DF4 E8 D1 F5 1892 CALL GETOP
0DF7 1893 ONE:
0DF7 B1 1A 1894 MOV CL,26
0DF9 3C 01 1895 CMP AL,CONST
0DFB 74 C1 1896 JZ ERR7
0DFD 3C 04 1897 CMP AL,SREG
0DFF B1 16 1898 MOV CL,22
0E01 74 BB 1899 JZ ERR7
0E03 59 1900 POP CX
0E04 3C 00 1901 CMP AL,UNDEFID
0E06 74 12 1902 JZ MOP
0E08 24 01 1903 AND AL,1
0E0A 74 21 1904 JZ ROP
0E0C F6 C1 01 1905 TEST CL,001H
0E0F 74 1C 1906 JZ ROP
0E11 8A C1 1907 MOV AL,CL
0E13 24 F8 1908 AND AL,0F8H
0E15 0A C2 1909 OR AL,DL
0E17 E9 82 FD 1910 JMP PUT
0E1A 1911 MOP:
0E1A A0 D0 20 1912 MOV AL,[FLAG]
0E1D 24 01 1913 AND AL,1
0E1F 0A C5 1914 OR AL,CH
0E21 E8 78 FD 1915 CALL PUT
0E24 8A C1 1916 MOV AL,CL
0E26 24 38 1917 AND AL,38H
0E28 0A C2 1918 OR AL,DL
0E2A E9 2F FE 1919 JMP PUTADD
0E2D 1920 ROP:
0E2D 0A C5 1921 OR AL,CH
0E2F E8 6A FD 1922 CALL PUT
0E32 8A C1 1923 MOV AL,CL
0E34 24 38 1924 AND AL,38H
0E36 0C C0 1925 OR AL,0C0H
0E38 0A C2 1926 OR AL,DL
0E3A E9 5F FD 1927 JMP PUT
0E3D 1928 GRP10:
0E3D 8A C8 1929 MOV CL,AL
0E3F B5 F6 1930 MOV CH,0F6H
0E41 51 1931 PUSH CX
0E42 E8 83 F5 1932 CALL GETOP
0E45 B1 14 1933 MOV CL,20
0E47 8A C2 1934 MOV AL,DL
0E49 0A C0 1935 OR AL,AL
0E4B 75 08 1936 JNZ ERRJ1
0E4D 8A C6 1937 MOV AL,DH
0E4F 3C 03 1938 CMP AL,XREG
0E51 74 04 1939 JZ G10
0E53 3C 02 1940 CMP AL,REG
0E55 75 67 1941 ERRJ1: JNZ ERR8
0E57 1942 G10:
0E57 50 1943 PUSH AX
0E58 E8 6D F5 1944 CALL GETOP
0E5B 58 1945 POP AX
0E5C 24 01 1946 AND AL,1
0E5E A2 D0 20 1947 MOV [FLAG],AL
0E61 8A C6 1948 MOV AL,DH
0E63 EB 92 1949 ONEJ: JP ONE
0E65 1950 GRP11:
0E65 E8 34 FD 1951 CALL PUT
0E68 B0 0A 1952 MOV AL,0AH
0E6A E9 2F FD 1953 JMP PUT
0E6D 1954 GRP12:
0E6D 8A C8 1955 MOV CL,AL
0E6F B5 D0 1956 MOV CH,0D0H
0E71 51 1957 PUSH CX
0E72 E8 53 F5 1958 CALL GETOP
0E75 A0 30 21 1959 MOV AL,[SYM]
0E78 3C 2C 1960 CMP AL,','
0E7A 8A C6 1961 MOV AL,DH
0E7C 75 E5 1962 JNZ ONEJ
0E7E 52 1963 PUSH DX
0E7F E8 46 F5 1964 CALL GETOP
0E82 2C 02 1965 SUB AL,REG
0E84 B1 14 1966 MOV CL,20
0E86 FE CA 1967 DEC DL
0E88 0A C2 1968 OR AL,DL
0E8A 75 32 1969 JNZ ERR8
0E8C 5A 1970 POP DX
0E8D 8A C6 1971 MOV AL,DH
0E8F 59 1972 POP CX
0E90 80 CD 02 1973 OR CH,002H
0E93 51 1974 PUSH CX
0E94 E9 60 FF 1975 JMP ONE
0E97 1976 GRP13:
0E97 8A E8 1977 MOV CH,AL
0E99 B1 01 1978 MOV CL,1
0E9B E8 4E F4 1979 CALL MROPS
0E9E B1 80 1980 MOV CL,80H
0EA0 1981 ACCIMM:
0EA0 E8 BA FC 1982 CALL IMMED
0EA3 80 CD 04 1983 OR CH,004H
0EA6 80 E5 FD 1984 AND CH,0FDH
0EA9 1985 AIMM:
0EA9 8A C7 1986 MOV AL,BH
0EAB 24 01 1987 AND AL,1
0EAD 9F 1988 LAHF
0EAE 50 1989 PUSH AX
0EAF 0A C5 1990 OR AL,CH
0EB1 E8 E8 FC 1991 CALL PUT
0EB4 58 1992 POP AX
0EB5 9E 1993 SAHF
0EB6 75 03 1994 JNZ $+5
0EB8 E9 37 FD 1995 JMP PUTBYT
0EBB E9 2D FD 1996 JMP PUTWOR
0EBE 1997
0EBE E9 F0 F3 1998 ERR8: JMP ERROR
0EC1 1999
0EC1 2000 GRP14:
0EC1 2001 ;JMP and CALL mnemonics
0EC1 9F 2002 LAHF
0EC2 86 E0 2003 XCHG AH,AL
0EC4 50 2004 PUSH AX
0EC5 86 E0 2005 XCHG AH,AL
0EC7 C6 06 D1 20 03 2006 MOV B,[MAXFLG],3 ;Allow "L" flag
0ECC E8 F9 F4 2007 CALL GETOP
0ECF 3C 01 2008 CMP AL,CONST
0ED1 74 33 2009 JZ DIRECT
0ED3 B1 14 2010 MOV CL,20
0ED5 3C 02 2011 CMP AL,REG
0ED7 74 E5 2012 JZ ERR8
0ED9 3C 04 2013 CMP AL,SREG
0EDB 74 E1 2014 JZ ERR8
0EDD 3C 03 2015 CMP AL,XREG
0EDF 75 03 2016 JNZ NOTRG
0EE1 80 CA C0 2017 OR DL,0C0H
0EE4 2018 NOTRG:
0EE4 2019 ;Indirect jump. DL has addressing mode.
0EE4 B0 FF 2020 MOV AL,0FFH
0EE6 E8 B3 FC 2021 CALL PUT
0EE9 58 2022 POP AX
0EEA 86 E0 2023 XCHG AH,AL
0EEC 9E 2024 SAHF
0EED 24 38 2025 AND AL,38H
0EEF 0A C2 2026 OR AL,DL
0EF1 8A 2E D0 20 2027 MOV CH,[FLAG]
0EF5 82 FD 03 2028 CMP CH,3 ;Flag "L" present?
0EF8 74 09 2029 JZ PUTADDJ ;If so, do inter-segment
0EFA B1 27 2030 MOV CL,27H
0EFC 82 FD FF 2031 CMP CH,-1 ;Better not be a flag
0EFF 75 BD 2032 JNZ ERR8
0F01 24 F7 2033 AND AL,0F7H ;Convert to intra-segment
0F03 2034 PUTADDJ:
0F03 E9 56 FD 2035 JMP PUTADD
0F06 2036 DIRECT:
0F06 A0 30 21 2037 MOV AL,[SYM]
0F09 3C 2C 2038 CMP AL,','
0F0B 74 1C 2039 JZ LONGJ
0F0D 58 2040 POP AX
0F0E 86 E0 2041 XCHG AH,AL
0F10 9E 2042 SAHF
0F11 FE C8 2043 DEC AL
0F13 3C E9 2044 CMP AL,0E9H
0F15 74 02 2045 JZ GOTOP
0F17 B0 E8 2046 MOV AL,0E8H
0F19 2047 GOTOP:
0F19 E8 80 FC 2048 CALL PUT
0F1C 8B 16 CA 20 2049 MOV DX,[PC]
0F20 42 2050 INC DX
0F21 42 2051 INC DX
0F22 29 16 D6 20 2052 SUB [DATA],DX
0F26 E9 C2 FC 2053 JMP PUTWOR
0F29 2054 LONGJ:
0F29 58 2055 POP AX
0F2A 86 E0 2056 XCHG AH,AL
0F2C 9E 2057 SAHF
0F2D E8 6C FC 2058 CALL PUT
0F30 E8 B8 FC 2059 CALL PUTWOR
0F33 E8 92 F4 2060 CALL GETOP
0F36 B1 14 2061 MOV CL,20
0F38 3C 01 2062 CMP AL,CONST
0F3A 75 82 2063 JNZ ERR8
0F3C E9 AC FC 2064 JMP PUTWOR
0F3F 2065
0F3F 2066 GRP16:
0F3F 2067 ;RET mnemonic
0F3F 9F 2068 LAHF
0F40 86 E0 2069 XCHG AH,AL
0F42 50 2070 PUSH AX
0F43 86 E0 2071 XCHG AH,AL
0F45 E8 BA F6 2072 CALL GETSYM
0F48 3C 05 2073 CMP AL,5
0F4A 74 1C 2074 JZ LONGR
0F4C 3C 0D 2075 CMP AL,EOL
0F4E 74 3F 2076 JZ NODEC
0F50 3C 3B 2077 CMP AL,';'
0F52 74 3B 2078 JZ NODEC
0F54 2079 GETSP:
0F54 E8 74 F4 2080 CALL GETOP1
0F57 59 2081 POP CX
0F58 3C 01 2082 CMP AL,CONST
0F5A B1 14 2083 MOV CL,20
0F5C 75 63 2084 JNZ ERR9
0F5E 8A C5 2085 MOV AL,CH
0F60 24 FE 2086 AND AL,0FEH
0F62 E8 37 FC 2087 CALL PUT
0F65 E9 83 FC 2088 JMP PUTWOR
0F68 2089 LONGR:
0F68 82 FA 03 2090 CMP DL,3 ;Is flag "L"?
0F6B B1 27 2091 MOV CL,27H
0F6D 75 7D 2092 JNZ ERR10 ;If not, bad flag
0F6F 58 2093 POP AX
0F70 86 E0 2094 XCHG AH,AL
0F72 9E 2095 SAHF
0F73 0C 08 2096 OR AL,8
0F75 9F 2097 LAHF
0F76 86 E0 2098 XCHG AH,AL
0F78 50 2099 PUSH AX
0F79 86 E0 2100 XCHG AH,AL
0F7B 2101 NOTLON:
0F7B E8 84 F6 2102 CALL GETSYM
0F7E 3C 0D 2103 CMP AL,EOL
0F80 74 2E 2104 JZ DORET
0F82 3C 3B 2105 CMP AL,';'
0F84 74 2A 2106 JZ DORET
0F86 3C 2C 2107 CMP AL,','
0F88 75 03 2108 JNZ L0011
0F8A E8 75 F6 2109 CALL GETSYM
0F8D 2110 L0011:
0F8D EB C5 2111 JP GETSP
0F8F 2112 NODEC:
0F8F 2113 ;Return is intra-segment (short) without add to SP.
0F8F 2114 ;Record position for RET symbol.
0F8F 8B 1E CA 20 2115 MOV BX,[PC]
0F93 89 1E 4E 21 2116 MOV [LSTRET],BX
0F97 87 DA 2117 XCHG DX,BX
0F99 8B 1E 50 21 2118 MOV BX,[RETPT]
0F9D 8A C7 2119 MOV AL,BH
0F9F 0A C3 2120 OR AL,BL
0FA1 74 0D 2121 JZ DORET
0FA3 C6 07 01 2122 MOV B,[BX],1
0FA6 43 2123 INC BX
0FA7 89 17 2124 MOV [BX],DX
0FA9 BB 00 00 2125 MOV BX,0
0FAC 89 1E 50 21 2126 MOV [RETPT],BX
0FB0 2127 DORET:
0FB0 58 2128 POP AX
0FB1 86 E0 2129 XCHG AH,AL
0FB3 9E 2130 SAHF
0FB4 E9 E5 FB 2131 JMP PUT
0FB7 2132
0FB7 2133 GRP17:
0FB7 E8 E2 FB 2134 CALL PUT
0FBA E8 0B F4 2135 CALL GETOP
0FBD 3C 01 2136 CMP AL,CONST
0FBF B1 14 2137 MOV CL,20
0FC1 75 29 2138 ERR9: JNZ ERR10
0FC3 8B 1E D6 20 2139 MOV BX,[DATA]
0FC7 8B 16 CA 20 2140 MOV DX,[PC]
0FCB 42 2141 INC DX
0FCC 2B DA 2142 SUB BX,DX
0FCE 89 1E D6 20 2143 MOV [DATA],BX
0FD2 E8 1D FC 2144 CALL PUTBYT
0FD5 8B 1E D8 20 2145 MOV BX,[DLABEL]
0FD9 8A C7 2146 MOV AL,BH
0FDB 0A C3 2147 OR AL,BL
0FDD 75 10 2148 JNZ RET
0FDF 8B 1E D6 20 2149 MOV BX,[DATA]
0FE3 8A C3 2150 MOV AL,BL
0FE5 98 2151 CBW
0FE6 3B C3 2152 CMP AX,BX ;Signed 8-bit number?
0FE8 74 05 2153 JZ RET
0FEA B1 1F 2154 MOV CL,31
0FEC E9 C2 F2 2155 ERR10: JMP ERROR
0FEF C3 2156 RET
0FF0 2157 GRP18:
0FF0 E8 D5 F3 2158 CALL GETOP
0FF3 3C 01 2159 CMP AL,CONST
0FF5 B1 14 2160 MOV CL,20
0FF7 75 F3 2161 JNZ ERR10
0FF9 8B 1E D8 20 2162 MOV BX,[DLABEL]
0FFD 8A C7 2163 MOV AL,BH
0FFF 0A C3 2164 OR AL,BL
1001 75 10 2165 JNZ GENINT
1003 8B 1E D6 20 2166 MOV BX,[DATA]
1007 BA 03 00 2167 MOV DX,3
100A 1B DA 2168 SBB BX,DX
100C 75 05 2169 JNZ GENINT
100E B0 CC 2170 MOV AL,0CCH
1010 E9 89 FB 2171 JMP PUT
1013 2172 GENINT:
1013 B0 CD 2173 MOV AL,0CDH
1015 E8 84 FB 2174 CALL PUT
1018 E9 D7 FB 2175 JMP PUTBYT
101B 2176
101B 2177 GRP19: ;ESC opcode
101B E8 AA F3 2178 CALL GETOP
101E B1 14 2179 MOV CL,20
1020 3C 01 2180 CMP AL,CONST
1022 75 39 2181 JNZ ERRJ ;First operand must be immediate
1024 B1 1E 2182 MOV CL,1EH
1026 F7 06 D8 20 FF FF 2183 TEST [DLABEL],-1 ;See if all labels have been defined
102C 75 2F 2184 JNZ ERRJ
102E A1 D6 20 2185 MOV AX,[DATA]
1031 3D 40 00 2186 CMP AX,64 ;Must only be 6 bits
1034 B1 1F 2187 MOV CL,1FH
1036 73 25 2188 JNB ERRJ
1038 8A D8 2189 MOV BL,AL ;Save for second byte
103A D0 E8 2190 SHR AL
103C D0 E8 2191 SHR AL
103E D0 E8 2192 SHR AL
1040 0C D8 2193 OR AL,0D8H ;ESC opcode
1042 E8 57 FB 2194 CALL PUT
1045 53 2195 PUSH BX
1046 E8 76 F3 2196 CALL GETOP2
1049 5B 2197 POP BX
104A 80 E3 07 2198 AND BL,7 ;Low 3 bits of first operand
104D D0 E3 2199 SHL BL
104F D0 E3 2200 SHL BL
1051 D0 E3 2201 SHL BL
1053 3C 00 2202 CMP AL,UNDEFID ;Check for memory operand
1055 74 09 2203 JZ ESCMEM
1057 3C 01 2204 CMP AL,CONST ;Check for another immediate
1059 74 0C 2205 JZ ESCIMM
105B B1 14 2206 MOV CL,20
105D E9 51 F2 2207 ERRJ: JMP ERROR
1060 2208
1060 2209 ESCMEM:
1060 0A DA 2210 OR BL,DL ;Combine mode with first operand
1062 8A C3 2211 MOV AL,BL
1064 E9 F5 FB 2212 JMP PUTADD
1067 2213
1067 2214 ESCIMM:
1067 B1 1E 2215 MOV CL,1EH
1069 F7 06 D8 20 FF FF 2216 TEST [DLABEL],-1 ;See if second operand is fully defined
106F 75 EC 2217 JNZ ERRJ
1071 A1 D6 20 2218 MOV AX,[DATA]
1074 B1 1F 2219 MOV CL,1FH
1076 3D 08 00 2220 CMP AX,8 ;Must only be 3 bit value
1079 73 E2 2221 JNB ERRJ
107B 0A C3 2222 OR AL,BL ;Combine first and second operands
107D 0C C0 2223 OR AL,0C0H ;Force "register" mode
107F E9 1A FB 2224 JMP PUT
1082 2225
1082 2226 GRP20:
1082 8A E8 2227 MOV CH,AL
1084 B1 01 2228 MOV CL,1
1086 E8 63 F2 2229 CALL MROPS
1089 B1 F6 2230 MOV CL,0F6H
108B E8 CF FA 2231 CALL IMMED
108E B5 A8 2232 MOV CH,0A8H
1090 E9 16 FE 2233 JMP AIMM
1093 2234 GRP21:
1093 E8 32 F3 2235 CALL GETOP
1096 3C 04 2236 CMP AL,SREG
1098 B1 1C 2237 MOV CL,28
109A 75 C1 2238 JNZ ERRJ
109C B5 26 2239 MOV CH,26H
109E 2240 PACKREG:
109E 8A C2 2241 MOV AL,DL
10A0 02 C0 2242 ADD AL,AL
10A2 02 C0 2243 ADD AL,AL
10A4 02 C0 2244 ADD AL,AL
10A6 0A C5 2245 OR AL,CH
10A8 E9 F1 FA 2246 JMP PUT
10AB 2247 GRP22:
10AB E8 1A F3 2248 CALL GETOP
10AE B9 00 8F 2249 MOV CX,8F00H
10B1 3C 00 2250 CMP AL,UNDEFID
10B3 75 03 2251 JNZ $+5
10B5 E9 EA FB 2252 JMP PMEM
10B8 B5 58 2253 MOV CH,58H
10BA 3C 03 2254 CMP AL,XREG
10BC 75 03 2255 JNZ $+5
10BE E9 ED FB 2256 JMP PXREG
10C1 B5 07 2257 MOV CH,7
10C3 3C 04 2258 CMP AL,SREG
10C5 74 D7 2259 JZ PACKREG
10C7 B1 14 2260 MOV CL,20
10C9 E9 E5 F1 2261 ERR11: JMP ERROR
10CC 2262 GRP23:
10CC A2 39 21 2263 MOV [DATSIZ],AL
10CF 2264 GETDAT:
10CF E8 30 F5 2265 CALL GETSYM
10D2 B0 02 2266 MOV AL,2
10D4 E8 0A F3 2267 CALL VAL1
10D7 A0 30 21 2268 MOV AL,[SYM]
10DA 3C 2C 2269 CMP AL,','
10DC A0 39 21 2270 MOV AL,[DATSIZ]
10DF 75 05 2271 JNZ ENDDAT
10E1 E8 13 00 2272 CALL SAVDAT
10E4 EB E9 2273 JP GETDAT
10E6 2274 ENDDAT:
10E6 3C 02 2275 CMP AL,2
10E8 75 0D 2276 JNZ SAVDAT
10EA 8B 1E D6 20 2277 MOV BX,[DATA]
10EE 9F 2278 LAHF
10EF 80 CB 80 2279 OR BL,080H
10F2 9E 2280 SAHF
10F3 89 1E D6 20 2281 MOV [DATA],BX
10F7 2282 SAVDAT:
10F7 0A C0 2283 OR AL,AL
10F9 74 03 2284 JZ $+5
10FB E9 F4 FA 2285 JMP PUTBYT
10FE E9 EA FA 2286 JMP PUTWOR
1101 2287 IF:
1101 0B DB 2288 OR BX,BX
1103 74 05 2289 JZ SKIPCD
1105 FE 06 4A 21 2290 INC B,[IFFLG]
1109 C3 2291 RET
110A 2292
110A 2293 SKIPCD:
110A FE 06 4B 21 2294 INC B,[CHKLAB]
110E 2295 SKIPLP:
110E 32 C0 2296 XOR AL,AL
1110 E8 48 F1 2297 CALL NEXLIN
1113 E8 A0 F1 2298 CALL NEXTCHR
1116 3C 1A 2299 CMP AL,1AH
1118 74 40 2300 JZ END
111A E8 E5 F7 2301 CALL GETLAB
111D 72 EF 2302 JC SKIPLP
111F BF DE 20 2303 MOV DI,LENID
1122 BE 74 20 2304 MOV SI,IFEND
1125 B5 00 2305 MOV CH,0
1127 8A 0D 2306 MOV CL,[DI]
1129 FE C1 2307 INC CL
112B F3 2308 REPE
112C A6 2309 CMPB
112D 74 14 2310 JZ ENDCOND
112F BF DE 20 2311 MOV DI,LENID
1132 BE 7A 20 2312 MOV SI,IFNEST
1135 8A 0D 2313 MOV CL,[DI]
1137 FE C1 2314 INC CL
1139 F3 2315 REPE
113A A6 2316 CMPB
113B 75 D1 2317 JNZ SKIPLP
113D FE 06 4B 21 2318 INC B,[CHKLAB]
1141 EB CB 2319 JP SKIPLP
1143 2320
1143 2321 ENDCOND:
1143 FE 0E 4B 21 2322 DEC B,[CHKLAB]
1147 75 C5 2323 JNZ SKIPLP
1149 C3 2324 RET
114A 2325
114A 2326 ENDIF:
114A A0 4A 21 2327 MOV AL,[IFFLG]
114D B1 24 2328 MOV CL,36
114F FE C8 2329 DEC AL
1151 78 04 2330 JS ERRJMP
1153 A2 4A 21 2331 MOV [IFFLG],AL
1156 C3 2332 RET
1157 2333
1157 E9 57 F1 2334 ERRJMP: JMP ERROR
115A 2335
115A 2336 ;*********************************************************************
115A 2337 ;
115A 2338 ; PASS 2
115A 2339 ;
115A 2340 ;*********************************************************************
115A 2341
115A 2342 END:
115A B2 04 2343 MOV DL,4
115C 2344 WREND:
115C B5 FF 2345 MOV CH,0FFH
115E 8A C5 2346 MOV AL,CH
1160 E8 43 FA 2347 CALL GEN
1163 FE CA 2348 DEC DL
1165 75 F5 2349 JNZ WREND
1167 C7 06 A4 25 A6 25 2350 MOV [BUFPT],SRCBUF
116D C6 06 46 21 FB 2351 MOV B,[HEXCNT],-5 ;FLAG HEX BUFFER AS EMPTY
1172 C7 06 5C 21 A4 21 2352 MOV [LSTPNT],LSTBUF
1178 C7 06 5A 21 5E 21 2353 MOV [HEXPNT],HEXBUF
117E 33 C0 2354 XOR AX,AX
1180 A3 4C 21 2355 MOV [ERRCNT],AX
1183 A3 CA 20 2356 MOV [PC],AX
1186 A3 3E 21 2357 MOV [LINE],AX ;Current line number
1189 C7 06 42 21 00 01 2358 MOV [HEXADD],OBJECT
118F BA 5C 00 2359 MOV DX,FCB
1192 B4 0F 2360 MOV AH,OPEN
1194 CD 21 2361 INT 33 ;Re-open source file
1196 33 C0 2362 XOR AX,AX
1198 A3 68 00 2363 MOV [FCB+12],AX ;Set CURRENT BLOCK to zero
119B A2 7C 00 2364 MOV [FCB+20H],AL ;Set NEXT RECORD field to zero
119E C7 06 6A 00 00 04 2365 MOV [FCB+14],BUFSIZ
11A4 A2 3C 21 2366 MOV [COUNT],AL
11A7 B5 01 2367 MOV CH,1
11A9 BE A6 2A 2368 MOV SI,START
11AC 2369 FIXLINE:
11AC BF A6 2A 2370 MOV DI,START ;Store code over used up intermediate code
11AF 32 C0 2371 XOR AL,AL
11B1 A2 54 21 2372 MOV [SPC],AL ;No "special" yet (ORG, PUT, DS)
11B4 A2 3D 21 2373 MOV [ERR],AL ;No second pass errors yet
11B7 2374 NEXBT:
11B7 D0 E1 2375 SHL CL ;Shift out last bit of previous code
11B9 FE CD 2376 DEC CH ;Still have codes left?
11BB 75 05 2377 JNZ TESTTYP
11BD AC 2378 LODB ;Get next flag byte
11BE 8A C8 2379 MOV CL,AL
11C0 B5 04 2380 MOV CH,4
11C2 2381 TESTTYP:
11C2 D0 E1 2382 SHL CL ;Set flags based on two bits
11C4 70 06 2383 JO FIXUP
11C6 AC 2384 LODB
11C7 72 4E 2385 JC EMARK
11C9 2386 OBJBT:
11C9 AA 2387 STOB
11CA EB EB 2388 JP NEXBT
11CC 2389
11CC 2390 FIXUP:
11CC 2391 ;Either a word or byte fixup is needed from a forward reference
11CC AD 2392 LODW ;Get pointer to symbol
11CD 93 2393 XCHG AX,BX
11CE AD 2394 LODW ;Get constant part
11CF 03 47 01 2395 ADD AX,[BX+1] ;Add symbol value to constant part
11D2 82 3F 00 2396 CMP B,[BX],0 ;See if symbol got defined
11D5 75 07 2397 JNZ HAVDEF
11D7 C6 06 3D 21 64 2398 MOV B,[ERR],100 ;Undefined - flag error
11DC 33 C0 2399 XOR AX,AX
11DE 2400 HAVDEF:
11DE 0A C9 2401 OR CL,CL ;See if word or byte fixup
11E0 78 03 2402 JS DEFBYT
11E2 AB 2403 STOW
11E3 EB D2 2404 JP NEXBT
11E5 2405
11E5 2406 DEFBYT:
11E5 8B D0 2407 MOV DX,AX
11E7 98 2408 CBW ;Extend sign
11E8 3B C2 2409 CMP AX,DX ;See if in range +127 to -128
11EA 74 DD 2410 JZ OBJBT ;If so, it's always OK
11EC F6 D4 2411 NOT AH ;Check for range +255 to -256
11EE 3A E6 2412 CMP AH,DH
11F0 75 1B 2413 JNZ RNGERR ;Must always be in this range
11F2 2414 ;Check for short jump. If so, we're out of range; otherwise we're OK
11F2 81 FF A7 2A 2415 CMP DI,START+1 ;Only one other byte on line?
11F6 75 D1 2416 JNZ OBJBT ;Can't be short jump if not
11F8 A0 A6 2A 2417 MOV AL,[START] ;Get the first byte of this line
11FB 3C EB 2418 CMP AL,0EBH ;Direct short jump?
11FD 74 0E 2419 JZ RNGERR
11FF 24 FC 2420 AND AL,0FCH
1201 3C E0 2421 CMP AL,0E0H ;LOOP or JCXZ instruction?
1203 74 08 2422 JZ RNGERR
1205 24 F0 2423 AND AL,0F0H
1207 3C 70 2424 CMP AL,70H ;Conditional jump?
1209 8A C2 2425 MOV AL,DL ;Get code byte in AL
120B 75 BC 2426 JNZ OBJBT ;If not, we're OK
120D 2427 RNGERR:
120D C6 06 3D 21 65 2428 MOV B,[ERR],101 ;Value out of range
1212 EB B5 2429 JP OBJBT
1214 2430
1214 E9 7A 01 2431 FINIJ: JMP FINI
1217 2432
1217 2433 EMARK:
1217 3C FF 2434 CMP AL,-1 ;End of file?
1219 74 F9 2435 JZ FINIJ
121B 3C F6 2436 CMP AL,-10 ;Special item?
121D 77 5C 2437 JA SPEND
121F 51 2438 PUSH CX
1220 56 2439 PUSH SI
1221 50 2440 PUSH AX ;Save error code
1222 8A 26 52 21 2441 MOV AH,[LSTDEV]
1226 80 E4 FE 2442 AND AH,0FEH ;Reset error indicator
1229 0A 06 3D 21 2443 OR AL,[ERR] ;See if any errors on this line
122D 74 03 2444 JZ NOERR
122F 80 CC 01 2445 OR AH,1 ;Send line to console if error occured
1232 2446 NOERR:
1232 88 26 52 21 2447 MOV [LSTDEV],AH
1236 8B CF 2448 MOV CX,DI
1238 E8 EE 00 2449 CALL STRTLIN ;Print address of line
123B BE A6 2A 2450 MOV SI,START
123E 2B CE 2451 SUB CX,SI ;Get count of bytes of code
1240 74 06 2452 JZ SHOLIN
1242 2453 CODLP:
1242 AC 2454 LODB
1243 E8 59 02 2455 CALL SAVCD ;Ouput code to HEX and PRN files
1246 E2 FA 2456 LOOP CODLP
1248 2457 SHOLIN:
1248 B0 00 2458 MOV AL,0
124A 86 06 3C 21 2459 XCHG AL,[COUNT]
124E B9 07 00 2460 MOV CX,7 ;Allow 7 bytes of code per line
1251 2A C8 2461 SUB CL,AL
1253 B0 20 2462 MOV AL,' '
1255 74 0B 2463 JZ NOFIL
1257 2464 BLNK: ;Put in 3 blanks for each byte not present
1257 E8 E4 00 2465 CALL LIST
125A E8 E1 00 2466 CALL LIST
125D E8 DE 00 2467 CALL LIST
1260 E2 F5 2468 LOOP BLNK
1262 2469 NOFIL:
1262 E8 45 00 2470 CALL OUTLIN
1265 58 2471 POP AX ;Restore error code
1266 E8 6C 02 2472 CALL REPERR
1269 A0 3D 21 2473 MOV AL,[ERR]
126C E8 66 02 2474 CALL REPERR
126F 5E 2475 POP SI
1270 59 2476 POP CX
1271 A0 54 21 2477 MOV AL,[SPC] ;Any special funtion?
1274 0A C0 2478 OR AL,AL
1276 75 0D 2479 JNZ SPCFUN
1278 E9 31 FF 2480 JMP FIXLINE
127B 2481
127B 2482 SPEND:
127B A2 54 21 2483 MOV [SPC],AL ;Record special function
127E AD 2484 LODW ;Get it's data
127F A3 D6 20 2485 MOV [DATA],AX
1282 E9 32 FF 2486 JMP NEXBT
1285 2487
1285 2488 SPCFUN:
1285 8B 16 D6 20 2489 MOV DX,[DATA]
1289 3C FE 2490 CMP AL,-2
128B 74 0F 2491 JZ DORG
128D 3C FD 2492 CMP AL,-3
128F 74 12 2493 JZ DPUT
1291 2494 DDS:
1291 2495 ;Handle DS pseudo-op
1291 01 16 CA 20 2496 ADD [PC],DX
1295 01 16 42 21 2497 ADD [HEXADD],DX
1299 E9 10 FF 2498 JMP FIXLINE
129C 2499
129C 2500 DORG:
129C 2501 ;Handle ORG pseudo-op
129C 89 16 CA 20 2502 MOV [PC],DX
12A0 E9 09 FF 2503 JMP FIXLINE
12A3 2504
12A3 2505 DPUT:
12A3 2506 ;Handle PUT pseudo-op
12A3 89 16 42 21 2507 MOV [HEXADD],DX
12A7 E9 02 FF 2508 JMP FIXLINE
12AA 2509
12AA 2510 OUTLIN:
12AA 2511 ;Copy the source line to the ouput device. Line will be preceded by
12AA 2512 ;assembler-generated line number. This routine may be called several times
12AA 2513 ;on one line (once for each line of object code bytes), so it sets a flag
12AA 2514 ;so the line will only be output on the first call.
12AA B0 FF 2515 MOV AL,-1
12AC 86 06 48 21 2516 XCHG AL,[LINFLG]
12B0 0A C0 2517 OR AL,AL
12B2 75 33 2518 JNZ CRLF ;Output line only if first time
12B4 A1 3E 21 2519 MOV AX,[LINE]
12B7 40 2520 INC AX
12B8 A3 3E 21 2521 MOV [LINE],AX
12BB B7 00 2522 MOV BH,0 ;No leading zero suppression
12BD E8 30 00 2523 CALL OUT10
12C0 B0 20 2524 MOV AL," "
12C2 E8 79 00 2525 CALL LIST
12C5 A0 A5 20 2526 MOV AL,[LSTFCB]
12C8 3C 5A 2527 CMP AL,'Z'
12CA 74 1B 2528 JZ CRLF ;Don't call NEXTCHR if listing suppressed
12CC 56 2529 PUSH SI ;Save the only register destroyed by NEXTCHR
12CD 2530 OUTLN:
12CD E8 E6 EF 2531 CALL NEXTCHR
12D0 E8 6B 00 2532 CALL LIST
12D3 3C 0A 2533 CMP AL,10 ;Output until linefeed found
12D5 75 F6 2534 JNZ OUTLN
12D7 5E 2535 POP SI
12D8 C3 2536 RET
12D9 2537
12D9 2538 PRTCNT:
12D9 BB 4C 20 2539 MOV BX,ERCNTM
12DC E8 25 02 2540 CALL PRINT
12DF A1 4C 21 2541 MOV AX,[ERRCNT]
12E2 B7 10 2542 MOV BH,"0"-" " ;Enable leading zero suppression
12E4 E8 09 00 2543 CALL OUT10
12E7 2544 CRLF:
12E7 B0 0D 2545 MOV AL,13
12E9 E8 52 00 2546 CALL LIST
12EC B0 0A 2547 MOV AL,10
12EE EB 4E 2548 JP LIST
12F0 2549
12F0 2550 OUT10:
12F0 33 D2 2551 XOR DX,DX
12F2 BF 10 27 2552 MOV DI,10000
12F5 F7 F7 2553 DIV AX,DI
12F7 0A C0 2554 OR AL,AL ;>10,000?
12F9 75 02 2555 JNZ LEAD
12FB 2C 10 2556 SUB AL,"0"-" " ;Convert leading zero to blank
12FD 2557 LEAD:
12FD 04 30 2558 ADD AL,"0"
12FF E8 3C 00 2559 CALL LIST
1302 92 2560 XCHG AX,DX
1303 B3 64 2561 MOV BL,100
1305 F6 F3 2562 DIV AL,BL
1307 8A DC 2563 MOV BL,AH
1309 E8 0C 00 2564 CALL HIDIG ;Convert to decimal and print 1000s digit
130C E8 0E 00 2565 CALL DIGIT ;Print 100s digit
130F 8A C3 2566 MOV AL,BL
1311 E8 04 00 2567 CALL HIDIG ;Convert to decimal and print 10s digit
1314 B7 00 2568 MOV BH,0 ;Ensure leading zero suppression is off
1316 EB 05 2569 JP DIGIT
1318 2570
1318 2571 HIDIG:
1318 D4 0A 2572 AAM ;Convert binary to unpacked BCD
131A 0D 30 30 2573 OR AX,3030H ;Add "0" bias
131D 2574 DIGIT:
131D 86 C4 2575 XCHG AL,AH
131F 3C 30 2576 CMP AL,"0"
1321 74 02 2577 JZ SUPZ
1323 B7 00 2578 MOV BH,0 ;Turn off zero suppression if not zero
1325 2579 SUPZ:
1325 2A C7 2580 SUB AL,BH ;Convert leading zeros to blanks
1327 EB 15 2581 JP LIST
1329 2582
1329 2583 STRTLIN:
1329 C6 06 48 21 00 2584 MOV B,[LINFLG],0
132E 8B 1E CA 20 2585 MOV BX,[PC]
1332 8A C7 2586 MOV AL,BH
1334 E8 4D 00 2587 CALL PHEX
1337 8A C3 2588 MOV AL,BL
1339 2589 PHEXB:
1339 E8 48 00 2590 CALL PHEX
133C B0 20 2591 MOV AL,' '
133E 2592 LIST:
133E 50 2593 PUSH AX
133F 52 2594 PUSH DX
1340 24 7F 2595 AND AL,7FH
1342 8A D0 2596 MOV DL,AL
1344 F6 06 52 21 03 2597 TEST B,[LSTDEV],3 ;See if output goes to console
1349 74 04 2598 JZ PRNCHK
134B B4 02 2599 MOV AH,2
134D CD 21 2600 INT 33 ;Output to console
134F 2601 PRNCHK:
134F F6 06 52 21 04 2602 TEST B,[LSTDEV],4 ;See if output goes to printer
1354 74 04 2603 JZ FILCHK
1356 B4 05 2604 MOV AH,5
1358 CD 21 2605 INT 33 ;Output to printer
135A 2606 FILCHK:
135A 8A C2 2607 MOV AL,DL
135C 5A 2608 POP DX
135D F6 06 52 21 80 2609 TEST B,[LSTDEV],80H ;See if output goes to a file
1362 74 03 2610 JZ LISTRET
1364 E8 02 00 2611 CALL WRTBUF
1367 2612 LISTRET:
1367 58 2613 POP AX
1368 C3 2614 RET
1369 2615
1369 2616 WRTBUF:
1369 57 2617 PUSH DI
136A 8B 3E 5C 21 2618 MOV DI,[LSTPNT]
136E AA 2619 STOB
136F 81 FF A4 25 2620 CMP DI,LSTBUF+LSTBUFSIZ
1373 75 09 2621 JNZ SAVPT
1375 50 2622 PUSH AX
1376 51 2623 PUSH CX
1377 52 2624 PUSH DX
1378 E8 61 02 2625 CALL FLUSHBUF
137B 5A 2626 POP DX
137C 59 2627 POP CX
137D 58 2628 POP AX
137E 2629 SAVPT:
137E 89 3E 5C 21 2630 MOV [LSTPNT],DI
1382 5F 2631 POP DI
1383 C3 2632 RET
1384 2633
1384 2634 PHEX:
1384 50 2635 PUSH AX
1385 E8 74 02 2636 CALL UHALF
1388 E8 B3 FF 2637 CALL LIST
138B 58 2638 POP AX
138C E8 75 02 2639 CALL LHALF
138F EB AD 2640 JP LIST
1391 2641
1391 2642 FINI:
1391 80 0E 52 21 01 2643 OR B,[LSTDEV],1
1396 E8 40 FF 2644 CALL PRTCNT
1399 80 26 52 21 FE 2645 AND B,[LSTDEV],0FEH
139E A0 80 20 2646 MOV AL,[HEXFCB]
13A1 3C 5A 2647 CMP AL,'Z'
13A3 74 35 2648 JZ SYMDMP
13A5 A0 46 21 2649 MOV AL,[HEXCNT]
13A8 3C FB 2650 CMP AL,-5
13AA 74 03 2651 JZ L0012
13AC E8 DF 01 2652 CALL ENHEXL
13AF 2653 L0012:
13AF B0 3A 2654 MOV AL,':'
13B1 E8 1E 02 2655 CALL PUTCHR
13B4 B5 0A 2656 MOV CH,10
13B6 2657 HEXEND:
13B6 51 2658 PUSH CX
13B7 B0 30 2659 MOV AL,'0'
13B9 E8 16 02 2660 CALL PUTCHR
13BC 59 2661 POP CX
13BD FE CD 2662 DEC CH
13BF 75 F5 2663 JNZ HEXEND
13C1 B0 0D 2664 MOV AL,13
13C3 E8 0C 02 2665 CALL PUTCHR
13C6 B0 0A 2666 MOV AL,10
13C8 E8 07 02 2667 CALL PUTCHR
13CB B0 1A 2668 MOV AL,1AH
13CD E8 02 02 2669 CALL PUTCHR
13D0 E8 E4 01 2670 CALL WRTHEX ;Flush HEX file buffer
13D3 BA 80 20 2671 MOV DX,HEXFCB
13D6 B4 10 2672 MOV AH,CLOSE
13D8 CD 21 2673 INT 33
13DA 2674 SYMDMP:
13DA A0 35 21 2675 MOV AL,[SYMFLG]
13DD 3C 53 2676 CMP AL,'S'
13DF 75 2A 2677 JNZ ENDSYM
13E1 A0 52 21 2678 MOV AL,[LSTDEV]
13E4 0A C0 2679 OR AL,AL ;Any output device for symbol table dump?
13E6 75 05 2680 JNZ DOSYMTAB
13E8 0C 01 2681 OR AL,1 ;If not, send it to console
13EA A2 52 21 2682 MOV [LSTDEV],AL
13ED 2683 DOSYMTAB:
13ED BB 5D 20 2684 MOV BX,SYMMES
13F0 E8 11 01 2685 CALL PRINT
13F3 8B 16 31 21 2686 MOV DX,[BASE]
13F7 8A C6 2687 MOV AL,DH
13F9 0A C2 2688 OR AL,DL
13FB 74 0E 2689 JZ ENDSYM
13FD C6 06 36 21 05 2690 MOV B,[SYMLIN],SYMWID ;No symbols on this line yet
1402 8B 1E 33 21 2691 MOV BX,[HEAP]
1406 8B E3 2692 MOV SP,BX ;Need maximum stack for recursive tree walk
1408 E8 1A 00 2693 CALL NODE
140B 2694 ENDSYM:
140B F6 06 52 21 80 2695 TEST B,[LSTDEV],80H ;Print listing to file?
1410 74 10 2696 JZ EXIT
1412 B0 1A 2697 MOV AL,1AH
1414 E8 52 FF 2698 CALL WRTBUF ;Write end-of-file mark
1417 8B 3E 5C 21 2699 MOV DI,[LSTPNT]
141B E8 BE 01 2700 CALL FLUSHBUF
141E B4 10 2701 MOV AH,CLOSE
1420 CD 21 2702 INT 33
1422 E9 DB EB 2703 EXIT: JMP 0
1425 2704
1425 2705 NODE:
1425 87 DA 2706 XCHG DX,BX
1427 53 2707 PUSH BX
1428 8A 17 2708 MOV DL,[BX]
142A B6 00 2709 MOV DH,0
142C 43 2710 INC BX
142D 03 DA 2711 ADD BX,DX
142F 8B 17 2712 MOV DX,[BX]
1431 0B D2 2713 OR DX,DX
1433 74 03 2714 JZ L0014
1435 E8 ED FF 2715 CALL NODE
1438 2716 L0014:
1438 5B 2717 POP BX
1439 8A 07 2718 MOV AL,[BX]
143B 43 2719 INC BX
143C 8A E8 2720 MOV CH,AL
143E 04 18 2721 ADD AL,24
1440 D0 E8 2722 SHR AL
1442 D0 E8 2723 SHR AL
1444 D0 E8 2724 SHR AL
1446 8A C8 2725 MOV CL,AL
1448 FE C1 2726 INC CL ;Invert last bit
144A 80 E1 01 2727 AND CL,1 ;Number of extra tabs needed (0 or 1)
144D D0 E8 2728 SHR AL ;Number of positions wide this symbol needs
144F 28 06 36 21 2729 SUB [SYMLIN],AL
1453 73 0A 2730 JNC WRTSYM ;Will it fit?
1455 2C 05 2731 SUB AL,SYMWID
1457 F6 D8 2732 NEG AL
1459 A2 36 21 2733 MOV [SYMLIN],AL
145C E8 88 FE 2734 CALL CRLF ;Start new line if not
145F 2735 WRTSYM:
145F 8A 07 2736 MOV AL,[BX]
1461 43 2737 INC BX
1462 E8 D9 FE 2738 CALL LIST
1465 FE CD 2739 DEC CH
1467 75 F6 2740 JNZ WRTSYM
1469 FE C1 2741 INC CL
146B 2742 TABVAL:
146B B0 09 2743 MOV AL,9
146D E8 CE FE 2744 CALL LIST
1470 E2 F9 2745 LOOP TABVAL
1472 43 2746 INC BX
1473 43 2747 INC BX
1474 53 2748 PUSH BX
1475 8A 47 04 2749 MOV AL,[BX+4]
1478 E8 09 FF 2750 CALL PHEX
147B 8A 47 03 2751 MOV AL,[BX+3]
147E E8 03 FF 2752 CALL PHEX
1481 82 3E 36 21 00 2753 CMP B,[SYMLIN],0 ;Will any more fit on line?
1486 74 07 2754 JZ NEXSYMLIN
1488 B0 09 2755 MOV AL,9
148A E8 B1 FE 2756 CALL LIST
148D EB 08 2757 JP RIGHTSON
148F 2758 NEXSYMLIN:
148F E8 55 FE 2759 CALL CRLF
1492 C6 06 36 21 05 2760 MOV B,[SYMLIN],SYMWID
1497 2761 RIGHTSON:
1497 5B 2762 POP BX
1498 8B 17 2763 MOV DX,[BX]
149A 0B D2 2764 OR DX,DX
149C 75 87 2765 JNZ NODE
149E C3 2766 RET
149F 2767
149F 2768 SAVCD:
149F A2 49 21 2769 MOV [PREV],AL
14A2 53 2770 PUSH BX
14A3 51 2771 PUSH CX
14A4 50 2772 PUSH AX
14A5 52 2773 PUSH DX
14A6 E8 72 00 2774 CALL CODBYT
14A9 5A 2775 POP DX
14AA BB 3C 21 2776 MOV BX,COUNT
14AD FE 07 2777 INC B,[BX]
14AF 8A 07 2778 MOV AL,[BX]
14B1 3C 08 2779 CMP AL,8
14B3 75 11 2780 JNZ NOEXT
14B5 C6 07 01 2781 MOV B,[BX],1
14B8 E8 EF FD 2782 CALL OUTLIN
14BB B0 20 2783 MOV AL,' '
14BD B5 05 2784 MOV CH,5
14BF 2785 TAB:
14BF E8 7C FE 2786 CALL LIST
14C2 FE CD 2787 DEC CH
14C4 75 F9 2788 JNZ TAB
14C6 2789 NOEXT:
14C6 58 2790 POP AX
14C7 E8 6F FE 2791 CALL PHEXB
14CA 59 2792 POP CX
14CB FF 06 CA 20 2793 INC [PC]
14CF FF 06 42 21 2794 INC [HEXADD]
14D3 5B 2795 POP BX
14D4 C3 2796 RET
14D5 2797
14D5 2798 REPERR:
14D5 0A C0 2799 OR AL,AL ;Did an error occur?
14D7 74 FB 2800 JZ RET
14D9 FF 06 4C 21 2801 INC [ERRCNT]
14DD 50 2802 PUSH AX
14DE BB D6 1F 2803 MOV BX,ERRMES ;Print "ERROR"
14E1 E8 20 00 2804 CALL PRINT
14E4 58 2805 POP AX
14E5 2806 ;We have error number in AL. See if there's an error message for it
14E5 BF 08 1C 2807 MOV DI,ERRTAB
14E8 B3 80 2808 MOV BL,80H
14EA 2809 ERRLOOK:
14EA AE 2810 SCASB ;Do we have the error message
14EB 76 07 2811 JBE HAVMES ;Quit looking if we have it or passed it
14ED 93 2812 XCHG AX,BX ;Put 80H in AL to look for end of this message
14EE 2813 NEXTMES:
14EE AE 2814 SCASB ;Look for high bit set in message
14EF 77 FD 2815 JA NEXTMES ; which means we've reached the end
14F1 93 2816 XCHG AX,BX ;Restore error number to AL
14F2 EB F6 2817 JMPS ERRLOOK ;Keep looking
14F4 2818
14F4 2819 HAVMES:
14F4 8B DF 2820 MOV BX,DI ;Put address of message in BX
14F6 74 06 2821 JZ PRNERR ;Do we have a message for this error?
14F8 E8 89 FE 2822 CALL PHEX ;If not, just print error number
14FB E9 E9 FD 2823 JMP CRLF
14FE 2824
14FE 2825 PRNERR:
14FE E8 03 00 2826 CALL PRINT
1501 E9 E3 FD 2827 JMP CRLF
1504 2828
1504 2829 PRINT:
1504 8A 07 2830 MOV AL,[BX]
1506 E8 35 FE 2831 CALL LIST
1509 0A C0 2832 OR AL,AL
150B 78 C7 2833 JS RET
150D 43 2834 INC BX
150E EB F4 2835 JP PRINT
1510 2836
1510 2837 OUTA:
1510 8A D0 2838 MOV DL,AL
1512 2839 OUT:
1512 80 E2 7F 2840 AND DL,7FH
1515 B1 02 2841 MOV CL,2
1517 2842 SYSTEM:
1517 E8 EB EA 2843 CALL 5
151A C3 2844 RET
151B 2845
151B 2846 CODBYT:
151B 82 3E 80 20 5A 2847 CMP B,[HEXFCB],"Z"
1520 74 F8 2848 JZ RET
1522 50 2849 PUSH AX
1523 8B 16 44 21 2850 MOV DX,[LASTAD]
1527 8B 1E 42 21 2851 MOV BX,[HEXADD]
152B 89 1E 44 21 2852 MOV [LASTAD],BX
152F 42 2853 INC DX
1530 A0 46 21 2854 MOV AL,[HEXCNT]
1533 3C FB 2855 CMP AL,-5
1535 74 07 2856 JZ NEWLIN
1537 3B DA 2857 CMP BX,DX
1539 74 2E 2858 JZ AFHEX
153B E8 50 00 2859 CALL ENHEXL
153E 2860 NEWLIN:
153E B0 3A 2861 MOV AL,':'
1540 E8 8F 00 2862 CALL PUTCHR
1543 B0 FC 2863 MOV AL,-4
1545 A2 46 21 2864 MOV [HEXCNT],AL
1548 32 C0 2865 XOR AL,AL
154A A2 47 21 2866 MOV [CHKSUM],AL
154D 8B 1E 5A 21 2867 MOV BX,[HEXPNT]
1551 89 1E 40 21 2868 MOV [HEXLEN],BX
1555 E8 12 00 2869 CALL HEXBYT
1558 A0 43 21 2870 MOV AL,[HEXADD+1]
155B E8 0C 00 2871 CALL HEXBYT
155E A0 42 21 2872 MOV AL,[HEXADD]
1561 E8 06 00 2873 CALL HEXBYT
1564 32 C0 2874 XOR AL,AL
1566 E8 01 00 2875 CALL HEXBYT
1569 2876 AFHEX:
1569 58 2877 POP AX
156A 2878 HEXBYT:
156A 8A E8 2879 MOV CH,AL
156C BB 47 21 2880 MOV BX,CHKSUM
156F 02 07 2881 ADD AL,[BX]
1571 88 07 2882 MOV [BX],AL
1573 8A C5 2883 MOV AL,CH
1575 E8 84 00 2884 CALL UHALF
1578 E8 57 00 2885 CALL PUTCHR
157B 8A C5 2886 MOV AL,CH
157D E8 84 00 2887 CALL LHALF
1580 E8 4F 00 2888 CALL PUTCHR
1583 BB 46 21 2889 MOV BX,HEXCNT
1586 FE 07 2890 INC B,[BX]
1588 8A 07 2891 MOV AL,[BX]
158A 3C 1A 2892 CMP AL,26
158C 75 8C 2893 JNZ RET
158E 2894 ENHEXL:
158E 8B 3E 40 21 2895 MOV DI,[HEXLEN]
1592 8A E8 2896 MOV CH,AL
1594 E8 65 00 2897 CALL UHALF
1597 AA 2898 STOB
1598 8A C5 2899 MOV AL,CH
159A E8 67 00 2900 CALL LHALF
159D AA 2901 STOB
159E B0 FA 2902 MOV AL,-6
15A0 A2 46 21 2903 MOV [HEXCNT],AL
15A3 A0 47 21 2904 MOV AL,[CHKSUM]
15A6 02 C5 2905 ADD AL,CH
15A8 F6 D8 2906 NEG AL
15AA E8 BD FF 2907 CALL HEXBYT
15AD B0 0D 2908 MOV AL,13
15AF E8 20 00 2909 CALL PUTCHR
15B2 B0 0A 2910 MOV AL,10
15B4 E8 1B 00 2911 CALL PUTCHR
15B7 2912 WRTHEX:
15B7 2913 ;Write out the line
15B7 BA 5E 21 2914 MOV DX,HEXBUF
15BA 89 16 5A 21 2915 MOV [HEXPNT],DX
15BE B4 1A 2916 MOV AH,SETDMA
15C0 CD 21 2917 INT 33
15C2 2B FA 2918 SUB DI,DX ;Length of buffer
15C4 8B CF 2919 MOV CX,DI
15C6 BA 80 20 2920 MOV DX,HEXFCB
15C9 B4 28 2921 MOV AH,BLKWRT
15CB CD 21 2922 INT 33
15CD 0A C0 2923 OR AL,AL
15CF 75 25 2924 JNZ DSKFUL
15D1 C3 2925 RET
15D2 2926
15D2 2927 PUTCHR:
15D2 8B 3E 5A 21 2928 MOV DI,[HEXPNT]
15D6 AA 2929 STOB
15D7 89 3E 5A 21 2930 MOV [HEXPNT],DI
15DB C3 2931 RET
15DC 2932
15DC 2933 FLUSHBUF:
15DC 8B CF 2934 MOV CX,DI
15DE BA A4 21 2935 MOV DX,LSTBUF
15E1 8B FA 2936 MOV DI,DX
15E3 2B CA 2937 SUB CX,DX
15E5 74 F4 2938 JZ RET ;Buffer empty?
15E7 B4 1A 2939 MOV AH,SETDMA
15E9 CD 21 2940 INT 33
15EB BA A5 20 2941 MOV DX,LSTFCB
15EE B4 28 2942 MOV AH,BLKWRT
15F0 CD 21 2943 INT 33
15F2 0A C0 2944 OR AL,AL
15F4 74 E5 2945 JZ RET
15F6 2946 DSKFUL:
15F6 BB 27 20 2947 MOV BX,WRTERR
15F9 E9 7A EC 2948 JMP PRERR
15FC 2949
15FC 2950 UHALF:
15FC D0 D8 2951 RCR AL
15FE D0 D8 2952 RCR AL
1600 D0 D8 2953 RCR AL
1602 D0 D8 2954 RCR AL
1604 2955 LHALF:
1604 24 0F 2956 AND AL,0FH
1606 0C 30 2957 OR AL,30H
1608 3C 3A 2958 CMP AL,'9'+1
160A 72 CF 2959 JC RET
160C 04 07 2960 ADD AL,7
160E C3 2961 RET
160F 2962
160F 00 2963 NONE: DB 0
1610 2964
1610 2965 ; 8086 MNEMONIC TABLE
1610 2966
1610 2967 ; This table is actually a sequence of subtables, each starting with a label.
1610 2968 ; The label signifies which mnemonics the subtable applies to--A3, for example,
1610 2969 ; means all 3-letter mnemonics beginning with A.
1610 2970
1610 2971 A3:
1610 07 2972 DB 7
1611 64 64 2973 DB 'dd'
1613 C1 0D 2974 DW GRP7
1615 02 2975 DB 2
1616 6E 64 2976 DB 'nd'
1618 97 0E 2977 DW GRP13
161A 22 2978 DB 22H
161B 64 63 2979 DB 'dc'
161D C1 0D 2980 DW GRP7
161F 12 2981 DB 12H
1620 61 61 2982 DB 'aa'
1622 9C 0B 2983 DW PUT
1624 37 2984 DB 37H
1625 61 73 2985 DB 'as'
1627 9C 0B 2986 DW PUT
1629 3F 2987 DB 3FH
162A 61 6D 2988 DB 'am'
162C 65 0E 2989 DW GRP11
162E D4 2990 DB 0D4H
162F 61 64 2991 DB 'ad'
1631 65 0E 2992 DW GRP11
1633 D5 2993 DB 0D5H
1634 2994 A5:
1634 01 2995 DB 1
1635 6C 69 67 6E 2996 DB 'lign'
1639 6D 0D 2997 DW ALIGN
163B 00 2998 DB 0
163C 2999 C3:
163C 07 3000 DB 7
163D 6D 70 3001 DB 'mp'
163F C1 0D 3002 DW GRP7
1641 3A 3003 DB 3AH
1642 6C 63 3004 DB 'lc'
1644 9C 0B 3005 DW PUT
1646 F8 3006 DB 0F8H
1647 6C 64 3007 DB 'ld'
1649 9C 0B 3008 DW PUT
164B FC 3009 DB 0FCH
164C 6C 69 3010 DB 'li'
164E 9C 0B 3011 DW PUT
1650 FA 3012 DB 0FAH
1651 6D 63 3013 DB 'mc'
1653 9C 0B 3014 DW PUT
1655 F5 3015 DB 0F5H
1656 62 77 3016 DB 'bw'
1658 9C 0B 3017 DW PUT
165A 98 3018 DB 98H
165B 77 64 3019 DB 'wd'
165D 9C 0B 3020 DW PUT
165F 99 3021 DB 99H
1660 3022 C4:
1660 03 3023 DB 3
1661 61 6C 6C 3024 DB 'all'
1664 C1 0E 3025 DW GRP14
1666 9A 3026 DB 9AH
1667 6D 70 62 3027 DB 'mpb'
166A 9C 0B 3028 DW PUT
166C A6 3029 DB 0A6H
166D 6D 70 77 3030 DB 'mpw'
1670 9C 0B 3031 DW PUT
1672 A7 3032 DB 0A7H
1673 3033 C5:
1673 02 3034 DB 2
1674 6D 70 73 62 3035 DB 'mpsb'
1678 9C 0B 3036 DW PUT
167A A6 3037 DB 0A6H
167B 6D 70 73 77 3038 DB 'mpsw'
167F 9C 0B 3039 DW PUT
1681 A7 3040 DB 0A7H
1682 3041 D2:
1682 05 3042 DB 5
1683 62 3043 DB 'b'
1684 CC 10 3044 DW GRP23
1686 01 3045 DB 1
1687 77 3046 DB 'w'
1688 CC 10 3047 DW GRP23
168A 00 3048 DB 0
168B 6D 3049 DB 'm'
168C CC 10 3050 DW GRP23
168E 02 3051 DB 2
168F 73 3052 DB 's'
1690 3B 0D 3053 DW GRP5
1692 01 3054 DB 1
1693 69 3055 DB 'i'
1694 9C 0B 3056 DW PUT
1696 FA 3057 DB 0FAH
1697 3058 D3:
1697 04 3059 DB 4
1698 65 63 3060 DB 'ec'
169A E9 0D 3061 DW GRP8
169C 49 3062 DB 49H
169D 69 76 3063 DB 'iv'
169F 3D 0E 3064 DW GRP10
16A1 30 3065 DB 30H
16A2 61 61 3066 DB 'aa'
16A4 9C 0B 3067 DW PUT
16A6 27 3068 DB 27H
16A7 61 73 3069 DB 'as'
16A9 9C 0B 3070 DW PUT
16AB 2F 3071 DB 2FH
16AC 3072 D4:
16AC 01 3073 DB 1
16AD 6F 77 6E 3074 DB 'own'
16B0 9C 0B 3075 DW PUT
16B2 FD 3076 DB 0FDH
16B3 3077 E2:
16B3 01 3078 DB 1
16B4 69 3079 DB 'i'
16B5 9C 0B 3080 DW PUT
16B7 FB 3081 DB 0FBH
16B8 3082 E3:
16B8 03 3083 DB 3
16B9 71 75 3084 DB 'qu'
16BB 3B 0D 3085 DW GRP5
16BD 02 3086 DB 2
16BE 73 63 3087 DB 'sc'
16C0 1B 10 3088 DW GRP19
16C2 D8 3089 DB 0D8H
16C3 6E 64 3090 DB 'nd'
16C5 5A 11 3091 DW END
16C7 00 3092 DB 0
16C8 3093 E5:
16C8 01 3094 DB 1
16C9 6E 64 69 66 3095 DB 'ndif'
16CD 4A 11 3096 DW ENDIF
16CF 00 3097 DB 0
16D0 3098 H3:
16D0 01 3099 DB 1
16D1 6C 74 3100 DB 'lt'
16D3 9C 0B 3101 DW PUT
16D5 F4 3102 DB 0F4H
16D6 3103 H4:
16D6 01 3104 DB 1
16D7 61 6C 74 3105 DB 'alt'
16DA 9C 0B 3106 DW PUT
16DC F4 3107 DB 0F4H
16DD 3108 I2:
16DD 02 3109 DB 2
16DE 6E 3110 DB 'n'
16DF 15 0D 3111 DW GRP4
16E1 E4 3112 DB 0E4H
16E2 66 3113 DB 'f'
16E3 3B 0D 3114 DW GRP5
16E5 04 3115 DB 4
16E6 3116 I3:
16E6 04 3117 DB 4
16E7 6E 63 3118 DB 'nc'
16E9 E9 0D 3119 DW GRP8
16EB 41 3120 DB 41H
16EC 6E 62 3121 DB 'nb'
16EE 15 0D 3122 DW GRP4
16F0 E4 3123 DB 0E4H
16F1 6E 77 3124 DB 'nw'
16F3 15 0D 3125 DW GRP4
16F5 E5 3126 DB 0E5H
16F6 6E 74 3127 DB 'nt'
16F8 F0 0F 3128 DW GRP18
16FA CC 3129 DB 0CCH
16FB 3130 I4:
16FB 04 3131 DB 4
16FC 6D 75 6C 3132 DB 'mul'
16FF 3D 0E 3133 DW GRP10
1701 28 3134 DB 28H
1702 64 69 76 3135 DB 'div'
1705 3D 0E 3136 DW GRP10
1707 38 3137 DB 38H
1708 72 65 74 3138 DB 'ret'
170B 9C 0B 3139 DW PUT
170D CF 3140 DB 0CFH
170E 6E 74 6F 3141 DB 'nto'
1711 9C 0B 3142 DW PUT
1713 CE 3143 DB 0CEH
1714 3144 J2:
1714 0A 3145 DB 10
1715 70 3146 DB 'p'
1716 B7 0F 3147 DW GRP17
1718 EB 3148 DB 0EBH
1719 7A 3149 DB 'z'
171A B7 0F 3150 DW GRP17
171C 74 3151 DB 74H
171D 65 3152 DB 'e'
171E B7 0F 3153 DW GRP17
1720 74 3154 DB 74H
1721 6C 3155 DB 'l'
1722 B7 0F 3156 DW GRP17
1724 7C 3157 DB 7CH
1725 62 3158 DB 'b'
1726 B7 0F 3159 DW GRP17
1728 72 3160 DB 72H
1729 61 3161 DB 'a'
172A B7 0F 3162 DW GRP17
172C 77 3163 DB 77H
172D 67 3164 DB 'g'
172E B7 0F 3165 DW GRP17
1730 7F 3166 DB 7FH
1731 6F 3167 DB 'o'
1732 B7 0F 3168 DW GRP17
1734 70 3169 DB 70H
1735 73 3170 DB 's'
1736 B7 0F 3171 DW GRP17
1738 78 3172 DB 78H
1739 63 3173 DB 'c'
173A B7 0F 3174 DW GRP17
173C 72 3175 DB 72H
173D 3176 J3:
173D 11 3177 DB 17
173E 6D 70 3178 DB 'mp'
1740 C1 0E 3179 DW GRP14
1742 EA 3180 DB 0EAH
1743 6E 7A 3181 DB 'nz'
1745 B7 0F 3182 DW GRP17
1747 75 3183 DB 75H
1748 6E 65 3184 DB 'ne'
174A B7 0F 3185 DW GRP17
174C 75 3186 DB 75H
174D 6E 6C 3187 DB 'nl'
174F B7 0F 3188 DW GRP17
1751 7D 3189 DB 7DH
1752 67 65 3190 DB 'ge'
1754 B7 0F 3191 DW GRP17
1756 7D 3192 DB 7DH
1757 6E 62 3193 DB 'nb'
1759 B7 0F 3194 DW GRP17
175B 73 3195 DB 73H
175C 61 65 3196 DB 'ae'
175E B7 0F 3197 DW GRP17
1760 73 3198 DB 73H
1761 6E 63 3199 DB 'nc'
1763 B7 0F 3200 DW GRP17
1765 73 3201 DB 73H
1766 6E 67 3202 DB 'ng'
1768 B7 0F 3203 DW GRP17
176A 7E 3204 DB 7EH
176B 6C 65 3205 DB 'le'
176D B7 0F 3206 DW GRP17
176F 7E 3207 DB 7EH
1770 6E 61 3208 DB 'na'
1772 B7 0F 3209 DW GRP17
1774 76 3210 DB 76H
1775 62 65 3211 DB 'be'
1777 B7 0F 3212 DW GRP17
1779 76 3213 DB 76H
177A 70 65 3214 DB 'pe'
177C B7 0F 3215 DW GRP17
177E 7A 3216 DB 7AH
177F 6E 70 3217 DB 'np'
1781 B7 0F 3218 DW GRP17
1783 7B 3219 DB 7BH
1784 70 6F 3220 DB 'po'
1786 B7 0F 3221 DW GRP17
1788 7B 3222 DB 7BH
1789 6E 6F 3223 DB 'no'
178B B7 0F 3224 DW GRP17
178D 71 3225 DB 71H
178E 6E 73 3226 DB 'ns'
1790 B7 0F 3227 DW GRP17
1792 79 3228 DB 79H
1793 3229 J4:
1793 06 3230 DB 6
1794 6D 70 73 3231 DB 'mps'
1797 B7 0F 3232 DW GRP17
1799 EB 3233 DB 0EBH
179A 63 78 7A 3234 DB 'cxz'
179D B7 0F 3235 DW GRP17
179F E3 3236 DB 0E3H
17A0 6E 67 65 3237 DB 'nge'
17A3 B7 0F 3238 DW GRP17
17A5 7C 3239 DB 7CH
17A6 6E 61 65 3240 DB 'nae'
17A9 B7 0F 3241 DW GRP17
17AB 72 3242 DB 72H
17AC 6E 62 65 3243 DB 'nbe'
17AF B7 0F 3244 DW GRP17
17B1 77 3245 DB 77H
17B2 6E 6C 65 3246 DB 'nle'
17B5 B7 0F 3247 DW GRP17
17B7 7F 3248 DB 7FH
17B8 3249 L3:
17B8 03 3250 DB 3
17B9 65 61 3251 DB 'ea'
17BB B5 0D 3252 DW GRP6
17BD 8D 3253 DB 8DH
17BE 64 73 3254 DB 'ds'
17C0 B5 0D 3255 DW GRP6
17C2 C5 3256 DB 0C5H
17C3 65 73 3257 DB 'es'
17C5 B5 0D 3258 DW GRP6
17C7 C4 3259 DB 0C4H
17C8 3260 L4:
17C8 05 3261 DB 5
17C9 6F 6F 70 3262 DB 'oop'
17CC B7 0F 3263 DW GRP17
17CE E2 3264 DB 0E2H
17CF 6F 64 62 3265 DB 'odb'
17D2 9C 0B 3266 DW PUT
17D4 AC 3267 DB 0ACH
17D5 6F 64 77 3268 DB 'odw'
17D8 9C 0B 3269 DW PUT
17DA AD 3270 DB 0ADH
17DB 61 68 66 3271 DB 'ahf'
17DE 9C 0B 3272 DW PUT
17E0 9F 3273 DB 9FH
17E1 6F 63 6B 3274 DB 'ock'
17E4 9C 0B 3275 DW PUT
17E6 F0 3276 DB 0F0H
17E7 3277 L5:
17E7 04 3278 DB 4
17E8 6F 6F 70 65 3279 DB 'oope'
17EC B7 0F 3280 DW GRP17
17EE E1 3281 DB 0E1H
17EF 6F 6F 70 7A 3282 DB 'oopz'
17F3 B7 0F 3283 DW GRP17
17F5 E1 3284 DB 0E1H
17F6 6F 64 73 62 3285 DB 'odsb'
17FA 9C 0B 3286 DW PUT
17FC AC 3287 DB 0ACH
17FD 6F 64 73 77 3288 DB 'odsw'
1801 9C 0B 3289 DW PUT
1803 AD 3290 DB 0ADH
1804 3291 L6:
1804 02 3292 DB 2
1805 6F 6F 70 6E 65 3293 DB 'oopne'
180A B7 0F 3294 DW GRP17
180C E0 3295 DB 0E0H
180D 6F 6F 70 6E 7A 3296 DB 'oopnz'
1812 B7 0F 3297 DW GRP17
1814 E0 3298 DB 0E0H
1815 3299 M3:
1815 02 3300 DB 2
1816 6F 76 3301 DB 'ov'
1818 33 0B 3302 DW GRP1
181A 88 3303 DB 88H
181B 75 6C 3304 DB 'ul'
181D 3D 0E 3305 DW GRP10
181F 20 3306 DB 20H
1820 3307 M4:
1820 02 3308 DB 2
1821 6F 76 62 3309 DB 'ovb'
1824 9C 0B 3310 DW PUT
1826 A4 3311 DB 0A4H
1827 6F 76 77 3312 DB 'ovw'
182A 9C 0B 3313 DW PUT
182C A5 3314 DB 0A5H
182D 3315 M5:
182D 02 3316 DB 2
182E 6F 76 73 62 3317 DB 'ovsb'
1832 9C 0B 3318 DW PUT
1834 A4 3319 DB 0A4H
1835 6F 76 73 77 3320 DB 'ovsw'
1839 9C 0B 3321 DW PUT
183B A5 3322 DB 0A5H
183C 3323 N3:
183C 03 3324 DB 3
183D 6F 74 3325 DB 'ot'
183F EF 0D 3326 DW GRP9
1841 10 3327 DB 10H
1842 65 67 3328 DB 'eg'
1844 EF 0D 3329 DW GRP9
1846 18 3330 DB 18H
1847 6F 70 3331 DB 'op'
1849 9C 0B 3332 DW PUT
184B 90 3333 DB 90H
184C 3334 O2:
184C 01 3335 DB 1
184D 72 3336 DB 'r'
184E 97 0E 3337 DW GRP13
1850 0A 3338 DB 0AH
1851 3339 O3:
1851 02 3340 DB 2
1852 75 74 3341 DB 'ut'
1854 15 0D 3342 DW GRP4
1856 E6 3343 DB 0E6H
1857 72 67 3344 DB 'rg'
1859 3B 0D 3345 DW GRP5
185B 00 3346 DB 0
185C 3347 O4:
185C 02 3348 DB 2
185D 75 74 62 3349 DB 'utb'
1860 15 0D 3350 DW GRP4
1862 E6 3351 DB 0E6H
1863 75 74 77 3352 DB 'utw'
1866 15 0D 3353 DW GRP4
1868 E7 3354 DB 0E7H
1869 3355 P3:
1869 02 3356 DB 2
186A 6F 70 3357 DB 'op'
186C AB 10 3358 DW GRP22
186E 8F 3359 DB 8FH
186F 75 74 3360 DB 'ut'
1871 3B 0D 3361 DW GRP5
1873 03 3362 DB 3
1874 3363 P4:
1874 02 3364 DB 2
1875 75 73 68 3365 DB 'ush'
1878 84 0C 3366 DW GRP2
187A FF 3367 DB 0FFH
187B 6F 70 66 3368 DB 'opf'
187E 9C 0B 3369 DW PUT
1880 9D 3370 DB 9DH
1881 3371 P5:
1881 01 3372 DB 1
1882 75 73 68 66 3373 DB 'ushf'
1886 9C 0B 3374 DW PUT
1888 9C 3375 DB 9CH
1889 3376 R3:
1889 06 3377 DB 6
188A 65 74 3378 DB 'et'
188C 3F 0F 3379 DW GRP16
188E C3 3380 DB 0C3H
188F 65 70 3381 DB 'ep'
1891 9C 0B 3382 DW PUT
1893 F3 3383 DB 0F3H
1894 6F 6C 3384 DB 'ol'
1896 6D 0E 3385 DW GRP12
1898 00 3386 DB 0
1899 6F 72 3387 DB 'or'
189B 6D 0E 3388 DW GRP12
189D 08 3389 DB 8
189E 63 6C 3390 DB 'cl'
18A0 6D 0E 3391 DW GRP12
18A2 10 3392 DB 10H
18A3 63 72 3393 DB 'cr'
18A5 6D 0E 3394 DW GRP12
18A7 18 3395 DB 18H
18A8 3396 R4:
18A8 02 3397 DB 2
18A9 65 70 7A 3398 DB 'epz'
18AC 9C 0B 3399 DW PUT
18AE F3 3400 DB 0F3H
18AF 65 70 65 3401 DB 'epe'
18B2 9C 0B 3402 DW PUT
18B4 F3 3403 DB 0F3H
18B5 3404 R5:
18B5 02 3405 DB 2
18B6 65 70 6E 7A 3406 DB 'epnz'
18BA 9C 0B 3407 DW PUT
18BC F2 3408 DB 0F2H
18BD 65 70 6E 65 3409 DB 'epne'
18C1 9C 0B 3410 DW PUT
18C3 F2 3411 DB 0F2H
18C4 3412 S3:
18C4 0B 3413 DB 11
18C5 75 62 3414 DB 'ub'
18C7 C1 0D 3415 DW GRP7
18C9 2A 3416 DB 2AH
18CA 62 62 3417 DB 'bb'
18CC C1 0D 3418 DW GRP7
18CE 1A 3419 DB 1AH
18CF 62 63 3420 DB 'bc'
18D1 C1 0D 3421 DW GRP7
18D3 1A 3422 DB 1AH
18D4 74 63 3423 DB 'tc'
18D6 9C 0B 3424 DW PUT
18D8 F9 3425 DB 0F9H
18D9 74 64 3426 DB 'td'
18DB 9C 0B 3427 DW PUT
18DD FD 3428 DB 0FDH
18DE 74 69 3429 DB 'ti'
18E0 9C 0B 3430 DW PUT
18E2 FB 3431 DB 0FBH
18E3 68 6C 3432 DB 'hl'
18E5 6D 0E 3433 DW GRP12
18E7 20 3434 DB 20H
18E8 68 72 3435 DB 'hr'
18EA 6D 0E 3436 DW GRP12
18EC 28 3437 DB 28H
18ED 61 6C 3438 DB 'al'
18EF 6D 0E 3439 DW GRP12
18F1 20 3440 DB 20H
18F2 61 72 3441 DB 'ar'
18F4 6D 0E 3442 DW GRP12
18F6 38 3443 DB 38H
18F7 65 67 3444 DB 'eg'
18F9 93 10 3445 DW GRP21
18FB 26 3446 DB 26H
18FC 3447 S4:
18FC 05 3448 DB 5
18FD 63 61 62 3449 DB 'cab'
1900 9C 0B 3450 DW PUT
1902 AE 3451 DB 0AEH
1903 63 61 77 3452 DB 'caw'
1906 9C 0B 3453 DW PUT
1908 AF 3454 DB 0AFH
1909 74 6F 62 3455 DB 'tob'
190C 9C 0B 3456 DW PUT
190E AA 3457 DB 0AAH
190F 74 6F 77 3458 DB 'tow'
1912 9C 0B 3459 DW PUT
1914 AB 3460 DB 0ABH
1915 61 68 66 3461 DB 'ahf'
1918 9C 0B 3462 DW PUT
191A 9E 3463 DB 9EH
191B 3464 S5:
191B 04 3465 DB 4
191C 63 61 73 62 3466 DB 'casb'
1920 9C 0B 3467 DW PUT
1922 AE 3468 DB 0AEH
1923 63 61 73 77 3469 DB 'casw'
1927 9C 0B 3470 DW PUT
1929 AF 3471 DB 0AFH
192A 74 6F 73 62 3472 DB 'tosb'
192E 9C 0B 3473 DW PUT
1930 AA 3474 DB 0AAH
1931 74 6F 73 77 3475 DB 'tosw'
1935 9C 0B 3476 DW PUT
1937 AB 3477 DB 0ABH
1938 3478 T4:
1938 01 3479 DB 1
1939 65 73 74 3480 DB 'est'
193C 82 10 3481 DW GRP20
193E 84 3482 DB 84H
193F 3483 U2:
193F 01 3484 DB 1
1940 70 3485 DB 'p'
1941 9C 0B 3486 DW PUT
1943 FC 3487 DB 0FCH
1944 3488 W4:
1944 01 3489 DB 1
1945 61 69 74 3490 DB 'ait'
1948 9C 0B 3491 DW PUT
194A 9B 3492 DB 9BH
194B 3493 X3:
194B 01 3494 DB 1
194C 6F 72 3495 DB 'or'
194E 97 0E 3496 DW GRP13
1950 32 3497 DB 32H
1951 3498 X4:
1951 02 3499 DB 2
1952 63 68 67 3500 DB 'chg'
1955 B5 0C 3501 DW GRP3
1957 86 3502 DB 86H
1958 6C 61 74 3503 DB 'lat'
195B 9C 0B 3504 DW PUT
195D D7 3505 DB 0D7H
195E 3506
195E 3507
195E 3508 ; 8087 MNEMONIC TABLE
195E 3509 ; Similar to 8086 table above, except NOT distinguished by opcode length
195E 3510
195E 3511 XM1: ;F2XM1
195E 01 3512 DB 1 ;One opcode
195F 78 6D B1 3513 DM "xm1"
1962 01 F0 3514 DB 1,0F0H
1964 3515
1964 3516 NDPA:
1964 03 3517 DB 3
1965 64 E4 3518 DM "dd"
1967 0E C1 3519 DB 6+ARITH,0C1H
1969 64 64 F0 3520 DM "ddp"
196C 90 00 3521 DB NEEDOP+STACKOP,0
196E 62 F3 3522 DM "bs"
1970 01 E1 3523 DB 1,0E1H
1972 3524
1972 3525 NDPB:
1972 02 3526 DB 2
1973 6C E4 3527 DM "ld"
1975 9F 20 3528 DB 7+NEEDOP+MEMORY,20H
1977 73 74 F0 3529 DM "stp"
197A 9F 30 3530 DB 7+NEEDOP+MEMORY,30H
197C 3531
197C 3532 NDPC:
197C 05 3533 DB 5
197D 6F ED 3534 DM "om"
197F 68 D1 3535 DB 0+ONEREG+REAL,0D1H
1981 6F 6D F0 3536 DM "omp"
1984 68 D9 3537 DB 0+ONEREG+REAL,0D9H
1986 68 F3 3538 DM "hs"
1988 01 E0 3539 DB 1,0E0H
198A 6F 6D 70 F0 3540 DM "ompp"
198E 06 D9 3541 DB 6,0D9H
1990 6C 65 F8 3542 DM "lex"
1993 03 E2 3543 DB 3,0E2H
1995 3544
1995 3545 NDPD:
1995 06 3546 DB 6
1996 69 F6 3547 DM "iv"
1998 0E F1 3548 DB 6+ARITH,0F1H
199A 69 76 F0 3549 DM "ivp"
199D 90 30 3550 DB NEEDOP+STACKOP,30H
199F 69 76 F2 3551 DM "ivr"
19A2 0E F9 3552 DB 6+ARITH,0F9H
19A4 69 76 72 F0 3553 DM "ivrp"
19A8 90 38 3554 DB NEEDOP+STACKOP,38H
19AA 65 63 73 74 F0 3555 DM "ecstp"
19AF 01 F6 3556 DB 1,0F6H
19B1 69 73 E9 3557 DM "isi"
19B4 03 E1 3558 DB 3,0E1H
19B6 3559
19B6 3560 NDPE:
19B6 01 3561 DB 1
19B7 6E E9 3562 DM "ni"
19B9 03 E0 3563 DB 3,0E0H
19BB 3564
19BB 3565 NDPF:
19BB 01 3566 DB 1
19BC 72 65 E5 3567 DM "ree"
19BF C5 00 3568 DB 5+NEEDOP+ONEREG,0
19C1 3569
19C1 3570 NDPI:
19C1 0D 3571 DB 13
19C2 61 64 E4 3572 DM "add"
19C5 A2 00 3573 DB 2+NEEDOP+INTEGER,0
19C7 6C E4 3574 DM "ld"
19C9 B3 00 3575 DB 3+NEEDOP+INTEGER+EXTENDED,0
19CB 73 75 E2 3576 DM "sub"
19CE A2 20 3577 DB 2+NEEDOP+INTEGER,20H
19D0 73 74 F0 3578 DM "stp"
19D3 B3 18 3579 DB 3+NEEDOP+INTEGER+EXTENDED,18H
19D5 73 F4 3580 DM "st"
19D7 A3 10 3581 DB 3+NEEDOP+INTEGER,10H
19D9 6D 75 EC 3582 DM "mul"
19DC A2 08 3583 DB 2+NEEDOP+INTEGER,8
19DE 64 69 F6 3584 DM "div"
19E1 A2 30 3585 DB 2+NEEDOP+INTEGER,30H
19E3 73 75 62 F2 3586 DM "subr"
19E7 A2 28 3587 DB 2+NEEDOP+INTEGER,28H
19E9 64 69 76 F2 3588 DM "divr"
19ED A2 38 3589 DB 2+NEEDOP+INTEGER,38H
19EF 63 6F ED 3590 DM "com"
19F2 A2 10 3591 DB 2+NEEDOP+INTEGER,10H
19F4 63 6F 6D F0 3592 DM "comp"
19F8 A2 18 3593 DB 2+NEEDOP+INTEGER,18H
19FA 6E 63 73 74 F0 3594 DM "ncstp"
19FF 01 F7 3595 DB 1,0F7H
1A01 6E 69 F4 3596 DM "nit"
1A04 03 E3 3597 DB 3,0E3H
1A06 3598
1A06 3599 NDPL:
1A06 0A 3600 DB 10
1A07 E4 3601 DM "d"
1A08 F9 00 3602 DB 1+NEEDOP+ONEREG+REAL+EXTENDED,0
1A0A 64 FA 3603 DM "dz"
1A0C 01 EE 3604 DB 1,0EEH
1A0E 64 B1 3605 DM "d1"
1A10 01 E8 3606 DB 1,0E8H
1A12 64 70 E9 3607 DM "dpi"
1A15 01 EB 3608 DB 1,0EBH
1A17 64 6C 32 F4 3609 DM "dl2t"
1A1B 01 E9 3610 DB 1,0E9H
1A1D 64 6C 32 E5 3611 DM "dl2e"
1A21 01 EA 3612 DB 1,0EAH
1A23 64 6C 67 B2 3613 DM "dlg2"
1A27 01 EC 3614 DB 1,0ECH
1A29 64 6C 6E B2 3615 DM "dln2"
1A2D 01 ED 3616 DB 1,0EDH
1A2F 64 63 F7 3617 DM "dcw"
1A32 99 28 3618 DB 1+NEEDOP+MEMORY,28H
1A34 64 65 6E F6 3619 DM "denv"
1A38 99 20 3620 DB 1+NEEDOP+MEMORY,20H
1A3A 3621
1A3A 3622 NDPM:
1A3A 02 3623 DB 2
1A3B 75 EC 3624 DM "ul"
1A3D 0E C9 3625 DB 6+ARITH,0C9H
1A3F 75 6C F0 3626 DM "ulp"
1A42 90 08 3627 DB NEEDOP+STACKOP,8
1A44 3628
1A44 3629 NDPO:
1A44 01 3630 DB 1
1A45 F0 3631 DM "p"
1A46 81 00 3632 DB NEEDOP+1,0 ;Flag special handling
1A48 3633
1A48 3634 NDPN:
1A48 01 3635 DB 1
1A49 6F F0 3636 DM "op"
1A4B 01 D0 3637 DB 1,0D0H
1A4D 3638
1A4D 3639 NDPP:
1A4D 03 3640 DB 3
1A4E 72 65 ED 3641 DM "rem"
1A51 01 F8 3642 DB 1,0F8H
1A53 74 61 EE 3643 DM "tan"
1A56 01 F2 3644 DB 1,0F2H
1A58 61 74 61 EE 3645 DM "atan"
1A5C 01 F3 3646 DB 1,0F3H
1A5E 3647
1A5E 3648 NDPR:
1A5E 02 3649 DB 2
1A5F 6E 64 69 6E F4 3650 DM "ndint"
1A64 01 FC 3651 DB 1,0FCH
1A66 73 74 6F F2 3652 DM "stor"
1A6A 9D 20 3653 DB 5+NEEDOP+MEMORY,20H
1A6C 3654
1A6C 3655 NDPS:
1A6C 0C 3656 DB 12
1A6D F4 3657 DM "t"
1A6E ED D0 3658 DB 5+NEEDOP+ONEREG+REAL,0D0H
1A70 74 F0 3659 DM "tp"
1A72 FF D8 3660 DB 7+NEEDOP+ONEREG+REAL+EXTENDED,0D8H
1A74 75 E2 3661 DM "ub"
1A76 0E E1 3662 DB 6+ARITH,0E1H
1A78 75 62 F0 3663 DM "ubp"
1A7B 90 E0 3664 DB NEEDOP+STACKOP,0E0H
1A7D 75 62 F2 3665 DM "ubr"
1A80 0E E9 3666 DB 6+ARITH,0E9H
1A82 75 62 72 F0 3667 DM "ubrp"
1A86 90 E8 3668 DB NEEDOP+STACKOP,0E8H
1A88 71 72 F4 3669 DM "qrt"
1A8B 01 FA 3670 DB 1,0FAH
1A8D 63 61 6C E5 3671 DM "cale"
1A91 01 FD 3672 DB 1,0FDH
1A93 61 76 E5 3673 DM "ave"
1A96 9D 30 3674 DB 5+NEEDOP+MEMORY,30H
1A98 74 63 F7 3675 DM "tcw"
1A9B 99 38 3676 DB 1+NEEDOP+MEMORY,38H
1A9D 74 65 6E F6 3677 DM "tenv"
1AA1 99 30 3678 DB 1+NEEDOP+MEMORY,30H
1AA3 74 73 F7 3679 DM "tsw"
1AA6 9D 38 3680 DB 5+NEEDOP+MEMORY,38H
1AA8 3681
1AA8 3682 NDPT:
1AA8 01 3683 DB 1
1AA9 73 F4 3684 DM "st"
1AAB 01 E4 3685 DB 1,0E4H
1AAD 3686
1AAD 3687 NDPW:
1AAD 01 3688 DB 1
1AAE 61 69 F4 3689 DM "ait"
1AB1 80 00 3690 DB NEEDOP,0 ;Flag special handling
1AB3 3691
1AB3 3692 NDPX:
1AB3 03 3693 DB 3
1AB4 63 E8 3694 DM "ch"
1AB6 41 C9 3695 DB 1+ONEREG,0C9H
1AB8 61 ED 3696 DM "am"
1ABA 01 E5 3697 DB 1,0E5H
1ABC 74 72 61 63 F4 3698 DM "tract"
1AC1 01 F4 3699 DB 1,0F4H
1AC3 3700
1AC3 3701 NDPY:
1AC3 02 3702 DB 2
1AC4 6C 32 F8 3703 DM "l2x"
1AC7 01 F1 3704 DB 1,0F1H
1AC9 6C 32 78 70 B1 3705 DM "l2xp1"
1ACE 01 F9 3706 DB 1,0F9H
1AD0 3707
1AD0 3708
1AD0 3709 OPTAB:
1AD0 3710 ; Table of pointers to mnemonics. For each letter of the alphabet (the
1AD0 3711 ; starting letter of the mnemonic), there are 5 entries. Each entry
1AD0 3712 ; corresponds to a mnemonic whose length is 2, 3, 4, 5, and 6 characters
1AD0 3713 ; long, respectively. If there are no mnemonics for a given combination
1AD0 3714 ; of first letter and length (such as A-2), then the corresponding entry
1AD0 3715 ; points to NONE. Otherwise, it points to a place in the mnemonic table
1AD0 3716 ; for that type.
1AD0 3717
1AD0 3718 ; This table only needs to be modified if a mnemonic is added to a group
1AD0 3719 ; previously marked NONE. Change the NONE to a label made up of the first
1AD0 3720 ; letter of the mnemonic and its length, then add a new subsection to
1AD0 3721 ; the mnemonic table in alphabetical order.
1AD0 3722
1AD0 0F 16 3723 DW NONE
1AD2 10 16 3724 DW A3
1AD4 0F 16 3725 DW NONE
1AD6 34 16 3726 DW A5
1AD8 0F 16 3727 DW NONE
1ADA 0F 16 3728 DW NONE ;B
1ADC 0F 16 3729 DW NONE
1ADE 0F 16 3730 DW NONE
1AE0 0F 16 3731 DW NONE
1AE2 0F 16 3732 DW NONE
1AE4 0F 16 3733 DW NONE ;C
1AE6 3C 16 3734 DW C3
1AE8 60 16 3735 DW C4
1AEA 73 16 3736 DW C5
1AEC 0F 16 3737 DW NONE
1AEE 82 16 3738 DW D2 ;D
1AF0 97 16 3739 DW D3
1AF2 AC 16 3740 DW D4
1AF4 0F 16 3741 DW NONE
1AF6 0F 16 3742 DW NONE
1AF8 B3 16 3743 DW E2 ;E
1AFA B8 16 3744 DW E3
1AFC 0F 16 3745 DW NONE
1AFE C8 16 3746 DW E5
1B00 0F 16 3747 DW NONE
1B02 0F 16 3748 DW NONE ;F
1B04 0F 16 3749 DW NONE
1B06 0F 16 3750 DW NONE
1B08 0F 16 3751 DW NONE
1B0A 0F 16 3752 DW NONE
1B0C 0F 16 3753 DW NONE ;G
1B0E 0F 16 3754 DW NONE
1B10 0F 16 3755 DW NONE
1B12 0F 16 3756 DW NONE
1B14 0F 16 3757 DW NONE
1B16 0F 16 3758 DW NONE ;H
1B18 D0 16 3759 DW H3
1B1A D6 16 3760 DW H4
1B1C 0F 16 3761 DW NONE
1B1E 0F 16 3762 DW NONE
1B20 DD 16 3763 DW I2 ;I
1B22 E6 16 3764 DW I3
1B24 FB 16 3765 DW I4
1B26 0F 16 3766 DW NONE
1B28 0F 16 3767 DW NONE
1B2A 14 17 3768 DW J2 ;J
1B2C 3D 17 3769 DW J3
1B2E 93 17 3770 DW J4
1B30 0F 16 3771 DW NONE
1B32 0F 16 3772 DW NONE
1B34 0F 16 3773 DW NONE ;K
1B36 0F 16 3774 DW NONE
1B38 0F 16 3775 DW NONE
1B3A 0F 16 3776 DW NONE
1B3C 0F 16 3777 DW NONE
1B3E 0F 16 3778 DW NONE ;L
1B40 B8 17 3779 DW L3
1B42 C8 17 3780 DW L4
1B44 E7 17 3781 DW L5
1B46 04 18 3782 DW L6
1B48 0F 16 3783 DW NONE ;M
1B4A 15 18 3784 DW M3
1B4C 20 18 3785 DW M4
1B4E 2D 18 3786 DW M5
1B50 0F 16 3787 DW NONE
1B52 0F 16 3788 DW NONE ;N
1B54 3C 18 3789 DW N3
1B56 0F 16 3790 DW NONE
1B58 0F 16 3791 DW NONE
1B5A 0F 16 3792 DW NONE
1B5C 4C 18 3793 DW O2 ;O
1B5E 51 18 3794 DW O3
1B60 5C 18 3795 DW O4
1B62 0F 16 3796 DW NONE
1B64 0F 16 3797 DW NONE
1B66 0F 16 3798 DW NONE ;P
1B68 69 18 3799 DW P3
1B6A 74 18 3800 DW P4
1B6C 81 18 3801 DW P5
1B6E 0F 16 3802 DW NONE
1B70 0F 16 3803 DW NONE ;Q
1B72 0F 16 3804 DW NONE
1B74 0F 16 3805 DW NONE
1B76 0F 16 3806 DW NONE
1B78 0F 16 3807 DW NONE
1B7A 0F 16 3808 DW NONE ;R
1B7C 89 18 3809 DW R3
1B7E A8 18 3810 DW R4
1B80 B5 18 3811 DW R5
1B82 0F 16 3812 DW NONE
1B84 0F 16 3813 DW NONE ;S
1B86 C4 18 3814 DW S3
1B88 FC 18 3815 DW S4
1B8A 1B 19 3816 DW S5
1B8C 0F 16 3817 DW NONE
1B8E 0F 16 3818 DW NONE ;T
1B90 0F 16 3819 DW NONE
1B92 38 19 3820 DW T4
1B94 0F 16 3821 DW NONE
1B96 0F 16 3822 DW NONE
1B98 3F 19 3823 DW U2 ;U
1B9A 0F 16 3824 DW NONE
1B9C 0F 16 3825 DW NONE
1B9E 0F 16 3826 DW NONE
1BA0 0F 16 3827 DW NONE
1BA2 0F 16 3828 DW NONE ;V
1BA4 0F 16 3829 DW NONE
1BA6 0F 16 3830 DW NONE
1BA8 0F 16 3831 DW NONE
1BAA 0F 16 3832 DW NONE
1BAC 0F 16 3833 DW NONE ;W
1BAE 0F 16 3834 DW NONE
1BB0 44 19 3835 DW W4
1BB2 0F 16 3836 DW NONE
1BB4 0F 16 3837 DW NONE
1BB6 0F 16 3838 DW NONE ;X
1BB8 4B 19 3839 DW X3
1BBA 51 19 3840 DW X4
1BBC 0F 16 3841 DW NONE
1BBE 0F 16 3842 DW NONE
1BC0 0F 16 3843 DW NONE ;Y
1BC2 0F 16 3844 DW NONE
1BC4 0F 16 3845 DW NONE
1BC6 0F 16 3846 DW NONE
1BC8 0F 16 3847 DW NONE
1BCA 0F 16 3848 DW NONE ;Z
1BCC 0F 16 3849 DW NONE
1BCE 0F 16 3850 DW NONE
1BD0 0F 16 3851 DW NONE
1BD2 0F 16 3852 DW NONE
1BD4 3853
1BD4 3854 NDPTAB:
1BD4 3855 ;Lookup table for 8087 mnemonics. There is one entry for each letter of the
1BD4 3856 ;alphabet
1BD4 64 19 3857 DW NDPA
1BD6 72 19 3858 DW NDPB
1BD8 7C 19 3859 DW NDPC
1BDA 95 19 3860 DW NDPD
1BDC B6 19 3861 DW NDPE
1BDE BB 19 3862 DW NDPF
1BE0 0F 16 3863 DW NONE ;G
1BE2 0F 16 3864 DW NONE ;H
1BE4 C1 19 3865 DW NDPI
1BE6 0F 16 3866 DW NONE ;J
1BE8 0F 16 3867 DW NONE ;K
1BEA 06 1A 3868 DW NDPL
1BEC 3A 1A 3869 DW NDPM
1BEE 48 1A 3870 DW NDPN
1BF0 44 1A 3871 DW NDPO
1BF2 4D 1A 3872 DW NDPP
1BF4 0F 16 3873 DW NONE ;Q
1BF6 5E 1A 3874 DW NDPR
1BF8 6C 1A 3875 DW NDPS
1BFA A8 1A 3876 DW NDPT
1BFC 0F 16 3877 DW NONE ;U
1BFE 0F 16 3878 DW NONE ;V
1C00 AD 1A 3879 DW NDPW
1C02 B3 1A 3880 DW NDPX
1C04 C3 1A 3881 DW NDPY
1C06 0F 16 3882 DW NONE ;Z
1C08 3883
1C08 3884 ;Error message table
1C08 3885
1C08 3886 ERRTAB:
1C08 01 52 65 67 69 73 74 3887 DM 1,"Register not allowed in immediate value"
65 72 20 6E 6F 74 20
61 6C 6C 6F 77 65 64
20 69 6E 20 69 6D 6D
65 64 69 61 74 65 20
76 61 6C 75 E5
1C30 02 49 6E 64 65 78 20 3888 DM 2,"Index or base register must be BP, BX, SI, or DI"
6F 72 20 62 61 73 65
20 72 65 67 69 73 74
65 72 20 6D 75 73 74
20 62 65 20 42 50 2C
20 42 58 2C 20 53 49
2C 20 6F 72 20 44 C9
1C61 03 4F 6E 6C 79 20 6F 3889 DM 3,"Only one base register (BX, BP) allowed"
6E 65 20 62 61 73 65
20 72 65 67 69 73 74
65 72 20 28 42 58 2C
20 42 50 29 20 61 6C
6C 6F 77 65 E4
1C89 04 4F 6E 6C 79 20 6F 3890 DM 4,"Only one index register (SI or DI) allowed"
6E 65 20 69 6E 64 65
78 20 72 65 67 69 73
74 65 72 20 28 53 49
20 6F 72 20 44 49 29
20 61 6C 6C 6F 77 65
E4
1CB4 05 4F 6E 6C 79 20 61 3891 DM 5,"Only addition allowed on register or undefined label"
64 64 69 74 69 6F 6E
20 61 6C 6C 6F 77 65
64 20 6F 6E 20 72 65
67 69 73 74 65 72 20
6F 72 20 75 6E 64 65
66 69 6E 65 64 20 6C
61 62 65 EC
1CE9 06 4F 6E 6C 79 20 6F 3892 DM 6,"Only one undefined label per expression allowed"
6E 65 20 75 6E 64 65
66 69 6E 65 64 20 6C
61 62 65 6C 20 70 65
72 20 65 78 70 72 65
73 73 69 6F 6E 20 61
6C 6C 6F 77 65 E4
1D19 07 49 6C 6C 65 67 61 3893 DM 7,"Illegal digit in hexadecimal number"
6C 20 64 69 67 69 74
20 69 6E 20 68 65 78
61 64 65 63 69 6D 61
6C 20 6E 75 6D 62 65
F2
1D3D 08 49 6C 6C 65 67 61 3894 DM 8,"Illegal digit in decimal number"
6C 20 64 69 67 69 74
20 69 6E 20 64 65 63
69 6D 61 6C 20 6E 75
6D 62 65 F2
1D5D 0A 49 6C 6C 65 67 61 3895 DM 10,"Illegal character in label or opcode"
6C 20 63 68 61 72 61
63 74 65 72 20 69 6E
20 6C 61 62 65 6C 20
6F 72 20 6F 70 63 6F
64 E5
1D82 0B 4C 61 62 65 6C 20 3896 DM 11,"Label defined twice"
64 65 66 69 6E 65 64
20 74 77 69 63 E5
1D96 0C 4F 70 63 6F 64 65 3897 DM 12,"Opcode not recognized"
20 6E 6F 74 20 72 65
63 6F 67 6E 69 7A 65
E4
1DAC 14 49 6E 76 61 6C 69 3898 DM 20,"Invalid operand"
64 20 6F 70 65 72 61
6E E4
1DBC 15 22 2C 22 20 61 6E 3899 DM 21,'"," and second operand expected'
64 20 73 65 63 6F 6E
64 20 6F 70 65 72 61
6E 64 20 65 78 70 65
63 74 65 E4
1DDC 16 52 65 67 69 73 74 3900 DM 22,"Register mismatch"
65 72 20 6D 69 73 6D
61 74 63 E8
1DEE 17 49 6D 6D 65 64 69 3901 DM 23,"Immediate operand not allowed"
61 74 65 20 6F 70 65
72 61 6E 64 20 6E 6F
74 20 61 6C 6C 6F 77
65 E4
1E0C 18 22 5D 22 20 65 78 3902 DM 24,'"]" expected'
70 65 63 74 65 E4
1E19 19 54 77 6F 20 6D 65 3903 DM 25,"Two memory operands not allowed"
6D 6F 72 79 20 6F 70
65 72 61 6E 64 73 20
6E 6F 74 20 61 6C 6C
6F 77 65 E4
1E39 1A 44 65 73 74 69 6E 3904 DM 26,"Destination must not be immediate value"
61 74 69 6F 6E 20 6D
75 73 74 20 6E 6F 74
20 62 65 20 69 6D 6D
65 64 69 61 74 65 20
76 61 6C 75 E5
1E61 1B 42 6F 74 68 20 6F 3905 DM 27,"Both operands must not be registers"
70 65 72 61 6E 64 73
20 6D 75 73 74 20 6E
6F 74 20 62 65 20 72
65 67 69 73 74 65 72
F3
1E85 1C 4F 70 65 72 61 6E 3906 DM 28,"Operand must be segment register"
64 20 6D 75 73 74 20
62 65 20 73 65 67 6D
65 6E 74 20 72 65 67
69 73 74 65 F2
1EA6 1D 46 69 72 73 74 20 3907 DM 29,"First operand must be register"
6F 70 65 72 61 6E 64
20 6D 75 73 74 20 62
65 20 72 65 67 69 73
74 65 F2
1EC5 1E 55 6E 64 65 66 69 3908 DM 30,"Undefined label not allowed"
6E 65 64 20 6C 61 62
65 6C 20 6E 6F 74 20
61 6C 6C 6F 77 65 E4
1EE1 1F 56 61 6C 75 65 20 3909 DM 31,"Value out of range"
6F 75 74 20 6F 66 20
72 61 6E 67 E5
1EF4 20 4D 69 73 73 69 6E 3910 DM 32,"Missing or illegal operand size flag"
67 20 6F 72 20 69 6C
6C 65 67 61 6C 20 6F
70 65 72 61 6E 64 20
73 69 7A 65 20 66 6C
61 E7
1F19 21 4D 75 73 74 20 68 3911 DM 33,"Must have label on same line"
61 76 65 20 6C 61 62
65 6C 20 6F 6E 20 73
61 6D 65 20 6C 69 6E
E5
1F36 23 5A 65 72 6F 2D 6C 3912 DM 35,"Zero-length string illegal"
65 6E 67 74 68 20 73
74 72 69 6E 67 20 69
6C 6C 65 67 61 EC
1F51 24 45 4E 44 49 46 20 3913 DM 36,"ENDIF without IF"
77 69 74 68 6F 75 74
20 49 C6
1F62 25 4F 6E 65 2D 63 68 3914 DM 37,"One-character strings only"
61 72 61 63 74 65 72
20 73 74 72 69 6E 67
73 20 6F 6E 6C F9
1F7D 26 49 6C 6C 65 67 61 3915 DM 38,"Illegal expression"
6C 20 65 78 70 72 65
73 73 69 6F EE
1F90 27 45 6E 64 20 6F 66 3916 DM 39,"End of string not found"
20 73 74 72 69 6E 67
20 6E 6F 74 20 66 6F
75 6E E4
1FA8 64 55 6E 64 65 66 69 3917 DM 100,"Undefined label"
6E 65 64 20 6C 61 62
65 EC
1FB8 65 56 61 6C 75 65 20 3918 DM 101,"Value out of range (forward)"
6F 75 74 20 6F 66 20
72 61 6E 67 65 20 28
66 6F 72 77 61 72 64
A9
1FD5 FF 3919 DB 255
1FD6 3920
1FD6 2A 2A 2A 2A 2A 20 45 3921 ERRMES: DM '***** ERROR: '
52 52 4F 52 3A 20 A0
1FE4 0D 0A 46 69 6C 65 20 3922 NOSPAC: DB 13,10,'File creation error',13,10,"$"
63 72 65 61 74 69 6F
6E 20 65 72 72 6F 72
0D 0A 24
1FFC 0D 0A 49 6E 73 75 66 3923 NOMEM: DB 13,10,'Insufficient memory',13,10,'$'
66 69 63 69 65 6E 74
20 6D 65 6D 6F 72 79
0D 0A 24
2014 0D 0A 46 69 6C 65 20 3924 NOFILE: DB 13,10,'File not found',13,10,'$'
6E 6F 74 20 66 6F 75
6E 64 0D 0A 24
2027 0D 0A 44 69 73 6B 20 3925 WRTERR: DB 13,10,'Disk full',13,10,'$'
66 75 6C 6C 0D 0A 24
2035 0D 0A 42 61 64 20 64 3926 BADDSK: DB 13,10,'Bad disk specifier',13,10,'$'
69 73 6B 20 73 70 65
63 69 66 69 65 72 0D
0A 24
204C 0D 0A 0D 0A 45 72 72 3927 ERCNTM: DM 13,10,13,10,'Error Count ='
6F 72 20 43 6F 75 6E
74 20 BD
205D 0D 0A 53 79 6D 62 6F 3928 SYMMES: DM 13,10,'Symbol Table',13,10,13,10
6C 20 54 61 62 6C 65
0D 0A 0D 8A
206F 41 53 4D 00 00 3929 EXTEND: DB 'ASM',0,0
2074 05 65 6E 64 69 66 3930 IFEND: DB 5,'endif'
207A 02 69 66 3931 IFNEST: DB 2,'if'
207D 72 65 F4 3932 RETSTR: DM 'ret'
2080 00 20 20 20 20 20 20 3933 HEXFCB: DB 0,' HEX',0,0,0,0
20 20 48 45 58 00 00
00 00
2090 3934 DS 16
20A0 00 00 00 00 00 3935 DB 0,0,0,0,0
20A5 00 20 20 20 20 20 20 3936 LSTFCB: DB 0,' PRN',0,0,0,0
20 20 50 52 4E 00 00
00 00
20B5 3937 DS 16
20C5 00 00 00 00 00 3938 DB 0,0,0,0,0
20CA 3939 PC: DS 2
20CC 3940 OLDPC: DS 2
20CE 3941 LABPT: DS 2
20D0 3942 FLAG: DS 1
20D1 3943 MAXFLG: DS 1
20D2 3944 ADDR: DS 2
20D4 3945 ALABEL: DS 2
20D6 3946 DATA: DS 2
20D8 3947 DLABEL: DS 2
20DA 3948 CON: DS 2
20DC 3949 UNDEF: DS 2
20DE 3950 LENID: DS 1
20DF 3951 ID: DS 80
212F 3952 CHR: DS 1
2130 3953 SYM: DS 1
2131 3954 BASE: DS 2
2133 3955 HEAP: DS 2
2135 3956 SYMFLG: DS 1
2136 3957 SYMLIN: DS 1
2137 3958 CODE: DS 2
2139 3959 DATSIZ: DS 1
213A 3960 RELOC: DS 1
213B 3961 BCOUNT: DS 1
213C 3962 COUNT: DS 1
213D 3963 ERR: DS 1
213E 3964 LINE: DS 2
2140 3965 HEXLEN: DS 2
2142 3966 HEXADD: DS 2
2144 3967 LASTAD: DS 2
2146 3968 HEXCNT: DS 1
2147 3969 CHKSUM: DS 1
2148 3970 LINFLG: DS 1
2149 3971 PREV: DS 1
214A 3972 IFFLG: DS 1
214B 3973 CHKLAB: DS 1
214C 3974 ERRCNT: DS 2
214E 3975 LSTRET: DS 2
2150 3976 RETPT: DS 2
2152 3977 LSTDEV: DS 2
2154 3978 SPC: DS 1
2155 3979 NOWAIT: DS 1
2156 3980 IX: DS 2
2158 3981 IY: DS 2
215A 3982 HEXPNT: DS 2
215C 3983 LSTPNT: DS 2
215E 3984 HEXBUF: DS HEXBUFSIZ
21A4 3985 LSTBUF: DS LSTBUFSIZ
25A4 3986 BUFPT: DS 2
25A6 3987 SRCBUF: DS BUFSIZ
29A6 3988 DS 100H
2AA6 3989 ALIGN
2AA6 3990 STACK: EQU $
2AA6 3991 START: EQU $
Error Count = 0
Symbol Table
a3 1610 a5 1634 abort 0273 accimm 0EA0 accj 0DE6
add 04CE addr 20D2 afhex 1569 aimm 0EA9 alabel 20D4
align 0D6D allret 0858 arith 0008 asmlin 0954 baddsk 2035
badflag 0AD9 badop 04E3 base 2131 bcount 213B begin 0176
blkwrt 0028 blnk 1257 bpj 0576 bufpt 25A4 bufsiz 0400
bxj 0579 bytimm 0B53 bytsiz 05DE c3 163C c4 1660
c5 1673 chkdsk 02A0 chklab 214B chkret 0830 chksum 2147
chr 212F close 0010 codbyt 151B code 2137 codlp 1242
con 20DA const 0001 count 213C cpslp 08F2 create 08AC
crlf 12E7 d2 1682 d3 1697 d4 16AC data 20D6
datsiz 2139 dds 1291 dec 0666 default 0194 defbyt 11E5
digit 131D dij 056A direct 0F06 dlabel 20D8 dollar 061B
domul 051E doret 0FB0 dorg 129C dosymtab 13ED
dput 12A3 dsj 0D77 dskerr 02AC dskful 15F6 e2 16B3
e3 16B8 e5 16C8 emark 1217 empty 08A4 end 115A
endcond 1143 enddat 10E6 endif 114A endj 024E endlin 0253
endln 0251 endop 0A12 endsym 140B endterm 0527 enhexl 158E
enter 089B eol 000D equ 0D89 ercntm 204C err 213D
err1 03BC err10 0FEC err11 10C9 err2 0567 err30 05A1
err4 06B6 err5 0951 err6 0D12 err7 0DBE err8 0EBE
err9 0FC1 errcnt 214C errj 105D errj1 0E55 errj3 073D
errj4 0ADB errjmp 1157 errlook 14EA errmes 1FD6 error 02B1
errtab 1C08 escimm 1067 escmem 1060 exacc 0D00 exit 1422
exmem 0D07 exmem1 0D09 expression 049A extend 206F
extended 0010 factor 052B fcb 005C filchk 135A
findop 09A6 fini 1391 finij 1214 finimm 0B73 fixed 0D33
fixline 11AC fixup 11CC flag 20D0 flg 042A flgtab 0740
flushbuf 15DC fndndp 0A06 formattab 0B23
fpreg 0745 freg 0006 fwait 0A3F g10 0E57 gen 0BA6
gen1 0BA9 genint 1013 getch 02DA getchr 05F0 getdat 10CF
geteol 0266 getfact 04F9 getformat 0AF5 getlab 0902
getlet 06B9 getop 03C8 getop1 03CB getop2 03BF getsp 0F54
getsy 0627 getsym 0602 getval 043B gotit 06A5 gotop 0F19
grp1 0B33 grp10 0E3D grp11 0E65 grp12 0E6D grp13 0E97
grp14 0EC1 grp16 0F3F grp17 0FB7 grp18 0FF0 grp19 101B
grp2 0C84 grp20 1082 grp21 1093 grp22 10AB grp23 10CC
grp3 0CB5 grp4 0D15 grp5 0D3B grp6 0DB5 grp7 0DC1
grp8 0DE9 grp9 0DEF h3 16D0 h4 16D6 havdef 11DE
havmes 14F4 havndp 0A47 havop 09C3 havreg 0777 header 0102
heap 2133 hex 0690 hex1 0695 hexadd 2142 hexbuf 215E
hexbufsiz 0046 hexbyt 156A hexcnt 2146 hexend 13B6
hexfcb 2080 hexlen 2140 hexpnt 215A hidig 1318 i2 16DD
i3 16E6 i4 16FB id 20DF if 1101 ifend 2074
ifflg 214A ifnest 207A imm 0B8C immed 0B5D integer 0020
ix 2156 iy 2158 j2 1714 j3 173D j4 1793
l0000 019C l0002 0242 l0003 05B6 l0004 0722 l0006 0B45
l0008 0CED l0011 0F8D l0012 13AF l0014 1438 l3 17B8
l4 17C8 l5 17E7 l6 1804 labchk 0928 label 092F
labpt 20CE lastad 2144 lead 12FD lenid 20DE letter 06FD
lhalf 1604 line 213E linflg 2148 list 133E listret 1367
load 036B longj 0F29 longr 0F68 look 07EF lookit 087C
lookndp 0A00 lookret 0823 lookup 0878 loop 0229 lstbuf 21A4
lstbufsiz 0400 lstdev 2152 lstfcb 20A5 lstpnt 215C
lstret 214E m3 1815 m4 1820 m5 182D make 0016
makfil 027E maxflg 20D1 mem 03FF memop 0ADE memory 0018
mode 0462 mop 0E1A moreid 06D7 mrerr 03BA mrops 02EC
mulop 04EB n3 183C ndpa 1964 ndpb 1972 ndpc 197C
ndpd 1995 ndpe 19B6 ndpf 19BB ndpi 19C1 ndpl 1A06
ndpm 1A3A ndpn 1A48 ndpo 1A44 ndpop 09C8 ndpp 1A4D
ndpr 1A5E ndps 1A6C ndpt 1AA8 ndptab 1BD4 ndpw 1AAD
ndpx 1AB3 ndpy 1AC3 needop 0080 newlin 153E newloc 0DA3
nexb 0616 nexbt 11B7 nexfact 0520 nexlin 025B
nexsymlin 148F nextchj 0624 nextchr 02B6 nexterm 04D0
nextmes 14EE nilify 08E5 nocon 04DE node 1425 nodec 0F8F
noerr 1232 noext 14C6 nofil 1262 nofile 2014 noflg 071A
noind 048E nomem 1FFC nomod 02E4 nomore 06F1 none 160F
noopchk 0AB9 noops 0AC0 noprn 01BB norev 0ACD nospac 1FE4
not1 091A notac 039F notlon 0F7B notrg 0EE4 noundef 0C43
nowait 2155 nreg 03F7 nwait 0A55 o2 184C o3 1851
o4 185C objbt 11C9 object 0100 oldpc 20CC one 0DF7
onej 0E63 oneop 0DF3 onereg 0040 open 000F operate 04BA
operr 09BE operrj 0A1A optab 1AD0 org 0D9D out 1512
out10 12F0 outa 1510 outlin 12AA outln 12CD p3 1869
p4 1874 p5 1881 packreg 109E paren 0582 pc 20CA
phex 1384 phexb 1339 plsmns 04B0 pmem 0CA2 preg 07C3
prerr 0276 pret 0C3F prev 2149 print 1504
printmes 0009 prnchk 134F prnerr 14FE prtcnt 12D9
put 0B9C putadd 0C5C putaddj 0F03 putbj 0B5A putbw 0C12
putbyt 0BF2 putcd 0BE1 putchk 0C1A putchr 15D2 putinc 0BDD
putmem 0B13 putop 0D69 putreg 0AAA putwor 0BEB pxreg 0CAE
r3 1889 r4 18A8 r5 18B5 read 0014 readid 06D2
real 0028 reg 0002 regchk 077C regtab 07E7 reloc 213A
reperr 14D5 retpt 2150 retstr 207D rightson 1497
rngerr 120D rop 0E2D rr 0321 rr1 0325 s3 18C4
s4 18FC s5 191B savcd 149F savdat 10F7 savflg 072E
savnflg 09DA savpt 137E scanb 060B scanreg 07D0 scant 060E
segchk 033C segtab 07EB setdma 001A sholin 1248 sij 056D
skipcd 110A skiplp 110E small 080F smput 0C39 spc 2154
spcfun 1285 specialop 0A25 spend 127B srcbuf 25A6
sreg 0004 st0dest 0AA6 stack 2AA6 stackop 0010 start 2AA6
sterr 03B8 stimm 0B81 store 0361 strgdat 05C7 string 05A4
strtlin 1329 supz 1325 sym 2130 symdmp 13DA symflg 2135
symlin 2136 symmes 205D symsav 072A symwid 0005 system 1517
t4 1938 tab 14BF tabval 146B term 04E8 testtyp 11C2
try2xm1 0A1C twobt 0C7A u2 193F uhalf 15FC undef 20DC
undefid 0000 uval 0592 val 03DF val1 03E1 w4 1944
wrend 115C wrtbuf 1369 wrterr 2027 wrthex 15B7 wrtsym 145F
x3 194B x4 1951 xm1 195E xreg 0003 xrg 037E
zerlen 05E8