kolibrios/programs/develop/koldbg/kernel.inc
Kirill Lipatov (Leency) b34f9856cb upload koldbg by CandyMan
git-svn-id: svn://kolibrios.org@9353 a494cfbc-eb01-0410-851d-a64ba20cac60
2021-12-02 17:13:25 +00:00

3316 lines
92 KiB
PHP
Raw Blame History

;-----------------------------------------------------------------------------
OS = 0
Loader = 1
;-----------------------------------------------------------------------------
SkipAddr = 8
;-----------------------------------------------------------------------------
Bitness equ 32
;-----------------------------------------------------------------------------
include "globals!.inc"
include "fasm\fasm.asm"
include "disasm\disasm32.asm"
if ~OS
include "loadmap.inc"
end if
include "assemble.inc"
;-----------------------------------------------------------------------------
xglobal
even 16
StdMemStr rb 4*1024
StdMemEnd:
AddMemStr rb 4*1024
AddMemEnd:
endg
;-----------------------------------------------------------------------------
uglobal
even 16
Inst TInstruction
even 16
DefInst TInstruction
endg
;-----------------------------------------------------------------------------
virtual at 0
dq ?
sizeof.dq = $
end virtual
;---------------------------------------;
JccCalls: ;
seto al ; 0
ret ;
setno al ; 1
ret ;
setc al ; 2
ret ;
setnc al ; 3
ret ;
setz al ; 4
ret ;
setnz al ; 5
ret ;
setbe al ; 6
ret ;
seta al ; 7
ret ;
sets al ; 8
ret ;
setns al ; 9
ret ;
setpe al ; A
ret ;
setpo al ; B
ret ;
setl al ; C
ret ;
setge al ; D
ret ;
setle al ; E
ret ;
setg al ; F
ret ;
;-----------------------------------------------------------------------------
ShowCPU:
mov [XPos],3
mov [YPos],0
mov edx,Msg00
call PrintS
movzx edx,[CPUType]
cmp dl,6
jb @F
mov dl,6
@@:
lea edx,[CPUTable+rdx*4]
jmp PrintS
;-----------------------------------------------------------------------------
ShowFPU:
movzx edx,[CPUType]
cmp dl,6
jb @F
mov dl,6
@@:
lea edx,[FPUTable+rdx*8]
jmp PrintS
;-----------------------------------------------------------------------------
DetectCPU:
mov dl,1
push sp
pop ax
cmp ax,sp
jnz .RetCPU
inc edx
pushfw
pop ax
mov cx,ax
xor ah,40h
push ax
popfw
pushfw
pop ax
push cx
popfw
xor ah,ch
jz .RetCPU
inc edx
pushfd
pop eax
mov ecx,eax
btc eax,18
push eax
popfd
pushfd
pop eax
push ecx
popfd
xor eax,ecx
jz .RetCPU
inc edx
mov eax,ecx
btc eax,21
push eax
popfd
pushfd
pop eax
push ecx
popfd
xor eax,ecx
jz .RetCPU
inc edx
xor eax,eax
cpuid
test eax,eax
jz .RetCPU
xor eax,eax
inc eax
cpuid
mov dl,ah
and dl,0Fh
.RetCPU:ret
;-----------------------------------------------------------------------------
DetectFPU:
xor eax,eax
push ax
mov ebp,esp
fninit
fnstcw word [ebp]
mov dx,[ebp]
cmp dh,03h
jnz .Done ; done: no FPU present
inc eax
and word [ebp],0FF7Fh
wait
fldcw word [ebp]
fdisi
fstcw word [ebp]
wait
test byte [ebp],0080h
jnz .Done ; done: 8087 is present
inc eax
fninit
wait
fld1
wait
fldz
wait
fdivp st1,st0
wait
fld st0
wait
fchs
wait
fcompp
wait
fnstsw ax
wait
fnclex
wait
sahf
jz .Done ; done: 80287 is present
inc eax
mov ah,[CPUType]
cmp ah,4
jb .Done ; done: 80387 is present
mov al,ah ; done: 80487+ (build-in)
.Done: or al,al
jz .Exit
mov ecx,8
.Loop: fldz ; set ST(0) to ST(7) to +ZERO
loop .Loop
finit ; reinitialize FPU
.Exit: pop dx
ret
;-----------------------------------------------------------------------------
ClearCmdLine:
mov [XPos],1
mov [YPos],MinHeight-1
mov [Color],7
mov al,32
mov ecx,[CurWidth]
sub ecx,2
.Loop: call PrintC
loop .Loop
ret
;-----------------------------------------------------------------------------
PrintCmdLine:
call ClearCmdLine
mov [XPos],1
lea edx,[Msg50]
jmp PrintS
;-----------------------------------------------------------------------------
Decode: push rax rcx rsi rdi
xor ecx,ecx
mov [Origin],rsi
mov rdi,rsi
@@:
mov rsi,rdi
add rsi,rcx
call GetDataByte
mov [rcx+BufferI],al
inc ecx
cmp cl,15
jb @B
pop rdi rsi rcx rax
pushad
mov [DefInst.Addr],BufferI
mov [TheBufferO],BufferO
call DisAsmLine
mov [rsp+1Ch],rax
popad
add rsi,rax
ret
DisAsmLine:
push rbp
mov al,[CodeType]
mov ah,0
cmp al,16
jz @F
mov ah,1
cmp al,32
jz @F
mov ah,2
@@:
mov [DefInst.Arch],ah
mov [DefInst.Emulated],-1 ;#
lea ebp,[Inst+128]
mov ecx,sizeof.TInstruction
lea esi,[DefInst]
lea edi,[Inst]
rep movsb
mov [SpaceSize],8
call DisAsm
push rax
call PrnAsm
pop rax
pop rbp
ret
;-----------------------------------------------------------------------------
ShowText:
MakeText:
xor ebp,ebp
mov [CPUXPtr],ebp
mov rsi,[CodeAddr]
mov [AddrBuffer],rsi
mov [YPos],0
.Loop: mov [Color],30h
mov [BufferO-1],byte 30h ;Default Color
inc [YPos]
mov [XPos],1
call Decode
mov eax,[_EIP]
inc ebp
cmp [AddrBuffer+(rbp-1)*sizeof.dq],rax
jnz .1
mov [CPUXPtr],ebp
mov [BufferO+SkipAddr+1],byte 10h ;'>>'
cmp [Inst.IsAddress],0
je .1
call CheckJump
cmp [JumpTaken],0
jz .1
mov [BufferO+SkipAddr+2*16+1],byte 18h
mov rax,[Inst.Arg1.Imm]
cmp rax,rsi
jbe .1
.0: mov [BufferO+SkipAddr+2*16+1],byte 19h
.1: mov [AddrBuffer+rbp*sizeof.dq],rsi
lea edx,[BufferO]
cmp byte [rdx-1],30h
jnz .2
mov ax,'+'
xchg ax,[rdx+9+9]
cmp al,32
ifz mov [rdx+9+9],al
call PrintS
add edx,9+15*2
jmp .3
.2: mov eax,edx
.N: cmp [eax],byte 32
jz .F
inc eax
jmp .N
.F: mov [rax],byte 0
sub eax,edx
cmp eax,(MinWidth-2)
jbe .X
mov [rdx+(MinWidth-2)],byte 0
.X: add edx,43
mov [Color],30h
mov [XPos],9+15*2-(9+9)+3
call PrintS
sub edx,43
mov al,[rdx-1]
mov [Color],al
mov [XPos],1
.3: call PrintS
mov rax,[AddrBuffer+(rbp-1)*sizeof.dq]
call BChk
cmp ebp,28
jb .Loop
ret
;-----------------------------------------------------------------------------
BChk: push rbp rbx rcx rsi rdi
xor ebp,ebp
.001: cmp [DrXBreak+rbp*4],eax
jnz .NotFound
push rax
mov esi,1
movzx edi,[YPos]
mov ecx,[CurWidth]
sub ecx,25
mov ax,7F00h
call Cursor
mov eax,ebp ; EBP = breakpoint number
shl eax,16
add eax,60306023h ; show #X (X=BrkPnt)
add esi,ecx ; adjust X-pos
push rdx
mov edx,[CurWidth]
add edx,edx
imul edx,edi
lea esi,[rdx+rsi*2]
add esi,ConsoleDataPtr
mov [rsi],eax
pop rdx
pop rax
.NotFound:
inc ebp
cmp ebp,4
jnz .001
push rax
call FindEnabledBreakPoint;FindBreakPoint
inc eax
jz .NoFound2
mov esi,1
movzx edi,[YPos]
mov ecx,[CurWidth]
sub ecx,21
mov ax,7F00h
call Cursor
.NoFound2:
pop rax
pop rdi rsi rcx rbx rbp
ret
;-----------------------------------------------------------------------------
CheckJump:
pushf
push rax rdx
pushf
and dword [rsp],$FFFFF700
mov eax,[_EFL]
and eax,000008FFh
or [rsp],eax
mov rax,[Inst.SaveRSI]
movzx edx,byte [rax-2]
movzx eax,byte [rax-1]
mov [JumpTaken],ah ;ah=0
cmp al,0xE8
jz .2
cmp al,0xE9
jz .2
cmp al,0xEB
jz .2
cmp al,0xE0 ;LOOPNZ
jz .3
cmp al,0xE1 ;LOOPZ
jz .4
cmp al,0xE2 ;LOOP
jz .5
cmp al,0xE3 ;JxCXZ
jz .6
and al,7Fh ;70-7F
cmp al,0Fh ;0F80-0F8F
jbe .1
sub al,70h
.1:
popf
lea eax,[JccCalls+rax*4]
call rax
mov [JumpTaken],al
pop rdx rax
popf
ret
.2:
mov [JumpTaken],1
popf
pop rdx rax
popf
ret
.3:
popf
call JccCalls+5*4
mov [JumpTaken],al
call TypeLoop
pop rdx rax
popf
ret
.4:
popf
call JccCalls+4*4
mov [JumpTaken],al
call TypeLoop
pop rdx rax
popf
ret
.5:
popf
call TypeLoop
pop rdx rax
popf
ret
.6:
popf
call TypeJxCXZ
pop rdx rax
popf
ret
;-----------------------------------------------------------------------------
TypeJxCXZ:
cmp [CodeType],32
jz JCXZ32
cmp [CodeType],16
jz JCXZ16
if %B=64
cmp dl,67h
jnz .1
cmp [Reg.ECX],0
jmp .2
.1: cmp [Reg.RCX],0
.2: setz [JumpTaken]
end if
ret
;-----------------------------------------------------------------------------
JCXZ16: cmp dl,67h
jz .1
cmp word [_ECX],0
setz [JumpTaken]
jmp .2
.1: cmp [_ECX],0
setz [JumpTaken]
.2: ret
;-----------------------------------------------------------------------------
JCXZ32: cmp dl,67h
jz .1
cmp [_ECX],0
setz [JumpTaken]
jmp .2
.1: cmp word [_ECX],0
setz [JumpTaken]
.2: ret
;-----------------------------------------------------------------------------
TypeLoop:
cmp [CodeType],32
jz .32
cmp [CodeType],16
jz .16
if %B=64
mov rax,[_RCX]
cmp dl,67h ; check for ECX or RCX == 0
jnz .1X
mov eax,eax
.1X: dec rax
setnz al
or [JumpTaken],al
end if
ret
.32: mov eax,[_ECX]
cmp dl,67h ; check for CX or ECX == 0
jnz .1Y
movzx eax,ax
.1Y: dec eax
setnz al
or [JumpTaken],al
ret
.16: mov eax,[_ECX]
cmp dl,67h ; check for CX or ECX == 0
jz .1Z
movzx eax,ax
.1Z: dec eax
setnz al
or [JumpTaken],al
ret
;-----------------------------------------------------------------------------
CPUCursor:
mov esi,[CPUXPos]
mov edi,[CPUYPos]
mov ecx,[CurWidth]
sub ecx,23
mov ax,2F00h
call Cursor
mov eax,[CPUYPos]
mov rsi,[(rax-1)*sizeof.dq+AddrBuffer]
call Decode
call ShowAddress
ret
;-----------------------------------------------------------------------------
RegCursor:
mov esi,[RegXPos]
mov edi,[RegYPos]
mov ecx,[RegLDat]
jmp CursorXY
;-----------------------------------------------------------------------------
MemCursor:
mov esi,[MemXPos]
mov edi,[MemYPos]
mov ecx,2
mov ax,2F00h
jmp Cursor
;-----------------------------------------------------------------------------
StkCursor:
mov esi,[StkXPos]
mov edi,[StkYPos]
mov ecx,20
mov ax,2F00h
jmp Cursor
;-----------------------------------------------------------------------------
CursorXY:
pushad
mov eax,[CurWidth]
add eax,eax
imul eax,edi
lea esi,[rax+rsi*2]
add esi,ConsoleDataPtr
.Loop: mov al,[rsi+1]
cmp al,17h
jz .1
cmp al,1Fh
jz .2
cmp al,30h
jz .3
cmp al,3Fh
jz .4
jmp .Next
.1: mov al,3Fh
jmp .Next
.2: mov al,30h
jmp .Next
.3: mov al,1Fh
jmp .Next
.4: mov al,17h
.Next: mov [rsi+1],al
add esi,2
dec cl
jnz .Loop
popad
ret
;-----------------------------------------------------------------------------
Cursor: push rcx rdx rsi
mov edx,eax
mov eax,[CurWidth]
add eax,eax
imul eax,edi
xchg edx,eax
lea esi,[rdx+rsi*2]
add esi,ConsoleDataPtr
.Loop: xor [rsi],ax
add esi,2
dec cl
jnz .Loop
pop rsi rdx rcx
ret
;-----------------------------------------------------------------------------
ShowCursor:
mov ebp,CursorTab
GotoWindow:
mov ebx,[CurrentWindow]
and ebx,3
jmp dword [rbp+rbx*4]
;-----------------------------------------------------------------------------
WindowSwitch:
test [CtrlState],3
jz .1
dec [CurrentWindow]
jmp .2
.1: inc [CurrentWindow]
.2: and [CurrentWindow],3
xor eax,eax
WinSwitch:
mov [AfterKey],1
call ShowImage
mov ebp,WindowTab
jmp GotoWindow
;-----------------------------------------------------------------------------
DrawChar:
mov [rdi+rdx*2],ax
inc edx
ret
;-----------------------------------------------------------------------------
DrawLine:
mov [rdi+rdx*2],ax
inc edx
loop DrawLine
ret
;-----------------------------------------------------------------------------
DrawDown:
mov [rdi+rdx*2],ax
add edx,[CurWidth]
loop DrawDown
ret
;-----------------------------------------------------------------------------
PrintAL:push rdi
mov edi,HexBuf
call MakeHex
lea edi,[rdi+6]
jmp PrintHex
;-----------------------------------------------------------------------------
PrintAX:push rdi
mov edi,HexBuf
call MakeHex
lea edi,[rdi+4]
jmp PrintHex
;-----------------------------------------------------------------------------
PrintEAX:
push rdi
mov edi,HexBuf
call MakeHex
PrintHex:
push rdx
mov edx,edi
call PrintS
pop rdx rdi
ret
;-----------------------------------------------------------------------------
MakeHex:push rax rdx rsi
mov edx,3
.Loop: mov esi,eax
and eax,$FF
mov ax,[rax*2+HexString]
mov [rdi+rdx*2],ax
mov eax,esi
shr eax,8
sub edx,1
jnc .Loop
pop rsi rdx rax
ret
;-----------------------------------------------------------------------------
DrawFrame:
mov ah,3Fh ; color
mov edi,ConsoleDataPtr
xor edx,edx
xor ecx,ecx
mov al, '<27>'
call DrawChar
mov al, '<27>'
mov cl,byte [CurWidth]
sub cl,2
call DrawLine
mov al, '<27>'
call DrawChar
mov al, '<27>' ; left border
mov edx,[CurWidth]
mov cl,byte [CurHeight]
sub cl,2
call DrawDown
mov al, '<27>'
call DrawChar
mov al, '<27>' ; right border
imul edx,[CurWidth],2
dec edx
mov cl,byte [CurHeight]
sub cl,2
call DrawDown
mov al, '<27>'
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],29
call DrawChar
mov al, '<27>'
mov cl,byte [CurWidth]
sub cl,2
call DrawLine
mov al, '<27>'
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],40
call DrawChar
mov al, '<27>'
mov cl,byte [CurWidth]
sub cl,(2+45)
call DrawLine
mov al, '<27>'
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],49
call DrawChar
mov al, '<27>'
mov cl,byte [CurWidth]
sub cl,2
call DrawLine
mov al, '<27>'
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],30
sub edx,46
call DrawChar
imul edx,[CurWidth],31
sub edx,46
mov al, '<27>'
mov cl,10
call DrawDown
imul edx,[CurWidth],40
sub edx,46
mov al, '<27>'
mov cl,10
call DrawDown
mov al, '<27>'
imul edx,[CurWidth],46
sub edx,46
call DrawChar
mov al, '<27>'
mov cl,44
call DrawLine
mov al, '<27>'
call DrawChar
mov al, '<27>'
mov edx,[CurWidth]
sub edx,22
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],2
sub edx,22
mov cl,28
call DrawDown
mov al, '<27>'
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],42
sub edx,46
call DrawChar
mov al, '<27>'
mov cl,44
call DrawLine
mov al, '<27>'
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],34
sub edx,46
call DrawChar
mov al, '<27>'
mov cl,44
call DrawLine
mov al, '<27>'
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],38
sub edx,46
call DrawChar
mov al, '<27>'
mov cl,44
call DrawLine
mov al, '<27>'
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],41
sub edx,46
call DrawChar
mov al, '<27>'
imul edx,[CurWidth],50
sub edx,46
call DrawChar
if 1
mov al, '<27>'
imul edx,[CurWidth],MinHeight-2-(MSG_HEIGHT-1)-1
call DrawChar
mov al, '<27>'
mov cl,byte [CurWidth]
sub cl,2
call DrawLine
mov al, '<27>'
call DrawChar
end if
mov [Color],3Ah
call ShowCPU
call ShowFPU
mov [Color],3Ah
mov [XPos],3
mov [YPos],29
lea edx,[Msg10]
call PrintS
mov [Color],30h
mov [XPos],1
inc [YPos]
lea edx,[Msg11]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg12]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg13]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg14]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg15]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg16]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg17]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg18]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg19]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[Msg20]
call PrintS
mov [XPos],3
inc [YPos]
mov [Color],3Ah
lea edx,[Msg21]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],29
lea edx,[MsgX2]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],33
lea edx,[MsgX3]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],37
lea edx,[MsgX4]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],41
lea edx,[Msg22]
call PrintS
mov eax,[CurWidth]
sub eax,43
mov [XPos],al
mov [YPos],45
lea edx,[Msg23]
call PrintS
mov eax,[CurWidth]
sub eax,19
mov [XPos],al
mov [YPos],0
lea edx,[Msg30]
call PrintS
mov [XPos],3
mov [YPos],MinHeight-2-(MSG_HEIGHT-1)-1
lea edx,[Msg3M]
call PrintS
mov eax,[CurWidth]
sub eax,51-23
mov [XPos],al
mov [YPos],MinHeight-2-(MSG_HEIGHT-1)-1
lea edx,[Msg40]
call PrintS
cmp [DebuggeePID],0
jz .Exit
call MakeText
btr dword [AfterKey],0
jc .0
cmp [CPUXPtr],0
jnz .1
mov eax,[_EIP]
mov [CodeAddr],rax
mov [CPUYPos],1
.0:
mov ebx,28 ;dY
mov ecx,[CurWidth] ;\dX
sub ecx,23 ;/
mov esi,1 ;X
mov edi,1 ;Y
mov edx,3F203F20h
call ClearWindow
call MakeText
jmp .2
.1: mov eax,[CPUXPtr]
mov [CPUYPos],eax
mov rsi,[AddrBuffer+(rax-1)*sizeof.dq]
call Decode
call ShowAddress
.2:
call ShowRegs
call ShowData
call ShowCursor
.Exit:
mov eax,PrintCmdLine
cmp [CmdLineActive],0
ifnz mov eax,DrawCmdLine
call eax
mov edx,Messages
push MSG_WIDTH
pop esi
xor ecx,ecx
@@:
mov eax,MinHeight-2-(MSG_HEIGHT-1)
add eax,ecx
mov [XPos],1
mov [YPos],al
mov [Color],8Fh
xor ebp,ebp
.Loop:
mov al,[rdx+rbp]
cmp al,8
jnz .NoColor
inc ebp
mov al,[rdx+rbp]
mov [Color],al
jmp .Next
.NoColor:
call PrintC
.Next:
inc ebp
cmp ebp,MSG_WIDTH
jnz .Loop
inc ecx
add edx,esi
cmp edx,Messages+MSG_WIDTH*MSG_HEIGHT
jb @B
mov esi,[PrgNamePtr]
mov edi,HeaderE-61
mov ecx,60
@@:
lodsb
stosb
or al,al
loopnz @B
mov eax,71
mov ebx,2
mov dl,1 ;CP866
mov ecx,HeaderN
cmp [DebuggeePID],0
jz @F
mov ecx,HeaderY
@@: int 40h
ret
;-----------------------------------------------------------------------------
ShowRegs:
call ShowGRegs
call ShowSRegs
call ShowXRegs
call ShowSlide
if 0
jmp ShowMode
else
ret
end if
;-----------------------------------------------------------------------------
PrintC: push rax rdx rdi rbx
mov bl,byte [CurWidth]
mov bh,byte [CurHeight]
cmp al,09h
jz .09
cmp al,0Ah
jz .0A
cmp al,0Dh
jz .0D
;
mov edi,eax
movzx eax,[YPos]
mul [CurWidth]
movzx edx,[XPos]
add edx,eax
mov eax,edi
mov edi,ConsoleDataPtr
;
mov ah,[Color]
mov [rdi+rdx*2],ax
inc [XPos]
cmp [XPos],bl
jb .Done
mov [XPos],0
jmp .0A
.0D: pop rbx rdi rdx rax
mov [XPos],ah
ret
.09: and [XPos],$F8
add [XPos],8
cmp [XPos],bl
jb .Done
sub [XPos],bl
.0A: inc [YPos]
cmp [YPos],bh
jb .Done
mov [YPos],0
.Done: pop rbx rdi rdx rax
ret
;-----------------------------------------------------------------------------
PrintS: push rax rdx
mov ah,[XPos]
.Loop: mov al,[rdx]
inc edx
test al,al
jz .Done
cmp al,08h
jz .1
call PrintC
jmp .Loop
.1: mov al,[rdx]
inc edx
test al,al
jz .Done
mov [Color],al
jmp .Loop
.Done: pop rdx rax
ret
;-----------------------------------------------------------------------------
ShowGRegs:
mov dl,5
mov [YPos],30
mov [XPos],dl
lea rbp,[_EAX]
call DisplayIfChanged
lea rbp,[_EBX]
call DisplayIfChanged
lea rbp,[_ECX]
call DisplayIfChanged
lea rbp,[_EDX]
call DisplayIfChanged
lea rbp,[_ESI]
call DisplayIfChanged
lea rbp,[_EDI]
call DisplayIfChanged
lea rbp,[_EBP]
call DisplayIfChanged
lea rbp,[_ESP]
DisplayIfChanged:
mov rax,[rbp]
cmp rax,[rbp+Plus]
mov [Color],30h
jz @F
mov [Color],3Fh
@@: call PrintEAX
inc [YPos]
mov [XPos],dl
ret
;-----------------------------------------------------------------------------
ShowXRegs:
mov dl,18
mov [YPos],30
mov [XPos],dl
lea rbp,[_EFL]
call DisplayIfChanged
lea rbp,[_EIP]
call DisplayIfChanged
ret
;-----------------------------------------------------------------------------
ShowSlide:
mov [XPos],1
mov [YPos],39
mov esi,[_EFL]
mov edi,[_EFL+Plus]
shl esi,14
shl edi,14
call .Show ; VM-flag
call .Show ; RF-flag
shl esi,1
shl edi,1
call .Show ; NT-flag
call .Show ; IOPL-flag
dec [XPos]
call .Show
call .Show ; OF-flag
call .Show ; DF-flag
call .Show ; IF-flag
call .Show ; TF-flag
call .Show ; SF-flag
inc [XPos]
call .Show ; ZF-flag
shl esi,1
shl edi,1
call .Show ; AF-flag
shl esi,1
shl edi,1
call .Show ; PF-flag
shl esi,1
shl edi,1
.Show: xor ax,ax
shl esi,1
adc al,'0'
shl edi,1
adc ah,'0'
cmp al,ah
mov [Color],30h
jz .S1
mov [Color],3Fh
.S1: call PrintC
inc [XPos]
ret
;-----------------------------------------------------------------------------
ShowSRegs:
mov dl,17
mov [YPos],32
mov eax,cs
call .DisplaySel
mov eax,ds
call .DisplaySel
mov eax,es
call .DisplaySel
mov eax,fs
call .DisplaySel
mov eax,gs
call .DisplaySel
mov eax,ss
.DisplaySel:
mov [Color],31h
mov [XPos],dl
call PrintAX
add [XPos],10
lar eax,ax
shr eax,8
call PrintAX
inc [YPos]
ret
;-----------------------------------------------------------------------------
ShowData:
mov bl,8
mov [YPos],41
mov [Color],30h
mov rsi,[DataAddr]
call ShowDataX
mov bl,3
xor ebp,ebp
mov edi,[_EDX]
mov [YPos],30
call ShowDataRDX
mov bl,3
xor ebp,ebp
mov edi,[_EBX]
mov [YPos],34
call ShowDataRBX
mov bl,3
xor ebp,ebp
mov edi,[_ESI]
mov [YPos],42
call ShowDataRSI
mov bl,3
xor ebp,ebp
mov edi,[_EDI]
mov [YPos],46
call ShowDataRDI
mov bl,3
xor ebp,ebp
mov edi,[_EBP]
mov [YPos],38
call ShowDataRBP
call ShowStack32
call ShowFPURegs
cmp [MMXType],0
ifnz call ShowMMXRegs
cmp [XMMType],0
ifnz call ShowXMMRegs
ret
;-----------------------------------------------------------------------------
ShowDataX:
.1: mov [Color],30h
mov [XPos],1
mov rax,rsi
call PrintEAX
mov al,':'
call PrintC
inc [XPos]
mov ecx,35 by 8
.2: mov [Color],30h
call GetDataByte
jc .3
lea eax,[Msg2ER]
xchg eax,edx
call PrintS
xchg eax,edx
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rsi
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
;-----------------------------------------------------------------------------
ShowDataRSI:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2SIP]
jns .01
lea edx,[Msg2SIM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,3 ;ds
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
ShowDataRDI:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2DIP]
jns .01
lea edx,[Msg2DIM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,0 ;es
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
ShowDataRBX:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2BXP]
jns .01
lea edx,[Msg2BXM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,3 ;ds
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
;-----------------------------------------------------------------------------
ShowDataRDX:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2DXP]
jns .01
lea edx,[Msg2DXM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,3 ;ds
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
;-----------------------------------------------------------------------------
ShowDataRBP:
.1: mov eax,[CurWidth]
sub eax,29+16
mov [XPos],al
mov rax,rbp
test rbp,rbp
lea edx,[Msg2BPP]
jns .01
lea edx,[Msg2BPM]
neg rax
.01: call PrintS
call PrintAL
mov al,']'
call PrintC
mov al,32
test rbp,rbp
jnz .03
mov al,10h
.03: call PrintC
inc [XPos]
.04: mov ecx,[CurWidth]
sub ecx,5+5
shl ecx,8
mov cl,8
.2: lea rsi,[rdi+rbp]
mov al,2 ;ss
call GetDataByte
jc .3
lea edx,[Msg2ER]
call PrintS
mov al,'?'
jmp .5
.3: call PrintAL
test al,al
jz .4
cmp al,08h
jz .4
cmp al,09h
jz .4
cmp al,0Ah
jz .4
cmp al,0Dh
jnz .5
.4: mov al,'.'
.5: xchg [XPos],ch
call PrintC
xchg [XPos],ch
inc [XPos]
inc rbp
dec cl
jnz .2
inc [YPos]
dec bl
jnz .1
ret
;-----------------------------------------------------------------------------
GetSeg: mov edx,TDS
cmp [Inst.DefSeg],VSS
ifz mov edx,TSS
mov al,[Inst.CurSeg]
or al,al
jz .SkipSegm
cmp al,[Inst.DefSeg]
jz .SkipSegm
mov dx,[Inst.SegmName]
.SkipSegm:
mov dx,[rdx+Names]
ret
;-----------------------------------------------------------------------------
GetSegm:mov dx,TDS
cmp [Inst.DefSeg],VSS
ifz mov dx,TSS
mov al,[Inst.CurSeg]
or al,al
jz @F
cmp al,[Inst.DefSeg]
jz @F
mov dx,[Inst.SegmName]
@@:
mov al,0
cmp dx,TES
jz @F
mov al,1
cmp dx,TCS
jz @F
mov al,2
cmp dx,TSS
jz @F
mov al,3
cmp dx,TDS
jz @F
mov al,4
cmp dx,TFS
jz @F
mov al,5
@@:
ret
;-----------------------------------------------------------------------------
GetMemAddress:
;
xor ebx,ebx
mov ecx,1
;
movzx eax,[Inst.Scale]
cmp al,-1
jz @F
mov cl,[eax+AnScale]
@@:
movzx eax,[Inst.Base]
cmp al,-1
jz @F
mov eax,[rax*4+RegVTab]
mov rax,[rax]
call Address2Reg
add rbx,rax
@@:
movzx eax,[Inst.Indx]
cmp al,-1
jz @F
mov eax,[rax*4+RegVTab]
mov rax,[rax]
call Address2Reg
mul rcx
add rbx,rax
@@:
cmp [Inst.DispSize],0
jz @F
mov rax,[Inst.Disp]
call Address2Reg
add rbx,rax
@@:
mov rax,rbx
call Address2Reg
mov rbx,rax
ret
;-----------------------------------------------------------------------------
ShowAddress:
;
mov [Color],3Fh
mov [XPos],15
mov [YPos],ch
mov al,0xCD
mov ecx,[CurWidth]
sub ecx,21+16+1
.LoopX: call PrintC
loop .LoopX
;
mov al,[Inst.Arg1.Mem]
or al,[Inst.Arg2.Mem]
or al,[Inst.Arg3.Mem]
or al,[Inst.Arg4.Mem]
or al,[Inst.Arg5.Mem]
ifz ret
;
call GetSeg
mov [AddressStr],dx
;
call GetMemAddress
if %B=64
rol rax,32
mov edi,AddressStr+3
call MakeHex
rol rax,32
mov edi,AddressStr+3+8
call MakeHex
else
mov edi,AddressStr+3
call MakeHex
end if
mov edi,AddressFin
movzx edx,[Inst.RandSize]
and dl,7Fh
movzx ebp,[rdx*2+RndSize+0]
movzx ecx,[rdx*2+RndSize+1]
jrcxz .Exit
lea rsi,[rbx+rcx]
;
cmp edx,3
jnz @F
cmp [Inst.Point],0
jz @F
mov bp,2+1
mov cx,2+2
@@:
;
.Loop:
dec rsi
sub ebp,1
jnz @F
mov [rdi],byte ':'
inc edi
@@:
mov [rdi],word '--'
call GetSegm
call GetDataByte
jnc @F
movzx eax,al
mov ax,[rax*2+HexString]
mov [rdi],ax
@@:
add edi,2
loop .Loop
.Exit:
mov [rdi],word 'h'
sub edi,AddressStr
mov eax,[CurWidth]
sub eax,24
sub eax,edi
ifc ret
mov [XPos],al
mov [YPos],0
mov [Color],3Fh
mov edx,AddressStr
jmp PrintS
;-----------------------------------------------------------------------------
Address2Reg:
cmp [Inst.Address],2
jz @F
cmp [Inst.Address],1
mov eax,eax
jz @F
movzx eax,ax
@@:
ret
;-----------------------------------------------------------------------------
sglobal
if %B=32
AddressStr: db '??:xxxxxxxx = '
AddressFin: db 64*2+2 dup 0
else
AddressStr: db '??:xxxxxxxxxxxxxxxx = '
AddressFin db 64*2+2 dup 0
end if
endg
;-----------------------------------------------------------------------------
iglobal
RndSize db 0,0 ;NULL
db 0,1 ;TWORD
db 0,2 ;SWORD
db 0,4 ;DWORD
db 0,8 ;QWORD
db 0,16 ;XWORD
db 0,32 ;YWORD
db 0,52 ;ZWORD -> 64 too large
db 2+1,4+2;FWORD
db 2+1,8+2;TWORD
AnScale db 1,2,4,8
endg
;-----------------------------------------------------------------------------
ClearWindow:
mov ebp,[CurWidth]
mov eax,edi
imul eax,ebp
add eax,eax
lea edi,[rax+rsi*2]
add edi,ConsoleDataPtr
mov eax,edx
lea edx,[rcx*2]
.Loop: push rcx
shr ecx,1
rep stosd
adc cl,cl
rep stosw
pop rcx
sub esi,edx
sub edi,edx
lea esi,[rsi+rbp*2]
lea edi,[rdi+rbp*2]
dec ebx
jnz .Loop
ret
;-----------------------------------------------------------------------------
ShowStack32:
mov [YPos],28
mov [Color],30h
mov cl,28
mov edi,[_ESP]
add rdi,[StckAddr]
.1: mov rax,rdi
sub rax,[_ESP]
mov edx,Msg3SPP
jns .2
neg rax
mov edx,Msg3SPM
.2: mov ebx,[CurWidth]
sub ebx,21
mov [XPos],bl
call PrintS
call PrintAX
mov al,']'
call PrintC
.20:
cmp edi,[_ESP]
mov al,10h
jz .3
cmp edi,[_EBP]
mov al,'>'
jz .3
mov al,20h
.3: call PrintC
lea rsi,[rdi+3]
rept 3
{
call GetDataByte
dec rsi
shl rax,8
}
call GetDataByte
add rdi,4
call PrintEAX
;lea edx,[Spaces32+6]
;call PrintS
dec [YPos]
dec cl
jnz .1
cmp [CurrentWindow],3
jz ShowAddrStk
ret
ShowAddrStk:
mov eax,[CurWidth]
sub eax,51-23-9
mov [XPos],al
mov [YPos],60-2-9+10
mov [Color],3Fh
mov rax,[StckAddr]
add eax,[_ESP]
call PrintEAX
add [XPos],3
mov rsi,rax
call GetDataByte
jc PrintAL
lea edx,[Msg2ER]
jmp PrintS
;-----------------------------------------------------------------------------
FindCodeUp:
mov rax,[AddrBuffer]
sub rax,16 ; average opcode length
.1: inc rax
mov rbx,rax
mov rsi,rax
.2: mov rsi,rbx
mov rdx,rbx
call Decode
cmp rbx,rsi
ja .Done
mov rbx,rsi
sub rsi,[AddrBuffer]
jb .2
.Done: mov rax,rdx
ret
;-----------------------------------------------------------------------------
CPUWindow:
cmp ah,0x0F
jz WindowSwitch
cmp ah,0x3B ; F1 - Toggle Show
jz ToggleShow
cmp ah,0x3C ; F2 - Toggle BP
jz ToggleBP
cmp ah,0x3D ; F3 - Return To
jz ReturnTo
cmp ah,0x3E ; F4 - Here
jz ComeHere
cmp ah,0x40 ; F6 - New EIP
jz NewAddress
cmp ah,0x41 ; F7 - Trace
jz F7
cmp ah,0x42 ; F8 - Step over
jz F8
cmp ah,0x43 ; F9 - Proceed
jz Proceed
cmp ah,0x44 ; F10 - Jump over
jz JumpOver
cmp al,0xB1
jz CPUDn
cmp al,0xB2
jz CPUUp
cmp al,0xB4
jz CPUHome
cmp al,0xB7
jz CPUPgDn
cmp al,0xB8
jz CPUPgUp
cmp ah,0x4B
jz CPULeft
cmp ah,0x4D
jz CPURight
cmp ah,0xE
jz CPUGoToMem
;
cmp al,'a'
jb .Skip1
cmp al,'z'
jbe DoCommandLine
.Skip1:
;
cmp al,'A'
jb .Skip2
cmp al,'Z'
jbe DoCommandLine
.Skip2:
;
jmp WaitEvent
RegWindow:
cmp ah,0x0F
jz WindowSwitch
cmp ah,0x01
jz SwitchCPU
cmp ah,0x3B ; F1 - Toggle Show
jz ToggleShow
;
cmp al,0xB1 ; dn
jz RegDn
cmp al,0xB2 ; up
jz RegUp
cmp al,0xB4 ; home
jz RegHome
cmp al,0xB5 ; end
jz RegEnd
cmp ah,0x4B ; left
jz RegLeft
cmp ah,0x4D ; right
jz RegRight
cmp al,'+' ; '+'
jz RegIncR
cmp al,'-' ; '-'
jz RegDecR
cmp al,'*' ; '*'
jz RegNot
cmp al,'/' ; '/'
jz RegRes
cmp ah,0xE ; BackSpace - GoTo MemAddr
jz RegGoToMem
cmp ah,0x39 ; Space
jz RegXor
;
cmp al,'a'
jb .Skip1
cmp al,'z'
jbe DoCommandLine
.Skip1:
;
cmp al,'A'
jb .Skip2
cmp al,'Z'
jbe DoCommandLine
.Skip2:
;
jmp WaitEvent
MemWindow:
cmp ah,0x0F
jz WindowSwitch
cmp ah,0x01
jz SwitchCPU
cmp ah,0x3B ; F1 - Toggle Show
jz ToggleShow
;
cmp al,0xB1 ; down
jz MemDn
cmp al,0xB2 ; up
jz MemUp
cmp ah,0x4B ; left
jz MemLeft
cmp ah,0x4D ; right
jz MemRight
cmp al,0xB4 ; home
jz MemHome
cmp al,0xB7 ; page-dn
jz MemPageDn
cmp al,0xB8 ; page-up
jz MemPageUp
;
cmp al,'+'
jz MemIncB
cmp al,'-'
jz MemDecB
cmp al,'*'
jz MemNotB
cmp al,'/'
jz MemResB
;
cmp al,'a'
jb .Skip1
cmp al,'z'
jbe DoCommandLine
.Skip1:
;
cmp al,'A'
jb .Skip2
cmp al,'Z'
jbe DoCommandLine
.Skip2:
;
jmp WaitEvent
StkWindow:
cmp ah,0x0F
jz WindowSwitch
cmp ah,0x01
jz SwitchCPU
cmp ah,0x3B ; F1 - Toggle Show
jz ToggleShow
;
cmp al,0xB1 ; dn
jz StkDn
cmp al,0xB2 ; up
jz StkUp
cmp al,0xB4 ; home
jz StkHome
cmp al,0xB7 ; page-dn
jz StkPgDn
cmp al,0xB8 ; page-up
jz StkPgUp
cmp al,'+' ; '+'
jz StkIncV
cmp al,'-' ; '-'
jz StkDecV
cmp al,'*' ; '*'
jz StkNotV
cmp al,'/' ; '/'
jz StkResV
cmp al,0xE ; BackSpace - GoTo MemAddr
jz StkGoToMem
;
cmp al,'a'
jb .Skip1
cmp al,'z'
jbe DoCommandLine
.Skip1:
;
cmp al,'A'
jb .Skip2
cmp al,'Z'
jbe DoCommandLine
.Skip2:
;
jmp WaitEvent
;-----------------------------------------------------------------------------
DoCommandLine:
mov [CmdLineActive],1
jmp GetCommandLine
;-----------------------------------------------------------------------------
Proceed:call GoOn
jmp WaitEvent
;-----------------------------------------------------------------------------
SwitchCPU:
and [CurrentWindow],0
jmp WinSwitch
;-----------------------------------------------------------------------------
ToggleShow:
xor [ShowNames],-1
jmp CPUCommon
;-----------------------------------------------------------------------------
StkUp: mov eax,2
cmp [CodeType],16
je .1
mov eax,4
cmp [CodeType],32
je .1
mov eax,8
.1:
add [StckAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
StkDn: mov eax,2
cmp [CodeType],16
je .1
mov eax,4
cmp [CodeType],32
je .1
mov eax,8
.1:
sub [StckAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
StkPgUp:mov eax,2*4
cmp [CodeType],16
je .1
mov eax,4*4
cmp [CodeType],32
je .1
mov eax,8*4
.1:
add [StckAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
StkPgDn:mov eax,2*4
cmp [CodeType],16
je .1
mov eax,4*4
cmp [CodeType],32
je .1
mov eax,8*4
.1:
sub [StckAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
StkHome:
and [StckAddr],0
StkCommon:
jmp CPUCommon
;-----------------------------------------------------------------------------
StkGetAddress:
mov rax,[StckAddr]
add eax,[_ESP]
ret
;-----------------------------------------------------------------------------
StkIncV:call StkGetAddress
mov rsi,rax
mov rdi,rax
call SafeLoadDD
inc rax
call SafeStoreDD
jmp StkCommon
;-----------------------------------------------------------------------------
StkDecV:call StkGetAddress
mov rsi,rax
mov rdi,rax
call SafeLoadDD
dec rax
call SafeStoreDD
jmp StkCommon
;-----------------------------------------------------------------------------
StkNotV:call StkGetAddress
mov rsi,rax
mov rdi,rax
call SafeLoadDD
not rax
call SafeStoreDD
jmp StkCommon
;-----------------------------------------------------------------------------
StkResV:call StkGetAddress
mov rdi,rax
xor eax,eax
call SafeStoreDD
jmp StkCommon
;-----------------------------------------------------------------------------
StkGoToMem:
call StkGetAddress
mov [DataAddr],rax
jmp StkCommon
;-----------------------------------------------------------------------------
RegUp: mov ebp,[RegXPtr]
dec ebp
jns RegCommon
jmp WaitEvent
;-----------------------------------------------------------------------------
RegDn: mov ebp,[RegXPtr]
inc ebp
cmp ebp,17
jb RegCommon
jmp WaitEvent
;-----------------------------------------------------------------------------
RegLeft:
mov ebp,[RegXPtr]
sub ebp,8
jns RegCommon
xor ebp,ebp
jmp RegCommon
;-----------------------------------------------------------------------------
RegRight:
mov ebp,[RegXPtr]
add ebp,8
cmp ebp,17
jb RegCommon
jmp WaitEvent
;-----------------------------------------------------------------------------
RegHome:xor ebp,ebp
jmp RegCommon
;-----------------------------------------------------------------------------
RegEnd: mov ebp,16
jmp RegCommon
;-----------------------------------------------------------------------------
RegXor: mov ebp,[RegXPtr]
cmp ebp,17-8
jae RegIncR.0
jmp WaitEvent
;-----------------------------------------------------------------------------
RegIncR:mov ebp,[RegXPtr]
cmp ebp,17-8
jb .1
.0: mov eax,[RegRTab+rbp*4]
xor [_EFL],eax
jmp RegCommon
.1: mov eax,[RegRTab+rbp*4]
inc dword [rax]
jmp RegCommon
;-----------------------------------------------------------------------------
RegDecR:mov ebp,[RegXPtr]
cmp ebp,17-8
jb .1
mov eax,[RegRTab+rbp*4]
xor [_EFL],eax
jmp RegCommon
.1: mov eax,[RegRTab+rbp*4]
dec dword [rax]
jmp RegCommon
;-----------------------------------------------------------------------------
RegRes: mov ebp,[RegXPtr]
cmp ebp,17-8
jb .1
mov eax,[RegRTab+rbp*4]
not eax
and [_EFL],eax
jmp RegCommon
.1: mov eax,[RegRTab+rbp*4]
and dword [rax],0
jmp RegCommon
;-----------------------------------------------------------------------------
RegNot: mov ebp,[RegXPtr]
cmp ebp,17-8
jb .1
mov eax,[RegRTab+rbp*4]
xor [_EFL],eax
jmp RegCommon
.1: mov eax,[RegRTab+rbp*4]
not dword [rax]
;jmp RegCommon
RegCommon:
mov [RegXPtr],ebp
mov eax,RegXTab
movzx eax,byte [rax+rbp]
mov [RegXPos],eax
mov eax,RegYTab
movzx eax,byte [rax+rbp]
mov [RegYPos],eax
mov eax,RegLTab
movzx eax,byte [rax+rbp]
mov [RegLDat],eax
call SetContext
jmp CPUCommon
;-----------------------------------------------------------------------------
RegGoToMem:
mov ebp,[RegXPtr]
cmp ebp,9
jae GoToMemRAX.Next
mov eax,[RegRTab+rbp*4]
mov rax,[rax]
GoToMemRAX:
mov [DataAddr],rax
.Next: jmp CPUCommon
;-----------------------------------------------------------------------------
MemUp: dec [MemYPos]
cmp [MemYPos],40
ja MemCommon
inc [MemYPos]
sub [DataAddr],8
jmp MemCommon
;-----------------------------------------------------------------------------
MemDn: inc [MemYPos]
cmp [MemYPos],49
jb MemCommon
dec [MemYPos]
add [DataAddr],8
jmp MemCommon
;-----------------------------------------------------------------------------
MemPageUp:
sub [DataAddr],8*8
jmp MemCommon
;-----------------------------------------------------------------------------
MemPageDn:
add [DataAddr],8*8
jmp MemCommon
;-----------------------------------------------------------------------------
MemLeft:sub [MemXPos],3
cmp [MemXPos],11-3
ja MemCommon
add [MemXPos],3*8
jmp MemUp
;-----------------------------------------------------------------------------
MemRight:
add [MemXPos],3
cmp [MemXPos],11-1+3*8
jb MemCommon
sub [MemXPos],3*8
jmp MemDn
;-----------------------------------------------------------------------------
MemHome:and [DataAddr],0
mov [MemXPos],11
MemCommon:
jmp CPUCommon
;-----------------------------------------------------------------------------
MemGetAddress:
xor edx,edx
mov ebx,3
mov eax,[MemXPos]
sub al,11
div ebx
add rax,[DataAddr]
mov ecx,[MemYPos]
sub cl,41
add ecx,ecx
lea rax,[rax+rcx*8]
ret
;-----------------------------------------------------------------------------
MemIncB:call MemGetAddress
mov rsi,rax
mov rdi,rax
call GetDataByte
inc al
call SafeStore
jmp MemCommon
;-----------------------------------------------------------------------------
MemDecB:call MemGetAddress
mov rsi,rax
mov rdi,rax
call GetDataByte
dec al
call SafeStore
jmp MemCommon
;-----------------------------------------------------------------------------
MemNotB:call MemGetAddress
mov rsi,rax
mov rdi,rax
call GetDataByte
not al
call SafeStore
jmp MemCommon
;-----------------------------------------------------------------------------
MemResB:call MemGetAddress
mov rdi,rax
mov al,0
call SafeStore
jmp MemCommon
;-----------------------------------------------------------------------------
ToggleBP:
mov eax,[CPUYPos]
mov rax,[AddrBuffer+(rax-1)*sizeof.dq]
push rax
call FindBreakPoint
mov edx,eax
inc eax
pop rax
jz .NotFound
mov eax,edx
call ClearBreakPoint
jmp .Ret
.NotFound:
mov bl,1
call AddBreakPoint
jnc .Ret
mov esi,aBreakpointLimitExceeded
.SayErr:
call PutMessage
.Ret:
jmp CPUCommon
;-----------------------------------------------------------------------------
ReturnTo:
mov ecx,1024 ; try 1024 instructions
mov esi,[_EIP]
.0: mov ebp,esi
call Decode
mov eax,[BufferO+35+SkipAddr]
mov ebx,'iret'
cmp eax,ebx ; check for IRET
jz .1
and eax,00FFFFFFh
mov ebx,00746572h ;' ter'
cmp eax,ebx ; check for RET
jz .1
mov ebx,00706D6Ah ;' pmj'
cmp eax,ebx ; check for JMP
jz .1
loop .0
jmp WaitEvent
.1: call OnResume.Jmp
jmp WaitEvent
;-----------------------------------------------------------------------------
JumpOver:
mov esi,[_EIP]
call Decode
mov eax,[BufferO+35+SkipAddr]
cmp eax,'call' ; check for CALL
jz .DoIt
cmp eax,'loop' ; check for LOOP..
jz .DoIt
and eax,00FFFFFFh
mov ebx,00746E69h ;' tni'
cmp eax,ebx ; check for INT
jz .DoIt
mov ebx,00706572h ;' per'
cmp eax,ebx ; check for REP
jz .DoIt
mov ebx,00706D6Ah ;' pmj'
cmp eax,ebx ; check for JMP
jz .DoIt
mov ebx,006F6E6Ah ;' onj'
cmp eax,ebx ; check for JNO
jz .DoIt
mov ebx,0065616Ah ;' eaj'
cmp eax,ebx ; check for JAE
jz .DoIt
mov ebx,007A6E6Ah ;' znj'
cmp eax,ebx ; check for JNZ
jz .DoIt
mov ebx,0065626Ah ;' ebj'
cmp eax,ebx ; check for JBE
jz .DoIt
mov ebx,00736E6Ah ;' snj'
mov ebx,00736E6Ah ;' snj'
cmp eax,ebx ; check for JNS
jz .DoIt
mov ebx,0065706Ah ;' epj'
cmp eax,ebx ; check for JPE
jz .DoIt
mov ebx,006F706Ah ;' opj'
cmp eax,ebx ; check for JPO
jz .DoIt
mov ebx,0065676Ah ;' egj'
cmp eax,ebx ; check for JGE
jz .DoIt
mov ebx,00656C6Ah ;' elj'
cmp eax,ebx ; check for JLE
jz .DoIt
and eax,0000FFFFh
mov ebx,00006F6Ah ;' oj'
cmp eax,ebx ; check for JO
jz .DoIt
mov ebx,0000626Ah ;' bj'
cmp eax,ebx ; check for JB
jz .DoIt
mov ebx,00007A6Ah ;' zj'
cmp eax,ebx ; check for JZ
jz .DoIt
mov ebx,0000616Ah ;' aj'
cmp eax,ebx ; check for JA
jz .DoIt
mov ebx,0000736Ah ;' sj'
cmp eax,ebx ; check for JS
jz .DoIt
mov ebx,00006C6Ah ;' lj'
cmp eax,ebx ; check for JL
jz .DoIt
mov ebx,0000676Ah ;' gj'
cmp eax,ebx ; check for JG
jz .DoIt
jmp F7
.DoIt: mov ebp,esi
call OnResume.Jmp
jmp WaitEvent
;-----------------------------------------------------------------------------
ComeHere:
mov eax,[CPUYPos]
mov rax,[AddrBuffer+(rax-1)*sizeof.dq]
push eax
call FindEnabledBreakPoint
pop eax
jz .GoOn
mov bl,5 ; valid enabled one-shot
call AddBreakPoint
jnc .GoOn
mov esi,aBreakpointLimitExceeded
call PutMessage
jmp WaitEvent
.GoOn: call GoOn
jmp WaitEvent
;-----------------------------------------------------------------------------
NewAddress:
mov eax,[CPUYPos]
mov rax,[AddrBuffer+(rax-1)*sizeof.dq]
mov [_EIP],eax
call SetContext
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUUp: cmp [CPUYPos],1
jbe .1
dec [CPUYPos]
mov ebx,[CPUYPos]
mov rsi,[AddrBuffer+(rbx-1)*sizeof.dq]
call Decode
jmp CPUCommon
.1: call FindCodeUp
mov [CodeAddr],rax
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUDn: cmp [CPUYPos],28
jae .1
inc [CPUYPos]
mov ebx,[CPUYPos]
mov rsi,[AddrBuffer+(rbx-1)*sizeof.dq]
call Decode
jmp CPUCommon
.1: mov rax,[AddrBuffer+sizeof.dq]
mov [CodeAddr],rax
jmp CPUCommon
;-----------------------------------------------------------------------------
CPULeft:dec [CodeAddr]
jmp CPUCommon
;-----------------------------------------------------------------------------
CPURight:
inc [CodeAddr]
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUPgUp:mov ecx,28
.1: call FindCodeUp
mov [AddrBuffer],rax
loop .1
mov [CodeAddr],rax
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUPgDn:mov rsi,[AddrBuffer+27*sizeof.dq]
call Decode
mov [CodeAddr],rsi
jmp CPUCommon
;-----------------------------------------------------------------------------
CPUHome:mov eax,[_EIP]
mov [CodeAddr],rax
mov [CPUYPos],1
CPUCommon:
mov [AfterKey],1
call ShowImage
jmp WaitEvent
;-----------------------------------------------------------------------------
SafeLoadDD:
push rcx rsi
mov ecx,4
.Loop: call GetDataByte
ror rax,8
inc rsi
loop .Loop
pop rsi rcx
ret
;-----------------------------------------------------------------------------
CPUGoToMem:
mov eax,[CPUYPos]
mov rsi,[(rax-1)*sizeof.dq+AddrBuffer]
call Decode
mov al,[Inst.Arg1.Mem]
or al,[Inst.Arg2.Mem]
or al,[Inst.Arg3.Mem]
or al,[Inst.Arg4.Mem]
or al,[Inst.Arg5.Mem]
jnz .Mem
;
mov rdx,[Inst.Arg1.Imm]
cmp [Inst.IsAddress],0 ;relative
jnz .Ofs
cmp [Inst.MemSeparator],0
jz .NoFar
mov ax,[Inst.Point]
cmp ax,TDWORD
jz .DW2
cmp ax,TFWORD
jz .FW2
.NoFar:
jmp WaitEvent
.DW2:
sub rsi,4
call SafeLoadDD
movzx edx,ax
shr eax,16
jmp .All
.FW2:
sub rsi,6
call SafeLoadDD
mov edx,eax
add rsi,4
call SafeLoadDD
movzx eax,ax
jmp .All
;
.Mem:
;
cmp [Inst.Point],0
jz .Ptr
movzx edx,[Inst.RandSize]
and dl,7Fh
push rdx
call GetLinAddr
pop rdx
cmp dl,3
jz .DW
cmp dl,8
jz .FW
cmp dl,9
jz .TW
jmp WaitEvent
.DW:
mov rsi,rax
call SafeLoadDD
movzx edx,ax
shr eax,16
jmp .All
.FW:
mov rsi,rax
call SafeLoadDD
mov edx,eax
add rsi,4
call SafeLoadDD
movzx eax,ax
jmp .All
.TW:
mov rsi,rax
call SafeLoadDD
mov rdx,rax
add rsi,8
call SafeLoadDD
movzx eax,ax
.All:
;verr eax
;jnz .Err
;mov [Reg.CS],eax
;call SelectorInit
.Ofs:
mov [CodeAddr],rdx
mov [CPUYPos],1
if 0
call RepaintText
jmp ShowRegs
else
jmp CPUCommon
end if
.Err:
jmp WaitEvent
.Ptr:
call GetMemAddress
jmp GoToMemRAX
;-----------------------------------------------------------------------------
GetLinAddr:
call GetSeg
mov [AddressStr],dx
;
xor ebx,ebx
mov ecx,1
;
movzx eax,[Inst.Scale]
cmp al,-1
jz @F
mov cl,[rax+AnScale]
@@:
movzx eax,[Inst.Base]
cmp al,-1
jz @F
mov eax,[rax*4+RegVTab]
mov rax,[rax]
call Address2Reg
add rbx,rax
@@:
movzx eax,[Inst.Indx]
cmp al,-1
jz @F
mov eax,[rax*4+RegVTab]
mov rax,[rax]
call Address2Reg
mul rcx
add rbx,rax
@@:
cmp [Inst.DispSize],0
jz @F
mov rax,[Inst.Disp]
call Address2Reg
add rbx,rax
@@:
mov rax,rbx
call Address2Reg
mov rbx,rax
AddSeg:
if 0
call GetSegm
movzx eax,al
mov rax,[rax*sizeof.dq+ESBase]
add rax,rbx
end if
ret
;-----------------------------------------------------------------------------
ShowFPURegs:
if 1
mov ah,3Fh
xor ecx,ecx
mov edi,ConsoleDataPtr
mov al, '<27>'
imul edx,[CurWidth],49+1
sub edx,31
call DrawChar
mov al, '<27>'
mov cl,28
call DrawLine
imul edx,[CurWidth],50+1
sub edx,31
mov al, '<27>'
mov cl,9
call DrawDown
mov al, '<27>'
imul edx,[CurWidth],55
dec edx
call DrawChar
if 0
mov al, '<27>'
imul edx,[CurWidth],49+1+10
sub edx,31
call DrawChar
mov al, '<27>'
mov cl,28+1
call DrawLine
end if
end if
mov ebp,[CurWidth]
lea eax,[ebp-28]
mov [Color],3Ah
mov [XPos],al
mov [YPos],49
lea edx,[Msg10F]
call PrintS
mov [Color],30h
lea eax,[ebp-30]
mov [XPos],al
mov [YPos],50
lea edx,[Msg11F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg12F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg13F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg14F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg15F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg16F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg17F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg18F]
call PrintS
lea eax,[ebp-30]
mov [XPos],al
inc [YPos]
lea edx,[Msg19F]
call PrintS
fninit ; reinitialize FPU
.1: lea eax,[ebp-26]
mov [XPos],al
mov [YPos],50
xor edi,edi ; displacement
mov bl,8 ; counter
movzx eax,word [_FTW]
mov [Temp],eax
movzx eax,[_FSW]
shr eax,11
and eax,07h
lea ecx,[rax*2]
ror word [Temp],cl
.Loop: ;
mov [Color],30h
mov eax,dword [_ST0+rdi]
cmp eax,dword [_ST0+rdi+Plus]
jnz .NotEQ
mov eax,dword [_ST0+rdi+4]
cmp eax,dword [_ST0+rdi+Plus+4]
jnz .NotEQ
mov ax,word [_ST0+rdi+8]
cmp ax,word [_ST0+rdi+Plus+8]
jz .YeaEQ
.NotEQ: mov [Color],3Fh
.YeaEQ:
mov eax,[Temp]
ror word [Temp],02h
and eax,0003h
cmp eax,0003h
jz .__ftoa_empty
fld tbyte [_ST0+rdi]
fxam
fstsw ax
mov al,ah
; C= 3 210
and al,01000101b
jz .__ftoa_err ; unsupported number
cmp al,00000001b
jz .__ftoa_NaN ; NaN number
cmp al,00000101b
jz .__ftoa_inf ; infinity
cmp al,01000000b
jz .__ftoa_zero ; zero
cmp al,01000100b
jz .__ftoa_den ; denormal
cmp al,01000001b
jz .__ftoa_unu ; unused
cmp al,01000101b
jz .__ftoa_unu ; unused
mov eax,57
call _float2dec
add eax,17
mov edx,eax ; save exponent in edx
sub esp,12
fbstp tbyte [rsp]
mov cx,[rsp+8]
mov esi,[rsp+4]
mov ebp,[rsp+0]
add esp,12
mov bh,15
and ch,80h
mov al,'+'
jz .2
mov al,'-'
.2: call PrintC
call __ftoa_char
call PrintC
mov al,'.'
call PrintC
.3: call __ftoa_char
call PrintC
dec bh
jnz .3
mov al,'E'
call PrintC
test edx,edx
mov al,'+'
jns .4
mov al,'-'
neg edx
.4: call PrintC
mov bh,4
mov eax,edx
xor ebp,ebp
.5: mov ecx,10
xor edx,edx
idiv ecx
shl ebp,8
or ebp,edx
dec bh
jnz .5
mov bh,4
.6: mov eax,ebp
add al,30h
shr ebp,8
call PrintC
dec bh
jnz .6
.Next: add edi,16
mov eax,[CurWidth]
sub eax,26
mov [XPos],al
inc [YPos]
dec bl
jnz .Loop
mov eax,[CurWidth]
sub eax,27
mov [XPos],al
mov [Color],30h
mov ax,[_FCW] ; CW
cmp ax,[_FCW+Plus]
ifnz mov [Color],3Fh
call PrintAX
add [XPos],5
mov [Color],30h
mov ax,[_FSW] ; SW
cmp ax,[_FSW+Plus]
ifnz mov [Color],3Fh
call PrintAX
add [XPos],6
mov [Color],30h
mov ax,word [_FTW] ; Tag
cmp ax,word [_FTW+Plus]
ifnz mov [Color],3Fh
call PrintAX
fwait
ret
.__ftoa_err:
lea edx,[Msg1EF1]
jmp .__ftoa_
.__ftoa_NaN:
and ah,00000010h
mov al,'+'
jz .__ftoa_NaN_
mov al,'-'
.__ftoa_NaN_:
lea edx,[Msg1EF2]
mov [rdx],al
jmp .__ftoa_
.__ftoa_inf:
and ah,00000010h
mov al,'+'
jz .__ftoa_inf_
mov al,'-'
.__ftoa_inf_:
lea edx,[Msg1EF3]
mov [rdx],al
jmp .__ftoa_
.__ftoa_zero:
and ah,00000010h
mov al,'+'
jz .__ftoa_zero_
mov al,'-'
.__ftoa_zero_:
lea edx,[Msg1EF4]
mov [rdx],al
jmp .__ftoa_
.__ftoa_den:
and ah,00000010h
mov al,'+'
jz .__ftoa_den_
mov al,'-'
.__ftoa_den_:
lea edx,[Msg1EF5]
mov [rdx],al
jmp .__ftoa_
.__ftoa_unu:
lea edx,[Msg1EF6]
jmp .__ftoa_
.__ftoa_empty:
lea edx,[Msg1EF7]
.__ftoa_:
call PrintS
jmp .Next
__ftoa_char:
mov al,cl
shl ebp,1
rcl esi,1
rcl cl,1
shl ebp,1
rcl esi,1
rcl cl,1
shl ebp,1
rcl esi,1
rcl cl,1
shl ebp,1
rcl esi,1
rcl cl,1
shr al,4
add al,30h
ret
_float2dec:
sub esp,3*4
fstcw word [rsp]
mov word [rsp+2],03BFh
fldcw word [rsp+2]
mov [rsp+4],eax
fld st0
fxtract
fstp st0
fisubr dword [rsp+4]
fldl2t
fdivp st1,st0
frndint
fist dword [rsp+8]
call _exp10
fmulp st1,st0
fldcw word [rsp]
mov eax,[rsp+2*4]
add esp,3*4
neg eax
ret
_exp10: fldl2t
fmulp st1,st0
_exp2: sub esp,2*4
fstcw word [rsp]
mov word [rsp+2],03BFh
fldcw word [rsp+2]
fld st0
frndint
fxch
fsub st0,st1
ftst
fstsw word [rsp+4]
and byte [rsp+5],45h
cmp byte [rsp+5],01h
ja .Err
je .Neg
f2xm1
fld1
faddp st1,st0
fxch
fld1
fscale
fmulp st2,st0
fstp st0
jmp .Done
.Neg: fabs
f2xm1
fld1
faddp st1,st0
fxch
fld1
fscale
fdivrp st2,st0
fstp st0
.Done: fldcw word [rsp]
add esp,2*4
ret
.Err: fstp st0
fstp st0
fld1
jmp .Done
;-----------------------------------------------------------------------------
ShowMMXRegs:
if 1
mov ah,3Fh
xor ecx,ecx
mov edi,ConsoleDataPtr
mov al, '<27>'
imul edx,[CurWidth],49+1
sub edx,52
call DrawChar
imul edx,[CurWidth],50+1
sub edx,52
mov al, '<27>'
mov cl,9
call DrawDown
mov al, '<27>'
imul edx,[CurWidth],54
dec edx
call DrawChar
end if
mov ebx,[CurWidth]
mov bh,bl
sub bh,47
sub bl,51
mov [Color],3Ah
mov [XPos],bl
add [XPos],2
mov [YPos],49
lea edx,[MsgMMX]
call PrintS
mov [Color],30h
mov [XPos],bl
mov [YPos],50
lea edx,[MsgMM0]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM1]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM2]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM3]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM4]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM5]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM6]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgMM7]
call PrintS
mov [XPos],bl
inc [YPos]
lea edx,[MsgXMMX]
call PrintS
inc [XPos]
add edx,4
mov [Color],3Eh
call PrintS
mov [YPos],50
mov bl,8 ; counter
lea esi,[_MM0]
.Skip: lea ecx,[_MM0+Plus]
.Loop: mov [XPos],bh
mov [Color],30h
mov eax,[rsi+0]
cmp eax,[rcx+0]
jne @F
mov eax,[rsi+4]
cmp eax,[rcx+4]
je .@
@@: mov [Color],3Fh
.@: mov eax,[rsi+4]
call PrintEAX
mov eax,[rsi+0]
call PrintEAX
inc [YPos]
add esi,16
add ecx,16
dec bl
jnz .Loop
ret
;-----------------------------------------------------------------------------
ShowXMMRegs:
mov [Color],3Ah
mov [XPos],3
mov [YPos],49
lea edx,[MsgXMM]
call PrintS
mov [Color],30h
mov [XPos],1
mov [YPos],50
lea edx,[MsgXM0]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM1]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM2]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM3]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM4]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM5]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM6]
call PrintS
mov [XPos],1
inc [YPos]
lea edx,[MsgXM7]
call PrintS
mov [YPos],50
mov bl,8 ; counter
lea esi,[_XMM0]
.Skip: lea ecx,[_XMM0+Plus]
.Loop: mov [XPos],6
mov [Color],30h
mov eax,[rsi+4*0]
cmp eax,[rcx+4*0]
jne @F
mov eax,[rsi+4*1]
cmp eax,[rcx+4*1]
jne @F
mov eax,[rsi+4*2]
cmp eax,[rcx+4*2]
jne @F
mov eax,[rsi+4*3]
cmp eax,[rcx+4*3]
je .@
@@: mov [Color],3Fh
.@: mov eax,[rsi+4*3]
call PrintEAX
mov eax,[rsi+4*2]
call PrintEAX
mov eax,[rsi+4*1]
call PrintEAX
mov eax,[rsi+4*0]
call PrintEAX
inc [YPos]
add esi,16
add ecx,16
dec bl
jnz .Loop
mov [XPos],1
lea edx,[MsgXCSR]
call PrintS
mov [XPos],1+6+9
lea edx,[MsgMCSR]
call PrintS
mov [XPos],7
mov eax,[_MXCSR]
cmp eax,[_MXCSR+Plus]
mov [Color],30h
ifnz mov [Color],3Fh
call PrintEAX
mov [XPos],7+9+11
mov eax,[_MXCSRM]
cmp eax,[_MXCSRM+Plus]
mov [Color],30h
ifnz mov [Color],3Fh
call PrintEAX
ret
;-----------------------------------------------------------------------------
Msg10 db 'CPU Registers',0
;-----------------------------------------------------------------------------
Msg11 db 'EAX 00000000 EFL 00000000 ',0
Msg12 db 'EBX 00000000 EIP 00000000 ',0
Msg13 db 'ECX 00000000 CS 0000/00000000/0000 ',0
Msg14 db 'EDX 00000000 DS 0000/00000000/0000 ',0
Msg15 db 'ESI 00000000 ES 0000/00000000/0000 ',0
Msg16 db 'EDI 00000000 FS 0000/00000000/0000 ',0
Msg17 db 'EBP 00000000 GS 0000/00000000/0000 ',0
Msg18 db 'ESP 00000000 SS 0000/00000000/0000 ',0
Msg19 db 'V R N IO O D I T S Z A P C ',0
Msg20 db '0 0 0 00 0 0 0 0 0 0 0 0 0 ',0
;-----------------------------------------------------------------------------
Msg22 db '[ds:esi]',0
Msg23 db '[es:edi]',0
MsgX2 db '[ds:edx]',0
MsgX3 db '[ds:ebx]',0
MsgX4 db '[ss:ebp]',0
MsgX5 db '[ds:ecx]',0
;-----------------------------------------------------------------------------
Msg2SIP db '[esi+',0
Msg2SIM db '[esi-',0
Msg2DIP db '[edi+',0
Msg2DIM db '[edi-',0
Msg2BXP db '[ebx+',0
Msg2BXM db '[ebx-',0
Msg2DXP db '[edx+',0
Msg2DXM db '[edx-',0
Msg2BPP db '[ebp+',0
Msg2BPM db '[ebp-',0
Msg3SPP db '[esp+',0
Msg3SPM db '[esp-',0
Msg2ER db '--',0
;-----------------------------------------------------------------------------
Msg00 db 'CPU ',0
CPUTable \
dd '8086'
dd '186'
dd '286'
dd '386'
dd '486'
dd '586'
dd '686'
FPUTable \
db '/None',0,0,0
db '/8087',0,0,0
dd '/287',0
dd '/387',0
dd '/487',0
dd '/587',0
dd '/687',0
;-----------------------------------------------------------------------------
Msg21 db 'Memory',0
;-----------------------------------------------------------------------------
Msg30 db 'Stack',0
;-----------------------------------------------------------------------------
Msg3M db 'Messages',0
;-----------------------------------------------------------------------------
Msg40 db 'Address: ',8,3Fh,'00000000 ',8,3Ah,'=',8,3Fh,' 00h',0
;-----------------------------------------------------------------------------
Msg10F db 'FPU Registers',0
Msg11F db 'ST0',0
Msg12F db 'ST1',0
Msg13F db 'ST2',0
Msg14F db 'ST3',0
Msg15F db 'ST4',0
Msg16F db 'ST5',0
Msg17F db 'ST6',0
Msg18F db 'ST7',0
Msg19F db 'CW=0000 SW=0000 TAG=0000',0
;-----------------------------------------------------------------------------
MsgMMX db 'MMX Registers',0
MsgMM0 db 'MM0',0
MsgMM1 db 'MM1',0
MsgMM2 db 'MM2',0
MsgMM3 db 'MM3',0
MsgMM4 db 'MM4',0
MsgMM5 db 'MM5',0
MsgMM6 db 'MM6',0
MsgMM7 db 'MM7',0
;-----------------------------------------------------------------------------
MsgXMM db 'XMM Registers',0
MsgXM0 db 'XMM0',0
MsgXM1 db 'XMM1',0
MsgXM2 db 'XMM2',0
MsgXM3 db 'XMM3',0
MsgXM4 db 'XMM4',0
MsgXM5 db 'XMM5',0
MsgXM6 db 'XMM6',0
MsgXM7 db 'XMM7',0
;-----------------------------------------------------------------------------
Msg1EF1 db 'Unsupported ',0
Msg1EF2 db '+NaN ',0
Msg1EF3 db '+Infinity ',0
Msg1EF4 db '+0.0 ',0
Msg1EF5 db '+Denormal ',0
Msg1EF6 db 'Unused ',0
Msg1EF7 db 'Empty ',0
;-----------------------------------------------------------------------------
MsgXMMX db 'CPU',0,'GenuineIntel',0
;-----------------------------------------------------------------------------
MsgXCSR db 'MXCSR=',0
MsgMCSR db 'MXCSR_MASK=',0
;-----------------------------------------------------------------------------
Msg50 db 8,74h,'F1',8,70h,'-Show '
db 8,74h,'F2',8,70h,'-BreakPnt '
db 8,74h,'F3',8,70h,'-Return '
db 8,74h,'F4',8,70h,'-Here '
db 8,74h,'F5',8,70h,'-Screen '
db 8,74h,'F6',8,70h,'-New '
db 8,74h,'F7',8,70h,'-Trace '
db 8,74h,'F8',8,70h,'-Step '
db 8,74h,'F9',8,70h,'-Run '
db 8,74h,'F10',8,70h,'-Over '
db 0
;-----------------------------------------------------------------------------
even 4
RegVTab dd _EAX,_ECX,_EDX,_EBX,_ESP,_EBP,_ESI,_EDI,_EIP
RegRTab dd _EAX,_EBX,_ECX,_EDX,_ESI,_EDI,_EBP,_ESP,_EIP
dd 0800h,0400h,0200h,0080h,0040h,0010h,0004h,0001h
;-----------------------------------------------------------------------------
RegXTab db 1, 1, 1, 1, 1, 1, 1, 1, 14, 10,12,14,18, 21,23,25,27
RegYTab db 30,31,32,33,34,35,36,37, 31, 39,39,39,39, 39,39,39,39
RegLTab db 12,12,12,12,12,12,12,12, 12, 1, 1, 1, 1, 1, 1, 1, 1
;-----------------------------------------------------------------------------
CursorTab dd CPUCursor,RegCursor,MemCursor,StkCursor
WindowTab dd CPUWindow,RegWindow,MemWindow,StkWindow
;-----------------------------------------------------------------------------
HexBuf: db 8 dup 20h,0
;-----------------------------------------------------------------------------
XPos db 0
YPos db 0
Color db 7
;-----------------------------------------------------------------------------