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