Hacer sonar el AY desde BASIC
Publicado: Mié, 19 May 2010, 16:04
Esto os va a venir muy bien para los que queráis participar en el concurso de Radastan. Esto que os pongo aquí funciona tanto para BASIC interpretado a pelo, como para BASIC compilado desde un compilador nativo (HiSoft, Colt, MCoder III...) o cruzado (ZX Basic).
Se trata de leer 14 datos y enviarlos al AY mediante una pareja de OUTs. Lo que estamos haciendo es escribir 14 valores en 14 de los 16 registros (los numeroados de 0 a 13) del chip AY. El primer OUT selecciona qué registro vamos a tocar, y el segundo OUT le escribe el valor. Así de fácil.
La versión en Sinclair BASIC es muy sencilla. El programa de ejemplo viene con cinco sonidos de prueba. Jugueteando encontrarás los tuyos:
$this->bbcode_second_pass_code('', '10 INPUT "SFX Number (0-4)?";n
20 RESTORE 1000+10*n: FOR i=0 TO 13: READ a: OUT 65533,i: OUT 49149,a: NEXT i
30 GO TO 10
1000 DATA 100,50,0,0,0,0,4,216,31,0,0,10,10,0
1010 DATA 250,250,0,0,0,0,15,248,31,0,0,10,10,0
1020 DATA 10,10,0,0,0,0,29,216,31,0,0,4,4,0
1030 DATA 10,100,0,0,0,0,15,248,31,0,0,50,50,0
1040 DATA 15,1,0,0,0,0,15,248,31,0,0,50,50,0')
Para la versión en ZX Basic podemos ser un poco más virgueros:
$this->bbcode_second_pass_code('', 'Dim sonidos (4, 13) As Byte => {_
{100,50,0,0,0,0,4,216,31,0,0,10,10,0}, _
{250,250,0,0,0,0,15,248,31,0,0,10,10,0}, _
{10,10,0,0,0,0,29,216,31,0,0,4,4,0}, _
{10,100,0,0,0,0,15,248,31,0,0,50,50,0}, _
{15,1,0,0,0,0,15,248,31,0,0,50,50,0} _
}
Dim n As Byte
Cls
For n = 0 To 4 ' Vamos a tocar 4 pitos
Print "SFX #"; n ' Imprimimos cuál
ayPlaySound (n) ' Tocamos el sonido i
Pause 100 ' Esperamos dos segundos
Next n
Sub ayPlaySound (sonido As Byte)
' Este Sub toca el sonido que se le indica como parámetro
' Los sonidos se definen en la tabla "sonidos", definida
' globalmente.
Dim i As Byte
For i = 0 To 13
Out 65533, i ' Seleccionamos registro AY
Out 49149, sonidos (sonido, i) ' Escribimos un valor en él
Next i
End Sub
')
Los registros del AY son estos:
$this->bbcode_second_pass_code('', 'AY REGISTERS
00 Channel A fine pitch 8-bit (0-255)
01 Channel A course pitch 4-bit (0-15)
02 Channel B fine pitch 8-bit (0-255)
03 Channel B course pitch 4-bit (0-15)
04 Channel C fine pitch 8-bit (0-255)
05 Channel C course pitch 4-bit (0-15)
06 Noise pitch 5-bit (0-31)
07 Mixer 8-bit (see below)
08 Channel A volume 4-bit (0-15, see below)
09 Channel B volume 4-bit (0-15, see below)
10 Channel C volume 4-bit (0-15, see below)
11 Envelope fine duration 8-bit (0-255)
12 Envelope course duration 8-bit (0-255)
13 Envelope shape 4-bit (0-15)
14 I/O port A 8-bit (0-255)
15 I/O port B 8-bit (0-255)
Bit:
7 6 5 4 3 2 1 0
_ _
I/O I/O Noise Noise Noise Tone Tone Tone
B A C B A C B A')
Comentarios, ruegos y preguntas -como siempre- bienvenidos.
Se trata de leer 14 datos y enviarlos al AY mediante una pareja de OUTs. Lo que estamos haciendo es escribir 14 valores en 14 de los 16 registros (los numeroados de 0 a 13) del chip AY. El primer OUT selecciona qué registro vamos a tocar, y el segundo OUT le escribe el valor. Así de fácil.
La versión en Sinclair BASIC es muy sencilla. El programa de ejemplo viene con cinco sonidos de prueba. Jugueteando encontrarás los tuyos:
$this->bbcode_second_pass_code('', '10 INPUT "SFX Number (0-4)?";n
20 RESTORE 1000+10*n: FOR i=0 TO 13: READ a: OUT 65533,i: OUT 49149,a: NEXT i
30 GO TO 10
1000 DATA 100,50,0,0,0,0,4,216,31,0,0,10,10,0
1010 DATA 250,250,0,0,0,0,15,248,31,0,0,10,10,0
1020 DATA 10,10,0,0,0,0,29,216,31,0,0,4,4,0
1030 DATA 10,100,0,0,0,0,15,248,31,0,0,50,50,0
1040 DATA 15,1,0,0,0,0,15,248,31,0,0,50,50,0')
Para la versión en ZX Basic podemos ser un poco más virgueros:
$this->bbcode_second_pass_code('', 'Dim sonidos (4, 13) As Byte => {_
{100,50,0,0,0,0,4,216,31,0,0,10,10,0}, _
{250,250,0,0,0,0,15,248,31,0,0,10,10,0}, _
{10,10,0,0,0,0,29,216,31,0,0,4,4,0}, _
{10,100,0,0,0,0,15,248,31,0,0,50,50,0}, _
{15,1,0,0,0,0,15,248,31,0,0,50,50,0} _
}
Dim n As Byte
Cls
For n = 0 To 4 ' Vamos a tocar 4 pitos
Print "SFX #"; n ' Imprimimos cuál
ayPlaySound (n) ' Tocamos el sonido i
Pause 100 ' Esperamos dos segundos
Next n
Sub ayPlaySound (sonido As Byte)
' Este Sub toca el sonido que se le indica como parámetro
' Los sonidos se definen en la tabla "sonidos", definida
' globalmente.
Dim i As Byte
For i = 0 To 13
Out 65533, i ' Seleccionamos registro AY
Out 49149, sonidos (sonido, i) ' Escribimos un valor en él
Next i
End Sub
')
Los registros del AY son estos:
$this->bbcode_second_pass_code('', 'AY REGISTERS
00 Channel A fine pitch 8-bit (0-255)
01 Channel A course pitch 4-bit (0-15)
02 Channel B fine pitch 8-bit (0-255)
03 Channel B course pitch 4-bit (0-15)
04 Channel C fine pitch 8-bit (0-255)
05 Channel C course pitch 4-bit (0-15)
06 Noise pitch 5-bit (0-31)
07 Mixer 8-bit (see below)
08 Channel A volume 4-bit (0-15, see below)
09 Channel B volume 4-bit (0-15, see below)
10 Channel C volume 4-bit (0-15, see below)
11 Envelope fine duration 8-bit (0-255)
12 Envelope course duration 8-bit (0-255)
13 Envelope shape 4-bit (0-15)
14 I/O port A 8-bit (0-255)
15 I/O port B 8-bit (0-255)
Bit:
7 6 5 4 3 2 1 0
_ _
I/O I/O Noise Noise Noise Tone Tone Tone
B A C B A C B A')
Comentarios, ruegos y preguntas -como siempre- bienvenidos.