📄 flatmem.asm
字号:
;// This file implemente some Function to Initialize Memory to FlatReal Mode
;// MaSuiYi 2003.01.07
;// (C)opyright by Inventec Co., LTD.
.model small
.486p
.data
;//define all the data was used by this module
_SavedGDT DW 8 DUP(0)
;//define all the data was used by this module
.code
;//Macro definition
;// End of Macro Definition
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;//Global Output Function Declaration Begin
public _FlatRealOn
public _FlatRealOff
public _A20IsNotOn
public _SavedGDT
public _MoveLinBlockD
;//Global Output Function Declaration End
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;// C Like grammar:
;// int FlatRealOn();
;//
;// Input: SavedGDT = the Array to save GDT Information
;
;// Output: int : operation ok return 1 , error return 0
;
;// Stack: Unused
;
;// Description:put the Memory Address method into Flat Real Mode(4GB)
;
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
_FlatRealOn PROC NEAR
;286 check, probably too late anyway (depending on $G switch)
; PUSH SP
; POP AX
; CMP AX,SP
; JNZ @error
;//check for protected (V86) mode
SMSW AX
TEST AL,1
JNZ @error
;//Intel recommended 386 check*/
MOV BX,7000H
PUSHF
PUSH BX
POPF
PUSHF
POP CX
POPF
TEST CX,BX
JZ @error
;//486 check*/
DB 66H
PUSHF
DB 66H
PUSHF
DB 66H
POP AX
DB 66H
XOR AX,0
DW 4
DB 66H
PUSH AX
DB 66H
POPF
DB 66H
PUSHF
DB 66H
POP BX
DB 66H
POPF
DB 66H
XOR AX,BX
DB 66H
TEST AX,0
DW 4
JNZ @error
;//switch to flat real mode*/
DB 66H
MOV BX,DS ;//EBX=DS*/
DB 66H
SHL BX,4 ;//EBX=DS*16*/
DB 66H
MOV SI, OFFSET _SavedGDT
DW 0 ;//ESI=OFFSET SavedGDT*/
DB 66H
ADD BX,SI ;//EBX=linear addr of SavedGDT structure*/
PUSH AX
MOV AX , 0010H
MOV [DS:SI],AX ;//GDT limit*/
MOV [DS:SI+2],BX ;//GDT linear addr lo*/
SHR EBX,16 ;//BX=Hi(EBX)*/
MOV [DS:SI+4],BX ;//GDT linear addr hi*/
XOR DX,DX
MOV [DS:SI+10],DX ;//segment base bits 0-15*/
DEC DX
MOV [DS:SI+8],DX ;//segment limit bits 0..15 (actually 12-27)*/
MOV AX , 09200H
MOV [DS:SI+12],AX;//segment base bits 16-23, R/W,DT1,DPL0,P=1*/
MOV AX , 008FH
MOV [DS:SI+14],AX;//segment limit bits 16-19 (actually 28-31)*/
;//D=0,G=1(4K), segment base bits 24-31*/
POP AX ;//restore the AX Value from Stack
LGDT FWORD PTR _SavedGDT ;//Load GDTR*/
INC AX ;//PM on*/
CLI
LMSW AX ;//switch to PM*/
MOV BX,08H ;//flat segment*/
MOV ES,BX ;//ES=flat. NOTE:DS=flat->error??!!*/
DB 0FH,20H,0C0H ;//MOV EAX,CR0*/
DEC AX ;//PM off*/
DB 0FH,22H,0C0H ;//MOV CR0,EAX*/
STI
MOV AL,1
JMP @exit
@error: XOR AL,AL
@exit:
ret
_FlatRealOn ENDP
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;// C Like grammar:
;// void FlatRealOff();
;//
;// Input: SavedGDT = the Array to save GDT Information
;
;// Output: NONE
;
;// Stack: Unused
;
;// Description:put the Memory Address method out of Flat Real Mode(4GB)
;
;-----------------------------------------------------------------------------
;//Disable flat real mode
;//NOTE: It is assumed that FlatRealOn has been previously called !!
_FlatRealOff PROC NEAR
MOV SI,OFFSET _SavedGDT
XOR DX , DX
MOV DX , 00H
MOV BYTE [DS:SI+14],DX ;//segment limit bits 16-19 (actually 28-31)
;//D=0,G=0(byte), segment base bits 24-31
LGDT FWORD PTR _SavedGDT ;//Load GDTR
SMSW AX
INC AX ;//PM on
CLI
LMSW AX ;//switch to PM
MOV BX,08H ;//non-flat segment
MOV ES,BX ;//ES=normal
DB 0FH,20H,0C0H ;//MOV EAX,CR0
DEC AX ;//PM off
DB 0FH,22H,0C0H ;//MOV CR0,EAX
STI
Ret
_FlatRealOff ENDP
;//Check if A20 is On or Not
;//return TRUE when A20 is NOT ON ,return FALSE when A20 is ON
;// C Like grammar:
;// unsigned char A20IsNotOn();
_A20IsNotOn PROC NEAR
PUSH DS
MOV AX,0
MOV DS,AX
DEC AX
MOV ES,AX
CLI
MOV AL,[DS:0]
MOV BL,[ES:10H]
MOV AH,AL
XOR AL,55H
MOV [ES:10H],AL
CMP [DS:0],AL
MOV [DS:0],AH
MOV [ES:10H],BL
STI
POP DS
MOV AL,0
JNZ @@1
INC AL
@@1:
ret
_A20IsNotOn ENDP
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;// C Like grammar:
;// void MoveLinBlockD( long Src
; long Dest
; long BSize )
;//
;// Input: Src = source address in memory
; Dest = destination address in memory
; BSize = size of block
;
;// Output: None
;
;// Stack: Unused
;
;// Description:move a block in memory to another
;
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
_MoveLinBlockD PROC NEAR
Src EQU dword ptr [bp + 4]
Dest EQU dword ptr [bp + 8]
BSize EQU dword ptr [bp + 12]
push bp
mov bp, sp
xor ax,ax
mov es,ax
mov esi, Src
mov edi, Dest
mov ecx, BSize
mov al,cl
shr ecx,2
and al,3
cld
; db 26h
; dw 6667h
; rep movsw
push edx
Copy: mov edx , es:[esi]
mov es:[edi], edx
add edi , 4
add esi , 4
sub ecx , 4
jnz Copy
pop edx
rep movsd
mov cl,al
; dw 2667h
; rep movsb
rep movsb
pop bp
ret
_MoveLinBlockD ENDP
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -