DEL GALAKSIJA AL SPECTRUM A modo de introducción El GALAXIA (Galaksija en lengua croata) es una oscura máquina de los años 80, construida en la ex Yugoeslavia, y de la cual no me hubiera llamado demasiado la atención, sino fuese porque un emulador de este sistema ha sido escrito para el Spectrum 128k y +3. Aparecido originalmente en la CGC y de ahí en el WOS. Como hice antes con el VIC y el APPLE-1, me he visto obligado a buscar y reunir toda la info posible para poder entender y usar este programa. Mis notas se dividen en tres partes: la primera es una traducción del texto del autor original del emulador. La segunda es una traducción del manual del Basic tanto de la ROM 1 como su expansión la ROM 2. Y la tercera son mis conclusiones personales tras probarlo. Abreviaciones en mis notas: SS = Symbol Shift CS = Caps Shift EXT = CS + SS Y una vez dicho eso empezamos con... I- El manual del emulador Emulador GALAKSIJA para ZX Spectrum 128k+ -=========================================- v 1.4 por Tom-Cat , Obo & Marko Bienvenido al primer emulador de Galaksija para el ZX Spectrum, el cual emula una computadora Galaksija - con acceso a pantalla, teclado y cinta en las sigtes. configuraciones del Spectrum: - ZX Spectrum +3 - ZX Spectrum +2A (negro) - ZX Spectrum SE - cualquier 128k Spectrum con la interfaz DivIDE conectada - cualquier 128k Spectrum con una MB-02+ conectada Desafortunadamente, un 128k "ordinario" ó +2 (gris), carecen de la posibilidad de paginar la RAM en la dirección $0000, la cual es requerida para que corra el Galaksija (también se requiere tener RAM libre en $2000). Por eso, para esos modelos (y sus 'clones') se necesita una de las interfaces mencionadas. El Galaksija es una computadora basada en el Z80, construida en la ex-Yugoslavia durante los mejores años de la era informática (¡los 80 ;-) !). Venía en formato kit, y fue ansamblada por mucha gente en esos días. Su pantalla es monócroma con pseudo gráficos (hechos de caracteres de 2 x 3 pixeles). Su velocidad no era mucha, debido a que el pobre microprocesador gastaba mucho de su tiempo en hacer la imagen de pantalla. Lamentablemente, eso no significa que el Spectrum pueda hacer un mejor trabajo - peor aun, debido a su raro fichero de presentación visual. Pero aun así, muchos de los juegos deberían ejecutarse a una velocidad lo más cercana a la del viejo Galaksija. Debido a que el ZX Spectrums no tiene todas las teclas que el Galaksija, se tuvo que aplicar una forma especial para obtenerlas. Lo malo es que eso significa que algunas cosas como el manejo de los cursores es patético (pero mejor que antes). Como sea, la tecla SHIFT es muy especial, con ella el Spectrum te da los signos como: , . : / etc. SYMBOL SHIFT es el SHIFT como en el Galaksija (ya que es la forma propia del Speccy). Usa SHIFT + 1 para activar ON/OFF la emulación de los Cursores con 6, 7, 8, y 9 (Sinclair 1). NOTA: Se aconseja a los usuarios del DivIDE de NO resetear la computadora y en vez de eso, usar la opción '0' del menú OLD, el cual fija el Divide para FatWare (y quizas otro firmware). Se se presiona RESET, entonces se queda colgado el sistema, ¡y ya no queda otra que apagar la máquina! Teclas que se obtienen con CAPS SHIFT: ----------- Z - ; V - / SPACE - BREAK (interrumpe un programa BASIC) N - , M - . 0 - flecha izq. (actúa como BACK SPACE en una línea de Comandos) 7 - : L - = 2 - DELETE (solo en modo EDIT) 3 - REPEAT (repite la última tecla) 4 - LIST (muestra el listado del programa en curso) 1 - ON/OFF de los cursores. Cambia el '0' a '.' (botón de disparo Super Cruiser) 5 - ON/OFF la velocidad (¡aun no está al 100%!) S + D - RESETea al Galaksija Desde el Basic, tipear OLD - accede al Menú con juegos preinstalados para elegir. Una vez seleccionado el juego hay que tipear RUN para que se ejecute. La opción '0' debe retornar al Basic del Spectrum wn cualquiera de sus configuraciones. No te olvides - para RESETear (y entonces elegir otro juego) ¡pulsa SHIFT + S + D! Que te diviertas con este pequeño programa. ¡Y desde la v1.2, el código fuente del emulador también está incluido! Muchísimas gracias a: Marko - por el código del fichero de presentación visual optimizado. Obo - 1ro. por toda la ayuda en lo del asm. 2do. por la conversión del emulador del SAM Coupe. 3ro. la optimización del código DIFF. 4to. la simplificación en el manejo del teclado. Dave - por su ayuda y todo lo demás. Dekay - por jugar todo lo que pueda jugarse. Dunny - por SPIN. Woody - por SPIN... incluso si él no lo quiere admitir. Zilog - por el Divide y la info sobre el paginado. Baze - por el Fatware. Zub - por probar a leer esto ;-) Logout128 - por su info sobre el MB-02+ Busy - por la info del MB-02+ en torno al Basic. T.Solc - por su info sobre algunas cosas acerca del Galaksija. A.Owen - por las modificaciones para el Spectrum SE #spin - por ser el mejor canal ZX del medio Y alguno que se me haya olvidado.... Cambios (partiendo desde la version 1.3): 1.4 - Añadido el soporte para Spectrum SE (by A.Owen - thanx!) Es chequeado después del Divide, MB-02+ y antes del Plus3. 1.3 - Añadi una opción para volver (EXIT) al Spectrum en el menú OLD. (Divide también copia el Firmware desde la EEProm al MapRam e intenta reiniciarlo - con firmwares que se comporten bien, ¡debería de ser posible reiniciar sin apagar la máquina!) - añadi soporte MB-02+. - en el menú de OLD menu es visible si estamos en modo +3, Divide o MB-02+. Tom-Cat (tomcat@sgn.net) II - El Basic del Galaksija. Y hasta ahí, todo lo que el autor tuvo para explicar acerca de su programa. Ahora pasamos a ver todo lo referente al Basic del Galaksija. El Basic Galaksija es el intérprete BASIC del Galaksija, una computadora casera del tipo "constrúyalo ud. mismo", hecha en Yugoslavia. Si bien estaba basado en parte, del código extraído del Basic del TRS-80 Nivel 1, el cual, el creador creyó que era Basic Microsoft BASIC, fueron tantas las modificaciones del Basic Galaksija — como incluir un sopòrte rudimentario para matrices, el código de generación de video (que la CPU misma hacía en ausencia de circuitería dedicada al video) y unas mejoras generales al language — se dice que del código original no quedó más que el dedicado al control de flujo y coma flotante. La implementación central del interprete estaba plenamente contenida en la ROM de 4k, llamada "A" o "1". La placa original de la máquina tenía una ranura reservada para una extension llamada ROM "B" o "2", la cual añadía más comandos y extras, tal como un ensamblador Z80 Zilog incorporado. ROM "A"/"1" - Signos y palabras reservadas La ROM "A" o "1", ofrece 3 signos especiales y más de 30 instrucciones: SIGNOS: ! - comentario (equivale a REM). Ejemplo: 10 ! PROGRAM ZA SUMIRANJE # - Equivale a DATA. Ejemplo: 20 # 10,30,"JANUAR" & - prefijo para hexadecimales. Ejemplo: 30 PRINT &2CBA SENTENCIAS: ARR$(n) Genera una matriz de cadena de subindice 'n', pero solo funciona con la varible X$. En cuanto a matrices numéricas, solo la variable A usa subindices. No existe DIM, ni matrices de multiples dimensiones. Ejm,: ARR$(10): X$(1)="GALAKSIJA": INPUT N: A(N)=20 BYTE Esta instrucción opera tanto como función y sentencia. Como función equivale a PEEK. Ejm.: PRINT BYTE(11176) Como sentencia equivale a POKE. Ejm.: BYTE 11176,12. CALL n Llama a subrutinas en BASIC. Equivale a GOSUB. Ejemplos: CALL 100 y CALL 10*A+100. DOT Esta instrucción opera tanto como función y sentencia. Como función lee un pixel en unas coordenadas dadas. Ejem.: DOT x,y donde (0<=x<=63, 0<=y<=47). Como sentencia dibuja un punto en dichas coordenadas. Equivale al PLOT del ZX81. DOT * muestra el reloj controlado mediante la variable Y$. Y$= "00:00:00:00" - resetea el reloj. Y$= "21:45:20:50" - fija la hora al valor contenido en la cadena. Y$= "21:45" - solo fija la hora y el minuto. Y$= "21:45:20" - aquí se fija solamente la hora, los minutos y segundos. EDIT n permite editar una línea n del programa FOR... TO...{STEP...} NEXT... Es el típico bucle FOR - NEXT sin ninguna variación sintáctica. GOTO n La típica instrucción de salto a número de línea. Ejm.: GOTO 10*A+100 HOME Equivale a CLS, sirve para borrar la pantalla. HOME n - proteje n caracteres desde arriba de la pantalla de ser "escrolada" IF...{:}ELSE... El Galaksija no usa THEN. Ejm.: 10 IF (X>Y)*(Z>2) PRINT "USLOV JE ISPUNJEN": ELSE PRINT "USLOV NIJE ISPUNJEN" 20 IF X>Y ELSE GOTO 100 - solo hace el salto si no se da la condición IF. INPUT Permite ingresar las variables al usuario por teclado. Ejm.: INPUT A: INPUT X$. LIST {n} Lista el programa. El parámetro opcional es la línea donde empieza el listado. NEW {n} Elimina el programa BASIC en curso. Con el parámetro opcional borra el programa BASIC y mueve el inicio del área del BASIC a 'n'. OLD Equivale a LOAD. Carga un programa de la cinta. No solicita nombre de archivo. OLD n - carga un program en una dirección n diferente. Ejm.: OLD 1024, OLD &400. OLD? - verifica programa salvado. PRINT Muestra en pantalla expresiones numéricas o de cadena. PRINT AT n.... - imprime en las posiciones desde 0 a 511, modo texto 32 x 16. Ejm.: 10 PRINT AT 32, "RAČUNAR GALAKSIJA" RETURN Retorna desde la subrutina BASIC llamada por CALL. RUN {n} Ejecuta el programa BASIC. El parámetro opcional ejecuta desde la línea 'n'. SAVE Salva el programa en la cinta. No requiere nombre de archivo. SAVE mmmm, nnnn - dos argumentos opcionales, indican que se salvará la memoria desde mmmm hasta nnnnn. Ejm.: SAVE &3C30, &3FFF. STOP Detiene la ejecución de un programa BASIC. TAKE Reemnplaza a READ y a RESTORE. Si el parámetro es un nombre de variable, actúa como READ, pero si es un número, se comporta como RESTORE. Ejm.: TAKE A,100,B,C,250,X$ UNDOT x, y "desdibuja" (reset) un punto en las coordenadas especificadas (ver DOT). UNDOT * - detiene al reloj. WORD Doble byte PEEK y POKE. Ejms.: WORD 10905,0: PRINT WORD(10905) FUNCIONES: CHR$(n) Convierte el código ASCII 'n' en su caracter correspondiente como cadena. EQ compara los valores alfanumericos solamente de X$ e Y$. Ejm.: 100 IF EQ Y$,X$(10) GOTO 1000: ELSE PRINT "RAZLIČITI SU" INT(n) Devuelve un entero de valor mayor igual o menor que 'n'. KEY(n) Lee si una tecla en particular ha sido pulsada. KEY(0) da cualquiera de los sigtes. valores: Tecla N A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R 18 S 19 T 20 U 21 V 22 W 23 X 24 Y 25 Z 26 ↑ 27 (cur.arr.) ↓ 28 (cur.abj.) ← 29 (cur.izq.) → 30 (cur.der.) blanko 31 (espacio) 0 32 1 33 2 34 3 35 4 36 5 37 6 38 7 39 8 40 9 41 ; 42 : 43 , 44 = 45 . 46 / 47 RET 48 (enter) RPT 50 (repeat) LIST 52 SHIFT 53 Ejm.: 10 IF KEY (1) PRINT "PRITISNUO SI A": ELSE GOTO 10 - lee si se pulsa la A. 20 PRINT CHR$(KEY(0)); - duvuelve un valor de 1 al 53 según se pulsen las teclas. MEM devuelve la cantidad de memoria libre. Equivale a FRE de otros BASICs. PTR Devuelve la dirección de una variable. Ejm.: PRINT PTR X$ RND Devuelve un número aleatorio entre 0 y 1. Ejm.: PRINT INT(7*RND+1) USR Llama a una subrutina en código máquina. Ejm.: A=USR(14) VAL devuelve el valor numérico de una cadena. Ejm.: PRINT VAL(PTR X$) ROM "B"/"2" - nuevos signos y palabras reservadas Una vez instalada esta ROM debe iniciarse tipendo lo siguiente: A=USR(&1000). La ROM "B" o "2", añade ensamblador, un signo extra y 22 nuevas instrucciones: % - prefijo numérico hexadecimal. Ejm.: PRINT %(&2C3A) /"palabra" - busca la "palabra" y da una lista de todas las líneas de programa donde esta se encuentre. Pulsando DEL ralentiza el listado. ABS(x) - el valor absoluto de x ARCTG(x) - la arcotangente de x (en radianes) COS(x), COSD(x) - coseno de x (en radianes el primero y grados el segundo) DEL x,y - borrar lineas desde x hasta y DUMP m,n - volcado de memoria a pantalla. Donde m= dirección y n= cantidad. EXP(x) - exponente de x INP(x) - lee dato de puerto x LDUMP m,n - como DUMP pero volcando a la impresora LLIST - como LIST pero con la impresora LN(x) - logaritmo neperiano de x LPRINT - como PRINT pero mandando los datos a la impresora OUT x,y - envia dato 'y' al puerto 'x' PI - el número 3.14... POW(x,y) - función logarítmica REN x - renumerar a partir de x SIN(x), SIND(x) - seno de x (en radianes el primero y grados el segundo) SQR(x) - raiz cuadrada de x TG(x), TGD(x) - tangente de x (en radianes el primero y grados el segundo) EL ENSAMBLADOR La ROM 2 ofrece la posibilidad de tipear instrucciones de ensamblador dentro de un listado BASIC. < - Inicia el ensamblador > - Sale del modo ensamblador Ejemplo de listado Basic con insttrucciones en ensamblador: 10 < 20 ORG &3000 30 OPT 3 40 DFILE EQU &2800 50 LD A,&C 60 RST &20 ! SISTEMSKI POZIV ZA BRISANJE EKRANA 70 LD HL, PORUKA 80 LD DE, DFILE+231: ! KAO PRINT AT 231 90 LD BC, KRAJ-PORUKA 100 LDIR 110 RET ! POVRATAK U BEJZIK 120 PORUKA BYTE " " " 130 TEXT "GALAKSIJA" 140 BYTE " " " 150 TEXT " 8 K ROM" 160 KRAJ 170 > 180 A=USR(&3000) Variables del sistema en la RAM: Direc. Byte Contenido en hex. 2800 512 20 Memoria de Video 2A00 104 00 Variables Numericas A-Z 2A68 2 2800 Posición del cursor en memoria 2A6A 2 3800 Zona de memoria 2A6C 2 00 Memoria de video 2A6E 2 00 Registro TO de FOR-NEXT 2A70 16 00 X$ 2A80 16 00 Y$ 2A91 2 00 Bucle activo 2A93 2 00 Posición línea en curso (temporizador FOR-NEXT) 2A95 2 00 Puntero Basic (para CALL y FOR-NEXT) 2A99 2 00 16*ARR$+16 2A9B 2 00 Dirección de la variable NEXT 2A9D 2 2C3C Puntero de TAKE 2A9F 2 00 Posición de la linea en curso 2AA1 2 00 Registro de la actividad FOR-NEXT 2AA3 2 00 SP temporal del CALL activo 2AA5 2 00 Diferenciador del teclado 2AA7 3 00 RND 2AAC 124 00 Acumulador aritmético (IX) 2BA8 1 0B Posición Horizontal del texto 2BA9 3 C9 Enlace de comandos 2BAC 3 C9 Enlace de video 2BAF 1 00 Si bit 7 = 1, el reloj del contador de imágenes es 2BB0, 1, 00 2BB1 1 00 Flag del movimiento de imagenes 2BB4 1 00 Registro de REPT 2BB5 1 00 Flag de la impresora 2BB6 125 00 Buffer 2C36 2 2C3A Puntero del inicio del Basic 2C38 2 2C3A Puntero del final del Basic 2C3A ?? 00 Programas en ensamblador y Basic Notas sobre el Basic. Como hemos visto el Basic Galaksija da nombres algo diferentes a algunas sentencias típicas (por ejm.: BYTE en vez de PEEK y POKE, etc). Lo hicieron así para asegurarse que muchos de los comandos empezaran con letras distintas. No solo le ayuda al inteprete a reconocer los comandos, sino tabién permite que todas las palabras sean abreviadas a una sola letra más un punto (por ejm.: "P." en vez de "PRINT") y así, ahorrar memoria para el mismo programa, pero con menos legibilidad. El intérprete del Galaksija puede reportar solo unos pocos mensajes de error - notablemente "WHAT?", "HOW?" y "SORRY" (qué, cómo, lo siento). Esto deja más espacio en la ROM para el código. El mensaje "READY" (los bytes que lo representan en la ROM) es usado también como código en la rutina de generación de video. El sucesor del Galaksija fue el Galaksija Plus. A continuación una comparación... Ficha técnica: RAM: Galaksija - desde 2 KB a 6 KB base (hasta 54k) / Galaksija Plus : 48 KB Modos de texto: 32 x 16 Modos gráficos: 64 x 48 (modo semi-gráfico) / Galaksija Plus : 256 x 208 Colores: Monócromo Sonido: Galaksija - no / Galaksija Plus : 3 canales (AY-3-8912 o compatible) Peso y tamaño: desconocido III - Probando el emulador Muy bien, paso ahora a ver cómo se comporta el programa. Y como siempre elijo el REAL SPECTRUM en modo +2A. Me quedo viendo el screen inicial y ninguna nota de que pulse una tecla para continuar. Pulso y la pantalla se pone en papel negro con tinta blanca. Una vez cargado el emulador, aparece el mensaje en pantalla: []READY >_ paso a tipear algo y... a buscar esa combinación de teclas que el autor no mencionó dónde se ubican, como el signo '?'. Y el resultado fue: Teclas que se obtienen mediante SS y EXT: SS + 1 = ! EXT + L = - SS + 2 = " EXT + Z = + SS + 3 = # EXT + V = ? SS + 4 = $ EXT + N = < SS + 5 = % EXT + M = > SS + 6 = & SS + S = CHR$(94) Š SS + 7 = CHR$(255) bloq.gr. EXT + 7 = * SS + 8 = ( SS + Z = CHR$(93) Ž SS + 9 = ) SS + X = CHR$(91) Č SS + 0 = _ SS + C = CHR$(92) Ć Ahora, el Galaksija posee las sigtes teclas especiales, de los cuales el autor del emulador ya mencionó en sus notas (parte I) y que repito a continuación: BRK (por BREAK) = CS + SPACE : = CS + 7 DEL (por DELETE) = CS + 2 = con CS + L REPT (por REPEAT) = CS + 3 / = CS + V STOP LIST = CS + 4 ; = CS + Z , y . = CS + N y CS + M repectivamente Los cuatro cursores son replicados con el Joystick Sinclair 1 (ver parte I). Las teclas SHIFT son dos, pero sin nombre en el teclado real del Galaksija. La tecla RET era renombrada RETURN o ENTER en algunos teclados. Ya que se cómo obtener los signos, paso ahora a tipear OLD, lo que me lleva al sigte. menú: PLUS 3 POR FAVOR ELIJA UN JUEGO: 1. GALAKTICKI RAT 2. JUMPING JACK 3. SUPER CRUISER 4. TETRIS 5. BLADE ALLEY 6. DIJAMANTSKI RUDNIK 7. ZAMAK 8. INSPEKTOR SPIRIDON 9. SUPER SAH ---------------------- 0. RETORNA AL SPECTRUM TIPEAR RUN CUANDO CARGUE EL JUEGO La única forma de volver al Basic Galaksija es eligiendo un juego, ya que la opción cero, ha sido pensada para salir definitivamente de vuelta al Basic Sinclair, con lo que se cierra la sesión y hay que volver a cargar el emulador si se desea continuar. Sigo probando a tipear cosas y voy descubriendo que... Solo admite una letra como nombre de variable numérica de la A a la Z. Las únicas variables de cadena admitidas son X$ e Y$. Cualquier otra letra da error. Las únicas matrices admitidas son las tablas o listas unidimensionales. En el caso de tablas numéricas, estas se limitan a una sola variable: A(x). Las tablas alfanuméricas están limitadas a X$(x). SAVE no hace nada. Aun no está implementado. Usarlo puede incluso colgar la máquina. Por lo mismo OLD? y OLD x van al menú como si tipearamos simplemente OLD. El emulador contiene tanto la ROM 1 como la ROM 2, por lo que todas las sentencias están presentes, y eso debe incluir el ensamblador. Debido a que la ROM 2 ya está preinstalada, no es necesario iniciarla mediante USR. Es posible hacer (ROM 2) A="X":PRINT A y obtener 88. Es el equivalente a ASC("X"). Acepta 0 para falso y 1 para cierto. Igual que el Spectrum. PRINT MEM da 31686 de memoria libre al iniciar el sistema. El Basic Galaksija carece de AND, OR y NOT. Eso obliga a uno a hacer malabares con la sentencia IF. Por ejemplo en el caso de AND: IF A<0 IF B>0 PRINT"BEOGRAD”:ELSE PRINT "ZAGREB” No hay instrucciones para definir funciones nuevas por el usuario. Tampoco hay funciones para cortar o manipular subcadenas. En este caso ya ni modo. Eso sí, la velocidad a la que se ejecutan los programas es aceptable, no se siente para nada lento. En suma una buena emulación. El problema hasta el momento en que estoy escribiendo a medida que lo pruebo es... Importar y exportar los datos El Galaksija tiene SAVE para salvar los programas, OLD? para verificar si se salvó bien y OLD para vovlerlos a cargar. Pero hasta el momento de escribir este manual, el emulador para Spectrum no salva nada ni a cinta ni a disco. Por el momento solo puedo jugar con los programas preinstalados con el emulador, y no puedo cargar otra cosa que no sea eso. Puedo tipear algo y ejecutarlo, pero... la cuestión es como salvarlo para verlo otro día. En el caso de un +3 real, necesito el MULTIFACE 3, para capturar un SNAPSHOT del programa entero. En el caso de un emulador puedo salvarlo todo como un .SNA o como un .Z80. Y eso sería todo. El autor del emulador no indica nada sobre las posiciones de memoria ocupadas por el emulador en el Spectrum ni hace comparación alguna con las posiciones de la RAM del Galaxia original. Habrá que buscar con un debugger. Los programas tanto en Basic como en ensamblador comienzan en 2C3A, eso es 11322. Eso es en la RAM del Galaxia, habría que ver a qué equivale en la RAM del Spectrum. Empecemos por el emulador mismo, viene en formato cinta. La versión TAP es de unos 46k. Como la mayoría de programas para Spectrum tiene 3 partes: el cargador Basic, "Galaksija" y empieza en la línea 5, la pantalla de carga "SCR" y el programa mismo en C.M llamado "7000" que empieza en la 28672 y es de 131 pero este llama a su vez a varios bloques sin cabecera. En suma, para pasarlo a un disco hay que modificar el C.M. o usar el MULTIFAZ 3. Pruebo a cargarlo con SPUD pero tras cargar todo y pulsar una tecla, se elimina el programa quedándome en modo 48k. Ahora lo pruebo con Spectaculator, carga bien y creo un Z80 y un .SNA. Trato de cargarlos después en REALS. mas este se cuelga con el .SNA pero no con el .z80. Retomo el REALS, y creo un .SNA, que carga bien en el mismo REALS, pero no en el Spectaculator 53 que se resetea y vuelve al menú. En el caso de EightyOne 1.8, nada más cargar el SNA, el z80 o el mismo TAP y todo se pone negro. En el caso de FUSE, carga el TAP, pero al intentar salvar un SNA dice que de seguir se pierde info, así que creo un SZX en vez. Carga sin problemas el .z80, no el SNA. El KLIVE carga en cambio tanto el TAP, como el .SNA creado con REALS, así como el .z80 de Spectaculator. Zesarux, Speccy 4.8 y x128w solo el .z80. Muy bien vuelvo al FUSE, tipeo unas líneas en Basic Galaxia y uso el Memory Browser, con el cual busco y me muestra que lo tipeado parece empezar en 2C36, eso es 11318. Pero su código ASCII empieza en la 27FF o sea a partir de 10239. Sabiendo eso, vuelvo al REALS y voy al menu de bloques de memoria con ALT + F9. Salvo bloque con inicio 10239 y 6k de largo a manera de prueba como "Gal_prb1.bin". Hago NEW y HOME. Cargo otra vez el .BIN y reaparece el listado, hago RUN y todo OK. Tipeo P.MEM y eso me da 31627. Si lo resto de 31686, eso me da 59. Pruebo entonces a salvar con inicio 11318 y 60 bytes de largo pero con nombre "Gal_prb2.bin". Hago NEW y HOME. Y nuevamente cargo este último fichero. No aparece ningún listado en la pantalla. Hago LIST y todo reaparece como antes. Cargo este último .BIN en FUSE y todo OK. Spectaculator carga bien solo el primer BIN. Finalmente se como importar y exportar los datos separadamente en vez de como SNA. Así que ya puedo pasar a... Convirtiendo al Spectrum Debido a que el Galaksija carece de color y sonido y tiene limitadas opciones para el manejo de cadenas y matrices numericas, mientras sea BASIC puro sin llamadas al código máquina, no debería de ser dificil de transcribir y pasar un listado del Galaxia al Spectrum. ¡Encima le podemos añadir color y sonido! Practicamente todas o casi todas sus instrucciones tienen su equivalente en el Basic Sinclair, con algunas excepciones como DOT y UNDOT, o los caracteres gráficos que el Spectrum no posee. En el caso de DOT y UNDOT Basta con definir una subrutina que las replique como en el caso del ZX-81. Pero DOT empieza 0,0 en la esquina superior izq. y no abajo como el Spectrum y no afecta a PRINT como hace el ZX-81. Así que su definición sería: 8900 REM galaksija dot 8902 PLOT x*4,172-y*4: DRAW 2,0: DRAW 0,2: DRAW -2,0: DRAW 0,-2: DRAW 2,2: DRAW -2,0: DRAW 2,-2 8904 RETURN Ejemplo de su uso: 10 DOT 0,0: DOT 63,47 (Basic Galaksija) - reemplazar por: 10 let x=0: let y=0: gosub 8900: let x=63: let y=43: gosub 8900 para replicar UNDOT basta con añadir OVER 1 o INVERSE 1. Pero esto aun genera una resolución de 64 x 43 y no 64 x 47 (encima el texto sigue a 32 x 21). Para aproximarse a los 47 en vez de 43, hay que modificar: 8902 PLOT x*4,173-y*3: DRAW 2,0: DRAW 0,1: DRAW -2,0: DRAW 0,-1: DRAW 1,1: DRAW -2,0: DRAW 2,-1 mientras en el ejemplo de su uso hacemos: 10 let x=0: let y=0: gosub 8900: let x=63: let y=47: gosub 8900 con lo que ya obtenemos algo cercano a la resolución de texto de 32 x 16 y gráficos de 64 x 47 píxeles. En el caso de DOT* y UNDOT* El Basic Sinclair no tiene esta función de base, pero si el BetaBasic. ARR$(x) se reeemplaza facilmente por DIM x$(x) y A(x) se la dimensiona con DIM. Y así sucesivamente con todas las demás sentencias y funciones del Galaxia. El Betabasic es la mejor alternativa en caso de ELSE, DOT, DEL, REN o WORD. CONCLUSIONES El GALAXIA fue una máquina extremádamente popular diseñada por Voja Antoni en 1983, como un sistema "constrúyalo ud. mismo". Fue puesta al mercado pensado para el hogar y la escuela por la empresa Elektronika Inženjering de Serbia. Solo podía usar una grabadora de cinta como medio de almacenamiento de datos y aunque tenía conector EAR como el Spectrum, no estaba diseñada para hacer sonido alguno. Como salida de video tenía una toma monocromo y una para TV en UHF. Si bien no hay mención de tener conector de impresora, debió de añadirsele, ya que la ROM 2 ofrece sentencias para mandar los datos a una impresora como son LPRINT, LLIST y LDUMP. Habrá que ver si un día logran hacer que pueda siquiera salvar y cargar de una cinta, y ya que fue pensado para un +3, redirigir un día SAVE y OLD a disco. solo que en este caso, habría que modificar la sintaxis de dichos comandos para que acepte nombres de ficheros +3dos. Solo me queda decir que este es por el momento el único manual más completo en español del Galaxia, ya que toda la info al respecto está en su original serbo croata o es una traducción al ingles pero incompleta o con muchos errores en cuanto a lo que hacen ciertas instrucciones, como es el caso de la ROM 2. Traducción y recopilación: Francisco León (c)2018 zx_if1@hotmail.com