dma方式直接操作声卡
;DOS下直接控制声卡发声的汇编例子程序
;在winXP的cmd窗口中调试通过
;有的机器在纯dos下找不到声卡,可能主板上的集成声卡不兼容
codeSEGMENT
ASSUMECS:code,ds:code
ORG100H
start:;jmploc_2;去掉jmp前的分号,可以跳过显示作者信息
callloc_1
db"DOSvoctestv1.0(c)SYZ2006.7.13",0dh,0ah
db"pressanykey",0dh,0ah,24h
;山东海化集团盛玉增编制,qq:5611409e-mail:[email protected]
;http://www.wfhyjl.cn转载请保留作者信息,谢谢。
val_1dw0
loc_1:
popdx
movah,9
int21h;显示信息
loc_2:
movdx,226h
moval,1
outdx,al
;;;;;;;;复位dsp
movcx,0
loop$
moval,0
outdx,al
calldspin
cmpal,0aah;判断声卡是否准备好
jzloc_3
jmperror_1;出错退出
loc_3:
moval,0d1h
calldspout;打开喇叭
movsi,offsetdata_1;音频数据开始
movcx,offsetdata_end;音频数据结尾
subcx,si;算出音频数据字节数
movval_1,cx;保存到变量中
movdi,8000h
moves,di
movdi,0
cld
repmovsb;把音频数据移动到8000:0
;目的是免了计算DMA页和偏移的麻烦,同时也
;可以防止出现DMA传输的的跨段错误
movdx,0ah;DMA屏蔽寄存器
moval,5;选择通道1
;用通道3时,al=7
;一般声卡默认是用通道1
outdx,al;maskoffdmachannel
movdx,0ch;DMACFFREG
moval,0
outdx,al;clearflip-flop
movdx,0bh
moval,59h
outdx,al;setmodefordac
movdx,2;dma偏移
moval,0;8000:0的偏移是0
outdx,al;低8位0
outdx,al;高8位0
movdx,83h;dma页
moval,8h;8000:0的页是8
outdx,al
movdx,3;dma计数
movcx,val_1;数据块大小
moval,cl
decal
outdx,al;低8位
moval,ch
outdx,al;高字节
movdx,0ah;dmac屏蔽寄存器
moval,1;允许通道1接受请求
outdx,al
moval,040h;dspcmdtimeconst命令
calldspout
moval,131;tc控制声音播放的速度
calldspout
moval,48h;dspcmdblocksize命令
calldspout
movcx,val_1;count数据块的大小
deccx;减去一个字节
moval,cl;低8位
calldspout
moval,ch;高8位
calldspout
moval,1ch;dspcmdautodmadac
calldspout;dsp自动模式
ddd_1:movah,0
int16h;等待按任意键
moval,0d3h
calldspout;关喇叭
moval,0dah
calldspout;停止dma传输
error_1:
pushcs
popds
int20h;返回dos
dspout:pushax;dsp输出
movdx,22ch
dso1:inal,dx
oral,al
jsdso1;未就绪,循环等待
popax
outdx,al
retn
dspin:;dsp输入
movdx,22eh
dsi1:inal,dx
andal,80h
jzdsi1;是否就绪?
movdx,22ah
inal,dx
retn
;-------------------------------------------------------------
;以下为voc文件内容,是用cooleditpro2.0录制的,内容是一句典型
;的潍坊方言,请能听懂的朋友与我联系:-)
;直接把数据文件放到这里,是为了免去操作文件的麻烦,作者比较懒,
;用流行的话说是,相当的懒:-)
;以下为voc的文件头部分,是用\masm32\bintodb.exe转化的
;C:\haha.vocis20037byteslong
db67,114,101,97,116,105,118,101,32,86,111,105,99,101,32,70
db105,108,101,26,26,0,10,1,41,17,1,2,64,0,131,0;此处的131是tc
data_1:;以下为音频数据块
db126,126,126,126,125,125,125,125,125,125,125,125,125,125,124,124
db124,124,124,124,124,124,124,124,124,125,125,125,125,126,126,126
db127,127,127,128,128,128,128,128,128,128,128,127,127,127,126,126
db125,125,125,124,124,123,123,123,123,122,122,122,122,122,122,122
db122,122,122,122,123,123,123,124,124,125,126,127,127,128,129,129
db130,131,131,132,132,132,132,131,131,129,128,127,126,125,124,123
|