.386p
.MODEL TPASCAL
.DATA
 oldint3 dd ?
 alter_interrupt3 dd ?

.CODE

  public PIQ_Stop_System
  public Keyboard_aus
  public Keyboard_ein
  public No_Stepping


keyb_off macro
  push ax
  in  al,21h
  or  al,02
  out 21h,al
  pop ax
endm

keyb_on macro
  push ax
  in  al,21h
  and al,0Fdh
  out 21h,al
  pop ax
endm

PIQ_Stop_System proc near
  push ds
  push ax
  push bx
  push cs
  pop  ds                             ; CS nach DS
  mov  cs:word ptr [@int_21_funkt],4CB4h  ; Funktion Prg. beenden
@int_21_funkt:
  mov  ah,30h                         ; Funktion DOS-Vers. ermitteln
  int  21h
  pop  bx
  pop  ax
  pop  ds
  ret
PIQ_Stop_System endp

Keyboard_aus proc near
   keyb_off
   ret
Keyboard_aus endp

Keyboard_ein proc near
   keyb_on
   ret
Keyboard_ein endp

No_Stepping proc near
  push ax
  jmp @Nostep+2
@Nostep:
  mov ds:byte ptr [06EBh],00
  mov ax,4C01h
  int 21h
  pop ax
  ret
No_Stepping endp

public protected_stopping
protected_stopping proc pascal
	pusha
	cli                         ; Interrupts ausschalten
	mov eax,cr0                 ; In den Protected-Mode schalten
	or eax,1
	mov cr0,eax
	jmp PROTECTION_ENABLED      ; Executionpipe l”schen
PROTECTION_ENABLED:

	and al,0FEh                 ; Wieder in den Real-Mode schalten
	mov cr0,eax                 ; CPU nicht resetten
	jmp PROTECTION_DISABLED     ; Executionpipe l”schen
PROTECTION_DISABLED:
	sti                         ; Interrupts wieder einschalten
	popa
  ret
protected_stopping endp

public Check_auf_vector
Check_auf_vector proc pascal check : dword;
  mov bx,0
  mov es,bx
  mov bx,18
  mov eax,es:[bx]
  mov oldint3,eax
  mov eax,check
  mov es:[bx],eax
  ret
Check_auf_vector endp

public Vector_ok
Vector_ok proc pascal check : dword;
  mov bx,0
  mov es,bx
  mov bx,18
  mov eax,es:[bx]
  cmp eax,check
  je  @check_ok
  mov al,0
  jmp @check_ende
@check_ok:
  mov al,1
@check_ende:
  ret
Vector_ok endp

public restore_Checkvector
restore_Checkvector proc pascal
  mov bx,0
  mov es,bx
  mov bx,18
  mov eax,oldint3
  mov es:[bx],eax
  ret
restore_Checkvector endp

public Copy_int21_int3
Copy_int21_int3 proc pascal
  mov bx,0
  mov es,bx
  mov bx,18
  mov eax,es:[bx]
  mov alter_interrupt3,eax              ; alten int3 sichern
  mov bx,84                             ; Int 21 laden
  mov eax,es:[bx]
  mov bx,18                             ; in int3 speichern
  mov es:[bx],eax
  ret
Copy_int21_int3 endp



end