📄 muedit.asm
字号:
CALL BackDisplay
poscur row,column
recover
RET
showmenuh ENDP
;*****播放第一首歌*********
music1play PROC
saveE
CALL menuHide
CALL BackDisplay
LEA SI,music
LEA BP,time
freq1:
MOV DI,[SI]
CMP DI,0
JE endmusic1
CALL soundf1
ADD SI,2
ADD BP,2
JMP freq1
endmusic1:
MOV AL,48h
OUT 61h,AL
EXITMuP1:
recover
RET
music1play ENDP
soundf1 PROC
saveE
MOV AL,0b6h ;位组合格式:通道2,两字节计数,模式3,二进制码
OUT 43h,AL
MOV DX,12h
MOV AX,348ch
DIV DI ;(di)=频率
OUT 42h,AL ;频率计数值送通道二
MOV AL,AH
OUT 42h,AL
IN AL,61h
MOV AH,AL
OR AL,3
OUT 61h,AL ;关闭扬声器
MOV BL,[BP]
up:
MOV CX,16572
CALL waitf1
DEC BL
JNZ up
exitSoundf1:
recover
RET
soundf1 ENDP
waitf1 PROC
saveE
waitf2:
IN AL,61h
AND AL,10h
CMP AL,AH
JE waitf2
MOV AH,AL
LOOP waitf2
recover
RET
waitf1 ENDP
music2play PROC
saveE
CALL menuHide
CALL BackDisplay
recover
RET
music2play ENDP
scaleplay PROC
saveE
LEA SI,music1
LEA BP,time1
freq2:
MOV DI,[SI]
CMP DI,0
JE endmusic2
MOV BX,DS:[BP]
CALL soundy
ADD SI,2
ADD BP,2
JMP freq2
endmusic2:
MOV AL,48h
OUT 61h,AL
JMP exit1
exit1:
recover
RET
scaleplay ENDP
soundy PROC
saveE
wait1:
MOV CX,2801
delay:
LOOP delay
DEC BX
JNZ wait1
MOV AL,0b6h
OUT 43h,AL
MOV DX,12h
MOV AX,348ch
DIV DI
OUT 42h,AL
MOV AL,AH
OUT 42h,AL
IN AL,61h
MOV AH,AL
OR AL,3
OUT 61h,AL
CALL waitf1
recover
RET
soundy ENDP
gunplay PROC
saveE
MOV CX,50d
newshoot:
PUSH CX
CALL shoot
MOV CX,4000h
silent:
LOOP silent
POP CX
LOOP newshoot
MOV AL,48h
OUT 61h,AL
recover
RET
gunplay ENDP
shoot PROC
saveE
MOV DX,140h
MOV BX,200h
IN AL,61h
AND AL,11111100b ;关断定时器通道2的门控
sound:
XOR AL,2d ;触发61h端口的第一位
OUT 61h,AL
ADD DX,9248h
MOV CL,3
ROR DX,CL
MOV CX,DX
ADD CX,1ffh
OR CX,10
waits:
LOOP waits
DEC BX
JNZ sound
AND AL,11111100b
OUT 61h,AL ;恢复61h端口
recover
RET
shoot ENDP
;*********按下新建菜单时的处理函数******
;入口参数有:musicInt:文件数量,一进入即增加1
;先隐藏菜单,并用默认名创建文件,文件名根据musicInt来自动判断并更改
;最后调用函数:editFile进入编辑状态.
filenew PROC
saveE
MOV modifyFlag,0
CALL menuHide
win 1,28,1,56,70h ;写文件名
MOV SI,8
INC musicInt
INC musicname[SI]
poscur 1,35
show musicname
win 2,1,23,78,017h ;工作区为蓝底白字
MOV row,2
MOV column,1
poscur row,column
CALL EDItfile
recover
RET
filenew ENDP
;*********最重要的函数之一**********
;可能被fileNew函数、fileOpen函数调用
;获取键盘输入,按照输入跳到不同的分支,
;每个分支都调用相应的函数来处理.
;注意不同的分支处理缓冲区的方式也不同
;处理函数是相应的键名+K,以区别以其标号
EDItfile PROC
saveE
MOV BX,0
CHargetF:
posgets
poscur 24,0
show mess15
;根据modifyFlag的值来显示是否已修改的信息.
poscur 24,43
CMP modifyFlag,0
JZ MODifyMess
show mess14
JMP showedMess
MODifyMess:
show mess13
showedMess:
poscur row,Column
CALL showRC
;从键盘读字符 ah=扫描码 al=字符码
MOV AH,12h
INT 16h
AND AL,00000011b
JZ notshift1
posgets
MOV rowbak,DH
MOV columnbak,DL
shift:
MOV CLearFlag,1
GEtchar
PUSH AX
MOV AH,12h
INT 16h
AND AL,00000011b
JZ exitshift
POP AX
; CMP AH,48h ;上;待实现
; JZ ups
; CMP AH,50h ;下;待实现
; JZ downs
CMP AH,4bh ;左
JZ leftS
CMP AH,4dh ;右
JZ rightS
JMP exitShift
notshift1: JMP NOTshift
exitRet13: JMP exitRet
ups: CALL upSProc
JMP shift
downs: CALL downSProc
JMP shift
LEfts: CALL LEftSProc ;S表示:selet
JMP shift
rights: CALL rightsProc ;
JMP shift
exitShift:
POP AX
JMP NOTshift2
NOTshift:
Getchar
NOTshift2:
posgets
LEA DX,buffer
MOV buffer[BX],AL
INC totalChars
INC BX
CMP AH,48h ;上
JZ upk1
CMP AH,50h ;下
JZ down1
CMP AH,4bh ;左
JZ left1
CMP AH,4dh ;右
JZ right1
CMP AH,1ch ;回车
JZ enter1
CMP AH,47h ;home
JZ home1
CMP AH,4fh ;end
JZ _END1
CMP AH,0eh ;backspace
JZ bak_sp1
CMP AH,53h
JZ del1
CMP AH,3bh
JZ showFilen1
CMP AH,3ch
JZ showPlayn1
CMP AH,3Dh
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -