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