📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -