Pour le moment la boucle principale que j'ai trouvée et qui joue 4 notes simples sur le buzzer est du style:
Code:
; joue un pattern
PLAYPTN
PSHS D,X,Y,U
STS <SAV
LDS #$E7C0
LDD ,S
TFR D,X
EORB #8
TFR D,U
LDY #duree ; <-- auto-modifié par le pattern
LOOP
; oscillo 1
LDD #0 ; 3
ADD #freq1 ; 4 (auto modifié par le pattern)
STD <*-5 ; 5
CMPA #rap1 ; 2 (rapport cyclique, auto modifié)
BCC L10 ; 3
STX ,S ; 5 (buzzer 0)
BRA L11 ; 3
L1O STU ,S ; 5 (buzzer 1)
BRA L11 ; 3
L11 SET * ; => 3+4+5+2+3+5+3=25 cycles
; oscillo 2
LDD #0 ; 3
ADD #freq2 ; 4 (auto modifié par le pattern)
STD <*-5 ; 5
CMPA #rap2 ; 2 (rapport cyclique, auto modifié)
BCC L20 ; 3
STX ,S ; 5 (buzzer 0)
BRA L21 ; 3
L2O STU ,S ; 5 (buzzer 1)
BRA L21 ; 3
L21 SET * ; => 3+4+5+2+3+5+3=25 cycles
; oscillo 3
LDD #0 ; 3
ADD #freq3 ; 4 (auto modifié par le pattern)
STD <*-5 ; 5
CMPA #rap3 ; 2 (rapport cyclique, auto modifié)
BCC L30 ; 3
STX ,S ; 5 (buzzer 0)
BRA L31 ; 3
L3O STU ,S ; 5 (buzzer 1)
BRA L31 ; 3
L31 SET * ; => 3+4+5+2+3+5+3=25 cycles
; oscillo 4
LDD #0 ; 3
ADD #freq4 ; 4 (auto modifié par le pattern)
STD <*-5 ; 5
CMPA #rap4 ; 2 (rapport cyclique, auto modifié)
BCC L40 ; 3
STX ,S ; 5 (buzzer 0)
BRA L41 ; 3
L4O STU ,S ; 5 (buzzer 1)
BRA L41 ; 3
L41 SET * ; => 3+4+5+2+3+5+3=25 cycles
LEAY -1,Y ; 4
BNE LOOP ; 3 => un tour = 107µs (56µs sur Zx)
LDS #0
SAV EQU *-2
PULS D,X,Y,U,PC
La structure avec deux "BRA" dans un même chemin d'exécution peut paraitre sub-optimale. C'est vrai, mais c'est nécessaire pour avoir une exécution en temps constant entre les chemins où l'on sort le buzzer à 1 et ceux où on le sort à 0.
On est sensiblement 50% plus lent que le ZX. La note la plus elevée que l'on peut jouer avec cette routine est de période 214µs, soit 4.6khz ce qui correspond au Ré de l'octave 7. C'est pas mal et ca devrait permettre de jouer les notes jusqu'à l'octave 5 (la plus haute du piano?) de façon suffisamment précise (4 pour 1).
Ce player est intéressant ca il dépasse ce que j'avais fait jusqu'à présent:
- 2x plus de voix
- des instruments sont dispo via le rapport cyclique modifiable pour chaque voix
- il n'utilise que le buzzer 1 bit