www.pudn.com > czxtsycx1.zip > COS_USED.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 
;            MOVZX EDX,DX 
;            ADD EBX,EDX                ;EBX=TOS_STACK VIRTUAL BASE ADDR 
;            MOV EBX,0C0433000H         ;let tos_code 64K 
; 
;            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 
;            MOVZX EDX,DX 
;            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  
; 
;            ADD EBX,010000H   ;EBX=USER_PSTSSSEG ADDR let TOS_DATA 64k 
 
;            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 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 
            PUSH DS 
            PUSH ES 
            PUSH FS 
            MOV AX,G_MOV_SEL 
            MOV ES,AX 
            XOR ESI,ESI 
            XOR EDI,EDI 
;; 
            mov ebx,0 
            MOV AX,idt_SEL 
            MOV FS,AX 
            MOV ESI,0 
            MOV CX,idtLEN 
G_MOV1: 
            mov al,FS:[ESI] 
            mov es:[EBX],al 
            inc esi 
            inc EBX 
            loop G_MOV1 
;;            G_MOV IDT_SEL,G_MOV_SEL,0,0,IDTLEN  ;     4K 
            ;     s       d         s:offset  d:offset 
 
            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 
;; 
            mov ebx,1000h 
            MOV AX,TOS_TSSASDATA_SEL 
            MOV FS,AX 
            MOV ESI,0 
            MOV CX,tos_tssLEN 
G_MOV2: 
            mov al,FS:[ESI] 
            mov es:[EBX],al 
            inc esi 
            inc EBX 
            loop G_MOV2 
;;            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  
;; 
            mov ebx,2000h 
            MOV AX,GDT_ASDATA_SEL 
            MOV FS,AX 
            MOV ESI,0 
            MOV CX,gdtsegLEN 
G_MOV3: 
            mov al,FS:[ESI] 
            mov es:[EBX],al 
            inc esi 
            inc EBX 
            loop G_MOV3 
;;            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 
;; 
            mov ebx,23000h 
            MOV AX,tos_code_SEL 
            MOV FS,AX 
            MOV ESI,0 
            MOV CX,tos_codeLEN 
G_MOV4: 
            mov al,FS:[ESI] 
            mov es:[EBX],al 
            inc esi 
            inc EBX 
            loop G_MOV4 
;;            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 FOR stack 
 
            MOV EBX,33000H         ;let tos_code 64k 
            PUSH EBX               ;ebx=33000h 
;; 
            MOV AX,tos_stack_SEL 
            MOV FS,AX 
            MOV ESI,0 
            MOV CX,tos_stacklen 
G_MOV5: 
            mov al,FS:[ESI] 
            mov es:[EBX],al 
            inc esi 
            inc EBX 
            loop G_MOV5 
;;            G_MOV TOS_STACK_SEL,G_MOV_SEL,0,EBX,TOS_STACKLEN  
            pop ebx 
            push ebx                          ;ebx=33000h 
            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 
 
            POP EBX 
            XOR EDX,EDX 
            mov dx,TOS_STACKLEN 
            MOVZX EDX,DX 
            ADD EBX,EDX                        ;ebx=33000+tos_stacklen 
            MOV EBX,34000H                     ; LET tos_stacklen=1000h 
            PUSH EBX 
;; 
            MOV AX,TOS_DATA_SEL 
            MOV FS,AX 
            MOV ESI,0 
            MOV CX,DATA_TOSLEN 
G_MOV6: 
            mov al,FS:[ESI] 
            mov es:[EBX],al 
            inc esi 
            inc EBX 
            loop G_MOV6 
;;            G_MOV TOS_DATA_SEL,G_MOV_SEL,0,EBX,DATA_TOSLEN 
            pop ebx 
            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 
 
 
            MOV AX,USER_SEGS_mov_SEL 
            MOV ES,AX 
            MOV EBX,4096 
            MOV AX,USER_PSTSS_MOV_SEL 
            MOV FS,AX 
            MOV ESI,0 
            MOV CX,USER_PSTSSLEN 
G_MOV7: 
            mov al,FS:[ESI] 
            mov es:[EBX],al 
            inc esi 
            inc EBX 
            loop G_MOV7 
;;            G_MOV USER_PSTSS_MOV_SEL,G_MOV_SEL,0,EBX,USER_PSTSSLEN 
 
            MOV EBX,8192 
            MOV AX,USER_PSldt_MOV_SEL 
            MOV FS,AX 
            MOV ESI,0 
            MOV CX,USER_PSLDTLEN 
G_MOV8: 
            mov al,FS:[ESI] 
            mov es:[EBX],al 
            inc esi 
            inc EBX 
            loop G_MOV8 
;;            G_MOV USER_PSLDT_MOV_SEL,G_MOV_SEL,0,EBX,USER_PSLDTLEN 
 
SEGS_MOV_2M0: 
            POP FS 
            POP ES 
            POP DS 
            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 7  ;3:system  7 user important    
            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 
            ADD EAX,1000H                
            MOV DWORD PTR ES:[4092],EAX ;1023PAGE FOR SFT 
            ADD EAX,1000H                
            MOV DWORD PTR ES:[4088],EAX ;1022PAGE FOR PCB 
            ADD EAX,1000H                
            MOV DWORD PTR ES:[4084],EAX ;1021PAGE FOR PCB 
 
            ; ;设置页目录表中页表0的表项为用户页 
            ;;(U/S=0),可读写页(R/W=1),和页有效(PL=1) 
 
                            ;PAGE0 AND PAGE1 
            MOV AX,G_PT0_SEL           ;       ;初始化页表0 
            MOV ES,AX 
            XOR EDI,EDI 
            MOV CX,2048 
            XOR EAX,EAX 
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页 
            ;;(U/S=0),可读写页(R/W=1),和页有效(PL=1) 
PGT_INIT0: 
            ;STOSD 
            mov es:[edi],eax 
            add edi,4 
            ADD EAX,1000H  ;PH_ADDR=LO_ADDR 
            LOOP PGT_INIT0 
 
            MOV CX,16 
            MOV EAX,0B8000H  ;PAGE768  
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页 
PGT_INIT768:    ;3G 
            ;STOSD 
            mov es:[edi],eax 
            add edi,4 
            ADD EAX,1000H   
            LOOP PGT_INIT768 
            add edi,4032 
 
            MOV CX,512       ;phiscal:2M->4M virtual 3G+4M->3G+6 
            MOV EAX,200000H  ;PAGE769  2M 
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页 
PGT_INIT769:     
            ;STOSD 
            mov es:[edi],eax 
            add edi,4 
            ADD EAX,1000H   
            LOOP PGT_INIT769 
 
            ;sft sft_buf and 64k      page1023 last 128k +64K 
            MOV EDI,20288      ;4 PAGE table(16384)+976items*4 only fill last 48 items 
            MOV CX,48         ;48items 
            MOV EAX,1D0000H   ;PAGE1023   
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页 
PGT_INIT1023:     
            ;STOSD 
            mov es:[edi],eax 
            add edi,4 
            ADD EAX,1000H   
            LOOP PGT_INIT1023 
            ;file system part 
 
            ;PCB       page1022 4M 
            ;MOV DI,   AFTER SFT 
            MOV CX,1024         ;1K items 
            MOV EAX,800000H   ;PAGE1022  8m START 
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页 
PGT_INIT1022:     
            ;STOSD 
            mov es:[edi],eax 
            add edi,4 
            ADD EAX,1000H   
            LOOP PGT_INIT1022 
            ;file system part 
 
            ;USER_SEGS       page1021 4M 
            ;MOV DI,   AFTER SFT 
            MOV CX,1024         ;1K items 
            MOV EAX,0C00000H   ;PAGE1021  12m START 
            OR EAX,7     ;   ;设置页表0的其它所有表项为为用户页 
PGT_INIT1021:     
            ;STOSD 
            mov es:[edi],eax 
            add edi,4 
            ADD EAX,1000H   
            LOOP PGT_INIT1021 
            ;file system part 
 
PGT_INIT_END: 
            MOV AX,G_VRAM_SEL 
            MOV ES,AX 
            RET 
PGT_INIT    ENDP