📄 memfunc.asm
字号:
;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 + -