📄 muedit.asm
字号:
JMP CHargetF
showEditn:
CALL showMenuE
JMP CHargetF
showhn: CALL showmenuh
JMP CHargetF
exitRet:
CMP modifyFlag,0
JNZ exitedit
CALL IFsave
exitedit:
MOV SI,8
DEC musicname[SI]
DEC musicInt
recover
RET
EDItfile ENDP
;**********退出编辑状态时判断是否需要保存的模块***************
;当文件未保存时调用的函数
;入口参数为saveY,当用户输入Y/y时调用filesaveas函数进行保存
;当用户输入N/n时不保存,用户输入有误时提示再输入一次.
;出口参数 AsOrIfFlag,它会影响 filesaveas函数的执行分支的选择.
;AsOrIfFlag为1时为Ifsave函数调用filesaveas,否则为0时是用户按下
;save as菜单做出的函数调用.
IFsave PROC
saveE
win 10,15,12,67,07h
win 9,14,11,66,24h
poscur 10,15
show mess3
GEtcharIS:
GEtchar
CMP AL,59h
JZ saveY
CMP AL,79h
JZ saveY
CMP AL,6Eh
JZ exitifsave
CMP AL,4Eh
JZ exitifsave
poscur 24,0
show mess5
JMP GEtcharIS
saveY:
MOV AsOrIfFlag,1
CALL filesaveas
exitifsave:
recover
RET
IFsave ENDP
upsproc PROC
saveE
recover
RET
upsproc ENDP
downsproc PROC
saveE
recover
RET
downsproc ENDP
leftsproc PROC
saveE
posgets
readChar
MOV copyFlag,1
MOV BL,pasteNum
MOV BH,0
MOV BX,0071h
MOV CX,1
MOV AH,09h
INT 10h
INC pasteNum
CMP column,1
JZ exitlefts
MOV AL,column
DEC AL
poscur row,AL
INC AL
MOV columnbak,AL
MOV DL,row
MOV rowbak,DL
exitlefts:
recover
RET
leftsproc ENDP
rightsproc PROC
saveE
MOV copyFlag,1
readChar
MOV BL,pasteNum
MOV BH,0
INC pasteNum
MOV BX,0071h
MOV CX,1
MOV AH,09h
INT 10h
posgets
CMP column,79
JZ exitrights
INC column
poscur row,column
posgets
exitrights:
recover
RET
rightsproc ENDP
;********按下向上的方向键时响应的函数****
upk2 PROC
saveE
posgets
CMP row,2
JZ exitup
DEC row
poscur row,column
exitup: recover
RET
upk2 ENDP
;********按下向下的方向键时响应的函数****
downk PROC
saveE
posgets
CMP row,23
JZ exitdown
INC row
poscur row,column
exitdown: recover
RET
downk ENDP
;********按下向左的方向键时响应的函数****
LEftk PROC
saveE
posgets
CMP column,1
JZ exitleft
DEC column
poscur row,column
exitleft: recover
RET
LEftk ENDP
;********按下向右的方向键时响应的函数****
rightk PROC
saveE
posgets
CMP column,78
JZ exitright
INC column
poscur row,column
exitright: recover
RET
rightk ENDP
;********按下回车时响应的函数****
;存在问题:
enterk PROC
saveE
posgets
CMP row,23
JZ exitenter
INC row
MOV column,1
poscur row,column
exitenter:
recover
RET
enterk ENDP
;********按下home时响应的函数****
homek PROC
saveE
posgets
MOV column,1
poscur row,column
recover
RET
homek ENDP
;********按下end时响应的函数****
ENDk PROC
saveE
posgets
MOV column,78
poscur row,column
recover
RET
ENDk ENDP
;********按下退格键时响应的函数****
;1、注意这个函数,它与DEL键的处理函数一样
;都需要修改视频缓冲区来达到被删除字符
;后面的字符都要向前移,2、同时也要修改数据
;缓冲区,否则你看到的屏幕上的字符与实际
;根据缓冲区里的字符储存的文件字符不一致
;3、这些修改是调用movhead函数来实现的.
;存在问题.
bak_spk PROC
saveE
posgets
;列号不同跳到不同的分支.
CMP column,1
JZ bak_spk1
DEC column
JMP deal
bak_spk1:
CMP row,2
JZ exitbak_spk
DEC row
MOV column,78
deal:
poscur row,column
putchar 0
poscur row,column
CALL MOVahead
exitbak_spk:
recover
RET
bak_spk ENDP
;********按下退格键时响应的函数****
;注意事项请看bak_spk的注释
;存在问题.
delk PROC
saveE
posgets
;列号不同跳到不同的分支.
CMP column,78
JZ delk1
INC column
JMP deldeal
delk1:
CMP row,23
JZ exitdel
INC row
MOV column,1
deldeal:
poscur row,column
putchar 0
poscur row,column
CALL MOVahead
exitdel:
recover
RET
delk ENDP
;********修改视频和数据缓冲区*****
;delk 和bak_spk函数将调用之.
;1、注意此函数的主体是一个循环,这个循环的入口参数是:
;2、CX用来控制循环次数,即修改次数,
;cx=21*78-(row-2)*78
;3、BX用来控制B800开始的视频缓冲区的偏移量
;BX=row*160+column*2
;4、注意最后一行应该特殊处理, 否则会出现很奇怪的现象
;
;存在问题.
MOVahead PROC
saveE
PUSH ES
MOV AX,0b800h
MOV ES,AX
MOV SI,0
;计算SI
MOV AL,160d
MUL row
MOV SI,AX
MOV AL,2d
MUL column
ADD SI,AX
;计算CX
MOV AX,0
MOV AL,78d
MOV AH,row
SUB AH,2
MUL AH
MOV DL,column
DEC DL
MOV DH,0
ADD AX,DX
MOV CX,1638d
SUB CX,AX
MOV DL,column
;循环改变视频缓冲区.
LOOPahead:
exchang:
INC DL
CMP DL,79
JZ AHead1
MOV BX,ES:[SI+2]
MOV ES:[SI],BX
ADD SI,2
JMP AHeadContine
AHead1:
;根据行号的不同选择不同的分支.
CMP row,23
JZ EXITMovahead
MOV BX,ES:[SI+6]
MOV ES:[SI],BX
ADD SI,6
MOV DL,1
AHeadContine:
LOOP LOOPahead
EXITMovahead:
POP ES
recover
RET
MOVahead ENDP
MOVBack PROC
saveE
PUSH ES
PUSH AX
MOV AX,0b800h
MOV ES,AX
MOV SI,0
;计算SI
MOV AL,160d
MUL row
MOV SI,AX
MOV AL,2d
MUL column
ADD SI,AX
;计算CX
MOV AX,0
MOV AL,78d
MOV AH,row
SUB AH,2
MUL AH
MOV DL,column
DEC DL
MOV DH,0
ADD AX,DX
MOV CX,1638d
SUB CX,AX
MOV DL,column
MOV DH,row
;循环改变视频缓冲区.
POP AX
LOOPBack:
INC DL
CMP DL,79 ;如果79列,跳到BACK1特殊处理
JZ Back1
MOV BX,ES:[SI+2] ;
CMP BL,20h ;千万注意:寄存器里的存放顺序与存储器中的正好相反
JZ exitLoop
JMP BackContine
exitLoop:
MOV ES:[SI+2],AX
JMP EXITMovBack
Back1:
;根据行号的不同选择不同的分支.
CMP DH,24
JMP EXITMovBack ;留下接口,等实现了翻页功能后再做变动.
MOV ES:[SI+6],AX
MOV AX,BX
ADD SI,6
MOV DL,1
INC DH
LOOP LOOPBack
BackContine:
MOV ES:[SI+2],AX
MOV AX,BX
ADD SI,2
LOOP LOOPBack
EXITMovBack:
POP ES
recover
RET
MOVBack ENDP
;************文件打开函数*********
;文件操作:有打开,读取调用
;先提示用户正确输入文件名称,错误时要特殊处理
;
fileopen PROC
saveE
MOV modifyFlag,1
CALL menuHide
CALL BackDisplay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -