;**********************************************************************; ;* 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 ==============================================================