21,453
社区成员
发帖
与我相关
我的任务
分享
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP('STACK...')
STACK ENDS
DATA SEGMENT
MESIN DB 'Please input the path of the music score.',13,10,'$'
MESERR DB 'Music score open error!',13,10,'$'
PK DB 'Press any key to exit.',13,10,'$'
RERR DB 'Reading Error!',13,10,'$'
FOK DB 'File Open Successed',13,10,'$'
MCNUM DW 0 ;曲谱文件号待存
BUFFLEN=50
BUFFER DB BUFFLEN
DB ?
DB BUFFLEN DUP(0)
MUS_FRE DB 0
MUS_TIME DB 0
MUCFRE DW 0
MUCTIME DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START PROC FAR
MOV AX,DATA
MOV DS,AX
LEA DX,MESIN
MOV AH,09H
INT 21H
MOV DX,OFFSET BUFFER
MOV AH,0AH
INT 21H ;输入源文件路径
LEA SI,BUFFER
MOV AL,[SI+1]
XOR AH,AH
ADD SI,2
ADD SI,AX
MOV BYTE PTR[SI],0 ;将输入文件名的最后一个回车符换成0
MOV DX,OFFSET BUFFER+2
MOV AH,3DH
INT 21H ;打开源文件
JNC OPENOK ;打开成功跳至OPENOK
LEA DX,MESERR
MOV AH,09H
INT 21H
JMP EXIT
OPENOK:
MOV MCNUM,AX
LEA DX,FOK
MOV AH,09H
INT 21H
MUCREAD:
MOV DX,OFFSET MUS_FRE
MOV CX,2
MOV BX,MCNUM
MOV AH,3FH
INT 21H
JNC READOK
LEA DX,RERR
MOV AH,09H
INT 21H
READOK:
CALL MUSIC
OR AX,AX
JZ MUCOK
JMP MUCREAD
MUCOK:
MOV BX,MCNUM
MOV AH,3EH
INT 21H
EXIT:
LEA DX,PK
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV AH,4CH
INT 21H
START ENDP
MUSIC PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
CALL TRANS
LEA SI,MUCFRE
LEA BP,DS:MUCTIME
MOV DI,[SI]
MOV BX,DS:[BP]
CALL SOUNDF
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
MUSIC ENDP
TRANS PROC NEAR
PUSH AX
PUSH BX
XOR AX,AX
XOR BX,BX
MOV AL,MUS_FRE
CMP AL,'C'
JNZ FRE_D
MOV BX,262
MOV MUCFRE,BX
JMP TTIME
FRE_D:CMP AL,'D'
JNZ FRE_E
MOV BX,294
MOV MUCFRE,BX
JMP TTIME
FRE_E:CMP AL,'E'
JNZ FRE_F
MOV BX,330
MOV MUCFRE,BX
JMP TTIME
FRE_F:CMP AL,'F'
JNZ FRE_G
MOV BX,349
MOV MUCFRE,BX
JMP TTIME
FRE_G:CMP AL,'G'
JNZ FRE_A
MOV BX,392
MOV MUCFRE,BX
JMP TTIME
FRE_A:CMP AL,'A'
JNZ FRE_B
MOV BX,440
MOV MUCFRE,BX
JMP TTIME
FRE_B:CMP AL,'B'
MOV BX,262
MOV MUCFRE,BX
TTIME:
XOR AX,AX
XOR BX,BX
MOV AL,MUS_TIME
CMP AL,'F'
JNZ TIME_H
MOV BX,100
MOV MUCTIME,BX
JMP TRANSOK
TIME_H:CMP AL,'H'
JNZ TIME_Q
MOV BX,50
MOV MUCTIME,BX
JMP TRANSOK
TIME_Q:CMP AL,'Q'
JNZ TIME_E
MOV BX,25
MOV MUCTIME,BX
JMP TRANSOK
TIME_E:CMP AL,'E'
MOV BX,13
MOV MUCTIME,BX
TRANSOK:
POP BX
POP AX
RET
TRANS ENDP
SOUNDF PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
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
WAIT1:
MOV CX,663
CALL WAITF
DELAY:
LOOP DELAY
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
SOUNDF ENDP
WAITF PROC NEAR
PUSH AX
WAITF1:
IN AL,61H
AND AL,10H
CMP AL,AH
JE WAITF1
MOV AH,AL
LOOP WAITF1
POP AX
RET
WAITF ENDP
CODE ENDS
END START