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

📄 flatmem.asm

📁 PC燒錄BIOS的源程序
💻 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 + -