📄 macro.mac
字号:
;读文件的宏
READFILE MACRO FILENAME
MOV AX,3D02H
LEA DX,FILENAME
INT 21H
JNC SAVE_FILE_HANDLE
LEA DX,OPEN_FILE_ERR_MSG
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
SAVE_FILE_HANDLE:
MOV FILE_HANDLE,AX
READ_FILE:
MOV BX,FILE_HANDLE
MOV CX,1024
LEA DX,REAL_DATA_BUF
MOV AH,3FH
INT 21H
JNC READ_FILE_OK
LEA DX,READ_FILE_ERR_MSG
MOV AH,9
INT 21H
MOV AH,3EH
INT 21H
MOV AH,4CH
INT 21H
READ_FILE_OK:
MOV DATA_BUF_SIZE,AX
XOR DX,DX
ADD AX,WORD PTR DATA_BUF_SUM
MOV WORD PTR DATA_BUF_SUM,AX
ADC DX,WORD PTR DATA_BUF_SUM+2
MOV WORD PTR DATA_BUF_SUM+2,DX
MOV AX,DATA_BUF_SIZE
;
CMP AX,1024
JE PROTECT_MODE
MOV FILE_OVER,TRUE
MOV BX,FILE_HANDLE
MOV AH,3EH
INT 21H
PROTECT_MODE:
CLI
LGDT FWORD PTR VGDTR
LIDT FWORD PTR DS:VIDTR
STI
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JMP GOTO_PROTECT_MODE
GOTO_PROTECT_MODE:
JUMP16 REAL_CODE_SEL,MOVE_DATA_TO_EXM
MOVE_DATA_TO_EXM:
MOV AX,REAL_DATA_SEL
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV AX,DATA_BUF_SEL
MOV GS,AX
CMP FS:DATA_BUF_SIZE,0
JE MOVE_DATA_TO_VRAM
MOV ECX,0
MOV CX,FS:DATA_BUF_SIZE
LEA EAX,REAL_DATA_BUF
MOV ESI,EAX
MOV EDI,FS:SAVE_EDI
REPEAT_MOVE_BYTE:
MOV AL,FS:[ESI]
MOV GS:[EDI],AL
INC ESI
INC EDI
LOOP REPEAT_MOVE_BYTE
MOV FS:SAVE_EDI,EDI
CMP FILE_OVER,TRUE
JE MOVE_DATA_TO_VRAM
CLI
MOV EAX,CR0
AND AX,0FFFEH
MOV CR0,EAX
JUMP16 REAL_CODE_SEG,GOTO_REAL_MODE
GOTO_REAL_MODE:
CALL CLOSE_A20
MOV AX,REAL_DATA_SEG
MOV DS,AX
LGDT FWORD PTR REAL_GDT
LIDT FWORD PTR ds:REAL_IDT
CLI
MOV SS,REAL_SS
MOV SP,REAL_SP
STI
JMP READ_FILE
ENDM
;-------------------------------------------------------------------------------
;响铃并等待键盘输入的宏
PRP_BELL MACRO
LOCAL GOTO_REAL_MODE_1
LOCAL GOTO_PROTECT_MODE_1
LOCAL INSTRUCTION_QUEUE_FLUSH
CLI
PUSHAD
PUSH DS
PUSH ES
PUSH FS
PUSH GS
;转入实模式
MOV AX,NORMAL_SEL
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX
JUMP16 REAL_CODE_SEG,GOTO_REAL_MODE_1
GOTO_REAL_MODE_1:
CLI
MOV AX,REAL_DATA_SEG
MOV DS,AX
MOV SS,DS:REAL_SS
LGDT FWORD PTR REAL_GDT
LIDT FWORD PTR DS:REAL_IDT
STI
CALL _BELL
CLI
LGDT FWORD PTR VGDTR
LIDT FWORD PTR DS:VIDTR
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JMP INSTRUCTION_QUEUE_FLUSH
INSTRUCTION_QUEUE_FLUSH:
JUMP16 REAL_CODE_SEL,GOTO_PROTECT_MODE_1
;转入保护模式
GOTO_PROTECT_MODE_1:
POP GS
POP FS
POP ES
POP DS
POPAD
ENDM
;-------------------------------------------------------------------------------
;清屏宏(写满屏的空格,背景为黑色)
CLEAR_SCREEN MACRO
LOCAL GO_ON_CLEAR
MOV ECX,08D0H
MOV EBX,0
GO_ON_CLEAR: MOV ES:[EBX],0720H
INC EBX
INC EBX
LOOP GO_ON_CLEAR
MOV EBX,0
ENDM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -