CÓDIGOS DE OPERACION DEL LENGUAJE INTERPRETATIVO SX n 00-07 Intercambio de pila. Intercambia el byte superior de la pila computacional con esos "n" bytes en la pila. El byte superior de la pila se considera el byte 0, por lo que SX 0 no realiza ninguna acción. La secuencia de instrucciones SX 1 SX 3 SX 1 SX 2 puede usarse para intercambiar los dos primeros números (dos bytes cada uno) en la pila. Esta instrucción solo tiene acceso a los ocho primeros bytes de la pila. Si la pila está vacía, puede producirse o no una parada por error, dependiendo del intérprete de ML implementado. NO 08 Sin operación. Esto puede usarse para rellenar espacios (por ejemplo, para ignorar un salto). LB n 09nn Inserta un byte literal en la pila. Esto añade un byte a la pila computacional, que es el segundo byte de la instrucción. Se producirá una parada por error si la pila se desborda. LN n 0Annnn Insertar número literal. Esto añade los dos bytes siguientes a la pila computacional, como un número de 16 bits. El desbordamiento de pila resulta en una parada por error. DS 0B Número superior duplicado (dos bytes) en la pila. Se producirá una parada por error si hay menos de dos bytes en la pila de expresiones o si la pila se desborda. SP 0C Retirada de pila. Los dos primeros bytes se eliminan de la pila computacional y se descartan. El desbordamiento por debajo de la línea resulta en una parada por error. SB 10 Guardar puntero BASIC. Si el puntero BASIC apunta al búfer de línea de entrada, se copia al puntero guardado; de lo contrario, se intercambian los dos punteros. RB 11 Restaurar puntero de BASIC. Si el puntero guardado apunta al búfer de línea de entrada, se reemplaza por el valor del puntero BASIC; de lo contrario, se intercambian los dos punteros. Normalmente, el puntero guardado apunta al siguiente elemento del búfer de línea de entrada, mientras que el puntero BASIC apunta al programa en ejecución. Cuando se interpreta una instrucción INPUT en BASIC, el código de operación SB intercambia los dos punteros para que las capacidades de manejo de expresiones del intérprete se apliquen a los datos de entrada. Posteriormente, el RB restaura (intercambia de nuevo) los punteros. En ejecución directa (modo comando), el puntero BASIC ya está en el búfer de línea de entrada y el contenido del puntero guardado carece de significado; en este caso, la instrucción SB no altera el puntero BASIC, y el código de operación RB debería dejar ambos punteros apuntando al siguiente elemento de la cadena de entrada. FV 12 Obtener Variable. El byte superior de la pila computacional se utiliza para indexar la página 00. Se reemplaza por los dos bytes obtenidos. Se producen detenciones por error en caso de desbordamiento o subdesbordamiento de la pila. SV 13 Almacenar variable. Los dos primeros bytes de la pila computacional se almacenan en memoria en la dirección de la página 00 especificada por el tercer byte de la pila. Los tres bytes se eliminan de la pila. El subdesbordamiento provoca una detención por error. GS 14 Almacenar GOSUB. El número de línea de la línea BASIC actual se inserta en la región BASIC de la pila de control. Es esencial que la pila IL esté vacía para que esto funcione correctamente, pero no se realiza ninguna comprobación para esa condición. Se produce una detención por error en caso de desbordamiento de la pila. RS 15 Restaurar línea guardada. Se extraen los dos primeros bytes de la región BASIC de la pila de control, convirtiéndolos en el número de línea actual. Se establece el puntero BASIC al principio de esa línea. Tenga en cuenta que esta es la línea que contiene el GOSUB que provocó que se guardara el número de línea. Al igual que con el código de operación GS, es esencial que la región IL de la pila de control esté vacía. Si el número de línea extraído de la pila no corresponde a una línea del programa BASIC, se produce una parada por error. Una parada por error también se produce por un desbordamiento de la pila. GO 16 GOTO. Convierte en actual la línea BASIC cuyo número de línea es igual al valor de los dos primeros bytes de la pila de expresiones. Es decir, los dos primeros bytes se extraen de la pila computacional y se busca en el programa BASIC hasta encontrar un número de línea coincidente. El puntero BASIC se posiciona entonces al principio de esa línea y se activa el indicador de modo RUN. El desbordamiento de la pila y la inexistencia de una línea BASIC provocan paradas por error. NE 17 Negación (complemento a dos). El número en los dos primeros bytes de la pila de expresiones se reemplaza con su valor negativo. AD 18 Adición. Sumar los dos números representados por los cuatro primeros bytes de la pila de expresiones y reemplazarlos con la suma de dos bytes. El desbordamiento de la pila provoca una parada por error. SU 19 Substracción. Restar el número de dos bytes en la parte superior de la pila de expresiones de los dos bytes siguientes y reemplazar los cuatro bytes con la diferencia de dos bytes. Esto es exactamente equivalente a la secuencia de dos instrucciones NE AD y hace El mismo error de parada por subdesbordamiento. MP 1A Multiplicación. Multiplicar los dos números representados por los cuatro primeros bytes de la pila computacional y reemplazarlos con los 16 bits menos significativos del producto. Es posible un subdesbordamiento de la pila. DV 1B Dividir. Dividir el número representado por los dos primeros bytes de la pila computacional entre el representado por los dos siguientes. Reemplazar los cuatro bytes con el cociente y descartar el resto. Esta es una división de enteros con signo (complemento a dos), que resulta en un cociente entero con signo. Un subdesbordamiento de la pila o un intento de división por cero resultan en una parada por error. CP 1C Comparar El número en los dos primeros bytes de la pila de expresiones se compara con (se resta de) el número en el cuarto y quinto bytes de la pila, y el resultado se determina como mayor, igual o menor. Los tres bits inferiores del tercer byte enmascaran un salto condicional en el programa IL para probar estas condiciones; si el resultado corresponde a un bit, el siguiente byte del código IL se omite y no se ejecuta. Los tres bits corresponden a las siguientes condiciones: bit 0 Resultado es menor bit 1 Resultado es igual bit 2 Resultado es mayor Independientemente de si se realiza el salto, los cinco bytes se eliminan de la pila. Esta es una comparación con signo (complemento a dos), de modo que cualquier número positivo es mayor que cualquier número negativo. Múltiples condiciones, como mayor o igual que o desigual (es decir, mayor o menor que), se pueden probar formando el byte de máscara de condición con la suma de los bits respectivos. En particular, un byte de máscara de 7 forzará un salto incondicional y un byte de máscara de 0 no forzará ningún salto. Los otros cinco bits del byte de control se ignoran. El desbordamiento de pila resulta en una parada por error. NX 1D Siguiente instrucción BASIC. NX 1D Siguiente Declaración de BASIC. Avanza a la siguiente línea del programa BASIC si está en modo EJECUTAR, o reinicia el programa IL si está en modo de comando. El resto de la línea actual se ignora. En modo Ejecutar, si hay otra línea, se convierte en la actual con el puntero al principio. En este momento, si la condición de interrupción es verdadera, la ejecución se cancela y el programa IL se reinicia después de imprimir un mensaje de error. De lo contrario, la ejecución de IL continúa desde la dirección IL guardada (véase la instrucción XQ). Si no hay más instrucciones BASIC en el programa, se produce una parada por error. LS 1F Lista el Programa Se supone que la pila de expresiones tiene dos números de 2 bytes. El número superior es el número de línea de la última línea que se listará y el siguiente es el número de línea de la primera línea que se listará. Si los números de línea especificados no existen en el programa, se asume la siguiente línea disponible (es decir, la que tiene el número de línea inmediatamente superior). Si la última línea listada es anterior a la primera, no se lista ninguna línea. Si la condición de interrupción se cumple durante una operación de lista, se cancela el resto del listado. El cero no es un número de línea válido y se produce una parada por error si alguna de las especificaciones de número de línea es cero. Las especificaciones de número de línea se eliminan de la pila. PN 20 Imprime Número. El número representado por los dos primeros bytes de la pila de expresiones se imprime en decimal, suprimiendo los ceros iniciales. Si es negativo, va precedido de un signo menos (guión) y se imprime la magnitud. Es posible que se produzca un desbordamiento de pila. PQ 21 Imprime Cadena de BASIC. Los caracteres ASCII que comienzan con la posición actual del puntero BASIC se imprimen en la consola. La cadena a imprimir termina con comillas ("), y el puntero BASIC se deja en el carácter siguiente a la comilla terminal. Se produce una parada por error si se inserta un retorno de carro en la cadena. PT 22 Imprimir Tabulador. Imprime uno o más espacios en la consola, terminando en el siguiente múltiplo de ocho posiciones de caracteres (desde el margen izquierdo). NL 23 Nueva Línea. Emite una secuencia de retorno de carro y salto de línea a la consola. PC "xxxx" 24xxxxxxXx PC "xxxx" 24xxxxxxXx Imprimir Cadena Literal. La cadena ASCII sigue al código de operación y su último byte tiene el bit más significativo establecido en uno. La cadena de caracteres se envía a la consola sin modificaciones; es decir, se emiten los ocho bits de cada byte, de modo que solo el último byte se emite con el bit de paridad establecido en uno. Esto, por supuesto, puede ser modificado por la rutina de salida. GL 27 Obtener Línea de Entrada. Se aceptan caracteres ASCII desde la consola como Entrada para llenar el búfer de línea. Si la longitud de la línea excede el espacio disponible, se ignoran los caracteres sobrantes y se imprimen los caracteres de timbre. La línea termina con un retorno de carro. Los códigos NUL y DEL (hexadecimales 00 y FF) se ignoran; el salto de línea y DC3, respectivamente, activan y desactivan el "modo cinta". Cualquier carácter que coincida con el parámetro Retroceso elimina el carácter anterior en el búfer de línea, si lo hay; si el búfer de línea está vacío, el efecto es el de una cancelación. Cualquier carácter que coincida con el parámetro Cancelar almacena un retorno de carro en la primera posición del búfer de línea y finaliza la entrada. Al completar una línea de entrada, el puntero BASIC se configura para apuntar al primer carácter en el búfer de línea de entrada y se emite una secuencia de retorno de carro y avance de línea. IL 2A Insertar línea BASIC. Comenzando con la posición actual del puntero BASIC y continuando hasta el retorno de carro, la línea se inserta en el espacio de programa BASIC; para un número de línea, se utilizan los dos primeros bytes de la pila de expresiones. Si este número coincide con una línea ya existente en el programa, se elimina y la nueva la reemplaza. Si la nueva línea consta solo de un retorno de carro, no se inserta, aunque cualquier línea anterior con el mismo número se habrá eliminado. Las líneas se mantienen en el espacio de programa ordenadas por número de línea. Si la nueva línea que se va a insertar tiene un tamaño diferente al de la línea anterior que se va a reemplazar, el resto del programa se desplaza para dejar espacio o cerrar el hueco, según sea necesario. Si no hay memoria suficiente para la nueva línea, el espacio del programa no se modifica y se produce una parada por error (con la dirección IL decrementada). Una parada por error normal se produce si se produce un desbordamiento de la pila de expresiones o si el número es cero, que no es un número de línea válido. Tras completar la inserción, el programa IL se reinicia en modo comando. MT 2B Marca el espacio del programa de BASIC como Vacío. También borra la región BASIC de la pila de control y reinicia el programa IL en modo comando. Esta instrucción restablece los límites de memoria y los punteros de pila, lo que indica que el espacio del programa está vacío, y el número de línea de la primera línea se establece en cero, lo que indica el final del programa. El resto del programa no se altera, aunque ahora es vulnerable a la intrusión de la pila de control. El programa puede recuperarse si se borra accidentalmente almacenando un número de línea distinto de cero en los dos primeros bytes del espacio de programa BASIC y solicitando posteriormente una LISTA. Si esto se realiza en un medio legible por máquina, puede recargarse. Cualquier ejecución de la instrucción IL después de una instrucción MT destruirá el contenido de la memoria no comprendida por los límites del programa en las ubicaciones 0020-0025. XQ 2C Ejecutar. Activa el modo EJECUTAR. Esta instrucción también guarda el valor actual del contador del programa IL para su uso por la instrucción NX y establece el puntero BASIC al principio del espacio de programa BASIC. Si no hay ningún programa BASIC, se produce una parada por error. Esta instrucción debe ejecutarse al menos una vez antes de la primera ejecución de una instrucción NX. WS 2D Detener. Detiene la ejecución y reinicia el programa IL en el modo de comando. Esta instrucción también vacía toda la pila de control (incluida la región BASIC). Esta instrucción salta a la entrada de Inicio Caliente del intérprete ML. US 2E Llamada a Subrutina de Lenguaje Máquina. Los seis primeros bytes de la pila de expresiones contienen tres números con las siguientes interpretaciones: el primer número se carga en el registro A (o A y B); el siguiente número se carga en los 16 bits del registro Índice; el tercer número se interpreta como la dirección de una subrutina de lenguaje máquina que se llamará utilizando la secuencia normal de llamada de subrutina (simulada para este propósito por el intérprete ML). Estos seis bytes en la pila de expresiones se reemplazan con el resultado de 16 bits devuelto por la subrutina. Un desbordamiento de pila provoca una parada por error. RT 2F Retorno de Subrutina IL. La pila de control IL se vacía para obtener la dirección de la siguiente instrucción IL. Si toda la pila de control (IL y BASIC) está vacía, produce una parada por error. JS a 3000-37FF Llamada a Subrutina IL. Los once bits menos significativos de esta instrucción de 2 bytes se añaden a la dirección base del programa IL para determinar la dirección de la siguiente instrucción. El contenido anterior del contador del programa IL se introduce en la región IL de la pila de control. Un desbordamiento de pila provoca una parada por error. J a 3800-3FFF Salto. Los once bits menos significativos de esta instrucción de 2 bytes se añaden a la dirección base del programa IL para determinar la dirección de la siguiente instrucción IL. El contenido anterior del contador del programa IL se pierde. BR a 40-7F Rama Relativa. Los seis bits menos significativos de este código de operación de instrucción se añaden algebraicamente al valor actual del contador del programa IL para obtener la dirección de la siguiente instrucción IL. El bit 5 del código de operación es el signo, con + representado por 1 y - por 0. El rango de esta rama es de 31 bytes desde la dirección del byte siguiente al código de operación, en cualquier dirección. Un desplazamiento de cero (es decir, el código de operación 60) resulta en una parada de error. La operación de bifurcación es incondicional. BC a "xxx" 80xxxxXx-9FxxxxXx Rama de coincidencia de cadena. La cadena de caracteres ASCII en el IL que sigue a este código de operación se compara con la cadena que comienza con la posición actual del puntero BASIC, ignorando los espacios en blanco en el programa BASIC. La comparación continúa hasta que se encuentra una discrepancia o se alcanza un byte IL con el bit más significativo establecido en uno. Este es el último byte de la cadena en el IL y se compara como un carácter de 7 bits; si es igual, el puntero BASIC se posiciona después del último carácter coincidente en el programa BASIC y el programa IL continúa con la siguiente instrucción en secuencia. De lo contrario, el puntero BASIC no se modifica y los cinco bits inferiores del código de operación de rama se añaden al contador del programa IL para formar la dirección de la siguiente instrucción IL. Si las cadenas no coinciden y el desplazamiento de rama es cero, se produce una parada por error. BV A0-BF Bifurca si No es Variable. Si el siguiente carácter no en blanco al que apunta el puntero BASIC es una letra mayúscula, su código ASCII se duplica y se inserta en la pila de expresiones. El programa IL avanza a la siguiente instrucción en secuencia, dejando el puntero BASIC posicionado después de la letra; si no es una letra, se realiza la bifurcación y el puntero BASIC se deja apuntando a ese carácter. Se produce una parada por error si el siguiente carácter no es una letra y el desplazamiento de la bifurcación es cero, o en caso de desbordamiento de la pila. BN a C0-DF Bifurca si no es un número Si el siguiente carácter no en blanco al que apunta el puntero BASIC no es un dígito decimal, los cinco bits inferiores del código de operación se añaden al contador del programa IL; si es cero, se produce una parada por error. Si el siguiente carácter es un dígito, este y todos los dígitos decimales siguientes (ignorando los espacios en blanco) se convierten en un número binario de 16 bits que se inserta en la pila de expresiones. En cualquier caso, el puntero BASIC se posiciona en el siguiente carácter que no sea un espacio en blanco ni un dígito. Un desbordamiento de pila resultará en una parada de error. BE a E0-FF Bifurca si no es un caracter Endline. Si el siguiente carácter no en blanco al que apunta el puntero BASIC es un retorno de carro, el programa IL avanza a la siguiente instrucción en secuencia; de lo contrario, los cinco bits inferiores del código de operación (si no es cero) se suman al contador del programa IL para formar la dirección de la siguiente instrucción IL. En cualquier caso, el puntero BASIC se deja apuntando al primer carácter no en blanco encontrado; esta instrucción no omitirá el retorno de carro, que debe permanecer para la prueba de la instrucción NX. Al igual que con las otras ramas condicionales, la rama solo puede avanzar el contador del programa IL de 1 a 31 bytes; un desplazamiento de cero resulta en una parada de error.