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.