Présentation du système sonore
Le ZX Spectrum propose deux options sonores : un beep 1-bit sous contrôle logiciel et un circuit synthétiseur General Instrument AY-3-8910, présent dans les modèles 128K et supérieurs, ou disponible en périphérique pour les modèles 16K et 48K.
Fonctionnement du beeper
Le beeper 1-bit est similaire à celui de l'Apple II. Les tons spécifiques sont produits en contrôlant les intervalles entre les changements d'état du bit. La commande BEEP en BASIC gère cela en utilisant une routine générique qui peut être utilisée directement. Cette routine se trouve à l'adresse $03B5 et utilise les registres HL et DE pour spécifier le temps de retard et la durée de la note.
org $7000
ld b,8 ; Play 8 notes
ld hl,scale ; Load from pointer
loop: push bc
ld c,(hl) ; Load frequency into BC
inc hl
ld b,(hl)
inc hl
ld e,(hl) ; Load duration into HL
inc hl
ld d,(hl)
inc hl
push hl ; Stash pointer...
ld h,b ; ... Copy BC to HL...
ld l,c
call $03b5 ; ... and let the ROM do the rest
pop hl
pop bc
djnz loop
ret
scale: dw $066a,$0082,$05b3,$0092,$0511,$00a4,$04c6,$00ae
dw $043d,$00c3,$03c4,$00dc,$0357,$00f6,$0325,$0105
Utilisation directe du beeper
La routine BIOS est suffisamment efficace, mais il est possible de créer une fonction d'oscillateur personnalisée en utilisant un principe différent. L'idée de base est d'ajouter le code de fréquence à un compteur et de basculer le haut-parleur chaque fois que le compteur déborde.
sound: ld hl,0 ; Counter starts at 0
ld a,($5c48) ; BORDCR
and $38 ; Extract border color
rrca ; and shift to low 3 bits
rrca
rrca
or $08 ; Disable tape audio
di ; Don't get interrupted by IRQ
push af
.loop: pop af
add hl,de ; Add frequency to counter
jr nc,1F ; If it overflows...
xor $10 ; ... toggle speaker output
out ($fe),a
1 dec bc ; Decrement timer
push af ; Check for 0. Can't pop AF
ld a,b ; until after the branch or
or c ; we lose the Z flag value!
jr nz,.loop
pop af ; Clean up
ei
ret
Implications techniques
Le système sonore du ZX Spectrum présente des caractéristiques intéressantes, notamment la possibilité d'utiliser un beeper 1-bit ou un circuit synthétiseur. La commande BEEP en BASIC offre une façon simple de gérer les sons, mais il est également possible de créer des fonctions d'oscillateur personnalisées en utilisant des principes différents.