Básicamente, la forma de tocar un sample no es totalmente correcta.
Primero conviene leer el estado inicial del BYTE completo ($AA) y no modificarlo completamente al cambiar el BIT 7. Hay que modificar sólo el BIT 7 y no el resto de los BITS.
De modo que antes de nada lees el BYTE, tal y como está en tu ordenador, para luego sólo cambiar el BIT 7; el que corresponde al PPI.
in a,($aa)
and $7f
out ($aa),a
nop
nop
A continuación guardas ese BYTE rotado una vez hacia la izquierda, ya que el SNIPPET de Edu insertará el BIT 7 rotando todo el BYTE hacia la derecha. Tú debes rotar el BYTE guardado (que ya está rotado hacia la izquierda) hacia la derecha, de modo que tendrás el BYTE original de tu ordenador y habrás insertado el nuevo BIT 7.
in a,($aa)
rla
ld (BEEPMASK),a
Al final, tan sólo te hace falta insertar una línea de código antes de enviar el BYTE a $AA. Te escribo ese trozo de código únicamente:
; Extract bit
rlca ;(5)
ld e,a ;(5)
; Convert to PPI format
ld a,(BEEPMASK) ;(14) copia del puerto ($aa) rotado un bit a izquierda
rra ;(5)
; Output to PPI
out ($AA),a ;(12)
ld a,e ;(5)
No sé si te ha quedado muy claro... Incluso yo me equivoqué en el SNIPPET para tocar música 1-BIT que está aquí, en el foro. Escribí "and $ef" en vez de "and $7f"...
Y corregí el SNIPPET, pero poco después se cayó el foro y se perdió la actualización que hice...
Pero lo que siempre hay que hacer, al principio de tu programa y antes de modificar nada, es lo que te he escrito antes. Repito:
in a,($aa)
and $7f
out ($aa),a
nop
nop
in a,($aa)
rla
ld (BEEPMASK),a
Y a la hora de mandar el BYTE a $AA, hazlo siempre con la copia que has guardado en la variable BEEPMASK (que nombre tan original se me ocurrió, verdad?), que debe estar en RAM, claro. Tal y como te he escrito arriba. La rutina será 13 T-STATES (+1 si estás en IM1) más larga, por lo que deberías quitar 3 NOPs de espera.
Si no te ha quedado muy claro, me lo dices y te lo intento explicar más detalladamente.