项目环境
- 编译环境:搭建一个nasm2.8的编译环境。
- 镜像文件:采用winhex_18.2刷入编码。
- 虚拟机:采用Bochs-2.4.5。
项目软件
- 傻瓜式环境配置。
- 解压文件到D盘能直接使用。
音频对照表
程序源码(.asm)
org 0x8400
jmp start
;*****************************************数据准备区*****************************************
sound_f:;初始频率
dw 1000
sound_hz:;赫兹中转
dw 0
different_f:;不同音阶
dw 523
dw 587
dw 659
dw 698
dw 784
dw 880
dw 988
;*****************************************开始*****************************************
start:
mov ax,0xb800 ;指向文本模式的显示缓冲区
mov es,ax
mov ax,0
mov ds,ax
cli
mov word [ds:0x24],int_key ;写入键盘中断9号服务程序地址
mov word [ds:0x26],0
sti
;设置频率
; mov dx,12H
; mov ax,34DEH
; mov di,1000
; div di
;给定时器频率
; mov al,10110110B
; out 43h,al
; mov ax,1983
; out 42h,al
; mov al,ah
; out 42h,al
;扬声器端口打开
; in al,61h
; or al,00000011B
; out 61h,al
x:
jmp $
;*****************************************键盘中断*****************************************
int_key:;键盘
mov dx,0x60 ;读取键盘缓冲区数据
in al,dx
;叫1 duo
cmp al,0x02
je call_1
;叫2 rai
cmp al,0x03
je call_2
;叫3 mi
cmp al,0x04
je call_3
;叫4 fa
cmp al,0x05
je call_4
;叫5 sao
cmp al,0x06
je call_5
;叫6 la
cmp al,0x07
je call_6
;叫7 xi
cmp al,0x08
je call_7
jmp read_sound
call_1:
mov bx,[ds:different_f] ;duo
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_2:
mov bx,[ds:different_f+2] ;rai
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_3:
mov bx,[ds:different_f+4] ;mi
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_4:
mov bx,[ds:different_f+6] ;fa
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_5:
mov bx,[ds:different_f+8] ;sao
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_6:
mov bx,[ds:different_f+10] ;la
mov [ds:sound_f],bx
call make_sound
jmp read_sound
call_7:
mov bx,[ds:different_f+12] ;xi
mov [ds:sound_f],bx
call make_sound
jmp read_sound
read_sound:
mov dx,0x20
mov al,0x61
out dx,al
iret
;*****************************************发声主程序*****************************************
make_sound:;发声
call give_f
call delay
call open_sound
call delay
call close_sound
ret
;**********************************************************************************声音模块**********************************************************************************
;*****************************************设置频率*****************************************
set_f:;设置频率
push dx
push ax
mov dx,12H
mov ax,34DEH
mov di,[ds:sound_f]
div di
mov [ds:sound_hz],ax
pop ax
pop dx
ret
;*****************************************给定时器频率*****************************************
give_f:;给定时器频率
mov al,10110110B
out 43H,al
call set_f
mov ax,[ds:sound_hz]
out 42H,al
mov al,ah
out 42H,al
ret
;*****************************************扬声器端口打开*****************************************
open_sound:;扬声器端口打开
push ax
in al,61H
or al,00000011B;或操作与11111100B
out 61H,al
pop ax
ret
;*****************************************扬声器端口关闭*****************************************
close_sound:;扬声器端口关闭
push ax
in al,61H
and al,11111100B;与操作与00000011B
out 61H,al
pop ax
ret
;*****************************************时延*****************************************
delay:;时延
push cx
push dx
push ax
mov cx,0FH
;mov dx,4240H ;延迟
mov dx,1000H ;延迟
mov ah,86H
int 15H
pop ax
pop dx
pop cx
ret