;************************************************************** ;AXINIT02.ASM (C) 1998 PMASIA.COM . ;Issue Date: 12/99 ;Version 02: Second Release. ;********************************************************************* ;Revision History: ;rev 01 - initial release ;rev 02 - modified to write back only the first 64 regs, up to 3FH ; ;-------------------------------------------------------------------- ;This program "AXINIT02.EXE" is a re-initialization program for the ;PMasia.com ' PCI and AGP Bus Isolation Extenders only. ;It will allow the user to specify up to four PCI devices to ;be re-initialized. When first invoked, it will search the disk for a ;file name "AXINIT01.cfg". If found, it will read the file and search ;the pci bus for the PCI devices specified in the disk file and ;reinitialize the PCI devices.If not found, it will prompt the user ;to enter 4 "Device ID", "Vendor ID" and "Index" then search and save the ;configuration in a file, named "AXINIT01.cfg. The index number is ;default to zero, which is usually the case for single function PCI cards. ;For PCI cards with multifunction, the index should be specified as, ;0 or 1, etc. ; ;THIS PROGRAM NEEDS TO BE RUN FOR EACH MOTHERBOARD OR SYSTEM. THE ;AXINIT01.CFG FILE NEEDS TO STAY WITHIN THAT PARTICULAR SYSTEM AND NOT ;BE SHARED WITH OTHER SIMILAR SYSTEMS. IF ADDITIONAL PCI CARDS ARE ;ADDED TO THE SYSTEM, OR THE CARD UNDER TEST IS CHANGED, THE USER WILL NEED ;TO DELETE THE EXISTING AXINIT01.CFG FILE AND RUN THE PROGRAM TO ;RE-GENERATE A NEW CFG FILE AGAIN. ; ;THIS PROGRAM IS NOT GUARENTEED TO WORK WITH ALL PCI OR AGP CARDS. ;SOME OF THEM HAVE CONFIGURATION REGISTERS THAT SHOULD NOT BE WRITTEN, ;OR MANY HAVE SOME OTHER REGISTERS OR MEMORY OUTSIDE OF THE CONFIGURATION ;REGISTERS THAT MAY NEED TO BE RE-INITIALIZED. USER SHOULD READ THE ;NOTES UNDER THE WRITE_CFG_REG SUBROUTINE FOR DETAIL. MOST LIKELY, ;THE CHANGES CAN BE MODIFIED OR ADDED WITHIN THIS SUBROUTINE. ; ;USER SHOULD RUN THIS PROGRAM THE FIRST TIME, WHILE THE CPU SYSTEM IS ;LOADED WITH THE CARD THAT IS INTENDED TO BE RE-INITIALIZED (WITH THE ;BUS ISOLATION EXTENDER SWITCHED ON, IF INSTALLED). AFTERWARDS, THE ;BOARD UNDER TEST CAN BE REMOVED WHILE THE BUS ISOLATION EXTENDER IS ;SWITCHED OFF. BY RUNNING THIS PROGRAM AGAIN, IT WILL THEN RE-INITIALIZE ;THE BOARD UNDER TEST, AFTER THE BUS ISOLATION EXTENDER IS SWITCHED BACK ON. ; ;USER IS ENCOURAGED TO CREATE A BATCH FILE WHICH CALLS THIS PROGRAM ;FOR RE-INITIALIZATION BEFORE THE REAL TEST SOFTWARE IS RUN. USER ;SHOULD RUN THIS PROGRAM OR EXERCISE THE BATCH FILE THAT INCLUDES THIS ;PROGRAM EVERY TIME THE BUS ISOLATION EXTENDER IS SWITCH OFF AND BACK ON. ;********************************************************************* ;********************************************************************* ;FOR FURTHER ASSITANCE, PLEASE CONTACT, ; PMASIA.COM ; P.O. BOX 10-16 ; HSIN CHU, TAIWAN 300 ; ; (T)+886-3-538-5849; (F)+886-3-530-0911 ; EMAIL: h5385849@ms8.hinet.net ; Website: http://www.pmasia.com ;********************************************************************* ;Please visit our website for future revision of this software, as ;well as, other product and service information. ;********************************************************************* ; NAME AXINIT02 PUBLIC TOKEN ; PCI_FUNCTION_ID equ 0B1h PCI_BIOS_PRESENT equ 01h FIND_PCI_DEVICE equ 02h FIND_PCI_CLASS_CODE equ 03h PCI_BIOS_INT equ 1Ah READ_CONFIG_BYTE equ 08h READ_CONFIG_WORD equ 09h READ_CONFIG_DWORD equ 0Ah WRITE_CONFIG_BYTE equ 0Bh WRITE_CONFIG_WORD equ 0Ch WRITE_CONFIG_DWORD equ 0Dh SUCCESSFUL equ 00h PCI_DEVICE_NOT_FOUND equ 86h PCI_BAD_VENDOR_ID equ 83h PCI_BAD_REGISTER_NUMBER equ 87h ; YES EQU 59H NO EQU 4EH CR EQU 13 LF EQU 10 ;*************************************************************************** ; .MODEL SMALL .386 DATA SEGMENT WORD PUBLIC 'DATA' ;*************************************************************************** ; TEMP DB 0 TOKEN DW 0000 ;FILE HANDLE CFGFILE DB 'AXINIT01.CFG',0 ; ST1 DB 13,10 DB "**** ADEX PCI/AGP Re-initialization program, version 01 ****" DB 13,10,"$" ST2 DB "AXINIT01.CFG FILE NOT FOUND",13,10,"$" SPACE DB 13,10,"$" ST4 DB "AXINIT01.CFG FILE FOUND",13,10,"$" BAD_OPEN DB "AXINIT01.CFG FILE OPENING ERROR, PLEASE DELETE" DB " FILE AND TRY AGAIN.",13,10,"$" BAD_CREATE DB "CAN'T CREATE AXINIT01.CFG FILE, PLEASE RETRY.",13,10,"$" BAD_DEV1 DB "BAD DEV_1 HANDLER",13,10,"$" BAD_DEV2 DB "BAD DEV_2 HANDLER",13,10,"$" BAD_DEV3 DB "BAD DEV_3 HANDLER",13,10,"$" BAD_DEV4 DB "BAD DEV_4 HANDLER",13,10,"$" BAD_VENID DB "BAD VENDOR ID",13,10,"$" VID1_MSG DB 13,10,"ENTER THE 1ST 4 DIGIT VENDOR ID NUMBER (CR=END): ","$" DID1_MSG DB 13,10,"ENTER THE 1ST 4 DIGIT DEVICE ID NUMBER: ","$" IND1_MSG DB 13,10,"ENTER THE 1ST 1 DIGIT INDEX NUMBER: ","$" VID2_MSG DB 13,10,"ENTER THE 2ND 4 DIGIT VENDOR ID NUMBER (CR=END): ","$" DID2_MSG DB 13,10,"ENTER THE 2ND 4 DIGIT DEVICE ID NUMBER: ","$" IND2_MSG DB 13,10,"ENTER THE 2ND 1 DIGIT INDEX NUMBER: ","$" VID3_MSG DB 13,10,"ENTER THE 3RD 4 DIGIT VENDOR ID NUMBER (CR=END): ","$" DID3_MSG DB 13,10,"ENTER THE 3RD 4 DIGIT DEVICE ID NUMBER: ","$" IND3_MSG DB 13,10,"ENTER THE 3RD 1 DIGIT INDEX NUMBER: ","$" VID4_MSG DB 13,10,"ENTER THE 4TH 4 DIGIT VENDOR ID NUMBER (CR=END): ","$" DID4_MSG DB 13,10,"ENTER THE 4TH 4 DIGIT DEVICE ID NUMBER: ","$" IND4_MSG DB 13,10,"ENTER THE 4TH 1 DIGIT INDEX NUMBER: ","$" IN_ERR_MSG DB 13,10,"INPUT ERROR, TRY AGAIN.",13,10,"$" BAD_WRITE_CFG_MSG DB "AXINIT01.CFG FILE CORRUPTED, PLEASE DELETE" DB " FILE AND TRY AGAIN.",13,10,"$" DEV1_BAD_MSG DB 13,10,"CAN'T FIND DEVICE 1, ENTER AGAIN.",13,10,"$" DEV2_BAD_MSG DB 13,10,"CAN'T FIND DEVICE 2, ENTER AGAIN.",13,10,"$" DEV3_BAD_MSG DB 13,10,"CAN'T FIND DEVICE 3, ENTER AGAIN.",13,10,"$" DEV4_BAD_MSG DB 13,10,"CAN'T FIND DEVICE 4, ENTER AGAIN.",13,10,"$" DISKFUL_MSG DB "DISK FULL ","$" CREATE_BAD_MSG DB "CREATE FILE ERROR", 13,10,"$" WRITE_GOOD_MSG DB "***** RE-INITIALIZATION COMPLETED*****",13,10,"$" BAD_ASK DB "INPUT ERROR, NO FILE IS CREATED", 13,10,"$" DEV1_WR_FAIL DB "PCI DEVICE 1 RE-INITIALIZATION FAILED",13,10,"$" DEV2_WR_FAIL DB "PCI DEVICE 2 RE-INITIALIZATION FAILED",13,10,"$" DEV3_WR_FAIL DB "PCI DEVICE 3 RE-INITIALIZATION FAILED",13,10,"$" DEV4_WR_FAIL DB "PCI DEVICE 4 RE-INITIALIZATION FAILED",13,10,"$" DEV1_READERR_MSG DB "DEVICE 1 CONFIGURATION REGISTER READ" DB " ERROR", 13,10,"$" DEV2_READERR_MSG DB "DEVICE 2 CONFIGURATION REGISTER READ" DB " ERROR", 13,10,"$" DEV3_READERR_MSG DB "DEVICE 3 CONFIGURATION REGISTER READ" DB " ERROR", 13,10,"$" DEV4_READERR_MSG DB "DEVICE 4 CONFIGURATION REGISTER READ" DB " ERROR", 13,10,"$" CREATE_OK_MSG DB 13,10,"AXINIT01.CFG CREATED SUCCESSFULLY",13,10,"$" ST99 DB "**************** AXINIT01 END *******************",13,10,"$" ; READ_ERR DB 0 WCW DW 0 ; VID_BUFF DB 5 ;MAX LENGTH OF VENDOR ID BUFFER DB 0 DB 5 DUP(0) ;VID STRING BUFFER DID_BUFF DB 5 ;MAX LENGTH OF DEVICE ID BUFFER DB 0 DB 5 DUP(0) ;DID STRING BUFFER IND_BUFF DB 2 ;MAX LENGTH OF INDEX BUFFER DB 0 DB 2 DUP(0) ;INDEX STRING BUFFER ;DEV_CFG_LNGTH DW (DEV_2_TBL-DEV_1_TBL) ;************************************************************************* ;* DEVICE #1 CFG TABLE * ;************************************************************************* DEV_1_TBL DW 0FFFFH ;VENDOR ID ; 00 DW 0FFFFH ;DEVICE ID ; 02 DW 0 ;COMMAND ; 04 DW 0 ;STATUS ; 06 DB 0 ;REVISION ; 08 DB 0 ;CLASS CODE 1ST BYTE ; 09 DW 0 ;CLASS CODE UPPER WORD ; 0A DB 0 ;CACHE LINE SIZE ; 0C DB 0 ;LATENCY TIMER ; 0D DB 0 ;HEADER TYPE ; 0E DB 0 ;BIST ; 0F DD 0 ;EXCA BASE ADDR ; 10 DD 0 ; 14 DD 0 ; 18 DD 0 ; 1C DD 0 ; 20 DD 0 ; 24 DD 0 ;RESERVED ; 28 DD 0 ;RESERVED ; 2C DD 0 ;EXPAN ROM BASE ADDR ; 30 DD 0 ;RESERVED ; 34 DD 0 ;RESERVED ; 38 DB 0 ;INTERRUPT LINE ; 3C DB 0 ;INTERRUPT PIN ; 3D DB 0 ;MIN_GNT ; 3E DB 0 ;MAX_LAT ; 3F DB 192 DUP (0) ; 40 DEV1_BX DW 0FFFFH ;DEVICE HANDLE ;************************************************************************* ;* DEVICE #2 CFG TABLE * ;************************************************************************* DEV_2_TBL DW 0FFFFH ;VENDOR ID ; 00 DW 0FFFFH ;DEVICE ID ; 02 DW 0 ;COMMAND ; 04 DW 0 ;STATUS ; 06 DB 0 ;REVISION ; 08 DB 0 ;CLASS CODE 1ST BYTE ; 09 DW 0 ;CLASS CODE UPPER WORD ; 0A DB 0 ;CACHE LINE SIZE ; 0C DB 0 ;LATENCY TIMER ; 0D DB 0 ;HEADER TYPE ; 0E DB 0 ;BIST ; 0F DD 0 ;EXCA BASE ADDR ; 10 DD 0 ; 14 DD 0 ; 18 DD 0 ; 1C DD 0 ; 20 DD 0 ; 24 DD 0 ;RESERVED ; 28 DD 0 ;RESERVED ; 2C DD 0 ;EXPAN ROM BASE ADDR ; 30 DD 0 ;RESERVED ; 34 DD 0 ;RESERVED ; 38 DB 0 ;INTERRUPT LINE ; 3C DB 0 ;INTERRUPT PIN ; 3D DB 0 ;MIN_GNT ; 3E DB 0 ;MAX_LAT ; 3F DB 192 DUP (0) ; 40 DEV2_BX DW 0FFFFH ;DEVICE HANDLE ;************************************************************************* ;* DEVICE #3 CFG TABLE * ;************************************************************************* DEV_3_TBL DW 0FFFFH ;VENDOR ID ; 00 DW 0FFFFH ;DEVICE ID ; 02 DW 0 ;COMMAND ; 04 DW 0 ;STATUS ; 06 DB 0 ;REVISION ; 08 DB 0 ;CLASS CODE 1ST BYTE ; 09 DW 0 ;CLASS CODE UPPER WORD ; 0A DB 0 ;CACHE LINE SIZE ; 0C DB 0 ;LATENCY TIMER ; 0D DB 0 ;HEADER TYPE ; 0E DB 0 ;BIST ; 0F DD 0 ;EXCA BASE ADDR ; 10 DD 0 ; 14 DD 0 ; 18 DD 0 ; 1C DD 0 ; 20 DD 0 ; 24 DD 0 ;RESERVED ; 28 DD 0 ;RESERVED ; 2C DD 0 ;EXPAN ROM BASE ADDR ; 30 DD 0 ;RESERVED ; 34 DD 0 ;RESERVED ; 38 DB 0 ;INTERRUPT LINE ; 3C DB 0 ;INTERRUPT PIN ; 3D DB 0 ;MIN_GNT ; 3E DB 0 ;MAX_LAT ; 3F DB 192 DUP (0) ; 40 DEV3_BX DW 0FFFFH ;DEVICE HANDLE ;************************************************************************* ;* DEVICE #4 CFG TABLE * ;************************************************************************* DEV_4_TBL DW 0FFFFH ;VENDOR ID ; 00 DW 0FFFFH ;DEVICE ID ; 02 DW 0 ;COMMAND ; 04 DW 0 ;STATUS ; 06 DB 0 ;REVISION ; 08 DB 0 ;CLASS CODE 1ST BYTE ; 09 DW 0 ;CLASS CODE UPPER WORD ; 0A DB 0 ;CACHE LINE SIZE ; 0C DB 0 ;LATENCY TIMER ; 0D DB 0 ;HEADER TYPE ; 0E DB 0 ;BIST ; 0F DD 0 ;EXCA BASE ADDR ; 10 DD 0 ; 14 DD 0 ; 18 DD 0 ; 1C DD 0 ; 20 DD 0 ; 24 DD 0 ;RESERVED ; 28 DD 0 ;RESERVED ; 2C DD 0 ;EXPAN ROM BASE ADDR ; 30 DD 0 ;RESERVED ; 34 DD 0 ;RESERVED ; 38 DB 0 ;INTERRUPT LINE ; 3C DB 0 ;INTERRUPT PIN ; 3D DB 0 ;MIN_GNT ; 3E DB 0 ;MAX_LAT ; 3F DB 192 DUP (0) ; 40 DEV4_BX DW 0FFFFH ;DEVICE HANDLE ;************************************************************************* ; ; DATA ENDS ; CODE SEGMENT WORD PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA,ES:DATA ; ;************************************************************************* ;************************************************************************* START: ; MOV AX,DATA MOV DS,AX MOV ES,AX CALL CLEAR_SCREEN ;CLEAR SCREEN ; MOV DX,OFFSET ST1 CALL DISPLA ;DISPLAY PROGRAM BANNER ; MOV AH,3DH ;OPEN AXINIT01.CFG MOV AL,2 MOV DX,OFFSET CFGFILE INT 21H JC NOFILE ;JUMP IF NO FILE ; MOV BX,AX ;ELSE, READ FILE MOV AH,3FH MOV CX,1032 ;READ 1K+8 BYTES MOV DX,OFFSET DEV_1_TBL INT 21H JC BADOPEN ;JUMP IF CAN'T READ FILE ; CALL WRITE_PCI_CFG ;ELSE WRITE CFG TO PCI DEV. CMP AX,0 JNE BAD_WRITE_CFG MOV DX, OFFSET WRITE_GOOD_MSG CALL DISPLA JMP BYE ;GOOD BYE ; BAD_WRITE_CFG: MOV DX,OFFSET BAD_WRITE_CFG_MSG CALL DISPLA JMP BYE ; BADOPEN: MOV DX,OFFSET BAD_OPEN CALL DISPLA JMP BYE ; NOFILE: CALL ASKINPUT ;ASK USER TO ENTER INPUT JNC MAKEFILE ;NO FILE IF INPUT BAD MOV DX, OFFSET BAD_ASK CALL DISPLA JMP BYE MAKEFILE: CALL CREATE_FILE ;CREATE FILE IF INPUT OK ; BYE: MOV DX,OFFSET SPACE ;SKIP A LINE CALL DISPLA MOV DX,OFFSET ST99 ;DISPLAY TERMINATE MSG. CALL DISPLA CLC MOV AH,4CH ;CALL TERMINATION INT 21H ;********************************************************************* ;********************************************************************* ;SUBROUTINE WRITE_PCI_CFG ;INPUT: ;OUTPUT: ;********************************************************************* WRITE_PCI_CFG PROC NEAR MOV AX,DATA MOV DS,AX ;******** FIND DEV_1 ******** MOV AX, DEV_1_TBL ;CHK VENDOR ID CMP AX, 0FFFFH JNE VENIDOK_1 MOV DX,OFFSET BAD_VENID ;THE IST VENDOR ID NEED ;TO BE GOOD CALL DISPLA JMP WBYE VENIDOK_1: MOV AX, DEV1_BX ;CHK DEV1 HANDLER CMP AX,0FFFFH JE BAD_DEV1BX MOV BX, DEV1_BX MOV SI, OFFSET DEV_1_TBL CALL WRITE_CFG_REG JNC DEV_2 MOV DX,OFFSET DEV1_WR_FAIL CALL DISPLA JMP DEV_2 ; BAD_DEV1BX: MOV DX,OFFSET BAD_DEV1 CALL DISPLA JMP WBYE ; ;******** FIND DEV_2 ******** DEV_2: MOV AX, DEV_2_TBL ;CHK VENDOR ID CMP AX, 0FFFFH JNE VENIDOK_2 JMP DEV_3 VENIDOK_2: MOV AX, DEV2_BX ;CHK DEV2 HANDLER CMP AX,0FFFFH JE BAD_DEV2BX MOV BX, DEV2_BX MOV SI, OFFSET DEV_2_TBL CALL WRITE_CFG_REG JNC DEV_3 MOV DX,OFFSET DEV2_WR_FAIL CALL DISPLA JMP DEV_3 ; BAD_DEV2BX: MOV DX,OFFSET BAD_DEV2 CALL DISPLA JMP WBYE ; ;****** FIND DEV_3 ********* DEV_3: MOV AX, DEV_3_TBL ;CHK VENDOR ID CMP AX, 0FFFFH JNE VENIDOK_3 JMP DEV_4 VENIDOK_3: MOV AX, DEV3_BX ;CHK DEV3 HANDLER CMP AX,0FFFFH JE BAD_DEV3BX MOV BX, DEV3_BX MOV SI, OFFSET DEV_3_TBL CALL WRITE_CFG_REG JNC DEV_4 MOV DX,OFFSET DEV4_WR_FAIL CALL DISPLA JMP DEV_4 ; BAD_DEV3BX: MOV DX,OFFSET BAD_DEV3 CALL DISPLA JMP WBYE ; ;******** FIND DEV_4 ******** DEV_4: MOV AX, DEV_4_TBL ;CHK VENDOR ID CMP AX, 0FFFFH JNE VENIDOK_4 XOR AX,AX RET VENIDOK_4: MOV AX, DEV4_BX ;CHK DEV4 HANDLER CMP AX,0FFFFH JE BAD_DEV4BX MOV BX, DEV4_BX MOV SI, OFFSET DEV_4_TBL CALL WRITE_CFG_REG JNC WRITE_DONE MOV DX,OFFSET DEV4_WR_FAIL CALL DISPLA JMP WBYE WRITE_DONE: XOR AX,AX RET ; BAD_DEV4BX: MOV DX,OFFSET BAD_DEV4 CALL DISPLA JMP WBYE ; WBYE: MOV AX,0FH RET WRITE_PCI_CFG ENDP ;******************************************************************** ;SUBROUTINE WRITE_CFG_REG ;INPUT: SI = TABLE ENTRY, BX=DEVICE HANDLE ;OUTPUT: CARRY FLAG ;******************************************************************** ;CAUTION: USER MAY NEED TO MODIFY THE PROGRAM HERE FOR THEIR SPECIFIC ; PCI I/O BOARDS, IN ORDER NOT TO WRITE INTO REGISTERS THAT ; DO NOT ALLOW WRITE OPERATION. ; THE FOLLOWING REGISTERS ARE ASSUMED TO BE READ ONLY ; ; VENDOR ID 16 BIT @ 00H ; DEVICE ID 16 BIT @ 02H ; STATUS 16 BIT @ 06H ; REVISION ID 8 BIT @ 08H ; CLASS CODE 24 BIT @ 0AH ; HEADER TYPE 8 BIT @ 0EH ; BIST 8 BIT @ 0FH ; INTERRUPT PIN 8 BIT @ 3DH ; WRITE_CFG_REG PROC NEAR MOV DI, 04H ;WRITE REG 04H CALL GETWORD ;VALUE IN CX MOV AH,PCI_FUNCTION_ID MOV AL,WRITE_CONFIG_WORD MOV WCW,AX INT PCI_BIOS_INT JC BAD_WRITE ; MOV DI, 0CH ;WRITE REG 0CH CALL GETWORD ;VALUE IN CX MOV AX,WCW INT PCI_BIOS_INT JC BAD_WRITE ; MOV CX,22 ;LOOP 24 TIMES MOV DI, 10H ;START WITH REG=10H ; MORE_LWORD: PUSH CX CALL GETWORD MOV AX,WCW INT PCI_BIOS_INT JC BAD_WRITE INC DI INC DI POP CX LOOP MORE_LWORD ; MOV DI, 3CH CALL GETWORD MOV AH,PCI_FUNCTION_ID MOV AL, WRITE_CONFIG_BYTE ;DO A BYTE WRITE TO 3CH INT PCI_BIOS_INT JC BAD_WRITE ; MOV CX,01 ;LOOP 1 TIMES MOV DI, 3EH ;START WITH REG=3EH ; MORE_HWORD: PUSH CX CALL GETWORD MOV AX,WCW INT PCI_BIOS_INT JC BAD_WRITE INC DI INC DI POP CX LOOP MORE_HWORD CLC RET ; BAD_WRITE: STC RET WRITE_CFG_REG ENDP ;******************************************************************** ;SUBROUTINE GETWORD ;INPUT: DI,SI ;OUTPUT: CX=WORD ;******************************************************************** GETWORD PROC NEAR PUSH SI PUSH DI PUSH AX ; MOV AX,SI ;LOCATE WORD ADD AX,DI MOV SI,AX MOV AX, [SI] ;GET WORD MOV CX,AX ;MOVE TO CX ; POP AX POP DI POP SI RET GETWORD ENDP ;******************************************************************** ;SUBROUTINE ASKINPUT ; ;INPUT: NONE ;OUTPUT: CARRY FLAG ;******************************************************************** ASKINPUT PROC NEAR ; GETVID1: MOV DX,OFFSET VID1_MSG ;GET 1ST VID CALL DISPLA MOV AH,0AH MOV DX, OFFSET VID_BUFF INT 21H MOV SI,OFFSET DEV_1_TBL CALL VIDCONVERT JNC GETDID1 CMP AL,13 ;IS IT A "CR"? JE SKIPASK ;ABORT IF IT IS MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETVID1 ; GETDID1: MOV DX,OFFSET DID1_MSG ;GET 1ST DID CALL DISPLA MOV AH,0AH MOV DX,OFFSET DID_BUFF INT 21H MOV SI,OFFSET DEV_1_TBL+2 CALL DIDCONVERT JNC GETIND1 CMP AL,13 ;IS IT A "CR"? JE GETIND1 ;GO GET INDEX 1, IF YES MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETDID1 ; GETIND1: MOV DX,OFFSET IND1_MSG ;GET 1ST INDEX CALL DISPLA MOV AH,0AH MOV DX,OFFSET IND_BUFF INT 21H CALL INDCONVERT JNC FINDDEV1 MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETIND1 FINDDEV1: MOV DX,DEV_1_TBL ;FIND PCI DEV MOV CX,DEV_1_TBL+2 XOR AX,AX MOV AL,IND_BUFF+2 MOV SI, AX MOV AH,PCI_FUNCTION_ID MOV AL,FIND_PCI_DEVICE INT PCI_BIOS_INT JC DEV1_BAD MOV DI,OFFSET DEV_1_TBL CALL READ_PCI_CFG ;READ ALL 256 BYTES MOV AL,READ_ERR CMP AL,0 JNE DEV1_READERR JMP GETVID2 DEV1_BAD: MOV AX,0FFFFH ;PUT 0FFFFH BACK IN MOV DEV_1_TBL, AX MOV DEV_1_TBL+2, AX MOV DX,OFFSET DEV1_BAD_MSG CALL DISPLA JMP GETVID1 DEV1_READERR: MOV DX,OFFSET DEV1_READERR_MSG CALL DISPLA JMP SKIPASK GETVID2: MOV DX,OFFSET VID2_MSG ;GET 1ST VID CALL DISPLA MOV AH,0AH MOV DX, OFFSET VID_BUFF INT 21H MOV SI,OFFSET DEV_2_TBL CALL VIDCONVERT JNC GETDID2 CMP AL,13 ;IS IT A "CR"? JE ASKBYE MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETVID2 ; GETDID2: MOV DX,OFFSET DID2_MSG ;GET 1ST DID CALL DISPLA MOV AH,0AH MOV DX,OFFSET DID_BUFF INT 21H MOV SI,OFFSET DEV_2_TBL+2 CALL DIDCONVERT JNC GETIND2 CMP AL,13 ;IS IT A "CR"? JE GETIND2 MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETDID2 ; GETIND2: MOV DX,OFFSET IND2_MSG ;GET 1ST INDEX CALL DISPLA MOV AH,0AH MOV DX,OFFSET IND_BUFF INT 21H CALL INDCONVERT JNC FINDDEV2 MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETIND2 FINDDEV2: MOV DX,DEV_2_TBL ;FIND PCI DEV MOV CX,DEV_2_TBL+2 XOR AX,AX MOV AL,IND_BUFF+2 MOV SI, AX MOV AH,PCI_FUNCTION_ID MOV AL,FIND_PCI_DEVICE INT PCI_BIOS_INT JC DEV2_BAD MOV DI,OFFSET DEV_2_TBL CALL READ_PCI_CFG MOV AL,READ_ERR CMP AL,0 JNE DEV2_READERR JMP GETVID3 DEV2_BAD: MOV AX,0FFFFH ;PUT 0FFFFH BACK IN MOV DEV_2_TBL, AX MOV DEV_2_TBL+2, AX MOV DX,OFFSET DEV2_BAD_MSG CALL DISPLA JMP GETVID2 DEV2_READERR: MOV DX,OFFSET DEV2_READERR_MSG CALL DISPLA JMP SKIPASK ; GETVID3: MOV DX,OFFSET VID3_MSG ;GET 1ST VID CALL DISPLA MOV AH,0AH MOV DX, OFFSET VID_BUFF INT 21H MOV SI,OFFSET DEV_3_TBL CALL VIDCONVERT JNC GETDID3 CMP AL,13 ;IS IT A "CR"? JE ASKBYE MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETVID3 ; GETDID3: MOV DX,OFFSET DID3_MSG ;GET 1ST DID CALL DISPLA MOV AH,0AH MOV DX,OFFSET DID_BUFF INT 21H MOV SI,OFFSET DEV_3_TBL+2 CALL DIDCONVERT JNC GETIND3 CMP AL,13 ;IS IT A "CR"? JE GETIND3 MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETDID3 ; GETIND3: MOV DX,OFFSET IND3_MSG ;GET 1ST INDEX CALL DISPLA MOV AH,0AH MOV DX,OFFSET IND_BUFF INT 21H CALL INDCONVERT JNC FINDDEV3 MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETIND3 FINDDEV3: MOV DX,DEV_3_TBL ;FIND PCI DEV MOV CX,DEV_3_TBL+2 XOR AX,AX MOV AL,IND_BUFF+2 MOV SI, AX MOV AH,PCI_FUNCTION_ID MOV AL,FIND_PCI_DEVICE INT PCI_BIOS_INT JC DEV3_BAD MOV DI,OFFSET DEV_3_TBL CALL READ_PCI_CFG MOV AL,READ_ERR CMP AL,0 JNE DEV3_READERR JMP GETVID4 DEV3_BAD: MOV AX,0FFFFH ;PUT 0FFFFH BACK IN MOV DEV_3_TBL, AX MOV DEV_3_TBL+2, AX MOV DX,OFFSET DEV3_BAD_MSG CALL DISPLA JMP GETVID3 DEV3_READERR: MOV DX,OFFSET DEV3_READERR_MSG CALL DISPLA JMP SKIPASK ; GETVID4: MOV DX,OFFSET VID4_MSG ;GET 1ST VID CALL DISPLA MOV AH,0AH MOV DX, OFFSET VID_BUFF INT 21H MOV SI,OFFSET DEV_4_TBL CALL VIDCONVERT JNC GETDID4 CMP AL,13 ;IS IT A "CR"? JE ASKBYE MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETVID4 ; GETDID4: MOV DX,OFFSET DID4_MSG ;GET 1ST DID CALL DISPLA MOV AH,0AH MOV DX,OFFSET DID_BUFF INT 21H MOV SI,OFFSET DEV_4_TBL+2 CALL DIDCONVERT JNC GETIND4 CMP AL,13 ;IS IT A "CR"? JE GETIND4 MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETDID4 ; GETIND4: MOV DX,OFFSET IND4_MSG ;GET 1ST INDEX CALL DISPLA MOV AH,0AH MOV DX,OFFSET IND_BUFF INT 21H CALL INDCONVERT JNC FINDDEV4 MOV DX,OFFSET IN_ERR_MSG CALL DISPLA JMP GETIND4 FINDDEV4: MOV DX,DEV_4_TBL ;FIND PCI DEV MOV CX,DEV_4_TBL+2 XOR AX,AX MOV AL,IND_BUFF+2 MOV SI, AX MOV AH,PCI_FUNCTION_ID MOV AL,FIND_PCI_DEVICE INT PCI_BIOS_INT JC DEV4_BAD MOV DI,OFFSET DEV_4_TBL CALL READ_PCI_CFG MOV AL,READ_ERR CMP AL,0 JNE DEV4_READERR JMP ASKBYE DEV4_BAD: MOV AX,0FFFFH ;PUT 0FFFFH BACK IN MOV DEV_4_TBL, AX MOV DEV_4_TBL+2, AX MOV DX,OFFSET DEV4_BAD_MSG CALL DISPLA JMP GETVID4 DEV4_READERR: MOV DX,OFFSET DEV4_READERR_MSG CALL DISPLA JMP SKIPASK ; NOP NOP ASKBYE: MOV DX,OFFSET SPACE CALL DISPLA CLC RET SKIPASK: MOV DX,OFFSET SPACE CALL DISPLA STC RET ASKINPUT ENDP ;******************************************************************** ;SUBROUTINE READ_PCI_CFG ; ;INPUT: BX=DEVICE HANDLE, DI=TBL_ENTRY ;OUTPUT: READ_ERR ;******************************************************************** READ_PCI_CFG PROC NEAR PUSH BX PUSH DI PUSH CX MOV AX,DATA MOV DS,AX MOV CX,128 MOV DX,0 READ_MORE: PUSH CX ;READ ALL 256 BYTES PUSH DI MOV DI,DX MOV AH,PCI_FUNCTION_ID MOV AL,READ_CONFIG_WORD INT PCI_BIOS_INT JC BAD_READ MOV AX,CX MOV DX,DI POP DI STOSW INC DX INC DX POP CX LOOP READ_MORE ; MOV AX,BX ;SAVE THE DEVICE HANDLER STOSW MOV READ_ERR,0 JMP READ_DONE ; BAD_READ: POP DI POP CX MOV READ_ERR,0FH READ_DONE: POP CX POP DI POP BX RET READ_PCI_CFG ENDP ;******************************************************************** ;SUBROUTINE CREATE_FILE ;INPUT: TOKEN ;OUTPUT: AXINIT01.CFG FILE ;******************************************************************** CREATE_FILE PROC NEAR PUSH BX PUSH CX ; MOV AH,3CH ;CREATE A FILE MOV CX,0 MOV DX,OFFSET CFGFILE INT 21H ; JC CREATE_BAD MOV TOKEN,AX ;WRITE TO FILE MOV AH,40H MOV BX,TOKEN MOV CX,1032 MOV DX,OFFSET DEV_1_TBL MOV AH,40H INT 21H JC CREATE_BAD CMP AX,1032 JNE DISKFUL ; MOV DX,OFFSET CREATE_OK_MSG CALL DISPLA JMP CREATE_BYE DISKFUL: MOV DX,OFFSET DISKFUL_MSG CALL DISPLA CREATE_BAD: MOV DX,OFFSET CREATE_BAD_MSG CALL DISPLA STC CREATE_BYE: POP CX POP BX RET CREATE_FILE ENDP ;******************************************************************** ;SUBROUTINE VIDCONVERT ;INPUT: SI=TBL_ENTRY ;OUTPUT: VID INTO TABLE, CARRY FLAG ;******************************************************************** VIDCONVERT PROC NEAR CLC MOV AL,VID_BUFF+2 ;GET 1ST CHAR CMP AL,13 ;IS IT A "CR" ? JNE VIDOK STC ;IF IS, SET CARRY AND JMP VIDBYE ;GET OUT VIDOK: CALL ASC2BIN ;CONVERT TO BINARY JC VIDBYE SHL AL,4 MOV TEMP,AL ;SAVE IT IN TEMP ; MOV AL,VID_BUFF+3 ;GET 2ND CHAR CALL ASC2BIN ;CONVERT TO BINARY JC VIDBYE OR AL,TEMP ;COMBINE INTO A BYTE INC SI MOV [SI],AL ;MOVE TO VID HI BYTE DEC SI ;POINT TO VID LO BYTE ; MOV AL,VID_BUFF+4 ;GET 3RD CHAR CALL ASC2BIN JC VIDBYE SHL AL,4 MOV TEMP,AL ;SAVE IT IN TEMP ; MOV AL,VID_BUFF+5 ;GET 4TH CHAR CALL ASC2BIN JC VIDBYE OR AL,TEMP ;COMBINE INTO A BYTE MOV [SI],AL ;MOVE TO VID LO BYTE CLC VIDBYE: RET VIDCONVERT ENDP ;******************************************************************** ;SUBROUTINE DIDCONVERT ;INPUT: SI=TBL_ENTRY ;OUTPUT: DID INTO TABLE, CARRY FLAG ;******************************************************************** DIDCONVERT PROC NEAR CLC MOV AL,DID_BUFF+2 ;GET 1ST CHAR CMP AL,13 ;IS IT A "CR" ? JNE DIDOK STC ;IF IS, SET CARRY AND JMP DIDBYE ;GET OUT DIDOK: CALL ASC2BIN ;CONVERT TO BINARY JC DIDBYE SHL AL,4 MOV TEMP,AL ;SAVE IT IN TEMP ; MOV AL,DID_BUFF+3 ;GET 2ND CHAR CALL ASC2BIN ;CONVERT TO BINARY JC DIDBYE OR AL,TEMP ;COMBINE INTO A BYTE INC SI MOV [SI],AL ;MOVE TO DID HI BYTE DEC SI ;POINT TO DID LO BYTE ; MOV AL,DID_BUFF+4 ;GET 3RD CHAR CALL ASC2BIN JC DIDBYE SHL AL,4 MOV TEMP,AL ;SAVE IT IN TEMP ; MOV AL,DID_BUFF+5 ;GET 4TH CHAR CALL ASC2BIN JC DIDBYE OR AL,TEMP ;COMBINE INTO A BYTE MOV [SI],AL ;MOVE TO DID HI BYTE CLC DIDBYE: RET DIDCONVERT ENDP ;******************************************************************** ;SUBROUTINE INDCONVERT ;INPUT: IND_BUFF+2 ;OUTPUT: C FLAG, IND_BUFF+2 ;******************************************************************** INDCONVERT PROC NEAR CLC MOV AL,IND_BUFF+2 ;GET 1ST CHAR CMP AL,13 ;IS IT "CR"? JNE IND2BIN XOR AL,AL ;DEFAULT INDEX=0 MOV IND_BUFF+2, AL CLC RET IND2BIN: CALL ASC2BIN ;CONVERT TO BINARY JNC IND_OK STC RET IND_OK: CLC MOV IND_BUFF+2, AL RET INDCONVERT ENDP ;*************************************************************************** ; ROUTINE TO CLEAR SCREEN AND PLACE CURSOR AT 0,0 ;INPUT: NONE ;OUTPUT: NONE ;*************************************************************************** ; CLEAR_SCREEN PROC NEAR PUSH AX ;SAVE AX PUSH CX PUSH DX PUSH BX MOV AX,600H ;AH=6 FUNCTION NUMBER, AL FOR NUMBER ;OF LINES TO SCROLL. 0=ENTIRE SCREEN BLANKED MOV CL,0 ;CL,CH =0, FOR UPPER LEFT CORNER OF WINDOW MOV CH,0 ;ROW MOV DL,79 ;DL = COLUMN NUMBER MOV DH,24 ;DH = ROW NUMBER MOV BH,7 ;NORMAL ATTRIBUTE INT 10H ;CALL BIOS TO DO IT ; MOV AH,02H ;SET CURSOR TO 0,0 MOV BH,0 MOV DH,0 MOV DL,0 INT 10H ; POP BX POP DX POP CX POP AX ;RESTORE AX RET ; CLEAR_SCREEN ENDP ;************************************************************************* ;SUBROUTINE DISPLA ;INPUT: DX; OFFSET OF STARTING STRING FROM DS ;OUTPUT: DISPLAY CHARACTER STRINGS ;************************************************************************* DISPLA PROC NEAR PUSH AX MOV AH,09H ;CALL STRING DISPLAY INT 21H POP AX RET DISPLA ENDP ;************************************************************************* ;SUBROUUTINE ASC2BIN ;INPUT: AL ;OUTPUT:AL ;************************************************************************* ASC2BIN PROC NEAR CMP AL,"0" ;CHK CHAR BOUNDARY JGE ASC09 ;BETWEEN 0 AND 9 JMP ASCBAD ASC09: CMP AL,"9" JG ASCA AND AL,0FH ;CONVERT 0-9 TO BINAY RET ASCA: CMP AL,"A" ;CHK A-F JGE ASCF JMP ASCBAD ASCF: AND AL, 5FH ;TAKE CARE OF UPPER ;AND LOWER CASE CMP AL, "F" JLE BINAF JMP ASCBAD BINAF: SUB AL,37H ;CONVERT A-F TO BINARY CLC RET ASCBAD: STC RET ASC2BIN ENDP ;*************************************************************************** CODE ENDS ; STACK SEGMENT PARA STACK 'STACK' DW 256 DUP(?) STACK ENDS ; END START