summaryrefslogtreecommitdiff
path: root/v2.0/source/DEBUASM.ASM
diff options
context:
space:
mode:
authorGravatar Rich Turner1983-08-12 17:53:34 -0700
committerGravatar Rich Turner2018-09-21 17:53:34 -0700
commit80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6 (patch)
treeee4357f7f3dd0f2ded59b9c6e7384432d85e7ec9 /v2.0/source/DEBUASM.ASM
parentMS-DOS v1.25 Release (diff)
downloadms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.gz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.xz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.zip
MS-DOS v2.0 Release
Diffstat (limited to 'v2.0/source/DEBUASM.ASM')
-rw-r--r--v2.0/source/DEBUASM.ASM868
1 files changed, 868 insertions, 0 deletions
diff --git a/v2.0/source/DEBUASM.ASM b/v2.0/source/DEBUASM.ASM
new file mode 100644
index 0000000..6a53124
--- /dev/null
+++ b/v2.0/source/DEBUASM.ASM
@@ -0,0 +1,868 @@
1TITLE DEBUASM
2
3; Code for the UASSEMble command in the debugger
4
5.xlist
6.xcref
7 INCLUDE DEBEQU.ASM
8 INCLUDE DOSSYM.ASM
9.cref
10.list
11
12
13CODE SEGMENT PUBLIC BYTE 'CODE'
14CODE ENDS
15
16CONST SEGMENT PUBLIC BYTE
17
18 EXTRN SYNERR:BYTE
19 EXTRN NSEG:WORD,SISAVE:WORD,BPSAVE:WORD,DISAVE:WORD
20 EXTRN BXSAVE:WORD,DSSAVE:WORD,ESSAVE:WORD,CSSAVE:WORD,IPSAVE:WORD
21 EXTRN SSSAVE:WORD,CXSAVE:WORD,SPSAVE:WORD,FSAVE:WORD
22 EXTRN DISTAB:WORD,SHFTAB:WORD,IMMTAB:WORD,GRP1TAB:WORD,GRP2TAB:WORD
23 EXTRN DBMN:BYTE,ESCMN:BYTE,DISPB:WORD,STACK:BYTE,REG8:BYTE
24 EXTRN REG16:BYTE,SREG:BYTE,SIZ8:BYTE,SEGTAB:WORD,M8087_TAB:BYTE
25 EXTRN FI_TAB:BYTE,SIZE_TAB:BYTE,MD9_TAB:BYTE,MD9_TAB2:BYTE
26 EXTRN MDB_TAB:BYTE,MDB_TAB2:BYTE,MDD_TAB:BYTE,MDD_TAB2:BYTE
27 EXTRN MDF_TAB:BYTE
28
29CONST ENDS
30
31DATA SEGMENT PUBLIC BYTE
32
33 EXTRN DISADD:BYTE,DISCNT:WORD,BYTCNT:BYTE,TEMP:BYTE,AWORD:BYTE
34 EXTRN MIDFLD:BYTE,MODE:BYTE,REGMEM:BYTE,OPCODE:WORD,OPBUF:BYTE
35 EXTRN INDEX:WORD
36
37DATA ENDS
38
39DG GROUP CODE,CONST,DATA
40
41
42CODE SEGMENT PUBLIC BYTE 'CODE'
43ASSUME CS:DG,DS:DG,ES:DG,SS:DG
44
45
46 PUBLIC UNASSEM
47 PUBLIC DISASLN,MEMIMM,JMPCALL,SIGNIMM,ALUFROMREG,WORDTOALU
48 PUBLIC GRP2,PREFIX,OUTVARW,GRP1,SSPRE,MOVSEGTO,DSPRE,SHIFT
49 PUBLIC ESPRE,IMMED,CSPRE,OUTVARB,CHK10,ACCIMM,INT3,INVARB
50 PUBLIC MOVSEGFROM,LOADACC,OUTFIXB,XCHGAX,REGIMMW,SHORTJMP
51 PUBLIC SAV8,M8087,M8087_DB,M8087_DF,M8087_D9,M8087_DD
52 PUBLIC SAV16,SAVHEX,INFIXW,REGIMMB,OUTFIXW,SHIFTV,LONGJMP
53 PUBLIC INVARW,STOREACC,INFIXB,NOOPERANDS,ALUTOREG
54 PUBLIC SEGOP,REGOP,GETADDR
55
56 EXTRN CRLF:NEAR,PRINTMES:NEAR,BLANK:NEAR,TAB:NEAR,OUT:NEAR
57 EXTRN HEX:NEAR,DEFAULT:NEAR,OUTSI:NEAR,OUTDI:NEAR
58
59UNASSEM:
60 MOV BP,[CSSAVE] ; Default code segment
61 MOV DI,OFFSET DG:DISADD ; Default address
62 MOV CX,DISPB ; Default length
63 SHR CX,1
64 SHR CX,1
65 CALL DEFAULT
66 MOV WORD PTR [DISADD],DX ; Displacement of disassembly
67 MOV WORD PTR [DISADD+2],AX ; Segment
68 MOV WORD PTR [DISCNT],CX ; No. of bytes (but whole instructions)
69DISLP:
70 CALL DISASLN ; Disassemble one line
71 CALL CRLF
72 TEST [DISCNT],-1 ; See if we've used up the range
73 JNZ DISLP
74 RET
75
76GOTDIS: PUSH DS ; RE-GET LAST BYTE
77 PUSH SI
78 LDS SI,DWORD PTR [DISADD]
79 MOV AL,[SI-1]
80 POP SI
81 POP DS
82 RET
83
84GETDIS:
85 PUSH DS
86 LDS SI,DWORD PTR [DISADD]
87 LODSB ; Get the next byte of code
88 POP DS
89 MOV WORD PTR [DISADD],SI ; Update pointer
90 PUSH AX
91 CALL HEX ; Display each code byte
92 MOV SI,[DISCNT]
93 OR SI,SI ; Check if range exhausted
94 JZ ENDRNG ; If so, don't wrap around
95 DEC SI ; Count off the bytes
96 MOV [DISCNT],SI
97ENDRNG:
98 INC BYTE PTR[BYTCNT] ; Keep track of no. of bytes per line
99 POP AX
100 RET
101
102DSPRE: INC BYTE PTR [NSEG+1]
103SSPRE: INC BYTE PTR [NSEG+1]
104CSPRE: INC BYTE PTR [NSEG+1]
105ESPRE: INC BYTE PTR [NSEG+1]
106
107PREFIX:
108 POP BX ; Dump off return address
109 CALL FINLN
110 CALL CRLF
111DISASLN:
112 PUSH DS
113 LDS SI,DWORD PTR [DISADD]
114 CALL OUTSI ; Show disassembly address
115 POP DS
116 CALL BLANK
117DISASLN1:
118 MOV BYTE PTR [BYTCNT],0 ; Count of code bytes per line
119 MOV DI,OFFSET DG:OPBUF ; Point to operand buffer
120 MOV AL," "
121 MOV CX,OPBUFLEN-1 ; Don't do last byte which has end marker
122 REP STOSB ; Initialize operand buffer to blanks
123 MOV BYTE PTR [DI]," "+80H
124 CALL GETDIS ; Get opcode
125 MOV AH,0
126 MOV BX,AX
127 AND AL,1 ; Mask to "W" bit
128 MOV [AWORD],AL
129 MOV AL,BL ; Restore opcode
130 SHL BX,1
131 SHL BX,1 ; Multiply opcode by 4
132 ADD BX,OFFSET DG:DISTAB
133 MOV DX,[BX] ; Get pointer to mnemonic from table
134 MOV [OPCODE],DX ; Save it until line is complete
135 MOV DI,OFFSET DG:OPBUF ; Initialize for opcode routines
136 CALL WORD PTR [BX+2] ; Dispatch to opcode routine
137FINLN:
138 MOV SI,OFFSET DG:DISADD
139 MOV AH,[BYTCNT] ; See how many bytes in this instruction
140 ADD AH,AH ; Each uses two characters
141 MOV AL,14 ; Amount of space we want to use
142 SUB AL,AH ; See how many fill characters needed
143 CBW
144 XCHG CX,AX ; Parameter for TAB needed in CX
145 CALL TAB
146 MOV SI,[OPCODE]
147 OR SI,SI ; MAKE SURE THERE IS SOMETHING TO PRINT
148 JZ NOOPC
149 CALL PRINTMES ; Print opcode mnemonic
150 MOV AL,9
151 CALL OUT ; and a tab
152NOOPC: MOV SI,OFFSET DG:OPBUF
153 JMP PRINTMES ; and the operand buffer
154
155GETMODE:
156 CALL GETDIS ; Get the address mode byte
157 MOV AH,AL
158 AND AL,7 ; Mask to "r/m" field
159 MOV [REGMEM],AL
160 SHR AH,1
161 SHR AH,1
162 SHR AH,1
163 MOV AL,AH
164 AND AL,7 ; Mask to center 3-bit field
165 MOV [MIDFLD],AL
166 SHR AH,1
167 SHR AH,1
168 SHR AH,1
169 MOV [MODE],AH ; Leaving 2-bit "MOD" field
170 RET
171
172IMMED:
173 MOV BX,OFFSET DG:IMMTAB
174 CALL GETMNE
175FINIMM:
176 CALL TESTREG
177 JMP SHORT IMM
178
179MEMIMM:
180 CALL GETMODE
181 JMP SHORT FINIMM
182
183ACCIMM:
184 XOR AL,AL
185IMM1:
186 CALL SAVREG
187IMM:
188 MOV AL,","
189 STOSB
190 TEST BYTE PTR [AWORD],-1
191 JNZ SAV16
192SAV8:
193 CALL GETDIS
194 JMP SHORT SAVHEX
195
196LONGJMP:
197 PUSH DI
198 MOV DI,OFFSET DG:TEMP
199 CALL SAV16
200 POP DI
201 CALL SAV16
202 MOV AL,":"
203 STOSB
204 MOV SI,OFFSET DG:TEMP
205 MOV CX,4
206MOVDIG:
207 LODSB
208 STOSB
209 LOOP MOVDIG
210 RET
211SAV16:
212 CALL GETDIS ; Get low byte
213 MOV DL,AL
214 CALL GETDIS ; Get high byte
215 MOV DH,AL
216 CALL SAVHEX ; Convert and store high byte
217 MOV AL,DL
218SAVHEX:
219 MOV AH,AL
220 SHR AL,1
221 SHR AL,1
222 SHR AL,1
223 SHR AL,1
224 CALL SAVDIG
225 MOV AL,AH
226SAVDIG:
227 AND AL,0FH
228 ADD AL,90H
229 DAA
230 ADC AL,40H
231 DAA
232 STOSB
233 RET
234
235CHK10:
236 CALL GETDIS
237 CMP AL,10
238 JNZ SAVHEX
239 RET
240
241SIGNIMM:
242 MOV BX,OFFSET DG:IMMTAB
243 CALL GETMNE
244 CALL TESTREG
245 MOV AL,","
246 STOSB
247SAVD8:
248 CALL GETDIS ; Get signed 8-bit number
249 CBW
250 MOV DX,AX ; Save true 16-bit value in DX
251 MOV AH,AL
252 MOV AL,"+"
253 OR AH,AH
254; JZ nosign
255 JNS POSITIV ; OK if positive
256 MOV AL,"-"
257 NEG AH ; Get magnitude if negative
258POSITIV:
259 STOSB
260; nosign:
261 MOV AL,AH
262 JMP SHORT SAVHEX
263
264ALUFROMREG:
265 CALL GETADDR
266 MOV AL,","
267 STOSB
268REGFLD:
269 MOV AL,[MIDFLD]
270SAVREG:
271 MOV SI,OFFSET DG:REG8
272 CMP BYTE PTR [AWORD],1
273 JNE FNDREG
274SAVREG16:
275 MOV SI,OFFSET DG:REG16
276FNDREG:
277 CBW
278 ADD SI,AX
279 ADD SI,AX
280 MOVSW
281 RET
282
283SEGOP:
284 SHR AL,1
285 SHR AL,1
286 SHR AL,1
287SAVSEG:
288 AND AL,3
289 MOV SI,OFFSET DG:SREG
290 JMP SHORT FNDREG
291
292REGOP:
293 AND AL,7
294 JMP SHORT SAVREG16
295
296MOVSEGTO:
297 MOV BYTE PTR [AWORD],1
298 CALL GETADDR
299 MOV AL,","
300 STOSB
301 MOV AL,[MIDFLD]
302 JMP SHORT SAVSEG
303
304MOVSEGFROM:
305 CALL GETMODE
306 CALL SAVSEG
307 MOV BYTE PTR [AWORD],1
308 JMP SHORT MEMOP2
309
310GETADDR:
311 CALL GETMODE
312 JMP SHORT ADDRMOD
313
314WORDTOALU:
315 MOV BYTE PTR [AWORD],1
316ALUTOREG:
317 CALL GETMODE
318 CALL REGFLD
319MEMOP2:
320 MOV AL,","
321 STOSB
322ADDRMOD:
323 CMP BYTE PTR [MODE],3
324 MOV AL,[REGMEM]
325 JE SAVREG
326 XOR BX,BX
327 MOV BYTE PTR [NSEG],3
328 MOV BYTE PTR [DI],"["
329 INC DI
330 CMP AL,6
331 JNE NODRCT
332 CMP BYTE PTR [MODE],0
333 JE DIRECT ; Mode=0 and R/M=6 means direct addr.
334NODRCT:
335 MOV DL,AL
336 CMP AL,1
337 JBE USEBX
338 CMP AL,7
339 JE USEBX
340 CMP AL,3
341 JBE USEBP
342 CMP AL,6
343 JNE CHKPLS
344USEBP:
345 MOV BX,[BPSAVE]
346 MOV BYTE PTR [NSEG],2 ; Change default to Stack Segment
347 MOV AX,BPREG
348SAVBASE:
349 STOSW
350CHKPLS:
351 CMP DL,4
352 JAE NOPLUS
353 MOV AL,"+"
354 STOSB
355NOPLUS:
356 CMP DL,6
357 JAE DOMODE ; No index register
358 AND DL,1 ; Even for SI, odd for DI
359 JZ USESI
360 ADD BX,[DISAVE]
361 MOV AX,DIREG
362SAVINDX:
363 STOSW
364DOMODE:
365 MOV AL,[MODE]
366 OR AL,AL
367 JZ CLOSADD ; If no displacement, then done
368 CMP AL,2
369 JZ ADDDIR
370 CALL SAVD8 ; Signed 8-bit displacement
371ADDCLOS:
372 ADD BX,DX
373CLOSADD:
374 MOV AL,"]"
375 STOSB
376 MOV [INDEX],BX
377NOOPERANDS:
378 RET
379
380ADDDIR:
381 MOV AL,"+"
382 STOSB
383DIRECT:
384 CALL SAV16
385 JMP SHORT ADDCLOS
386
387USEBX:
388 MOV BX,[BXSAVE]
389 MOV AX,BXREG
390 JMP SHORT SAVBASE
391
392USESI:
393 ADD BX,[SISAVE]
394 MOV AX,SIREG
395 JMP SHORT SAVINDX
396
397SHORTJMP:
398 CALL GETDIS
399 CBW
400 ADD AX,WORD PTR [DISADD]
401 XCHG DX,AX
402SAVJMP:
403 MOV AL,DH
404 CALL SAVHEX
405 MOV AL,DL
406 JMP SAVHEX
407
408JMPCALL:
409 CALL GETDIS
410 MOV DL,AL
411 CALL GETDIS
412 MOV DH,AL
413 ADD DX,WORD PTR [DISADD]
414 JMP SHORT SAVJMP
415
416XCHGAX:
417 AND AL,7
418 CALL SAVREG16
419 MOV AL,","
420 STOSB
421 XOR AL,AL
422 JMP SAVREG16
423
424LOADACC:
425 XOR AL,AL
426 CALL SAVREG
427 MOV AL,","
428 STOSB
429MEMDIR:
430 MOV AL,"["
431 STOSB
432 XOR BX,BX
433 MOV BYTE PTR [NSEG],3
434 JMP DIRECT
435
436STOREACC:
437 CALL MEMDIR
438 MOV AL,","
439 STOSB
440 XOR AL,AL
441 JMP SAVREG
442
443REGIMMB:
444 MOV BYTE PTR [AWORD],0
445 JMP SHORT REGIMM
446REGIMMW:
447 MOV BYTE PTR [AWORD],1
448REGIMM:
449 AND AL,7
450 JMP IMM1
451
452INT3:
453 MOV BYTE PTR [DI],"3"
454 RET
455;
456; 8087 instructions whose first byte is 0dfh
457;
458M8087_DF:
459 CALL GET64F
460 JZ ISDD3
461 MOV SI,OFFSET DG:MDF_TAB
462 JMP NODB3
463;
464; 8087 instructions whose first byte is 0ddh
465;
466M8087_DD:
467 CALL GET64F
468 JZ ISDD3
469 MOV SI,OFFSET DG:MDD_TAB
470 JMP NOD93
471
472ISDD3:
473 MOV AL,DL
474 TEST AL,100B
475 JZ ISSTI
476 JMP ESC0
477ISSTI: AND AL,11B
478 MOV SI,OFFSET DG:MDD_TAB2
479 MOV CL,AL
480 CALL MOVBYT
481 JMP PUTRST
482;
483; 8087 instructions whose first byte is 0dbh
484;
485M8087_DB:
486 CALL GET64F
487 JZ ISDB3
488 MOV SI,OFFSET DG:MDB_TAB
489NODB3: CALL PUTOP
490 CALL PUTSIZE
491 JMP ADDRMOD
492
493ISDB3:
494 MOV AL,DL
495 TEST AL,100B
496 JNZ ISDBIG
497ESC0V: JMP ESC0
498ISDBIG: CALL GOTDIS
499 AND AL,11111B
500 CMP AL,4
501 JAE ESC0V
502 MOV SI,OFFSET DG:MDB_TAB2
503 JMP DOBIG
504;
505; 8087 instructions whose first byte is 0d9h
506;
507M8087_D9:
508 CALL GET64F
509 JZ ISD93
510
511 MOV SI,OFFSET DG:MD9_TAB
512NOD93: CALL PUTOP
513 AND AL,111B
514 CMP AL,3
515 JA NOSHO
516 MOV AL,DL
517 CALL PUTSIZE
518NOSHO: JMP ADDRMOD
519
520ISD93: MOV AL,DL
521 TEST AL,100B
522 JNZ ISD9BIG
523 AND AL,111B
524 OR AL,AL
525 JNZ NOTFLD
526 MOV AX,"DL"
527 STOSW
528 JMP SHORT PUTRST
529NOTFLD: CMP AL,1
530 JNZ NOTFXCH
531 MOV AX,"CX"
532 STOSW
533 MOV AL,"H"
534 JMP SHORT PUTRST1
535NOTFXCH:CMP AL,3
536 JNZ NOTFSTP
537 MOV AX,"TS"
538 STOSW
539 MOV AL,"P"
540PUTRST1:STOSB
541PUTRST: MOV AL,9
542 STOSB
543 JMP PUTST0
544
545NOTFSTP:CALL GOTDIS
546 CMP AL,11010000B ; CHECK FOR FNOP
547 JZ GOTFNOP
548 JMP ESC0
549GOTFNOP:MOV AX,"ON"
550 STOSW
551 MOV AL,"P"
552 STOSB
553 RET
554
555ISD9BIG:
556 CALL GOTDIS ; GET THE MODE BYTE
557 MOV SI,OFFSET DG:MD9_TAB2
558DOBIG: AND AL,11111B
559 MOV CL,AL
560 JMP MOVBYT
561;
562; entry point for the remaining 8087 instructions
563;
564M8087:
565 CALL GET64
566 CALL PUTFI ; PUT FIRST PART OF OPCODE
567 MOV AL,DL
568 CMP BYTE PTR [MODE],11B ; CHECK FOR REGISTER MODE
569 JZ MODEIS3
570 CALL PUTMN ; PUT MIDDLE PART OF OPCODE
571NO3: MOV AL,9 ; OUTPUT A TAB
572 STOSB
573 MOV AL,DL
574 CALL PUTSIZE ; OUTPUT THE OPERAND SIZE
575 JMP ADDRMOD
576
577MODEIS3:
578 TEST AL,100000B ; D BIT SET?
579 JZ MPUT ; NOPE...
580 TEST AL,000100B ; FDIV OR FSUB?
581 JZ MPUT ; NOPE...
582 XOR AL,1 ; REVERSE SENSE OF R
583 MOV DL,AL ; SAVE CHANGE
584MPUT: CALL PUTMN ; PUT MIDDLE PART OF OPCODE
585 MOV AL,DL
586 TEST AL,010000B
587 JZ NOPSH
588 MOV AL,"P"
589 STOSB
590NOPSH: MOV AL,9
591 STOSB
592 MOV AL,DL
593 AND AL,00000111B
594 CMP AL,2 ; FCOM
595 JZ PUTST0
596 CMP AL,3 ; FCOMP
597 JZ PUTST0
598 MOV AL,DL
599 TEST AL,100000B
600 JZ PUTSTST0
601;
602; output 8087 registers in the form st(n),st
603;
604PUTST0ST:
605 CALL PUTST0
606 MOV AL,','
607ISCOMP: STOSB
608
609PUTST: MOV AX,"TS"
610 STOSW
611 RET
612;
613; output 8087 registers in the form st,st(n)
614;
615PUTSTST0:
616 CALL PUTST
617 MOV AL,','
618 STOSB
619
620PUTST0: CALL PUTST
621 MOV AL,"("
622 STOSB
623 MOV AL,[REGMEM]
624 ADD AL,"0"
625 STOSB
626 MOV AL,")"
627 STOSB
628 RET
629;
630; output an 8087 mnemonic
631;
632PUTMN: MOV SI,OFFSET DG:M8087_TAB
633 MOV CL,AL
634 AND CL,00000111B
635 JMP SHORT MOVBYT
636;
637; output either 'FI' or 'F' for first byte of opcode
638;
639PUTFI: MOV SI,OFFSET DG:FI_TAB
640 JMP SHORT PUTFI2
641;
642; output size (dword, tbyte, etc.)
643;
644PUTSIZE:MOV SI,OFFSET DG:SIZE_TAB
645PUTFI2: CMP BYTE PTR [MODE],11B ; check if 8087 register
646 JNZ PUTFI3
647 AND AL,111000B ; LOOK FOR INVALID FORM OF 0DAH OPERANDS
648 CMP AL,010000B
649 JZ ESC0PJ
650 MOV AL,DL
651 CMP AL,110011B ; FCOMPP
652 JNZ GOFI
653 CMP BYTE PTR [REGMEM],1
654 JZ GOFI
655ESC0PJ: JMP ESC0P
656GOFI: XOR CL,CL
657 JMP SHORT MOVBYT
658;
659; Look for qword
660;
661PUTFI3: CMP AL,111101B
662 JZ GOTQU
663 CMP AL,111111B
664 JNZ NOTQU
665GOTQU: MOV CL,2
666 JMP SHORT MOVBYT
667;
668; look for tbyte
669;
670NOTQU: CMP AL,011101B
671 JZ GOTTB
672 CMP AL,111100B
673 JZ GOTTB
674 CMP AL,111110B
675 JZ GOTTB
676 CMP AL,011111B
677 JNZ NOTTB
678GOTTB: MOV CL,5
679 JMP SHORT MOVBYT
680
681NOTTB: MOV CL,4
682 SHR AL,CL
683 MOV CL,AL
684;
685; SI POINTS TO A TABLE OF TEXT SEPARATED BY "$"
686; CL = WHICH ELEMENT IN THE TABLE YOU WISH TO COPY TO [DI]
687;
688MOVBYT: PUSH AX
689 INC CL
690MOVBYT1:DEC CL
691 JZ MOVBYT3
692MOVBYT2:LODSB
693 CMP AL,'$'
694 JZ MOVBYT1
695 JMP MOVBYT2
696MOVBYT3:LODSB
697 CMP AL,'$'
698 JZ MOVBYT5
699 CMP AL,'@' ; THIS MEANS RESVERED OP-CODE
700 JNZ MOVBYT4
701 POP AX
702 JMP SHORT ESC0P ; GO DO AN ESCAPE COMMAND
703MOVBYT4:STOSB
704 JMP MOVBYT3
705MOVBYT5:POP AX
706 RET
707
708PUTOP: AND AL,111B
709 MOV CL,AL
710 CALL MOVBYT
711 MOV AL,9
712 STOSB
713 MOV AL,DL
714 RET
715
716GET64F: CALL GET64
717 MOV AL,"F"
718 STOSB
719 CMP BYTE PTR [MODE],3
720 MOV AL,DL
721 RET
722
723GET64:
724 AND AL,7
725 MOV DL,AL
726 CALL GETMODE
727 SHL DL,1
728 SHL DL,1
729 SHL DL,1
730 OR AL,DL
731 MOV DL,AL ; SAVE RESULT
732 RET
733
734ESC0P: POP DI ; CLEAN UP STACK
735ESC0: MOV WORD PTR [OPCODE],OFFSET DG:ESCMN
736 MOV AL,DL
737 MOV DI,OFFSET DG:OPBUF
738 JMP SHORT ESC1
739
740ESC: CALL GET64
741ESC1: CALL SAVHEX
742 CMP BYTE PTR [MODE],3
743 JZ SHRTESC
744 MOV BYTE PTR [AWORD],1
745 JMP MEMOP2
746
747SHRTESC:
748 MOV AL,","
749 STOSB
750 MOV AL,[REGMEM]
751 AND AL,7
752 JMP SAVREG
753
754INVARW:
755 CALL PUTAX
756 JMP SHORT INVAR
757INVARB:
758 CALL PUTAL
759INVAR: MOV AL,','
760 STOSB
761 JMP PUTDX
762
763INFIXW:
764 CALL PUTAX
765 JMP SHORT INFIX
766INFIXB:
767 CALL PUTAL
768INFIX: MOV AL,','
769 STOSB
770 JMP SAV8
771 STOSW
772 RET
773
774OUTVARB:
775 MOV BX,"LA"
776 JMP SHORT OUTVAR
777OUTVARW:
778 MOV BX,"XA"
779OUTVAR: CALL PUTDX
780OUTFV: MOV AL,','
781 STOSB
782 MOV AX,BX
783 STOSW
784 RET
785
786OUTFIXB:
787 MOV BX,"LA"
788 JMP SHORT OUTFIX
789OUTFIXW:
790 MOV BX,"XA"
791OUTFIX: CALL SAV8
792 JMP OUTFV
793
794PUTAL: MOV AX,"A"+4C00H ; "AL"
795 JMP SHORT PUTX
796PUTAX: MOV AX,"A"+5800H ; "AX"
797 JMP SHORT PUTX
798PUTDX: MOV AX,"D"+5800H ; "DX"
799PUTX: STOSW
800 RET
801
802SHFT:
803 MOV BX,OFFSET DG:SHFTAB
804 CALL GETMNE
805TESTREG:
806 CMP BYTE PTR [MODE],3
807 JZ NOFLG
808 MOV SI,OFFSET DG:SIZE_TAB
809 MOV CL,3
810 TEST BYTE PTR [AWORD],-1
811 JNZ TEST_1
812 INC CL
813TEST_1: CALL MOVBYT
814NOFLG:
815 JMP ADDRMOD
816
817SHIFTV:
818 CALL SHFT
819 MOV AL,","
820 STOSB
821 MOV WORD PTR [DI],"C"+4C00H ; "CL"
822 RET
823
824SHIFT:
825 CALL SHFT
826 MOV AX,"1,"
827 STOSW
828 RET
829
830GETMNE:
831 CALL GETMODE
832 MOV DL,AL
833 CBW
834 SHL AX,1
835 ADD BX,AX
836 MOV AX,[BX]
837 MOV [OPCODE],AX
838 MOV AL,DL
839 RET
840
841GRP1:
842 MOV BX,OFFSET DG:GRP1TAB
843 CALL GETMNE
844 OR AL,AL
845 JZ FINIMMJ
846 JMP TESTREG
847FINIMMJ:
848 JMP FINIMM
849
850GRP2:
851 MOV BX,OFFSET DG:GRP2TAB
852 CALL GETMNE
853 CMP AL,2
854 JB TESTREG
855 CMP AL,6
856 JAE INDIRECT
857 TEST AL,1
858 JZ INDIRECT
859 MOV AX,"AF" ; "FAR"
860 STOSW
861 MOV AX," R"
862 STOSW
863INDIRECT:
864 JMP ADDRMOD
865
866CODE ENDS
867 END UNASSEM
868