附件1.PCI.ASM

.386
DATA SEGMENT USE16
     BUS       DB  0
     DEVICENO  DB  0
     FUNC      DB  0
     VENDOR    DW  0
     DEVICE    DW  0
     CLASS     DD  0
     IRQ       DB  0
     DEVICETYPE DB  0
     ROMBASE   DD  0
     BASE0     DD  0
     COMMAND   DW  0
     MSG DB 'BUS# DEVICE# FUNC#  VENDOR  DEVICE CLASS BASE0     IRQ   ROM COMMAND', 0
DATA ENDS

STACK SEGMENT USE16
      DB  256 DUP (0)
      STACKLEN = $
STACK ENDS

CODE SEGMENT USE16
     ASSUME DS:DATA, CS:CODE, SS:STACK

START:
     MOV AX, DATA
     MOV DS, AX

CLI
     MOV AX, STACK
     MOV SS, AX
     MOV SP, STACKLEN
     STI

;显存地址
     MOV AX, 0B800H
     MOV ES, AX

MOV SI, OFFSET MSG
     MOV DI, 80 * 8
     CLD
NEXTCHAR:
     LODSB
     OR AL, AL
     JZ OVERCHAR
     MOV AH, 7
     STOSW
     JMP NEXTCHAR

OVERCHAR:
     MOV SI, 80 * 10

MOV BUS, 0
     MOV DEVICENO,0
     MOV FUNC, 0

PCI0:
    MOV ROMBASE, 0
     XOR EAX, EAX

MOV AL, BUS
     MOV CL, 5
     SHL EAX, CL
     OR  AL, DEVICENO
     MOV CL, 3
     SHL EAX, CL
     OR  AL, FUNC
     MOV CL, 8
     SHL EAX, CL
     OR  EAX, 80000000H

MOV DX, 0CF8H
     OUT DX, EAX
     MOV DX, 0CFCH
     IN  EAX, DX
     CMP AX, 0FFFFH
     JZ  NEXTPCI

;GET CONFIG SPACE
     MOV VENDOR, AX
     MOV CL, 16
     SHR EAX, CL
     MOV DEVICE, AX

XOR EAX, EAX
     MOV AL, BUS
     MOV CL, 5
     SHL EAX, CL
     OR  AL, DEVICENO
     MOV CL, 3
     SHL EAX, CL
     OR  AL, FUNC
     MOV CL, 8
     SHL EAX, CL
     OR  EAX, 80000008H

MOV DX, 0CF8H
     OUT DX, EAX
     MOV DX, 0CFCH
     IN  EAX, DX
     MOV CLASS, EAX

XOR EAX, EAX
     MOV AL, BUS
     MOV CL, 5
     SHL EAX, CL
     OR  AL, DEVICENO
     MOV CL, 3
     SHL EAX, CL
     OR  AL, FUNC
     MOV CL, 8
     SHL EAX, CL
     OR  EAX, 8000003CH

MOV DX, 0CF8H
     OUT DX, EAX
     MOV DX, 0CFCH
     IN  EAX, DX
     MOV IRQ, AL

XOR EAX, EAX
     MOV AL, BUS
     MOV CL, 5
     SHL EAX, CL
     OR  AL, DEVICENO
     MOV CL, 3
     SHL EAX, CL
     OR  AL, FUNC
     MOV CL, 8
     SHL EAX, CL
     OR  EAX, 80000004H

MOV DX, 0CF8H
     OUT DX, EAX
     MOV DX, 0CFCH
     IN  EAX, DX
     MOV COMMAND, AX

XOR EAX, EAX
     MOV AL, BUS
     MOV CL, 5
     SHL EAX, CL
     OR  AL, DEVICENO
     MOV CL, 3
     SHL EAX, CL
     OR  AL, FUNC
     MOV CL, 8
     SHL EAX, CL
     OR  EAX, 8000000CH

MOV DX, 0CF8H
     OUT DX, EAX
     MOV DX, 0CFCH
     IN  EAX, DX
     MOV CL, 16
     SHR EAX, CL
     MOV DEVICETYPE, AL

XOR EAX, EAX
     MOV AL, BUS
     MOV CL, 5
     SHL EAX, CL
     OR  AL, DEVICENO
     MOV CL, 3
     SHL EAX, CL
     OR  AL, FUNC
     MOV CL, 8
     SHL EAX, CL
     OR  EAX, 80000030H

MOV DX, 0CF8H
     OUT DX, EAX
     MOV EBX, EAX
     MOV DX, 0CFCH
     MOV EAX, 0FFFFFFFEH
     OUT DX, EAX

MOV EAX, EBX
     MOV DX, 0CF8H
     OUT DX, EAX
     MOV DX, 0CFCH
     IN  EAX, DX
     MOV ROMBASE, EAX

XOR EAX, EAX
     MOV AL, BUS
     MOV CL, 5
     SHL EAX, CL
     OR  AL, DEVICENO
     MOV CL, 3
     SHL EAX, CL
     OR  AL, FUNC
     MOV CL, 8
     SHL EAX, CL
     OR  EAX, 80000010H
     MOV DX, 0CF8H
     OUT DX, EAX
     MOV DX, 0CFCH
     IN  EAX, DX
     MOV BASE0, EAX

;SIMPLE  0??????
;     MOV AL, DEVICETYPE
;     AND AL, 07FH
;     CMP AL, 0
;     JNZ NEXTPCI

;DISPLAY SOMTHING.........
     MOV DI, SI

;SHOW BUS#....
     MOV AL, BUS
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 10

;SHOW DEVICE#....
     MOV AL, DEVICENO
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 16

;SHOW FUNC#....
     MOV AL, FUNC
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 14

;SHOW VENDOR ....
     MOV AX, VENDOR
     MOV CL, 8
     ROL AX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL AX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 12

;SHOW DEVICE ....
     MOV AX, DEVICE
     MOV CL, 8
     ROL AX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL AX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 10

;SHOW CLASS.....
     MOV EAX, CLASS
     MOV CL, 8
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 8

;SHOW BASE0........
     MOV EAX, BASE0
     MOV CL, 8
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 10

;SHOW  IRQ....
     MOV AL, IRQ
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI,8

;SHOW ROMBASE.........
     MOV EAX, ROMBASE
     MOV CL, 8
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     ROL EAX, CL
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 12

;SHOW DEVICETYPE.........
     MOV AL, DEVICETYPE
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4

;SHOW COMAMND.....
     MOV AX, COMMAND
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     MOV AL, AH
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 8

ADD SI, 80 * 2
NEXTPCI:
     CMP FUNC, 7
     JNZ  PCI1
     MOV FUNC, 0

CMP DEVICENO, 31
     JNZ PCI2
     MOV DEVICENO, 0

CMP BUS, 255
     JZ  OVER
     INC BUS
     JMP PCI0

PCI1:
     INC FUNC
     JMP PCI0

PCI2:
     INC DEVICENO
     JMP PCI0

;;;;
OVER:
     MOV AH, 4CH
     INT 21H

;AL->EDX
TOASCII PROC NEAR
    PUSH AX
    PUSH BX
    PUSH CX

XOR EDX, EDX
    MOV BL, AL
    AND AL, 0FH
    CMP AL, 9
    JA TO1
    ADD AL, '0'
    JMP TO2
TO1:
    SUB AL, 10
    ADD AL, 'A'
TO2:
    MOV AH, 7
    MOV DX, AX
    MOV CL, 16
    SHL EDX, CL

MOV CL, 4
    SHR BL, CL
    CMP BL, 9
    JA   TO3
    ADD BL, '0'
    JMP TO4
TO3:
    SUB BL, 10
    ADD BL, 'A'
TO4:
    MOV BH, 7
    MOV DX, BX

POP CX
    POP BX
    POP AX

RET
TOASCII ENDP

CODE ENDS
     END START

附件2.R256.ASM

.386
STACK SEGMENT USE16
      DB  256 DUP (0)
      STACKLEN = $
STACK ENDS

CODE SEGMENT USE16
     ASSUME CS:CODE, SS:STACK
