205 lines
6.1 KiB
NASM
205 lines
6.1 KiB
NASM
;-----------------------------------------------------------------------------
|
|
;
|
|
; LOADFNS.386
|
|
;
|
|
; Copyright (c) 1991, 1995-Present Robert Collins
|
|
;
|
|
; You have my permission to copy and distribute this software for
|
|
; non-commercial purposes. Any commercial use of this software or
|
|
; source code is allowed, so long as the appropriate copyright
|
|
; attributions (to me) are intact, *AND* my email address is properly
|
|
; displayed.
|
|
;
|
|
; Basically, give me credit, where credit is due, and show my email
|
|
; address.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Robert R. Collins email: rcollins@x86.org
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
|
|
|
|
;-----------------------------------------------------------------------------
|
|
INT01: ; Int1 trap routine
|
|
;-----------------------------------------------------------------------------
|
|
; Interprets breakpoint type, and sets a flag
|
|
;-----------------------------------------------------------------------------
|
|
inc dx
|
|
push bp
|
|
mov bp,sp
|
|
mov buffer2[bx],cx
|
|
add bx,2
|
|
push eax
|
|
push ebx
|
|
push ecx
|
|
mov eax,dr6
|
|
mov ecx,eax
|
|
mov ebx,dr7
|
|
shr ebx,10h ; get length encodings
|
|
test ah,20h ; debug register access attempt?
|
|
jnz @DR_Attempt ; yep
|
|
shr al,1 ; DR0?
|
|
jc @DR0
|
|
shr al,1 ; DR1?
|
|
jc @DR1
|
|
shr al,1 ; DR2?
|
|
jc @DR2
|
|
@DR3: or si,8
|
|
and cl,not 8
|
|
test bh,30h ; code, or data?
|
|
jz @Fault
|
|
jmp short @Trap
|
|
@DR2: or si,4
|
|
and cl,not 4
|
|
test bh,03h ; code, or data?
|
|
jz @Fault
|
|
jmp short @Trap
|
|
@DR1: or si,2
|
|
and cl,not 2
|
|
test bl,30h ; code, or data?
|
|
jz @Fault
|
|
jmp short @Trap
|
|
@DR0: or si,1
|
|
and cl,not 1
|
|
test bl,03h ; code, or data?
|
|
jz @Fault
|
|
jmp short @Trap
|
|
@Fault: add word ptr [bp][2],1
|
|
mov dr6,ecx
|
|
@Trap: pop ecx
|
|
pop ebx
|
|
pop eax
|
|
pop bp
|
|
iret
|
|
|
|
@Dr_Attempt:
|
|
push bp
|
|
add word ptr [bp][2],3
|
|
pop bp
|
|
iret
|
|
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------------
|
|
Save_state proc near ; Save the machine state before LOADALL
|
|
;-----------------------------------------------------------------------------
|
|
push eax
|
|
push ds
|
|
mov si,0
|
|
mov di,offset Machine_State.GS_Desc
|
|
mov ax,5000h ; GS descriptor
|
|
mov ds,ax
|
|
mov ebx,05050505h
|
|
movsd
|
|
mov dword ptr [si-4],ebx
|
|
|
|
sub ax,1000h ; FS descriptor
|
|
sub ebx,01010101h
|
|
mov si,0
|
|
add di,8
|
|
mov ds,ax
|
|
movsd
|
|
mov dword ptr [si-4],ebx
|
|
sub ax,2000h ; DS descriptor
|
|
sub ebx,02020202h
|
|
mov si,0
|
|
add di,8
|
|
mov ds,ax
|
|
movsd
|
|
mov dword ptr [si-4],ebx
|
|
add ax,4000h ; SS descriptor
|
|
add ebx,04040404h
|
|
mov si,0
|
|
add di,8
|
|
mov ds,ax
|
|
movsd
|
|
mov dword ptr [si-4],ebx
|
|
sub ax,3000h ; ES descriptor
|
|
sub ebx,03030303h
|
|
mov si,0
|
|
add di,14h
|
|
mov ds,ax
|
|
movsd
|
|
mov dword ptr [si-4],ebx
|
|
pop ds
|
|
|
|
mov eax,cr0
|
|
mov Machine_State._CR0,eax
|
|
pushfd
|
|
pop eax
|
|
mov Machine_State._Eflags,eax
|
|
pop eax
|
|
mov Machine_State._EDI,edi
|
|
mov Machine_State._ESI,esi
|
|
mov Machine_State._EBP,ebp
|
|
mov Machine_State._EBX,ebx
|
|
mov Machine_State._EDX,edx
|
|
mov Machine_State._ECX,ecx
|
|
mov Machine_State._EAX,eax
|
|
mov ax,gs
|
|
movzx eax,ax
|
|
mov Machine_State._GS,eax
|
|
mov ax,fs
|
|
mov Machine_State._FS,eax
|
|
mov ax,ds
|
|
mov Machine_State._DS,eax
|
|
mov ax,es
|
|
mov Machine_State._ES,eax
|
|
ret
|
|
Save_state endp
|
|
|
|
|
|
;-----------------------------------------------------------------------------
|
|
Restore_state proc near ; Restore the machine state after LOADALL
|
|
;-----------------------------------------------------------------------------
|
|
mov ax,_data
|
|
mov ds,ax
|
|
mov ax,5000h ; GS
|
|
mov es,ax
|
|
mov si,offset Machine_State.GS_Desc
|
|
mov di,0
|
|
movsd
|
|
sub ax,1000h ; FS
|
|
add si,8
|
|
mov di,0
|
|
mov es,ax
|
|
movsd
|
|
sub ax,2000h ; DS
|
|
add si,8
|
|
mov di,0
|
|
mov es,ax
|
|
movsd
|
|
add ax,4000h ; SS
|
|
add si,8
|
|
mov di,0
|
|
mov es,ax
|
|
movsd
|
|
sub ax,3000h ; ES
|
|
add si,14h
|
|
mov di,0
|
|
mov es,ax
|
|
movsd
|
|
mov eax,Machine_State._ES
|
|
mov es,ax
|
|
mov eax,Machine_State._DS
|
|
mov ds,ax
|
|
mov eax,Machine_State._FS
|
|
mov fs,ax
|
|
mov eax,Machine_State._GS
|
|
mov gs,ax
|
|
mov eax,Machine_State._Eflags
|
|
push eax
|
|
popfd
|
|
mov eax,Machine_State._CR0
|
|
mov cr0,eax
|
|
mov eax,Machine_State._EAX
|
|
mov ecx,Machine_State._ECX
|
|
mov edx,Machine_State._EDX
|
|
mov ebx,Machine_State._EBX
|
|
mov ebp,Machine_State._EBP
|
|
mov esi,Machine_State._ESI
|
|
mov edi,Machine_State._EDI
|
|
ret
|
|
Restore_State endp
|