⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memfunc.asm

📁 访问32位PCI总线MEMORY的例程
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;use  TASM.EXE V2.01 or later
;
;      TASM /jSMART /jJUMPS /uM520 /jLOCALS /m8 /t
;

ERROR_MEMORY	EQU -1 ;Out Of Memory(needs 32KB or more)
ERROR_DRV	EQU -2 ;This V86 driver is not support VCPI or DPMI
ERROR_CPU	EQU -3 ;Not Support 80286 or before
ERROR_EMM	EQU -4 ;EMM386's Device name not found(EMMXXXX0)
ERROR_VCPI_PROT	EQU -5 ;VCPI can't enter protect mode
ERROR_DPMI_PROT	EQU -6 ;DPMI can't enter protect mode
ERROR_VCPI	EQU -7 ;Error in VCPI Function 1 or 0Ch
ERROR_DPMI	EQU -8 ;Error in DPMI Function 2,7,8,9 or 800h

.586P
CGROUP	GROUP TEXT,_TEXT

_TEXT SEGMENT BYTE PUBLIC 'CODE' USE16
_TEXT ENDS

TEXT SEGMENT BYTE PUBLIC 'CODE' USE16
     ASSUME  CS:CGROUP,DS:NOTHING,ES:NOTHING

;**************************
; Pre-Initialize the Himem access functions
;
; int preInitHimem()
;
;       入力    Nothing
;       出力    AX	0)Success
;                      -1)False
;       破壊    BX,ES
;**************************
preInitHimem_ PROC C NEAR PUBLIC USES CX DX SI DI BP DS ES

	CALL	CHK_CPU_MODE
	SBB	AX, AX
	JNZ	@@EXIT
	PUSH	AX
        CALL    A20_ON
	POP	AX
@@EXIT:
	RET

preInitHimem_ ENDP

;**************************
; mask NMI
;
; void _maskNMI();
;
;       入力    Nothing
;       出力    Nothing
;       破壊    Nothing
;**************************
maskNMI_ PROC C NEAR PUBLIC USES ax

	IN	AL,61H
	OR	AL,1100B
	OUT	61H,AL
	MOV	AL,80H
	OUT	70H,AL
	RET

maskNMI_ ENDP

;**************************
; unmask NMI
;
; void _unmaskNMI();
;
;       入力    Nothing
;       出力    Nothing
;       破壊    Nothing
;**************************
unmaskNMI_ PROC C NEAR PUBLIC USES ax

	IN	AL,61H
	AND	AL,NOT 1100B
	OUT	61H,AL
	IN	AL, 61h
	MOV	AL, 00H
	OUT	70H, AL
	RET

unmaskNMI_ ENDP

;**************************
; read byte data from Himem
;
; unsigned char readHimemByte(unsigned long Address)
;
;       入力    BX:AX	Read address
;       出力    AL
;       破壊    BX,ES
;**************************
readHimemByte_ PROC C NEAR PUBLIC USES CX DX ESI DS

	PUSH	BX
	PUSH	AX
	POP	ESI

        CALL    ENTER_PROTECT
	MOV	ECX, 1
	CALL	GET_SORC_SEL
	MOV	AL,DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

readHimemByte_ ENDP

;**************************
; write byte data to Himem
;
; void writeHimemByte(unsigned long Address,unsigned char Data)
;
;       入力    BX:AX	write address
;		CL	write data
;       出力    none
;       破壊    BX,ES
;**************************
writeHimemByte_ PROC C NEAR PUBLIC USES CX DX ESI DS

	PUSH	BX
	PUSH	AX
	POP	ESI
	PUSH	CX
        CALL    ENTER_PROTECT
	MOV	ECX, 1
	CALL	GET_SORC_SEL
	POP	AX
	MOV	DS:[ESI],AL
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

writeHimemByte_ ENDP


;**************************
; read word data from Himem
;
; unsigned short int readHimemWord(unsigned long Address)
;
;       入力    BX:AX	Read address
;       出力    AX
;       破壊    BX,ES
;**************************
readHimemWord_ PROC C NEAR PUBLIC USES CX DX ESI DS

	PUSH	BX
	PUSH	AX
	POP	ESI

        CALL    ENTER_PROTECT
	MOV	ECX, 2
	CALL	GET_SORC_SEL
	MOV	AX,DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

readHimemWord_ ENDP

;**************************
; write word data to Himem
;
; void writeHimemWord(unsigned long Address,unsigned int Data)
;
;       入力    BX:AX	write address
;		CX	write data
;       出力    none
;       破壊    BX,ES
;**************************
writeHimemWord_ PROC C NEAR PUBLIC USES CX DX ESI DS

	PUSH	BX
	PUSH	AX
	POP	ESI
	PUSH	CX
        CALL    ENTER_PROTECT
	MOV	ECX, 2
	CALL	GET_SORC_SEL
	POP	WORD PTR DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

writeHimemWord_ ENDP

;**************************
; read long data from Himem
;
; unsigned long readHimemLong(unsigned long Address)
;
;       入力    BX:AX	Read address
;       出力    BX:AX	Read Data
;       破壊    ES
;**************************
readHimemLong_ PROC C NEAR PUBLIC USES CX DX ESI DS

	PUSH	BX
	PUSH	AX
	POP	ESI

        CALL    ENTER_PROTECT
	MOV	ECX, 4
	CALL	GET_SORC_SEL
	MOV	EAX,DS:[ESI]
	PUSH	EAX
	POP	AX
	POP	BX
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

readHimemLong_ ENDP

;**************************
; write long data to Himem
;
; void writeHimemLong(unsigned long Address,unsigned long Data)
;
;       入力    BX:AX	write address
;		DX:CX	write data
;       出力    none
;       破壊    AX,BX,ES
;**************************
writeHimemLong_ PROC C NEAR PUBLIC USES CX DX ESI DS

	PUSH	BX
	PUSH	AX
	POP	ESI
	PUSH	DX
	PUSH	CX
        CALL    ENTER_PROTECT
	MOV	ECX, 4
	CALL	GET_SORC_SEL
	POP	DWORD PTR DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

writeHimemLong_ ENDP

;**************************
; read block byte data from Himem
;
; unsigned int readHimemBlockByte(unsigned long Address,unsigned char *Buffer,unsigned int bytes)
;
;       入力    BX:AX	Read address
;		DS:CX	Buffer address
;		DX	Read Size
;       出力    AX	Read Size
;       破壊    nothing
;**************************
readHimemBlockByte_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES

	PUSH	BX
	PUSH	AX
	POP	ESI

	MOV	AX,DS
	MOV	BL,AH
	SHR	BL,4
	SHL	AX,4
	ADD	AX,CX
	ADC	BL, 0
	XOR	BH, BH
	PUSH	BX
	PUSH	AX
	POP	EDI
	MOVZX	ECX,DX

        CALL    ENTER_PROTECT
	CALL	GET_SORC_SEL
	CLD
	PUSH	DSEL_FULL
	POP	ES
	PUSH	CX
	POP	AX
	REP	MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

readHimemBlockByte_ ENDP

;**************************
; write block byte data from Himem
;
; unsigned int writeHimemBlockByte(unsigned long Address,unsigned char *Buffer,unsigned int bytes)
;
;       入力    BX:AX	Read address
;		DS:CX	Buffer address
;		DX	Write Size
;       出力    AX	Write Size
;       破壊    nothing
;**************************
writeHimemBlockByte_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES

	PUSH	BX
	PUSH	AX
	POP	ESI

	MOV	AX,DS
	MOV	BL,AH
	SHR	BL,4
	SHL	AX,4
	ADD	AX,CX
	ADC	BL, 0
	XOR	BH, BH
	PUSH	BX
	PUSH	AX
	POP	EDI
	MOVZX	ECX,DX

        CALL    ENTER_PROTECT
	CALL	GET_SORC_SEL
	CLD
	PUSH	DS
	POP	ES
	PUSH	DSEL_FULL
	POP	DS
	PUSH	CX
	POP	AX
	XCHG	ESI,EDI
	REP	MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

writeHimemBlockByte_ ENDP

;**************************
; read block word data from Himem
;
; unsigned int readHimemBlockWord(unsigned long Address,unsigned char *Buffer,unsigned int words)
;
;       入力    BX:AX	Read address
;		DS:CX	Buffer address
;		DX	Read Size(unit word)
;       出力    AX	Read Size(unit word)
;       破壊    nothing
;**************************
readHimemBlockWord_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES

	AND	AL, NOT 1
	PUSH	BX
	PUSH	AX
	POP	ESI

	MOV	AX,DS
	MOV	BL,AH
	SHR	BL,4
	SHL	AX,4
	ADD	AX,CX
	ADC	BL, 0
	XOR	BH, BH
	PUSH	BX
	PUSH	AX
	POP	EDI
	MOVZX	ECX,DX

        CALL    ENTER_PROTECT
	CALL	GET_SORC_SEL
	CLD
	PUSH	DSEL_FULL
	POP	ES
	PUSH	CX
	POP	AX
	REP	MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

readHimemBlockWord_ ENDP

