Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;-----------------------------------------------------------------------------
  2. OS      =       0
  3. Loader  =       1
  4. ;-----------------------------------------------------------------------------
  5. SkipAddr        = 8
  6. ;-----------------------------------------------------------------------------
  7. Bitness equ     32
  8. ;-----------------------------------------------------------------------------
  9. include "globals!.inc"
  10. include "fasm\fasm.asm"
  11. include "disasm\disasm32.asm"
  12. if ~OS
  13. include "loadmap.inc"
  14. end if
  15. include "assemble.inc"
  16. ;-----------------------------------------------------------------------------
  17. xglobal
  18. even 16
  19. StdMemStr       rb      4*1024
  20. StdMemEnd:
  21. AddMemStr       rb      4*1024
  22. AddMemEnd:
  23. endg
  24. ;-----------------------------------------------------------------------------
  25. uglobal
  26. even 16
  27. Inst    TInstruction
  28. even 16
  29. DefInst TInstruction
  30. endg
  31. ;-----------------------------------------------------------------------------
  32. virtual at 0
  33.         dq      ?
  34. sizeof.dq       = $
  35. end virtual
  36. ;---------------------------------------;
  37. JccCalls:                               ;
  38.         seto    al                      ; 0
  39.         ret                             ;
  40.         setno   al                      ; 1
  41.         ret                             ;
  42.         setc    al                      ; 2
  43.         ret                             ;
  44.         setnc   al                      ; 3
  45.         ret                             ;
  46.         setz    al                      ; 4
  47.         ret                             ;
  48.         setnz   al                      ; 5
  49.         ret                             ;
  50.         setbe   al                      ; 6
  51.         ret                             ;
  52.         seta    al                      ; 7
  53.         ret                             ;
  54.         sets    al                      ; 8
  55.         ret                             ;
  56.         setns   al                      ; 9
  57.         ret                             ;
  58.         setpe   al                      ; A
  59.         ret                             ;
  60.         setpo   al                      ; B
  61.         ret                             ;
  62.         setl    al                      ; C
  63.         ret                             ;
  64.         setge   al                      ; D
  65.         ret                             ;
  66.         setle   al                      ; E
  67.         ret                             ;
  68.         setg    al                      ; F
  69.         ret                             ;
  70. ;-----------------------------------------------------------------------------
  71. ShowCPU:
  72.         mov     [XPos],3
  73.         mov     [YPos],0
  74.         mov     edx,Msg00
  75.         call    PrintS
  76.         movzx   edx,[CPUType]
  77.         cmp     dl,6
  78.         jb      @F
  79.         mov     dl,6
  80.       @@:
  81.         lea     edx,[CPUTable+rdx*4]
  82.         jmp     PrintS
  83. ;-----------------------------------------------------------------------------
  84. ShowFPU:
  85.         movzx   edx,[CPUType]
  86.         cmp     dl,6
  87.         jb      @F
  88.         mov     dl,6
  89.       @@:
  90.         lea     edx,[FPUTable+rdx*8]
  91.         jmp     PrintS
  92. ;-----------------------------------------------------------------------------
  93. DetectCPU:
  94.         mov     dl,1
  95.         push    sp
  96.         pop     ax
  97.         cmp     ax,sp
  98.         jnz     .RetCPU
  99.         inc     edx
  100.         pushfw
  101.         pop     ax
  102.         mov     cx,ax
  103.         xor     ah,40h
  104.         push    ax
  105.         popfw
  106.         pushfw
  107.         pop     ax
  108.         push    cx
  109.         popfw
  110.         xor     ah,ch
  111.         jz      .RetCPU
  112.         inc     edx
  113.         pushfd
  114.         pop     eax
  115.         mov     ecx,eax
  116.         btc     eax,18
  117.         push    eax
  118.         popfd
  119.         pushfd
  120.         pop     eax
  121.         push    ecx
  122.         popfd
  123.         xor     eax,ecx
  124.         jz      .RetCPU
  125.         inc     edx
  126.         mov     eax,ecx
  127.         btc     eax,21
  128.         push    eax
  129.         popfd
  130.         pushfd
  131.         pop     eax
  132.         push    ecx
  133.         popfd
  134.         xor     eax,ecx
  135.         jz      .RetCPU
  136.         inc     edx
  137.         xor     eax,eax
  138.         cpuid
  139.         test    eax,eax
  140.         jz      .RetCPU
  141.         xor     eax,eax
  142.         inc     eax
  143.         cpuid
  144.         mov     dl,ah
  145.         and     dl,0Fh
  146. .RetCPU:ret
  147. ;-----------------------------------------------------------------------------
  148. DetectFPU:
  149.         xor     eax,eax
  150.         push    ax
  151.         mov     ebp,esp
  152.         fninit
  153.         fnstcw  word [ebp]
  154.         mov     dx,[ebp]
  155.         cmp     dh,03h
  156.         jnz     .Done           ; done: no FPU present
  157.         inc     eax
  158.         and     word [ebp],0FF7Fh
  159.         wait
  160.         fldcw   word [ebp]
  161.         fdisi
  162.         fstcw   word [ebp]
  163.         wait
  164.         test    byte [ebp],0080h
  165.         jnz     .Done           ; done: 8087 is present
  166.         inc     eax
  167.         fninit
  168.         wait
  169.         fld1
  170.         wait
  171.         fldz
  172.         wait
  173.         fdivp   st1,st0
  174.         wait
  175.         fld     st0
  176.         wait
  177.         fchs
  178.         wait
  179.         fcompp
  180.         wait
  181.         fnstsw  ax
  182.         wait
  183.         fnclex
  184.         wait
  185.         sahf
  186.         jz      .Done           ; done: 80287 is present
  187.         inc     eax
  188.         mov     ah,[CPUType]
  189.         cmp     ah,4
  190.         jb      .Done           ; done: 80387 is present
  191.         mov     al,ah           ; done: 80487+ (build-in)
  192. .Done:  or      al,al
  193.         jz      .Exit
  194.         mov     ecx,8
  195. .Loop:  fldz                    ; set ST(0) to ST(7) to +ZERO
  196.         loop    .Loop
  197.         finit                   ; reinitialize FPU
  198. .Exit:  pop     dx
  199.         ret
  200. ;-----------------------------------------------------------------------------
  201. ClearCmdLine:
  202.         mov     [XPos],1
  203.         mov     [YPos],MinHeight-1
  204.         mov     [Color],7
  205.         mov     al,32
  206.         mov     ecx,[CurWidth]
  207.         sub     ecx,2
  208. .Loop:  call    PrintC
  209.         loop    .Loop
  210.         ret
  211. ;-----------------------------------------------------------------------------
  212. PrintCmdLine:
  213.         call    ClearCmdLine
  214.         mov     [XPos],1
  215.         lea     edx,[Msg50]
  216.         jmp     PrintS
  217. ;-----------------------------------------------------------------------------
  218. Decode: push    rax rcx rsi rdi
  219.         xor     ecx,ecx
  220.         mov     [Origin],rsi
  221.         mov     rdi,rsi
  222.       @@:
  223.         mov     rsi,rdi
  224.         add     rsi,rcx
  225.         call    GetDataByte
  226.         mov     [rcx+BufferI],al
  227.         inc     ecx
  228.         cmp     cl,15
  229.         jb      @B
  230.         pop     rdi rsi rcx rax
  231.         pushad
  232.         mov     [DefInst.Addr],BufferI
  233.         mov     [TheBufferO],BufferO
  234.         call    DisAsmLine
  235.         mov     [rsp+1Ch],rax
  236.         popad
  237.         add     rsi,rax
  238.         ret
  239. DisAsmLine:
  240.         push    rbp
  241.         mov     al,[CodeType]
  242.         mov     ah,0
  243.         cmp     al,16
  244.         jz      @F
  245.         mov     ah,1
  246.         cmp     al,32
  247.         jz      @F
  248.         mov     ah,2
  249.       @@:
  250.         mov     [DefInst.Arch],ah
  251.         mov     [DefInst.Emulated],-1   ;#
  252.         lea     ebp,[Inst+128]
  253.         mov     ecx,sizeof.TInstruction
  254.         lea     esi,[DefInst]
  255.         lea     edi,[Inst]
  256.         rep     movsb
  257.         mov     [SpaceSize],8
  258.         call    DisAsm
  259.         push    rax
  260.         call    PrnAsm
  261.         pop     rax
  262.         pop     rbp
  263.         ret
  264. ;-----------------------------------------------------------------------------
  265. ShowText:
  266. MakeText:
  267.         xor     ebp,ebp
  268.         mov     [CPUXPtr],ebp
  269.         mov     rsi,[CodeAddr]
  270.         mov     [AddrBuffer],rsi
  271.         mov     [YPos],0
  272. .Loop:  mov     [Color],30h
  273.         mov     [BufferO-1],byte 30h    ;Default Color
  274.         inc     [YPos]
  275.         mov     [XPos],1
  276.         call    Decode
  277.         mov     eax,[_EIP]
  278.         inc     ebp
  279.         cmp     [AddrBuffer+(rbp-1)*sizeof.dq],rax
  280.         jnz     .1
  281.         mov     [CPUXPtr],ebp
  282.         mov     [BufferO+SkipAddr+1],byte 10h   ;'>>'
  283.         cmp     [Inst.IsAddress],0
  284.         je      .1
  285.         call    CheckJump
  286.         cmp     [JumpTaken],0
  287.         jz      .1
  288.         mov     [BufferO+SkipAddr+2*16+1],byte 18h
  289.         mov     rax,[Inst.Arg1.Imm]
  290.         cmp     rax,rsi
  291.         jbe     .1
  292. .0:     mov     [BufferO+SkipAddr+2*16+1],byte 19h
  293.  
  294. .1:     mov     [AddrBuffer+rbp*sizeof.dq],rsi
  295.         lea     edx,[BufferO]
  296.         cmp     byte [rdx-1],30h
  297.         jnz     .2
  298.         mov     ax,'+'
  299.         xchg    ax,[rdx+9+9]
  300.         cmp     al,32
  301. ifz     mov     [rdx+9+9],al
  302.         call    PrintS
  303.         add     edx,9+15*2
  304.         jmp     .3
  305. .2:     mov     eax,edx
  306. .N:     cmp     [eax],byte 32
  307.         jz      .F
  308.         inc     eax
  309.         jmp     .N
  310. .F:     mov     [rax],byte 0
  311.         sub     eax,edx
  312.         cmp     eax,(MinWidth-2)
  313.         jbe     .X
  314.         mov     [rdx+(MinWidth-2)],byte 0
  315. .X:     add     edx,43
  316.         mov     [Color],30h
  317.         mov     [XPos],9+15*2-(9+9)+3
  318.         call    PrintS
  319.         sub     edx,43
  320.         mov     al,[rdx-1]
  321.         mov     [Color],al
  322.         mov     [XPos],1
  323. .3:     call    PrintS
  324.         mov     rax,[AddrBuffer+(rbp-1)*sizeof.dq]
  325.         call    BChk
  326.         cmp     ebp,28
  327.         jb      .Loop
  328.         ret
  329. ;-----------------------------------------------------------------------------
  330. BChk:   push    rbp rbx rcx rsi rdi
  331.         xor     ebp,ebp
  332. .001:   cmp     [DrXBreak+rbp*4],eax
  333.         jnz     .NotFound
  334.         push    rax
  335.         mov     esi,1
  336.         movzx   edi,[YPos]
  337.         mov     ecx,[CurWidth]
  338.         sub     ecx,25
  339.         mov     ax,7F00h
  340.         call    Cursor
  341.         mov     eax,ebp                 ; EBP = breakpoint number
  342.         shl     eax,16
  343.         add     eax,60306023h           ; show #X (X=BrkPnt)
  344.         add     esi,ecx                 ; adjust X-pos
  345.         push    rdx
  346.         mov     edx,[CurWidth]
  347.         add     edx,edx
  348.         imul    edx,edi
  349.         lea     esi,[rdx+rsi*2]
  350.         add     esi,ConsoleDataPtr
  351.         mov     [rsi],eax
  352.         pop     rdx
  353.         pop     rax
  354. .NotFound:
  355.         inc     ebp
  356.         cmp     ebp,4
  357.         jnz     .001
  358.  
  359.         push    rax
  360.         call    FindEnabledBreakPoint;FindBreakPoint
  361.         inc     eax
  362.         jz      .NoFound2
  363.         mov     esi,1
  364.         movzx   edi,[YPos]
  365.         mov     ecx,[CurWidth]
  366.         sub     ecx,21
  367.         mov     ax,7F00h
  368.         call    Cursor
  369. .NoFound2:
  370.         pop     rax
  371.  
  372.         pop     rdi rsi rcx rbx rbp
  373.         ret
  374. ;-----------------------------------------------------------------------------
  375. CheckJump:
  376.         pushf
  377.         push    rax rdx
  378.         pushf
  379.         and     dword [rsp],$FFFFF700
  380.         mov     eax,[_EFL]
  381.         and     eax,000008FFh
  382.         or      [rsp],eax
  383.         mov     rax,[Inst.SaveRSI]
  384.         movzx   edx,byte [rax-2]
  385.         movzx   eax,byte [rax-1]
  386.         mov     [JumpTaken],ah  ;ah=0
  387.         cmp     al,0xE8
  388.         jz      .2
  389.         cmp     al,0xE9
  390.         jz      .2
  391.         cmp     al,0xEB
  392.         jz      .2
  393.         cmp     al,0xE0         ;LOOPNZ
  394.         jz      .3
  395.         cmp     al,0xE1         ;LOOPZ
  396.         jz      .4
  397.         cmp     al,0xE2         ;LOOP
  398.         jz      .5
  399.         cmp     al,0xE3         ;JxCXZ
  400.         jz      .6
  401.         and     al,7Fh          ;70-7F
  402.         cmp     al,0Fh          ;0F80-0F8F
  403.         jbe     .1
  404.         sub     al,70h
  405.       .1:
  406.         popf
  407.         lea     eax,[JccCalls+rax*4]
  408.         call    rax
  409.         mov     [JumpTaken],al
  410.         pop     rdx rax
  411.         popf
  412.         ret
  413.       .2:
  414.         mov     [JumpTaken],1
  415.         popf
  416.         pop     rdx rax
  417.         popf
  418.         ret
  419.       .3:
  420.         popf
  421.         call    JccCalls+5*4
  422.         mov     [JumpTaken],al
  423.         call    TypeLoop
  424.         pop     rdx rax
  425.         popf
  426.         ret
  427.       .4:
  428.         popf
  429.         call    JccCalls+4*4
  430.         mov     [JumpTaken],al
  431.         call    TypeLoop
  432.         pop     rdx rax
  433.         popf
  434.         ret
  435.       .5:
  436.         popf
  437.         call    TypeLoop
  438.         pop     rdx rax
  439.         popf
  440.         ret
  441.       .6:
  442.         popf
  443.         call    TypeJxCXZ
  444.         pop     rdx rax
  445.         popf
  446.         ret
  447. ;-----------------------------------------------------------------------------
  448. TypeJxCXZ:
  449.         cmp     [CodeType],32
  450.         jz      JCXZ32
  451.         cmp     [CodeType],16
  452.         jz      JCXZ16
  453. if %B=64
  454.         cmp     dl,67h
  455.         jnz     .1
  456.         cmp     [Reg.ECX],0
  457.         jmp     .2
  458. .1:     cmp     [Reg.RCX],0
  459. .2:     setz    [JumpTaken]
  460. end if
  461.         ret
  462. ;-----------------------------------------------------------------------------
  463. JCXZ16: cmp     dl,67h
  464.         jz      .1
  465.         cmp     word [_ECX],0
  466.         setz    [JumpTaken]
  467.         jmp     .2
  468. .1:     cmp     [_ECX],0
  469.         setz    [JumpTaken]
  470. .2:     ret
  471. ;-----------------------------------------------------------------------------
  472. JCXZ32: cmp     dl,67h
  473.         jz      .1
  474.         cmp     [_ECX],0
  475.         setz    [JumpTaken]
  476.         jmp     .2
  477. .1:     cmp     word [_ECX],0
  478.         setz    [JumpTaken]
  479. .2:     ret
  480. ;-----------------------------------------------------------------------------
  481. TypeLoop:
  482.         cmp     [CodeType],32
  483.         jz      .32
  484.         cmp     [CodeType],16
  485.         jz      .16
  486. if %B=64
  487.         mov     rax,[_RCX]
  488.         cmp     dl,67h          ; check for ECX or RCX == 0
  489.         jnz     .1X
  490.         mov     eax,eax
  491. .1X:    dec     rax
  492.         setnz   al
  493.         or      [JumpTaken],al
  494. end if
  495.         ret
  496. .32:    mov     eax,[_ECX]
  497.         cmp     dl,67h          ; check for CX or ECX == 0
  498.         jnz     .1Y
  499.         movzx   eax,ax
  500. .1Y:    dec     eax
  501.         setnz   al
  502.         or      [JumpTaken],al
  503.         ret
  504. .16:    mov     eax,[_ECX]
  505.         cmp     dl,67h          ; check for CX or ECX == 0
  506.         jz      .1Z
  507.         movzx   eax,ax
  508. .1Z:    dec     eax
  509.         setnz   al
  510.         or      [JumpTaken],al
  511.         ret
  512. ;-----------------------------------------------------------------------------
  513. CPUCursor:
  514.         mov     esi,[CPUXPos]
  515.         mov     edi,[CPUYPos]
  516.         mov     ecx,[CurWidth]
  517.         sub     ecx,23
  518.         mov     ax,2F00h
  519.         call    Cursor
  520.         mov     eax,[CPUYPos]
  521.         mov     rsi,[(rax-1)*sizeof.dq+AddrBuffer]
  522.         call    Decode
  523.         call    ShowAddress
  524.         ret
  525. ;-----------------------------------------------------------------------------
  526. RegCursor:
  527.         mov     esi,[RegXPos]
  528.         mov     edi,[RegYPos]
  529.         mov     ecx,[RegLDat]
  530.         jmp     CursorXY
  531. ;-----------------------------------------------------------------------------
  532. MemCursor:
  533.         mov     esi,[MemXPos]
  534.         mov     edi,[MemYPos]
  535.         mov     ecx,2
  536.         mov     ax,2F00h
  537.         jmp     Cursor
  538. ;-----------------------------------------------------------------------------
  539. StkCursor:
  540.         mov     esi,[StkXPos]
  541.         mov     edi,[StkYPos]
  542.         mov     ecx,20
  543.         mov     ax,2F00h
  544.         jmp     Cursor
  545. ;-----------------------------------------------------------------------------
  546. CursorXY:
  547.         pushad
  548.         mov     eax,[CurWidth]
  549.         add     eax,eax
  550.         imul    eax,edi
  551.         lea     esi,[rax+rsi*2]
  552.         add     esi,ConsoleDataPtr
  553. .Loop:  mov     al,[rsi+1]
  554.         cmp     al,17h
  555.         jz      .1
  556.         cmp     al,1Fh
  557.         jz      .2
  558.         cmp     al,30h
  559.         jz      .3
  560.         cmp     al,3Fh
  561.         jz      .4
  562.         jmp     .Next
  563. .1:     mov     al,3Fh
  564.         jmp     .Next
  565. .2:     mov     al,30h
  566.         jmp     .Next
  567. .3:     mov     al,1Fh
  568.         jmp     .Next
  569. .4:     mov     al,17h
  570. .Next:  mov     [rsi+1],al
  571.         add     esi,2
  572.         dec     cl
  573.         jnz     .Loop
  574.         popad
  575.         ret
  576. ;-----------------------------------------------------------------------------
  577. Cursor: push    rcx rdx rsi
  578.         mov     edx,eax
  579.         mov     eax,[CurWidth]
  580.         add     eax,eax
  581.         imul    eax,edi
  582.         xchg    edx,eax
  583.         lea     esi,[rdx+rsi*2]
  584.         add     esi,ConsoleDataPtr
  585. .Loop:  xor     [rsi],ax
  586.         add     esi,2
  587.         dec     cl
  588.         jnz     .Loop
  589.         pop     rsi rdx rcx
  590.         ret
  591. ;-----------------------------------------------------------------------------
  592. ShowCursor:
  593.         mov     ebp,CursorTab
  594. GotoWindow:
  595.         mov     ebx,[CurrentWindow]
  596.         and     ebx,3
  597.         jmp     dword [rbp+rbx*4]
  598. ;-----------------------------------------------------------------------------
  599. WindowSwitch:
  600.         test    [CtrlState],3
  601.         jz      .1
  602.         dec     [CurrentWindow]
  603.         jmp     .2
  604. .1:     inc     [CurrentWindow]
  605. .2:     and     [CurrentWindow],3
  606.         xor     eax,eax
  607. WinSwitch:
  608.         mov     [AfterKey],1
  609.         call    ShowImage
  610.         mov     ebp,WindowTab
  611.         jmp     GotoWindow
  612. ;-----------------------------------------------------------------------------
  613. DrawChar:
  614.         mov     [rdi+rdx*2],ax
  615.         inc     edx
  616.         ret
  617. ;-----------------------------------------------------------------------------
  618. DrawLine:
  619.         mov     [rdi+rdx*2],ax
  620.         inc     edx
  621.         loop    DrawLine
  622.         ret
  623. ;-----------------------------------------------------------------------------
  624. DrawDown:
  625.         mov     [rdi+rdx*2],ax
  626.         add     edx,[CurWidth]
  627.         loop    DrawDown
  628.         ret
  629. ;-----------------------------------------------------------------------------
  630. PrintAL:push    rdi
  631.         mov     edi,HexBuf
  632.         call    MakeHex
  633.         lea     edi,[rdi+6]
  634.         jmp     PrintHex
  635. ;-----------------------------------------------------------------------------
  636. PrintAX:push    rdi
  637.         mov     edi,HexBuf
  638.         call    MakeHex
  639.         lea     edi,[rdi+4]
  640.         jmp     PrintHex
  641. ;-----------------------------------------------------------------------------
  642. PrintEAX:
  643.         push    rdi
  644.         mov     edi,HexBuf
  645.         call    MakeHex
  646. PrintHex:
  647.         push    rdx
  648.         mov     edx,edi
  649.         call    PrintS
  650.         pop     rdx rdi
  651.         ret
  652. ;-----------------------------------------------------------------------------
  653. MakeHex:push    rax rdx rsi
  654.         mov     edx,3
  655. .Loop:  mov     esi,eax
  656.         and     eax,$FF
  657.         mov     ax,[rax*2+HexString]
  658.         mov     [rdi+rdx*2],ax
  659.         mov     eax,esi
  660.         shr     eax,8
  661.         sub     edx,1
  662.         jnc     .Loop
  663.         pop     rsi rdx rax
  664.         ret
  665. ;-----------------------------------------------------------------------------
  666. DrawFrame:
  667.         mov     ah,3Fh          ; color
  668.         mov     edi,ConsoleDataPtr
  669.         xor     edx,edx
  670.         xor     ecx,ecx
  671.  
  672.         mov     al,     'É'
  673.         call    DrawChar
  674.         mov     al,     'Í'
  675.         mov     cl,byte [CurWidth]
  676.         sub     cl,2
  677.         call    DrawLine
  678.         mov     al,     '»'
  679.         call    DrawChar
  680.  
  681.         mov     al,     'º'     ; left border
  682.         mov     edx,[CurWidth]
  683.         mov     cl,byte [CurHeight]
  684.         sub     cl,2
  685.         call    DrawDown
  686.         mov     al,     'È'
  687.         call    DrawChar
  688.         mov     al,     'º'     ; right border
  689.         imul    edx,[CurWidth],2
  690.         dec     edx
  691.         mov     cl,byte [CurHeight]
  692.         sub     cl,2
  693.         call    DrawDown
  694.         mov     al,     '¼'
  695.         call    DrawChar
  696.  
  697.         mov     al,     'Ç'
  698.         imul    edx,[CurWidth],29
  699.         call    DrawChar
  700.         mov     al,     'Ä'
  701.         mov     cl,byte [CurWidth]
  702.         sub     cl,2
  703.         call    DrawLine
  704.         mov     al,     '¶'
  705.         call    DrawChar
  706.  
  707.         mov     al,     'Ç'
  708.         imul    edx,[CurWidth],40
  709.         call    DrawChar
  710.         mov     al,     'Ä'
  711.         mov     cl,byte [CurWidth]
  712.         sub     cl,(2+45)
  713.         call    DrawLine
  714.         mov     al,     '´'
  715.         call    DrawChar
  716.  
  717.         mov     al,     'Ç'
  718.         imul    edx,[CurWidth],49
  719.         call    DrawChar
  720.         mov     al,     'Ä'
  721.         mov     cl,byte [CurWidth]
  722.         sub     cl,2
  723.         call    DrawLine
  724.         mov     al,     '¶'
  725.         call    DrawChar
  726.  
  727.         mov     al,     'Â'
  728.         imul    edx,[CurWidth],30
  729.         sub     edx,46
  730.         call    DrawChar
  731.         imul    edx,[CurWidth],31
  732.         sub     edx,46
  733.         mov     al,     '³'
  734.         mov     cl,10
  735.         call    DrawDown
  736.  
  737.         imul    edx,[CurWidth],40
  738.         sub     edx,46
  739.         mov     al,     '³'
  740.         mov     cl,10
  741.         call    DrawDown
  742.  
  743.         mov     al,     'Ã'
  744.         imul    edx,[CurWidth],46
  745.         sub     edx,46
  746.         call    DrawChar
  747.         mov     al,     'Ä'
  748.         mov     cl,44
  749.         call    DrawLine
  750.         mov     al,     '¶'
  751.         call    DrawChar
  752.         mov     al,     'Ñ'
  753.         mov     edx,[CurWidth]
  754.         sub     edx,22
  755.         call    DrawChar
  756.  
  757.         mov     al,     '³'
  758.         imul    edx,[CurWidth],2
  759.         sub     edx,22
  760.         mov     cl,28
  761.         call    DrawDown
  762.         mov     al,     'Á'
  763.         call    DrawChar
  764.  
  765.         mov     al,     'Ã'
  766.         imul    edx,[CurWidth],42
  767.         sub     edx,46
  768.         call    DrawChar
  769.         mov     al,     'Ä'
  770.         mov     cl,44
  771.         call    DrawLine
  772.         mov     al,     '¶'
  773.         call    DrawChar
  774.  
  775.         mov     al,     'Ã'
  776.         imul    edx,[CurWidth],34
  777.         sub     edx,46
  778.         call    DrawChar
  779.         mov     al,     'Ä'
  780.         mov     cl,44
  781.         call    DrawLine
  782.         mov     al,     '¶'
  783.         call    DrawChar
  784.  
  785.         mov     al,     'Ã'
  786.         imul    edx,[CurWidth],38
  787.         sub     edx,46
  788.         call    DrawChar
  789.         mov     al,     'Ä'
  790.         mov     cl,44
  791.         call    DrawLine
  792.         mov     al,     '¶'
  793.         call    DrawChar
  794.         mov     al,     '´'
  795.         imul    edx,[CurWidth],41
  796.         sub     edx,46
  797.         call    DrawChar
  798.         mov     al,     'Á'
  799.         imul    edx,[CurWidth],50
  800.         sub     edx,46
  801.         call    DrawChar
  802. if 1
  803.         mov     al,     'Ç'
  804.         imul    edx,[CurWidth],MinHeight-2-(MSG_HEIGHT-1)-1
  805.         call    DrawChar
  806.         mov     al,     'Ä'
  807.         mov     cl,byte [CurWidth]
  808.         sub     cl,2
  809.         call    DrawLine
  810.         mov     al,     '¶'
  811.         call    DrawChar
  812. end if
  813.         mov     [Color],3Ah
  814.         call    ShowCPU
  815.         call    ShowFPU
  816.         mov     [Color],3Ah
  817.         mov     [XPos],3
  818.         mov     [YPos],29
  819.         lea     edx,[Msg10]
  820.         call    PrintS
  821.         mov     [Color],30h
  822.         mov     [XPos],1
  823.         inc     [YPos]
  824.         lea     edx,[Msg11]
  825.         call    PrintS
  826.         mov     [XPos],1
  827.         inc     [YPos]
  828.         lea     edx,[Msg12]
  829.         call    PrintS
  830.         mov     [XPos],1
  831.         inc     [YPos]
  832.         lea     edx,[Msg13]
  833.         call    PrintS
  834.         mov     [XPos],1
  835.         inc     [YPos]
  836.         lea     edx,[Msg14]
  837.         call    PrintS
  838.         mov     [XPos],1
  839.         inc     [YPos]
  840.         lea     edx,[Msg15]
  841.         call    PrintS
  842.         mov     [XPos],1
  843.         inc     [YPos]
  844.         lea     edx,[Msg16]
  845.         call    PrintS
  846.         mov     [XPos],1
  847.         inc     [YPos]
  848.         lea     edx,[Msg17]
  849.         call    PrintS
  850.         mov     [XPos],1
  851.         inc     [YPos]
  852.         lea     edx,[Msg18]
  853.         call    PrintS
  854.         mov     [XPos],1
  855.         inc     [YPos]
  856.         lea     edx,[Msg19]
  857.         call    PrintS
  858.         mov     [XPos],1
  859.         inc     [YPos]
  860.         lea     edx,[Msg20]
  861.         call    PrintS
  862.         mov     [XPos],3
  863.         inc     [YPos]
  864.         mov     [Color],3Ah
  865.         lea     edx,[Msg21]
  866.         call    PrintS
  867.         mov     eax,[CurWidth]
  868.         sub     eax,43
  869.         mov     [XPos],al
  870.         mov     [YPos],29
  871.         lea     edx,[MsgX2]
  872.         call    PrintS
  873.         mov     eax,[CurWidth]
  874.         sub     eax,43
  875.         mov     [XPos],al
  876.         mov     [YPos],33
  877.         lea     edx,[MsgX3]
  878.         call    PrintS
  879.         mov     eax,[CurWidth]
  880.         sub     eax,43
  881.         mov     [XPos],al
  882.         mov     [YPos],37
  883.         lea     edx,[MsgX4]
  884.         call    PrintS
  885.         mov     eax,[CurWidth]
  886.         sub     eax,43
  887.         mov     [XPos],al
  888.         mov     [YPos],41
  889.         lea     edx,[Msg22]
  890.         call    PrintS
  891.         mov     eax,[CurWidth]
  892.         sub     eax,43
  893.         mov     [XPos],al
  894.         mov     [YPos],45
  895.         lea     edx,[Msg23]
  896.         call    PrintS
  897.         mov     eax,[CurWidth]
  898.         sub     eax,19
  899.         mov     [XPos],al
  900.         mov     [YPos],0
  901.         lea     edx,[Msg30]
  902.         call    PrintS
  903.         mov     [XPos],3
  904.         mov     [YPos],MinHeight-2-(MSG_HEIGHT-1)-1
  905.         lea     edx,[Msg3M]
  906.         call    PrintS
  907.         mov     eax,[CurWidth]
  908.         sub     eax,51-23
  909.         mov     [XPos],al
  910.         mov     [YPos],MinHeight-2-(MSG_HEIGHT-1)-1
  911.         lea     edx,[Msg40]
  912.         call    PrintS
  913.  
  914.         cmp     [DebuggeePID],0
  915.         jz      .Exit
  916.  
  917.         call    MakeText
  918.         btr     dword [AfterKey],0
  919.         jc      .0
  920.  
  921.         cmp     [CPUXPtr],0
  922.         jnz     .1
  923.         mov     eax,[_EIP]
  924.         mov     [CodeAddr],rax
  925.         mov     [CPUYPos],1
  926. .0:
  927.         mov     ebx,28                  ;dY
  928.         mov     ecx,[CurWidth]          ;\dX
  929.         sub     ecx,23                  ;/
  930.         mov     esi,1                   ;X
  931.         mov     edi,1                   ;Y
  932.         mov     edx,3F203F20h
  933.         call    ClearWindow
  934.         call    MakeText
  935.         jmp     .2
  936. .1:     mov     eax,[CPUXPtr]
  937.         mov     [CPUYPos],eax
  938.         mov     rsi,[AddrBuffer+(rax-1)*sizeof.dq]
  939.         call    Decode
  940.         call    ShowAddress
  941. .2:
  942.         call    ShowRegs
  943.         call    ShowData
  944.         call    ShowCursor
  945. .Exit:
  946.         mov     eax,PrintCmdLine
  947.         cmp     [CmdLineActive],0
  948. ifnz    mov     eax,DrawCmdLine
  949.         call    eax
  950.  
  951.         mov     edx,Messages
  952.         push    MSG_WIDTH
  953.         pop     esi
  954.         xor     ecx,ecx
  955.     @@:
  956.         mov     eax,MinHeight-2-(MSG_HEIGHT-1)
  957.         add     eax,ecx
  958.         mov     [XPos],1
  959.         mov     [YPos],al
  960.         mov     [Color],8Fh
  961.         xor     ebp,ebp
  962.     .Loop:
  963.         mov     al,[rdx+rbp]
  964.         cmp     al,8
  965.         jnz     .NoColor
  966.         inc     ebp
  967.         mov     al,[rdx+rbp]
  968.         mov     [Color],al
  969.         jmp     .Next
  970.    .NoColor:
  971.         call    PrintC
  972.    .Next:
  973.         inc     ebp
  974.         cmp     ebp,MSG_WIDTH
  975.         jnz     .Loop
  976.         inc     ecx
  977.         add     edx,esi
  978.         cmp     edx,Messages+MSG_WIDTH*MSG_HEIGHT
  979.         jb      @B
  980.  
  981.         mov     esi,[PrgNamePtr]
  982.         mov     edi,HeaderE-61
  983.         mov     ecx,60
  984.       @@:
  985.         lodsb
  986.         stosb
  987.         or      al,al
  988.         loopnz  @B
  989.  
  990.         mov     eax,71
  991.         mov     ebx,2
  992.         mov     dl,1    ;CP866
  993.         mov     ecx,HeaderN
  994.         cmp     [DebuggeePID],0
  995.         jz      @F
  996.         mov     ecx,HeaderY
  997.     @@: int     40h
  998.         ret
  999. ;-----------------------------------------------------------------------------
  1000. ShowRegs:
  1001.         call    ShowGRegs
  1002.         call    ShowSRegs
  1003.         call    ShowXRegs
  1004.         call    ShowSlide
  1005. if 0
  1006.         jmp     ShowMode
  1007. else
  1008.         ret
  1009. end if
  1010. ;-----------------------------------------------------------------------------
  1011. PrintC: push    rax rdx rdi rbx
  1012.         mov     bl,byte [CurWidth]
  1013.         mov     bh,byte [CurHeight]
  1014.         cmp     al,09h
  1015.         jz      .09
  1016.         cmp     al,0Ah
  1017.         jz      .0A
  1018.         cmp     al,0Dh
  1019.         jz      .0D
  1020.         ;
  1021.         mov     edi,eax
  1022.         movzx   eax,[YPos]
  1023.         mul     [CurWidth]
  1024.         movzx   edx,[XPos]
  1025.         add     edx,eax
  1026.         mov     eax,edi
  1027.         mov     edi,ConsoleDataPtr
  1028.         ;
  1029.         mov     ah,[Color]
  1030.         mov     [rdi+rdx*2],ax
  1031.         inc     [XPos]
  1032.         cmp     [XPos],bl
  1033.         jb      .Done
  1034.         mov     [XPos],0
  1035.         jmp     .0A
  1036. .0D:    pop     rbx rdi rdx rax
  1037.         mov     [XPos],ah
  1038.         ret
  1039. .09:    and     [XPos],$F8
  1040.         add     [XPos],8
  1041.         cmp     [XPos],bl
  1042.         jb      .Done
  1043.         sub     [XPos],bl
  1044. .0A:    inc     [YPos]
  1045.         cmp     [YPos],bh
  1046.         jb      .Done
  1047.         mov     [YPos],0
  1048. .Done:  pop     rbx rdi rdx rax
  1049.         ret
  1050. ;-----------------------------------------------------------------------------
  1051. PrintS: push    rax rdx
  1052.         mov     ah,[XPos]
  1053. .Loop:  mov     al,[rdx]
  1054.         inc     edx
  1055.         test    al,al
  1056.         jz      .Done
  1057.         cmp     al,08h
  1058.         jz      .1
  1059.         call    PrintC
  1060.         jmp     .Loop
  1061. .1:     mov     al,[rdx]
  1062.         inc     edx
  1063.         test    al,al
  1064.         jz      .Done
  1065.         mov     [Color],al
  1066.         jmp     .Loop
  1067. .Done:  pop     rdx rax
  1068.         ret
  1069. ;-----------------------------------------------------------------------------
  1070. ShowGRegs:
  1071.         mov     dl,5
  1072.         mov     [YPos],30
  1073.         mov     [XPos],dl
  1074.         lea     rbp,[_EAX]
  1075.         call    DisplayIfChanged
  1076.         lea     rbp,[_EBX]
  1077.         call    DisplayIfChanged
  1078.         lea     rbp,[_ECX]
  1079.         call    DisplayIfChanged
  1080.         lea     rbp,[_EDX]
  1081.         call    DisplayIfChanged
  1082.         lea     rbp,[_ESI]
  1083.         call    DisplayIfChanged
  1084.         lea     rbp,[_EDI]
  1085.         call    DisplayIfChanged
  1086.         lea     rbp,[_EBP]
  1087.         call    DisplayIfChanged
  1088.         lea     rbp,[_ESP]
  1089. DisplayIfChanged:
  1090.         mov     rax,[rbp]
  1091.         cmp     rax,[rbp+Plus]
  1092.         mov     [Color],30h
  1093.         jz      @F
  1094.         mov     [Color],3Fh
  1095. @@:     call    PrintEAX
  1096.         inc     [YPos]
  1097.         mov     [XPos],dl
  1098.         ret
  1099. ;-----------------------------------------------------------------------------
  1100. ShowXRegs:
  1101.         mov     dl,18
  1102.         mov     [YPos],30
  1103.         mov     [XPos],dl
  1104.         lea     rbp,[_EFL]
  1105.         call    DisplayIfChanged
  1106.         lea     rbp,[_EIP]
  1107.         call    DisplayIfChanged
  1108.         ret
  1109. ;-----------------------------------------------------------------------------
  1110. ShowSlide:
  1111.         mov     [XPos],1
  1112.         mov     [YPos],39
  1113.         mov     esi,[_EFL]
  1114.         mov     edi,[_EFL+Plus]
  1115.         shl     esi,14
  1116.         shl     edi,14
  1117.         call    .Show           ; VM-flag
  1118.         call    .Show           ; RF-flag
  1119.         shl     esi,1
  1120.         shl     edi,1
  1121.         call    .Show           ; NT-flag
  1122.         call    .Show           ; IOPL-flag
  1123.         dec     [XPos]
  1124.         call    .Show
  1125.         call    .Show           ; OF-flag
  1126.         call    .Show           ; DF-flag
  1127.         call    .Show           ; IF-flag
  1128.         call    .Show           ; TF-flag
  1129.         call    .Show           ; SF-flag
  1130.         inc     [XPos]
  1131.         call    .Show           ; ZF-flag
  1132.         shl     esi,1
  1133.         shl     edi,1
  1134.         call    .Show           ; AF-flag
  1135.         shl     esi,1
  1136.         shl     edi,1
  1137.         call    .Show           ; PF-flag
  1138.         shl     esi,1
  1139.         shl     edi,1
  1140. .Show:  xor     ax,ax
  1141.         shl     esi,1
  1142.         adc     al,'0'
  1143.         shl     edi,1
  1144.         adc     ah,'0'
  1145.         cmp     al,ah
  1146.         mov     [Color],30h
  1147.         jz      .S1
  1148.         mov     [Color],3Fh
  1149. .S1:    call    PrintC
  1150.         inc     [XPos]
  1151.         ret
  1152. ;-----------------------------------------------------------------------------
  1153. ShowSRegs:
  1154.         mov     dl,17
  1155.         mov     [YPos],32
  1156.         mov     eax,cs
  1157.         call    .DisplaySel
  1158.         mov     eax,ds
  1159.         call    .DisplaySel
  1160.         mov     eax,es
  1161.         call    .DisplaySel
  1162.         mov     eax,fs
  1163.         call    .DisplaySel
  1164.         mov     eax,gs
  1165.         call    .DisplaySel
  1166.         mov     eax,ss
  1167. .DisplaySel:
  1168.         mov     [Color],31h
  1169.         mov     [XPos],dl
  1170.         call    PrintAX
  1171.         add     [XPos],10
  1172.         lar     eax,ax
  1173.         shr     eax,8
  1174.         call    PrintAX
  1175.         inc     [YPos]
  1176.         ret
  1177. ;-----------------------------------------------------------------------------
  1178. ShowData:
  1179.         mov     bl,8
  1180.         mov     [YPos],41
  1181.         mov     [Color],30h
  1182.         mov     rsi,[DataAddr]
  1183.         call    ShowDataX
  1184.         mov     bl,3
  1185.         xor     ebp,ebp
  1186.         mov     edi,[_EDX]
  1187.         mov     [YPos],30
  1188.         call    ShowDataRDX
  1189.         mov     bl,3
  1190.         xor     ebp,ebp
  1191.         mov     edi,[_EBX]
  1192.         mov     [YPos],34
  1193.         call    ShowDataRBX
  1194.         mov     bl,3
  1195.         xor     ebp,ebp
  1196.         mov     edi,[_ESI]
  1197.         mov     [YPos],42
  1198.         call    ShowDataRSI
  1199.         mov     bl,3
  1200.         xor     ebp,ebp
  1201.         mov     edi,[_EDI]
  1202.         mov     [YPos],46
  1203.         call    ShowDataRDI
  1204.         mov     bl,3
  1205.         xor     ebp,ebp
  1206.         mov     edi,[_EBP]
  1207.         mov     [YPos],38
  1208.         call    ShowDataRBP
  1209.         call    ShowStack32
  1210.         call    ShowFPURegs
  1211.         cmp     [MMXType],0
  1212. ifnz    call    ShowMMXRegs
  1213.         cmp     [XMMType],0
  1214. ifnz    call    ShowXMMRegs
  1215.         ret
  1216. ;-----------------------------------------------------------------------------
  1217. ShowDataX:
  1218. .1:     mov     [Color],30h
  1219.         mov     [XPos],1
  1220.         mov     rax,rsi
  1221.         call    PrintEAX
  1222.         mov     al,':'
  1223.         call    PrintC
  1224.         inc     [XPos]
  1225.         mov     ecx,35 by 8
  1226. .2:     mov     [Color],30h
  1227.         call    GetDataByte
  1228.         jc      .3
  1229.         lea     eax,[Msg2ER]
  1230.         xchg    eax,edx
  1231.         call    PrintS
  1232.         xchg    eax,edx
  1233.         mov     al,'?'
  1234.         jmp     .5
  1235. .3:     call    PrintAL
  1236.         test    al,al
  1237.         jz      .4
  1238.         cmp     al,08h
  1239.         jz      .4
  1240.         cmp     al,09h
  1241.         jz      .4
  1242.         cmp     al,0Ah
  1243.         jz      .4
  1244.         cmp     al,0Dh
  1245.         jnz     .5
  1246. .4:     mov     al,'.'
  1247. .5:     xchg    [XPos],ch
  1248.         call    PrintC
  1249.         xchg    [XPos],ch
  1250.         inc     [XPos]
  1251.         inc     rsi
  1252.         dec     cl
  1253.         jnz     .2
  1254.         inc     [YPos]
  1255.         dec     bl
  1256.         jnz     .1
  1257.         ret
  1258. ;-----------------------------------------------------------------------------
  1259. ShowDataRSI:
  1260. .1:     mov     eax,[CurWidth]
  1261.         sub     eax,29+16
  1262.         mov     [XPos],al
  1263.         mov     rax,rbp
  1264.         test    rbp,rbp
  1265.         lea     edx,[Msg2SIP]
  1266.         jns     .01
  1267.         lea     edx,[Msg2SIM]
  1268.         neg     rax
  1269. .01:    call    PrintS
  1270.         call    PrintAL
  1271.         mov     al,']'
  1272.         call    PrintC
  1273.         mov     al,32
  1274.         test    rbp,rbp
  1275.         jnz     .03
  1276.         mov     al,10h
  1277. .03:    call    PrintC
  1278.         inc     [XPos]
  1279. .04:    mov     ecx,[CurWidth]
  1280.         sub     ecx,5+5
  1281.         shl     ecx,8
  1282.         mov     cl,8
  1283. .2:     lea     rsi,[rdi+rbp]
  1284.         mov     al,3            ;ds
  1285.         call    GetDataByte
  1286.         jc      .3
  1287.         lea     edx,[Msg2ER]
  1288.         call    PrintS
  1289.         mov     al,'?'
  1290.         jmp     .5
  1291. .3:     call    PrintAL
  1292.         test    al,al
  1293.         jz      .4
  1294.         cmp     al,08h
  1295.         jz      .4
  1296.         cmp     al,09h
  1297.         jz      .4
  1298.         cmp     al,0Ah
  1299.         jz      .4
  1300.         cmp     al,0Dh
  1301.         jnz     .5
  1302. .4:     mov     al,'.'
  1303. .5:     xchg    [XPos],ch
  1304.         call    PrintC
  1305.         xchg    [XPos],ch
  1306.         inc     [XPos]
  1307.         inc     rbp
  1308.         dec     cl
  1309.         jnz     .2
  1310.         inc     [YPos]
  1311.         dec     bl
  1312.         jnz     .1
  1313.         ret
  1314. ShowDataRDI:
  1315. .1:     mov     eax,[CurWidth]
  1316.         sub     eax,29+16
  1317.         mov     [XPos],al
  1318.         mov     rax,rbp
  1319.         test    rbp,rbp
  1320.         lea     edx,[Msg2DIP]
  1321.         jns     .01
  1322.         lea     edx,[Msg2DIM]
  1323.         neg     rax
  1324. .01:    call    PrintS
  1325.         call    PrintAL
  1326.         mov     al,']'
  1327.         call    PrintC
  1328.         mov     al,32
  1329.         test    rbp,rbp
  1330.         jnz     .03
  1331.         mov     al,10h
  1332. .03:    call    PrintC
  1333.         inc     [XPos]
  1334. .04:    mov     ecx,[CurWidth]
  1335.         sub     ecx,5+5
  1336.         shl     ecx,8
  1337.         mov     cl,8
  1338. .2:     lea     rsi,[rdi+rbp]
  1339.         mov     al,0            ;es
  1340.         call    GetDataByte
  1341.         jc      .3
  1342.         lea     edx,[Msg2ER]
  1343.         call    PrintS
  1344.         mov     al,'?'
  1345.         jmp     .5
  1346. .3:     call    PrintAL
  1347.         test    al,al
  1348.         jz      .4
  1349.         cmp     al,08h
  1350.         jz      .4
  1351.         cmp     al,09h
  1352.         jz      .4
  1353.         cmp     al,0Ah
  1354.         jz      .4
  1355.         cmp     al,0Dh
  1356.         jnz     .5
  1357. .4:     mov     al,'.'
  1358. .5:     xchg    [XPos],ch
  1359.         call    PrintC
  1360.         xchg    [XPos],ch
  1361.         inc     [XPos]
  1362.         inc     rbp
  1363.         dec     cl
  1364.         jnz     .2
  1365.         inc     [YPos]
  1366.         dec     bl
  1367.         jnz     .1
  1368.         ret
  1369. ShowDataRBX:
  1370. .1:     mov     eax,[CurWidth]
  1371.         sub     eax,29+16
  1372.         mov     [XPos],al
  1373.         mov     rax,rbp
  1374.         test    rbp,rbp
  1375.         lea     edx,[Msg2BXP]
  1376.         jns     .01
  1377.         lea     edx,[Msg2BXM]
  1378.         neg     rax
  1379. .01:    call    PrintS
  1380.         call    PrintAL
  1381.         mov     al,']'
  1382.         call    PrintC
  1383.         mov     al,32
  1384.         test    rbp,rbp
  1385.         jnz     .03
  1386.         mov     al,10h
  1387. .03:    call    PrintC
  1388.         inc     [XPos]
  1389. .04:    mov     ecx,[CurWidth]
  1390.         sub     ecx,5+5
  1391.         shl     ecx,8
  1392.         mov     cl,8
  1393. .2:     lea     rsi,[rdi+rbp]
  1394.         mov     al,3            ;ds
  1395.         call    GetDataByte
  1396.         jc      .3
  1397.         lea     edx,[Msg2ER]
  1398.         call    PrintS
  1399.         mov     al,'?'
  1400.         jmp     .5
  1401. .3:     call    PrintAL
  1402.         test    al,al
  1403.         jz      .4
  1404.         cmp     al,08h
  1405.         jz      .4
  1406.         cmp     al,09h
  1407.         jz      .4
  1408.         cmp     al,0Ah
  1409.         jz      .4
  1410.         cmp     al,0Dh
  1411.         jnz     .5
  1412. .4:     mov     al,'.'
  1413. .5:     xchg    [XPos],ch
  1414.         call    PrintC
  1415.         xchg    [XPos],ch
  1416.         inc     [XPos]
  1417.         inc     rbp
  1418.         dec     cl
  1419.         jnz     .2
  1420.         inc     [YPos]
  1421.         dec     bl
  1422.         jnz     .1
  1423.         ret
  1424. ;-----------------------------------------------------------------------------
  1425. ShowDataRDX:
  1426. .1:     mov     eax,[CurWidth]
  1427.         sub     eax,29+16
  1428.         mov     [XPos],al
  1429.         mov     rax,rbp
  1430.         test    rbp,rbp
  1431.         lea     edx,[Msg2DXP]
  1432.         jns     .01
  1433.         lea     edx,[Msg2DXM]
  1434.         neg     rax
  1435. .01:    call    PrintS
  1436.         call    PrintAL
  1437.         mov     al,']'
  1438.         call    PrintC
  1439.         mov     al,32
  1440.         test    rbp,rbp
  1441.         jnz     .03
  1442.         mov     al,10h
  1443. .03:    call    PrintC
  1444.         inc     [XPos]
  1445. .04:    mov     ecx,[CurWidth]
  1446.         sub     ecx,5+5
  1447.         shl     ecx,8
  1448.         mov     cl,8
  1449. .2:     lea     rsi,[rdi+rbp]
  1450.         mov     al,3            ;ds
  1451.         call    GetDataByte
  1452.         jc      .3
  1453.         lea     edx,[Msg2ER]
  1454.         call    PrintS
  1455.         mov     al,'?'
  1456.         jmp     .5
  1457. .3:     call    PrintAL
  1458.         test    al,al
  1459.         jz      .4
  1460.         cmp     al,08h
  1461.         jz      .4
  1462.         cmp     al,09h
  1463.         jz      .4
  1464.         cmp     al,0Ah
  1465.         jz      .4
  1466.         cmp     al,0Dh
  1467.         jnz     .5
  1468. .4:     mov     al,'.'
  1469. .5:     xchg    [XPos],ch
  1470.         call    PrintC
  1471.         xchg    [XPos],ch
  1472.         inc     [XPos]
  1473.         inc     rbp
  1474.         dec     cl
  1475.         jnz     .2
  1476.         inc     [YPos]
  1477.         dec     bl
  1478.         jnz     .1
  1479.         ret
  1480. ;-----------------------------------------------------------------------------
  1481. ShowDataRBP:
  1482. .1:     mov     eax,[CurWidth]
  1483.         sub     eax,29+16
  1484.         mov     [XPos],al
  1485.         mov     rax,rbp
  1486.         test    rbp,rbp
  1487.         lea     edx,[Msg2BPP]
  1488.         jns     .01
  1489.         lea     edx,[Msg2BPM]
  1490.         neg     rax
  1491. .01:    call    PrintS
  1492.         call    PrintAL
  1493.         mov     al,']'
  1494.         call    PrintC
  1495.         mov     al,32
  1496.         test    rbp,rbp
  1497.         jnz     .03
  1498.         mov     al,10h
  1499. .03:    call    PrintC
  1500.         inc     [XPos]
  1501. .04:    mov     ecx,[CurWidth]
  1502.         sub     ecx,5+5
  1503.         shl     ecx,8
  1504.         mov     cl,8
  1505. .2:     lea     rsi,[rdi+rbp]
  1506.         mov     al,2            ;ss
  1507.         call    GetDataByte
  1508.         jc      .3
  1509.         lea     edx,[Msg2ER]
  1510.         call    PrintS
  1511.         mov     al,'?'
  1512.         jmp     .5
  1513. .3:     call    PrintAL
  1514.         test    al,al
  1515.         jz      .4
  1516.         cmp     al,08h
  1517.         jz      .4
  1518.         cmp     al,09h
  1519.         jz      .4
  1520.         cmp     al,0Ah
  1521.         jz      .4
  1522.         cmp     al,0Dh
  1523.         jnz     .5
  1524. .4:     mov     al,'.'
  1525. .5:     xchg    [XPos],ch
  1526.         call    PrintC
  1527.         xchg    [XPos],ch
  1528.         inc     [XPos]
  1529.         inc     rbp
  1530.         dec     cl
  1531.         jnz     .2
  1532.         inc     [YPos]
  1533.         dec     bl
  1534.         jnz     .1
  1535.         ret
  1536. ;-----------------------------------------------------------------------------
  1537. GetSeg: mov     edx,TDS
  1538.         cmp     [Inst.DefSeg],VSS
  1539. ifz     mov     edx,TSS
  1540.         mov     al,[Inst.CurSeg]
  1541.         or      al,al
  1542.         jz      .SkipSegm
  1543.         cmp     al,[Inst.DefSeg]
  1544.         jz      .SkipSegm
  1545.         mov     dx,[Inst.SegmName]
  1546. .SkipSegm:
  1547.         mov     dx,[rdx+Names]
  1548.         ret
  1549. ;-----------------------------------------------------------------------------
  1550. GetSegm:mov     dx,TDS
  1551.         cmp     [Inst.DefSeg],VSS
  1552. ifz     mov     dx,TSS
  1553.         mov     al,[Inst.CurSeg]
  1554.         or      al,al
  1555.         jz      @F
  1556.         cmp     al,[Inst.DefSeg]
  1557.         jz      @F
  1558.         mov     dx,[Inst.SegmName]
  1559.       @@:
  1560.         mov     al,0
  1561.         cmp     dx,TES
  1562.         jz      @F
  1563.         mov     al,1
  1564.         cmp     dx,TCS
  1565.         jz      @F
  1566.         mov     al,2
  1567.         cmp     dx,TSS
  1568.         jz      @F
  1569.         mov     al,3
  1570.         cmp     dx,TDS
  1571.         jz      @F
  1572.         mov     al,4
  1573.         cmp     dx,TFS
  1574.         jz      @F
  1575.         mov     al,5
  1576.       @@:
  1577.         ret
  1578. ;-----------------------------------------------------------------------------
  1579. GetMemAddress:
  1580.         ;
  1581.         xor     ebx,ebx
  1582.         mov     ecx,1
  1583.         ;
  1584.         movzx   eax,[Inst.Scale]
  1585.         cmp     al,-1
  1586.         jz      @F
  1587.         mov     cl,[eax+AnScale]
  1588.       @@:
  1589.         movzx   eax,[Inst.Base]
  1590.         cmp     al,-1
  1591.         jz      @F
  1592.         mov     eax,[rax*4+RegVTab]
  1593.         mov     rax,[rax]
  1594.         call    Address2Reg
  1595.         add     rbx,rax
  1596.       @@:
  1597.         movzx   eax,[Inst.Indx]
  1598.         cmp     al,-1
  1599.         jz      @F
  1600.         mov     eax,[rax*4+RegVTab]
  1601.         mov     rax,[rax]
  1602.         call    Address2Reg
  1603.         mul     rcx
  1604.         add     rbx,rax
  1605.       @@:
  1606.         cmp     [Inst.DispSize],0
  1607.         jz      @F
  1608.         mov     rax,[Inst.Disp]
  1609.         call    Address2Reg
  1610.         add     rbx,rax
  1611.       @@:
  1612.         mov     rax,rbx
  1613.         call    Address2Reg
  1614.         mov     rbx,rax
  1615.         ret
  1616. ;-----------------------------------------------------------------------------
  1617. ShowAddress:
  1618.         ;
  1619.         mov     [Color],3Fh
  1620.         mov     [XPos],15
  1621.         mov     [YPos],ch
  1622.         mov     al,0xCD
  1623.         mov     ecx,[CurWidth]
  1624.         sub     ecx,21+16+1
  1625. .LoopX: call    PrintC
  1626.         loop    .LoopX
  1627.         ;
  1628.         mov     al,[Inst.Arg1.Mem]
  1629.         or      al,[Inst.Arg2.Mem]
  1630.         or      al,[Inst.Arg3.Mem]
  1631.         or      al,[Inst.Arg4.Mem]
  1632.         or      al,[Inst.Arg5.Mem]
  1633. ifz     ret
  1634.         ;
  1635.         call    GetSeg
  1636.         mov     [AddressStr],dx
  1637.         ;
  1638.         call    GetMemAddress
  1639. if %B=64
  1640.         rol     rax,32
  1641.         mov     edi,AddressStr+3
  1642.         call    MakeHex
  1643.         rol     rax,32
  1644.         mov     edi,AddressStr+3+8
  1645.         call    MakeHex
  1646. else
  1647.         mov     edi,AddressStr+3
  1648.         call    MakeHex
  1649. end if
  1650.         mov     edi,AddressFin
  1651.  
  1652.         movzx   edx,[Inst.RandSize]
  1653.         and     dl,7Fh
  1654.         movzx   ebp,[rdx*2+RndSize+0]
  1655.         movzx   ecx,[rdx*2+RndSize+1]
  1656.         jrcxz   .Exit
  1657.         lea     rsi,[rbx+rcx]
  1658.         ;
  1659.         cmp     edx,3
  1660.         jnz     @F
  1661.         cmp     [Inst.Point],0
  1662.         jz      @F
  1663.         mov     bp,2+1
  1664.         mov     cx,2+2
  1665.       @@:
  1666.         ;
  1667.       .Loop:
  1668.         dec     rsi
  1669.         sub     ebp,1
  1670.         jnz     @F
  1671.         mov     [rdi],byte ':'
  1672.         inc     edi
  1673.       @@:
  1674.         mov     [rdi],word '--'
  1675.         call    GetSegm
  1676.         call    GetDataByte
  1677.         jnc     @F
  1678.         movzx   eax,al
  1679.         mov     ax,[rax*2+HexString]
  1680.         mov     [rdi],ax
  1681.       @@:
  1682.         add     edi,2
  1683.         loop    .Loop
  1684.       .Exit:
  1685.         mov     [rdi],word 'h'
  1686.  
  1687.         sub     edi,AddressStr
  1688.         mov     eax,[CurWidth]
  1689.         sub     eax,24
  1690.         sub     eax,edi
  1691. ifc     ret
  1692.         mov     [XPos],al
  1693.         mov     [YPos],0
  1694.         mov     [Color],3Fh
  1695.         mov     edx,AddressStr
  1696.         jmp     PrintS
  1697. ;-----------------------------------------------------------------------------
  1698. Address2Reg:
  1699.         cmp     [Inst.Address],2
  1700.         jz      @F
  1701.         cmp     [Inst.Address],1
  1702.         mov     eax,eax
  1703.         jz      @F
  1704.         movzx   eax,ax
  1705.       @@:
  1706.         ret
  1707. ;-----------------------------------------------------------------------------
  1708. sglobal
  1709. if %B=32
  1710. AddressStr:     db '??:xxxxxxxx = '
  1711. AddressFin:     db 64*2+2 dup 0
  1712. else
  1713. AddressStr:     db '??:xxxxxxxxxxxxxxxx = '
  1714. AddressFin      db 64*2+2 dup 0
  1715. end if
  1716. endg
  1717. ;-----------------------------------------------------------------------------
  1718. iglobal
  1719. RndSize db 0,0  ;NULL
  1720.         db 0,1  ;TWORD
  1721.         db 0,2  ;SWORD
  1722.         db 0,4  ;DWORD
  1723.         db 0,8  ;QWORD
  1724.         db 0,16 ;XWORD
  1725.         db 0,32 ;YWORD
  1726.         db 0,52 ;ZWORD -> 64 too large
  1727.         db 2+1,4+2;FWORD
  1728.         db 2+1,8+2;TWORD
  1729. AnScale db 1,2,4,8
  1730. endg
  1731. ;-----------------------------------------------------------------------------
  1732. ClearWindow:
  1733.         mov     ebp,[CurWidth]
  1734.         mov     eax,edi
  1735.         imul    eax,ebp
  1736.         add     eax,eax
  1737.         lea     edi,[rax+rsi*2]
  1738.         add     edi,ConsoleDataPtr
  1739.         mov     eax,edx
  1740.         lea     edx,[rcx*2]
  1741. .Loop:  push    rcx
  1742.         shr     ecx,1
  1743.         rep     stosd
  1744.         adc     cl,cl
  1745.         rep     stosw
  1746.         pop     rcx
  1747.         sub     esi,edx
  1748.         sub     edi,edx
  1749.         lea     esi,[rsi+rbp*2]
  1750.         lea     edi,[rdi+rbp*2]
  1751.         dec     ebx
  1752.         jnz     .Loop
  1753.         ret
  1754. ;-----------------------------------------------------------------------------
  1755. ShowStack32:
  1756.         mov     [YPos],28
  1757.         mov     [Color],30h
  1758.         mov     cl,28
  1759.         mov     edi,[_ESP]
  1760.         add     rdi,[StckAddr]
  1761. .1:     mov     rax,rdi
  1762.         sub     rax,[_ESP]
  1763.         mov     edx,Msg3SPP
  1764.         jns     .2
  1765.         neg     rax
  1766.         mov     edx,Msg3SPM
  1767. .2:     mov     ebx,[CurWidth]
  1768.         sub     ebx,21
  1769.         mov     [XPos],bl
  1770.         call    PrintS
  1771.         call    PrintAX
  1772.         mov     al,']'
  1773.         call    PrintC
  1774. .20:
  1775.         cmp     edi,[_ESP]
  1776.         mov     al,10h
  1777.         jz      .3
  1778.         cmp     edi,[_EBP]
  1779.         mov     al,'>'
  1780.         jz      .3
  1781.         mov     al,20h
  1782. .3:     call    PrintC
  1783.         lea     rsi,[rdi+3]
  1784. rept 3
  1785. {
  1786.         call    GetDataByte
  1787.         dec     rsi
  1788.         shl     rax,8
  1789. }
  1790.         call    GetDataByte
  1791.         add     rdi,4
  1792.         call    PrintEAX
  1793.        ;lea     edx,[Spaces32+6]
  1794.        ;call    PrintS
  1795.         dec     [YPos]
  1796.         dec     cl
  1797.         jnz     .1
  1798.         cmp     [CurrentWindow],3
  1799.         jz      ShowAddrStk
  1800.         ret
  1801. ShowAddrStk:
  1802.         mov     eax,[CurWidth]
  1803.         sub     eax,51-23-9
  1804.         mov     [XPos],al
  1805.         mov     [YPos],60-2-9+10
  1806.         mov     [Color],3Fh
  1807.         mov     rax,[StckAddr]
  1808.         add     eax,[_ESP]
  1809.         call    PrintEAX
  1810.         add     [XPos],3
  1811.         mov     rsi,rax
  1812.         call    GetDataByte
  1813.         jc      PrintAL
  1814.         lea     edx,[Msg2ER]
  1815.         jmp     PrintS
  1816. ;-----------------------------------------------------------------------------
  1817. FindCodeUp:
  1818.         mov     rax,[AddrBuffer]
  1819.         sub     rax,16                  ; average opcode length
  1820. .1:     inc     rax
  1821.         mov     rbx,rax
  1822.         mov     rsi,rax
  1823. .2:     mov     rsi,rbx
  1824.         mov     rdx,rbx
  1825.         call    Decode
  1826.         cmp     rbx,rsi
  1827.         ja      .Done
  1828.         mov     rbx,rsi
  1829.         sub     rsi,[AddrBuffer]
  1830.         jb      .2
  1831. .Done:  mov     rax,rdx
  1832.         ret
  1833. ;-----------------------------------------------------------------------------
  1834. CPUWindow:
  1835.         cmp     ah,0x0F
  1836.         jz      WindowSwitch
  1837.         cmp     ah,0x3B                 ; F1 - Toggle Show
  1838.         jz      ToggleShow
  1839.         cmp     ah,0x3C                 ; F2 - Toggle BP
  1840.         jz      ToggleBP
  1841.         cmp     ah,0x3D                 ; F3 - Return To
  1842.         jz      ReturnTo
  1843.         cmp     ah,0x3E                 ; F4 - Here
  1844.         jz      ComeHere
  1845.         cmp     ah,0x40                 ; F6 - New EIP
  1846.         jz      NewAddress
  1847.         cmp     ah,0x41                 ; F7 - Trace
  1848.         jz      F7
  1849.         cmp     ah,0x42                 ; F8 - Step over
  1850.         jz      F8
  1851.         cmp     ah,0x43                 ; F9 - Proceed
  1852.         jz      Proceed
  1853.         cmp     ah,0x44                 ; F10 - Jump over
  1854.         jz      JumpOver
  1855.         cmp     al,0xB1
  1856.         jz      CPUDn
  1857.         cmp     al,0xB2
  1858.         jz      CPUUp
  1859.         cmp     al,0xB4
  1860.         jz      CPUHome
  1861.         cmp     al,0xB7
  1862.         jz      CPUPgDn
  1863.         cmp     al,0xB8
  1864.         jz      CPUPgUp
  1865.         cmp     ah,0x4B
  1866.         jz      CPULeft
  1867.         cmp     ah,0x4D
  1868.         jz      CPURight
  1869.         cmp     ah,0xE
  1870.         jz      CPUGoToMem
  1871. ;
  1872.         cmp     al,'a'
  1873.         jb      .Skip1
  1874.         cmp     al,'z'
  1875.         jbe     DoCommandLine
  1876.       .Skip1:
  1877.         ;
  1878.         cmp     al,'A'
  1879.         jb      .Skip2
  1880.         cmp     al,'Z'
  1881.         jbe     DoCommandLine
  1882.       .Skip2:
  1883. ;
  1884.         jmp     WaitEvent
  1885. RegWindow:
  1886.         cmp     ah,0x0F
  1887.         jz      WindowSwitch
  1888.         cmp     ah,0x01
  1889.         jz      SwitchCPU
  1890.         cmp     ah,0x3B                 ; F1 - Toggle Show
  1891.         jz      ToggleShow
  1892. ;
  1893.         cmp     al,0xB1                 ; dn
  1894.         jz      RegDn
  1895.         cmp     al,0xB2                 ; up
  1896.         jz      RegUp
  1897.         cmp     al,0xB4                 ; home
  1898.         jz      RegHome
  1899.         cmp     al,0xB5                 ; end
  1900.         jz      RegEnd
  1901.         cmp     ah,0x4B                 ; left
  1902.         jz      RegLeft
  1903.         cmp     ah,0x4D                 ; right
  1904.         jz      RegRight
  1905.         cmp     al,'+'                  ; '+'
  1906.         jz      RegIncR
  1907.         cmp     al,'-'                  ; '-'
  1908.         jz      RegDecR
  1909.         cmp     al,'*'                  ; '*'
  1910.         jz      RegNot
  1911.         cmp     al,'/'                  ; '/'
  1912.         jz      RegRes
  1913.         cmp     ah,0xE                  ; BackSpace - GoTo MemAddr
  1914.         jz      RegGoToMem
  1915.         cmp     ah,0x39                 ; Space
  1916.         jz      RegXor
  1917. ;
  1918.         cmp     al,'a'
  1919.         jb      .Skip1
  1920.         cmp     al,'z'
  1921.         jbe     DoCommandLine
  1922.       .Skip1:
  1923.         ;
  1924.         cmp     al,'A'
  1925.         jb      .Skip2
  1926.         cmp     al,'Z'
  1927.         jbe     DoCommandLine
  1928.       .Skip2:
  1929. ;
  1930.         jmp     WaitEvent
  1931. MemWindow:
  1932.         cmp     ah,0x0F
  1933.         jz      WindowSwitch
  1934.         cmp     ah,0x01
  1935.         jz      SwitchCPU
  1936.         cmp     ah,0x3B                 ; F1 - Toggle Show
  1937.         jz      ToggleShow
  1938. ;
  1939.         cmp     al,0xB1                 ; down
  1940.         jz      MemDn
  1941.         cmp     al,0xB2                 ; up
  1942.         jz      MemUp
  1943.         cmp     ah,0x4B                 ; left
  1944.         jz      MemLeft
  1945.         cmp     ah,0x4D                 ; right
  1946.         jz      MemRight
  1947.         cmp     al,0xB4                 ; home
  1948.         jz      MemHome
  1949.         cmp     al,0xB7                 ; page-dn
  1950.         jz      MemPageDn
  1951.         cmp     al,0xB8                 ; page-up
  1952.         jz      MemPageUp
  1953. ;
  1954.         cmp     al,'+'
  1955.         jz      MemIncB
  1956.         cmp     al,'-'
  1957.         jz      MemDecB
  1958.         cmp     al,'*'
  1959.         jz      MemNotB
  1960.         cmp     al,'/'
  1961.         jz      MemResB
  1962. ;
  1963.         cmp     al,'a'
  1964.         jb      .Skip1
  1965.         cmp     al,'z'
  1966.         jbe     DoCommandLine
  1967.       .Skip1:
  1968.         ;
  1969.         cmp     al,'A'
  1970.         jb      .Skip2
  1971.         cmp     al,'Z'
  1972.         jbe     DoCommandLine
  1973.       .Skip2:
  1974. ;
  1975.         jmp     WaitEvent
  1976. StkWindow:
  1977.         cmp     ah,0x0F
  1978.         jz      WindowSwitch
  1979.         cmp     ah,0x01
  1980.         jz      SwitchCPU
  1981.         cmp     ah,0x3B                 ; F1 - Toggle Show
  1982.         jz      ToggleShow
  1983.         ;
  1984.         cmp     al,0xB1                 ; dn
  1985.         jz      StkDn
  1986.         cmp     al,0xB2                 ; up
  1987.         jz      StkUp
  1988.         cmp     al,0xB4                 ; home
  1989.         jz      StkHome
  1990.         cmp     al,0xB7                 ; page-dn
  1991.         jz      StkPgDn
  1992.         cmp     al,0xB8                 ; page-up
  1993.         jz      StkPgUp
  1994.         cmp     al,'+'                  ; '+'
  1995.         jz      StkIncV
  1996.         cmp     al,'-'                  ; '-'
  1997.         jz      StkDecV
  1998.         cmp     al,'*'                  ; '*'
  1999.         jz      StkNotV
  2000.         cmp     al,'/'                  ; '/'
  2001.         jz      StkResV
  2002.         cmp     al,0xE                  ; BackSpace - GoTo MemAddr
  2003.         jz      StkGoToMem
  2004. ;
  2005.         cmp     al,'a'
  2006.         jb      .Skip1
  2007.         cmp     al,'z'
  2008.         jbe     DoCommandLine
  2009.       .Skip1:
  2010.         ;
  2011.         cmp     al,'A'
  2012.         jb      .Skip2
  2013.         cmp     al,'Z'
  2014.         jbe     DoCommandLine
  2015.       .Skip2:
  2016. ;
  2017.         jmp     WaitEvent
  2018. ;-----------------------------------------------------------------------------
  2019. DoCommandLine:
  2020.         mov     [CmdLineActive],1
  2021.         jmp     GetCommandLine
  2022. ;-----------------------------------------------------------------------------
  2023. Proceed:call    GoOn
  2024.         jmp     WaitEvent
  2025. ;-----------------------------------------------------------------------------
  2026. SwitchCPU:
  2027.         and     [CurrentWindow],0
  2028.         jmp     WinSwitch
  2029. ;-----------------------------------------------------------------------------
  2030. ToggleShow:
  2031.         xor     [ShowNames],-1
  2032.         jmp     CPUCommon
  2033. ;-----------------------------------------------------------------------------
  2034. StkUp:  mov     eax,2
  2035.         cmp     [CodeType],16
  2036.         je      .1
  2037.         mov     eax,4
  2038.         cmp     [CodeType],32
  2039.         je      .1
  2040.         mov     eax,8
  2041.       .1:
  2042.         add     [StckAddr],rax
  2043.         jmp     StkCommon
  2044. ;-----------------------------------------------------------------------------
  2045. StkDn:  mov     eax,2
  2046.         cmp     [CodeType],16
  2047.         je      .1
  2048.         mov     eax,4
  2049.         cmp     [CodeType],32
  2050.         je      .1
  2051.         mov     eax,8
  2052.       .1:
  2053.         sub     [StckAddr],rax
  2054.         jmp     StkCommon
  2055. ;-----------------------------------------------------------------------------
  2056. StkPgUp:mov     eax,2*4
  2057.         cmp     [CodeType],16
  2058.         je      .1
  2059.         mov     eax,4*4
  2060.         cmp     [CodeType],32
  2061.         je      .1
  2062.         mov     eax,8*4
  2063.       .1:
  2064.         add     [StckAddr],rax
  2065.         jmp     StkCommon
  2066. ;-----------------------------------------------------------------------------
  2067. StkPgDn:mov     eax,2*4
  2068.         cmp     [CodeType],16
  2069.         je      .1
  2070.         mov     eax,4*4
  2071.         cmp     [CodeType],32
  2072.         je      .1
  2073.         mov     eax,8*4
  2074.       .1:
  2075.         sub     [StckAddr],rax
  2076.         jmp     StkCommon
  2077. ;-----------------------------------------------------------------------------
  2078. StkHome:
  2079.         and     [StckAddr],0
  2080. StkCommon:
  2081.         jmp     CPUCommon
  2082. ;-----------------------------------------------------------------------------
  2083. StkGetAddress:
  2084.         mov     rax,[StckAddr]
  2085.         add     eax,[_ESP]
  2086.         ret
  2087. ;-----------------------------------------------------------------------------
  2088. StkIncV:call    StkGetAddress
  2089.         mov     rsi,rax
  2090.         mov     rdi,rax
  2091.         call    SafeLoadDD
  2092.         inc     rax
  2093.         call    SafeStoreDD
  2094.         jmp     StkCommon
  2095. ;-----------------------------------------------------------------------------
  2096. StkDecV:call    StkGetAddress
  2097.         mov     rsi,rax
  2098.         mov     rdi,rax
  2099.         call    SafeLoadDD
  2100.         dec     rax
  2101.         call    SafeStoreDD
  2102.         jmp     StkCommon
  2103. ;-----------------------------------------------------------------------------
  2104. StkNotV:call    StkGetAddress
  2105.         mov     rsi,rax
  2106.         mov     rdi,rax
  2107.         call    SafeLoadDD
  2108.         not     rax
  2109.         call    SafeStoreDD
  2110.         jmp     StkCommon
  2111. ;-----------------------------------------------------------------------------
  2112. StkResV:call    StkGetAddress
  2113.         mov     rdi,rax
  2114.         xor     eax,eax
  2115.         call    SafeStoreDD
  2116.         jmp     StkCommon
  2117. ;-----------------------------------------------------------------------------
  2118. StkGoToMem:
  2119.         call    StkGetAddress
  2120.         mov     [DataAddr],rax
  2121.         jmp     StkCommon
  2122. ;-----------------------------------------------------------------------------
  2123. RegUp:  mov     ebp,[RegXPtr]
  2124.         dec     ebp
  2125.         jns     RegCommon
  2126.         jmp     WaitEvent
  2127. ;-----------------------------------------------------------------------------
  2128. RegDn:  mov     ebp,[RegXPtr]
  2129.         inc     ebp
  2130.         cmp     ebp,17
  2131.         jb      RegCommon
  2132.         jmp     WaitEvent
  2133. ;-----------------------------------------------------------------------------
  2134. RegLeft:
  2135.         mov     ebp,[RegXPtr]
  2136.         sub     ebp,8
  2137.         jns     RegCommon
  2138.         xor     ebp,ebp
  2139.         jmp     RegCommon
  2140. ;-----------------------------------------------------------------------------
  2141. RegRight:
  2142.         mov     ebp,[RegXPtr]
  2143.         add     ebp,8
  2144.         cmp     ebp,17
  2145.         jb      RegCommon
  2146.         jmp     WaitEvent
  2147. ;-----------------------------------------------------------------------------
  2148. RegHome:xor     ebp,ebp
  2149.         jmp     RegCommon
  2150. ;-----------------------------------------------------------------------------
  2151. RegEnd: mov     ebp,16
  2152.         jmp     RegCommon
  2153. ;-----------------------------------------------------------------------------
  2154. RegXor: mov     ebp,[RegXPtr]
  2155.         cmp     ebp,17-8
  2156.         jae     RegIncR.0
  2157.         jmp     WaitEvent
  2158. ;-----------------------------------------------------------------------------
  2159. RegIncR:mov     ebp,[RegXPtr]
  2160.         cmp     ebp,17-8
  2161.         jb      .1
  2162. .0:     mov     eax,[RegRTab+rbp*4]
  2163.         xor     [_EFL],eax
  2164.         jmp     RegCommon
  2165. .1:     mov     eax,[RegRTab+rbp*4]
  2166.         inc     dword [rax]
  2167.         jmp     RegCommon
  2168. ;-----------------------------------------------------------------------------
  2169. RegDecR:mov     ebp,[RegXPtr]
  2170.         cmp     ebp,17-8
  2171.         jb      .1
  2172.         mov     eax,[RegRTab+rbp*4]
  2173.         xor     [_EFL],eax
  2174.         jmp     RegCommon
  2175. .1:     mov     eax,[RegRTab+rbp*4]
  2176.         dec     dword [rax]
  2177.         jmp     RegCommon
  2178. ;-----------------------------------------------------------------------------
  2179. RegRes: mov     ebp,[RegXPtr]
  2180.         cmp     ebp,17-8
  2181.         jb      .1
  2182.         mov     eax,[RegRTab+rbp*4]
  2183.         not     eax
  2184.         and     [_EFL],eax
  2185.         jmp     RegCommon
  2186. .1:     mov     eax,[RegRTab+rbp*4]
  2187.         and     dword [rax],0
  2188.         jmp     RegCommon
  2189. ;-----------------------------------------------------------------------------
  2190. RegNot: mov     ebp,[RegXPtr]
  2191.         cmp     ebp,17-8
  2192.         jb      .1
  2193.         mov     eax,[RegRTab+rbp*4]
  2194.         xor     [_EFL],eax
  2195.         jmp     RegCommon
  2196. .1:     mov     eax,[RegRTab+rbp*4]
  2197.         not     dword [rax]
  2198.        ;jmp     RegCommon
  2199. RegCommon:
  2200.         mov     [RegXPtr],ebp
  2201.         mov     eax,RegXTab
  2202.         movzx   eax,byte [rax+rbp]
  2203.         mov     [RegXPos],eax
  2204.         mov     eax,RegYTab
  2205.         movzx   eax,byte [rax+rbp]
  2206.         mov     [RegYPos],eax
  2207.         mov     eax,RegLTab
  2208.         movzx   eax,byte [rax+rbp]
  2209.         mov     [RegLDat],eax
  2210.         call    SetContext
  2211.         jmp     CPUCommon
  2212. ;-----------------------------------------------------------------------------
  2213. RegGoToMem:
  2214.         mov     ebp,[RegXPtr]
  2215.         cmp     ebp,9
  2216.         jae     GoToMemRAX.Next
  2217.         mov     eax,[RegRTab+rbp*4]
  2218.         mov     rax,[rax]
  2219. GoToMemRAX:
  2220.         mov     [DataAddr],rax
  2221. .Next:  jmp     CPUCommon
  2222. ;-----------------------------------------------------------------------------
  2223. MemUp:  dec     [MemYPos]
  2224.         cmp     [MemYPos],40
  2225.         ja      MemCommon
  2226.         inc     [MemYPos]
  2227.         sub     [DataAddr],8
  2228.         jmp     MemCommon
  2229. ;-----------------------------------------------------------------------------
  2230. MemDn:  inc     [MemYPos]
  2231.         cmp     [MemYPos],49
  2232.         jb      MemCommon
  2233.         dec     [MemYPos]
  2234.         add     [DataAddr],8
  2235.         jmp     MemCommon
  2236. ;-----------------------------------------------------------------------------
  2237. MemPageUp:
  2238.         sub     [DataAddr],8*8
  2239.         jmp     MemCommon
  2240. ;-----------------------------------------------------------------------------
  2241. MemPageDn:
  2242.         add     [DataAddr],8*8
  2243.         jmp     MemCommon
  2244. ;-----------------------------------------------------------------------------
  2245. MemLeft:sub     [MemXPos],3
  2246.         cmp     [MemXPos],11-3
  2247.         ja      MemCommon
  2248.         add     [MemXPos],3*8
  2249.         jmp     MemUp
  2250. ;-----------------------------------------------------------------------------
  2251. MemRight:
  2252.         add     [MemXPos],3
  2253.         cmp     [MemXPos],11-1+3*8
  2254.         jb      MemCommon
  2255.         sub     [MemXPos],3*8
  2256.         jmp     MemDn
  2257. ;-----------------------------------------------------------------------------
  2258. MemHome:and     [DataAddr],0
  2259.         mov     [MemXPos],11
  2260. MemCommon:
  2261.         jmp     CPUCommon
  2262. ;-----------------------------------------------------------------------------
  2263. MemGetAddress:
  2264.         xor     edx,edx
  2265.         mov     ebx,3
  2266.         mov     eax,[MemXPos]
  2267.         sub     al,11
  2268.         div     ebx
  2269.         add     rax,[DataAddr]
  2270.         mov     ecx,[MemYPos]
  2271.         sub     cl,41
  2272.         add     ecx,ecx
  2273.         lea     rax,[rax+rcx*8]
  2274.         ret
  2275. ;-----------------------------------------------------------------------------
  2276. MemIncB:call    MemGetAddress
  2277.         mov     rsi,rax
  2278.         mov     rdi,rax
  2279.         call    GetDataByte
  2280.         inc     al
  2281.         call    SafeStore
  2282.         jmp     MemCommon
  2283. ;-----------------------------------------------------------------------------
  2284. MemDecB:call    MemGetAddress
  2285.         mov     rsi,rax
  2286.         mov     rdi,rax
  2287.         call    GetDataByte
  2288.         dec     al
  2289.         call    SafeStore
  2290.         jmp     MemCommon
  2291. ;-----------------------------------------------------------------------------
  2292. MemNotB:call    MemGetAddress
  2293.         mov     rsi,rax
  2294.         mov     rdi,rax
  2295.         call    GetDataByte
  2296.         not     al
  2297.         call    SafeStore
  2298.         jmp     MemCommon
  2299. ;-----------------------------------------------------------------------------
  2300. MemResB:call    MemGetAddress
  2301.         mov     rdi,rax
  2302.         mov     al,0
  2303.         call    SafeStore
  2304.         jmp     MemCommon
  2305. ;-----------------------------------------------------------------------------
  2306. ToggleBP:
  2307.         mov     eax,[CPUYPos]
  2308.         mov     rax,[AddrBuffer+(rax-1)*sizeof.dq]
  2309.         push    rax
  2310.         call    FindBreakPoint
  2311.         mov     edx,eax
  2312.         inc     eax
  2313.         pop     rax
  2314.         jz      .NotFound
  2315.         mov     eax,edx
  2316.         call    ClearBreakPoint
  2317.         jmp     .Ret
  2318. .NotFound:
  2319.         mov     bl,1
  2320.         call    AddBreakPoint
  2321.         jnc     .Ret
  2322.         mov     esi,aBreakpointLimitExceeded
  2323.     .SayErr:
  2324.         call    PutMessage
  2325.     .Ret:
  2326.         jmp     CPUCommon
  2327. ;-----------------------------------------------------------------------------
  2328. ReturnTo:
  2329.         mov     ecx,1024                        ; try 1024 instructions
  2330.         mov     esi,[_EIP]
  2331. .0:     mov     ebp,esi
  2332.         call    Decode
  2333.         mov     eax,[BufferO+35+SkipAddr]
  2334.         mov     ebx,'iret'
  2335.         cmp     eax,ebx                         ; check for IRET
  2336.         jz      .1
  2337.         and     eax,00FFFFFFh
  2338.         mov     ebx,00746572h                   ;' ter'
  2339.         cmp     eax,ebx                         ; check for RET
  2340.         jz      .1
  2341.         mov     ebx,00706D6Ah                   ;' pmj'
  2342.         cmp     eax,ebx                         ; check for JMP
  2343.         jz      .1
  2344.         loop    .0
  2345.         jmp     WaitEvent
  2346. .1:     call    OnResume.Jmp
  2347.         jmp     WaitEvent
  2348. ;-----------------------------------------------------------------------------
  2349. JumpOver:
  2350.         mov     esi,[_EIP]
  2351.         call    Decode
  2352.         mov     eax,[BufferO+35+SkipAddr]
  2353.         cmp     eax,'call'              ; check for CALL
  2354.         jz      .DoIt
  2355.         cmp     eax,'loop'              ; check for LOOP..
  2356.         jz      .DoIt
  2357.         and     eax,00FFFFFFh
  2358.         mov     ebx,00746E69h           ;' tni'
  2359.         cmp     eax,ebx                 ; check for INT
  2360.         jz      .DoIt
  2361.         mov     ebx,00706572h           ;' per'
  2362.         cmp     eax,ebx                 ; check for REP
  2363.         jz      .DoIt
  2364.         mov     ebx,00706D6Ah           ;' pmj'
  2365.         cmp     eax,ebx                 ; check for JMP
  2366.         jz      .DoIt
  2367.         mov     ebx,006F6E6Ah           ;' onj'
  2368.         cmp     eax,ebx                 ; check for JNO
  2369.         jz      .DoIt
  2370.         mov     ebx,0065616Ah           ;' eaj'
  2371.         cmp     eax,ebx                 ; check for JAE
  2372.         jz      .DoIt
  2373.         mov     ebx,007A6E6Ah           ;' znj'
  2374.         cmp     eax,ebx                 ; check for JNZ
  2375.         jz      .DoIt
  2376.         mov     ebx,0065626Ah           ;' ebj'
  2377.         cmp     eax,ebx                 ; check for JBE
  2378.         jz      .DoIt
  2379.         mov     ebx,00736E6Ah           ;' snj'
  2380.         mov     ebx,00736E6Ah           ;' snj'
  2381.         cmp     eax,ebx                 ; check for JNS
  2382.         jz      .DoIt
  2383.         mov     ebx,0065706Ah           ;' epj'
  2384.         cmp     eax,ebx                 ; check for JPE
  2385.         jz      .DoIt
  2386.         mov     ebx,006F706Ah           ;' opj'
  2387.         cmp     eax,ebx                 ; check for JPO
  2388.         jz      .DoIt
  2389.         mov     ebx,0065676Ah           ;' egj'
  2390.         cmp     eax,ebx                 ; check for JGE
  2391.         jz      .DoIt
  2392.         mov     ebx,00656C6Ah           ;' elj'
  2393.         cmp     eax,ebx                 ; check for JLE
  2394.         jz      .DoIt
  2395.         and     eax,0000FFFFh
  2396.         mov     ebx,00006F6Ah           ;' oj'
  2397.         cmp     eax,ebx                 ; check for JO
  2398.         jz      .DoIt
  2399.         mov     ebx,0000626Ah           ;' bj'
  2400.         cmp     eax,ebx                 ; check for JB
  2401.         jz      .DoIt
  2402.         mov     ebx,00007A6Ah           ;' zj'
  2403.         cmp     eax,ebx                 ; check for JZ
  2404.         jz      .DoIt
  2405.         mov     ebx,0000616Ah           ;' aj'
  2406.         cmp     eax,ebx                 ; check for JA
  2407.         jz      .DoIt
  2408.         mov     ebx,0000736Ah           ;' sj'
  2409.         cmp     eax,ebx                 ; check for JS
  2410.         jz      .DoIt
  2411.         mov     ebx,00006C6Ah           ;' lj'
  2412.         cmp     eax,ebx                 ; check for JL
  2413.         jz      .DoIt
  2414.         mov     ebx,0000676Ah           ;' gj'
  2415.         cmp     eax,ebx                 ; check for JG
  2416.         jz      .DoIt
  2417.         jmp     F7
  2418. .DoIt:  mov     ebp,esi
  2419.         call    OnResume.Jmp
  2420.         jmp     WaitEvent
  2421. ;-----------------------------------------------------------------------------
  2422. ComeHere:
  2423.         mov     eax,[CPUYPos]
  2424.         mov     rax,[AddrBuffer+(rax-1)*sizeof.dq]
  2425.         push    eax
  2426.         call    FindEnabledBreakPoint
  2427.         pop     eax
  2428.         jz      .GoOn
  2429.         mov     bl,5    ; valid enabled one-shot
  2430.         call    AddBreakPoint
  2431.         jnc     .GoOn
  2432.         mov     esi,aBreakpointLimitExceeded
  2433.         call    PutMessage
  2434.         jmp     WaitEvent
  2435. .GoOn:  call    GoOn
  2436.         jmp     WaitEvent
  2437. ;-----------------------------------------------------------------------------
  2438. NewAddress:
  2439.         mov     eax,[CPUYPos]
  2440.         mov     rax,[AddrBuffer+(rax-1)*sizeof.dq]
  2441.         mov     [_EIP],eax
  2442.         call    SetContext
  2443.         jmp     CPUCommon
  2444. ;-----------------------------------------------------------------------------
  2445. CPUUp:  cmp     [CPUYPos],1
  2446.         jbe     .1
  2447.         dec     [CPUYPos]
  2448.         mov     ebx,[CPUYPos]
  2449.         mov     rsi,[AddrBuffer+(rbx-1)*sizeof.dq]
  2450.         call    Decode
  2451.         jmp     CPUCommon
  2452. .1:     call    FindCodeUp
  2453.         mov     [CodeAddr],rax
  2454.         jmp     CPUCommon
  2455. ;-----------------------------------------------------------------------------
  2456. CPUDn:  cmp     [CPUYPos],28
  2457.         jae     .1
  2458.         inc     [CPUYPos]
  2459.         mov     ebx,[CPUYPos]
  2460.         mov     rsi,[AddrBuffer+(rbx-1)*sizeof.dq]
  2461.         call    Decode
  2462.         jmp     CPUCommon
  2463. .1:     mov     rax,[AddrBuffer+sizeof.dq]
  2464.         mov     [CodeAddr],rax
  2465.         jmp     CPUCommon
  2466. ;-----------------------------------------------------------------------------
  2467. CPULeft:dec     [CodeAddr]
  2468.         jmp     CPUCommon
  2469. ;-----------------------------------------------------------------------------
  2470. CPURight:
  2471.         inc     [CodeAddr]
  2472.         jmp     CPUCommon
  2473. ;-----------------------------------------------------------------------------
  2474. CPUPgUp:mov     ecx,28
  2475. .1:     call    FindCodeUp
  2476.         mov     [AddrBuffer],rax
  2477.         loop    .1
  2478.         mov     [CodeAddr],rax
  2479.         jmp     CPUCommon
  2480. ;-----------------------------------------------------------------------------
  2481. CPUPgDn:mov     rsi,[AddrBuffer+27*sizeof.dq]
  2482.         call    Decode
  2483.         mov     [CodeAddr],rsi
  2484.         jmp     CPUCommon
  2485. ;-----------------------------------------------------------------------------
  2486. CPUHome:mov     eax,[_EIP]
  2487.         mov     [CodeAddr],rax
  2488.         mov     [CPUYPos],1
  2489. CPUCommon:
  2490.         mov     [AfterKey],1
  2491.         call    ShowImage
  2492.         jmp     WaitEvent
  2493. ;-----------------------------------------------------------------------------
  2494. SafeLoadDD:
  2495.         push    rcx rsi
  2496.         mov     ecx,4
  2497. .Loop:  call    GetDataByte
  2498.         ror     rax,8
  2499.         inc     rsi
  2500.         loop    .Loop
  2501.         pop     rsi rcx
  2502.         ret
  2503. ;-----------------------------------------------------------------------------
  2504. CPUGoToMem:
  2505.         mov     eax,[CPUYPos]
  2506.         mov     rsi,[(rax-1)*sizeof.dq+AddrBuffer]
  2507.         call    Decode
  2508.         mov     al,[Inst.Arg1.Mem]
  2509.         or      al,[Inst.Arg2.Mem]
  2510.         or      al,[Inst.Arg3.Mem]
  2511.         or      al,[Inst.Arg4.Mem]
  2512.         or      al,[Inst.Arg5.Mem]
  2513.         jnz     .Mem
  2514.         ;
  2515.         mov     rdx,[Inst.Arg1.Imm]
  2516.         cmp     [Inst.IsAddress],0      ;relative
  2517.         jnz     .Ofs
  2518.  
  2519.         cmp     [Inst.MemSeparator],0
  2520.         jz      .NoFar
  2521.         mov     ax,[Inst.Point]
  2522.         cmp     ax,TDWORD
  2523.         jz      .DW2
  2524.         cmp     ax,TFWORD
  2525.         jz      .FW2
  2526.       .NoFar:
  2527.         jmp     WaitEvent
  2528.       .DW2:
  2529.         sub     rsi,4
  2530.         call    SafeLoadDD
  2531.         movzx   edx,ax
  2532.         shr     eax,16
  2533.         jmp     .All
  2534.       .FW2:
  2535.         sub     rsi,6
  2536.         call    SafeLoadDD
  2537.         mov     edx,eax
  2538.         add     rsi,4
  2539.         call    SafeLoadDD
  2540.         movzx   eax,ax
  2541.         jmp     .All
  2542.         ;
  2543.       .Mem:
  2544.         ;
  2545.         cmp     [Inst.Point],0
  2546.         jz      .Ptr
  2547.         movzx   edx,[Inst.RandSize]
  2548.         and     dl,7Fh
  2549.         push    rdx
  2550.         call    GetLinAddr
  2551.         pop     rdx
  2552.         cmp     dl,3
  2553.         jz      .DW
  2554.         cmp     dl,8
  2555.         jz      .FW
  2556.         cmp     dl,9
  2557.         jz      .TW
  2558.         jmp     WaitEvent
  2559.       .DW:
  2560.         mov     rsi,rax
  2561.         call    SafeLoadDD
  2562.         movzx   edx,ax
  2563.         shr     eax,16
  2564.         jmp     .All
  2565.       .FW:
  2566.         mov     rsi,rax
  2567.         call    SafeLoadDD
  2568.         mov     edx,eax
  2569.         add     rsi,4
  2570.         call    SafeLoadDD
  2571.         movzx   eax,ax
  2572.         jmp     .All
  2573.       .TW:
  2574.         mov     rsi,rax
  2575.         call    SafeLoadDD
  2576.         mov     rdx,rax
  2577.         add     rsi,8
  2578.         call    SafeLoadDD
  2579.         movzx   eax,ax
  2580.       .All:
  2581.        ;verr    eax
  2582.        ;jnz     .Err
  2583.        ;mov     [Reg.CS],eax
  2584.        ;call    SelectorInit
  2585.       .Ofs:
  2586.         mov     [CodeAddr],rdx
  2587.         mov     [CPUYPos],1
  2588. if 0
  2589.         call    RepaintText
  2590.         jmp     ShowRegs
  2591. else
  2592.         jmp     CPUCommon
  2593. end if
  2594.       .Err:
  2595.         jmp     WaitEvent
  2596.       .Ptr:
  2597.         call    GetMemAddress
  2598.         jmp     GoToMemRAX
  2599. ;-----------------------------------------------------------------------------
  2600. GetLinAddr:
  2601.         call    GetSeg
  2602.         mov     [AddressStr],dx
  2603.         ;
  2604.         xor     ebx,ebx
  2605.         mov     ecx,1
  2606.         ;
  2607.         movzx   eax,[Inst.Scale]
  2608.         cmp     al,-1
  2609.         jz      @F
  2610.         mov     cl,[rax+AnScale]
  2611.       @@:
  2612.         movzx   eax,[Inst.Base]
  2613.         cmp     al,-1
  2614.         jz      @F
  2615.         mov     eax,[rax*4+RegVTab]
  2616.         mov     rax,[rax]
  2617.         call    Address2Reg
  2618.         add     rbx,rax
  2619.       @@:
  2620.         movzx   eax,[Inst.Indx]
  2621.         cmp     al,-1
  2622.         jz      @F
  2623.         mov     eax,[rax*4+RegVTab]
  2624.         mov     rax,[rax]
  2625.         call    Address2Reg
  2626.         mul     rcx
  2627.         add     rbx,rax
  2628.       @@:
  2629.         cmp     [Inst.DispSize],0
  2630.         jz      @F
  2631.         mov     rax,[Inst.Disp]
  2632.         call    Address2Reg
  2633.         add     rbx,rax
  2634.       @@:
  2635.         mov     rax,rbx
  2636.         call    Address2Reg
  2637.         mov     rbx,rax
  2638.       AddSeg:
  2639. if 0
  2640.         call    GetSegm
  2641.         movzx   eax,al
  2642.         mov     rax,[rax*sizeof.dq+ESBase]
  2643.         add     rax,rbx
  2644. end if
  2645.         ret
  2646. ;-----------------------------------------------------------------------------
  2647. ShowFPURegs:
  2648. if 1
  2649.         mov     ah,3Fh
  2650.         xor     ecx,ecx
  2651.         mov     edi,ConsoleDataPtr
  2652.         mov     al,     'Â'
  2653.         imul    edx,[CurWidth],49+1
  2654.         sub     edx,31
  2655.         call    DrawChar
  2656.         mov     al,     'Ä'
  2657.         mov     cl,28
  2658.         call    DrawLine
  2659.         imul    edx,[CurWidth],50+1
  2660.         sub     edx,31
  2661.         mov     al,     '³'
  2662.         mov     cl,9
  2663.         call    DrawDown
  2664.         mov     al,     'º'
  2665.         imul    edx,[CurWidth],55
  2666.         dec     edx
  2667.         call    DrawChar
  2668.   if 0
  2669.         mov     al,     'À'
  2670.         imul    edx,[CurWidth],49+1+10
  2671.         sub     edx,31
  2672.         call    DrawChar
  2673.         mov     al,     'Ä'
  2674.         mov     cl,28+1
  2675.         call    DrawLine
  2676.   end if
  2677. end if
  2678.         mov     ebp,[CurWidth]
  2679.         lea     eax,[ebp-28]
  2680.         mov     [Color],3Ah
  2681.         mov     [XPos],al
  2682.         mov     [YPos],49
  2683.         lea     edx,[Msg10F]
  2684.         call    PrintS
  2685.         mov     [Color],30h
  2686.         lea     eax,[ebp-30]
  2687.         mov     [XPos],al
  2688.         mov     [YPos],50
  2689.         lea     edx,[Msg11F]
  2690.         call    PrintS
  2691.         lea     eax,[ebp-30]
  2692.         mov     [XPos],al
  2693.         inc     [YPos]
  2694.         lea     edx,[Msg12F]
  2695.         call    PrintS
  2696.         lea     eax,[ebp-30]
  2697.         mov     [XPos],al
  2698.         inc     [YPos]
  2699.         lea     edx,[Msg13F]
  2700.         call    PrintS
  2701.         lea     eax,[ebp-30]
  2702.         mov     [XPos],al
  2703.         inc     [YPos]
  2704.         lea     edx,[Msg14F]
  2705.         call    PrintS
  2706.         lea     eax,[ebp-30]
  2707.         mov     [XPos],al
  2708.         inc     [YPos]
  2709.         lea     edx,[Msg15F]
  2710.         call    PrintS
  2711.         lea     eax,[ebp-30]
  2712.         mov     [XPos],al
  2713.         inc     [YPos]
  2714.         lea     edx,[Msg16F]
  2715.         call    PrintS
  2716.         lea     eax,[ebp-30]
  2717.         mov     [XPos],al
  2718.         inc     [YPos]
  2719.         lea     edx,[Msg17F]
  2720.         call    PrintS
  2721.         lea     eax,[ebp-30]
  2722.         mov     [XPos],al
  2723.         inc     [YPos]
  2724.         lea     edx,[Msg18F]
  2725.         call    PrintS
  2726.         lea     eax,[ebp-30]
  2727.         mov     [XPos],al
  2728.         inc     [YPos]
  2729.         lea     edx,[Msg19F]
  2730.         call    PrintS
  2731.         fninit                  ; reinitialize FPU
  2732. .1:     lea     eax,[ebp-26]
  2733.         mov     [XPos],al
  2734.         mov     [YPos],50
  2735.         xor     edi,edi         ; displacement
  2736.         mov     bl,8            ; counter
  2737.         movzx   eax,word [_FTW]
  2738.         mov     [Temp],eax
  2739.         movzx   eax,[_FSW]
  2740.         shr     eax,11
  2741.         and     eax,07h
  2742.         lea     ecx,[rax*2]
  2743.         ror     word [Temp],cl
  2744. .Loop:  ;
  2745.         mov     [Color],30h
  2746.         mov     eax,dword [_ST0+rdi]
  2747.         cmp     eax,dword [_ST0+rdi+Plus]
  2748.         jnz     .NotEQ
  2749.         mov     eax,dword [_ST0+rdi+4]
  2750.         cmp     eax,dword [_ST0+rdi+Plus+4]
  2751.         jnz     .NotEQ
  2752.         mov     ax,word [_ST0+rdi+8]
  2753.         cmp     ax,word [_ST0+rdi+Plus+8]
  2754.         jz      .YeaEQ
  2755. .NotEQ: mov     [Color],3Fh
  2756. .YeaEQ:
  2757.         mov     eax,[Temp]
  2758.         ror     word [Temp],02h
  2759.         and     eax,0003h
  2760.         cmp     eax,0003h
  2761.         jz      .__ftoa_empty
  2762.         fld     tbyte [_ST0+rdi]
  2763.         fxam
  2764.         fstsw   ax
  2765.         mov     al,ah
  2766. ;       C=          3   210
  2767.         and     al,01000101b
  2768.         jz      .__ftoa_err     ; unsupported number
  2769.         cmp     al,00000001b
  2770.         jz      .__ftoa_NaN     ; NaN number
  2771.         cmp     al,00000101b
  2772.         jz      .__ftoa_inf     ; infinity
  2773.         cmp     al,01000000b
  2774.         jz      .__ftoa_zero    ; zero
  2775.         cmp     al,01000100b
  2776.         jz      .__ftoa_den     ; denormal
  2777.         cmp     al,01000001b
  2778.         jz      .__ftoa_unu     ; unused
  2779.         cmp     al,01000101b
  2780.         jz      .__ftoa_unu     ; unused
  2781.         mov     eax,57
  2782.         call    _float2dec
  2783.         add     eax,17
  2784.         mov     edx,eax         ; save exponent in edx
  2785.  
  2786.         sub     esp,12
  2787.         fbstp   tbyte [rsp]
  2788.         mov     cx,[rsp+8]
  2789.         mov     esi,[rsp+4]
  2790.         mov     ebp,[rsp+0]
  2791.         add     esp,12
  2792.  
  2793.         mov     bh,15
  2794.         and     ch,80h
  2795.         mov     al,'+'
  2796.         jz      .2
  2797.         mov     al,'-'
  2798. .2:     call    PrintC
  2799.         call    __ftoa_char
  2800.         call    PrintC
  2801.         mov     al,'.'
  2802.         call    PrintC
  2803. .3:     call    __ftoa_char
  2804.         call    PrintC
  2805.         dec     bh
  2806.         jnz     .3
  2807.  
  2808.         mov     al,'E'
  2809.         call    PrintC
  2810.         test    edx,edx
  2811.         mov     al,'+'
  2812.         jns     .4
  2813.         mov     al,'-'
  2814.         neg     edx
  2815. .4:     call    PrintC
  2816.  
  2817.         mov     bh,4
  2818.         mov     eax,edx
  2819.         xor     ebp,ebp
  2820. .5:     mov     ecx,10
  2821.         xor     edx,edx
  2822.         idiv    ecx
  2823.         shl     ebp,8
  2824.         or      ebp,edx
  2825.         dec     bh
  2826.         jnz     .5
  2827.  
  2828.         mov     bh,4
  2829. .6:     mov     eax,ebp
  2830.         add     al,30h
  2831.         shr     ebp,8
  2832.         call    PrintC
  2833.         dec     bh
  2834.         jnz     .6
  2835.  
  2836. .Next:  add     edi,16
  2837.         mov     eax,[CurWidth]
  2838.         sub     eax,26
  2839.         mov     [XPos],al
  2840.         inc     [YPos]
  2841.         dec     bl
  2842.         jnz     .Loop
  2843.  
  2844.         mov     eax,[CurWidth]
  2845.         sub     eax,27
  2846.         mov     [XPos],al
  2847.         mov     [Color],30h
  2848.         mov     ax,[_FCW]       ; CW
  2849.         cmp     ax,[_FCW+Plus]
  2850. ifnz    mov     [Color],3Fh
  2851.         call    PrintAX
  2852.         add     [XPos],5
  2853.         mov     [Color],30h
  2854.         mov     ax,[_FSW]       ; SW
  2855.         cmp     ax,[_FSW+Plus]
  2856. ifnz    mov     [Color],3Fh
  2857.         call    PrintAX
  2858.         add     [XPos],6
  2859.         mov     [Color],30h
  2860.         mov     ax,word [_FTW]  ; Tag
  2861.         cmp     ax,word [_FTW+Plus]
  2862. ifnz    mov     [Color],3Fh
  2863.         call    PrintAX
  2864.         fwait
  2865.         ret
  2866.  
  2867. .__ftoa_err:
  2868.         lea     edx,[Msg1EF1]
  2869.         jmp     .__ftoa_
  2870. .__ftoa_NaN:
  2871.         and     ah,00000010h
  2872.         mov     al,'+'
  2873.         jz      .__ftoa_NaN_
  2874.         mov     al,'-'
  2875. .__ftoa_NaN_:
  2876.         lea     edx,[Msg1EF2]
  2877.         mov     [rdx],al
  2878.         jmp     .__ftoa_
  2879. .__ftoa_inf:
  2880.         and     ah,00000010h
  2881.         mov     al,'+'
  2882.         jz      .__ftoa_inf_
  2883.         mov     al,'-'
  2884. .__ftoa_inf_:
  2885.         lea     edx,[Msg1EF3]
  2886.         mov     [rdx],al
  2887.         jmp     .__ftoa_
  2888. .__ftoa_zero:
  2889.         and     ah,00000010h
  2890.         mov     al,'+'
  2891.         jz      .__ftoa_zero_
  2892.         mov     al,'-'
  2893. .__ftoa_zero_:
  2894.         lea     edx,[Msg1EF4]
  2895.         mov     [rdx],al
  2896.         jmp     .__ftoa_
  2897. .__ftoa_den:
  2898.         and     ah,00000010h
  2899.         mov     al,'+'
  2900.         jz      .__ftoa_den_
  2901.         mov     al,'-'
  2902. .__ftoa_den_:
  2903.         lea     edx,[Msg1EF5]
  2904.         mov     [rdx],al
  2905.         jmp     .__ftoa_
  2906. .__ftoa_unu:
  2907.         lea     edx,[Msg1EF6]
  2908.         jmp     .__ftoa_
  2909. .__ftoa_empty:
  2910.         lea     edx,[Msg1EF7]
  2911. .__ftoa_:
  2912.         call    PrintS
  2913.         jmp     .Next
  2914.  
  2915. __ftoa_char:
  2916.         mov     al,cl
  2917.         shl     ebp,1
  2918.         rcl     esi,1
  2919.         rcl     cl,1
  2920.         shl     ebp,1
  2921.         rcl     esi,1
  2922.         rcl     cl,1
  2923.         shl     ebp,1
  2924.         rcl     esi,1
  2925.         rcl     cl,1
  2926.         shl     ebp,1
  2927.         rcl     esi,1
  2928.         rcl     cl,1
  2929.         shr     al,4
  2930.         add     al,30h
  2931.         ret
  2932.  
  2933. _float2dec:
  2934.         sub     esp,3*4
  2935.         fstcw   word [rsp]
  2936.         mov     word [rsp+2],03BFh
  2937.         fldcw   word [rsp+2]
  2938.         mov     [rsp+4],eax
  2939.         fld     st0
  2940.         fxtract
  2941.         fstp    st0
  2942.         fisubr  dword [rsp+4]
  2943.         fldl2t
  2944.         fdivp   st1,st0
  2945.         frndint
  2946.         fist    dword [rsp+8]
  2947.         call    _exp10
  2948.         fmulp   st1,st0
  2949.         fldcw   word [rsp]
  2950.         mov     eax,[rsp+2*4]
  2951.         add     esp,3*4
  2952.         neg     eax
  2953.         ret
  2954.  
  2955. _exp10: fldl2t
  2956.         fmulp   st1,st0
  2957. _exp2:  sub     esp,2*4
  2958.         fstcw   word [rsp]
  2959.         mov     word [rsp+2],03BFh
  2960.         fldcw   word [rsp+2]
  2961.         fld     st0
  2962.         frndint
  2963.         fxch
  2964.         fsub    st0,st1
  2965.         ftst
  2966.         fstsw   word [rsp+4]
  2967.         and     byte [rsp+5],45h
  2968.         cmp     byte [rsp+5],01h
  2969.         ja      .Err
  2970.         je      .Neg
  2971.         f2xm1
  2972.         fld1
  2973.         faddp   st1,st0
  2974.         fxch
  2975.         fld1
  2976.         fscale
  2977.         fmulp   st2,st0
  2978.         fstp    st0
  2979.         jmp     .Done
  2980. .Neg:   fabs
  2981.         f2xm1
  2982.         fld1
  2983.         faddp   st1,st0
  2984.         fxch
  2985.         fld1
  2986.         fscale
  2987.         fdivrp  st2,st0
  2988.         fstp    st0
  2989. .Done:  fldcw   word [rsp]
  2990.         add     esp,2*4
  2991.         ret
  2992. .Err:   fstp    st0
  2993.         fstp    st0
  2994.         fld1
  2995.         jmp     .Done
  2996. ;-----------------------------------------------------------------------------
  2997. ShowMMXRegs:
  2998. if 1
  2999.         mov     ah,3Fh
  3000.         xor     ecx,ecx
  3001.         mov     edi,ConsoleDataPtr
  3002.         mov     al,     'Â'
  3003.         imul    edx,[CurWidth],49+1
  3004.         sub     edx,52
  3005.         call    DrawChar
  3006.         imul    edx,[CurWidth],50+1
  3007.         sub     edx,52
  3008.         mov     al,     '³'
  3009.         mov     cl,9
  3010.         call    DrawDown
  3011.         mov     al,     'º'
  3012.         imul    edx,[CurWidth],54
  3013.         dec     edx
  3014.         call    DrawChar
  3015. end if
  3016.         mov     ebx,[CurWidth]
  3017.         mov     bh,bl
  3018.         sub     bh,47
  3019.         sub     bl,51
  3020.  
  3021.         mov     [Color],3Ah
  3022.         mov     [XPos],bl
  3023.         add     [XPos],2
  3024.         mov     [YPos],49
  3025.         lea     edx,[MsgMMX]
  3026.         call    PrintS
  3027.         mov     [Color],30h
  3028.         mov     [XPos],bl
  3029.         mov     [YPos],50
  3030.         lea     edx,[MsgMM0]
  3031.         call    PrintS
  3032.         mov     [XPos],bl
  3033.         inc     [YPos]
  3034.         lea     edx,[MsgMM1]
  3035.         call    PrintS
  3036.         mov     [XPos],bl
  3037.         inc     [YPos]
  3038.         lea     edx,[MsgMM2]
  3039.         call    PrintS
  3040.         mov     [XPos],bl
  3041.         inc     [YPos]
  3042.         lea     edx,[MsgMM3]
  3043.         call    PrintS
  3044.         mov     [XPos],bl
  3045.         inc     [YPos]
  3046.         lea     edx,[MsgMM4]
  3047.         call    PrintS
  3048.         mov     [XPos],bl
  3049.         inc     [YPos]
  3050.         lea     edx,[MsgMM5]
  3051.         call    PrintS
  3052.         mov     [XPos],bl
  3053.         inc     [YPos]
  3054.         lea     edx,[MsgMM6]
  3055.         call    PrintS
  3056.         mov     [XPos],bl
  3057.         inc     [YPos]
  3058.         lea     edx,[MsgMM7]
  3059.         call    PrintS
  3060.         mov     [XPos],bl
  3061.         inc     [YPos]
  3062.         lea     edx,[MsgXMMX]
  3063.         call    PrintS
  3064.         inc     [XPos]
  3065.         add     edx,4
  3066.         mov     [Color],3Eh
  3067.         call    PrintS
  3068.         mov     [YPos],50
  3069.         mov     bl,8            ; counter
  3070.         lea     esi,[_MM0]
  3071. .Skip:  lea     ecx,[_MM0+Plus]
  3072. .Loop:  mov     [XPos],bh
  3073.         mov     [Color],30h
  3074.         mov     eax,[rsi+0]
  3075.         cmp     eax,[rcx+0]
  3076.         jne     @F
  3077.         mov     eax,[rsi+4]
  3078.         cmp     eax,[rcx+4]
  3079.         je      .@
  3080. @@:     mov     [Color],3Fh
  3081. .@:     mov     eax,[rsi+4]
  3082.         call    PrintEAX
  3083.         mov     eax,[rsi+0]
  3084.         call    PrintEAX
  3085.         inc     [YPos]
  3086.         add     esi,16
  3087.         add     ecx,16
  3088.         dec     bl
  3089.         jnz     .Loop
  3090.         ret
  3091. ;-----------------------------------------------------------------------------
  3092. ShowXMMRegs:
  3093.         mov     [Color],3Ah
  3094.         mov     [XPos],3
  3095.         mov     [YPos],49
  3096.         lea     edx,[MsgXMM]
  3097.         call    PrintS
  3098.         mov     [Color],30h
  3099.         mov     [XPos],1
  3100.         mov     [YPos],50
  3101.         lea     edx,[MsgXM0]
  3102.         call    PrintS
  3103.         mov     [XPos],1
  3104.         inc     [YPos]
  3105.         lea     edx,[MsgXM1]
  3106.         call    PrintS
  3107.         mov     [XPos],1
  3108.         inc     [YPos]
  3109.         lea     edx,[MsgXM2]
  3110.         call    PrintS
  3111.         mov     [XPos],1
  3112.         inc     [YPos]
  3113.         lea     edx,[MsgXM3]
  3114.         call    PrintS
  3115.         mov     [XPos],1
  3116.         inc     [YPos]
  3117.         lea     edx,[MsgXM4]
  3118.         call    PrintS
  3119.         mov     [XPos],1
  3120.         inc     [YPos]
  3121.         lea     edx,[MsgXM5]
  3122.         call    PrintS
  3123.         mov     [XPos],1
  3124.         inc     [YPos]
  3125.         lea     edx,[MsgXM6]
  3126.         call    PrintS
  3127.         mov     [XPos],1
  3128.         inc     [YPos]
  3129.         lea     edx,[MsgXM7]
  3130.         call    PrintS
  3131.         mov     [YPos],50
  3132.         mov     bl,8            ; counter
  3133.         lea     esi,[_XMM0]
  3134. .Skip:  lea     ecx,[_XMM0+Plus]
  3135. .Loop:  mov     [XPos],6
  3136.         mov     [Color],30h
  3137.         mov     eax,[rsi+4*0]
  3138.         cmp     eax,[rcx+4*0]
  3139.         jne     @F
  3140.         mov     eax,[rsi+4*1]
  3141.         cmp     eax,[rcx+4*1]
  3142.         jne     @F
  3143.         mov     eax,[rsi+4*2]
  3144.         cmp     eax,[rcx+4*2]
  3145.         jne     @F
  3146.         mov     eax,[rsi+4*3]
  3147.         cmp     eax,[rcx+4*3]
  3148.         je      .@
  3149. @@:     mov     [Color],3Fh
  3150. .@:     mov     eax,[rsi+4*3]
  3151.         call    PrintEAX
  3152.         mov     eax,[rsi+4*2]
  3153.         call    PrintEAX
  3154.         mov     eax,[rsi+4*1]
  3155.         call    PrintEAX
  3156.         mov     eax,[rsi+4*0]
  3157.         call    PrintEAX
  3158.         inc     [YPos]
  3159.         add     esi,16
  3160.         add     ecx,16
  3161.         dec     bl
  3162.         jnz     .Loop
  3163.         mov     [XPos],1
  3164.         lea     edx,[MsgXCSR]
  3165.         call    PrintS
  3166.         mov     [XPos],1+6+9
  3167.         lea     edx,[MsgMCSR]
  3168.         call    PrintS
  3169.         mov     [XPos],7
  3170.         mov     eax,[_MXCSR]
  3171.         cmp     eax,[_MXCSR+Plus]
  3172.         mov     [Color],30h
  3173. ifnz    mov     [Color],3Fh
  3174.         call    PrintEAX
  3175.         mov     [XPos],7+9+11
  3176.         mov     eax,[_MXCSRM]
  3177.         cmp     eax,[_MXCSRM+Plus]
  3178.         mov     [Color],30h
  3179. ifnz    mov     [Color],3Fh
  3180.         call    PrintEAX
  3181.         ret
  3182. ;-----------------------------------------------------------------------------
  3183. Msg10   db 'CPU Registers',0
  3184. ;-----------------------------------------------------------------------------
  3185. Msg11   db 'EAX 00000000 EFL 00000000          ',0
  3186. Msg12   db 'EBX 00000000 EIP 00000000          ',0
  3187. Msg13   db 'ECX 00000000 CS 0000/00000000/0000 ',0
  3188. Msg14   db 'EDX 00000000 DS 0000/00000000/0000 ',0
  3189. Msg15   db 'ESI 00000000 ES 0000/00000000/0000 ',0
  3190. Msg16   db 'EDI 00000000 FS 0000/00000000/0000 ',0
  3191. Msg17   db 'EBP 00000000 GS 0000/00000000/0000 ',0
  3192. Msg18   db 'ESP 00000000 SS 0000/00000000/0000 ',0
  3193. Msg19   db 'V R N IO O D I T S  Z A P C ',0
  3194. Msg20   db '0 0 0 00 0 0 0 0 0  0 0 0 0 ',0
  3195. ;-----------------------------------------------------------------------------
  3196. Msg22   db '[ds:esi]',0
  3197. Msg23   db '[es:edi]',0
  3198. MsgX2   db '[ds:edx]',0
  3199. MsgX3   db '[ds:ebx]',0
  3200. MsgX4   db '[ss:ebp]',0
  3201. MsgX5   db '[ds:ecx]',0
  3202. ;-----------------------------------------------------------------------------
  3203. Msg2SIP db '[esi+',0
  3204. Msg2SIM db '[esi-',0
  3205. Msg2DIP db '[edi+',0
  3206. Msg2DIM db '[edi-',0
  3207. Msg2BXP db '[ebx+',0
  3208. Msg2BXM db '[ebx-',0
  3209. Msg2DXP db '[edx+',0
  3210. Msg2DXM db '[edx-',0
  3211. Msg2BPP db '[ebp+',0
  3212. Msg2BPM db '[ebp-',0
  3213. Msg3SPP db '[esp+',0
  3214. Msg3SPM db '[esp-',0
  3215. Msg2ER  db '--',0
  3216. ;-----------------------------------------------------------------------------
  3217. Msg00   db 'CPU ',0
  3218. CPUTable \
  3219.         dd '8086'
  3220.         dd '186'
  3221.         dd '286'
  3222.         dd '386'
  3223.         dd '486'
  3224.         dd '586'
  3225.         dd '686'
  3226. FPUTable \
  3227.         db '/None',0,0,0
  3228.         db '/8087',0,0,0
  3229.         dd '/287',0
  3230.         dd '/387',0
  3231.         dd '/487',0
  3232.         dd '/587',0
  3233.         dd '/687',0
  3234. ;-----------------------------------------------------------------------------
  3235. Msg21   db 'Memory',0
  3236. ;-----------------------------------------------------------------------------
  3237. Msg30   db 'Stack',0
  3238. ;-----------------------------------------------------------------------------
  3239. Msg3M   db 'Messages',0
  3240. ;-----------------------------------------------------------------------------
  3241. Msg40   db 'Address: ',8,3Fh,'00000000 ',8,3Ah,'=',8,3Fh,' 00h',0
  3242. ;-----------------------------------------------------------------------------
  3243. Msg10F  db 'FPU Registers',0
  3244. Msg11F  db 'ST0',0
  3245. Msg12F  db 'ST1',0
  3246. Msg13F  db 'ST2',0
  3247. Msg14F  db 'ST3',0
  3248. Msg15F  db 'ST4',0
  3249. Msg16F  db 'ST5',0
  3250. Msg17F  db 'ST6',0
  3251. Msg18F  db 'ST7',0
  3252. Msg19F  db 'CW=0000  SW=0000  TAG=0000',0
  3253. ;-----------------------------------------------------------------------------
  3254. MsgMMX  db 'MMX Registers',0
  3255. MsgMM0  db 'MM0',0
  3256. MsgMM1  db 'MM1',0
  3257. MsgMM2  db 'MM2',0
  3258. MsgMM3  db 'MM3',0
  3259. MsgMM4  db 'MM4',0
  3260. MsgMM5  db 'MM5',0
  3261. MsgMM6  db 'MM6',0
  3262. MsgMM7  db 'MM7',0
  3263. ;-----------------------------------------------------------------------------
  3264. MsgXMM  db 'XMM Registers',0
  3265. MsgXM0  db 'XMM0',0
  3266. MsgXM1  db 'XMM1',0
  3267. MsgXM2  db 'XMM2',0
  3268. MsgXM3  db 'XMM3',0
  3269. MsgXM4  db 'XMM4',0
  3270. MsgXM5  db 'XMM5',0
  3271. MsgXM6  db 'XMM6',0
  3272. MsgXM7  db 'XMM7',0
  3273. ;-----------------------------------------------------------------------------
  3274. Msg1EF1 db 'Unsupported             ',0
  3275. Msg1EF2 db '+NaN                    ',0
  3276. Msg1EF3 db '+Infinity               ',0
  3277. Msg1EF4 db '+0.0                    ',0
  3278. Msg1EF5 db '+Denormal               ',0
  3279. Msg1EF6 db 'Unused                  ',0
  3280. Msg1EF7 db 'Empty                   ',0
  3281. ;-----------------------------------------------------------------------------
  3282. MsgXMMX db 'CPU',0,'GenuineIntel',0
  3283. ;-----------------------------------------------------------------------------
  3284. MsgXCSR db 'MXCSR=',0
  3285. MsgMCSR db 'MXCSR_MASK=',0
  3286. ;-----------------------------------------------------------------------------
  3287. Msg50   db 8,74h,'F1',8,70h,'-Show '
  3288.         db 8,74h,'F2',8,70h,'-BreakPnt '
  3289.         db 8,74h,'F3',8,70h,'-Return '
  3290.         db 8,74h,'F4',8,70h,'-Here '
  3291.         db 8,74h,'F5',8,70h,'-Screen '
  3292.         db 8,74h,'F6',8,70h,'-New '
  3293.         db 8,74h,'F7',8,70h,'-Trace '
  3294.         db 8,74h,'F8',8,70h,'-Step '
  3295.         db 8,74h,'F9',8,70h,'-Run '
  3296.         db 8,74h,'F10',8,70h,'-Over '
  3297.         db 0
  3298. ;-----------------------------------------------------------------------------
  3299. even 4
  3300. RegVTab dd _EAX,_ECX,_EDX,_EBX,_ESP,_EBP,_ESI,_EDI,_EIP
  3301. RegRTab dd _EAX,_EBX,_ECX,_EDX,_ESI,_EDI,_EBP,_ESP,_EIP
  3302.         dd 0800h,0400h,0200h,0080h,0040h,0010h,0004h,0001h
  3303. ;-----------------------------------------------------------------------------
  3304. RegXTab db  1, 1, 1, 1, 1, 1, 1, 1, 14, 10,12,14,18, 21,23,25,27
  3305. RegYTab db 30,31,32,33,34,35,36,37, 31, 39,39,39,39, 39,39,39,39
  3306. RegLTab db 12,12,12,12,12,12,12,12, 12,  1, 1, 1, 1,  1, 1, 1, 1
  3307. ;-----------------------------------------------------------------------------
  3308. CursorTab       dd CPUCursor,RegCursor,MemCursor,StkCursor
  3309. WindowTab       dd CPUWindow,RegWindow,MemWindow,StkWindow
  3310. ;-----------------------------------------------------------------------------
  3311. HexBuf: db 8 dup 20h,0
  3312. ;-----------------------------------------------------------------------------
  3313. XPos    db      0
  3314. YPos    db      0
  3315. Color   db      7
  3316. ;-----------------------------------------------------------------------------