START:
     CLI
     MOV AX, STACK
     MOV SS, AX
     MOV SP, STACKLEN
     STI

MOV AX, 0B800H
     MOV ES, AX
     MOV DI, 80 * 10

MOV EBX, 00060000H
     MOV CX, 100

NEXTBYTE:
     MOV EAX, EBX
     MOV DX, 0ECD4H
     OUT DX, EAX

PUSH CX
     MOV CX, 0FFFFH
     LOOP $
     POP CX

MOV DX, 0ECD7H
     IN AL, DX

CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 8
     INC EBX
    
     LOOP NEXTBYTE

MOV AH, 4CH
     INT 21H

;AL->EDX
TOASCII PROC NEAR
    PUSH AX
    PUSH BX
    PUSH CX

XOR EDX, EDX
    MOV BL, AL
    AND AL, 0FH
    CMP AL, 9
    JA TO1
    ADD AL, '0'
    JMP TO2
TO1:
    SUB AL, 10
    ADD AL, 'A'
TO2:
    MOV AH, 7
    MOV DX, AX
    MOV CL, 16
    SHL EDX, CL

MOV CL, 4
    SHR BL, CL
    CMP BL, 9
    JA   TO3
    ADD BL, '0'
    JMP TO4
TO3:
    SUB BL, 10
    ADD BL, 'A'
TO4:
    MOV BH, 7
    MOV DX, BX

POP CX
    POP BX
    POP AX

RET
TOASCII ENDP

CODE ENDS
     END START

附件3.ReadROM.ASM

.386P
DESC STRUC
     LIMIT  DW  0
     BASEL  DW  0
     BASEM  DB  0
     ATTR   DW  0
     BASEH  DB  0
DESC ENDS

GDTR STRUC
     LIMIT  DW   0
     BASE   DD   0
GDTR ENDS

DATA SEGMENT USE16
    GDTNULL  DESC <0, 0, 0, 0, 0>
    GDTNULLSEL = 0

GDTDATA  DESC <0FFFFH, 0, 0, 92H, 0>
    GDTDATASEL = OFFSET GDTDATA - OFFSET GDTNULL

GDTCODE DESC <0FFFFH, 0, 0, 98H, 0>
    GDTCODESEL = OFFSET GDTCODE - OFFSET GDTNULL

GDTSTACK DESC <0FFFFH, 0, 0, 92H, 0>
    GDTSTACKSEL = OFFSET GDTSTACK - OFFSET GDTNULL

GDTDISP DESC <0FFFFH, 8000H, 0BH, 92H, 0>
    GDTDISPSEL = OFFSET GDTDISP - OFFSET GDTNULL

GDTREAD  DESC <0FFFFH, 0, 00H, 92H, 0FH>
    GDTREADSEL = OFFSET GDTREAD - OFFSET GDTNULL

NEWGDTR GDTR <OFFSET NEWGDTR - OFFSET GDTNULL, 0>
DATA ENDS

STACK SEGMENT USE16
      DB  256 DUP (0)
      STACKLEN = $
STACK ENDS

CODE SEGMENT USE16
     ASSUME DS:DATA, CS:CODE, SS:STACK
START:
     MOV AX, DATA
     MOV DS, AX
     CLI
     MOV AX, STACK
     MOV SS, AX
     MOV SP, STACKLEN
     STI

MOV BH, 1  ;PCI总线号为1
     MOV BL, 7H ;PCI设备号为7
     MOV CH, 0  ;PCI功能号为0

XOR EAX, EAX
     MOV AL, BH
     MOV CL, 5
     SHL EAX, CL
     OR  AL, BL
     MOV CL, 3
     SHL EAX, CL
     OR  AL, CH
     MOV CL, 8
     SHL EAX, CL
     MOV EBX ,EAX
     OR EAX, 80000030H

MOV DX, 0CF8H
     OUT DX, EAX

MOV EAX, 0F000001H   ;设置ROM基地址为0F000000H,并且ROM使能。
;     MOV EAX, 0FFFFFFFFH  ;可以通过向ROM基地址写入0FFFFFFFH来检查ROM大小
     MOV DX, 0CFCH
     OUT DX, EAX

