Evalúa la duración ($A93F - $A948)Pequeña rutina para chequear la coma, si comienzas en $A93F
y desde $A942 evalua la una expresión de 1-255 y retornarla en ACC-B
La duración no puede ser cero(0), solamente de 1 a 255. fuera de este rango da FC= Illegal function call o llamada ilegal a función
Código: Seleccionar todo
1336 A93F BD B2 6D LA93F JSR LB26D SYNTAX CHECK FOR A COMMA
1337 A942 BD B7 0B LA942 JSR LB70B EVALUATE EXPRESSION, RETURN VALUE IN ACCB, FC ERROR IF >255
1338 A945 5D TSTB SET FLAGS
1339 A946 26 3C BNE LA984 RETURN IF NON ZERO
1340 A948 7E B4 4A LA948 JMP LB44A ‘ILLEGAL FUNCTION CALL’ IF ZERO
SOUND ($A94B - $A973)Procesa el comando SOUND
La evaluación de la frecuencia es de 1-255 y la de la duración tambien y ambas lo retornan en Acc-B, por eso usan la misma rutina anterior
Utiliza una onda casi cuadrada de 2.5V, 5V, 2.5V, 0V, almacenando en el D/A los valores 7E,FE,7E,2, algo como ____------TTTTT-----_____
Y espera a que las interrupciones terminen la duración del sonido.
Lo que no entiendo, es que, si termina el sonido por interrupciones, porque no cambia de voltaje tambien por interrupciones y así podría dejar libre el equipo para hacer otra cosa a la vez.Otra cosa que me molesta es porque no usan el tiempo para hacer varias formas de onda, ya que no cuesta nada, obviamente, no hay espacio.
Mejora: Se pueden poner 2 versiones, una como esta y otra por interrupciones, que deje libre el equipo.
* Usar un parámetro mas para, por ejemplo: 64 valores en un string con la forma de onda, con algunas formas de onda en constantes de string, como por ejemplo:
SIN$=64 valores según Seno. ~~~~~~~~~~~~, Para obtener la máxima frecuencia (255) solo toma 4 valores, bajando la frecuencia a 254 puede tomar 8 valores, 253 para 16 valores, 252 para 32 valores y 251 para 64 valores, o sea que 251 seria la máxima frecuencia para apreciar los 64 valores y niveles.Para el casete ya hay una data senosoidal que se podría usar
SQUARE$=0v,5v,0v,5v (se necesitan mínimo 4 valores ya que la duración es *4 y para que coloque todos los valores, claro, se puede repetir automáticamente. |_|T|_|
TRIAN$=Onda triangular. /\/\/\/\/\/\/\/\
SIERRA$=Onda diente de sierra, derecha o izquierda algo como /|/|/|/| o |\|\|\|\|\|\
Estos valores deben tener el BIT 0 apagado y habría que forzarlo
* Otro parámetro que se puede implementar es el Volumen, esto es fácil, simplemente bajar los máximos a menos de 5V o, lo que es lo mismo, que las formas de onda no lleguen al máximo. incluso podrían auto modificar los valores pasados.
* Podría contemplarse el uso del Orchestra 90 ya que es solo un D/A doble (esterero) de 8 bit en lugar de 6, o sea que puede usarse inclusive las mismas formas de onda
* Otros sistemas de audio.
* Envelope, o forma de envoltorio, esto se refiere a como se modifica el volumen con respecto al tiempo,y tiene un tiempo de Ataque(Atack), Drenaje (Drain), Sustancia(Sustain), Drenaje 2(Drain2) y Relajación(Release).
Código: Seleccionar todo
1342 * SOUND
1343 A94B 8D F5 SOUND BSR LA942 EVALUATE EXPRESSION FREQUENCY, (de 1-255 y retorna en B)
1344 A94D D7 8C STB SNDTON SAVE IT
1345 A94F 8D EE BSR LA93F EVALUATE EXPRESSION SOUND LENGTH
1346 A951 86 04 LDA #4 CONSTANT FACTOR
1347 A953 3D MUL EXPAND LENGTH EXPRESSION
1348 A954 DD 8D STD SNDDUR SAVE LENGTH OF SOUND, (Duración desde 4-1024 de 4 en 4)
1349 A956 B6 FF 03 LDA PIA0+3 GET CONTROL REGISTER OF PIA0, PORT B
1350 A959 8A 01 ORA #1 *
1351 A95B B7 FF 03 STA PIA0+3 * ENABLE 60 HZ INTERRUPT (PIA0 IRQ)
1352 A95E 0F 08 CLR ARYDIS CLEAR THE ARRAY DISABLE FLAG - FOR NO APPARENT REASON
1353 A960 8D 40 BSR LA9A2 CONNECT D/A SOUND INPUT TO OUTPUT OF SOUND MUX
1354 A962 8D 12 BSR LA976 TURN ON AUDIO - ENABLE SOUND MUX
1355 A964 8D 1F LA964 BSR LA985 STORE 2.5 VOLTS TO D/A AND WAIT
1356 A966 86 FE LDA #$FE DATA TO MAKE D/A OUT = 5 VOLTS
1357 A968 8D 1D BSR LA987 STORE IT TO D/A AND WAIT
1358 A96A 8D 19 BSR LA985 STORE 2.5 VOLTS TO D/A AND WAIT
1359 A96C 86 02 LDA #2 DATA TO MAKE D/A OUT = 0 VOLTS
1360 A96E 8D 17 BSR LA987 STORE IT TO D/A AND WAIT
1361 A970 9E 8D LDX SNDDUR * IS SNDDUR = 0? - THE IRQ INTERRUPT SERVICING
1362 * * ROUTINE WILL DECREMENT SNDDUR
1363 A972 26 F0 BNE LA964 NOT DONE YET
ACTIVA O DESACTIVA EL MULTIPLEXOR ANALOGICO ($A974 - $A984)Código: Seleccionar todo
1365 * THESE ROUTINES WILL ENABLE/DISABLE THE ANALOG MUX
1366 A974 4F LA974 CLRA BIT 3 OF ACCA = 0, DISABLE ANALOG MUX
1367 A975 8C FCB SKP2 SKIP TWO BYTES
1368 A976 86 08 LA976 LDA #8 BIT 3 OF ACCA = 1, ENABLE ANALOG MUX
1369 A978 A7 E2 STA ,-S SAVE ACCA ON STACK
1370 A97A B6 FF 23 LDA PIA1+3 GET CONTROL REGISTER OF PIA1, PORT B
1371 A97D 84 F7 ANDA #$F7 RESET BIT 3
1372 A97F AA E0 ORA ,S+ OR IN BIT 3 OF ACCA (SAVED ON STACK)
1373 A981 B7 FF 23 STA PIA1+3 SET/RESET CB2 OF U4
1374 A984 39 LA984 RTS
COLOCA EL VALOR DE ACCA EN EL D/A Y ESPERA($A985 - $A98F)Desde $A985 coloca $7F, en ACCA, para la mitad del voltaje 2.5V en el conversor D/A
Desde $A987 coloca ACCA en el conversor D/A
Y desde A98A Loop de tiempo perdido hasta que termina el tiempo según la frecuencia, si esta frecuencia es alta, el contador empieza en ese número y aumenta hasta pasar 255 y en cero para, por eso en las altas frecuencias termina mas rápido.
Código: Seleccionar todo
1375 A985 86 7E LA985 LDA #$7E DATA VALUE TO MAKE D/A OUTPUT = 2.5 VOLTS
1376 A987 B7 FF 20 LA987 STA DA STORE IT IN D/A
1377 A98A 96 8C LDA SNDTON GET FREQUENCY
1378 A98C 4C LA98C INCA INCREMENT IT
1379 A98D 26 FD BNE LA98C LOOP UNTIL DONE
1380 A98F 39 RTS
AUDIO ($A990 - $A9A2)Simplemente enciende o apaga la salida de audio
Puede mejorarse para que funcione tambien con orchestra 90 y otras salidas de audio.
Código: Seleccionar todo
1382 * AUDIO
1383 A990 1F 89 AUDIO TFR A,B SAVE ON/OFF TOKEN IN ACCB
1384 A992 9D 9F JSR GETNCH MOVE BASIC POINTER TO NEXT CHARACTER
1385 A994 C1 AA CMPB #$AA ‘OFF’ TOKEN?
1386 A996 27 DC BEQ LA974 YES - TURN OFF ANALOG MUX
1387 A998 C0 88 SUBB #$88 ‘ON’ TOKEN
1388 A99A BD A5 C9 JSR LA5C9 SYNTAX ERROR IF NOT ‘OFF’ OR ‘ON’
1389 A99D 5C INCB NOW ACCB = 1
1390 A99E 8D 02 BSR LA9A2 ROUTE CASSETTE TO SOUND MULTIPLEXER
1391 A9A0 20 D4 BRA LA976 ENABLE SOUND MULTIPLEXER
SELECTOR DEL MULTIPLEXOR ANALOGICO (A9A2 - A9B2)RUTINA PARA TRANSFERIR EL BIT 0 DE ACCB A SEL 1 DEL MULTIPLEXOR ANALOGICO Y EL BIT 1 DE ACCB AL SEL 2.
Código: Seleccionar todo
1393 * THIS ROUTINE WILL TRANSFER BIT 0 OF ACCB TO SEL 1 OF
1394 * THE ANALOG MULTIPLEXER AND BIT 1 OF ACCB TO SEL 2.
1395 A9A2 CE FF 01 LA9A2 LDU #PIA0+1 POINT U TO PIA0 CONTROL REG
1396 A9A5 8D 00 BSR LA9A7 PROGRAM 1ST CONTROL REGISTER
1397 A9A7 A6 C4 LA9A7 LDA ,U GET PIA CONTROL REGISTER
1398 A9A9 84 F7 ANDA #$F7 RESET CA2 (CB2) OUTPUT BIT
1399 A9AB 57 ASRB SHIFT ACCB BIT 0 TO CARRY FLAG
1400 A9AC 24 02 BCC LA9B0 BRANCH IF CARRY = ZERO
1401 A9AE 8A 08 ORA #$08 FORCE BIT 3=1; SET CA2(CB2)
1402 A9B0 A7 C1 LA9B0 STA ,U++ PUT IT BACK IN THE PIA CONTROL REGISTER
1403 A9B2 39 RTS
IRQ SERVICE ($A9B3 - $A9C5)Esta es la rutina de interrupción usada para terminar la duración del sonido
Código: Seleccionar todo
1405 * IRQ SERVICE
1406 A9B3 B6 FF 03 BIRQSV LDA PIA0+3 CHECK FOR 60HZ INTERRUPT
1407 A9B6 2A 0D BPL LA9C5 RETURN IF 63.5 MICROSECOND INTERRUPT
1408 A9B8 B6 FF 02 LDA PIA0+2 RESET PIA0, PORT B INTERRUPT FLAG
1409 A9BB BE 00 8D LDX >SNDDUR GET INTERRUPT TIMER (SOUND COMMAND)
1410 A9BE 27 05 BEQ LA9C5 RETURN IF TIMER = 0
1411 A9C0 30 1F LEAX -1,X DECREMENT TIMER IF NOT = 0
1412 A9C2 BF 00 8D STX >SNDDUR SAVE NEW TIMER VALUE
1413 A9C5 3B LA9C5 RTI RETURN FROM INTERRUPT