;15A20off.asm ; Program lze spustit na procesoru min. 80286. .286 DATA SEGMENT PUBLIC 'DATA' ; A20OnMessage db 13,10,'Gate A20 je prave ZAPNUTO.',13,10,'$' A20OffMessage db 13,10,'Gate A20 je prave VYPNUTO.',13,10,'$' ; LowMemory LABEL DWORD ; Adresa 0000:0080h dw 00080h dw 00000h HighMemory LABEL DWORD ; Adresa FFFF:0090h dw 00090h dw 0FFFFh DATA ENDS ; STKSEG SEGMENT STACK 'STACK' db 1024 DUP(?) ; Hloubka zasobniku je 1KB. STKSEG ENDS ; CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,SS:STKSEG,DS:DATA ;************************************************************************ ;* ;* Synchronizace obvodu 8042. ;* ;************************************************************************ Sync8042 PROC NEAR xor CX, CX S8InSync: in AL, 64h and AL, 2 LOOPNZ S8InSync ret Sync8042 ENDP ;************************************************************************ ;* ;* Zapnuti nebo vypnuti A20 na pocitaci typu AT. ;* ;* Vstup: AX = 0 --> Vypne A20 ;* AX = 1 --> Zapne A20 ;* Vystup: AX = 1 --> Uspesne ukonceni operace ;* AX = 0 --> Chyba pri operaci ;* ;************************************************************************ AT_A20Handler PROC NEAR or AX, AX ; Zapnout nebo vypnout A20? jz AAHDisable ; =0 ... vypnout ; Zapnuti Gate A20 ; ---------------- AAHEnable: call Sync8042 ; Synchronizuj obvod 8042 jnz AAHErr ; Detekovana chyba. mov AL, 0D1h out 64h, AL call Sync8042 jnz AAHErr mov AL, 0DFh out 60h, AL call Sync8042 jnz AAHErr mov AL, 0FFh out 64h, AL call Sync8042 jnz AAHErr jmp AAHExit ; Vypnuti Gate A20 ; ---------------- AAHDisable: call Sync8042 jnz AAHErr mov AL, 0D1h out 64h, AL call Sync8042 jnz AAHErr mov AL, 0DDh out 60h, AL call Sync8042 jnz AAHErr mov AL, 0FFh out 64h, AL call Sync8042 AAHExit: mov AX, 1 ; Navrat O.K. ret AAHErr: xor AX, AX ; Chybovy navrat ret AT_A20Handler ENDP ;************************************************************************ ;* ;* Zjisteni nastaveni Gate A20 ;* ;* Vystup: AX = 1 --> A20 je zapnuto. ;* AX = 0 --> A20 je vypnuto. ;* ;************************************************************************ IsA20On PROC NEAR push DS push ES lds SI, ES:LowMemory ; DS:SI := 0000:0080h les DI, ES:HighMemory ; ES:DI := FFFF:0090h mov CX, 4 cld repe cmpsw ; Provadi se test shody obsahu 4 slov ; od adresy 0000:0080h se 4 slovy od ; adresy FFFF:0090h, ktera pri vypnutem ; Gate A20 ukazuje na 0000:0080h protoze: ; Max. adresa je FFFFFh (= FFFF:000Fh). ; Pri vypnutem Gate A20: ; FFFF:0010h odpovida 0000:0000h ; FFFF:0090h 0000:0080h pop ES pop DS xor AX, AX jcxz IAONoWrap inc AX IAONoWrap: xor BL, BL ret IsA20On ENDP ;********************************************************************** PROCES PROC ; Toto je vstupni bod programu, sem se preda rizeni. mov AX, DATA mov DS, AX mov ES, AX mov AX, 0 ; Vypni Gate A20 call AT_A20Handler ; Proved akci call IsA20On ; Testuj vysledek or AX, AX jz A20Off ; Oznam vysledek A20On: mov DX, OFFSET A20OnMessage jmp QueryDone A20Off: mov DX, OFFSET A20OffMessage QueryDone: mov AH, 09h int 21h ; Vypis text mov AH, 4Ch int 21h ; Ukonci program PROCES ENDP ;************************************************ CODE ENDS ; Konec programu. END PROCES