225 lines
5.8 KiB
Plaintext
225 lines
5.8 KiB
Plaintext
|
;
|
|||
|
; 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
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc PnP_Delay
|
|||
|
|
|||
|
Push AX CX
|
|||
|
|
|||
|
Mov CX, 180h
|
|||
|
PnP_Delay1:
|
|||
|
In AL, 21h
|
|||
|
Loop PnP_Delay1
|
|||
|
|
|||
|
Pop CX AX
|
|||
|
Ret
|
|||
|
|
|||
|
EndP PnP_Delay
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc PnP_WriteData
|
|||
|
|
|||
|
Mov DX, 279h
|
|||
|
Out DX, AL
|
|||
|
|
|||
|
Mov AL, AH
|
|||
|
Mov DH, 0Ah
|
|||
|
Out DX, AL
|
|||
|
Ret
|
|||
|
|
|||
|
EndP PnP_WriteData
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc PnP_ReadRegister
|
|||
|
|
|||
|
Mov DX, 279h
|
|||
|
Out DX, AL
|
|||
|
|
|||
|
Mov DX, PnP_ReadPort
|
|||
|
In AL, DX
|
|||
|
|
|||
|
Ret
|
|||
|
|
|||
|
EndP PnP_ReadRegister
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|