Del Sharp MZ-700 al Spectrum O el Basic MZ Extendido para ZX Spectrum 80k LEC/Troller A modo de introducción ¿Que tuvieron en comun un MZ700 de SHARP y un Spectrum con 80k de LEC? Pues... Buscando mas informacion sobre la expansion de RAM LEC-80 termine encontrando un programa muy singular en la web, que aprovecha muy bien las capacidades de Spectrum con 80k de LEC. Se trata de una version del Basic MZ de Sharp MZ-700 el cual se puede encontrar y descargar de la pagina "https://sam.speccy.cz/mzbasic.html" A continuacion, vamos a tratar sobre la maquina de Sharp, su Basic y demas caracteristicas, asi como de esta version de Basic exclusiva para el 80k de LEC. MZ-700 Lo que sabemos de la maquina de Sharp: Forma parte de la serie MZ, sucesor a color del 80k, que era todo monocromo y fue sucedido por el 800 (Europa) y 1500 (Japon), lo cuales tenian graficos de alta resolucion a diferencia del 700 que usaba graficos de baja resolucion y graficos de texto. Tenia 64k de RAM, 2k de RAM video y solamente 2k de ROM. A diferencia de la mayoria de micros de la epoca (es del año 83), carecia de Basic incorporado, por lo que este se le debia cargar de cinta o disco, pudiendo usarse otros lenguajes de programacion en su lugar como el Pascal, C, Comal y hasta Fortran. Lo que sabemos de la version para el Spectrum: "MZ Extended Basic es una moderna alternativa compatible con el GW-BASIC de PC para el Basic de Sinclair. Convertido por Sinsoft en 1987 para el Spectrum 80k. MZ BASIC para ZX Spectrum era ofrecido en cinta de cassette junto con otros programas, varias ROMs nodificadas y toda su documentacion (en lengua Checa) relacionada con el Spectrum 80k. Tres versiones fueron hechas, solamente la segunda esta preservada. La tercera version soportaba acceso a disquetes (DOS con subdirectorios). El Spectrum 80k era una expansion de memoria muy popular en Checoslovaquia a fines de los 80." Nota: extraido y traducido del original texto de "https://sam.speccy.cz/mzbasic.html" El Basic MZ (en la maquina real) Cuando se enciende la máquina, lo primero que nos topamos es con el monitor, al mejor estilo del Apple-1 y ][. Para cargar el BASIC hay que poner la cinta que lo contiene en el DataCorder y tipear L. Con esto se carga lo primero que encuentre en la cinta, en este caso el S-BASIC. Una vez cargado. aparece el mensaje en pantalla: ______________________________________ BASIC INTERPRETER 1Z-013B V1.0A COPYRIGHT (C) 1988 BY SHARP CORP. ______________________________________ 36439 BYTES FREE Ready [] El cursor tipo cuadrícula aparece y queda en espera de que tipeemos algo, pero para eso necesitamos conocer mejor el teclado y la distribución de sus teclas. TECLADO Es un típico teclado QWERTY que curiosamente no tiene una tecla CAPS LOCK ni ESC. Pero sí 5 teclas de funciones. [ f1 ][ f2 ][ f3 ][ f4 ][ f5 ] [inst/clr][del/home] [ graph ] .... .... [ break ] [ alpha ] ..... ..... [ ] [ ^ ] [ ctrl ] .... .... [ cr ] [ < ][ > ] [ shift ] .... .... [ shift ] [ v ] [ space ] En la parte de atras tiene ademas el Botón de encendido y uno de RESET F1 = RUN + ENTER SHIFT + F1 = CHR$( F2 = LIST + F2 = DEF KEY( F3 = AUTO + F3 = CONT F4 = RENUM + F4 = SAVE F5 = COLOR + F5 = LOAD CTRL + E = minúsculas CTRL + T = cursor [<] + F = mayúsculas + U = [HOME] + M = retorno de carro [CR] + V = [CLR] + P = [DEL] + W = [GRAPH] + Q = cursor [v] + X = [INST] + R = " [^] + Y = [ALPHA] + S = " [>] BREAK = envía el codigo de interrupción BREAK + SHIFT = interrumpe un programa en ejecución o la datacorder GRAPH = entra en modo gráficos ALPHA = sale del modo gráficos y vuelve al modo de textos INST = permite insertar caracteres en el texto INST + SHIFT = hace un CLR (borra la pantalla) DEL = borra caracteres retrocediendo el cursor DEL + SHIFT = hace un HOME (mueve el cursor al inicio de la pantalla sin borrarla) COMANDOS Y SENTENCIAS AUTO - abrev.: A. genera lineas automaticamente segun inicio e incremento BYE - abrev.: B. retorna al MONITOR pero se puede volver con R CLS - abrev.: CL. limpia la pantalla CONT - abrev.: C. continua donde fue interrumpido por BREAK o STOP CONSOLE - abrev.: CONS. selecciona area de enrollado de pantalla li,ln{,ci,cn} DATA - abrev.: DA. contiene lista de valores a leer por READ DEF FN DEFinicion de FuNciones del usuario DELETE - abrev.: D. elimina lineas Basic en el rango x - y DIM - abrev.: DI. dimensiona una variable con subindices END - abrev.: E. termina el programa ERROR - abrev.: ERR. captura errores mediante ON ERROR GOTO x FOR - abrev.: F. inicia el bucle FOR GET - abrev.: GE. captura la tecla pulsada GOSUB - abrev.: GOS. salta a subrutina GOTO - abrev.: G. salta a un numero de linea IF condicion IF ... GOTO/GOSUB/THEN .... INPUT - abrev.: I. ingresa datos por teclado KEY - abrev.: K. DEFine KEY (tecla) a gusto del usuario KILL - abrev.: KI. cancela comando LET - abrev.: LE. asigna un valor a una variable LIST - abrev.: L. lista el programa, todo o en partes segun el rango x - y NEW - abrev.: NE. elimina el programa y variables de la RAM NEXT - abrev.: N. continua y completa bucle FOR ON - abrev.: O. para saltos ON GOTO/GOSUB/ERROR INP lee datos d de un puerto p OUT - abrev.: OU. envia datos d a un puerto p POKE - abrev.: PO. escribe byte b en la direccion d de la RAM PRINT - abrev.: P. o ? escribe datos a pantalla, impresora o disco READ - abrev.: REA. lee la informacion contenida en una sentencia DATA REM comentario RENUM - abrev.: REN. renumera listado RESTORE - abrev.: RES. restaura el puntero de linea DATA a leer por READ RESUME - abrev.: RESU. equivale a RETURN en rutinas de error RETURN - abrev.: RE. retorno de subrutina RUN - abrev.: R. ejecuta programa, todo o a partir de una linea n STOP - abrev.: S. detiene temporalmente el programa TROFF - abrev.: TROF. desactiva el rastreo de programa TRON -abrev.: T. activa rastreo de programa en ejecucion para depuracion USR - abrev.: U. llama rutina en codigo maquina en x y manda cadena x$ BOOT - abrev.: BO. sale del Basic y devuelve el control pleno al Monitor CLR pone todas las variables numericas a 0 y las de cadena a "" COLOR - abrev.: COL. cambia los colores de tinta y papel CURSOR - abrev.: CU. mueve la posicion del cursor del texto en pantalla LIMIT - abrev.: LIM. limita el area x de RAM a usar por el Basic RESET - abrev.: RESE. borra un punto grafico en x,y posicionado por SET SET - abrev.: SE. dibuja un punto en x,y de 80 x 50 MUSIC - abrev.: MU. genera musica con una sintaxis parecida a PLAY TEMPO - abrev.: TEM. fija tiempo 1 - 7 que durara MUSIC en tocar Sentencias de casete LOAD - abrev.: LO. carga programa BASIC x$ de una cinta MERGE - abrev.: ME. carga programa x$ y lo mezcla con el existente en curso SAVE - abrev.: SA. salva x$ a cinta VERIFY - abrev.: V. verifica programa x$ en cinta si se ha salvado correctamente ROPEN - abrev.: RO. abre fichero en cinta para lectura WOPEN - abrev.: W. abre fichero en cinta para escritura CLOSE - abrev.: CLO. cierra fichero abierto FUNCIONES ABS - abrev.: AB. valor absoluto de x ASC - abrev.: AS. da el codigo ASCII de un caracter n$ ATN - abrev.: AT. arco tangente de x CHR$ - abrev.: CH. convierte a caracter el valor de n COS - abrev.: COS coseno de x EXP - abrev.: EX. exponente de x FN invoca a una funcion definida por el usuario HEX$ - abrev.: HE. convierte un numero decimal x a su forma hexadecimal INT devuelve el entero de un numero n en coma flotante JOY - abrev.: J. lee el joystick conectado LEFT$ - abrev.: LEF. coge x caracteres a la izquierda de x$ LEN longitud real de una cadena x$ LN logaritmo neperiano de x LOG logaritmo de base 10 de x MID$ - abrev.: MI. coge x caracteres de x$ a partir de n PAI devuelve el numero PI multiplicado por el argumento x PEEK - abrev.: PE. lee un dato de la memoria x RAD - abrev.: RA. convierte x grados en RADianes RIGHT$ - abrev.: RI. coge x caracteres a la derecha de x$ RND - abrev.: RN. retorna un numero seudo-aleatorio SGN - abrev.: SG. signo de x SIN - abrev.: SI. seno de x SIZE - abrev.: SIZ. como FRE(0) devuelve la memoria disponible en RAM SQR - abrev.: SQ. raiz cuadrada de x STR$ - abrev.: STR. convierte en cadena un valor x TAN tangente de x VAL - abrev.: VA. devuelve valor numerico contenido en cadena x$ Variables EOF - abrev.: EO. busca marca de fin de fichero ERL da la linea donde hubo un error ERN da el numero asociado a uin error TI$ devuelve una cadena conteniendo el tiempo Operadores AND - abrev.: AN. conjuncion y OR disjuncion o SPC - abrev.: SP. genera n eSPaCios asociado solo a PRINT STEP - abrev.: STE. genera un salto incremento/decremento opcional en bucles FOR TAB - abrev.: TA. TABula n espacios con PRINT THEN - abrev.: TH. completa la forma IF TO parte de la sintaxis de FOR USING - abrev.: USI. imprime numeros con formato mediante PRINT π ( pi ) >< - <> =< - <= => - >= = > < + - / * ↑ (funcion exponencial, potencia de x) Mensajes de Error No. 1 Syntax error error de sintaxis 2 Over flow error datos numéricos fiuera de rango o límite excedido 3 Illegal data error dato, constante o variable ilegal 5 String length error la cadena excede los 255 caracteres de largo 6 Memory capacity error memoria insuficiente 7 Array def. error intento de redefinición de matriz a más de lo ya asignado 8 Linelength error la línea es demasiado larga 10 GOSUB nesting error se excedió la capacidad de subrutinas anidadas posible 11 FOR - NEXT error el numero de niveles de bucles FOR fue excedido 12 DEF FN nesting error el número de funciones definidas anidadas fue excedido 13 NEXT error hubo un NEXT sin su correspondiente FOR 14 RETURN error no se halló su GOSUB correspondiente 15 Undef. function error se invocó una función no definida 16 Undef. line num. error se trató de ir a un número de línea inexistente 17 Can't continue la sentencia CONT no se puede ejecutar 18 Memory protection se intentó escribir datos en el área reservada del BASIC 19 Instruction error comandos y sentencias usadas mezcladas en modo directo 20 Can't RESUME error no puede efectuarse el RESUME 21 RESUME error se intentó usar RESUME sin haberse dado ningún error 24 READ error se usó READ sin su DATA correspondiente 43 Already open error se intentó abrir un fichero ya abierto 63 Out of file error se salió del fichero mientras se estaba leyendo 65 Printer is not ready no hay impresora conectada 68 Printer mode error hubo un error en el modo de impresora ploter a color 70 Check sum error se dio un error durante la lectura de una cinta EN EL ZX SPECTRUM 80K Tras cargar exitosamente el programa, parece colgarse pero basta con pulsar una tecla y aparece en pantalla con borde y fondo negros y tinta en color blanco y a 40 columnas, el sigte. mensaje: ======================================== SHARP MZ-700 Extended BASIC Spectrum 80k version (C) SINSOFT 1987 ======================================== Ok [] La primera diferencia obvia es que reemplaza "Ready" por "Ok" y no nos dice cuántos bytes libres tiene. Para saberlo debemos tipear PRINT FRE(0). Lo que da: 28805, eso es 7634 menos que el MZ-700 real. El cursor es un bloque cuadrado parpadeante como el del MZ-700 que es el indicador de que estamos en modo minúsculas. Cuando se está en modo mayúsculas, el cursor es un _ , en vez de la rejilla que nos muestra el MZ-700. Ahora el texto inicial en pantalla quiere decir "Versión para el Spectrum 80k del Basic extendido del MZ-700 de Sharp por Sinsoft (c) 1987" Para volver al Basic Sinclair basta con tipear BOOT, y para regresar al Basic MZ hay que hacer un GOTO 40, y volveremos al MZ-700 sin perder el programa tipeado. TECLADO A continuación los equivalentes en el Spectrum 80k de las teclas del MZ-700. CS = Caps Shift SS = Symbol Shift EXT = Modo Extendido (CS + SS) F1 = EXT + 0 SHIFT + F1 = EXT + 5 F2 = EXT + 1 + F2 = EXT + 6 F3 = EXT + 2 + F3 = EXT + 7 F4 = EXT + 3 + F4 = EXT + 8 F5 = EXT + 4 + F5 = EXT + 9 CTRL + E = EXT + U CTRL + T = EXT + SS + U + F = EXT + W + U = EXT + K + M = EXT + M + V = EXT + L + P = EXT + H + S = EXT + SS + R + Q = EXT + SS + S + R = EXT + SS + T + X = EXT + R + W = EXT + SS + Y (GRAPH) CTRL + Y = sin equivalente e innecesario, el efecto de GRAPH no es permanente aquí CS + 1 = BREAK con el monitor, como EXT + C en Basic CS + 2 = fija el modo a mayúsculas (CAPS LOCK) CS + 3 = HOME (lo mismo que EXT + SS + K) CS + 4 = CLS (lo mismo que EXT + SS + N/I) CS + 9 = INSERT CS + 0 = DEL (lo mismo que EXT + SS + E) CS + 5, 6, 7, 8 = cursores CS + SPC = BREAK Ahora la combinación de teclas al parecer exclusiva de la versión para el Spectrum: EXT + I = TAB (avanza tabulando sin borrar o empujar el texto) EXT + B = retrocede el cursor una palabra hacia atras EXT + E = borra todo lo que hay delante del cursor en una línea EXT + Z = borra todas las lineas a partir del cursor EXT + D = baja una línea. Lo mismo hace EXT + C EXT + F = avanza el cursor una palabra hacia adelante EXT + J = mueve toda una palabra hacia adelante hasta otra línea EXT + N = crea una nueva línea y empuja todo hacia arriba EXT + O = como N pero empuja todo hacia abajo EXT + F = hace la inversa de HOME, mueve el cursor a la última posición del fondo EXT + SS + A/T = sube el cursor EXT + SS + C = baja el cursor EXT + SS + W = mueve el cursor como TAB EXT + SS + G/L = retrocede el cursor EXT + SS + R/S/D = avanza el cursor EXT + SS + Q = BELL como EXT + G EXT + SS + J = ENTER EXT + SS + M = EXT + N EXT + SS + Z = EXT + Z Características de esta versión de Basic para Spectrum 80k El equivalente a F7, en vez de "DEF KEY", da "KEY" GRAPH - tras pulsarla, enseguida tipeamos EXT y SS o CS + letra para ver el grafico ALPHA - inexistente y totalmente innecesario como ya fue mencionado Carece de todo el juego gráfico del MZ-700 Tiene en cambio más combinaciones de teclas que el MZ-700 Sin el set de caracteres original es imposible hacer PRINT π (PI) Por alguna razón BREAK no solo interrumpe un programa, cuelga todo el sistema Para lograr PRINT "{graph}CLR{alpha}" debemos tipearlo del modo sigte.: PRINT "EXT, SS + Y, EXT, CS + 4" y eso es todo. Igual con PRINT "{gr.}HOME{alph.}". Nota: no sé si es el emulador o el teclado de PC, pero CS + número no siempre da el efecto deseado. Así, tras EXT, CS + 4 debería dar el signo "ªc" en la pantalla, pero en vez de eso aparece RENUM a veces, como si ignorase el pulsado de CS. Solo nos queda usar SS + la tecla equivalente al efecto deseado con CS + número. MON - debe ser usado para entrar al Monitor del Basic en vez de BYE INKEY$ - lee el teclado en lugar de GET & - en lugar de $ para ingresar números hexadecimales CALL - su máx. valor en hexadecimal es &4774. En decimales llega hasta 65535 COLOR acepta solo 2 parametros en vez de 4 y afecta a toda la pantalla sin CLS OPEN # - en lugar de WOPEN, ROPEN o XOPEN y PRINT # en vez de PRINT/T. Acepta LINE INPUT pese a que el S-Basic carece de dicha instruccion INIT - al igual que OPEN, no tiene la misma sintaxis que su equivalente MZ Acepta LABEL "nombre" asociado a GOSUB pudiendo usar el nombre en vez del numero STRING$ - abrev.: STRI. existe en esta version de Basic Lo que el MZ-700 tiene en común con... APPLE - arrancar con el Monitor y cargar luego el Basic Commodore - los símbolos semigráficos son accesibles desde el teclado Atari y Commodore - poder hacer CLS mediante un PRINT TRS80 y ZX81 - modo gráfico de baja resolución estilo PLOT/UNPLOT Spectrum - tener 8 colores y un solo canal de sonido Microsoft - la gran mayoría de sus sentencias son compatibles MSX y GW-Basic Sentencias no aceptadas por esta versión Todas las sentencias del Basic MZ están presentes en esta versión, excepto los comandos de disco, los del PLOTTER y las sentencias que vamos a mencionar a continuación: BYE, RESET y todas las que terminan en /T o /P dan "syntax error" SET, GET, PUT, OFF, por ejemplo, dan "level error" USR es funcion y devuelve "undef. user funct." (funcion de usuario no definida) Tampoco acepta PRINT [tinta,papel]"texto" para colorizar en pantalla Convirtiendo al Basic Sinclair ¿Razones para usar este BASIC? Una es poder usar un Basic distinto al de Sinclair como es el el Basic MZ, siempre y cuando se tenga un Spectrum modificado a 80k. Pero ya que normalmente solo poseemos un 48k y generalmente sin expandir, no nos queda otra que convertir los listados del MZ al ZX. A la hora de convertir listados debemos elegir entre limitarnos a los 32 caract. del Spectrum o usar alguna rutina de 40 a mas caract. Luego esta el ignorar las sentencias inexistentes en el Spectrum o usar extensiones como BetaBasic para que el listado se aproxime mas al original con ELSE, ON, HEX$ y demas extras. Y por ultimo que sean listados Basic sin nada de codigo maquina. El unico dilema... es que al carecer de los caracteres graficos no hay modo de que aparezcan como se verian en el listado MZ a menos que se pueda POKEar el area donde estos caracteres residen y salvarlos para cargarlos cada vez que se los requiera o necesite. En emuladores Hasta el momento de escribir estas notas, solamente el emulador LNXSpectrum acepta el Basic Extendido del MZ-700, siempre que uno seleccione el Spectrum 80k Troller. (c)2020-2022 zx_if1@hotmail.com