?? p_os.asm
字號:
;中文操作系統,演示中斷系統,漢字顯示,任務切換功能與分頁模式。
;By 潘龍平/nuaa/08990115
;Date:6/18/2002
;顯示模式為800*600 16色
;包含文件有:P_BASE_DEF.ASM,P_USER_1.ASM,INITLDT.ASM
; P_2.ASM,P_INT_SEV1.ASM
;其他用到的文件有 D:\HZK16,D:\FENBIN
;===============================================================
.MODEL HUGE
.386P
INCLUDE P_BASE.ASM
REAL_STACK SEGMENT STACK PARA 'STACK'
DB 200H DUP(0)
REAL_STACK_LEN EQU $
REAL_STACK ENDS
REAL_DATA SEGMENT
SAVE_GDT DW 4 DUP(0)
SAVE_IDT DW 4 DUP(0)
SAVE_SS DW 0
SAVE_SP DW 0
GDT_SIZE DW 0
GDT_ADDR DW 0,0
IDT_SIZE DW 0
IDT_ADDR DW 0,0
USER1_LDT_SIZE DW 0
USER1_LDT_ADDR DW 0,0
C_BUF_SIZE DW 0 ;讀漢字庫文件時用
G_BUF_SUM DD 0
C_BUFFER DB 1024 DUP(?)
HZKNAME DB 'D:\HZK16',0 ;漢字庫文件
HZK_HANDLE DW 0 ;漢字庫文件的句柄
HZK_OVER DB 0 ;讀漢字庫文件已結束
ERR_OPEN_HZK DB 'Can not open the file Chinese fonts file$',0
;打開漢字庫文件出錯信息
OK_MSG DB 0DH,0AH,'HAVE RETURNED TO DOS,HAVE A NICE DAY,BYE!$'
REAL_DATA_LEN EQU $
REAL_DATA ENDS
REAL_CODE SEGMENT WORD PUBLIC 'CODE'
ASSUME CS:REAL_CODE,DS:REAL_DATA,SS:REAL_STACK
START:
MOV AX,REAL_DATA
MOV DS,AX
CLI
MOV AX,REAL_STACK
MOV SS,AX
MOV AX,REAL_STACK_LEN
MOV SP,AX
MOV AX,OS_DATA
MOV DS,AX
MOV ES,AX
MOV CX,6400 ;加載圖片到內存ES:SI
MOV SI,OFFSET OS_BMPBUF
MOV DX,OFFSET OS_BMPNAME
CALL LOAD_PIC
CMP AL,0
JZ LBL_LOAD_PIC_SUC
MOV AH,9
MOV DX,OFFSET LOAD_BMP_ERR
INT 21H
MOV AH,4CH ;退出程序
INT 21H
LBL_LOAD_PIC_SUC:
MOV AX,1130H ;將字符集移到OS_DATA開始處
MOV BH,6
INT 10H ;取得字符集的地址ES:BP
MOV CX,2048
MOV DI,0
MOVE_CHAR_SET:
MOV AL,ES:[BP]
MOV DS:[DI],AL
INC DI
INC BP
LOOP MOVE_CHAR_SET
MOV AX,REAL_DATA
MOV DS,AX
MOV ES,AX
CALL INIT_IDT ;初始化中斷描述符表
CALL INIT_GDT ;初始化全局描述符表
CALL INIT_LDT ;初始化局部描述符表
MOV AX,4F02H ;進入600*800 16色模式
MOV BX,102H
INT 10H
;//////////////////////////////
;讀漢字庫文件到高端內存4M處
MOV AH,3DH
MOV DX,OFFSET HZKNAME
MOV AL,0
INT 21H
JNC LBL_OPEN_HZK_SUC
MOV AX,3
INT 10H
MOV AH,9 ;打開漢字庫文件出錯
MOV DX,OFFSET ERR_OPEN_HZK
INT 21H
MOV AH,4CH ;退出程序
INT 21H
LBL_OPEN_HZK_SUC:
MOV DS:HZK_HANDLE,AX
READ_HZK:
MOV DS:SAVE_SS,SS
MOV DS:SAVE_SP,SP
SGDT FWORD PTR SAVE_GDT
SGDT FWORD PTR SAVE_GDT
MOV BX,DS:HZK_HANDLE
MOV CX,1024
MOV DX,OFFSET C_BUFFER
MOV AH,3FH
INT 21H
JNC READ_HZK1
MOV AX,0
MOV DS:C_BUF_SIZE,AX
MOV DS:HZK_OVER,1 ;文件已讀完
MOV AH,3EH
INT 21H ;關閉漢字庫文件
JMP PROTECT_MODE
READ_HZK1:
MOV DS:C_BUF_SIZE,AX ;AX為讀出的實際長度
CMP AX,1024
JNL PROTECT_MODE
MOV DS:HZK_OVER,1 ;文件已讀完
MOV BX,DS:HZK_HANDLE
MOV AH,3EH
INT 21H ;關閉漢字庫文件
PROTECT_MODE:
MOV AX,REAL_DATA
MOV DS,AX
MOV AX,REAL_STACK
MOV SAVE_SS,AX
MOV SAVE_SP,SP
SGDT FWORD PTR SAVE_GDT
SIDT FWORD PTR SAVE_IDT
CLI
LGDT FWORD PTR GDT_SIZE
LIDT FWORD PTR IDT_SIZE
OPEN_A20
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JMP ENTER_PROTECT1
ENTER_PROTECT1:
DB 0EAH
DW OFFSET ENTER_PROTECT2
DW REAL_CODE_SEL
ENTER_PROTECT2:
MOV AX,REAL_DATA_SEL
MOV FS,AX
MOV AX,HZK_BUF_SEL
MOV GS,AX
CMP FS:C_BUF_SIZE,0
JE REAL_MODE
MOV ECX,0
MOV CX,FS:C_BUF_SIZE
MOV EAX,OFFSET C_BUFFER
MOV ESI,EAX
MOV EDI,FS:G_BUF_SUM
MOVE_BUF1:
MOV AL,FS:[ESI]
MOV GS:[EDI],AL
INC EDI
INC ESI
LOOP MOVE_BUF1
MOV FS:G_BUF_SUM,EDI
REAL_MODE:
CLI
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX
JMP ENTER_REAL1
ENTER_REAL1:
DB 0EAH
DW OFFSET ENTER_REAL2
DW REAL_CODE
ENTER_REAL2:
CLOSE_A20
MOV AX,REAL_DATA
MOV DS,AX
LGDT FWORD PTR SAVE_GDT
LIDT FWORD PTR SAVE_IDT
CLI
MOV SS,SAVE_SS
MOV SP,SAVE_SP
STI
CMP DS:HZK_OVER,1
JNE READ_HZK ;繼續讀漢字庫文件
;讀漢字庫結束
;///////////////////////////////
TURN_TO_PROTECT ;轉入保護模式,進入操作系統
LBL_TO_REAL:
RETURN_TO_REAL_1 ;從操作系統返回實模式
MOV AX,3
INT 10H
LEA DX,OK_MSG ;顯示返回提示信息
MOV CX,0C00H
MOV AH,9
INT 21H
MOV AH,4CH ;結束程序,返回DOS
INT 21H
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;****************INIT_IDT開始********************
INIT_IDT PROC FAR ;初始化 IDT
PUSH DS
MOV AX,IDT_SEG
MOV DS,AX
MOV DI,OFFSET IDT21
MOV AX,OFFSET SERVE_INT21
MOV DS:[DI].STRUCT_GATE.OFFSET_L,AX
POP DS
XOR DX,DX
MOV CX,16
MOV AX,IDT_SEG
MUL CX
ADC DX,0
MOV IDT_SIZE,IDT_LEN
MOV IDT_ADDR,AX
MOV IDT_ADDR+2,DX
RET
INIT_IDT ENDP
;++++++++++++++++INIT_IDT結束+++++++++++++++++++
;---------------------------------------------------------------
;****************INIT_GDT開始********************
INIT_GDT PROC FAR ;初始化 GDT
PUSH DS
MOV AX,GDT_SEG
MOV DS,AX
MOV SI,OFFSET GDT_INIT_BEGIN
MOV CX,GDT_INIT_COUNT
INIT_GDT_LBL1:
MOV AX,[SI].STRUCT_SEG.BASE_L
MOVZX EAX,AX
SHL EAX,4
SHLD EDX,EAX,16
MOV [SI].STRUCT_SEG.BASE_L,AX
MOV [SI].STRUCT_SEG.BASE_M,DL
MOV [SI].STRUCT_SEG.BASE_H,DH
ADD SI,SIZE STRUCT_SEG
LOOP INIT_GDT_LBL1
POP DS
XOR DX,DX
MOV CX,16
MOV AX,GDT_SEG
MUL CX
MOV GDT_SIZE,GDT_LEN
MOV GDT_ADDR,AX
MOV GDT_ADDR+2,DX
RET
INIT_GDT ENDP
;++++++++++++++++INIT_GDT結束+++++++++++++++++++
;加載圖片到內存ES:SI
;DS:DX圖片名稱(包括路徑)
;CX讀的字節數
;如果成功則AX=0,否則AX=-1
LOAD_PIC PROC FAR
PUSH DS
PUSH CX
PUSH DX
MOV AH,3DH
MOV AL,0
INT 21H
JC LOAD_PIC_FAILED
PUSH ES
POP DS
MOV DX,SI
MOV BX,AX
MOV AH,3FH
INT 21H
JC LOAD_PIC_FAILED
MOV AH,3EH
INT 21H
JC LOAD_PIC_FAILED
MOV AX,0
JMP LOAD_PIC_EXIT
LOAD_PIC_FAILED:
MOV AX,0FFH
LOAD_PIC_EXIT:
POP DX
POP CX
POP DS
RET
LOAD_PIC ENDP
INCLUDE INITLDT.ASM ;;初始化局部描述符表的過程
REAL_CODE ENDS
;**************保護模式下的堆棧段開始*************
OS_STACK SEGMENT STACK PARA USE16
DB 4096 DUP(0)
OS_STACK_LEN EQU $
OS_STACK ENDS
;++++++++++++++保護模式下的堆棧段結束+++++++++++++++
;---------------------------------------------------------------
;**************保護模式下的數據段開始***************
OS_DATA SEGMENT PARA USE16
ASC_CHAR DB 2048 DUP(0) ;英文字符集
V_GDT_SIZE DW GDT_LEN ;分頁時的GDT大小
V_GDT_ADDR DW 0,0 ;分頁時的GDT地址
V_IDT_SIZE DW IDT_LEN ;分頁時的IDT大小
V_IDT_ADDR DW 0,0 ;分頁時的IDT地址
P_GDT_SIZE DW 0 ;分頁前保存的GDT大小
P_GDT_ADDR DW 0,0 ;分頁前保存的GDT地址
P_IDT_SIZE DW 0 ;分頁前保存的IDT大小
P_IDT_ADDR DW 0,0 ;分頁前保存的IDT地址
OS_CODE_ADDR DD 0
OS_STACK_ADDR DD 0
OS_DATA_ADDR DD 0
OS_BMPNAME DB 'D:\FENBIN',0 ;位圖文件
OS_BMPBUF DB 6400 DUP(?) ;位圖的緩沖區
LOAD_BMP_ERR DB 'Can not Open the BMP file!$'
;打開BMP文件出錯信息
msg db '中',0
MSG1_1 DB '您好,歡迎使用中文操作系統',0
MSG1_2 DB '您正在保護方式下調用21H中斷來清屏與顯示字符串',0
MSG1_3 DB '請按 A 鍵進入系統的一個任務。',0
USER1_MSG_1 DB '您已經從操作系統切換到任務1。',0
USER1_MSG_2 DB '請按 S 鍵返回操作系統,并進入分頁模式。',0
MSG2_1 DB '您已經進入了分頁模式',0
MSG2_2 DB '您正在分頁模式下調用中斷處理程序',0
MSG2_3 DB '請按 D 鍵關閉分頁模式,返回系統。',0
MSG3_1 DB '暑假快樂!',0
MSG3_2 DB '謝謝使用中文操作系統。',0
MSG3_3 DB '請按 F 鍵回到DOS操作系統。',0
MSG_PLP DB '作者:潘龍平/08990115',0
OS_DATA_LEN EQU $
OS_DATA ENDS
;++++++++++++++保護模式下的數據段結束+++++++++++++++++++++++++++
;---------------------------------------------------------------
;**************保護模式下的任務狀態段開始***********************
OS_TSS SEGMENT PARA USE16
OS_TASK STRUCT_TSS<>
DB 0FFH
OS_TSS_LEN EQU $
OS_TSS ENDS
;++++++++++++++保護模式下的任務狀態段結束+++++++++++++++++++++++
;---------------------------------------------------------------
;**************OS代碼段開始*************************************
OS_CODE SEGMENT PARA USE16
ASSUME CS:OS_CODE,DS:OS_DATA,SS:OS_STACK
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
OS_BEGIN: ;保護模式入口
INIT_PROCTECT ;初始化保護模式
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -