📄 sound.asm
字号:
;Sound.asm
;电子发声设计实验
;****************根据查看端口资源修改下列符号值*******************
IOY0 EQU 9C00H
;*****************************************************************
MY8254_COUNT0 EQU IOY0+00H*4 ;8254计数器0端口地址
MY8254_COUNT1 EQU IOY0+01H*4 ;8254计数器1端口地址
MY8254_COUNT2 EQU IOY0+02H*4 ;8254计数器2端口地址
MY8254_MODE EQU IOY0+03H*4 ;8254控制寄存器端口地址
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 ;初始化8254工作方式
MOV AL,36H ;定时器0、方式3
OUT DX,AL
BEGIN:MOV SI,OFFSET FREQ_LIST ;装入频率表起始地址
MOV DI,OFFSET TIME_LIST ;装入时间表起始地址
PLAY: MOV DX,0FH ;输入时钟为1.0416667MHz,1.0416667M = 0FE502H
MOV AX,0E502H
DIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率
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
MOV AH,1 ;判断是否有按键按下?
INT 16H
JZ PLAY
QUIT: MOV DX,MY8254_MODE ;退出时设置8254为方式2,OUT0置0
MOV AL,10H
OUT DX,AL
MOV AX,4C00H ;结束程序退出
INT 21H
DALLY PROC ;延时子程序
D0: MOV CX,200H
D1: MOV AX,0FFFFH
D2: DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -