25键钢琴书(3)
来源:互联网 发布:网络摄像头传输距离 编辑:程序博客网 时间:2024/04/29 13:02
;-------------------------------------------------
;出口:DX=1退出总程序,DX=2回滚
MUSMENU PROC NEAR
PUSH AX
PUSH BP
PUSH SI
STOPM0:
CALL CLEIN ;清除输入框架中的内容
CALL CURSORP ;置光标到输入框的中心处
CALL INPUT
STOP01:
CMP AL,'1'
JNZ STOP02
PUSH DX
LEA DX,MUSIC_1
CALL MUSIC_S
POP DX
LEA SI,MUS_F1
LEA BP,DS:MUS_T1
JMP STOPM1
STOP02:
CMP AL,'2'
JNZ STOP03
PUSH DX
LEA DX,MUSIC_2
CALL MUSIC_S
POP DX
LEA SI,MUS_F2
LEA BP,DS:MUS_T2
JMP STOPM1
STOP03:
CMP AL,'3'
JNZ STOP04
PUSH DX
LEA DX,MUSIC_3
CALL MUSIC_S
POP DX
LEA SI,MUS_F3
LEA BP,DS:MUS_T3
JMP STOPM1
STOP04:
CMP AL,'4'
JNZ STOP05
PUSH DX
LEA DX,MUSIC_4
CALL MUSIC_S
POP DX
LEA SI,MUS_F4
LEA BP,DS:MUS_T4
JMP STOPM1
;就算已经等于1~4中的任何一个数,而它依然会继续执行下去,所以就会碰到,字母
;中的最后一个r,接着就会跳到stopm0这个位置,重新要求输入
STOP05:
CMP AL,'Q'
JNZ STOP06
JMP STOPM2
STOP06:
CMP AL,'R'
JNZ STOP07
JMP STOPM3
STOP07:
CMP AL,'q'
JNZ STOP08
JMP STOPM2
STOP08:
CMP AL,'r'
JNZ STOPMQ
JMP STOPM3
STOPMQ:
CALL ERROR
CALL TIMELATE
CALL TIMELATE
JMP STOPM0
STOPM1:
CALL MUSIC
JMP STOPM0
STOPM2:
MOV DX,'1' ;退出总程序
JMP EXITM2
STOPM3:
MOV DX,'2' ;回滚一层
EXITM2:
CALL TIMELATE
CALL TIMELATE
POP SI
POP BP
POP AX
RET
MUSMENU ENDP
;-------------------------------------------------
;播放整首音乐
;入口SI[频率首地址]与BP[发音时间首地址]作为入口
MUSIC PROC NEAR ;播放整首音乐
PUSH BX
PUSH BP
PUSH DI
FREQ:
MOV DI,[SI] ;实参
CMP DI,-1
JE END_MUS1 ;即jz(如果di==1,则跳到end_mus)
MOV BX,DS:[BP] ;实参
CALL SOUNDF
;///////////////
;音乐播放一半时跳出
MOV AH,01H ;ZF=0时,AL=字符码,AH=扫描码
INT 16H ;ZF=1时,缓冲区无按键等待
CMP AL,'E'
JZ END_MUS1
CMP AL,'e'
JZ END_MUS1
MOV AL,'5' ;'这个是我自己随便设'
;///////////////
ADD SI,2 ;向后移一个字
ADD BP,2 ;向后移一个字
JMP FREQ ;跳回到freq这个位置重新判断
END_MUS:
END_MUS1:
POP DI
POP BP
POP BX
RET
MUSIC ENDP
;-------------------------------------------------
;入口BX[发音时长(要求是0.125秒的倍数)]与DI[频率]
SOUNDF PROC NEAR
PUSH AX
PUSH CX
PUSH DX
MOV AL,10110110B
OUT 43H,AL
MOV DX,12H ;因为11931000D=12348cH,所以DX用来存放高位
;扣除低四348cH剩下的12H
MOV AX,348CH ;1193110/freq
DIV DI ;因为除数为32位,所以可用来除以16位的,结果为16位,保存在AX中
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H ;
MOV AH,AL ;
OR AL,3 ;
OUT 61H,AL ;
BACK:
MOV CX,8286 ;现为0.125秒
CALL WAITF
DEC BL
JNZ BACK
MOV AL,AH
OUT 61H,AL
POP DX
POP CX
POP AX
RET
SOUNDF ENDP
;-------------------------------------------------
;入口CX,控制时间基数
WAITF PROC NEAR
PUSH AX
WAITF1: ;15.08微秒
IN AL,61H
AND AL,10H
CMP AL,AH
JE WAITF1
MOV AH,AL
LOOP WAITF1
POP AX
RET
WAITF ENDP
;-------------------------------------------------
;-------------------------------------------------
CODE ENDS
;*************************************************
END MAIN
运行界面:
主菜单:
钢琴界面:
点歌界面:
退出界面:
- 25键钢琴书(3)
- 25键钢琴书(1)
- 25键钢琴书(2)
- jQuery钢琴键特效
- DirectSound 钢琴(1)
- DirectSound 钢琴(2)
- 钢琴基础 (一)
- 钢琴
- 钢琴上的黑键
- [NOI2010]超级钢琴(堆)
- 学学钢琴(天空之城)
- 真正的钢琴(Piano simulator)
- 钢琴调律经验(菜鸟版)
- 2016年7月17日学习 scratch 钢琴键
- Everyone Piano键盘钢琴版下载 v1.8.1.25 中文版
- [和平之月] -- 京 (钢琴精选集)
- windows SDK模拟游戏钢琴的实现(二)
- NOI2010——超级钢琴(划分树)
- 火狐和ie下都支持的过滤功能【css】
- Socket编程求帮助
- 起名忌讳十点,起名要注意那些啊?
- 25键钢琴书(2)
- 堆与栈的区别.
- 25键钢琴书(3)
- 2010-8-6总结
- 二层交换机
- 养胃
- Gcc使用的内嵌汇编语法格式小教程
- dns不能解析ip地址的问题
- C# 切割图片
- 转:Windows Mobile任务管理器获取代码(cpu,内存)
- 灰系统和模糊数学