225 lines
5.6 KiB
Plaintext
Executable File
225 lines
5.6 KiB
Plaintext
Executable File
;
|
|
; Plug and play include file. Driver needs to define PNPVENDORID and
|
|
; PNPSERIALID which will be used to identify the card.
|
|
;
|
|
; Call function PnP_Detect
|
|
;
|
|
|
|
|
|
PnP_SerialID DD 0
|
|
PnP_VendorID DD 0
|
|
PnP_ReadPort DW 0
|
|
PnP_CSN DB 0
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc PnP_Delay
|
|
|
|
Push AX CX
|
|
|
|
Mov CX, 180h
|
|
PnP_Delay1:
|
|
In AL, 21h
|
|
Loop PnP_Delay1
|
|
|
|
Pop CX AX
|
|
Ret
|
|
|
|
EndP PnP_Delay
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc PnP_WriteData
|
|
|
|
Mov DX, 279h
|
|
Out DX, AL
|
|
|
|
Mov AL, AH
|
|
Mov DH, 0Ah
|
|
Out DX, AL
|
|
Ret
|
|
|
|
EndP PnP_WriteData
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc PnP_ReadRegister
|
|
|
|
Mov DX, 279h
|
|
Out DX, AL
|
|
|
|
Mov DX, PnP_ReadPort
|
|
In AL, DX
|
|
|
|
Ret
|
|
|
|
EndP PnP_ReadRegister
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc PnP_Isolate
|
|
|
|
Mov AX, 402h
|
|
Call Pnp_WriteData ; Reset CSNs
|
|
|
|
PnP_IsolateNextCard:
|
|
Mov AX, 0003h
|
|
Call PnP_WriteData ; Wake[0]
|
|
|
|
Mov AX, PnP_ReadPort
|
|
ShL AX, 6
|
|
Xor AL, AL
|
|
Call PnP_WriteData ; Set Read Data port.
|
|
|
|
Call PnP_Delay
|
|
Call PnP_Delay
|
|
Call PnP_Delay
|
|
Call PnP_Delay
|
|
|
|
Mov AL, 1 ; Serial Isolation
|
|
Mov DX, 279h
|
|
Out DX, AL
|
|
|
|
Call PnP_Delay
|
|
Call PnP_Delay
|
|
Call PnP_Delay
|
|
Call PnP_Delay
|
|
|
|
Mov BL, 6Ah
|
|
Mov CX, 64
|
|
Mov DX, PnP_ReadPort
|
|
|
|
ClI
|
|
|
|
PnP_Isolate1:
|
|
ShR PnP_SerialID, 1
|
|
RCR PnP_VendorID, 1
|
|
|
|
Mov BH, BL
|
|
ShR BH, 1
|
|
Xor BH, BL
|
|
ShR BX, 1
|
|
|
|
In AL, DX
|
|
Mov AH, AL
|
|
Call PnP_Delay
|
|
In AL, DX
|
|
Call PnP_Delay
|
|
|
|
Cmp AX, 55AAh
|
|
JNE PnP_Isolate2
|
|
|
|
Xor BL, 80h
|
|
Or SerialNumber, 80000000h
|
|
|
|
PnP_Isolate2:
|
|
Dec CX
|
|
JNZ PnP_Isolate1
|
|
|
|
Mov CX, 8
|
|
Xor BH, BH
|
|
|
|
PnP_Isolate3:
|
|
ShR BH, 1
|
|
|
|
In AL, DX
|
|
Mov AH, AL
|
|
Call PnP_Delay
|
|
In AL, DX
|
|
Call PnP_Delay
|
|
Cmp AX, 55AAh
|
|
JNE PnP_Isolate4
|
|
|
|
Or BH, 80h
|
|
|
|
PnP_Isolate4:
|
|
Dec CX
|
|
JNZ PnP_Isolate3
|
|
|
|
Cmp BL, BH ; Matching Checksum?
|
|
JNE PnP_IsolateFinished
|
|
|
|
; assign CSN
|
|
Inc PnP_CSN
|
|
|
|
Mov AL, 6
|
|
MOv AH, PnP_CSN
|
|
Call PnP_WriteData
|
|
|
|
Cmp PnP_VendorID, PNPVENDORID
|
|
JNE PnP_IsolateNextCard
|
|
Cmp PnP_SerialID, PNPSERIALID
|
|
JNE PnP_IsolateNextCard
|
|
|
|
Mov AL, 60h
|
|
Call PnP_ReadData
|
|
Mov AH, AL
|
|
Mov AL, 61h
|
|
Call PnP_ReadData ; AX = address.
|
|
|
|
Mov AL, 70h
|
|
Call PnP_ReadData ; AL[3:0] = IRQ
|
|
|
|
Mov AL, 74
|
|
Call PnP_ReadData ; AL[2:0] = DMA
|
|
|
|
Jmp PnP_IsolateNextCard
|
|
|
|
PnP_IsolateFinished:
|
|
Cmp PnP_CSN, 0
|
|
JNE PnP_IsolateEnd
|
|
|
|
StC
|
|
|
|
PnP_IsolateEnd:
|
|
Ret
|
|
|
|
EndP PnP_Isolate
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc Pnp_Detect ; returns carry clear if succesful
|
|
|
|
Xor AL, AL
|
|
Mov DX, 279h
|
|
Out DX, AL
|
|
Out DX, AL
|
|
|
|
Mov AL, 6Ah ; Starting value
|
|
Mov CX, 32
|
|
|
|
PnP_InitiationKeyLoop:
|
|
Out DX, AL
|
|
|
|
Mov AH, AL
|
|
ShR AH, 1
|
|
Xor AH, AL
|
|
ShR AX, 1
|
|
|
|
Dec CX
|
|
JNZ PnP_InitiationKeyLoop
|
|
|
|
; Try three ports before concluding no PnP cards: 20Fh, 27Bh, 213h
|
|
|
|
Mov PnP_ReadPort, 20Fh
|
|
Call PnP_Isolate
|
|
JNC PnP_DetectEnd
|
|
|
|
Mov PnP_ReadPort, 27Bh
|
|
Call PnP_Isolate
|
|
JNC PnP_DetectEnd
|
|
|
|
Mov PnP_ReadPort, 213h
|
|
Call PnP_Isolate
|
|
|
|
PnP_DetectEnd: ; Return PnP to wait for key state
|
|
Mov AX, 202h
|
|
Call PnP_WriteData
|
|
|
|
Ret
|
|
|
|
EndP PnP_Detect
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|