📄 vbare.asm
字号:
assume cs:DosCodeSeg,ds:DATA_SEG,ss:DosStackSeg
Input:
pushad
push ds
push es
push fs
push gs
mov ax,NORMAL_SEL
mov ss,ax
mov sp,ax
mov eax,cr0
and eax,0fffffffeh
mov cr0,eax
jmp_16 <seg dos_int>,<offset dos_int>
dos_int:
mov ax,DATA_SEG
mov ds,ax
LSS sp,dword ptr Sp_Value
LIDT RealIdtr
sti
mov ah,6
mov al,0
mov bh,0;f & b Color
mov cx,0
mov dx,184fh
int 10h ;clear screen
mov ax,MainDataSeg
mov es,ax
mov ds,ax
lea bp,ExtMemMess
mov dx,0h
mov bh,0
mov cx,EMM_LEN+48
mov ah,13h
mov al,1
mov bl,034h
int 10H
cli
mov ax,DATA_SEG
mov ds,ax
LIDT qword ptr V_Idtr
mov eax,CR0
or eax,1
mov CR0,eax
JMP_16 < DOSCODE_SEL>,<offset Dos_V>
Dos_V:
mov ax,DOSSTACK_SEL
mov ss,ax
pop gs
pop fs
pop es
pop ds
popad
IRETD
jmp Input
DOSCODELENGTH=$
DosCodeSeg Ends
DosTSSSeg Segment para use16
dd 0
dd ?
dw ?,0
dd ?
dw ?,0
dd ?
dw ?,0
dd 0
dw Input,0
dd 0
dd 0
dd 0
dd 0
dd 0
dw DOSSTACKLENGTH,0
dd 0
dd 0
dd 0
dw NORMAL_SEL,0 ;es
dw DOSCODE_SEL,0 ;cs
dw DOSSTACK_SEL,0 ;ss
dw NORMAL_SEL,0 ;ds
dw NORMAL_SEL,0 ;fs
dw NORMAL_SEL,0 ;gs
dw DOSLDT_SEL,0 ;ldt
dw 0
dw $+2
db 0ffh
DOSTSSLENGTH=$
DosTSSSeg Ends
ControlSeg Segment PARA use16
assume cs:ControlSeg
VirtualEntry:
;===================================================================
mov ax,MAINTSS_ALIAS_SEL
mov fs,ax
mov dword ptr fs:Main_Tss.tresp0,MAINSTACK_POINTER_0
mov fs:Main_Tss.trss0,MAINSTACK_0_SEL
mov dword ptr fs:Main_Tss.tresp2,MAINSTACK_POINTER_2
mov fs:Main_Tss.trss2,MAINSTACK_2_SEL
mov fs:Main_Tss.trldt,MAINLDT_SEL
mov ax,MAINDATA_SEL
mov ds,ax
mov ax,ECHO_BUFFER_SEL
mov es,ax
mov gs,ax
mov ax,MAINSTACK_0_SEL
mov ss,ax
mov esp,MAINSTACK_POINTER_0
mov ax,MAINTSS_SEL
ltr ax
mov ax,MAINLDT_SEL
lldt ax
;-------------------------------------------------------------------
;===================================================================
Call_16 VISITEXMEM_SEL,GetExMem
int 21h
;-------------------------------------------------------------------
;===================================================================
push MAINSTACK_2_SEL
push MAINSTACK_POINTER_2
push LEVEL2_SEL
push offset Level2
retf
ReturnLevel_0_Entry:
pop ebx;level2 eip
pop ebx;level2 32bit cs
pop edx;12345678H
mov ax,MAINDATA_SEL
mov es,ax
lea di,Buffer_DPL
mov cx,4
toa_c:
rol edx,8
mov al,dl
Call_16 MAINCODE_SEL,ToAscii
stosw
loop toa_c
mov ax,MAINDATA_SEL
mov ds,ax
lea si,DPLConvert
mov ax,ECHO_BUFFER_SEL
mov es,ax
mov di,160*3
mov cx,DPL_LEN
call_16 MAINCODE_SEL,Dis_play
mov di,160*4
mov cx,8
lea si,Buffer_DPL
mov cx,8
call_16 MAINCODE_SEL,Dis_play
;-------------------------------------------------------------------
;===================================================================
mov ax,EXTMEM_SEL
mov ds,ax
mov dword ptr ds:[0],0
;-------------------------------------------------------------------
;===================================================================
INT 0FFH
;-------------------------------------------------------------------
;===================================================================
mov ax,MAINDATA_SEL
mov ds,ax
lea si,PageManage
mov ax,ECHO_BUFFER_SEL
mov es,ax
mov di,160*10
mov cx,PAGE_LEN
call_16 MAINCODE_SEL,Dis_play
INT 0FEH
;-------------------------------------------------------------------
ToReal:
mov ax,NORMAL_SEL
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
mov eax,cr0
and eax,0fffeh
mov cr0,eax
jmp FAR ptr ToDos
ControlSeg Ends
DATA_SEG Segment para use16
V_Gdtr G_IDC <GDTLENGTH-1,>
V_Idtr G_IDC <IDTLENGTH-1,>
RealIdtr G_IDC <3FFH,0>
Sp_Value dw ?
Ss_Value dw ?
DATA_SEG Ends
CODE_SEG Segment para use16
assume ds:DATA_SEG,CS:CODE_SEG
start:
mov ax,DATA_SEG
mov ds,ax
cld
push ds
call Init_Gdt
call Init_Idt
assume ds:MainLDTSeg
mov ax,MainLDTSeg
mov ds,ax
lea si,MainLDT_Init_Start
mov cx,MAINLDT_INIT_NUM
call Init_Ldt
assume ds:DosLDTSeg
mov ax,DosLDTSeg
mov ds,ax
mov cx,DOSLDT_INIT_NUM
lea si,DosLDT_Init_Start
call Init_Ldt
pop ds
assume ds:data_seg
mov Sp_Value,sp
mov Ss_Value,ss
LGDT V_Gdtr;GDTR
SIDT RealIdtr
cli
LIDT V_Idtr;IDTR
call Enabled_A20
mov eax,CR0
or eax,1
mov CR0,eax
JMP_16 <SWITCH_SEL>,<offset VirtualEntry>
ToDos:
call Disabled_A20
mov ax,DATA_SEG
mov ds,ax
lss sp,dword ptr Sp_Value
LIDT RealIdtr
sti
mov ax,DosDataSeg
mov es,ax
lea bp,DosMess
mov dx,1700H
mov bh,0
mov cx,DOSMESSLEN
mov al,0
mov bl,0d2h
mov ah,13h
int 10h
mov ah,0
int 16h
mov ah,6
mov al,0
mov bh,7;f & b Color
mov cx,0
mov dx,184fh
int 10h
mov ax,4c00h
int 21h
Init_Gdt proc near
push ds
assume ds:GDTSEG
mov ax,GDTSEG
mov ds,ax
mov cx,GDT_INIT_NUM
lea si,Gdt_Init_Start
repseg_gdt:
mov ax,[si].basel
mov bx,16
mul bx
mov [si].basel,ax
mov [si].basem,dl
mov [si].baseh,dh
add si,size DESCRIPTOR
loop repseg_gdt
assume ds:data_seg
pop ds
mov bx,16
mov ax,GDTSEG
mul bx
mov word ptr V_Gdtr.base,ax
mov word ptr V_Gdtr.base+2,dx
ret
Init_Gdt endp
Init_Ldt proc near
repseg_ldt:
mov ax,[si].basel
mov bx,16
mul bx
mov [si].basel,ax
mov [si].basem,dl
mov [si].baseh,dh
add si,size descriptor
loop repseg_ldt
ret
Init_Ldt endp
Init_Idt proc near
mov ax,IDTSEG
mov bx,16
mul bx
mov word ptr V_Idtr.base,ax
mov word ptr V_Idtr.base+2,dx
ret
Init_Idt Endp
Enabled_A20 proc near
push ax
in al,92h
or al,2
out 92h,al
pop ax
ret
Enabled_A20 endp
Disabled_A20 proc
push ax
in al,92h
and al,0fdh
out 92h,al
pop ax
ret
Disabled_A20 endp
CODE_SEG ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -