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


GINT0EH     PROC FAR 
            pop eax ;important  error code 
            PUSH EAX 
            PUSH FS 
            PUSH DI 
            MOV AX,G_PT0_SEL           ;       ;初始化页表0 
            MOV FS,AX 
                           ;PAGE 2  IN PAGE TABLE 1: invalid 
            MOV EAX,402000H    ;8K FROM 4M BEGIN 
            OR  EAX,3     ;   ;设置页表0的其它所有表项为为用户页 
            MOV DI,1008H 
            MOV DWORD PTR FS:[DI],EAX 
 
GINT0EH_END: 
            POP DI 
            POP FS 
            POP EAX 
            IRETD   ;iret-->error 
GINT0EH     ENDP 
 
;***********PAGE 
V_SEL_SETUP PROC FAR 
            ;setup v_tos_data_sel 
            XOR EDX,EDX 
            MOV EBX,0C0423000H         ;TOS_CODE VIRTUAL BASE ADDR 
            mov dx,TOS_CODELEN 
            and dx,0FFFH 
            cmp dx,0 
            JE  V_SEL1 
            ADD EBX,1000H 
V_SEL1: 
            mov dx,TOS_CODELEN 
            and dx,0F000H 
            ADD EBX,EDX                ;EBX=TOS_STACK VIRTUAL BASE ADDR 
 
            MOV AX,GDT_ASDATA_SEL     ;SETUP V_TOS_STACK_SEL 
            MOV DS,AX 
            MOV ECX,EBX 
            MOV DS:V_TOS_STACK.BASE_L,CX 
            SHR ECX,16 
            MOV DS:V_TOS_STACK.BASE_M,CL 
            MOV DS:V_TOS_STACK.BASE_H,CH  
 
            mov dx,TOS_STACKLEN 
            and dx,0FFFH 
            cmp dx,0 
            JE  V_SEL2 
            ADD EBX,1000H 
V_SEL2: 
            mov dx,TOS_STACKLEN 
            and dx,0F000H 
            ADD EBX,EDX   ;EBX=TOS_DATA ADDR 
 
            MOV AX,GDT_ASDATA_SEL      ;SETUP V_TOS_DATA_SEL 
            MOV DS,AX 
            MOV ECX,EBX 
            MOV DS:V_TOS_DATA.BASE_L,CX 
            SHR ECX,16 
            MOV DS:V_TOS_DATA.BASE_M,CL 
            MOV DS:V_TOS_DATA.BASE_H,CH  
; 
            mov dx,DATA_TOSLEN 
            and dx,0FFFH 
            cmp dx,0 
            JE  V_SEL3 
            ADD EBX,1000H 
V_SEL3: 
            mov dx,DATA_TOSLEN 
            and dx,0F000H 
            ADD EBX,EDX   ;EBX=USER_PSTSSSEG ADDR 
 
            MOV AX,GDT_ASDATA_SEL      ;SETUP V_USER_PSTSS_SEL 
            MOV DS,AX 
            MOV ECX,EBX 
            MOV DS:V_USER_PSTSS.BASE_L,CX 
            SHR ECX,16 
            MOV DS:V_USER_PSTSS.BASE_M,CL 
            MOV DS:V_USER_PSTSS.BASE_H,CH  
            MOV ECX,EBX                   ;SETUP USER_PSTSS_D 
            MOV DS:USER_PSTSS_D.BASE_L,CX 
            SHR ECX,16 
            MOV DS:USER_PSTSS_D.BASE_M,CL 
            MOV DS:USER_PSTSS_D.BASE_H,CH  
 
            ADD EBX,1000H         ;EBX=USER_PSLDTSEG 
            MOV AX,GDT_ASDATA_SEL      ;SETUP V_USER_PSLDT_SEL 
            MOV DS,AX 
            MOV ECX,EBX 
            MOV DS:V_USER_PSLDTT.BASE_L,CX 
            SHR ECX,16 
            MOV DS:V_USER_PSLDTT.BASE_M,CL 
            MOV DS:V_USER_PSLDTT.BASE_H,CH  
 
            ;MOV AX,USER_PSLDT_MOV_SEL      ;SETUP USER_PSLDT_SEL IN LDT 
            ;MOV DS,AX 
            ;MOV ECX,EBX 
            ;MOV DS:USER_PSLDT_MOV.BASE_L,CX 
            ;SHR ECX,16 
            ;MOV DS:USER_PSLDT_MOV.BASE_M,CL 
            ;MOV DS:USER_PSLDT_MOV.BASE_H,CH  
 
            MOV ECX,EBX                  ;SETUP USER_PSLDT_ASDATA_SEL 
            MOV DS:USER_PSLDTT_ASDATA.BASE_L,CX 
            SHR ECX,16 
            MOV DS:USER_PSLDTT_ASDATA.BASE_M,CL 
            MOV DS:USER_PSLDTT_ASDATA.BASE_H,CH  
