大二下汇编综合性实验:编写一个简单的文本编辑器(EDIT)
;***************文本编辑器(简单的EDIT)**********
;输出字符串功能宏定义
DISP_STRING MACRO STRING_PARAM
LEA DX, STRING_PARAM
MOV AH, 09H
INT 21H
ENDM
;**********************************
;创建窗口功能宏定义
CREATE_WIN MACRO AL_PARAM, BH_PARAM, CH_PARAM, CL_PARAM, DH_PARAM, DL_PARAM
MOV AL, AL_PARAM ;上卷行数, 为0时,整个窗口空白
MOV BH, BH_PARAM ;卷入行属性
MOV CH, CH_PARAM ;左上角行号
MOV CL, CL_PARAM ;左上角列号
MOV DH, DH_PARAM ;右下角行号
MOV DL, DL_PARAM ;右下角列号
MOV AH, 06H ;功能号,窗口上卷
INT 10H
ENDM
;**********************************
;设置光标位置
SET_CURSE MACRO BH_PARAM, DH_PARAM, DL_PARAM
MOV BH, BH_PARAM ;显示页号
MOV DH, DH_PARAM ;行
MOV DL, DL_PARAM ;列
MOV AH, 02H ;功能号
INT 10H
ENDM
;**********************************
;获取光标位置
GET_CURSE MACRO
MOV BH, 0 ;显示页号
MOV AH, 03H ;功能号,返回参数:CH=光标起始位置, DH:DL=行:列
INT 10H
ENDM
;*******************************************************************
;定义数据段
DATAS SEGMENT
;*********************功能键定义***********************
KEY_UP EQU 48H ;上移,功能键数值均为扫描码
KEY_DOWN EQU 50H ;下移
KEY_LEFT EQU 4BH ;左移
KEY_RIGHT EQU 4DH ;右移
KEY_BACKSPACE EQU 0EH ;退格键
KEY_ENTER EQU 1CH ;回车键
KEY_HOME EQU 47H
KEY_END EQU 4FH
KEY_F1 EQU 3BH ;F1,查看菜单目录
KEY_F2 EQU 3CH ;F2,查看帮助快捷键
KEY_CTRL_N EQU 31H ;新建文件快捷键
KEY_CTRL_O EQU 18H ;打开文件快捷键
KEY_CTRL_S EQU 1FH ;保存文件快捷键
KEY_CTRL_X EQU 2DH ;退出程序快捷键
;*******************菜单项相关提示内容******************
MENU_ITEM DB 'FILE(F1) HELP(F2)$' ;菜单标题栏
MENU_TIPS1 DB 'NEW (CTRL+N)', 0DH, 0AH, '$'
MENU_TIPS2 DB 'OPEN (CTRL+O)', 0DH, 0AH, '$'
MENU_TIPS3 DB 'SAVE (CTRL+S)', 0DH, 0AH, '$'
MENU_TIPS4 DB 'EXIT (CTRL+X)', '$'
;******************程序提示内容***************************
HELP_TIPS0 DB 'TIPS FOR USEING THE EDIT', 0DH, 0AH, '$'
HELP_TIPS1 DB '1.Click F1 to view the menu list.', 0DH, 0AH, '$'
HELP_TIPS2 DB '2.New file shortcut is Ctrl n.', 0DH, 0AH, '$'
HELP_TIPS3 DB '3.Open file shortcut as Ctrl o.', 0DH, 0AH, '$'
HELP_TIPS4 DB '4.Save file shortcut as Ctrl s.', 0DH, 0AH, '$'
HELP_TIPS5 DB '5.Exit program shortcut is Ctrl x.', 0DH, 0AH, '$'
HELP_TIPS6 DB '6.View help shortcut as F2.', 0DH, 0AH, '$'
HELP_TIPS7 DB 'PRESS ANY KEY TO CLOSE THE HELP BAR!!!', 0DH, 0AH, '$'
;******************文件相关提示内容************************
FILE_TIPS1 DB 'PLEASE INPUT FILE NAME: $'
FILE_TIPS2 DB 'PLEASE INPUT OPEN FILE NAME: $'
FILE_TIPS3 DB 'PLEASE INPUT SAVE FILE NAME: $'
FILE_TIPS4 DB 'THE FILE HAS NOE BEEN SAVED! SAVE IT NOR NOT?(Y/N): $'
FILE_TIPS5 DB 'FILE NAME CANNOT BE EMPTY, PLEASE RE_ENTER: $'
INPUT_ERROR0 DB 'PLEASE INPUT Y OR N: $'
EXIT_TIPS DB 'THANK YOU FOR USING!$'
;******************定义相关变量******************************
PATH DB 50 DUP(0) ;文件路径
HANDLE DW ? ;文件句柄
DATA_BUFFER DB 2000 DUP(?)
;文件数据缓冲区,单色屏幕有2000个字符显示位置,每个字符需要两个字节表示
;单色显示存储器安排在段地址为B000H的区域,偏移地址从0到0F9FH.
BAK DB 3850 DUP(0) ;保存当前显示的内容,以便切换窗口后重新返回开始界面
COL DB ? ;光标当前所在列
ROW DB ? ;光标当前所在行
INPUT_CHAR DW ? ;输入的字符
INDEX DW 0 ;缓冲区字符下标,创建新文件时要置零
DATE DB 'DATE:0000/00/00$' ;日期
ROW_COL DB 'ROW:000, COL:000$' ;显示编辑文件内容的行列
DATAS ENDS
;******************************************************************
;定义堆栈段
STACKS SEGMENT STACK
DW 30H DUP(?)
TOP LABEL WORD
STACKS ENDS
;******************************************************************
;定义代码段
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS, SS:STACKS
MAIN PROC FAR
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, DATAS
MOV DS, AX
MOV AX, STACKS
MOV SS, AX
LEA SP, TOP
CALL MAIN_INTERFACE ;调用主界面函数
CALL HELP_WIN ;默认进入程序显示提示内容
CALL CONTROLLER ;调用控制器
RET
MAIN ENDP
;******************************************************************
;******************************************************************
;子程序:创建主界面
MAIN_INTERFACE PROC NEAR
CREATE_WIN 0, 70H, 1, 0, 24, 79 ;文件编辑区域,白底黑字。单色显示屏的大小为24行,79列
CREATE_WIN 0, 1FH, 0, 0, 0, 79 ;菜单栏区域, 蓝底白字
CREATE_WIN 0, 1FH, 24, 0, 24, 79;提示栏区域
;显示菜单项
SHOW_MENU:
SET_CURSE 0, 0, 0
DISP_STRING MENU_ITEM
;显示状态信息
SHOW_STATE:
SET_CURSE 0, 24, 0
CALL DATE_WIN ;显示时间
CALL ROW_COL_WIN ;显示行列
SET_CURSE 0, 1, 0 ;设置光标为编辑区域首位
RET
MAIN_INTERFACE ENDP
;******************************************************************
;******************************************************************
;创建提示内容
HELP_WIN PROC NEAR
CALL SAVEDISPLAY ;保存当前界面的显示信息
GET_CURSE
PUSH DX
CREATE_WIN 0, 30H, 2, 15, 18, 65 ;青底黑字
;输出内容
SET_CURSE 0, 3, 28
DISP_STRING HELP_TIPS0
SET_CURSE 0, 5, 20
DISP_STRING HELP_TIPS1
SET_CURSE 0, 7, 20
DISP_STRING HELP_TIPS2
SET_CURSE 0, 9, 20
DISP_STRING HELP_TIPS3
SET_CURSE 0, 11, 20
DISP_STRING HELP_TIPS4
SET_CURSE 0, 13, 20
DISP_STRING HELP_TIPS5
SET_CURSE 0, 15, 20
DISP_STRING HELP_TIPS6
SET_CURSE 0, 17, 20
DISP_STRING HELP_TIPS7
POP DX
SET_CURSE 0, DH, DL
MOV AH, 00H ;用户按任意键退出提示界面
INT 16H
CREATE_WIN 0, 70H, 2, 15, 18, 65 ;覆盖帮助栏的提示内容
CALL BACKDISPLAY
RET
HELP_WIN ENDP
;******************************************************************
;******************************************************************
;子程序:逻辑控制
CONTROLLER PROC NEAR
CONTROLLER_STEP0:
CALL GET_CHAR ;接受用户输入字符
CALL FUNCTION_KEY ;判断字符是否为功能键
JMP CONTROLLER_STEP0
RET
CONTROLLER ENDP
;******************************************************************
;******************************************************************
;子程序:读取字符
GET_CHAR PROC NEAR
GET_CURSE ;获取当前光标位置
MOV ROW, DH
MOV COL, DL
SET_CURSE 0, ROW, COL ;设置光标位置
MOV AH, 0H
INT 16H
MOV INPUT_CHAR, AX ;从键盘读字符,AH=扫描码 AL=ASCII码
RET
GET_CHAR ENDP
;******************************************************************
;******************************************************************
;对读取的字符进行处理,主要针对功能键
FUNCTION_KEY PROC NEAR
MOV AX, INPUT_CHAR
CMP AH, KEY_UP ;是否上移
JE UP
CMP AH, KEY_DOWN ;是否下移
JE DOWN
CMP AH, KEY_LEFT ;是否左移
JE LEFT
CMP AH, KEY_RIGHT ;是否右移
JE RIGHT
CMP AH, KEY_ENTER ;是否回车
JE ENTER_0
CMP AH, KEY_HOME ;是否HOME键
JE HOME
CMP AH, KEY_END ;是否END键
JE END_0
CMP AH, KEY_BACKSPACE ;是否退格键
JE BACKSPACE
CMP AH, KEY_F1 ;是否功能键F1
JE F1
CMP AH, KEY_F2 ;是否为查看帮助快捷键
JE F2
CMP AH, KEY_CTRL_N ;是否为新建文件快捷键
JE CTRL_N
CMP AH, KEY_CTRL_O ;是否为打开文件快捷键
JE CTRL_O
CMP AH, KEY_CTRL_S ;是否为保存文件快捷键
JE CTRL_S
CMP AH, KEY_CTRL_X ;是否为退出快捷键
JE CTRL_X
;不是功能键,则存入数据缓冲区,同时显示在屏幕上
MOV BX, INDEX
MOV [DATA_BUFFER + BX], AL
INC INDEX
MOV DL, AL ;显示输入的内容
MOV AH, 02H
INT 21H
CALL ROW_COL_WIN ;相应调整光标所在行列信息
JMP FUNCTION_KEY_END
UP:
CALL UP_FUNC
JMP FUNCTION_KEY_END
DOWN:
CALL DOWN_FUNC
JMP FUNCTION_KEY_END
LEFT:
CALL LEFT_FUNC
JMP FUNCTION_KEY_END
RIGHT:
CALL RIGHT_FUNC
JMP FUNCTION_KEY_END
ENTER_0:
CALL ENTER_FUNC
JMP FUNCTION_KEY_END
HOME:
CALL HOME_FUNC
JMP FUNCTION_KEY_END
END_0:
CALL END_FUNC
JMP FUNCTION_KEY_END
BACKSPACE:
CALL BACKSPACE_FUNC
JMP FUNCTION_KEY_END
F1:
CALL F1_FUNC
JMP FUNCTION_KEY_END
F2:
CALL HELP_WIN
JMP FUNCTION_KEY_END
CTRL_N:
CALL NEW_FILE
JMP FUNCTION_KEY_END
CTRL_O:
CALL OPEN_FILE
JMP FUNCTION_KEY_END
CTRL_S:
CALL SAVE_FILE
JMP FUNCTION_KEY_END
;关闭程序,输出提示
CTRL_X:
CALL QUIT_FUNC
JMP FUNCTION_KEY_END
FUNCTION_KEY_END: RET
FUNCTION_KEY ENDP
;******************************************************************
;各方向键的功能实现思想都差不多,主要考虑边界(可自己设置)情况,
;******************************************************************
;子程序:光标上移
UP_FUNC PROC NEAR
GET_CURSE ;获取光标位置
MOV ROW, DH
MOV COL, DL
DEC ROW
CMP ROW, 0 ;判断是否到顶行
JE UP_STEP0
JMP UP_FUNC_END
UP_STEP0:
MOV ROW, 1 ;如果是第一行,则保持不变,因为第零行为菜单栏
UP_FUNC_END:
SET_CURSE 0, ROW, COL
CALL ROW_COL_WIN
RET
UP_FUNC ENDP
;******************************************************************
;******************************************************************
;子程序:光标下移
DOWN_FUNC PROC NEAR
GET_CURSE ;获取光标位置
MOV ROW, DH
MOV COL, DL
INC ROW
CMP ROW, 24
JE DOWN_STEP0
JMP DOWN_FUNC_END
DOWN_STEP0:
MOV ROW, 23
DOWN_FUNC_END:
SET_CURSE 0, ROW, COL
CALL ROW_COL_WIN
RET
DOWN_FUNC ENDP
;*****************************************************************
;*****************************************************************
;子程序:光标左移
LEFT_FUNC PROC NEAR
GET_CURSE
MOV ROW, DH
MOV COL, DL
CMP COL, 0 ;判断是否为首列位置,不是首列则直接左移
JNZ LEFT_STEP0
MOV COL, 79
DEC ROW
CMP ROW, 0 ;判断是否为首行首列,不是首行则行数减一,是首行首列则行数置为1
JE LEFT_STEP1
JMP LEFT_FUNC_END
LEFT_STEP0:
DEC COL
JMP LEFT_FUNC_END
;左上角左移跳到右下角
LEFT_STEP1:
MOV ROW, 23
LEFT_FUNC_END:
SET_CURSE 0, ROW, COL
CALL ROW_COL_WIN
RET
LEFT_FUNC ENDP
;*******************************************************************
;*******************************************************************
;子程序:光标右移
RIGHT_FUNC PROC NEAR
GET_CURSE
MOV ROW, DH
MOV COL, DL
CMP COL, 79 ;判断是否为末列,如果不是则直接右移
JNZ RIGHT_STEP0
MOV COL, 0
INC ROW
CMP ROW, 24
JE RIGHT_STEP1
JMP RIGHT_FUNC_END
RIGHT_STEP0:
INC COL
JMP RIGHT_FUNC_END
;右下角右移,跳到左上角
RIGHT_STEP1:
MOV ROW, 1
MOV COL, 0
JMP RIGHT_FUNC_END
RIGHT_FUNC_END:
SET_CURSE 0, ROW, COL
CALL ROW_COL_WIN
RET
RIGHT_FUNC ENDP
;******************************************************************
;******************************************************************
;子程序:回车换行
ENTER_FUNC PROC NEAR
GET_CURSE
MOV ROW, DH
MOV COL, DL
INC ROW
CMP ROW, 24
JE ENTER_STEP0
MOV COL, 0
JMP ENTER_FUNC_END
ENTER_STEP0:
MOV ROW, 23
MOV COL, 0
ENTER_FUNC_END:
SET_CURSE 0, ROW, COL
CALL ROW_COL_WIN
RET
ENTER_FUNC ENDP
;******************************************************************
;******************************************************************
;子程序:HOME回到当前光标所在行的行首位置
HOME_FUNC PROC NEAR
GET_CURSE
MOV ROW, DH
MOV COL, 0
HOME_FUNC_END:
SET_CURSE 0, ROW, COL
CALL ROW_COL_WIN
RET
HOME_FUNC ENDP
;******************************************************************
;******************************************************************
;子程序:END回到当前光标所在行的行尾位置
END_FUNC PROC NEAR
GET_CURSE
MOV ROW, DH
MOV COL, 79
END_FUNC_END:
SET_CURSE 0, ROW, COL
CALL ROW_COL_WIN
RET
END_FUNC ENDP
;******************************************************************
;通过输出空格的方式达到删除光标所在位的字符信息
;******************************************************************
;子程序:退格键功能
BACKSPACE_FUNC PROC NEAR
GET_CURSE
MOV ROW, DH
MOV COL, DL
CMP COL, 0 ;判断是否是首列
JE BACKSPACE_STEP0
DEC COL
JMP BACKSPACE_STEP1
;处理首列,如果不是首行
BACKSPACE_STEP0:
MOV COL, 79
DEC ROW
CMP ROW, 0
JNE BACKSPACE_STEP1
INC ROW
MOV COL, 0
BACKSPACE_STEP1:
SET_CURSE 0, ROW, COL
MOV DL, 0 ;输出空格, 替换当前的数据,达到删除的功能
MOV AH, 2H
INT 21H
BACKSPACE_FUNC_END:
SET_CURSE 0, ROW, COL
CALL ROW_COL_WIN
RET
BACKSPACE_FUNC ENDP
;******************************************************************
;******************************************************************
;子程序:F1文件操作功能
F1_FUNC PROC NEAR
CALL MENU_OPERATION
RET
F1_FUNC ENDP
;******************************************************************
;******************************************************************
;子程序:退出程序
QUIT_FUNC PROC NEAR
CREATE_WIN 0, 30H, 10, 10, 12, 70 ;青底黑字
SET_CURSE 0, 11, 10
DISP_STRING FILE_TIPS4 ;提示是否保存当前文件
;用户输入选择
INPUT_CHOOSE:
MOV AH, 01H
INT 21H
CMP AL, 59H ;判断是否输入“Y”
JNE JUDGE_N ;判断是否输入“N”
CALL SAVE_FILE ;保存当前文件
JUDGE_N:
CMP AL, 4EH
JNE CONTINUE_INPUT ;输入不规范
JMP QUIT
CONTINUE_INPUT:
CREATE_WIN 0, 30H, 10, 10, 12, 70 ;青底黑字
SET_CURSE 0, 11, 10
DISP_STRING INPUT_ERROR0;提示用户输入不规范,重新输入
JMP INPUT_CHOOSE
QUIT:
CREATE_WIN 0, 0FH, 0, 0, 24, 79 ;输出结束语
SET_CURSE 0, 1, 13
DISP_STRING EXIT_TIPS
MOV AH, 4CH
INT 21H
RET
QUIT_FUNC ENDP
;*******************************************************************
;*******************************************************************
;子程序:菜单操作
MENU_OPERATION PROC NEAR
CALL SAVEDISPLAY
PUSH CX
;定义菜单显示
GET_CURSE
PUSH DX
;CREATE_WIN 0, 06H, 2, 1, 7, 11
CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字
SET_CURSE 0, 1, 0
DISP_STRING MENU_TIPS1 ;NEW
DISP_STRING MENU_TIPS2 ;OPEN
DISP_STRING MENU_TIPS3 ;SAVE
DISP_STRING MENU_TIPS4 ;EXIT
POP DX
MOV ROW, DH
MOV COL, DL
DEC COL
SET_CURSE 0, 24, 79 ;初始光标置于右下角
;判断键盘输入
MENU_OPERATION_JUDGE:
MOV AH, 00H
INT 16H
CMP AH, KEY_DOWN ;判断是否进行操作,向下选择菜单项
JZ MENU_ITEM_NEW ;定义菜单项
CMP AH, KEY_UP
JZ MENU_ITEM_NEW
;否则,隐藏菜单显示
MENU_HID:
CREATE_WIN 0, 70H, 1, 0, 4, 12
SET_CURSE 0, 1, 0
CALL BACKDISPLAY
JMP MENU_OPERATION_END
;定义菜单项
MENU_ITEM_NEW:
CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字
SET_CURSE 0, 1, 0
DISP_STRING MENU_TIPS1 ;NEW
DISP_STRING MENU_TIPS2 ;OPEN
DISP_STRING MENU_TIPS3 ;SAVE
DISP_STRING MENU_TIPS4 ;EXIT
CREATE_WIN 0, 24H, 1, 0, 1, 12 ;选中NEW,绿底红字
SET_CURSE 0, 1, 0
DISP_STRING MENU_TIPS1
SET_CURSE 0, 1, 0 ;光标置于当前选中项
;继续读取下一个键盘动作
MOV AH, 00H
INT 16H
CMP AH, KEY_UP ;上移
JE MENU_ITEM_EXIT
CMP AL, 0DH ;选择了当前的选项
JE NEW_F ;当前菜单项为NEW
CMP AH, KEY_DOWN ;下移
JE MENU_ITEM_OPEN
JMP MENU_HID ;非上下键,非回车键,则隐藏菜单项。
MENU_ITEM_OPEN:
CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字
SET_CURSE 0, 1, 0
DISP_STRING MENU_TIPS1 ;NEW
DISP_STRING MENU_TIPS2 ;OPEN
DISP_STRING MENU_TIPS3 ;SAVE
DISP_STRING MENU_TIPS4 ;EXIT
CREATE_WIN 0, 24H, 2, 0, 2, 12 ;选中NEW,绿底红字
SET_CURSE 0, 2, 0
DISP_STRING MENU_TIPS2
SET_CURSE 0, 2, 0 ;光标置于当前选中项
;继续读取下一个键盘动作
MOV AH, 00H
INT 16H
CMP AH, KEY_UP ;上移
JE MENU_ITEM_NEW
CMP AL, 0DH ;选择了当前的选项
JE OPEN_F ;当前菜单项为OPEN
CMP AH, KEY_DOWN ;下移
JE MENU_ITEM_SAVE
JMP MENU_HID ;非上下键,非回车键,则隐藏菜单项。
MENU_ITEM_SAVE:
CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字
SET_CURSE 0, 1, 0
DISP_STRING MENU_TIPS1 ;NEW
DISP_STRING MENU_TIPS2 ;OPEN
DISP_STRING MENU_TIPS3 ;SAVE
DISP_STRING MENU_TIPS4 ;EXIT
CREATE_WIN 0, 24H, 3, 0, 3, 12 ;选中NEW,绿底红字
SET_CURSE 0, 3, 0
DISP_STRING MENU_TIPS3
SET_CURSE 0, 3, 0 ;光标置于当前选中项
;继续读取下一个键盘动作
MOV AH, 00H
INT 16H
CMP AH, KEY_UP ;上移
JE MENU_ITEM_OPEN
CMP AL, 0DH ;选择了当前的选项
JE SAVE_F ;当前菜单项为SAVE
CMP AH, KEY_DOWN ;下移
JE MENU_ITEM_EXIT
JMP MENU_HID ;非上下键,非回车键,则隐藏菜单项。
MENU_ITEM_EXIT:
CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字
SET_CURSE 0, 1, 0
DISP_STRING MENU_TIPS1 ;NEW
DISP_STRING MENU_TIPS2 ;OPEN
DISP_STRING MENU_TIPS3 ;SAVE
DISP_STRING MENU_TIPS4 ;EXIT
CREATE_WIN 0, 24H, 4, 0, 4, 12 ;选中NEW,绿底红字
SET_CURSE 0, 4, 0
DISP_STRING MENU_TIPS4
SET_CURSE 0, 4, 0 ;光标置于当前选中项
;继续读取下一个键盘动作
MOV AH, 00H
INT 16H
CMP AH, KEY_UP ;上移
JE MENU_ITEM_SAVE
CMP AL, 0DH ;选择了当前的选项
JE EXIT_F ;当前菜单项为EXIT
CMP AH, KEY_DOWN ;下移
JE MENU_ITEM_NEW
JMP MENU_HID ;非上下键,非回车键,则隐藏菜单项。
NEW_F:
CALL MAIN_INTERFACE
CALL NEW_FILE
JMP MENU_OPERATION_END
OPEN_F:
CALL MAIN_INTERFACE
CALL OPEN_FILE
JMP MENU_OPERATION_END
SAVE_F:
CALL SAVE_FILE
JMP MENU_OPERATION_END
EXIT_F:
CALL BACKDISPLAY
CALL QUIT_FUNC
MENU_OPERATION_END:
POP CX
RET
MENU_OPERATION ENDP
;*******************************************************************
;*******************************************************************
;子程序:新建文件
NEW_FILE PROC NEAR
GET_CURSE
PUSH DX
CALL BACKDISPLAY
CREATE_WIN 0, 30H, 10, 20, 12, 60 ;青底黑字
SET_CURSE 0, 11, 20
DISP_STRING FILE_TIPS1 ;提示用户输入文件名
MOV BX, 0
;开始输入文件名
NEW_FILE_STEP0:
MOV AH, 01H
INT 21H
CMP AL, 0DH ;判断是否为回车键
JE NEW_FILE_STEP1
MOV PATH[BX], AL
INC BX
JMP NEW_FILE_STEP0
;创建文件
NEW_FILE_STEP1:
POP DX
SET_CURSE 0, DH, DL
LEA DX, PATH ;DS:DX=ASCII Z串首地址
MOV AH, 3CH ;功能号, 建立文件,成功:AX=文件句柄,失败:AX=错误码
MOV CX, 00 ;文件属性,以写的方式创建一个文件
INT 21H
MOV HANDLE, AX ;保存文件句柄
MOV BX, AX ;BX=文件句柄
MOV AH, 3EH ;功能号, 关闭文件
INT 21H
CALL MAIN_INTERFACE ;返回编辑界面
MOV INDEX, 0 ;缓冲区下标置零
SET_CURSE 0, 1, 0
NEW_FILE_END:
RET
NEW_FILE ENDP
;*******************************************************************
;*******************************************************************
;子程序:打开文件
OPEN_FILE PROC NEAR
CALL BACKDISPLAY
CREATE_WIN 0, 30H, 10, 20, 12, 60 ;青底黑字
SET_CURSE 0, 11, 20
DISP_STRING FILE_TIPS2 ;提示输入打开的文件名
MOV BX, 0
OPEN_FILE_STEP0:
MOV AH, 01H
INT 21H
CMP AL, 0DH ;判断是否为回车键
JE OPEN_FILE_STEP1
MOV PATH[BX], AL
INC BX
JMP OPEN_FILE_STEP0
OPEN_FILE_STEP1:
LEA DX, PATH ;DS:DX=ASCII Z串首地址
MOV AH, 3DH ;功能号, 打开文件,成功:AX=文件句柄, 失败:AX=错误码
INT 21H
MOV HANDLE, AX ;保存文件句柄
LEA DX, DATA_BUFFER ;DS:DX=缓冲区首址
MOV BX, HANDLE ;文件句柄
MOV CX, 2000 ;缓冲区大小,也是单色显示屏显示字符的最大值
MOV AH, 3FH ;功能号, 读文件或设备, 成功:AX=实际读入缓冲区的字符数,失败:AX=错误码
INT 21H
CALL MAIN_INTERFACE ;返回编辑界面
SET_CURSE 0, 1, 0
MOV CX, 1000
MOV BX, 0
;输出文件内容
OPEN_FILE_LOOP0:
MOV DL, DATA_BUFFER[BX]
MOV AH, 02H
INT 21H
INC BX
LOOP OPEN_FILE_LOOP0
;关闭文件
MOV BX, HANDLE
MOV AH, 3EH
INT 21H
SET_CURSE 0, 1, 0
;清除文件路径
MOV CX, 50 ;文件路径默认大小
MOV BX, 0
OPEN_FILE_LOOP1:
MOV DL, 0
MOV PATH[BX], DL
INC BX
LOOP OPEN_FILE_LOOP1
OPEN_FILE_END:
RET
OPEN_FILE ENDP
;*******************************************************************
;*******************************************************************
;子程序:保存文件
SAVE_FILE PROC NEAR
GET_CURSE
PUSH DX
CALL BACKDISPLAY
MOV AH, PATH
CMP AH, 21H ;判断文件路径是否为空
JL SAVE_FILE_STEP0
JMP SAVE_FILE_STEP2 ;文件路劲不为空,直接以当前路径保存文件
;开始输入文件名
SAVE_FILE_STEP0:
CREATE_WIN 0, 30H, 10, 20, 12, 60 ;青底黑字
SET_CURSE 0, 11, 20
DISP_STRING FILE_TIPS3
MOV BX, 0
SAVE_FILE_STEP1:
MOV AH, 01H
INT 21H
CMP AL, 0DH ;判断是否为回车键
JE SAVE_FILE_STEP2
MOV PATH[BX], AL
INC BX
JMP SAVE_FILE_STEP1
SAVE_FILE_STEP2:
MOV AH, PATH
CMP AH, 21H
JNL NEXT
CREATE_WIN 0, 30H, 10, 10, 12, 70 ;输出提示文件名不能为空,重新输入文件名
SET_CURSE 0, 11, 10
DISP_STRING FILE_TIPS5
JMP SAVE_FILE_STEP1
NEXT:
CREATE_WIN 0, 70H, 10, 10, 12, 70
POP DX
SET_CURSE 0, DH, DL
;创建文件
SAVE_FILE_STEP3:
LEA DX, PATH ;DS:DX=ASCII Z串首地址
MOV AH, 3CH ;功能号, 建立文件,成功:AX=文件句柄,失败:AX=错误码
MOV CX, 00 ;文件属性,以写的方式创建一个文件
INT 21H
MOV HANDLE, AX ;保存文件句柄
LEA DX, DATA_BUFFER
MOV BX, AX ;BX=文件句柄
MOV CX, 2000
MOV AH, 40H ;写入文件
INT 21H
MOV BX, HANDLE
MOV AH, 3EH ;功能号, 关闭文件
INT 21H
CALL BACKDISPLAY
SAVE_FILE_END:
RET
SAVE_FILE ENDP
;*******************************************************************
;*******************************************************************
;子程序:保存显示界面
SAVEDISPLAY PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DS
MOV AX, 0002H ;隐藏鼠标指针,一般在程序结束时, 调用此功能
INT 33H
MOV BX, 0D
MOV CX, 3840D ;0F00H
SAVEDISPLAY_LOOP0:
MOV AX, 0B000H
MOV DS, AX
MOV DL, DS:[BX]
MOV AX, DATAS
MOV DS, AX
MOV BAK[BX], DL
INC BX
LOOP SAVEDISPLAY_LOOP0
MOV AX, 0001H ;显示鼠标指针,通常在鼠标初始化后,用此功能显示其指针
INT 33H
POP DS
POP DX
POP CX
POP BX
POP AX
RET
SAVEDISPLAY ENDP
;*******************************************************************
;*******************************************************************
;子程序:返回显示界面
BACKDISPLAY PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DS
MOV BX, 0D
MOV CX, 3840D
BACKDISPLAY_LOOP0:
MOV AX, DATAS
MOV DS, AX
MOV DL, BAK[BX]
MOV AX, 0B000H
MOV DS, AX
MOV DS:[BX], DL
INC BX
LOOP BACKDISPLAY_LOOP0
POP DS
POP DX
POP CX
POP BX
POP AX
RET
BACKDISPLAY ENDP
;*********************************************************************
;*********************************************************************
;子程序:显示日期
DATE_WIN PROC NEAR
MOV AH, 2AH ;功能号,取日期, CX=年,DH:DL=月:日(均为二进制)
INT 21H
MOV BL, 10D
;处理年
MOV AX, 0
MOV AX, CX
DIV BL
ADD AH, 30H ;输出数值,+'0'
MOV [DATE + 8], AH
MOV AH, 0
DIV BL
ADD AH, 30H
MOV [DATE + 7], AH
MOV AH, 0
DIV BL
ADD AH, 30H
MOV [DATE + 6], AH
MOV AH, 0
DIV BL
ADD AH, 30H
MOV [DATE + 5], AH
;处理月份
MOV AX, 0
MOV AL, DH
DIV BL
ADD AX, 3030H ;输出数值,+'0'
MOV [DATE + 10], AL
MOV [DATE + 11], AH
;处理日
MOV AX, 0
MOV AL, DL
DIV BL
ADD AX, 3030H
MOV [DATE + 13], AL
MOV [DATE + 14], AH
;创建窗口,显示内容
CREATE_WIN 0, 1FH, 0, 65, 0, 79 ;蓝底白字
SET_CURSE 0, 0, 65
DISP_STRING DATE
RET
DATE_WIN ENDP
;*******************************************************
;*******************************************************
;子程序:显示行和列
ROW_COL_WIN PROC NEAR
GET_CURSE ;获取光标位置
PUSH DX
MOV BL, 100D
MOV BH, 10D
;处理行
MOV AX, 0
MOV AL, DH
DIV BL
ADD AL, 30H
MOV [ROW_COL + 4], AL
MOV AL, AH
MOV AH, 0
DIV BH
ADD AX, 3030H
MOV [ROW_COL + 5], AL
MOV [ROW_COL + 6], AH
;处理列
MOV AX, 0
MOV AL, DL
DIV BL
ADD AL, 30H
MOV [ROW_COL + 13], AL
MOV AL, AH
MOV AH, 0
DIV BH
ADD AX, 3030H
MOV [ROW_COL + 14], AL
MOV [ROW_COL + 15], AH
;创建窗口,显示内容
CREATE_WIN 0, 1FH, 24, 60, 24, 79;蓝底白字
SET_CURSE 0, 24, 61
DISP_STRING ROW_COL
POP DX
SET_CURSE 0, DH, DL
RET
ROW_COL_WIN ENDP
CODES ENDS
END MAIN