?? cos_def.asm
字號:
TURN_TO_PROTECT_PAGE1 MACRO
MOV AX,V86TSSSEG
MOV DS,AX
MOV DS:28,G_PDT_ADDR
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SAVE_SS,AX
MOV SAVE_SP,SP
; save current GDTR & IDTR
SGDT FWORD PTR SAVE_GDT
SIDT FWORD PTR SAVE_IDT
cli
LGDT FWORD PTR GDT_ADDR
MOV AX,DATA_TOS
MOV DS,AX
LIDT FWORD PTR DS:IDTSIZE
CALL OPEN_A20
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
TOS_ENTRY_PAGE: ;run tos
JMP EDS_FLUSH2_PAGE1 ;clear instructors
EDS_FLUSH2_PAGE1: DB 0EAH
DW OFFSET TOS_BEGIN
DW TOS_CODE_SEL
ENDM
REAL_PAGE_INIT MACRO ;COS HAVE MODIFIED
CLI
MOV AX,STACK
MOV SS,AX
STI
;set gdt_desc for g_buf
;MOV AX,GDTSEG
;MOV DS,AX
;MOV DI,OFFSET G_BUF
;MOV [DI].BASE_L,0 ;base_addr=4M
;MOV [DI].BASE_M,G_BUF_BASE
;MOV [DI].GRAN,0FH ;limit=1M
;set idt_desc for IDT21
;MOV AX,IDTSEG
;MOV DS,AX
;MOV DI,OFFSET IDT21
;MOV AX,OFFSET COSINT21H
;MOV DS:[DI].OFF_L,AX
;set idt_desc for IDT0E
MOV AX,IDTSEG
MOV DS,AX
MOV DI,OFFSET IDT0E
MOV AX,OFFSET GINT0EH
MOV DS:[DI].OFF_L,AX
;setup idt
CLI
MOV AX,DATA_TOS
MOV DS,AX
MOV AX,IDTSEG
MOV CX,10H
MUL CX
ADC DX,0 ;DX:AX=32 address for IDT
MOV DS:IDTLOAD,AX
MOV DS:IDTLOAD+2,DX
MOV AX,OFFSET IDTLEN
ADD AX,1
MOV DS:IDTSIZE,AX
;;;
MOV AX,DATA_TOS
MOV DS,AX
XOR DX,DX
MOV AX,V86IDTSEG
MOV CX,10H
MUL CX
ADC DX,0 ;DX:AX=32 address for IDT
MOV DS:V86_IDTLOAD,AX
MOV DS:V86_IDTLOAD+2,DX
MOV AX,OFFSET V86IDTLEN
ADD AX,1
MOV DS:V86_IDTSIZE,AX
;;;
MOV AX,DATA
MOV DS,AX
ENDM
COS_INIT MACRO
cli
MOV AX,TOS_DATA_SEL
MOV DS,AX
MOV ES,AX
MOV AX,DATA_SEL
MOV FS,AX
MOV AX,G_BUF_SEL
MOV GS,AX
MOV AX,TOS_STACK_SEL
MOV SS,AX
MOV AX,TOS_STACKLEN
dec ax
MOV SP,AX
MOV AX,G_VRAM_SEL
MOV ES,AX
MOV AX,TOS_TSS_SEL
LTR AX
;***********page --->start
MOV AX,TOS_TSSASDATA_SEL
MOV DS,AX
MOV EAX,G_PDT_ADDR
mov DS:TOS_TASK.trcr3,eax
ENDM
COS_PAGE_INIT MACRO
;***********MODIFY interrupt --- use 200000H idt
MOV AX,TOS_DATA_SEL
MOV DS,AX
MOV WORD PTR DS:IDTLOAD,0
MOV WORD PTR DS:IDTLOAD+2,20h
LIDT FWORD PTR DS:IDTSIZE
;***********MODIFY gdt --- use 202000H gdt
MOV WORD PTR DS:IDTLOAD,2000H
MOV WORD PTR DS:IDTLOAD+2,20h
LGDT FWORD PTR DS:IDTSIZE
;***********ENTER PAGE
MOV EAX,G_PDT_ADDR
MOV CR3,EAX ; ;把頁目錄表基址裝入控制寄存器CR3
MOV EAX,CR0
OR EAX,80000000H
MOV CR0,EAX ; ;進入分頁模式
JMP SHORT PAGE_BEGIN ; ;清除指令緩沖區
PAGE_BEGIN: ;*********************
DB 0EAH
DW OFFSET V_TOS_CODE_BEGIN
DW V_TOS_CODE_SEL ; USE 2M PROGRAM
V_TOS_CODE_BEGIN:
MOV AX,V_TOS_DATA_SEL ; USE 2M DATA
MOV DS,AX
;CLI should not used
MOV AX,V_TOS_STACK_SEL ; USE 2M STACK
MOV SS,AX
;STI
MOV AX,V_TOS_TSS_SEL ; USE 2M TSS ONLY USEING IN PS_LDT
LTR AX
MOV CX,08D0H ; 清屏
MOV BX,0 ;ds:tos_data fs:data
scr1: MOV ES:[BX],0720H
ADD BX,2
LOOP scr1
CALL disp_TOS_in_tos ; 顯示U.EXE的LDT表和開頭部分內容,本書未給清單
;MOV AH,9 ; 顯示"This is a protect_mode program!"
;MOV CX,0205H ;15 row 21 column
;MOV DX,OFFSET TEST_MSG
;INT 21H
; HAVE ENTERED PAGE_MODE
ENDM
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -