?? dzq.asm
字號(hào):
;*******************
;* 電子琴 *
;*******************
data segment
ioport equ 0d400h-0280h
io8253a equ ioport+280h
io8253b equ ioport+283h
io8255a equ ioport+288h
io8255b equ ioport+28bh
io0832a equ ioport+290h
data1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波數(shù)據(jù)
time db 120,106,94,89,79,70,63,59 ;發(fā)不同音時(shí)8253的計(jì)數(shù)器初值
msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'
num db ? ;num為8253計(jì)數(shù)器初值的序號(hào)
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h ;顯示提示信息
sss: mov ah,7
int 21h ;從鍵盤接收字符,不回顯
cmp al,1bh
je exit ;若為ESC鍵,則轉(zhuǎn)EXIT
cmp al,31h
jl sss
cmp al,38h
jg sss ;若不在'1'-'8'之間轉(zhuǎn)sss
sub al,31h
mov num,al ;求出相應(yīng)的時(shí)間常數(shù)的序號(hào)
mov cx,60 ;取60次32個(gè)正弦波數(shù)據(jù)
ddd: mov si,0
lll: mov al,data1[si] ;取正弦波數(shù)據(jù)
mov dx,io0832a
out dx,al ;放音
call delay ;調(diào)延時(shí)子程序
inc si
cmp si,32 ;是否取完32個(gè)數(shù)據(jù)
jl lll ;若沒有,則繼續(xù)
loop ddd ;總循環(huán)次數(shù)60是否完,沒有,則繼續(xù)
jmp sss
exit: mov ah,4ch
int 21h
delay proc near ;延時(shí)子程序
ccc: mov bx,offset time
mov dx,io8253b ;置8253通道0為方式0工作
mov al,10h
out dx,al
mov dx,io8255b ;設(shè)8255A口輸入
mov al,9bh
out dx,al
mov al,num ;取相應(yīng)的時(shí)間常數(shù)
xlat
mov dx,io8253a
out dx,al ;向8253通道0輸出
kkk: mov dx,io8255a
in al,dx ;從8255A口讀一字節(jié)
test al,01 ;判PA0口是否為1
jz kkk ;若不為1,則轉(zhuǎn)KKK
ret ;子程序返回
delay endp
code ends
end start
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -