;:::::::::::::::::::::::::::::::::::::::::
;:      Sito:  www.byteman.it  OpenWeb  ::
;:  Raccolta:  Particelle PAS+ASM       ::
;:    Autore:  Salvo Rosta aka byteman  ::
;:    Titolo:  XA20.ASM                 ::
;: Revisione:  07-04-1994               ::
;:::::::::::::::::::::::::::::::::::::::::

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;:        XA20.ASM     -  Versione: 31-agosto-1991, a cura di Salvo Rosta.  ::
;:                                                                          ::
;: Procedure XOnA20                       ; Attiva linea A20                ::
;: Procedure XOffA20                      ; Disattiva linea A20             ::
;: Function  XTestA20                     ; Test della linea A20            ::
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
DATA      SEGMENT BYTE PUBLIC
;:::::::: DATI ESTERNI GLOBALI :::::::::::::::::::::::::::::::::::::::::::::::
          EXTRN   TP_A20: Byte
DATA      ENDS

CODE      SEGMENT BYTE PUBLIC
          ASSUME  CS:CODE,DS:DATA
          PUBLIC  XOnA20, XOffA20, XTestA20

Porta_St  EQU     064h
Porta_A   EQU     060h
On_bit20  EQU     0DFh
Off_bit20 EQU     0DDh

ProcUno   PROC    FAR

XOnA20:   MOV     AH,On_bit20
          MOV     DS:TP_A20,1
          JMP     Gate_A20

XOffA20:  MOV     AH,Off_bit20
          MOV     DS:TP_A20,0
Gate_A20: CLI
          CALL    Vuoto_8042
          JNZ     Gate_A20_01
          MOV     AL,0D1h
          OUT     Porta_St,AL
          CALL    Vuoto_8042
          JNZ     Gate_A20_01
          MOV     AL,AH
          OUT     Porta_A,AL
          CALL    Vuoto_8042
Gate_A20_01:
          RET

XTestA20: PUSH    DS
          MOV     AX,0
          MOV     DS,AX
          MOV     AX,0FFFFh
          MOV     ES,AX
          MOV     BL,0                ; Predisposizione Test=False
          MOV     SI,0
          MOV     DI,16
          MOV     CX,1000
          CLD
          REPZ    CMPSB
          JZ      TestY               ; Se Zero A20 Attiva
          INC     BL                  ; Risultato Test=True
TestY:    MOV     AL,BL
          POP     DS
          RET

ProcUno   ENDP

ProcDue   PROC    NEAR
Vuoto_8042:
          PUSH    CX
          SUB     CX,CX
Vto_8042: IN      AL,Porta_St
          AND     AL,00000010b
          LOOPNZ  Vto_8042
          POP     CX
          RET
ProcDue   ENDP

CODE      ENDS
          END