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

运行界面:

主菜单:

 

mainMenu

钢琴界面:

 

pianoMenu

点歌界面:

 

musicMenu

退出界面:

 

exitMenu

原创粉丝点击