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

📄 memfunc.asm

📁 访问32位PCI总线MEMORY的例程
💻 ASM
📖 第 1 页 / 共 4 页
字号:
	;VCPIの場合、256KB転送毎にページへのメモリ割り当てを更新
	;-----------------------
@@VCPI:
        CALL    ENTER_PROTECT
	JC	@@error

	PUSH	ECX

	TEST	DX, DX
	JNZ	@@vcpiReverseCopy ;アドレス減少方向

	;アドレス増加方向へ
	;--------------------
@@vcpiLoopNormalCopy:
	PUSH	ECX
	PUSH	ESI
	PUSH	EDI
	CMP	ECX, 40000H
	JBE	@@vcpiLastNormalCopy
	MOV	ECX, 40000H
@@vcpiLastNormalCopy:
	CALL	GET_SORC_SEL
	CALL	GET_DEST_SEL
	CLD
	REP	MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
	POP	EDI
	POP	ESI
	POP	ECX
	MOV	EAX, 40000H
	ADD	ESI, EAX
	ADD	EDI, EAX
	SUB	ECX, EAX
	JA	@@vcpiLoopNormalCopy
	JMP	@@success

	;アドレス減少方向へ
	;--------------------
@@vcpiReverseCopy:

	LEA	ESI,[ESI+ECX]
	LEA	EDI,[EDI+ECX]

@@vcpiLoopReverseCopy:
	PUSH	ECX
	CMP	ECX, 40000H
	JBE	@@vcpiLastReverseCopy
	MOV	ECX, 40000H
@@vcpiLastReverseCopy:
	PUSH	ESI
	PUSH	EDI
	SUB	ESI, ECX
	SUB	EDI, ECX
	CALL	GET_SORC_SEL
	CALL	GET_DEST_SEL
	LEA	ESI,[ESI+ECX-1]
	LEA	EDI,[EDI+ECX-1]
	STD
	REP	MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
	POP	EDI
	POP	ESI
	POP	ECX
	MOV	EAX, 40000H
	SUB	ESI, EAX
	SUB	EDI, EAX
	SUB	ECX, EAX
	JA	@@vcpiLoopNormalCopy

@@success:
	CALL	LEAVE_PROTECT
	POP	AX
	POP	BX
	JMP	@@exit

@@error:
	POP	AX
	POP	BX
	XOR	AX, AX
	XOR	BX, BX
@@exit:
	RET

copyHimemByte_ ENDP
;**************************
; copy from himem to himem by word
;
; unsigned int copyHimemWord(unsigned long SourceAddress,unsigned long DestAddress,unsigned int words)
;
;       入力    BX:AX	Source address
;		DX:CX	Destination address
;		[SP-2].L Copy Size(unit word)
;       出力    BX:AX	Copied Size(unit word)
;       破壊    nothing
;**************************
copyHimemWord_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES,words:DWORD

        PUSH    BX
        PUSH    AX
        POP     ESI
        PUSH    DX
        PUSH    CX
        POP     EDI
	MOV	ECX, words
	SHL	ECX, 1

;コピー方向をチェック
;----------------------
	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

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

	;VCPIの場合、256KB転送毎にページへのメモリ割り当てを更新
	;-----------------------
@@VCPI:
        CALL    ENTER_PROTECT
	JC	@@error

	SHR	ECX, 1
	PUSH	ECX

	TEST	DX, DX
	JNZ	@@vcpiReverseCopy ;アドレス減少方向

	;アドレス増加方向へ
	;--------------------
@@vcpiLoopNormalCopy:
	PUSH	ECX
	PUSH	ESI
	PUSH	EDI
	CMP	ECX, 40000H/2
	JBE	@@vcpiLastNormalCopy
	MOV	ECX, 40000H/2
@@vcpiLastNormalCopy:
	SHL	ECX, 1
	CALL	GET_SORC_SEL
	CALL	GET_DEST_SEL
	SHR	ECX, 1
	CLD
	REP	MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
	POP	EDI
	POP	ESI
	POP	ECX
	ADD	ESI, 40000H
	ADD	EDI, 40000H
	SUB	ECX, 40000H/2
	JA	@@vcpiLoopNormalCopy
	JMP	@@success

	;アドレス減少方向へ
	;--------------------
@@vcpiReverseCopy:

	LEA	ESI,[ESI+ECX*2]
	LEA	EDI,[EDI+ECX*2]

@@vcpiLoopReverseCopy:
	PUSH	ECX
	PUSH	ESI
	PUSH	EDI
	CMP	ECX, 40000H/2
	JBE	@@vcpiLastReverseCopy
	MOV	ECX, 40000H/2
@@vcpiLastReverseCopy:
	SHL	ECX, 1
	SUB	ESI, ECX
	SUB	EDI, ECX
	CALL	GET_SORC_SEL
	CALL	GET_DEST_SEL
	SHR	ECX, 1
	LEA	ESI,[ESI+ECX*2-2]
	LEA	EDI,[EDI+ECX*2-2]
	STD
	REP	MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
	POP	EDI
	POP	ESI
	POP	ECX
	SUB	ESI, 40000H
	SUB	EDI, 40000H
	SUB	ECX, 40000H/2
	JA	@@vcpiLoopNormalCopy

@@success:
	CALL	LEAVE_PROTECT
	POP	AX
	POP	BX
	JMP	@@exit

@@error:
	POP	AX
	POP	BX
	XOR	AX, AX
	XOR	BX, BX
@@exit:
	RET

copyHimemWord_ ENDP
;**************************
; copy from himem to himem by long word
;
; unsigned int copyHimemLong(unsigned long SourceAddress,unsigned long DestAddress,unsigned int longWords)
;
;       入力    BX:AX	Source address
;		DX:CX	Destination address
;		[sp-2].l Copy Size(unit long word)
;       出力    BX:AX	Copied Size(unit long word)
;       破壊    nothing
;**************************
copyHimemLong_ PROC C NEAR PUBLIC USES ECX DX ESI EDI DS ES,longWords:DWORD

        PUSH    BX
        PUSH    AX
        POP     ESI
        PUSH    DX
        PUSH    CX
        POP     EDI
	MOV	ECX, longWords
	SHL	ECX, 2

;コピー方向をチェック
;----------------------
	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

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

	;VCPIの場合、256KB転送毎にページへのメモリ割り当てを更新
	;-----------------------
@@VCPI:
        CALL    ENTER_PROTECT
	JC	@@error

	SHR	ECX, 2
	PUSH	ECX

	TEST	DX, DX
	JNZ	@@vcpiReverseCopy ;アドレス減少方向

	;アドレス増加方向へ
	;--------------------
@@vcpiLoopNormalCopy:
	PUSH	ECX
	PUSH	ESI
	PUSH	EDI
	CMP	ECX, 40000H/4
	JBE	@@vcpiLastNormalCopy
	MOV	ECX, 40000H/4
@@vcpiLastNormalCopy:
	SHL	ECX, 2
	CALL	GET_SORC_SEL
	CALL	GET_DEST_SEL
	SHR	ECX, 2
	CLD
	REP	MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
	POP	EDI
	POP	ESI
	POP	ECX
	ADD	ESI, 40000H
	ADD	EDI, 40000H
	SUB	ECX, 40000H/4
	JA	@@vcpiLoopNormalCopy
	JMP	@@success

	;アドレス減少方向へ
	;--------------------
@@vcpiReverseCopy:

	LEA	ESI,[ESI+ECX*4]
	LEA	EDI,[EDI+ECX*4]

@@vcpiLoopReverseCopy:
	PUSH	ECX
	PUSH	ESI
	PUSH	EDI
	CMP	ECX, 40000H/4
	JBE	@@vcpiLastReverseCopy
	MOV	ECX, 40000H/4
@@vcpiLastReverseCopy:
	SHL	ECX, 2
	SUB	ESI, ECX
	SUB	EDI, ECX
	CALL	GET_SORC_SEL
	CALL	GET_DEST_SEL
	SHR	ECX, 2
	LEA	ESI,[ESI+ECX*4-4]
	LEA	EDI,[EDI+ECX*4-4]
	STD
	REP	MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
	POP	EDI
	POP	ESI
	POP	ECX
	SUB	ESI, 40000H
	SUB	EDI, 40000H
	SUB	ECX, 40000H/4
	JA	@@vcpiLoopNormalCopy

@@success:
	CALL	LEAVE_PROTECT
	POP	AX
	POP	BX
	JMP	@@exit

@@error:
	POP	AX
	POP	BX
	XOR	AX, AX
	XOR	BX, BX
@@exit:
	RET

copyHimemLong_ ENDP

;**************************
; fill from himem to himem by byte
;
; unsigned int fillHimemByte(unsigned long Address,unsigned int bytes)
;
;       入力    BX:AX	Read address
;		DX:CX	Fill Size(unit byte)
;		[SP-2].B Fill Data
;       出力    BX:AX	Filled Size(unit byte)
;       破壊    nothing
;**************************
fillHimemByte_ PROC C NEAR PUBLIC USES ECX DX EDI DS ES,writeData:BYTE

        PUSH    BX
        PUSH    AX
        POP     EDI
        PUSH    DX
        PUSH    CX
	POP	ECX

	MOV	AL, writeData

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

	;Real,DPMIの場合
	;------------------------
	PUSH	ECX
        CALL    ENTER_PROTECT
	CALL	GET_DEST_SEL
	CLD
	REP	STOS BYTE PTR ES:[EDI]
	JMP	@@success

	;VCPIの場合
	;------------------------
@@VCPI:
        CALL    ENTER_PROTECT
	JC	@@error

	PUSH	ECX

@@vcpiLoopFill:
	PUSH	ECX
	PUSH	EDI

	CMP	ECX, 40000H
	JBE	@@vcpiLastFill
	MOV	ECX, 40000H
@@vcpiLastFill:
	CALL	GET_DEST_SEL
	CLD
	REP	STOS BYTE PTR ES:[EDI]

	POP	EDI
	POP	ECX
	ADD	EDI, 40000H
	SUB	ECX, 40000H
	JA	@@vcpiLoopFill

@@success:
	CALL	LEAVE_PROTECT
	POP	AX
	POP	BX
	JMP	@@exit

@@error:
	POP	AX
	POP	BX
	XOR	AX, AX
	XOR	BX, BX
@@exit:
	RET

fillHimemByte_ ENDP
;**************************
; fill from himem to himem by word
;
; unsigned int fillHimemByte(unsigned long Address,unsigned int words)
;
;       入力    BX:AX	Read address
;		DX:CX	Fill Size(unit word)
;		[SP-2].W Fill Data
;       出力    BX:AX	Filled Size(unit word)
;       破壊    nothing
;**************************
fillHimemWord_ PROC C NEAR PUBLIC USES ECX DX EDI DS ES,writeData:WORD

        PUSH    BX
        PUSH    AX
        POP     EDI
        PUSH    DX
        PUSH    CX
	POP	ECX

	MOV	AX, writeData

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

	;Real,DPMIの場合
	;------------------------
	PUSH	ECX
        CALL    ENTER_PROTECT
	SHL	ECX, 1
	CALL	GET_DEST_SEL
	SHR	ECX, 1
	CLD
	REP	STOS WORD PTR ES:[EDI]
	JMP	@@success

	;VCPIの場合
	;------------------------
@@VCPI:
        CALL    ENTER_PROTECT
	JC	@@error

	PUSH	ECX

@@vcpiLoopFill:
	PUSH	ECX
	CMP	ECX, 40000H/2
	JBE	@@vcpiLastFill
	MOV	ECX, 40000H/2
@@vcpiLastFill:
	PUSH	EDI
	SHL	ECX, 1
	CALL	GET_DEST_SEL
	SHR	ECX, 1
	CLD
	REP	STOS WORD PTR ES:[EDI]
	POP	EDI
	POP	ECX
	ADD	EDI, 40000H
	SUB	ECX, 40000H/2
	JA	@@vcpiLoopFill

@@success:
	CALL	LEAVE_PROTECT
	POP	AX
	POP	BX
	JMP	@@exit

@@error:
	POP	AX
	POP	BX
	XOR	AX, AX
	XOR	BX, BX
@@exit:
	RET

fillHimemWord_ ENDP
;**************************
; fill from himem to himem by long
;
; unsigned int fillHimemByte(unsigned long Address,unsigned int longWords)
;
;       入力    BX:AX	Read address
;		DX:CX	Fill Size(unit long word)
;		[SP-2].L Fill Data
;       出力    BX:AX	Filled Size(unit long word)
;       破壊    nothing
;**************************
fillHimemLong_ PROC C NEAR PUBLIC USES ECX DX EDI DS ES,writeData:DWORD

        PUSH    BX
        PUSH    AX
        POP     EDI
        PUSH    DX
        PUSH    CX
	POP	ECX

	MOV	EAX, writeData

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

	;Real,DPMIの場合
	;------------------------
	PUSH	ECX
        CALL    ENTER_PROTECT
	SHL	ECX, 2
	CALL	GET_DEST_SEL
	SHR	ECX, 2
	CLD
	REP	STOS DWORD PTR ES:[EDI]
	JMP	@@success

	;VCPIの場合
	;------------------------
@@VCPI:
        CALL    ENTER_PROTECT
	JC	@@error

	PUSH	ECX

@@vcpiLoopFill:
	PUSH	ECX
	CMP	ECX, 40000H/4
	JBE	@@vcpiLastFill
	MOV	ECX, 40000H/4

⌨️ 快捷键说明

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