Todo sobre el Multifaz de Romantic Robot ---------------------------------------- A modo de introducción Es el año 1984 y Sinclair saca su Spectrum + 48k. Es el año 1984 y Timex Portugal saca su TC-2048. Aparecen también el CPC 464, el Apple IIc, los modelos de Commodore: 16 y Plus/4, la PC-jr de IBM, Tandy 1000, el QL y el Mackintosh ademas del tatung einstein. Y ese mismo año Romantic Robot crea para el Spectrum su primera Multifaz: el Multifaz 1. Le seguirían el Mult.128 y el Mult.3 para +3, el año 1987. Pasamos entonces al tema en cuestión, vamos a ver todo lo referente al Multifaz de R.R. tratando de que no se nos escape nada o casi nada sobre este artilugio. La primera parte trata sobre el Multifaz 1, la segunda sobre el Mult.128 y la tercera, justamente del Mult.3, mientras la cuarta parte trata más acerca de cómo funciona tanto el aparato real como en los diferentes emuladores para Spectrum. Abreviaciones usadas en estas notas: M1 = multiface 1 M128 = multiface 128 M3 =multiface +3 SPC = tecla espaciadora I. MULTIFAZ 1 El Multifaz 1 es toda una tres en uno. 1) facilita salvar plenamente a cinta, microdrive, wafadrive, betadisco 48, Discovery e indirectamente a otros sistemas de disco (via cinta.) 2) conexión para joystick Kempston (IN 31) 3) 8k de extensión RAM, para usar como disco RAM, bufer, etc. Usado por el Multifaz para almacenar herramientas múltiples u otros propósitos. Pasos para usarlo 1) una vez conectado correctamente, pulsar el botón rojo para activarlo 2) pulsa la tecla correspondiente a la función deseada de 6: e_xit (salir) - vuelve al BASIC para a) abandonar el programa y al M1 totalmente b) estudiar o alterar el programa r_eturn (regresar) - continúa con el programa (donde este fue interrumpido) s_ave - una vez elegida esta opción nos pide a) un nombre de archivo. 9 caracteres para todos los casos. 7 para el Beta48. ENTER genera programa de autoarranque. b) ahora nos pide que elijamos el dispositivo donde salvaremos el fichero: tape (cinta), cartucho, wafer, o disco. El Multifaz detecta si es Opus o Beta. Se puede salvar ya sea el programa o la pantalla tipeando p o s. a_bort - para salir t_ool (herramientas) - ofrece las sigtes. opciones: q_uit - vuelve al menú inicial ENTER - para ingresar PEEK/POKEs SPC - pide una dirección de la RAM r_eg - muestra los registros en 16358-16383 w_indow - muestra 128 bytes en una ventana de monitoreo de memoria. Con el cursor se selecciona la dirección a pokear h_ex - la dirección a tipear pasa de decimal a hexadecimal y viceversa t_ext -muestra los datos del w_ en formato ASCII o su valor hexadecimal c_opy - pasa la imagen de pantalla a la impresora. PAra interfaces con sentencia COPY (como Kempston E o Lprint III) j_ump - salta a otra dirección, la cual está guardada en las posiciones 8192 y 8193. Permite saltar tanto a la RAM y ROM del Spectrum o a la RAM del Multifaz cuya RAM sombrea a la ROM del ZX. 8194 indica el estado de paginado. 0= RAM paginada. 1= RAM no paginada. Notas: No se necesita la Multifaz para cargar los programas salvados por ella. Para conectar el Beta48 es necesario modificar la M1, llegando a perder el conector de Jostick ya que interfiere con el acceso a discos. Existe una versión para discos Kempston (el cual reemplaza al Beta48). Añade una opción más al menú: k_emp - para inicializar el Kempston con modelos 128k en modo 48. Cuando se usa con Microdrives, hay una opción de formatear cartuchos. El M1 tiene un switch para hacerlo invisible evitando así crashes con otros perifericos o programas no compatibles. Lo que se salva es una imagen comprimida de la RAM, antes que una copia del programa original. El M1 crea 4 partes: un cargador BASIC, el código principal, una pantalla y el código de operaciones. La pantalla se salva sin comprimir, como un SCREEN$ normal. La RAM del M1 permite guardar código máquina o datos, mas no programas BASIC. Programa ejemplo: 1 RESTORE: GO TO 20: REM rutina para movr bloques 5 LET hi=INT (i/256): LET 10=i-hi*256: RETURN 20 INPUT "Direccion inicial: ";i: GO SUB 5: LET shi=hi: LET slo=lo 30 INPUT "Direccion de destino: ";i: GO SUB 5: LET dhi=hi: LET dlo=lo 40 INPUT "El bloque en bytes: ";i: GO SUB 5: LET bhi=hi: LET blo=lo 50 FOR i=23296 TO 23296+17: READ a: POKE i,a: NEXT i: REM el bucle pone toda la rutina en el bufer de impresora; es relocalizable 60 RANDOMIZE USR 23296 70 DATA 243,219,159 75 DATA 33,slo,shi: REM direccion inicial del bloque a mover 80 DATA 17,dro,dhi: REM direccion de destino 85 DATA 1,blo,bhi; REM largo del bloque a mover 90 DATA 237,176,219,951,251,201 Podemos usar esta rutina para, por ejemplo, transferir una pantalla a la RAM del M1, con GOTO 1 en vez de RUN, dir. inic= 16384, destino= 8192, y bloque= 6912. Para extraer la imagen hacemos lo contrario: inic.= 8192, dest.= 16384 y bloq.= 6912. Y así por el estilo. NEW no afecta la RAM del M1, así que su contenido permanece hasta que se apaga el aparato. Para salvar su contenido, la RAM del M1 debe ser copiada en la RAM del ZX y entonces salvada con SAVE CODE. El M1 usa normalmente su RAM (8210 - 10753) como un bufer, para salvarlo en cambio, hay que seleccionar desde 8219 hasta 12722. Sistemas de disco no soportados Muchos son los sistemas no incluidos en las opciones de salvar del M1. Para esos sistemas como Swiftdisk o Timex FDD, se deben hacer los sigtes pasos: 1) salvar a cinta con el M1 y pasar todo al disco elegido (en el ejemplo a continuación se trata del Kempston Dos) 10 CLEAR VAL "24751"(**) 20 LOAD ""CODE: PRINT #4: SAVE "name3"CODE VAL "24752"(**),x 30 LOAD ""CODE: PRINT #4: SAVE "name2"CODE VAL "16384"(***),y 40 LOAD ""CODE VAL "16464": PRINT #4: SAVE "name1" CODE VAL "16464"(**),VAL "1906" donde: x= el código principal (máx. 40783) y= la pantalla (máx. 6912) para conocer estos valores basta con un lector de cabeceras de cinta como el de TRANS-Express. El último bloque siempre es de 1906 bytes(**). 2)una vez pasados todos los bloques requeridos al disco, crear el nuevo cargador BASIC de acuerdo con la sintaxis requerida, en este caso Kempston: 10 CLEAR VAL "24751"(**): PRINT #4: LOAD "name3"CODE 20 PRINT #4: LOAD "name2"CODE (***) 30 RANDOMIZE USR VAL "24792"(**): PRINT #4: LOAD "name1"CODE 40 RANDOMIZE USR VAL "24795"(**) Se recomienda que el cargador Basic sea lo más corto posible. (**): estos valores no son constantes tampoco, varían según el programa que se ha salvado. (***): a veces es mejor salvar la pantalla en otra direción y luego cargarla en su dirección correspondiente. II. MULTIFAZ 128 El Multifaz 128 es totalmente multi propósito. 1) facilita back-ups a tape (cinta), microdrive, Discovery, +D o Disciple 2) 8K RAM extra - óptimo para nuestro GENIE, LIFEGUARD, o como buffer, etc. 3) MULTI TOOLKIT - para analizar/modificar/desarrollar programas, POKEar vidas infinitas, etc. Pasos para usarlo 1) una vez conectado correctamente, pulsar el botón rojo para activarlo 2) pulsa la tecla correspondiente a la función deseada de 6: r_eturn s_ave - una vez elegida esta opción nos pide a) un nombre de archivo. 9 caracteres máx. para todos los casos. b) a_bort (salir), t_ape (cinta), m_icrodrive, o_pus, d_isciple o +d Se puede salvar ya sea el programa o la pantalla tipeando p o s. c) f_ormat - para cartuchos microdrive hasta 100k o más el cartucho es renombrado segun el programa que se va a salvar en él. t_ool (herramientas) q_uit ENTER SPC r_eg w_indow h_ex t_ext s_elect - inspecciona los bancos de RAM 0-7 del 128K. Pulsa s y enseguida el número de banco RAM p_rint - pasa la imagen de pantalla a la impresora. Para interfaces con sentencia COPY (Mulriprint, Kempston o ZX Lprint II) POKEa la dirección 8200 con los sigte. valores, si deseas: 113 - activa line feed - ON (CR + LF, CHR$ 13 + CHR$ 10) 112 - desactiva line feed - OFF (CR) 17 - copia pantalla modo texto con line feed (CR + LF) 16 - igual pero sin line feed (CR). Estos pokes pueden usarse con las Interfaces ya mencionadas en modo EPSON. j_ump c_lear - limpia el banco extra de 64K RAM (en modo 128K solamente) Notas: La opción e_xit solo aparece cuando el 128k está en modo 48k, o cuando el M128 es usado con un Spectrum 48k. La opción c_lear desaparece. La opción p_rint del M128 reemplaza a c_opy del M1. Ya no hay más wafadrive. En el lugar del Beta48 o el Kempston, ahora tenemos Disciple y +D. Añade c_ompress al menú. Ya no hay programas ejemplo del uso de la RAM extra. Ni dicen cómo pasar la información creada con el M128 a otros sistemas de disco no soportados como era antes con el M1. Como con el M1 tambien hay opción ON/OFF por razones de compatibilidad. En cambio tenemos: Salto directo Aparte de la opción j_ump (salto), podemos hacer un "direct jump" (salto directo). Es posibe preprogramar al M129 para hacer eso. Basta con POKEar 8192-3 xonb la dirección requerida, yh luego en 8195-7 con la palabra clave RUN (82,85,87). Al pulsar el botón rojo, uno salta a la direción elegida en vez de ir al menú M128. Paera retorn ar hay que hacer un RST 0. El botón rojo + BREAK revierten todo a la normalidad. Los 8k extras La RAM debe ser compaginada en código máquina para ser accesada: usando IN A, (191) para paginación IN, e IN A,(63) para paginación OUT. LAs instrucciones IN / OUT del BASIC no pueden ser usadas aquí. La RAM de 8k del M128 sombrea a la ZX ROM, por lo que esta no puede llamar a ninguna rutina de la ZX ROM, por lo que las rutinas del M128 deben ser todas independientes de la ROM del Spectrum. Pokeando vidas infinitas El manual empieza diciendo que hay que evitar quebrantar el copyright. Dicho eso, cargamos el programa al cual queremos pokear, pulsamos t en el M128, luego SPC y tipeamos (por ejemplo) 31000, a continuación tipeamos un valor de 1 a 3 dígitos y acabamos con ENTER. Listo, ahora volvemos al programa y vemos el resultado. III. MULTIFAZ 3 El M3 es totalmente multi propósito para los modelos +3 y +2a/b con: 1) facilita back-ups a tape (cinta), o Disco 2) 8K RAM extra - óptimo para LIFEGUARD, o como buffer, etc. 3) MULTI TOOLKIT - para analizar/modificar/desarrollar programas, POKEar vidas infinitas, etc. 4) acceder plenamente al +3DOS desde el Basic 48k Pasos para usarlo 1) una vez conectado correctamente, pulsar el botón rojo para activarlo 2) pulsa la tecla correspondiente a la función deseada de las 7 que ofrece: r_eturn s_ave - una vez elegida esta opción nos pide a) un nombre de archivo. 7 caracteres máx. pero sin ninguna extensión b) a_bort, t_ape (cinta), d_isco, 128_k Se puede salvar ya sea el programa o la pantalla tipeando p o s. a para abandonar y k para pasar de 128k a l_ocked 48k y viceversa l fija o deja bloqueado el modo 48k si se desea hacer eso t_ool (herramientas) q_uit ENT(ER) SPC r_eg w_in(dow) m_inus - retrocede 128 bytes la ventana de monitoreo n_ext - avanza en 128 bytes h_x - por hex t_xt - por texto p_r(int) - imprime el contenido de la ventana de monitor de memoria s_elect - inspecciona los bancos de RAM 0-7 del 128K. Pulsa s, el M3 espera que uno tipee el número de banco a usar p_rint - manda la imagen de pantalla a la impresora compatible EPSON Puedes POKEar las sigtes. direcciones: 8200 con los sigte. valores, si deseas: 1 - copia grande con line feed - ON 0 - igual pero sin line feed - OFF 241 - copia de sombras con line feed 240 - igual pero sin line feed. 8203-8205: fija márgenes izq. (0-255). der. (0-23) y alto (0-23) 8206-8280: fija el espaciado 8209-8212: fija el modo gráfico. Estos pokes pueden usarse con las Interfaces antes mencionadas compatibles con EPSON. d_os - accede al +3dos incluso desde el modo 48k siempre que no esté 'locked' a_bort - vuelve al menú l_oad - permite cargar un programa del disco e_rase - elimina ficheros del disco a_lter - alterna entre 2 pantallas sólo en modo 128k +3 y +2a/b tienen 2 pantallas: la normal en 16384-23296 y la opcional en 49152-56064 la pantalla en curso puede ser impresa y salvada si la segunda pantalla no contiene nada, alter mostrará todo negro, en ese caso, basta con pulsar alter otra vez para salir. c_lear - limpia el banco extra de 64K RAM (en modo 128K solamente) Notas: Ya no existe la opción j_ump en el menú, como era en el M1 y M128, ahora hay que pulsar el botón rojo para hacer saltos según la dirección elegida en 8192-3 (bajo-alto) mientras 8194 marca el estado de paginación con 0=paginado y 1=no paginado, mientras cualquier otro valor desactiva el salto. Luego para hacer el salto directo hay que seguir los mismos pasos anteriores pero añadiendo en 8195-7 la clave RUN (82,85,87). Para volver de la rutina en la RAM del M3 hay que hacer un RST 0 y para revertir el M3 a sus operaciones normales, se pulsa el botón rojo y BREAK a la vez cancelando la orden RUN. El set de herramientas t_ool opera en un área de 64k de los cuales 0-49151 están estrictamente definidos: 0 - 8191 (&0000-&1fff) la mitad baja de la ROM del Spectrum 8192 - 16383 (&2000-&3fff) los 8k de RAM sombra del M3 16384 - 32767 (&4000-&7fff) bloque #5 de la RAM del Spectrum 32768 - 49151 (&8000-&bfff) " #2 " " " en cambio: 49152 - 65535 (&c000-&ffff) es conmutable. pero muestra RAM #0 por defecto estos 16k son un área de trabajo/inspección de todos los bancos 0-7. El manual del M3 también explica como usar las herramientas para pokear vidas infinitas, como en el manual del M128. Otro detalle, a diferencia del M1 y M128 que permitian que uno cargue y ejecute los programas generados por ambas Multifaces sin tener que conectarla otra vez, aquí ya no es posible. El M3 debe estar conectado para volver a cargar y ejecutar los programas generados por el mismo M3. IV. Emulación y demás Los emuladores que incluyen la opción Multifaz son: RealSpectrum - Admite las 3 interfaces M1, M128 y M3, además añade Multiprint, Softcrak y el AT&Y Specmate. Spectaculator - solamente M1, M128 y M3. x128w - idem. Zesarux - idem, EightyOne - M128 y M3. Spin - idem. Speccy - solo m1 y m128. FUSE - M1, M128 y M3. Real Spectrum Con el REALS debemos seleccionar el modelo 48k y poner la opción Multifaz en ON. Por defecto nos pone el M128, así que hay que seleccionar de modo exclusivo el M1 y poner su opción Inhibit en OFF. Si todo está correcto, al pulsar F2 veremos el sigte. menú en pantalla: e_xit r_eturn s_ave t_ool c_opy j_ump MULTIFACE 1 (c) Romantic Robot Ltd Presiono s para salvar, que en mi caso es lo único que me interesa. Y me sale: File name (9 chars.): - pide nombre de archivo a guardar 9 c. una vez dado un nombre, nos damos con: a_bort t_ape c_artridge d_isk w_afer (s_creen or p_rogram) Si pulsamos c por cartucho Microdrive (MDR), tenemos: a_bort f_ormat+ s_ave Si elegimos w por wafadrive (WDR): a_bort Insert wafer. ENTER Selecciono el Opus Discovery (OPD) y a continuación pulso d. Si no hubiera disco o no reconoce la unidad de disco, se detiene con un mensaje de error. En caso contrario salva automáticamente. Tras crear las 4 versiones (TAP, MDR, WDR y OPD) las comparo y paso a ver cómo transfiero el programa salvado por M1 a otros sistemas no soportados como son el Beta128, Didaktik D80, MB-02+ Timex FDD y el +3. El programa elegido para esta prueba es SKYFOX, y según el manual, sólo mediante la cinta es posible pasar el programa a otros discos. Pero el cargador de la versión cinta no me sirve, solo las 3 partes creadas por el M1. "skyf" es el nombre del cargador y los otros tres archivos los llena con espacios siendo el décimo caracter un número: "skyf 3", "skyf 2" y "skyf 1". Tras varias pruebas, me doy conque el único cargador con información válida es la del Opus. Ahora ya sé cómo pasar los programas creados con M1 incluso al +3. Basta con cambiar la sintaxis y eso es todo. Ahora que ya sé como trabajar con el M1, prosigo con el REALS y paso al M128. menú en modo 48k e_xit r_eturn s_ave t_ool p_rint j_ump MULTIFACE 128 Version 87.2 on menú en modo 128k r_eturn s_ave t_ool p_rint j_ump c_lear MULTIFACE 128 Version 87.2 on en 48k tras pulsar s y dar un nombre válido de archivo pasamos a... a_bort t_ape m_icrodrive o_pus d_isciple s_creen or p_rogram c_ompress ON Y tras probar, nos damos con los sigtes. resultados: Salva a cinta el programa cargador y las 3 partes como ficheros sin cabecera de modo que solo podemos ver cuanto pesa cada parte, pero no su dirección inicial. Con el Opus D1 y los Microdrives, salva el cargador más sus tres partes correspondientes de modo similar al M1. Con el +D y Disciple crea solamente dos programas: un cargador en C.M. y en vez de los 3 bloques esperados, crea uno solo. Spectaculator El programa elegido para esta prueba es Bounty Bob strike back con M128 y lo paso todo a TAP. Creo dos versiones para comparar y el resultado es... Con c_ompress ON (comprimido): bountybsb_m128.tap tabla de contenido: programa: bbsb LINE 1 bloque de datos normal (335 bytes) " " " " (39648 " ) " " " " (5890 " ) " " " " (2406 " ) Con c_ompress OFF (sin comprimir): bounty2v2m128.tap tabla de contenido: programa: bbsb LINE 1 bloque de datos normal (335 bytes) " " " " (40488 " ) " " " " (6912 " ) " " " " (2406 " ) Con esta información vuelvo a REALS y lo salvo todo a OPUS DISC. Comparo los datos del cargador Basic y salvo a cinta lo que ahora tengo en el formato OPD. Voy al FUSE con Timex FDD emulado y transfiero todo. Modifico el cargador, ejecuto y... todo OK. El propgrama creado por M128 para OPUS DISC es posible de pasar a otros sistemas de disco, siempre y cuando se conozcan bien las direcciones de inicio y su longitud correcta. La otra opción es usar una rutina en código máquina que lea y cargue los programas sin cabecera de la cinta, para luego desde el Basic, salvarlos todos ya con un nombre para su posterior uso. Ahora que ya sé como intercambiar datos entre sistemas de disco con M1 y M128, paso a ver el M3 para +3. En Spectaculator pulso F3 y... r_eturn s_ave t_ool p_rint d_os a_lter c_lear MULTIFACE 3 V3.C on Pulsamos s y tenemos: File name (7 chars.): - pide nombre de archivo a guardar 7 car. damos un nombre y a continuación a_bort t_ape d_isk 128_k s_creen / p_rogram si elijo d y no hay un disco puesto o tenemos el +2a/b en cambio: a_bort Drive not ready ENTER Si en el menú del +3 elijo ir de frente al modo 48k, el M3 mostrará: r_eturn s_ave t_ool p_rint {locked} MULTIFACE 3 V3.C on al pulsar s y dar un nombre tendremos como únicas opciones: a_bort t_ape Si vamos al modo 48k desde el Basic +3 tipeando SPECTRUM, entonces tenemos acceso a todo lo que ofrece el M3 incluido el +3DOS. Opcion t_ools (herramientas) En todas las versiones, si pulsamos t, pasamos al menú de herramientas, que en el caso del M1, por defecto es: q_uit ENT_poke SPC_dir r_eg w_indow h_ex t_ext dirección: Si presionamos ENTER: q_uit ENT_poke SPC_dir r_eg w_indow h_ex t_ext dirección: 16384=000 Poke: y espera que uno ingrese el nuevo valor a pokear Si pulsamos h: q_uit ENT_poke SPC_dir r_eg w_indow h_ex t_ext dirección: 4000H=00H Poke: si de nuevo pulsamos h volvemos al modo decimal si elegimos w, entonces aparece una pantalla de 16 líneas en fondo amarillo: 4000H: 00 00 00 00 00 00 00 00 4008H: 00 00 00 00 00 00 00 00 4010H: 00 00 00 00 00 00 00 00 * * * * * * 4068H: 00 00 00 00 00 00 00 00 4070H: 00 00 00 00 00 00 00 00 4078H: 00 00 00 00 00 00 00 00 si pulsamos t: 4000H: . . . . . . . . 4008H: . . . . . . . . 4010H: . . . . . Y así sucesivamente. Muestra los caracteres en formato texto, y si no, imprime puntos en pantalla. Retipeando t volvemos a ver todo en hexadecimal. Tal como dice el manual, con el cursor podemos movernos libremente por la pantalla para modificar los valores en las direcciones adyacentes o cercanas. Para saltar a direcciones más alejadas, hay que volver a pulsar SPC y se nos pedirá la nueva dirección inicial a saltar, mostrar y/o modificar. Salvando en modo 128k Retomo el M128 y pruebo salvar algo en modo 128k. Elijo el Athena 128 ya que solamente existe en formato Z80. Con Spectaculator lo salvo a TAP y con REALS lo savo a OPUS y +D. ¿El resultado? El TAP tiene el cargador más 8 bloques sin cabecera. ¿Y el OPUS? M128 salva el cargador más 8 ficheros numerados del 1 al 8, más un fichero con el nombre incluyendo una B al final. O sea el programa ha sido dividido en 10 partes. El +D genera como siempre, un cargador más un solo bloque con el snapshot. En los tres casos, el cargador incluye una línea 0 que cuelga al 128k apenas uno intenta hacer un listado. Al menos el TAP lo carga y ejecuta sin problemas incluso el +3 y +2a/b. En el caso del TAP, el browser de cinta de Spectaculator me dice cuánto pesa realmente cada bloque. Falta saber en que posiciones de la RAM se debe salvar cada parte, y tratándose del 128k, hay que ver en qué página de memoria. Lo mismo va para la versión OPUS cuyo CAT no me muestra más que los nombres. Quiza con una rutina que expanda el catálogo... quizas... Sabiendo que no puedo retransferir los programas creados con el M3 a otro +3 o +2a/b sin M3, decidí ya no probar a salvar nada con dicha versión. En cambio, puedo cargar los programas creados com M128 y M1 em +3 y +2a. Con esto termino mis experimentos y lo dejo así y ahí. Para cerrar Hubo muchas versiones del M1, las primeras carecían de la opción t_ools. En su lugar había la opción p_okes. Otro caso es la versión k_empston. En el caso del M128, sus primeras versiones carecían de +D o disciple, en su lugar había la opción h_yper para cintas, supongo que fue reemplazada por la opción c_ompress. Pero si hubo M1 y M3 para el Spectrum, ¿qué pasó con el M2? ¿Hubo alguna más? EL MULTIFAZ 2 el Multifaz Dos fue hecho para el Amstrad CPC 464 y tenía opciones similares a las del Multifaz 1. MULTIFAZ ST Para los Atari ST, Romantic Robot hizo las M-ST y M-ST II, las cuales se conectaban al puerto de cartuchos del ST. Al igual que el M3 para Spectrum, estas versiones debían permanecer siempre conectadas al CPC o ST, si se quería volver a cargar el programa creado con ellas. Y... ¿cumplió el Multifaz con todo lo que prometía y ofrecía? La respuesta es sí. Todo cuanto el manual y los avisos de Romantic Robot decían, era posible de hacer. Luego vendrían otras marcas a competir con el Multifaz, pero esa es ya otra historia. Francisco León (c)2020 zx_if1@hotmail.com