;**************************
; write block word data from Himem
;
; unsigned int writeHimemBlockWord(unsigned long Address,unsigned char *Buffer,unsigned int words)
;
;       入力    BX:AX	Write address
;		DS:CX	Buffer address
;		DX	Write Size(unit word)
;       出力    AX	Write Size(unit word)
;       破壊    nothing
;**************************
writeHimemBlockWord_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES

	AND	AL, NOT 1
	PUSH	BX
	PUSH	AX
	POP	ESI

	MOV	AX,DS
	MOV	BL,AH
	SHR	BL,4
	SHL	AX,4
	ADD	AX,CX
	ADC	BL, 0
	XOR	BH, BH
	PUSH	BX
	PUSH	AX
	POP	EDI
	MOVZX	ECX,DX

        CALL    ENTER_PROTECT
	CALL	GET_SORC_SEL
	CLD
	PUSH	DS
	POP	ES
	PUSH	DSEL_FULL
	POP	DS
	PUSH	CX
	POP	AX
	XCHG	ESI,EDI
	REP	MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

writeHimemBlockWord_ ENDP

;**************************
; read block long word data from Himem
;
; unsigned int readHimemBlockLong(unsigned long Address,unsigned char *Buffer,unsigned int longWords)
;
;       入力    BX:AX	Read address
;		DS:CX	Buffer address
;		DX	Read Size(unit long word)
;       出力    AX	Read Size(unit long word)
;       破壊    nothing
;**************************
readHimemBlockLong_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES

	AND	AL, NOT 11B
	PUSH	BX
	PUSH	AX
	POP	ESI

	MOV	AX,DS
	MOV	BL,AH
	SHR	BL,4
	SHL	AX,4
	ADD	AX,CX
	ADC	BL, 0
	XOR	BH, BH
	PUSH	BX
	PUSH	AX
	POP	EDI
	MOVZX	ECX,DX

        CALL    ENTER_PROTECT
	CALL	GET_SORC_SEL
	CLD
	PUSH	DSEL_FULL
	POP	ES
	PUSH	CX
	POP	AX
	REP	MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

readHimemBlockLong_ ENDP

;**************************
; write block long word data from Himem
;
; unsigned int writeHimemBlockLong(unsigned long Address,unsigned char *Buffer,unsigned int longWords)
;
;       入力    BX:AX	Write address
;		DS:CX	Buffer address
;		DX	Write Size(unit long word)
;       出力    AX	Write Size(unit long word)
;       破壊    nothing
;**************************
writeHimemBlockLong_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES

	AND	AL, NOT 11B
	PUSH	BX
	PUSH	AX
	POP	ESI

	MOV	AX,DS
	MOV	BL,AH
	SHR	BL,4
	SHL	AX,4
	ADD	AX,CX
	ADC	BL, 0
	XOR	BH, BH
	PUSH	BX
	PUSH	AX
	POP	EDI
	MOVZX	ECX,DX

        CALL    ENTER_PROTECT
	CALL	GET_SORC_SEL
	CLD
	PUSH	DS
	POP	ES
	PUSH	DSEL_FULL
	POP	DS
	PUSH	CX
	POP	AX
	XCHG	ESI,EDI
	REP	MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
	CALL	FREE_SORC_SEL
	CALL	LEAVE_PROTECT
	RET

writeHimemBlockLong_ ENDP

;**************************
; copy from himem to himem by byte
;
; unsigned int copyHimemByte(unsigned long SourceAddress,unsigned long DestAddress,unsigned int bytes)
;
;       入力    BX:AX	Source address
;		DX:CX	Destination address
;		[SP-2].l copy Size(unit byte)
;       出力    BX:AX	copied Size(unit byte)
;       破壊    nothing
;**************************
copyHimemByte_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES,bytes:DWORD

        PUSH    BX
        PUSH    AX
        POP     ESI
        PUSH    DX
        PUSH    CX
        POP     EDI
	MOV	ECX, bytes

;コピー方向をチェック
;----------------------
	XOR	DX, DX		;DX=0アドレス増加方向へコピー
	MOV	EAX, EDI
	SUB	EAX, ESI
	JBE	@@endCheckDirection
	CMP	EAX, ECX
	JAE	@@endCheckDirection
	INC	DX		;DX!=0アドレス減少方向へコピー
@@endCheckDirection:

;memory managerの種類で動作を変える
;------------------------
        TEST    CS:[FLAG],@VCPI
        JNZ     @@VCPI		;VCPIの場合は、細切れにコピー

        CALL    ENTER_PROTECT
	JC	@@error
	CALL	GET_SORC_SEL
	CALL	GET_DEST_SEL

	PUSH	ECX
	CLD
	TEST	DX, DX
	JZ	@@copy		;アドレス増加方向へ
	STD			;アドレス減少方向へ
	LEA	ESI,[ESI+ECX-1]
	LEA	EDI,[EDI+ECX-1]
@@copy:
	REP	MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
	JMP	@@success

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -