DAMASO D. ESTEVEZ Continuación de Amoric (v1.4a) (2/3) 08. El sonido ~~~~~~~~~ He implementado yo mismo un módulo de emulación del chip AY-3-8912; sé que no es perfecto, pero es obra MIA ;-): no se trata de ninguna adaptación de otro(s) programa(s) ya existente(s) (que conste que no estoy criticando a los que prefieren utilizarlos en sus desarrollos... sencillamente tenía necesidad de programarlo yo mismo, a pesar de que pueda ser menos fiel que otros). Esta es la razón por la que aún no es perfecto. Desde la versión 0.9 realmente no ha evolucionado, salvo en la reserva de canales de audio: si está escuchando un módulo con 'DeliTracker' y ejecuta 'Amoric', el sonido en la emulación no estará disponible al no poder reservarse los canales de audio; por contra, si usted ejecuta 'Amoric' antes de 'DeliTracker', éste último no podrá reproducir el módulo ya que 'Amoric' habrá reservado para sí los canales. A pesar de lo indicado, la emulación de sonido aún se realiza accediendo de forma directa a los chips a medida del Amiga y no a través del dispositivo 'audio.device': muchos programas de sonido funcionan de esta manera y parece no haber ningún problema. Los ruidos aún no están implementados en la emulación, y aún aparecen a veces sonidos indeseables con algunos programas (ZORGONS). Para suprimirlos, pulse dos veces tecla F6 (desconectar sonido y volver a conectarlo). ============================================================================== 9. Teclado ~~~~~~~ Hay un único mapa de teclado (distribución de las teclas fija), que no depende del definido por el usuario a través de las Preferencias del WorkBench pues se utilizan los códigos RAWKEY para interpretarlas (coincide con la distribución del teclado USA)... esto significa que algunas teclas estarán intercambiadas en el teclado francés (A y Q, M y ;...). Además, hay algunas teclas suplementarias que son utilizadas para controlar ciertos aspectos del emulador: * F1 obliga al emulador a saltar a la rutina NMI --interrupción no enmascarable-- del Oric (el botón negro inalcanzable que estaba bajo el ordenador), * F2 actualiza/refresca completamente la pantalla (útil si hay algún error en el refresco de los modos 'TEXT'/'HIRES'...), * F3 le permite elegir/cambiar la actual cinta de cassette virtual, * F4 permite reconfigurar el emulador sin tener que abandonarlo y volver a ejecutarlo nuevamente, * F5 tiene el mismo efecto que apagar y volver a encender el Oric, * F6 (des)conecta el sonido de la emulación, * F7 rebobina la cinta de cassette virtual, * F8 permite memorizar el estado actual del Oric (memoria, registros...) en un área temporal de memoria: esta opción sólo funciona si al arrancar el emulador éste ha podido reservar la memoria necesaria, * F9 permite recuperar un estado anterior del Oric previamente guardado con la tecla F8, y sólo funciona si se ha pulsado F8 al menos una vez durante la emulación, * F10 le hace retornar al Workbench deteniendo la emulación y abandonando el programa, * la tecla 'Help' muestra una pantalla de ayuda recordándole las teclas que acabamos de mencionar, y además: * la tecla 'FUNCT' del Oric Atmos es emulada por 'AltDcha', * la tecla 'Del' funciona de igual forma que '<-' ('Backspace'), * el teclado numérico separado puede emplearse sin ningún incoveniente, lo mismo que la tecla 'ENTER' en lugar de 'RETURN' (<-| o INTRO), * Caps Lock (retención de mayúsculas) tiene el mismo efecto que CTRL+T en el intérprete de comandos. * Las teclas NumL (bloqueo del teclado numérico ) y ScrL (bloqueo del desplazamiento) situadas ambas en el teclado numérico permiten incrementar/decrementar la frecuencia de refresco de la visualización durante la emulación: puede ser útil con algunos juegos. * PrtSc (volcar pantalla) le permite capturar la visualización actual de 'AmOric' y guardarla en formato IFF-ILBM. Si elige los colores del Oric para el Workbench, podrá elaborar un mosaico con las imágenes capturadas como fondo :-) (yo, personalmente, prefiero la paleta de MagicWB). Nota: Con algunos juegos, por ejemplo "Zorgon's Revenge", las teclas de desplazamiento que usan pueden parecer ilógicas o extrañas: es debido a que la posición de algunas teclas en el Oric no es la misma que en el Amiga. Lo siento muchísimo, pero ¡así es la vida!. Defina las teclas adecuadamente para el joystick programable y juegue con éste. ============================================================================== 10. Sugerencias ~~~~~~~~~~~ - Para mejorar la velocidad, active los cachés y el modo burst del procesador (a partir de 68030+), lo mismo que el modo copyback (con 68040). No empleo las transferencias DMA ni código automodificable para que el caché de dispositivos funcione. Puede redireccionar la tabla de vectores de interrupciones (VBR) a memoria Fast, con herramientas como TUDE de N.O.M.A.D., o SystemPrefs, para mejorar la velocidad en el tratamiento de éstas. - Como no tengo en cuenta los temporizadores del Oric (no los del Amiga) podría tener algún problema en la reacción del teclado en equipos lentos como el A1200 básico (el problema aparece si la tecla se liberase antes de que la rutina ROM del Oric la compruebe, perdiéndose algunas pulsaciones). La solución es mantener pulsada las teclas un tiempo mayor. - No promocione la pantalla del Oric con NewMode: utilice el propio emulador para elegir el modo de pantalla. El uso de Newmode puede producir bloqueos en algunos casos. - Si dispone de un monitor multisync, puede emplear un modo de pantalla como el DoblePAL en baja resolución. Se mejorará el refresco de pantalla y como efecto secundario (aunque parezca extraño) el sonido mejorará en los tonos agudos, debido a un acoplamiento entre el audio y el video DMA. - Con el fin de no dejar ficheros abiertos en modo escritura demasiado tiempo, cuando vea que el Oric ha terminado dicha operación de escritura, pulse simplemente una de las teclas de función (incluso la tecla HELP): ésto cerrará el fichero (pero no lo haga mientras esté guardando datos, ya que esto detendrá el magnetofón... virtual). - No elija como teclas de activación para sus comodidades, una secuencia como Ctrl+T o Ctrl+C. 'Amoric' no recibiría estos códigos y no podría usted disponer de las funciones Break (detener el programa) o CAPS ON/OFF (activar/desactivar mayúsculas). 11. Importando programas desde cinta ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ESTA es una parte COMPLEJA: ¿cómo recuperar programas que originalmente se encuentran almacenados en cintas (cassettes) de audio? * En el Oric, el 6522 y la ROM se ocupan de enviar y recibir ese chirriante sonido (señal de 2.400 baudios). Esta maldita señal es el medio más fácil de interconectar los ordenadores de hoy y el Oric (leer los microdiscos del Oric es demasiado complejo de emular para mi, no entra en mis planes y además no tengo ni una Jasmin ni una unidad de Microdiscos). Aunque no tengo nigún conocimiento de electrónica, lo que sí es obvio es que los discos del Oric originalmente son de 3" (aunque también se le pudiera conectar unidades de 3½") y no hay forma humanamente posible para que sean leidos por la unidades de discos de un Amiga o de un PC (3½" o 5¼"). Además tampoco hay demasiada documentación sobre su formato: las unidades de C64 están mejor documentadas y por ello se ha desarrollado gran cantidad de interfaces para el Amiga (paquete A64,...). * Creo que el Oric posee una interface RS-232, pero no me voy a romper la cabeza programando un protocolo de transferencia Amiga-Oric: sería el método de transferir los datos más seguro, aunque tendría que llevar su Oric a todas partes (y no me parece muy conveniente). * Boris y yo, buscamos y hemos encontrado una solución mejor (nos concentramos en la grabación de cintas de audio): en cualquier ordenador, es fácil digitalizar/muestrear sonidos si dispone de suficiente memoria y/o espacio en el disco duro (para est operación los necesitará). En primer lugar, tiene que muestrear sus cintas de cassette a frecuencia elevada (22050 KHz al menos) en formato .lo8 (sin cabecera, 8 bits sin signo: rango de 0 a 255). Después de esto utilice el programa 'Transf', escrito por Boris GRANVEAUD e incluido en este paquete (el programa no tiene una interfaz demasiado elaborada ya que ha sido portado directamente desde UNIX y seguramente no será utilizado muy a menudo): su sintaxis es... > transf fichero.lo8 GAME.DAT La frecuencia de muestreo le será pedida por el programa, mostrando a continuación el programa información sobre el fichero, como su nombre y longitud, y procediendo a leer los datos. Debido a una diferencia en la temporización entre el Oric-1 y el Atmos, antes de leer los datos el programa salta algunos bytes en el fichero (tiempo en el que el Atmos muestra 'Saving... GAME OF THE DEATH C', mientras que el Oric-1 muestra simplemente el mensaje 'Saving...'). Si se produce un error, intente la transferencia de la forma siguiente: > transf fichero.lo8 GAME.DAT wretwr donde 'wretwr' puede ser 'eiruti' o 'uerhgiugh' (o incluso 'nbmnmbn'), ya que el test es realizado únicamente sobre el nº de argumentos suministrados al programa. En este caso, el programa no saltará bytes del fichero: por contra se debería (normalmente) producir un error en el primer byte... como me es difícil motivar a Boris para que corrija el programa, tome este error como una prestación adicional ;-). 55 U Error found. New value: <- Aquí debe introducir el valor superior en hexadecimal (en este caso 55) Si se produce otro error, tiene dos posibilidades: 1.- Su magnetofón o reproductor de cintas de cassette está RIP. 2.- La frecuencia de muestreo no es suficientemente alta. 3.- El volumen no está lo suficientemente alto. 4.- El programa no utiliza el mismo método para leer la cinta de cassette que el 6522, pues éste es un componente analógico que funciona por impulsos (frentes ascendientes, descendientes) y aquí trabajamos con datos numéricos. 5.- Simplemente que la unidad de cassette es para ZX-Spectrum. Bueno, en realidad son cinco posibilidades, pero no es el fin del mundo. Si consigue cargar cintas en el Oric (siempre que su gato no se haya paseado por encima del teclado) pero no con este emulador, use un programa copiador con el Oric y envie directamente la salida de éste al digitalizador (el programa maneja perfectamente la señal directa del Oric). Si aún así no funciona o no quiere desplazar su Oric, grabe la señal en una nueva cinta de cassette: esto mejorará la señal. El chip 6522 del Oric es muy bueno leyendo las cintas y corrigiendo errores eventuales: basta tomar las rutinas de carga de la ROM del Oric como referencia... Si el juego tiene varias partes, guárdelas separadamente, y luego únalas (cat o join)... a veces, necesitará introducir algunos bytes 0x16 entre ellas (no me pregunte el porqué) y ¡buena suerte!... yo lo he conseguido, entonces ¿porqué no usted?. Para cuestiones técnicas, no dude en contactar conmigo. PS: Le proporciono el código fuente en C de 'transf'. Debe compilarlo sin modificaciones bajo estaciones UNIX y pC, si se encuentra con que le es más fácil digitalizar sonido en esas plataformas (el programa ha sido desarrollado bajo UNIX y utilizado en PC). De todas formas, puede obtener la mayor parte de los juegos existentes en su página Web. IMPORTANTE: Si Amoric rechaza cargar algún juego, es debido a que las marcas de sincronía de la cinta virtual son demasiado pequeñas: ¡¡¡es culpa mía!!! He probado juegos conseguidos de esta página Web y me he encontrado con el mismo problema. Para remediarlo, emplee el programa TapeInfo que se proporciona con el paquete. ============================================================================== 12. Otras plataformas ~~~~~~~~~~~~~~~~~ VERSION UNIX Como ya dije con anterioridad, mi primer intento de emulación del Oric fue bajo Unix. Distribuí por Internet una versión que emulaba los gráficos de manera imprecisa y limitada, contactando con Fabrice Frances inmediata- mente, que había escrito un emulador para PC (Euphoric), el cual me presentó a Olivier Balet que ha mejorado mi versión Unix optimizando los gráficos (no la he visto funcionar pues se basa en prestaciones no presentes en todos los Unix). Junto a Fabrice intenta lanzar una buena versión Unix (¡traidores! :D; yo también trabajo en una versión OSF/Motif). VERSION PC Si tiene amigos usuarios de un PC y si desean un buen emulador, deberían probar Euphoric ('Euforia') de Fabrice Frances. Fabrice es un programador asombroso y su emulador es realmente una joya en la jungla del soft para PC. Puede obtenerlo en ftp.ensica.fr o aquí. A menudo hemos intercambiado ideas y sugerencias con Fabrice. Si es usted un desafortunado usuario de pC, Euphoric (versión 0.9) debería subirle la moral: es rápido, emula el sonido, el Oric 1 y el Atmos, el Telestrat (!), los microdiscos de Oric, Jasmin, los discos virtuales, RS232 (Unix...). La compatibilidad con el Oric es casi total y prácticamente no se le echa nada en falta (los joysticks). VERSION ATARI-ST Olivier Galibert consiguió mi emulador para UNIX y me envió un mensaje por correo electrónico (e-mail) para informarme de un error y para comunicarme que iba a realizar una versión para el Atari ST (680x0). Me ha dado sugerencias muy buenas que me han permitido mejorar la emulación y su velocidad. Espero que su excelente conocimiento del procesador 680x0 le permita terminar su emulador dentro de poco, incluso aunque el Atari esté algo olvidado (recordad, el Amiga...) VERSION ORIC Muy fiel; ha sida desarrollada por Oric Systems (Reino Unido) en 1983. VERSION ZX-81 Lo siento, pero no parece existir versión para esta plataforma. ============================================================================== 13. Cambios desde la versión anterior ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Amoric ya se encuentra en la versión 1.4a: se han corregido errores y nuevas prestaciones se han incorporado... ***** Añadido en la versión 1.4 ***** * Numerosas posibilidades de configuración. * Ahora es posible cargar/guardar la configuación de los joysticks. * También es posible guardar volcados de memoria en disco. * Es posible capturar la pantalla de la emulación y guardarla como un fichero IFF-ILBM. * Todos los modos de pantalla de Amiga están disponibles. * Mejor emulación 6522 (ahora casi perfecta). * Refresco de video ligeramente más rápido. * Ligera mejora del código. ***** Añadido en la versión 1.4a ***** * La rutina de visualización y la emulación de la CPU soligeramente más rápidas. * Se ha añadido la opción de (des)activar la redefinición la barra espaciadora (desconectada en versiones anteriores). * Guardar una pantalla monocroma ahora funciona correctamente. ============================================================================== 14. Errores y problemas ~~~~~~~~~~~~~~~~~~~ Los errores más importantes son debidos a las dificultades de emular correctamente al Oric original. He tenido problemas para que algunos juegos funcionasen. De hecho, algunos de estos errores detectados me han enseñado mucho sobre la estructura interna del Oric y me han permitido mejorar enormemente la emulación: personalmente, considero absolutamente imprescindible probar al menos 10 o 20 juegos cuando se programa un emulador (y digo juegos, porque es la principal utilidad que le encuentro a una emulación de un ordenador de 8 bits). * En primer lugar, no he implementado las instrucciones no documentadas (y hay un buen montón) como tales, sino que las emulo en forma de instrucciones NOP con saltos de contador de instrucciones. Al contrario que los programadores de Apple II y C64 se emplean poco en el Oric, y así por desgracia es frecuente por ejemplo el error cometido por los programadores con la instrucción BRK, que al retornar al programa deja el contador de instrucciones (PC) incrementado en dos unidades y no una como debiera. Si no me cree, pruebe esto en su Oric: DOKE #400,#6000 -> BRK -> RTS POKE #402,#4C -> JMP $FAE1 (ZAP) DOKE #403,#E1FAL01 Si ejecuta CALL #400 oirá un ZAP, que querrá decir que la instrucción RTS ha sido saltada sin ser ejecutada. Nota: En el C64 y el Apple II, las instrucciones no documentadas son encontradas muy convenientes por algunos programadores alocados y usadas sin ningún pudor. Actualmente, 'Amoric' maneja las instrucciones no documentadas avanzando el contador de instrucciones (PC) el mismo nº de bytes que lo haría un 6502 real, pero sin realizar ninguna operación (utilizando instrucciones NOP). 'Amoric' sólo falla (lo que le obliga a terminar y a salir a usted del emulador) si se encuentra alguna de las instrucciones que originalmente en un Oric harían que se bloquease (como las de la familia $x2), proponiéndole al usuario un reinicio total (como si apagase y encendiese su Oric) o salir del emulador. * En segundo lugar, no he implementado un sistema de refresco de pantalla de manera demasiado natural por razones de velocidad. Justamente por ello algunos errores pueden producirse cuando se produce un cambio 'HIRES'/'TEXT', o si se usa, como en algunos juegos, el modo de vídeo mixto 'Half-TEXT/Half-HIRES' (DOGGY, FIRE FLASH, STYX...) pues este modo es bastante difícil de reproducir con mi técnica de refresco actual. Estos modos no son emulados, pero ya he prometido en la documentación de la versión 0.8 que lo serían en la próxima versión (supongo que es ahora justamente cuando se percata de que he mentido ;-). Aún así, prometo que haré lo posible para implementarlo: mis últimas pruebas han sido infructuosas... en este momento, podría incorporarlo pero supondría ralentizar la emulación considerablemente, así que busco alguna solución ingeniosa para solucionarlo. Un simpático usuario me ha sugerido un truquillo, e intentaré probarlo. * En tercer lugar, el chip VIA 6522, utilizado para gestionar las entradas y salidas (teclado, sonido) y las interrupciones del reloj, es bastante complejo de emular. Mejoraré esta parte del código sin cesar, ya que siempre surjen pequeños problemas. * Por último, cuando se conmuta entre el modo 'TEXT' y el modo 'HIRES', la pantalla no se refresca completamente y algunos errores pueden aparecer en la visualización. Para eliminarlos, simplemente presione la tecla F2 (refresco de pantalla).