www.pudn.com > czxtsycx1.zip > G_DEF.ASM


GDT_DESC    STRUC 
LIMIT       DW ? 
BASE_L      DW ? 
BASE_M      DB ? 
ACCESS      DB ? 
GRAN        DB ? 
BASE_H      DB ? 
GDT_DESC    ENDS 
SZ_GDT_DESC EQU SIZE GDT_DESC 
 
PE_ON       EQU 01H 
GDT_CS_SEL  EQU 08H 
GDT_DS_SEL  EQU 10H 
GDT_SS_SEL  EQU 18H 
VRAM_SEL    EQU 20H 
GDT_BUF_SEL EQU 28H 
G_BUF_BASE  = 040H  ;4M 
G_PDT_ADDR  = 212000H ;PHISICAL MEMORY 
G_PT0_ADDR  = 213000H ; 
 
GAT_DESC    STRUC 
OFFSET_L    DW 0 
SELECTOR    DW 0 
DCOUNT      DB 0 
GTYPE       DB 0 
OFFSET_H    DW 0 
GAT_DESC    ENDS 
 
IDT_DESC    STRUC 
OFF_L       DW ? 
SELECTOR    DW ? 
ATTR        DW ? 
OFF_H       DW ? 
IDT_DESC    ENDS 
 
TASKSS  STRUC 
TRLINK  DW 0,0     
TRESP0  DW 0,0 
TRSS0   DW 0,0 
TRESP1  DW 0,0 
TRSS1   DW 0,0 
TRESP2  DW 0,0 
TRSS2   DW 0,0 
TRCR3   DD 0 
TREIP   DW 0,0 
TREFLAG DD 0 
TREAX   DD 0 
TRECX   DD 0 
TREDX   DD 0 
TREBX   DD 0 
TRESP   DW 0,0 
TREBP   DD 0 
TRESI   DD 0 
TREDI   DD 0 
TRES    DW 0,0 
TRCS    DW 0,0 
TRSS    DW 0,0 
TRDS    DW 0,0 
TRFS    DW 0,0 
TRGS    DW 0,0 
TRLDT   DW 0,0 
TRFLAG  DW 0 
;TRIOMAP DW $ +2 
TRIOMAP DW 0068h 
        dd 5 dup(0) 
TASKSS  ENDS 
 
TO_DOS      MACRO             
            CLTS 
            cli 
            CALL CLOSE_A20 
            MOV AX,DATA 
            MOV DS,AX 
            MOV SS,SAVE_SS 
            MOV SP,SAVE_SP 
            LGDT FWORD PTR SAVE_GDT 
            LIDT FWORD PTR SAVE_IDT 
 
             
            MOV AL,11111100B                   ;open clock&keyboard 
            OUT 21H,AL 
            sti 
 
            sti 
            LEA DX,OK_MSG 
            mov cx,0C00H 
            MOV AH,9 
            INT 21H 
            MOV AX,4C00H 
            INT 21H 
            ENDM 
 
TURN_TO_PROTECT_PAGE MACRO 
            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_PAGE       ;clear instructors 
EDS_FLUSH2_PAGE: DB 0EAH 
            DW OFFSET TOS_BEGIN 
            DW TOS_CODE_SEL 
            ENDM 
 
REAL_BEGIN_PAGE  MACRO             
            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 GINT21H 
            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 
            MOV DS,AX 
            ENDM 
TOS_BEGIN0  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 
            ENDM 
 
;***********Page_add           
G_MOV       MACRO s_selector,d_selector,s_offset,d_offset,mlen           
            LOCAL G_MOV1 
            MOV AX,s_selector 
            MOV DS,AX 
            MOV AX,d_selector 
            MOV ES,AX 
            MOV SI,s_offset 
            MOV EDI,d_offset 
            MOV CX,mlen 
G_MOV1: 
            mov al,ds:[si] 
            mov es:[edi],al 
            inc si 
            inc edi 
            loop G_MOV1 
            MOV AX,g_vram_sel 
            MOV ES,AX 
            MOV AX,TOS_data_sel 
            MOV dS,AX 
            ENDM 
 
 
SEGMAP_DESC STRUC 
PH_ADDR     DD ? 
LO_ADDR     DD ? 
SEGMAP_DESC ENDS