📄 os1.asm
字号:
.MODEL HUGE
STACK SEGMENT STACK PARA 'STACK'
DB 200 DUP(0)
STACK ENDS
Include G_DEF.ASM
CODE SEGMENT WORD PUBLIC 'CODE'
ASSUME CS:CODE, DS:DATA, SS:STACK
MODE_CHANGE PROC FAR
START:
MOV AX,DATA
MOV DS,AX
CLI
MOV AX,STACK
MOV SS,AX
MOV SAVE_SS,AX
MOV SP,200
MOV SAVE_SP,SP
STI
MOV DS:FILE_OVER,1
.386P
CALL OPEN_A20
SGDT FWORD PTR SAVE_GDT
SIDT FWORD PTR SAVE_IDT
MOV DI,OFFSET DAT:GDT_CS
MOV AX,Code1
MOV CX,10H
MUL CX
MOV DAT:[DI].BASE_L,AX
MOV DAT:[DI].BASE_M,DL
MOV DI,OFFSET DAT:GDT_DS
MOV DX,0
MOV AX,DS
MOV CX,10H
MUL CX
MOV DAT:[DI].BASE_L,AX
MOV DAT:[DI].BASE_M,DL
MOV DAT:[DI].BASE_H,DH
MOV DI,OFFSET DAT:GDT_SS
MOV AX,SS
MOV CX,10H
MUL CX
MOV DAT:[DI].BASE_L,AX
MOV DAT:[DI].BASE_M,DL
MOV DI,OFFSET DAT:GDT_BUF
MOV DAT:[DI].BASE_L,0
MOV DAT:[DI].BASE_H,020H
MOV DAT:[DI].GRAN,0FH
CLI
MOV AX,DS
MOV CX,10H
MUL CX
ADD AX,OFFSET GDT_DEF
ADC DX,0
MOV DTLOAD,AX
MOV DTLOAD+2,DX
MOV AX,OFFSET GDT_SIZE
SUB AX,OFFSET DTSIZE
ADD AX,1
MOV DTSIZE,AX
MOV DS:G_BUF_SUM,0
MOV AX,3D02H
LEA DX,FILE_NAME
INT 21H
JNC READ_FILE0
LEA DX,ERR_FILE
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
READ_FILE0: MOV DS:FILE_HANDLE,AX
READ_FILE:
MOV DS:SAVE_SS,SS
MOV DS:SAVE_SP,SP
SGDT FWORD PTR SAVE_GDT
SIDT FWORD PTR SAVE_IDT
MOV BX,DS:FILE_HANDLE
MOV CX,1024
MOV DX,OFFSET C_BUFFER
MOV AH,3FH
INT 21H
JNC READ_FILE1
MOV AX,0
MOV DS:C_BUF_SIZE,AX
MOV DS:FILE_OVER,AX
MOV AH,3EH
INT 21H
JMP PROTECT_MODE
READ_FILE1: MOV DS:C_BUF_SIZE,AX
CMP AX,1024
JNL PROTECT_MODE
MOV DS:FILE_OVER,0
MOV BX,DS:FILE_HANDLE
MOV AH,3EH
INT 21H
JMP PROTECT_MODE
REAL_MODEO:
CALL CLOSE_A20
MOV AX,DATA
MOV DS,AX
LGDT FWORD PTR SAVE_GDT
LIDT FWORD PTR SAVE_IDT
CLI
MOV SS,SAVE_SS
MOV SP,SAVE_SP
STI
JMP READ_FILE
PROTECT_MODE:
CLI
LGDT FWORD PTR DTSIZE
MOV AX,GDT_DS_SEL
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
STI
MOV EAX,00000001H
MOV CR0,EAX
JMP EDS_FLUSH
EDS_FLUSH: DB 0EAH
DW OFFSET MOVE_BUF
DW GDT_CS_SEL
CODE ENDS
CODE1 SEGMENT WORD PUBLIC 'CODE1'
MOVE_BUF:
MOV AX,GDT_DS_SEL
MOV FS,AX
MOV GS,AX
CMP FS:C_BUF_SIZE,1
JL VRAM_DISP
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
CMP FS:FILE_OVER,1
JL VRAM_DISP
CLI
MOV EAX,CR0
AND AX,NOT PE_ON
MOV CR0,EAX
DB 0EAH
DW OFFSET REAL_MODEO
DW CODE
VRAM_DISP:
MOV AX,GDT_DS_SEL
MOV FS,AX
MOV AX,GDT_BUF_SEL
MOV GS,AX
MOV AX,VRAM_SEL
MOV ES,AX
MOV BX,0
L1: MOV ES:[BX],0720H
ADD BX,2
LOOP L1
MOV ECX,FS:G_BUF_SUM
CMP ECX,2048
JL LL
MOV ECX,2048
LL: MOV ESI,0
MOV EBX,480
L2: MOV AL,GS:[ESI]
MOV AH,22
MOV ES:[EBX],AX
ADD EBX,2
INC ESI
LOOP L2
CLI
MOV EAX,CR0
AND AX,NOT PE_ON
MOV CR0,EAX
DB 0EAH
DW OFFSET REAL_MODE
DW CODE
REAL_MODE: TO_DOS
.8086
MODE_CHANGE ENDP
INCLUDE A20.ASM
CODE1 ENDS
DATA SEGMENT WORD PUBLIC 'DATA'
FILE_NAME DB 'MODE.TXT'
FILE_HANDLE DW 0
FILE_OVER DW 0
ERR_FILE DB 0DH,0AH, 'Open file error$'
OK_MSG DB 0DH,0AH, 'Have a nice day,Bye! $'
SAVE_GDT DW 4 DUP(0)
SAVE_IDT DW 4 DUP(0)
SAVE_SS DW 0
SAVE_SP DW 0
DTSIZE DW 0
DTLOAD DW 0,0
GDT_SIZE DW 0
C_BUF_SIZE DW 0
G_BUF_SUM DD 0
C_BUFFER DB 1024 DUP(?)
DATA ENDS
DAT SEGMENT WORD PUBLIC 'DATA1'
GDT_DEF EQU $
GDT_DESC <0,0,0,0,0,0>
GDT_CS GDT_DESC <0FFFFH,0,0,9AH,0,0>
GDT_DS GDT_DESC <0FFFFH,0,0,9AH,0,0>
GDT_SS GDT_DESC <0,0,0,96H,0,0>
GDT_VRM GDT_DESC <0FFFFH,08000H,0BH,92H,0,0>
GDT_BUF GDT_DESC <0FFFFH,0,0,92H,0,0>
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -