www.pudn.com > czxtsycx1.zip > 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