;**********************************************************************; ;* 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 : 22-3-1993 *; ;*--------------------------------------------------------------------*; ;* 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 push ds ;eerst type pc opvragen mov ax,0F000h push ax pop ds CMP BYTE PTR DS:0FFFEh,0FCh pop ds jmp play_t2 xor dh,dh push bx mov bx,dx mov ax,40000 mul bx mov cx,dx ; high word in dx zetten mov dx,ax ; low word in cx zetten pop bx xor bh,bh ;BH voor adressering notentabel = 0 or bx,bx jz play_t1 shl bx,1 ;nummer noot verdubbelen (woordentabel) mov ax,[noten+bx] ;nootwaarde halen mov bx,ax play_t1: jmp wacht_6a ;ga zingen 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 ;-- timer-interrupt op eigen routine richten ------------------ push dx ;DX en BX naar stack push bx mov ax,351ch ;adres timer-interrupt halen int 21h ;DOS-interrupt oproepen mov time_oud,bx ;offsetadres oude interrupt mov time_oud+2,es ;en segmentadres mov dx,offset sound_ti ;offsetadres nieuwe timer-routine mov ax,251ch ;nieuwe timer-routine zetten int 21h ;DOS-interrupt oproepen pop bx ;BX en DX weer van stack halen pop dx mov s_eind,1 ;noot moet nog worden gespeeld mov s_teller,dl ;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 play: cmp s_eind,0 ;noot klaar? jne play ;NEE --> wachten in al,61h ;luidspreker-stuurbit inlezen and al,11111100b ;twee laagste bits wissen out 61h,al ;luidspreker uit ;-- oude timer-interrupt weer activeren -------------------- mov cx,ds ;DS mov ax,251ch ;fct.nr.: interrupt-vector zetten lds dx,dword ptr time_oud ;oud adres naar DS:DX int 21h ;DOS-interrupt oproepen mov ds,cx ;DS terughalen play_end: pop bx ;BX en DX weer van stack halen pop dx ret play_tune endp ;-- nieuwe timer-interrupt --------------------------------------------- sound_ti proc far ;wordt 18x per sec. opgeroepen dec cs:s_teller ;tijdteller verlagen jne st_eind ;als nog niet 0, dan einde mov cs:s_eind,0 ;duur noot is voorbij st_eind: jmp dword ptr cs:[time_oud] ;naar de oude timer-interrupt sound_ti endp ;== variabelen voor de vier routines =================================== time_oud dw (?),(?) ;adres oude timer-interrupt s_teller db (?) ;nog resterende duur noot in ;18e seconden s_eind db 0 ;geeft aan of noot al is gespeeld 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 call play_tune endm ;== einde ==============================================================