; ; 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 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