.386p
.MODEL TPASCAL

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

.DATA
 extrn Verbleibende_durchlaeufe
 extrn PNeues_Passwort_waehlen : dword
 extrn PEingabe_Box_zeichnen   : dword
 extrn PPasswort_abfragen      : dword
 extrn PSystem_anhalten        : dword
 extrn Passwort_correct        : byte
 extrn unnoetige_Variable1     : word
 extrn unnoetige_Variable2     : word

.CODE
extrn Main_Programm          : far

public Abfrage_Schleife

Abfrage_Schleife proc pascal
  keyb_off

 ;PIQ - Trick
  int 3
  mov  cs:word ptr [@int_21_funkt1],4CB4h  ; Funktion Prg. beenden
@int_21_funkt1:
  mov  ah,30h                         ; Funktion DOS-Vers. ermitteln
  int 21h

@Abfrage_loop:
  keyb_off

  call dword ptr PNeues_Passwort_waehlen
  cmp  unnoetige_Variable1,5
  jbe  @Unnoetiges_Ziel1a

 ;PIQ - Trick
  int 3
  mov  cs:word ptr [@int_21_funkt2],4CB4h  ; Funktion Prg. beenden
@int_21_funkt2:
  mov  ah,30h                         ; Funktion DOS-Vers. ermitteln
  int 21h
  mov  cs:word ptr [@int_21_funkt2],30B4h  ; Funktion Prg. beenden

  call dword ptr PEingabe_Box_zeichnen
  jmp  @Unnoetiges_Ziel1b

@Unnoetiges_Ziel1a:
 ;PIQ - Trick
  int 3
  mov  cs:word ptr [@int_21_funkt2],4CB4h  ; Funktion Prg. beenden
@int_21_funkt2a:
  mov  ah,30h                         ; Funktion DOS-Vers. ermitteln
  int 21h
  mov  cs:word ptr [@int_21_funkt2a],30B4h  ; Funktion Prg. beenden

  call dword ptr PEingabe_Box_zeichnen
@Unnoetiges_Ziel1b:
  keyb_on


  cmp  unnoetige_Variable2,10
  jbe  @Unnoetiges_Ziel2a

  dec  byte ptr Verbleibende_durchlaeufe

; Protected MODE Trick
	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

  call dword ptr PPasswort_abfragen
  jmp  @Unnoetiges_Ziel2b

@Unnoetiges_Ziel2a:
  dec  byte ptr Verbleibende_durchlaeufe

; Protected MODE Trick
	pusha
	cli                         ; Interrupts ausschalten
	mov eax,cr0                 ; In den Protected-Mode schalten
	or eax,1
	mov cr0,eax
	jmp PROTECTION_ENABLED2a      ; Executionpipe l”schen
PROTECTION_ENABLED2a:
	and al,0FEh                 ; Wieder in den Real-Mode schalten
	mov cr0,eax                 ; CPU nicht resetten
	jmp PROTECTION_DISABLED2a     ; Executionpipe l”schen
PROTECTION_DISABLED2a:
	sti                         ; Interrupts wieder einschalten
	popa
  call dword ptr PPasswort_abfragen

@Unnoetiges_Ziel2b:

  cmp  byte ptr Passwort_correct,1
  je   @Abfrage_war_OK
  jmp  @Abfrage_war_nicht_OK
@Abfrage_war_OK:

  call Main_Programm
@Abfrage_war_nicht_OK:

  cmp byte ptr Verbleibende_durchlaeufe,54
  ja  @Abfrage_loop
  call dword ptr PSystem_anhalten
  ret
Abfrage_schleife endp

END