「MASM32/playssg」の編集履歴(バックアップ)一覧はこちら
MASM32/playssg - (2018/08/21 (火) 21:33:10) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
playssg.asm
#highlight(asm){{
comment *
MASM32 SDK
ml /c /AT /Fl playssg.asm
link16 /t playssg;
*
.model tiny
FP struc
FP_OFF dw ?
FP_SEG dw ?
FP ends
; Programmable Interrupt Controller / Master
MPIC_OCW1 equ 02h ; Operation Command Word
MPIC_OCW2 equ 00h
MPIC_IMR equ 02h ; Interrupt Mask Reg.
; Programmable Interval Timer
PIT_CNT0 equ 71h ; Counter
PIT_MODE equ 77h ; Mode Reg.
BIOS_FLAG equ 0501h
CLOCK5 equ 24576 ; 5MHz系
CLOCK8 equ 19968 ; 8MHz系
LF equ 0ah
CR equ 0dh
STDOUT equ 1
.code
.186
org 0100h
;■
main proc
mov ax, 2523h
mov dx, offset myint23
int 21h
mov al, 08h ; 振幅 A
mov ah, 0
call wrtpsg
mov al, 07h ; ミキサー
mov ah, 0feh
call wrtpsg
call settimer
@@loop:
call play
jnc @@loop
call resettimer
@@exit:
mov ax, 4c00h
int 21h
main endp
;■
play proc
mov ax, count_msec
cmp ax, next
jb @@exit0
mov al, 08h ; 振幅 A
mov ah, 0
call wrtpsg
mov si, pos
cld
lodsw
mov cx, ax
mov al, 01h ; トーン・ジェネレータ A
mov ah, ch
call wrtpsg
mov al, 00h
mov ah, cl
call wrtpsg
mov ax, cx
call printd
mov ah, 02h
mov dl, CR
int 21h
mov dl, LF
int 21h
lodsw
cmp ax, 0
je @@exit1
mov cx, ax
mov al, 08h ; 振幅 A
mov ah, 12
call wrtpsg
add next, cx
mov pos, si
@@exit0:
clc
ret
@@exit1:
stc
ret
play endp
;■
wrtpsg proc
mov dx, 188h ; アドレス
out dx, al
mov dx, 18ah ; データ
mov al, ah
out dx, al
ret
wrtpsg endp
;■
myint23 proc far
call resettimer
stc
ret ; retf
myint23 endp
;■
settimer proc
pushf
push es
@@setvector:
mov ax, 3508h
int 21h
mov cs:[orgint08].FP.FP_SEG, es
mov cs:[orgint08].FP.FP_OFF, bx
mov dx, offset newint08 ; ds
mov ax, 2508h
int 21h
@@setpit:
mov bx, CLOCK5
mov ax, 0
mov es, ax
test byte ptr es:[BIOS_FLAG], 80h
jz @@skip
mov bx, CLOCK8
@@skip:
cli
mov al, 00110110b
out PIT_MODE, al
jmp $+2
jmp $+2
mov al, bl
out PIT_CNT0, al
jmp $+2
jmp $+2
mov al, bh
out PIT_CNT0, al
@@setpic:
in al, MPIC_IMR
and al, 0feh ; タイマ割り込み許可
out MPIC_OCW1, al
pop es
popf
ret
settimer endp
;■
resettimer proc
pushf
cli
pusha
@@resetpic:
in al, MPIC_IMR
or al, 01h ; タイマ割り込み禁止
out MPIC_OCW1, al
@@resetvector:
mov ax, 2508h
lds dx, cs:[orgint08]
int 21h
popa
popf
ret
resettimer endp
;■
newint08 proc far
push ax
inc cs:count_msec
mov al, 20h ; 割り込み処理終了(EOI)
out MPIC_OCW2, al
pop ax
iret
newint08 endp
;■
printd proc
mov bx, numbuf_end
mov cx, 10
@@loop:
mov dx, 0
div cx
add dl, '0'
dec bx
mov [bx], dl
cmp ax, 0
jne @@loop
mov ah, 40h ; ファイル/デバイスの書き込み
mov dx, bx
mov cx, numbuf_end ; 書き込むバイト数
sub cx, bx
mov bx, STDOUT
int 21h
ret
printd endp
orgint08 dd 0
count_msec dw 0
numbuf db 5 dup (?)
numbuf_end equ $
data dw 478, 50 ; c4
dw 426, 50 ; d4
dw 379, 50 ; e4
dw 358, 50 ; f4
dw 379, 50 ; e4
dw 426, 50 ; d4
dw 478, 50 ; c4
dw 0, 0 ; end
pos dw offset data
next dw 0
end main
}}
playssg.asm
#highlight(asm){{
comment *
MASM32 SDK
ml /c /AT /Fl playssg.asm
link16 /t playssg;
*
.model tiny
FP struc
FP_OFF dw ?
FP_SEG dw ?
FP ends
; Programmable Interrupt Controller / Master
MPIC_OCW1 equ 02h ; Operation Command Word
MPIC_OCW2 equ 00h
MPIC_IMR equ 02h ; Interrupt Mask Reg.
; Programmable Interval Timer
PIT_CNT0 equ 71h ; Counter
PIT_MODE equ 77h ; Mode Reg.
BIOS_FLAG equ 0501h
CLOCK5 equ 24576 ; 5MHz系
CLOCK8 equ 19968 ; 8MHz系
sound macro addr, data
mov al, addr
mov ah, data
call wrtpsg
endm
.code
.186
org 0100h
;■
main proc
mov ax, 2523h
mov dx, offset myint23
int 21h
sound 08h, 0 ; 振幅 A
sound 07h, 0feh ; ミキサー
call settimer
@@loop:
call play
jnc @@loop
call resettimer
@@exit:
mov ax, 4c00h
int 21h
main endp
;■
play proc
mov ax, count_msec
cmp ax, next
jb @@exit0
sound 08h, 0 ; 振幅 A
mov si, pos
cld
lodsw
mov cx, ax
sound 01h, ch ; トーン・ジェネレータ A
sound 00h, cl
lodsw
cmp ax, 0
je @@exit1
mov cx, ax
sound 08h, 12 ; 振幅 A
add next, cx
mov pos, si
@@exit0:
clc
ret
@@exit1:
stc
ret
play endp
;■
wrtpsg proc
mov dx, 188h ; アドレス
out dx, al
mov dx, 18ah ; データ
mov al, ah
out dx, al
ret
wrtpsg endp
;■
myint23 proc far
call resettimer
stc
ret ; retf
myint23 endp
;■
settimer proc
pushf
push es
@@setvector:
mov ax, 3508h
int 21h
mov cs:[orgint08].FP.FP_SEG, es
mov cs:[orgint08].FP.FP_OFF, bx
mov dx, offset newint08 ; ds
mov ax, 2508h
int 21h
@@setpit:
mov bx, CLOCK5
mov ax, 0
mov es, ax
test byte ptr es:[BIOS_FLAG], 80h
jz @@skip
mov bx, CLOCK8
@@skip:
cli
mov al, 00110110b
out PIT_MODE, al
jmp $+2
jmp $+2
mov al, bl
out PIT_CNT0, al
jmp $+2
jmp $+2
mov al, bh
out PIT_CNT0, al
@@setpic:
in al, MPIC_IMR
and al, 0feh ; タイマ割り込み許可
out MPIC_OCW1, al
pop es
popf
ret
settimer endp
;■
resettimer proc
pushf
cli
push ds
push ax
push dx
@@resetpic:
in al, MPIC_IMR
or al, 01h ; タイマ割り込み禁止
out MPIC_OCW1, al
@@resetvector:
mov ax, 2508h
lds dx, cs:[orgint08]
int 21h
pop dx
pop ax
pop ds
popf
ret
resettimer endp
;■
newint08 proc far
push ax
inc cs:count_msec
mov al, 20h ; 割り込み処理終了(EOI)
out MPIC_OCW2, al
pop ax
iret
newint08 endp
orgint08 dd 0
count_msec dw 0
data dw 478, 50 ; c4
dw 426, 50 ; d4
dw 379, 50 ; e4
dw 358, 50 ; f4
dw 379, 50 ; e4
dw 426, 50 ; d4
dw 478, 50 ; c4
dw 0, 0 ; end
pos dw offset data
next dw 0
end main
}}