;下面使命令寄存器中的存储器空间控制使能
     MOV EAX, EBX
     OR EAX, 80000004H
     MOV DX, 0CF8H
     OUT DX, EAX

MOV DX, 0CFCH
     IN EAX, DX

OR EAX, 2
     MOV ECX, EAX

MOV EAX, EBX
     OR EAX, 80000004H
     MOV DX, 0CF8H
     OUT DX, EAX

MOV DX, 0CFCH
     MOV EAX, ECX
     OUT DX, EAX

;为进入安全模式做准备
     MOV AX, DATA
     MOV BX, 10H
     MUL BX
     MOV GDTDATA.BASEL, AX
     MOV GDTDATA.BASEM, DL
     MOV GDTDATA.BASEH, DH
     ADD AX, OFFSET GDTNULL
     ADC DX, 0
     MOV WORD PTR NEWGDTR.BASE, AX
     MOV WORD PTR NEWGDTR.BASE + 2, DX

MOV AX, STACK
     MOV BX, 10H
     MUL BX
     MOV GDTSTACK.BASEL, AX
     MOV GDTSTACK.BASEM, DL
     MOV GDTSTACK.BASEH, DH

MOV AX, CODE
     MOV BX, 10H
     MUL BX
     MOV GDTCODE.BASEL, AX
     MOV GDTCODE.BASEM, DL
     MOV GDTCODE.BASEH, DH

CLI
     LGDT FWORD PTR NEWGDTR

MOV EAX, CR0
     OR  EAX, 1
     MOV CR0, EAX

DB 0EAH
     DW OFFSET PROTECT
     DW GDTCODESEL
PROTECT:
     MOV AX, GDTSTACKSEL
     MOV SS, AX
     MOV SP, STACKLEN

MOV AX, GDTREADSEL
     MOV FS, AX
     MOV AX, GDTDISPSEL
     MOV ES, AX

;下面开始读数据了。
     MOV SI, 0
     MOV CX, 100H
     MOV DI, 80 * 10
R1:
     MOV AX, FS:[SI]
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     MOV AL, AH
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 6
     ADD SI, 2
     LOOP R1

MOV EAX, CR0
     AND EAX, 0FFFFFFFEH
     MOV CR0, EAX

DB 0EAH
     DW OFFSET REAL
     DW SEG REAL
REAL:
     MOV AX, DATA
     MOV ES, AX
     MOV FS, AX
     MOV AX, STACK
     MOV SS, AX
     MOV SP, STACKLEN
     STI

MOV AH, 4CH
     INT 21H
;AL->EDX
TOASCII PROC NEAR
    PUSH AX
    PUSH BX
    PUSH CX

XOR EDX, EDX
    MOV BL, AL
    AND AL, 0FH
    CMP AL, 9
    JA TO1
    ADD AL, '0'
    JMP TO2
TO1:
    SUB AL, 10
    ADD AL, 'A'
TO2:
    MOV AH, 7
    MOV DX, AX
    MOV CL, 16
    SHL EDX, CL

MOV CL, 4
    SHR BL, CL
    CMP BL, 9
    JA   TO3
    ADD BL, '0'
    JMP TO4
TO3:
    SUB BL, 10
    ADD BL, 'A'
TO4:
    MOV BH, 7
    MOV DX, BX

POP CX
    POP BX
    POP AX

RET
TOASCII ENDP

CODE ENDS
     END START

附件4.ROM.ASM

.386P

STACK SEGMENT USE16
      DB 256 DUP (0)
      STACKLEN = $
STACK ENDS

CODE SEGMENT USE16
     ASSUME DS:CODE, SS:STACK, CS:CODE

ROMSTART:
     ;ROM HEADER
     HDR_SIG   DB  55H, 0AAH
     INITSIZE  DB  (ROMEND - ROMSTART) / 512   
     INIT      DB  0E9H
               DW  CODESTART - $ -2
     RESER1    DB  18  DUP (0)
     PPCIDATA  DW  OFFSET PDS_SIG

;PCI DATA STRUCTURE
     PDS_SIG   DB  'PCIR'
     VENDORID  DW  10ECH
     DEVICEID  DW  8139H
     RESER2    DW  0
     PDS_LEN   DW  24
     PDS_VER   DB  0
     CLSSCODE  DB  0, 0, 02H
     IMGLEN    DW  (ROMEND - ROMSTART) / 512
     IMGREV    DW  0
     IMGCLASS  DB  0
     INDICATOR DB  80H
     RESER3    DW  0

;PROCEDURE TOASCII
;AL->EDX
TOASCII PROC NEAR
    PUSH AX
    PUSH BX
    PUSH CX

XOR EDX, EDX
    MOV BL, AL
    AND AL, 0FH
    CMP AL, 9
    JA TO1
    ADD AL, '0'
    JMP TO2
TO1:
    SUB AL, 10
    ADD AL, 'A'
TO2:
    MOV AH, 7
    MOV DX, AX
    MOV CL, 16
    SHL EDX, CL

MOV CL, 4
    SHR BL, CL
    CMP BL, 9
    JA   TO3
    ADD BL, '0'
    JMP TO4
TO3:
    SUB BL, 10
    ADD BL, 'A'
TO4:
    MOV BH, 7
    MOV DX, BX

POP CX
    POP BX
    POP AX

RET
TOASCII ENDP

;NOW CAL CHECKSUM
;PARAM1  DS:SI--> FROM CAL
;        DS:DI--> TO CAL
;RETURN  AL
CALCS PROC NEAR
     PUSH SI
     PUSH DI
     PUSH CX

MOV CX, DI
     SUB CX, SI

MOV AL, 0
NB:
     ADD AL, DS:[SI]
     INC SI
     LOOP NB
     NOT AL
     INC AL

POP CX
     POP DI
     POP SI
     RET
CALCS ENDP

;#################################
TSRSTART:
     PUSHA
     MOV AX, 0B800H
     MOV ES, AX
     MOV AX, CS
     MOV DS, AX

CALL TT
     TSRMSG  DB  'CAN YOU SEE ME?', 0
TT:
     POP SI
     MOV DI, 80 * 10

;DISPLAY ADDRESS
     MOV AX, CS
     MOV AL, AH
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     MOV AX, CS
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4

MOV AH, 7
     MOV AL, ':'
     MOV ES:[DI], AX
     ADD DI, 2

MOV AX, SI
     MOV AL, AH
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     MOV AX, SI
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 6
     ;;

CLD
NC:
     LODSB
     OR AL, AL
     JZ OVER
     MOV AH, 7
     STOSW
     JMP NC
OVER:
     POPA
     IRET
TSREND  = $
;##################################

;##################################
CODESTART:
     PUSHA

MOV AX, 0B800H
     MOV ES, AX
     MOV AX, CS
     MOV DS, AX

CALL  CT
     ;1. DISPLAY SOME MESSAGE
     MSG DB 'HELLO WORLD:)', 0
CT:
     POP SI
     MOV DI, 80 * 10

;DISPLAY ADDRESS
     MOV AX, CS
     MOV AL, AH
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     MOV AX, CS
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4

MOV AH, 7
     MOV AL, ':'
     MOV ES:[DI], AX
     ADD DI, 2

MOV AX, SI
     MOV AL, AH
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 4
     MOV AX, SI
     CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 6
     ;;

CLD
NC1:
     LODSB
     OR AL, AL
     JZ OVER1
     MOV AH, 7
     STOSW
     JMP NC1
OVER1:
     ;2. CHANGE IVT
     MOV AX, 0
     MOV ES, AX
     MOV AX, OFFSET TSRSTART
     MOV ES:[98H * 4],  AX
     MOV AX, CS
     MOV ES:[98H * 4 + 2], AX

;3.NOW SET INIT SIZE = 0
     MOV AL,  (TSREND - ROMSTART + 511) / 512
     MOV INITSIZE, AL

;4.CAL NEWCHECKSUM
     MOV SI, ROMSTART
     XOR AH, AH
     MOV DI, AX
     MOV CL, 9
     SHL DI, CL
     SUB DI, 2
     ADD DI, SI

CALL CALCS
     MOV DS:[DI + 1], AL

POPA
     RETF

CODEEND = $

DB (512 - ((CODEEND - ROMSTART) AND 1FFH)) - 1  DUP (0)
     CHECKSUM  DB   0
     ROMEND = $
;#####################################

;#####################################
;MYDATE
     ;********************
     WRITEREG  DW   0ECD4H
     READREG   DW   0ECD7H

OKMSG  DB 'OK! WRITE SUCCESSFULLY!', 0
     ERRMSG DB 'WRITE ERROR! OVER!', 0
START:
     MOV AX, CODE
     MOV DS, AX
     MOV AX, 0B800H
     MOV ES, AX
     CLI
     MOV AX, STACK
     MOV SS, AX
     MOV SP, STACKLEN
     STI

;     DB 09AH
;     DW 3
;     DW SEG CODE

MOV SI, ROMSTART
     MOV DI, ROMEND
     CALL CALCS
     MOV CHECKSUM, AL

;NOW WRITE TO ROM AND VERIFY ROM*************
     MOV AX, 0B800H
     MOV ES, AX
     MOV BP, 14 * 80
     MOV SI, OFFSET ROMSTART
     MOV DI, 0
     MOV BX, ROMEND
     SUB BX, ROMSTART
NB2:
     MOV AL, DS:[SI]

;*********DISPLAY THE BYTE
     CALL TOASCII
     MOV ES:[BP], EDX
     ADD BP, 4
     ;***********

MOV CL, 24
     SHL EAX, CL      
     MOV AX, DI

MOV DX, WRITEREG
     OR  EAX, 000A0000H
     OUT DX, EAX
     ;WAIT ....
     MOV CX, 0FFFFH
     LOOP $

MOV DX, WRITEREG
     MOV EAX, 00040000H
     MOV AX, DI
     OUT DX, EAX
     ;WAIT ....
     MOV CX, 0FFFFH
     LOOP $
     ;.........

MOV DX, READREG
     IN  AL, DX
     CMP AL, DS:[SI]
     JNZ ERRDISP

INC SI
     INC DI

DEC BX
     JNZ NB2

;;;;;;;;;FINISHED! DISP OK!
     MOV SI, OFFSET OKMSG
     JMP  DISP
ERRDISP:         
     MOV SI, OFFSET ERRMSG

DISP:
     MOV DI, 80 * 12
     CLD
NEXTCHAR0:
     LODSB
     OR AL, AL
     JZ GOOUT
     MOV AH, 7
     STOSW
     JMP NEXTCHAR0

GOOUT:
     MOV AH, 4CH
     INT 21H

CODE ENDS
     END START

附件5.TROM.ASM

.386P
STACK SEGMENT USE16
      DB  256 DUP (0)
STACKLEN = $
STACK ENDS

CODE SEGMENT USE16
     ASSUME CS:CODE, SS:STACK

START:
     CLI
     MOV AX, STACK
     MOV SS, AX
     MOV SP, STACKLEN
     STI

INT 98H

MOV AH, 4CH
     INT 21H
CODE ENDS
     END START

附件6.W256.ASM

.386
DATA SEGMENT USE16
     MSG1 DB 'OK!', 0
     MSG2 DB 'ERROR', 0
DATA ENDS

STACK SEGMENT USE16
      DB  256 DUP (0)
      STACKLEN = $
STACK ENDS

CODE SEGMENT USE16
     ASSUME CS:CODE, SS:STACK, DS:DATA
START:
     MOV AX, DATA
     MOV DS, AX
     MOV AX, 0B800H
     MOV ES, AX

CLI
     MOV AX, STACK
     MOV SS, AX
     MOV SP, STACKLEN
     STI

MOV ESI, 0CC0A0000H ;将0CCH写入到ROM开头
     MOV BX, 6           ;的几个字节中

NEXTBYTE:
     MOV EAX, ESI
     MOV DX, 0ECD4H
     OUT DX, EAX

MOV CX, 0FFFFH     ;等待一下,以确保写入。
     LOOP $

;下面将写入的数据读出,进行校验。
     AND EAX, 0FFF7FFFFH
     MOV DX, 0ECD4H
     OUT DX, EAX

MOV CX, 0FFFFH     ;等待一下,以确保写入。
     LOOP $
    
     MOV DX, 0ECD7H
     IN AL, DX
     CMP AL, 0CCH
     JNZ ERROR           ;校验不通过。出错。

INC ESI            ;下一个地址
     DEC BX             ;减少计数器
     JNZ NEXTBYTE
    
     MOV SI, OFFSET MSG1
     JMP DISP
ERROR:
     MOV SI, OFFSET MSG2

DISP:
    MOV DI, 80 * 10
    CLD

NEXTCHAR:
    LODSB
    OR AL, AL
    JZ OVER
    MOV AH, 7
    STOSW
    JMP NEXTCHAR

OVER:
     MOV AH, 4CH
     INT 21H

CODE ENDS
     END START

 附件7:R128.ASM

.386
STACK SEGMENT USE16
      DB  256 DUP (0)
      STACKLEN = $
STACK ENDS

CODE SEGMENT USE16
     ASSUME CS:CODE, SS:STACK
START:
     CLI
     MOV AX, STACK
     MOV SS, AX
     MOV SP, STACKLEN
     STI

MOV AX, 0B800H
     MOV ES, AX
     MOV DI, 80 * 10

MOV EBX, 00064000H
     MOV CX, 100

NEXTBYTE:
     MOV EAX, EBX
     MOV DX, 0ECD4H
     OUT DX, EAX

PUSH CX
     MOV CX, 0FFFFH
     LOOP $
     POP CX

PUSH CX
     MOV CX, 0FFFFH
     LOOP $
     POP CX

PUSH CX
     MOV CX, 0FFFFH
     LOOP $
     POP CX

MOV DX, 0ECD7H
     IN AL, DX

CALL TOASCII
     MOV ES:[DI], EDX
     ADD DI, 6
     INC EBX
    
     LOOP NEXTBYTE

MOV AH, 4CH
     INT 21H

;AL->EDX
TOASCII PROC NEAR
    PUSH AX
    PUSH BX
    PUSH CX

XOR EDX, EDX
    MOV BL, AL
    AND AL, 0FH
    CMP AL, 9
    JA TO1
    ADD AL, '0'
    JMP TO2
TO1:
    SUB AL, 10
    ADD AL, 'A'
TO2:
    MOV AH, 7
    MOV DX, AX
    MOV CL, 16
    SHL EDX, CL

MOV CL, 4
    SHR BL, CL
    CMP BL, 9
    JA   TO3
    ADD BL, '0'
    JMP TO4
TO3:
    SUB BL, 10
    ADD BL, 'A'
TO4:
    MOV BH, 7
    MOV DX, BX

POP CX
    POP BX
    POP AX

RET
TOASCII ENDP

CODE ENDS
     END START

PCI网卡上扩展ROM编程 8.附件相关推荐

  1. PCI网卡上扩展ROM编程 4.利用8139C网卡读写EPROM

    利用8139C网卡读写EPROM 最后编辑:2010-5-25(修改错别字) 一.        27C256引脚和模式 只读存储器随着技术的发展,主要经历了ROM.PROM.EPROM.EEPROM ...

  2. PCI网卡上扩展ROM编程 3.基址寄存器

    基址寄存器 PCI设备中,除了配置空间外,还有两个物理空间:内存空间和I/O空间.为了访问这两个地址空间,就必须使用基址寄存器.头标类型0中涉及3种基址寄存器:内存空间基址寄存器.I/O空间基址寄存器 ...

  3. PCI网卡上扩展ROM编程 1.前言

    前言 一直觉得PCI还原卡上ROM程序很神奇:在一块PCI网卡上装上一块ROM,在机器启动自检时,ROM中的程序便能自动运行了.我总是在想:我要是有一天也能写一个ROM程序--哪怕是仅仅显示一句话-- ...

  4. PCI网卡上扩展ROM编程 5.PCI扩展ROM

    PCI扩展ROM 1.     ROM映像 在PCI规范中提供了一种机制,使PCI设备可以带一个扩展ROM.通过执行ROM中存放的代码来完成与设备有关的初始化,同时也有可能完成系统的引导功能.该机制允 ...

  5. PCI网卡引起的不开机故障

    一联想品牌机,2007年产的,今天出现开不出机的状况,按下开机电源无响应,间隔一段时间后能开机,但是关机之后又出现无法开机的情况,开机箱检查,拔出cmos电池,去除所有非关键外设,最小化硬件,偶然还是 ...

  6. VMware 10.0上NetBSD-1.0的PCI网卡驱动程序

    之前在VMware 10.0上成功安装了NetBSD-1.0,虽然系统在每次重启的时候会弹出一个错误提示框,而且有时候系统启动还会提示"ffs vmalloc dup ..."这样 ...

  7. 实现不同符合PCI规范的适配器 需求说明:PCI是一种规范,所有实现了该规范的适配器,必如显卡、声卡、网卡都可以安装到PCI插槽上并工作。模拟实现该功能。

    实现不同符合PCI规范的适配器 需求说明:PCI是一种规范,所有实现了该规范的适配器,必如显卡.声卡.网卡都可以安装到PCI插槽上并工作.模拟实现该功能. 实现思路及关键代码 1)定义PCI接口,具有 ...

  8. 51单片机 同时扩展ROM,RAM的具体实现及kiel的具体设置

    51MCU内部有RAM,ROM,不同于8031.尽管如今的增强行51MCU的内部RAM,ROM可能已经很大的空间.但就技术而言,扩展RAM,ROM还是需要学会的.               对于不同 ...

  9. Linux PCI网卡驱动分析

    http://www.uplinux.com/shizi/wenxian/4429.html Linux网卡驱动分析 学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难 ...

最新文章

  1. aix 的c库为什么都是静态库_关于AIX  libpthread.a 静态库
  2. WebService部署时提示:HTTP错误 404.3-Not Found,如果该页面是脚本,请添加处理程序,如果应下载文件,请添加MIME映射
  3. 【大话数据结构算法】查找算法
  4. aes js 加盐值 解密_Java已有AES加解密,现需要前端Javascript加密调接口,返回的数据需要解密,目前互..._慕课猿问...
  5. PHP配置环境中开启GD库
  6. 看完这篇 HTTP,跟面试官扯皮就没问题了
  7. 《深度学习要领》端到端的深度学习技术
  8. 【python】多进程返回值比较
  9. 计算机网络管理 孙卫真,计算机网络管理员
  10. 网盘有哪些?网盘哪个好用?
  11. js-09二级联动购物车案例
  12. (Verilog)多周期CPU设计
  13. 家用千兆路由器排行榜前十名_求家用路由器排名前十名,有哪些比较推荐?
  14. houdini环境变量服务器文件读不了,Windows下在普通命令行窗口里初始化Houdini环境...
  15. 计算机usb端口没反应,如何解决win10系统电脑usb接口没反应的问题
  16. 南加大计算机专业硕士申请,南加州大学计算机科学专业硕士申请条件独家整理附案例分析...
  17. Codeforces Round #360(div2)
  18. 如何上好大学计算机基础,如何学好大学计算机基础
  19. 用windows自带的远程桌面,实现不同局域网的电脑相互访问
  20. leetcode系列--875.爱吃香蕉的珂珂

热门文章

  1. 企业数字化转型战略完整指南!
  2. CameraController 相机控制
  3. 柯博文老師的繁體新書- Arduino 互動設計專題與實戰,深入Arduino 的全方位指南...
  4. 《人类简史》为什么消费主义喜欢讲故事?
  5. CBC网络收音地址以及SOPCAST凤凰台地址
  6. 实战敏感信息泄露高危漏洞挖掘利用
  7. 利用turtle绘制爱心
  8. 【开发教程1】开源蓝牙智能健康手表-整机功能演示
  9. 数据可视化ECharts的七大常用图表,看完就会用(1)
  10. UE5开发仿原神风格MMOARPG大型网络demo演示