📄 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 + -