Del Nascom al ZX Spectrum Por donde empezamos.... No era algo que estuviera buscando en realidad, simplemente estaba leyendo al azar alguno que otro post en el foro de SPECTRUM COMPUTING y me tope con uno que hablaba de un juego 32k, bajo el titulo "uMIA detected: Adventure 32K, a text adventure in Z80 file". Al leerlo me hallo con otro enlace: "http://8bitag.com/info/syrtis-adventure.html" y aqui me encuentro con el "The Nascom Homepage & Software Repository" cuyo enlace es: http://www.nascomhomepage.com/#TheNascomRepository y ahora me di con "NASCOM BASIC emulator for the ZX Spectrum 48K." Al igual que el emulador del UK-101, este programa tampoco figura en la lista del WOS o Spectrum Computing. Asi que lo descargo y a probar y mis resultados son los que ofrezco a continuacion. Al igual que hice con el Apple-1, VIC-20 y demas, este texto lo he dividido en 3 partes, la primera con una traduccion de las notas del autor mas algo de info sobre las maquinas Nascom, la segunda con los comandos del BASIC y la tercera con mis conclusiones. Parte I DEL README.TXT DEL AUTOR "21 de Noviembre de 2003 --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- NUEVO EN LA VERSION 2.0: - modo de 80 columnas (!) ... si bien sugeriria mas usar el modo de 48 columnas - comando SCREEN corregido - FONT corregido... habia un feo cambio en los caracteres que seguian a CHR 9 - SET, RESET y POINT ahora ya funcionan y emula el ECONOGRAPHICS !! - USR(0) ahora actua como una generica funcion INKEY$; esto ayuda a ejecutar muchas de las llamadas a codigo maquina. A veces, cuando la funcion tiene que esperar que se presione una tecla, es necesario un pequeño "hackeo" al programa original. Si ninguna tecla es pulsada, la funcion retorna 0. - KEMPSTON JOYSTICK es usado para emular las teclas de cursor con USR(0) - POKE y DOKE pueden operar con la RAM de la pantalla!!! ...PEEK y DEEK aun no (eso va a ser mas dificil). --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- Hola, este es un emulador del BASIC de NASCOM para el ZX Spectrum 48K. Permite correr muchos programas que no requieren llamar al codigo maquina. La diferencia principal esta en la pantalla, permite 24 lineas en el ZX Spectrum, mientras es de 16 lineas en la maquina original. Para convertir programas originales del Nascom, usamos el programita incluido 'cas2zx' el cual convierte los archivos ".CAS" usados en emuladores del Nascom en los mejor conocidos ".TAP". Para aprender mas del BASIC de NASCOM se puede ver la documentacion original: http://www.nascomhomepage.com/pdf/Basic.pdf Muchos ficheros CAS los pude encontrar en: http://www.nascomhomepage.com/index.html Para desarrollar este emulador use partes del proyecto Z88DK, expecialmente el ensamblador Z80ASM y un extracto del emulador ANSI VT (para el manejo de font de 5 bits). Asi como el editor de fonts de Marcio Afonso Arimura Fialho que me ha sido de ayuda para crear el set apropiado del juego de caracteres. Cualquier comentario al rexpecto es bienvenido. Que lo disfruten, Stefano Bodrato - stefano.bodrato@pioneerinvest.it" Y eso es todo lo que el autor nos dice respecto a su programa, ¿pero y que es el NASCOM? Para responder a eso pasamos a... NASCOM 1 Era un kit para armar producido en Inglaterra. Su nombre derivaria de Nasco, una compañia norteamericana que planeaba hacer kits para aficionados en Gran Bretaña, pero el Nascom fue en realidad construido por Chris Shelton y vendido bajo el sello Shelton Instruments Ltd en 1977. Sus caracteristicas eran las sigtes.: LENGUAJE incluido Monitor TECLADO pleno de 47 teclas CPU Z80 VELOCIDAD 1 o 2 MHz. CO-PROCESADOR Ninguno RAM 1 KB RAM video 1 KB ROM 1 o 2 KB MODO DE TEXTO 48 cars. x 16 lineas MODO GRAFICO Ninguno COLOR Monocromo SONIDO desconocido TAMAÑO Y PESO 30.5 (L) x 19.2 (W) cm. (8 x 12 in) PUERTOS E/S TV-UHF, puerto serial (grabadora o RS232 o Teletipo) MEDIA Cinta de cassette SO Monitor en ROM POWER SUPPLY Fuente de poder separada (opcional) PERIFERICOS Tarjetas de memoria y varias interfaces de E/S NASCOM 2 Fue una mejora al original y diseñada por Peter Cummins. Se vendio tambien como kit, esta vez bajo el sello de Nascom Limited en 1979. Sus caracteristicas fueron: LENGUAJE incluido Microsoft BASIC TECLADO pleno de 53 teclas con flechas de cursor y simb. graficos CPU Z80-A VELOCIDAD 4 MHz. CO-PROCESADOR Ninguno RAM 9 KB expandible a 32 KB RAM video 1 KB ROM 10 KB - Monitor (2 KB) + Microsoft BASIC MODO TEXTO 48 cars. x 16 lineas MODO GRAFICO caracteres graficos en la ROM (96 x 48) COLOR ¿? SONIDO ¿? TAMAÑO Y PESO 30.5 (L) x 19.2 (W) cm. (8 x 12 in) PUERTOS E/S Serial RS232, TV-UHF y video compuesto, lineas E/S, TTY MEDIA Cinta de cassette SO Monitor en ROM POWER SUPPLY Fuente de poder externa PERIFERICOS Tarjetas graficas y de memoria, controlador de discos a 5.25" NASCOM 3 Tras la quiebra de Nascom, Lucas Industries en 1981 (renombrada Lucas Nascom), sacaría la tercera version, esta vez ya no como un kit, sino como una maquina completa totalmente ensamblada de fabrica. En la practica era un Nascom 2, pero con todo y teclado. Sus caracteristicas: LENGUAJE incluido Microsoft Basic TECLADO pleno CPU Zilog Z80A VELOCIDAD 4 MHz RAM 8 KB a 60 KB (dependiendo del modelo) ROM ¿? MODO TEXTO 40 u 80 columnas x 25 lineas MODO GRAFICO 400 x 256 (8 colores) - 800 x 256 (2 colores) COLORES 8 (320 x 256) / 2 (640 x 256) SONIDO ¿? PUERTOS E/S TV y video, grabadora de cintas, puertos Serial y Paralelo MEDIA Dos unidades de disco de 350 KB a 5.25" (opcional) SO NAS-SYS, CP/M 2.2 o NAS-DOS POWER SUPPLY fuente de poder incluida PERIFERICOS Lapiz optico, tarjetas NASBUS Nota: La informacion sobre las caracteristicas de cada modelo de NASCOM fue tomada de "OLD-COMPUTERS.COM : The Museum". Sabiendo ya lo que es el NASCOM, doy paso a... Parte II EL BASIC DE NASCOM El Nascom 8k Basic esta basado en el Basic Microsoft, lo cual ofrece un alto grado de compatibilidad con los programas publicados en libros y magazines. Ofrece numeros de coma flotante de 7 digitos desde 1.70141E36 a 2.9387E—38, funciones trigonometricas, manejo de cadenas y control PIO. Las funciones de usuario pueden ser escritas en codigo maquina o Basic para proveer una flexibilidad adicional. Entre sus otras presentaciones incluidas tenemos: - Opera con Nasbug T2 y Nas-Sys - con Nas-Sys ofrece manejo de pantalla, y edicion de datos y programas - soporte para impresoras o terminales via conexion serial - manejo mejorado de cintas con chequeo de errores de datos y programas - soporte de comandos graficos en pantalla - opera en dos modos, comandos directos o sentencias dentro de programas Palabras reservadas CLEAR NEW AND OUT DATA NEXT CONT POINT DIM PRINT DEF RESET END READ DOKE POKE FOR REM FN SCREEN GOSUB RETURN LINES SET GOTO RUN NOT SPC IF STOP NULL WAIT INPUT TO ON WIDTH LET TAB OR LIST THEN USR y demas funciones de la libreria del Basic Comandos Los comandos directos en el Nascom BASIC organizan la memoria y facilitan la E/S, asi como listar y editar programas y otros detalles. CLEAR pone todas las variables del programa a cero CLEAR[] como CLEAR pero fija el espacio para cadenas segun la expresion. Si no hay argumentos, el valor por defecto es 50 bytes, como al iniciar Nascom BASIC. CLOAD hace que el programa en cinta designado por el primer caracter de cadena sea cargado en memoria. Un NEW es efectuado antes de que el programa se cargue. CLOAD? Verifica que el programa especificado es cargable y libre de errores. CLOAD* carga el arreglo (matriz) especificado de la cinta, puede ser usado como una sentencia de programa. CONT Continua la ejecucion del programa despues que un ESCape ha sido tipeado o se ha ejecutado STOP o END, la ejecucion sigue a la sentencia despues que la interrpcion occurriera a menos que la terminal fuese interrumpida. En ese case, la ejecucion reanuda con la aparicion del prompt ?. CONT es util en la depuracion, especialmente donde un 'bucle infinito' es sospechado. Solo se puede salir de un bucle sin fin tipeando ESCape, eso causa la interrupcion dejando el BASIC en modo comando. En este modo las sentencias pueden ser usadas para imprimir valores, cabiarlos, etc. La ejecucion puede ser reiniciada tipeando CONT, o mediante GOTO, el cual hace que la ejecucion prosiga en la linea especificada. La ejecucion no puede ser continuada si un error en modo directo ocurre tras la interrupcion. Tampoco puede continuar si el program es modificado tras la interrupcion. CSAVE hace que el programa en memoria sea salvado en la cinta con el nombre especificado por el primer caracter de la cadena. CSAVE* hace que el arreglo sea salvado en cinta. Puede usarse dentro del programa. LIST Lista el programa en memoria a partir del numero de linea mas bajo. Termina de listar ya sea porque llega al final del programa o tipeando ESCape (Shift & Newline) LIST[] imprime el listado a partir de la linea especificada. LIST imprimira n lineas (donde n=5 o segun el comando LINES) y espera que enter/newline sea tipeado antes de continuar. Tipear ESC devuelve el control al Basic. NEW elimina el programa en curso y limpia todas las variables. Usado antes de tipear un nuevo programa. NULL fija el numero de nulos a ser impreso al final de cada linea. Por 10 caracteres por segundo de golpes de cinta (tape punches), el entero debe ser >=3. Por 30 cps de punches, debe ser >=3. Cuando las cintas no son puncheadas, el entero debe ser 0 o 1 para Teletipos y Teletipos compatibles CRTs. Debe ser 2 o 3 para impresoras de 30 cps copia dura. El valor por defecto es 0. Nota: los monitores de Nascom normalmente ignoran los nulos como salida, pero una demora adecuada puede usualmente ser generada haciendo NULL 255, los nulos son pasados para usar drivers de E/S. RUN [] ejecuta el programa en memoria segun la linea especificada. Si se omite, la ejecucion sera desde el comienzo o la linea mas baja. Sentencias A continuacion las sentencias son listadas en orden alfabetico. En la tabla, X e Y son cualquier expresion permitida en la version en consideracion. I y J son expresiones cuyos valores son truncados a enteros. T y W son cualquier nombre de variables. DATA<1ista> Especifica los datos a leer por READ. Los elemento de lista pueden ser numeros o cadenas separados por comas. DEF FNv()= DEFine una funcion de usuario. El nombre es FN mas un nombre de variable valido. Las definiciones estan restringidas a 1 linea de 72 caracteres. DOKE, almacena J en la poscion de memoria I e I+1. Si i o j son negativos, entonces son interpretados como 65536 + I o J, segun sea apropiado. DIM((i)[,j...])[,....] asigna espacio para los arreglos (variables con subindice). Mas de 1 variable puede ser dimensionada con DIM hasta el limite de la linea. El valor de cada expresion da el maximo subindice posible. El calor mas pequeño es 0. Sin un DIM, un arreglo es asumido que tiene un subindice maximo de 10 por cada dimension referenciada. Por ejemplo, A(I,J) es asumido con 121 elementos, desde A(0,0) hasta A(10,10) a menos que fuese dimensionada con DIM. END Termina la ejecucion de un programa. FOR=TO[STEP] permite la ejecucion repetida de las mismas sentencias, primero hace V=X. La ejecucion procede normalmente hasta que NEXT es encontrado. Z es añadido a V, entonces if Z<0 and V>=Y, or if Z>0 and V<=Y, el BASIC vuelve a la sentencia despues de FOR, sino, la ejecucion continua con la sentencia tras NEXT. GOTO salto incondicional a la linea nnnnn GOSUB salto incondicional a la subrutina que comienza en la linea nnnnn. IFGOTO como IF...THEN excepto que GOTO solo acepta numeros de linea, no sentencias. IFTHEN IFTHEN[:sentencia2 {:...}] si X<>0, salta a la linea y o a las sentencias tras THEN, sino, la ejecucion pasa a la linea que sigue a IF...THEN. INPUT[,...] hace que el BASIC solicite datos de una terminal, los valores tipeados en la terminal son asignados a las variables en lista. [LET]= Asigna el valor de x a la variable v. La palabra LET es opcional. LINES fija el numero de lineas a imprimir por LIST antes de esperar una tecla. NEXT[,,...] La ultima sentencia de un bucle FOR. V es la variable del bucle mas reciente, W el siguiente y asi. NEXT sin parametos termina el bucle FOR mas reciente. ONGOTO salta a la linea cuyo numero esta en la lista. Los elemento de la lista se separan con comas. Si I=0 o > al numero de elementos en lista, la ejecucion continua en la sigte. sent. Si I<0 o >255, entonces genera un error. ONGOSUB<1ista> como ON...GOTO excepto que la lista es de lineas iniciales de subrutinas. OUT, envia el byte J al puerto I. 0<=I, J<=255. POKE, almacena el byte J en la posicion de memoria I. 0<=J<=255;-32768[,...] hace que los valores en la lista sean impresos en el terminal. El espaciado es determinado por la puntuacion: , - al inicio de la sigte. zona de 14 columnas ; - inmediatamente otro o nada - al inicio de la sigte linea. Los textos se imprimen si estan dentro de comillas ("). READ[,...] Asigna valores de DATA a las variables en lista. Los valores son asignados en secuencia xon el primer valor de la primera instrucion DATA. REM permite insertar comentarios. No se ejecuta, sino que es ignorado. En las versiones extendidas, los comentarios pueden ser añadidos al final de una linea precedida por una comilla simple ('). RESTORE permite que las sentencias DATA puedan ser releidas. La sigte. READ despues de un RESTORE empieza con el primer dato de la primera sentencia DATA. RETURN Termina una subrutina. Salta a la sentencia despues del GOSUB mas reciente. SCREEN , posiciona el cursor colocando el caracter en la columna X, linea Y. STOP detiene la ejecucion del programa. El BASIC entonces imprime "BREAK IN LINE nnnnn." (interrumpido en la linea nnnnn) WAIT,[,] estatus del puerto I es XOR con K y AND con J. Continua la ejecucion tras esperar resuñtado no cero, K por defecto es 0, 0<=I,J,K<=255. WIDTH fija ancho del bufer de input y print a n con impresora. Donde N = 1 a 255. Funciones intrinsecas Nascom BASIC provee de varias funciones algebraicas y de cadena comunmente usadas que pueden ser llamadas por cualquier programa sin mas definicion. Las funciones de la sigte. tabla estan listadas en orden alfabetico, y como siempre, X e Y son para expresiones, I y J para enteros, X$ e Y$ para cadenas. ABS(x) devuelve el valor absoluto de X. ABS(x)= x si x>=0, -x si x<0. ASC(x$) devuelve el codigo ASCII del primer caracter de X$. ATN(x) devuelve arco tangente de X. Resultado en radianes con rango —pi/2 a pi/2. CHR$(i) devuelve una cadena cuyo unico elemento es el codigo ASCII I. COS(x) devuelve el coseno de (x). X en radianes. EXP{x) exponente - devuelve e a la potencia x. X debe ser <=87.3365. FRE(0) devuelve el numero de bytes en memoria no usado por el BASIC. Si el argumento es una cadena, devolvera el numero de bytes libre en espacio para cadenas. INP(i) lee un byte del puerto I. INT(x) devuelve el entero mas grande <= X. LEFT$(x$,i) devuelve los I caracteres mas a la izquierda de X$ LEN(x$) devuelve la longitud de X$. Caracteres no imprimibles y espacios son contados. LOG(x) devuelve el logaritmo natural de X siendo X>0 MID$(x$,i{,j]) sin J, retorna los caracteres mas a la derecha de X$ empezando con el I-esimo caracter. Si I>LEN(X$), MID$ devuelve cadena nula, 00 da el sigte. valor random en la secuencia. X=0 da el ultimo numero retornado. Las secuencias iniciadas con el mismo valor negativo seran las mismas. RIGHT$(x$,i) devuelve los I caracteres mas a la derecha de X$. Si I=LEN(X$), devuelve x$. SGN(x) If X>0, devuelve 1, si X=0 retorna 0, si X<0, retorna -1. Por ejemplo: ON SGN(X)+2 GOTO 100,200,300 salta a 100 si X es negativo, 200 si X es 0 y a 300 si X es positivo. SIN(x) devuelve el seno de X en radians. cos{x)=sin(x+3.14159/2}. SPC{i) imprime I espacios blancos en la terminal. 0<=I<=255 SQR(x) devuelve la raiz cuadrada de X. X debe ser >= 0 STR$(x) devuelve la representacion como cadena de X. TAB(i) tabula con espacios a la posicion I en la terminal. El espacio 0 es el mas a la isq., 71 el mas a la der. Si el carro esta ya mas alla de I, TAB no tiene efecto. 0<=I<=255. Solo se usa con PRINT. TAN(X} devuelve la tangente de X. X en radianes. USR(X} llama a una subrutina de usuario en languaje maquina con argumento X. VAL(x$) devuelve el valor numerico de X$. Si el primer caracter de X$ no es +, -, & o un digito, VAL(X$)=0 Caracteres especiales Nascom BASIC reconoce varios caracteres en el ASCII como teniendo funciones especiales en el control de carro, edicion e interrupcion del programa. Los caracteres tales como Control/C, Control/S, etc. son listadps en la tabla que sigue. Notese que aquellos marcados con asterisco no aplcan cuando son dados usando Nas-sys en modo normal. * @ (Escape o shift + Newline en Nas—sys] borra la linea en curso y efectua un carriage return (backspace) borra el ultimo caracter tipeado. Si no hay mas caracteres hace un return. * _ (underline) igual que backspace. Newline (o Enter) mueve el cabezal de impresion o cursor al inicio de la sigte. linea. Escape (shift + newline) Interrumpe la ejecucion del programa en curso o listado. Tiene efecto tras la ejecucion de la sentencia en curso o tras listar la linea actual. La ejecucion puede ser continuada tipeando cualquier caracter, excepto que tipear mas Escapes hace que el BASIC termine en modo comando y salga OK. CONT continua con la ejecucion. Nota: las teclas deben ser pulsadas en un teclado Nascom. Pulsar ESC en una terminal serial conectada no tiene efecto. : Separa las sentencias en una linea. * rubout (control Z) elimina el caracter previo en una linea input. El primer Rubout borra el ultimo caracter impreso y asi sucesivamente. * Control/R imprime newline y hace eco a la linea que esta siendo entrada. Control/U igual que @ Minusculas (Lower Case Input) Las minusculas siempre apareceran asi en pantalla, pero LIST y PRINT las transforman a mayusculas si estas no son parte de una cadena, REM o un comentario tras una comilla ('). MENSAJES DE ERROR Si un error ocurre, el BASIC pasa a modo comando y da OK. Tato el programa como las variables permanecen intactos, pero ya no puede proseguir con CONT, solo con un GOTO. El formato de los mensajes es el sigte.: Comando directo ?XX ERROR Sentencia ?XX ERROR IN YYYYY donde XX es el codigo de error e YYYYY es el numero de linea donde el error ha ocurrido. A continuacion los posibles codigos de error y significados: BS - SUBSCRIPT OUT OF RANGE (subindice fuera de rango) Se intento referenciar un elemento de arreglo fuera de sus dimensiones. Este error puede ocurrir si un numero erroneo de dimensionado es usado, como por ejemplo: LET A (l,l,l)=Z y A ha sido ya dimensionado como DIM A(l0,l0) DD - REDIMENSIONED ARRAY un arreglo fue dimensionado, pero otra sentencia DIM intenta usarse con ese mismo arreglo. FC - ILLEGAL FUNCTION CALL (llamada de funcion ilegal) el parametro pasado a una funcion matematica o de cadena esta fuera de rango. FC puede ocurrir debido a: l. un subindice negativo (LET A(-1)=0) 2. un subindice irracionalmente grande (>32767) 3. LOG con argumento cero o negativo 4. SQR con argumento negativo 5. A B con A negativo y B no entero 6. llamar USR antes de dar la direccion de subrutina en lenguaje maquina 7. usar MID$, LEFT$, RIGHT$, INP, OUT, WAIT, SCREEN, WIDTH, SET, RESET, POINT, DEEK, DOKE, PEEK, POKE, TAB, SPC, u ON...GOTO con argumento invalido. MO - MISSING OPERAND Ningun operando ha sido dado al comando. CSAVE sin nombre fichero es ilegal. ID - ILLEGAL DIRECT INPUT y DEF no son permitidos en el modo directo. NF - NEXT WITHOUT FOR la variable en NEXT no corresponde a nmngun FOR previo OD - OUT OF DATA se ha ejecutado un READ pero todos los DATA del programa han sido ya leidos. O el prorama trata de leer mas datos o estos eran insuficientes. OM - OUT OF MEMORY Programa demasiado grande, demasiadas variables, demasiados FOR, demasiados GOSUB o expesiones demasiado complicadas. OV - OVERFLOW el resultado de un calculo era demasiado grande para ser representado en el formato numerico del BASIC. Si un desbordamiento ocurre, cero es dado como resultado y la ejecucion continua sin ningun mensaje de error. SN - SYNTAX ERROR le faltan los parentesis en una expresion, hay caracter ilegal en una linea, punctuacion incorrecta, etc. RG - RETURN WITHOUT GOSUB un RETURN fue encontrado antes de que un previo GOSUB fuese ejecutado. UL - UNDEFINED LINE la linea referenciada en un GOTO, GOSUB, o IF...THEN era una linea que no existe. /0 - DIVISION BY ZERO Puede darse con division de enteros y MOD asi como la division en coma flotante. 0 con potencia negativa tambien causa DIVISION BY ZERO. CN - CAN'T CONTINUE si se intenta continuar un programa inexistente, ha ocurrido un error, o si se ha modificado el programa. LS - STRING TO LONG se intento crear una cadena de mas de 255 caracteres de largo. OS - OUT OF STRING SPACE las variables de cadena exceden el monto de espacio libre para ellas. Use CLEAR para hacer mas espacio a las cadenas o use cadenas mas cortas o menos variables. ST - STRING FORMULA TOO COMPLEX una expresion de cadena era demasiado larga o demasiado compleja. Dividalas en dos o mas expresiones cortas. TM - TYPE MISMATCH la parte izq. de una asignacion era una variable numerica y la parte der. una cadena, o viceversa; o a una funcion que espera un argumento de cadena se le dio un calor numerico o viceversa. UF - UNDEFINED USER FUNCTION una referencia fue hecha a una funcion de usuario que nunca fue definida. Y hasta aquí el manual del Basic de Nascom, ahora paso a ver qué cosas descubro probando por mi cuenta con este programa. Lo que nos lleva a... Parte III El programa en si Tal como dice el sutor, es un interprete de solo BASIC. No acepta nada en codigo maquina y solo permite POKEar a la memoria de pantalla. LIST solo trabaja con 16 lineas de la pantalla y no con las 24 completas del Speccy. Tambien acepta ? como abraviacion de PRINT. Sobre el teclado El teclado del Nascom 1 solamente tiene una tecla SHIFT, un BACK Space y la tecla New Line. El del Nascom 2 y 3 en cambio, tiene 2 teclas SHIFT, CTRL, GRAPH, CS Back (en vez de Back Space), ESC ENTER (en lugar de New Line), LF CH y 4 teclas de cursores. Sobre el inicio Al cargar el programa, aparece la pregunta "Memory size?", al pulsar ENTER nos da el monto por defecto y sale en pantalla el sigte mensaje inicial: NASCOM ROM BASIC Ver 4.7 Copyright (C) 1978 by Microsoft 30199 Bytes free Ok - ahora el Basic esta plenamente cargado en el Spectrum y listo y a la espera de que uno ingrese algun comando. El listado al parecer se guarda tokenizado en la memoria a partir de la dir. 24826 (60FA), mientras en 24804 (60E4) a 24816 (60F0) se almacena el ultimo valor generado por comando directo. El espacio reservado para variables esta por 24672 (6060), pero esto supuestamente variara segun aumenten las vars. a usar. SAVE / LOAD con el emulador El programa salva, lee y verifica todo solamente a cinta. Ademas lo hace con un formato no estandar para el Spectrum, sino que es aparentemente el del Nascom mismo. CLOAD sin parametros carga lo primero que encuentra en cinta. El programa se encuentra dentro de un ZIP, al abrirlo encuentro la version de 48 car. y la de 80 car., un juego del ahorcado (hangman), un readme con el texto del autor que he traducido al comienzo y el programa para convertir los archivos .CAS que usan los emuladores de Nascom a un formato que puedan leer los emuladores de Spectrum, en este caso el .TAP. Se puede pasar a disco, pero una vez cargado, no hay modo de salvar nada a un disco a menos que sea uno con boton NMI (caso Disciple o +d) para copiar todo o uno tenga un multiface para hacer lo mismo (caso ZX IF1 o el Opus D.) Otros comandos MONITOR en Nascom sale del Basic y entra en el modo monitor del Nas-sys, pudiendo volver al Basic mediante J o Z, pero en el Spectrum me devuelve al Basic Sinclair. El unico dilema es que no parece haber modo de volver al Nascom. CLS borra la pantalla. SET(,) hace brillar o enciende el punto x,y RESET(,) si el punto x,y esta brillando, entonces RESET lo oscurece o apaga. POINT(,) funcion entera que devuelve 1 si el punto brilla o 0 sino. Nota: estos tres comandos son para uso opcion de graficos simples en el Nascom 1 o el Nascom 2 con juego de caracteres graficos. Los puntos pueden ser blancos o negros en una rejilla de 96 puntos de ancho por 48 de alto, con 0,0 en la esquina superior izq. X e Y deben estar en el rango de 0 a 95 y 0 a 47 respectivamente. Si Y esta en el rango 45 a 47, aparecera en la linea superior de la pantalla sin enrollar, de lo contrario descendera segun el valor Y se incremente. La linea en la que aparece un punto se calcula mediante: L = INT(Y*3)+1 y la columna o posicion de caracter con: C = INT(X*2)+1 Los caracteres que no sean simbolos graficos desde C0h a FFh son sobrescritos por SET e ignorados por RESET y POINT. En el Spectrum, debido a que puede usarse hasta 24 lineas en vez de las 16 del Nascom, 'Y' sobrepasa el limite de 47, siendo el maximo 62, mas alla de eso, se da un error B y me regresa al Basic Sinclair, sin posibilidad de volver. Conversion al Spectrum Gracias a este interprete podemos tener la experiencia de convertir al Speccy en un Nascom. Tambien podemos retipear los programas al Basic Sinclair y en este caso hacer uso de los sistemas de disco o microdrive. Si elegimos la conversion, entonces debemos tomar en cuenta la sintaxis de algunas sentencias como CLEAR, INPUT, IF o DIM. CSAVE* y CLOAD* son SAVE ... DATA y LOAD ... DATA mientras CSAVE, CLOAD y CLOAD? son SAVE, LOAD y VERIFY. Las funciones sin equivalente se pueden definir como es el caso de RIGHT$ o MID$. Mientras SET, RESET y POINT se pueden reemplazar con subrutinas que hagan lo mismo, como hice antes en el caso del TRS80 o Galaxia, asi como los PLOT y UNPLOT del ZX81. Si se usa el BetaBasic mejor aun. Y hasta aqui todo cuanto pude experimentar y probar con el Basic de Nascom. (c)2021-22 zx_if1@hotmail.com