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