; 
 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            RET 
V_SEL_SETUP ENDP 
 
SEGS_MOV_2M PROC FAR   ;mov to 2M   
            ;mov tos segs--->2M  use ds,es 
            XOR ESI,ESI 
            XOR EDI,EDI 
            G_MOV IDT_SEL,G_MOV_SEL,0,0,IDTLEN  ;     4K 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV DS:IDT_M.PH_ADDR,200000H    ;IDT: 2M 
            MOV DS:IDT_M.LO_ADDR,0C0400000H    ;IDT: 3G+4M 
 
            G_MOV TOS_TSSASDATA_SEL,G_MOV_SEL,0,1000H,TOS_TSSLEN ;4K 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV DS:TOS_TSS_M.PH_ADDR,201000H    ;TOS_TSS:2M+4k 
            MOV DS:TOS_TSS_M.LO_ADDR,0C0401000H  
 
            G_MOV GDT_ASDATA_SEL,G_MOV_SEL,0,2000H,GDTSEGLEN     ;16*4K 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV DS:GDT_M.PH_ADDR,202000H    ; 
            MOV DS:GDT_M.LO_ADDR,0C0402000H    ; 
            
            MOV DS:GPDT_M.PH_ADDR,212000H    ;4K 
            MOV DS:GPDT_M.LO_ADDR,0C0412000H    ;4K 
            MOV DS:GPT0_M.PH_ADDR,213000H    ;4K*16 16PAGES 
            MOV DS:GPT0_M.LO_ADDR,0C0413000H    ;4K*16 16PAGES 
 
            G_MOV TOS_CODE_SEL,G_MOV_SEL,0,23000H,TOS_CODELEN 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV DS:TOS_CODE_M.PH_ADDR,223000H    ; 
            MOV DS:TOS_CODE_M.LO_ADDR,0C0423000H    ; 
 
            XOR EDX,EDX 
            MOV EBX,0 
            mov dx,TOS_CODELEN 
            and dx,0FFFH 
            cmp dx,0 
            JE g_mov_1 
            ADD EBX,1000H 
g_mov_1: 
            mov dx,TOS_CODELEN 
            and dx,0F000H 
            ADD EBX,EDX 
            ADD EBX,23000H         ;EBX PHISICAL OFFSET 
            G_MOV TOS_STACK_SEL,G_MOV_SEL,0,EBX,TOS_STACKLEN  
            ADD EBX,200000H 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV DS:TOS_STACK_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX 
            ADD EBX,0C0200000H 
            MOV DS:TOS_STACK_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX 
            SUB EBX,0C0400000H 
; 
            XOR EDX,EDX 
            mov dx,TOS_STACKLEN 
            and dx,0FFFH 
            cmp dx,0 
            JE g_mov_2 
            ADD EBX,1000H 
g_mov_2: 
            mov dx,TOS_STACKLEN 
            and dx,0F000H 
            ADD EBX,EDX 
            G_MOV TOS_DATA_SEL,G_MOV_SEL,0,EBX,DATA_TOSLEN 
            ADD EBX,200000H 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV DS:DATA_TOS_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX 
            ADD EBX,0C0200000H 
            MOV DS:DATA_TOS_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX 
            SUB EBX,0C0400000H 
 
; 
            XOR EDX,EDX 
            mov dx,DATA_TOSLEN 
            and dx,0FFFH 
            cmp dx,0 
            JE g_mov_3 
            add EBX,1000H 
g_mov_3: 
            mov dx,DATA_TOSLEN 
            and dx,0F000H 
            ADD EBX,EDX 
            G_MOV USER_PSTSS_MOV_SEL,G_MOV_SEL,0,EBX,USER_PSTSSLEN 
            ADD EBX,200000H 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV DS:USER_PSTSS_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX 
            ADD EBX,0C0200000H 
            MOV DS:USER_PSTSS_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX 
            SUB EBX,0C0400000H 
; 
            ADD EBX,01000H 
            G_MOV USER_PSLDT_MOV_SEL,G_MOV_SEL,0,EBX,USER_PSLDTLEN 
            ADD EBX,200000H 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV DS:USER_PSLDT_M.PH_ADDR,EBX    ;GDT:2M+18*4k+EDX 
            ADD EBX,0C0200000H 
            MOV DS:USER_PSLDT_M.LO_ADDR,EBX    ;GDT:2M+18*4k+EDX 
SEGS_MOV_2M0: 
            MOV AX,TOS_DATA_SEL 
            MOV DS,AX 
            MOV AX,G_VRAM_SEL 
            MOV ES,AX 
            RET 
SEGS_MOV_2M ENDP 
;/////////// 
PGT_INIT    PROC FAR 
            ; USE ES 
            ; page DICTIONRY 
            MOV AX,G_PDT_SEL           ;       ;初始化页目录表 
            MOV ES,AX 
            XOR DI,DI 
            MOV CX,1024              ;  ;把其它所有项清空,置无效 
            XOR EAX,EAX 
            REP STOSD 
            MOV EAX,G_PT0_ADDR OR 3      
            MOV DWORD PTR ES:[0],EAX    ;0PAGE FOR TOS_CODE 
            ADD EAX,1000H                
            MOV DWORD PTR ES:[4],EAX    ;1PAGE FOR G_BUF 
            ADD EAX,1000H                
            MOV DWORD PTR ES:[3072],EAX ;768PAGE(3G) FOR VRAM    
            ADD EAX,1000H                
            MOV DWORD PTR ES:[3076],EAX ;769PAGE FOR TOS SYSTEM 
            ; ;设置页目录表中页表0的表项为用户页 
            ;;(U/S=0),可读写页(R/W=1),和页有效(PL=1) 
 
                            ;PAGE0 AND PAGE1 
            MOV AX,G_PT0_SEL           ;       ;初始化页表0 
            MOV ES,AX 
            XOR DI,DI 
            MOV CX,2048 
            XOR EAX,EAX 
            OR EAX,3     ;   ;设置页表0的其它所有表项为为用户页 
            ;;(U/S=0),可读写页(R/W=1),和页有效(PL=1) 
PGT_INIT0: 
            STOSD 
            ADD EAX,1000H  ;PH_ADDR=LO_ADDR 
            LOOP PGT_INIT0 
 
            MOV CX,1024 
            MOV EAX,0B8000H  ;PAGE768  
            OR EAX,3     ;   ;设置页表0的其它所有表项为为用户页 
PGT_INIT768:    ;3G 
            STOSD 
            ADD EAX,1000H   
            LOOP PGT_INIT768 
 
            MOV ECX,DS:USER_PSLDT_M.PH_ADDR 
            SUB ECX,200000H 
            SHR ECX,12 
            ADD CX,16 
            MOV EAX,200000H  ;PAGE769  2M 
            OR EAX,3     ;   ;设置页表0的其它所有表项为为用户页 
PGT_INIT769:     
            STOSD 
            ADD EAX,1000H   
            LOOP PGT_INIT769 
 
                           ;PAGE 2  IN PAGE TABLE 1: invalid 
            MOV EAX,402000H    ;8K FROM 4M BEGIN 
            OR EAX,2     ;   ;设置页表0的其它所有表项为为用户页 
            MOV DI,1008H 
            STOSD 
 
PGT_INIT_END: 
            MOV AX,G_VRAM_SEL 
            MOV ES,AX 
            RET 
PGT_INIT    ENDP