📄 muedit.asm.bak
字号:
JZ showEditn1
CMP AH,3Eh
JZ showhn1
CMP AH,01H
JZ exitRet1
JMP JMPsNext
JMPs:
upk1: JMP upk
down1: JMP down
left1: JMP left
right1: JMP right
enter1: JMP enter
home1: JMP home
_END1: JMP _END
bak_sp1: JMP bak_sp
del1: JMP del
showFilen1: JMP showFilen
showPlayn1: JMP showPlayn
showEditn1: JMP showEditn
showhn1: JMP showhn
exitRet1: JMP exitRet
JMPsNext:
CMP AL,0
JZ CHargetF12
PUSH AX
readChar
CMP AL,20h ;此处是判断是否需要后移文本
JZ putcharDirect ;需要则调用MOVBACK
posGets
CALL MovBack
putcharDirect:
POP AX
CMP column,79
JNZ putchar1
MOV column,1
INC row
poscur row,column
putchar1:
INC column
putchar AL
MOV modifyFlag,0
CMP CLearFlag,0
JZ CHargetf1
JMP CHargetF13
CHargetF12: JMP CHargetf1
CHargetF13:
MOV CL,pasteNum
MOV CH,0
MOV SI,CX
posgets
poscur rowbak,columnbak
MOV DH,rowbak
MOV DL,columnbak
LOOPclear: ;此循环是为了恢复反显文本
readChar
MOV BX,0017h
MOV CX,1
MOV AH,09h
INT 10h
DEC SI
INC DL
poscur DH,DL
CMP SI,0
JNZ LOOPclear
; mov pasteFlag,0
; MOV pasteNum,0
MOV CLearFlag,0
MOV CopyFlag,0
poscur row,column
CHargetF1:
JMP CHargetF
upk: CALL upk2
JMP CHargetF
down: CALL downk
JMP CHargetF
LEft: CALL LEftk
JMP CHargetF
right: CALL rightk
JMP CHargetF
enter: CALL enterk
JMP CHargetF
home: CALL homek
JMP CHargetF
_END: CALL ENDk
JMP CHargetF
bak_sp: CALL bak_spk
JMP CHargetF
del: CALL delk
JMP CHargetF
showfilen:CALL showmenuF
JMP CHargetF
showplayn:CALL showmenup
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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -