📄 muedit.asm.bak
字号:
;*********************************************************
;滚动窗体宏定义
win MACRO lux,luy,rdx,rdy,attr
MOV AH,6
MOV AL,0
MOV BH,attr ;前景背景属性
MOV CH,lux
MOV CL,luy
MOV DH,rdx
MOV DL,rdy
INT 10h
ENDM
;滚动窗体宏定义2
win2 MACRO lal,lux,luy,rdx,rdy,attr
MOV AH,6
MOV AL,lal
MOV BH,attr ;前景背景属性
MOV CH,lux
MOV CL,luy
MOV DH,rdx
MOV DL,rdy
INT 10h
ENDM
saveE MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DS
PUSH SI
ENDM
recover MACRO
POP SI
POP DS
POP DX
POP CX
POP BX
POP AX
ENDM
fileIO MACRO X,Y
LEA DX,X
MOV AH,Y
INT 21H
ENDM
showM MACRO messM
poscur 24,0
LEA DX,messM
MOV AH,09H
INT 21H
ENDM
;------------------------------------
;字符串显示宏定义
show MACRO mess
LEA DX,mess
MOV AH,09h
INT 21h
ENDM
;-------------------------------------
;光标定位宏定义
posget MACRO ;读光标位置
MOV AH,03h
MOV BH,0
INT 10h
ENDM
posgetS MACRO
saveE
MOV AH,03h
MOV BH,0
INT 10h
MOV row,DH
MOV column,DL
recover
ENDM
poscur MACRO x,y
MOV AH,2
MOV DH,x
MOV DL,y
MOV BH,0
INT 10h
ENDM
;-------------------------------------
;读取键盘
readChar MACRO
MOV BH,0
MOV AH,8h
INT 10h
ENDM
putchar MACRO x
MOV DL,x
MOV AH,02H
INT 21H
ENDM
getchar MACRO
MOV AH,0
INT 16h
ENDM
;*************************************************
;********************************************************
;EXTRN fileProc:NEAR
;数据段定义
; .386
data_seg SEGMENT
totalChars DB 0 ;字符总数,以此来控制数据缓冲区,
CHar1 DB 0b3h ;常量,是一个竖线
tempchar DB ? ;临时字节变量
musicInt DB 0 ;文件数量
musicIndex DB 30h ;默认文件名的最后一个字符,随新建打开而增1,关闭减1
SaveAsFlag DB 0 ;已调用过filesaveas函数
modifyFlag DB 0 ;为0时已做修改
AsOrIfFlag DB 0 ;为0时是saveas调用
saveActive DB 78h ;根据musicInt来判断是否激活save,saveAs菜单
copyActive DB 78h ;根据copyFlag来判断是否激活copy,cut菜单
pasteActive DB 78h ;根据paste来判断是否激活paste菜单
CLearFlag DB 0 ;clearFlag为0时表示不需要处理选择文本,如将反色显示还原
pasteFlag DB 0 ;pasteFlag为0时为不能粘贴,
copyFlag DB 0 ;copyFlag为0时为不能复制与剪切,
pasteNum DB 0 ;粘贴缓冲区中字符个数.
PasteBuffer DB 25 DUP (0)
DB '$'
;复制粘贴缓冲区
INsertNum DB 1 ;insertNum为插入字符的个数
save DB 0 ;
path DB 30 DUP (0) ;文件名存放缓冲区
DB '$'
buffer DB 2000 DUP(?) ;buffer为数据缓冲区
bak DB 3850 DUP(0) ;视频缓冲区的备份
row DB 2 ;保存行号,
column DB 1 ;保存列号.
rowBak DB 2
columnbak DB 1
peak DB 0Dah, 78 DUP(0C4h) ,0BFh,13,10,'$' ;顶端横线
errormess1 DB 'can not creat the file,path is wrong! ','$'
errormess2 DB 'can not write to the file! ','$'
errormess3 DB 'the filename is too long! ','$'
errormess4 DB 'can not open the file,filename is wrong','$'
errormess5 DB 'can not read the file! ','$'
mess1 DB 'Please input save file name:','$'
mess2 DB ' Please input open file name:','$'
mess3 DB ' ***The file is not save! Save it now? (Y/N)***: ','$'
mess4 DB 'please input the filename again ','$'
mess5 DB 'your put is wrong!please input Y/N again','$'
mess6 DB 0b3H,' row:??? column:???','$'
mess7 DB 'Creat a new file ','$'
mess8 DB 'loads an exiting file from disk ','$'
mess9 DB 'save current file ','$'
mess10 DB 'save current file with new name ','$'
mess11 DB 'Exits the editor ','$'
mess12 DB 'F1:file menu F2:Play Music F3:help ','$'
mess21 DB 'Copy selected text to buffer ','$'
mess22 DB 'Deletes selected text and copys it ','$'
mess23 DB 'Inserts buffer contents here ','$'
mess13 DB 0b3H,'modified ','$'
mess14 DB 0b3h,'NoModified','$'
mess15 DB ' editing... press Esc can escape ','$'
mess16 DB ' IBM PC Assemble Language Course Design',13,10,'$'
mess17 DB ' MusicEdit 1.0 ',13,10,'$'
mess18 DB ' Made by GuSui etc. ',13,10,'$'
mess19 DB ' Dec,30,2004 ',13,10,'$'
mess20 DB ' Press any keys to return','$'
musicname DB 'd:\music0',0
RF DB 13,10,'$'
music DW 2 DUP(262,294,330,262) ;两只老虎
DW 2 DUP(330,349,392)
DW 2 DUP(392,440,392,349,330,262)
DW 2 DUP(294,196,262),0
time DW 8 DUP(4)
DW 2 DUP(4,4,8)
DW 2 DUP(2,2,2,2,4,4)
DW 2 DUP(4,4,8)
music1 DW 262,294,330,349,392,440,494,523 ;音阶
DW 523,494,440,392,349,330,294,262,0
time1 DW 16 DUP(25)
;文件相关数据定义
handler DW 0
filename DB 'e:/tiger.vol',0
CHartemp DB 0
Buffertemp DB 4 DUP(0)
Bufferflag DW 0
musicFinish DB 0
musicTemp DW 0
times DW 1
musicBuffer DW 100 DUP(0)
bufferIndex DW 0
timeBuffer DW 100 DUP(0)
;菜单数据定义
str_menu DB ' File(F1) Play(F2) Edit(F3) Help(F4)',13,10,'$'
file_0 DB 0dah , 11 DUP(0C4H),0BFH ,13,10,'$'
file_1 DB 0B3H,' New ',0B3H,13,10,'$'
file_2 DB 0B3H,' Open ',0B3H,13,10,'$'
file_3 DB 0B3H,' Save ',0B3H,13,10,'$'
file_4 DB 0B3H,' Save as ',0B3H,13,10,'$'
file_5 DB 0B3H,' Exit ',0B3H,13,10,'$'
file_6 DB 0c0H, 11 DUP(0c4h),0d9H,13,10,'$'
play_0 DB 0dah , 10 DUP(0C4H),0BFH ,13,10,'$'
play_1 DB 0B3H,' tiger ',0B3H,13,10,'$'
play_2 DB 0B3H,' music2 ',0B3H,13,10,'$'
play_3 DB 0B3H,' scale ',0B3H,13,10,'$'
play_4 DB 0B3H,' gun ',0B3H,13,10,'$'
play_5 DB 0c0H, 10 DUP(0c4h),0d9H,13,10,'$'
edit_0 DB 0dah , 10 DUP(0C4H),0BFH ,13,10,'$'
edit_1 DB 0B3H,' Copy ',0B3H,13,10,'$'
edit_2 DB 0B3H,' cut ',0B3H,13,10,'$'
edit_3 DB 0B3H,' Paste ',0B3H,13,10,'$'
edit_4 DB 0c0H, 10 DUP(0c4h),0d9H,13,10,'$'
error0 DB 'Open File failed',13,10,'$'
error1 DB 'the file have illegal character', 13,10,'$'
error2 DB 'the file have illegal character2', 13,10,'$'
data_seg ENDS
;*********************代码段*************8
code_seg SEGMENT
ASSUME CS:code_seg,DS:data_seg
;************主过程开始**************
start:
MOV AX,data_seg
MOV DS,AX
CALL welcome
INit:
CALL INitwin
GEtchar ;读键盘
CMP AH,3bh ;F1
JZ showFile
CMP AH,3ch ;F2
JZ showPlay
CMP AH,3dh
JZ showE
CMP AH,3Eh ;F3
JZ showh
CMP AH,01h
JZ exitf
JMP INit
showFile: CALL showmenuF
JMP INit
showPlay: CALL showMenuP
JMP INit
showE: CALL showMenuE
JMP INit
showh: CALL showmenuh
JMP INit
exitf:
MOV AH, 4ch
INT 21h
;主执行代码结束,下面都是要调用的函数定义.
;***********************************
;**********欢迎模块*****************
welcome PROC
saveE
recover
RET
welcome ENDP
;----------------------------
;***********初始化模块*******
;功能:初始化屏幕,显示菜单,提示信息,设置工作模式为3号字符模式
;****************************
INitwin PROC
saveE
MOV AH,01h
MOV CH,03h
INT 10h ;设置为字符模式03
win 0,0,24,79,70h ;清屏
win 1,0,23,79,07h
win 2,1,23,78,27H
poscur 0,0
show str_menu
poscur 1,0
show peak ;显示上面的横线
;两个循环是画左右两条线的.
MOV CL,23
LOOPf:
poscur CL,0
putchar CHar1
DEC CL
CMP CL,1
JNZ LOOPf
LOOPf2:
INC CL
poscur CL,79
putchar CHar1
CMP CL,23
JNZ LOOPf2
poscur 2,1
posgets
CALL showRC
poscur 24,1
show mess12
poscur 2,1
recover
RET
INitwin ENDP
;*************************************
;************************************
;********文件菜单模块*****************
;功能:当在主过程或编辑状态检测到F1而被激活的.根据用户的选择来
; 执行相应的菜单命令
;入口参数有musicInt:文件数量,以此来判断是激活save,save as 菜单
;先保存视频缓冲区的内容 ,再获取键盘输入,按照输入跳到不同的分支,
;每个分支都调用相应的函数来处理.
;to*为当前选中项*的处理分支
;to*&,其中&是数字,为了解决汇编中的一些跳转指令分几次跳的问题,
showmenuF PROC
saveE
CALL savedisplay
CMP musicInt,0
JZ NOTactive
MOV saveActive,79h
JMP activeOK
notactive:
MOV saveActive,78h
activeOK:
win 0,3,0,11,07h
poscur 0,0
show str_menu
win 2,3,8,15,saveActive ;菜单不选中的颜色(白底黑字)
win 9,4,9,16,07h ;菜单的阴影
win 3,16,9,16,07h ;菜单的阴影
;显示各个菜单,并设置第一个菜单为默认项,
poscur 2,3
show file_0
poscur 3,3
show file_1
poscur 4,3
show file_2
poscur 5,3
show file_3
poscur 6,3
show file_4
poscur 7,3
show file_5
poscur 8,3
show file_6
;to*为当前选中项*的处理分支
tonew:
win 7,4,7,14,79h ;
poscur 7,3
show file_5
win 4,4,4,14,79h
poscur 4,3
show file_2
win 3,4,3,14,67h
poscur 3,3
show file_1
showM mess7
GEtchar
CMP AH,50h ;若按下键下方向键
JZ toOpen
CMP AH,48H
JZ toexit1
CMP AH,1ch ;若按了Enter键
JZ NEwfile1
JMP exitfile ;其他就返回
toexit1: JMP toexit
NEwfile1: JMP NEwfile
toOpen:
win 3,4,3,14,79h
poscur 3,3
show file_1
win 5,4,5,14,saveActive
poscur 5,3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -