terug.gif
;**********************************************************************;
;* S O U N D A *;
;*--------------------------------------------------------------------*;
;* doel : genereert geluid van tussen de octaven *;
;* 1 en 11 met behulp van een universele *;
;* routine voor geluidsopwekking *;
;*--------------------------------------------------------------------*;
;* auteur : Roland Leurs *;
;* ontwikkeld : 22-3-1993 *;
;* laatste update : 07-7-1997 *;
;*--------------------------------------------------------------------*;
;* assembleren : in hoofdprogramma source: *;
;* INCLUDE "SOUND.INC" *;
;**********************************************************************;
;-- PLAY_TUNE: ‚‚n noot spelen ---------------------------------------
;-- invoer : BL = nummer van de noot t.o.v. C van het 1e octaaf
;-- DL = duur noot in 18e seconden
;-- uitvoer : geen
;-- registers: AX, CX, ES en FLAGS worden veranderd
;-- opm : pas nadat de noot helemaal is gespeeld, wordt de besturing
;-- teruggegeven aan de oproepende routine
play_tune proc near
play_t2: push dx ;DX en BX naar de stack
push bx
or dx,dx ; test op duur = 0
je play_end ; geen toon opwekken met duur 0
mov temp,dx ;duur noot opslaan
mov al,182 ;opwekking toon voorbereiden
out 43h,al ;waarde naar timer-command-register
or bx,bx ;test op toonhoogte 0
jz play
xor bh,bh ;BH voor adressering notentabel = 0
shl bx,1 ;nummer noot verdubbelen (woordentabel)
mov ax,[noten+bx] ;nootwaarde halen
out 42h,al ;lo-byte naar timer-counter-register
mov al,ah ;hi-byte naar AL
out 42h,al ;en ook naar timer-counter-register
in al,61h ;luidspreker-stuurbit inlezen
or al,11b ;twee laagste bits schakelen luidspr. in
out 61h,al ;luidspreker aan
; vanaf terminal programma 4.00 wordt gebruik gemaakt van de software
; timer ipv de hardware timer. Dit voorkomt een hangend systeem indien
; de routine re-entrant wordt aangeroepen (bijv. tijdens een atom-reset).
play: mov ah,00 ;vraag timerwaarde op
int 1Ah
mov bx,dx ;bewaar uitkomst in bx
play1: mov ah,00 ;vraag timerwaarde opnieuw op
int 1Ah
cmp dx,bx ;1/18e seconde voorbij?
je play1 ;NEE --> wachten
dec temp ;verlaag toonduur
cmp temp,0 ;einde duur bereikt?
jne play ;NEE -> volgende wachtperiode
in al,61h ;luidspreker-stuurbit inlezen
and al,11111100b ;twee laagste bits wissen
out 61h,al ;luidspreker uit
play_end: pop bx ;BX en DX weer van stack halen
pop dx
ret
play_tune endp
;== hardware timer instellingen voor de nootjes =============================
noten dw 36484,34436,32504,30680 ; nootwaarden octaaf 1
dw 28956,27332,25796,24348
dw 22984,21692,20476,19324
dw 18242,17218,16252,15340 ; nootwaarden octaaf 2
dw 14478,13666,12898,12174
dw 11492,10846,10238,9662
dw 9121,8609,8126,7670 ;nootwaarden octaaf 3
dw 7239,6833,6449,6087
dw 5746,5423,5119,4831
dw 4560,4304,4063,3834 ;nootwaarden octaaf 4
dw 3619,3416,3224,3043
dw 2873,2711,2559,2415
dw 2280,2152,2031,1917 ;nootwaarden octaaf 5
dw 1809,1715,1612,1521
dw 1436,1355,1292,1207
dw 1140,1076,1016, 959 ;nootwaarden octaaf 6
dw 905, 858, 806, 761
dw 732, 678, 646, 604
dw 570, 538, 508, 480 ;nootwaarden octaaf 7
dw 452, 429, 403, 380
dw 366, 339, 323, 302
dw 285, 269, 254, 240 ;nootwaarden octaaf 8
dw 226, 215, 202, 190
dw 183, 169, 161, 151
dw 143, 135, 127, 120 ;nootwaarden octaaf 9
dw 113, 107, 101, 95
dw 91, 85, 80, 75
dw 71, 67, 62, 60 ;nootwaarden octaaf 10
dw 56, 53, 50, 48
dw 45, 42, 40, 36
dw 35, 34, 31, 30 ;nootwaarden octaaf 11
dw 28, 27, 25, 24
sound macro toon,duur
mov bl,toon
mov dl,duur
xor dh,dh
call play_tune
endm
;== einde ==============================================================
terug.gif