第一个是实验指导书上自带的《友谊天长地久》
IOYO EQU 06C0H
MY8254_COUNT0 EQU IOYO+00H
MY8254_COUNT1 EQU IOYO+02H
MY8254_COUNT2 EQU IOYO+04H
MY8254_MODE EQU IOYO+06H
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
FREQ_LIST DW 371,495,495,495,624,556,495,556,624
DW 495,495,624,742,833,833,833,742,624
DW 624,495,556,495,556,624,495,416,416,371
DW 495,833,742,624,624,495,556,495,556,833
DW 742,624,624,742,833,990,742,624,624,495
DW 556,495,556,624,495,416,416,371,495,0
TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 12, 1, 3, 6, 2
DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 6, 2, 4, 4, 12
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX ;装载数据
MOV DX, MY8254_MODE ;写入控制字00110110,通道0,先写入高位,方式3,二进制
MOV AL, 36H
OUT DX, AL
BEGIN: MOV SI, OFFSET FREQ_LIST ;取音谱首地址
MOV DI, OFFSET TIME_LIST ;取节拍首地址
PLAY: MOV DX, 0FH ;输入时钟频率
MOV AX, 4240H
DIV WORD PTR [SI] ;依次计算初值:0F4240/音谱频率
MOV DX,MY8254_COUNT0 ;选择计数器0
OUT DX, AL ;装入技术初值
MOV AL, AH
OUT DX, AL
MOV DL, [DI] ;取出节拍
CALL DELAY ;调用延时程序
ADD SI, 2
INC DI
CMP WORD PTR [SI],0 ;判断是否到最后一个音
JE BEGIN
JMP PLAY
DELAY PROC ;延时程序,延时dl*单位时间
D0: MOV CX, 0010H ;loop 16次
D1: MOV AX, 0F00H ;jnz 15*256次
D2: DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DELAY ENDP
CODE ENDS
END START
其实讲道理,老师要我们修改歌曲主要就是将FREQ_LIST和TIME_LIST改变成你要改的歌曲。于是下面先来一个两只老虎的。
IOYO EQU 06C0H
MY8254_COUNT0 EQU IOYO+00H
MY8254_COUNT1 EQU IOYO+02H
MY8254_COUNT2 EQU IOYO+04H
MY8254_MODE EQU IOYO+06H
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
FREQ_LIST DW 330,371,416,330
DW 416,441,495
DW 495,556,495,441,416,330
DW 495,556,495,441,416,330
DW 330,248,330
DW 330,248,330,0
TIME_LIST DB 4,4,4,4
DB 4,4,4,4
DB 4,4,8
DB 4,4,8
DB 2,2,2,2,4,4
DB 2,2,2,2,4,4
DB 4,4,8
DB 4,4,8
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
BEGIN: MOV SI,OFFSET FREQ_LIST
MOV DI,OFFSET TIME_LIST
PLAY: MOV DX,0FH
MOV AX,4240H
DIV WORD PTR [SI]
MOV DX,MY8254_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DL,[DI]
CALL DALLY
ADD SI,2
INC DI
CMP WORD PTR [SI],0
JE BEGIN
JMP PLAY
DALLY PROC
D0: MOV CX,0010H
D1: MOV AX,0F00H
D2: DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY ENDP
CODE ENDS
END START
再来一个爱情买卖。
IOYO EQU 06C0H
MY8254_COUNT0 EQU IOYO+00H
MY8254_COUNT1 EQU IOYO+02H
MY8254_COUNT2 EQU IOYO+04H
MY8254_MODE EQU IOYO+06H
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
FREQ_LIST DW 330,441,525,525,330,441,525
DW 495,441,495,441,393,330
DW 294,294,294,221,294,330,393
DW 330,495,495,393,330
DW 330,441,525,525,331,441,525
DW 661,589,661,589,525,589
DW 661,661,589,525,589,589,525,495
DW 393,330,393,441,441,0
TIME_LIST DB 4,4,4,4,4,4,8
DB 4,2,2,4,4,16
DB 4,4,4,4,4,4,8
DB 4,4,4,4,16
DB 4,4,4,4,4,8
DB 4,2,2,4,4,16
DB 6,2,4,4,6,2,4,4
DB 4,4,4,4,16
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
BEGIN: MOV SI,OFFSET FREQ_LIST
MOV DI,OFFSET TIME_LIST
PLAY: MOV DX,0FH
MOV AX,4240H
DIV WORD PTR [SI]
MOV DX,MY8254_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DL,[DI]
CALL DELAY
ADD SI,2
INC DI
CMP WORD PTR [SI],0
JE BEGIN
JMP PLAY
DALLY PROC
D0: MOV CX,0010H
D1: MOV AX,0F00H
D2: DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY ENDP
CODE ENDS
END START