⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macro.mac

📁 一个小型操作系统
💻 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 + -