Arquitectura y programación de la microcalculadora HP-41

"... A menudo es necesario ejecutar una instrucción sintética de dos bytes desde el teclado. Esto puede ocurrir durante el uso diario del HP-41 ..."

/ Consejos de programación avanzada de HP-41 /






Como muchos saben, a fines de la década de 1980, las microcalculadoras programables compatibles con B3-34 eran muy populares en la URSS: MK-54, MK-61, MK-52 . Para ellos, crearon programas, juegos, exploraron características indocumentadas, escribieron artículos. Yo mismo pasé por esto a su debido tiempo. Y recientemente pensé: pero también en los EE. UU. Debería haber habido algo similar, cercano en espíritu a todo lo que sucedió alrededor de nuestras calculadoras programables. Y sí, tenía razón. Conozca el HP-41.



Como el B3-34, el HP-41 es una calculadora RPN programable (RPN - notación polaca inversa, cálculos en la forma "2 2 +", no "2 + 2 =") con una ideología similar, pero mucho más funcional. Apareció casi al mismo tiempo que nuestro B3-34 - 1979 y pronto se convirtió en un año de culto: se escribieron muchos programas para él, libros, incluso sobre funciones indocumentadas, e incluso módulos complementarios aún se están lanzando. Se produjeron un total de 1,5 millones de estas calculadoras.



A un destino similar, podemos agregar que, así como nuestro MK-52 voló en la Soyuz como un dispositivo informático de respaldo, también lo hizo el HP-41 en el Shuttle.



Aunque hay tres modificaciones de la HP-41 (C, CV, CX), pueden considerarse totalmente compatibles, ya que difieren muy ligeramente, de hecho, solo en la cantidad de memoria. Las calculadoras HP con otros números no son compatibles con la HP-41, aunque tienen algunas características comunes.



Una de las características de la HP-41 es un indicador de 14 segmentos, lo cual es bastante raro para las calculadoras. Esto le permite mostrar letras y varios símbolos en el HP-41, lo cual, junto con los módulos de sonido y expansión, es una gran ventaja sobre el B3-34.



La memoria HP-41C desde el punto de vista del usuario es de 63 registros, 7 bytes cada uno. En este caso, puede elegir cuánto se utiliza para el programa y cuánto para los datos. Los módulos de expansión aumentan la memoria disponible, digamos 82106A, que son 64 registros más. Como máximo, con la ayuda de dichos módulos, puede obtener aproximadamente 2 kb si ocupa las cuatro ranuras.



El procesador es propio, específico. Se le conoce más comúnmente como CPU NUT, aunque es un nombre genérico para varios procesadores diferentes. Frecuencia de reloj 0,35 MHz. En cuanto a la profundidad de bits, como suele ocurrir con las calculadoras, debido a las características específicas de la arquitectura, es difícil nombrar la cifra exacta.



Además de los módulos de memoria (para HP-41C), hay muchos otros módulos de expansión: bibliotecas de programas en ROM, un escritor / lector de tarjetas magnéticas, un lector de códigos de barras, etc.



Junto con el modo de comando tradicional para todas las calculadoras, cuando los cálculos se realizan directamente, hay tres formas de programar el HP-41.



El primero y principal es el lenguaje estándar de la calculadora programable. Ideológicamente, es similar al lenguaje B3-34 y, aunque se llama FOCAL, no tiene nada que ver con el lenguaje de programación del mismo nombre: la palabra significa “Forty One Calculator Language”. Los comandos FOCAL son, de hecho, llamadas a subrutinas en códigos de máquina, algo así como instrucciones en una máquina virtual, perfeccionadas para cálculos, sistema decimal y punto flotante.



El segundo método, muy popular, se llama programación sintética y es un conjunto de extensiones FOCAL no documentadas basadas en explotar una vulnerabilidad en el firmware de la calculadora que permite crear nuevos comandos.



La tercera forma poco común es programar directamente en los códigos de máquina del microprocesador de la calculadora, llamado MCODE. Este método es bastante complicado por las razones que se comentarán a continuación.



En este artículo, hablaré principalmente sobre el primer método, los otros dos los mencionaré brevemente.



Modo teclado y comando



A pesar del indicador alfanumérico avanzado, el teclado de la calculadora es el más común. Eso, con una gran cantidad de modos y funciones diferentes, hace que ingresar a un programa y operar con él sea una tarea muy tediosa (bastante comparable a la de las calculadoras compatibles con B3-34).



Cada tecla tiene tres funciones (en algunos casos más). Por ejemplo, el botón "0", además del número 0, está destinado a introducir un espacio y el número Pi.

No todas las funciones están disponibles a través de combinaciones de botones; algunas deben escribirse con letras, en el modo "ALPHA". Las letras están etiquetadas en la parte inferior de los botones en el orden "ABCDEF ...".





Debo decir que el teclado está hecho de muy alta calidad. Se utiliza una técnica típica para el hardware de HP: el botón tiene un eje en la parte inferior y cuando se presiona gira alrededor de él. El indicador, a pesar de la falta de retroiluminación, también es bastante legible. Solo la actualización lenta de la imagen es estresante (lo que probablemente se deba a un procesador lento).



Es interesante que los operadores disponibles mediante una combinación de botones se puedan ingresar letra por letra. Por ejemplo, el bip ("BEEP") se obtiene presionando SHIFT 4, pero puede presionar el botón XEQ, luego ALPHA, deletrear la palabra "BEEP", presione ALPHA nuevamente.



En realidad, XEQ (de la palabra "ejecutar") le permite ejecutar inmediatamente cualquier función incorporada o llamar a una existente en RAM o ROM, incluso en un módulo de expansión.



Se puede obtener una lista de todas las funciones realmente disponibles en la calculadora a través de SHIFT CATALOG 3 (control de vista a través de R / S, SST, BST)



Regístrese y trabaje con ellos



A continuación hablamos de los registros directamente accesibles al usuario de la calculadora. ¡Estos no son registros de microprocesador!



Registro ALPHA (A): puede almacenar hasta 24 caracteres y su contenido se muestra en la pantalla.

0,1,2,3, ... - registros de datos, pueden almacenar un número o hasta 6 caracteres (o hasta 7 pasos de programa)

X, Y, Z, T - registros de pila (de hecho, también registros de datos, pero organizados en vista de pila). X - arriba.

L - el último, antes del cambio, se almacena el contenido del registro X

PC - el paso actual del programa



La pantalla generalmente muestra el contenido del registro X o ALPHA, pero se pueden mostrar otros.



Si simplemente escribe un número en el teclado, cae en el registro X (en consecuencia, se muestra en la pantalla).

Si escribe una cadena de caracteres en el teclado (después de presionar el botón ALPHA), entonces la cadena se coloca en el registro ALPHA (de manera similar, se muestra en la pantalla).



Sin embargo, la sola presencia de cualquier información en la pantalla no significa que esté en el registro. Esto se aplica, por ejemplo, a los mensajes de error y a VER resultados. Cierran el registro mostrado en la parte superior. En tales casos, para borrar el mensaje sin cambiar el contenido de los registros, use la tecla "<-".

En el caso de que el contenido del registro se muestre en la pantalla, la misma tecla "<-" borra su contenido.



Al presionar ENTER, se empuja una copia del número a la pila. Es decir, si escribe 1 ENTER, aparecerá 1 tanto en el registro X como en el registro Y. Si luego escribe 2, el registro X será 2, el registro Y será 1.



CLX borra X, CLA borra ALPHA



X <> Y intercambia el contenido de X e Y

+, -, *, / realiza una operación sobre el contenido de X e Y y coloca el resultado en X, mientras que lo que estaba en el registro Y se pierde, y lo que estaba en X se coloca en el registro L (se puede copiar de nuevo a X con el comando LASTX si es necesario).



RCL register_number: copia el contenido del registro de datos con el número especificado a X (es decir, lo asigna)

ARCL register_number: agrega el contenido del registro de datos con el número especificado al registro ALPHA



ASHF desplaza el contenido del registro ALPHA dejado por 6 caracteres (los primeros 6 caracteres se pierden).



Puede ver el contenido del registro sin colocarlo en la X que se muestra.Para hacer esto, use el comando VIEW (para ver los registros de la pila) y AVIEW (para ver el registro ALPHA).



Se debe tener en cuenta que no hay otras operaciones con cadenas en el sistema de comandos. Y esto no es una coincidencia, el hecho es que hay tan poca memoria que trabajar con cadenas, incluso con un módulo de expansión de memoria, no tiene mucho sentido. Sin embargo, existen módulos de extensión donde se implementan operaciones de cadena.



STO register_number: copia el contenido del registro X en el registro de datos especificado

ASTO register_num - copia el contenido del registro ALPHA (¡solo los primeros 6 caracteres!) En el registro de datos especificado



Para que RCL y STO funcionen con registros de pila con nombre, agregue ".": STO .Z



El comando SIZE establece el número de registros de datos que se pueden usar (respectivamente, el número de pasos de programa disponibles aumenta o disminuye):

Cuanto menor sea el TAMAÑO, más espacio para el código.



Para borrar toda la memoria, debe encender la calculadora manteniendo presionado el botón "<-" y, después de encenderla, suéltelo inmediatamente. Debería aparecer el mensaje "MEMORYLOST" (no muy estable).



Modo de programa



Cambiar al modo de programación (y volver) - presionando la tecla PRGM. Si no hay ningún programa, se muestra "00 REG nn". El número nn muestra el número de registros disponibles para los pasos del programa (consulte más arriba sobre TAMAÑO). A medida que escribe el programa, la calculadora a veces escribe PACKING para intentar compactar el código. Si no hay suficiente memoria para el siguiente comando, escriba INTENTAR OTRA VEZ.



Al ingresar a un programa, el paso actual se muestra a la izquierda. Un paso, un comando (no importa, ingresado con una tecla o letra por letra). Pero debe tenerse en cuenta que un paso puede ocupar una cantidad diferente de memoria: poco si es un comando simple como CLA, y mucho si es, digamos, una cadena de texto larga.

Moviéndose en pasos: SST (hacia adelante) y BST (hacia atrás). Eliminando el paso actual - "<-".



El programa se inicia desde el modo de comando (es decir, PRGM debe presionarse nuevamente) con la tecla R / S. Ella también se detiene.



Casi todas las funciones disponibles en el modo de comando están disponibles en el modo de programa. La introducción de los comandos que están marcados en las teclas se realiza simplemente presionando. El resto de los comandos se ingresan a través de XEQ. Por ejemplo, para ingresar TONE 3, presione XEQ, luego presione ALPHA, luego escriba TONE letra por letra, presione ALPHA nuevamente y luego presione 3.



Borrando el programa: etiqueta CLP (borrada de la etiqueta a END)



Vaya a un paso específico: GTO.002 (primero debe salir del programa modo).

Ir al principio: SHIFT RTN



Puede averiguar la posición actual desde el modo de comando presionando y manteniendo presionada la tecla R / S o SST



Las etiquetas, a las que luego se puede saltar, se establecen a través de la "etiqueta LBL" y son de dos tipos: globales (nombres de texto, ingresados ​​en modo ALPHA) y locales (nombres de texto numéricos o de una sola letra). Los dígitos ocupan menos memoria.

Ir a la etiqueta "Etiqueta GTP"



Es útil poner siempre una etiqueta en el primer paso del programa. Esto le permite ejecutarlo sin tener que ir al principio cada vez, a través de una etiqueta XEQ o una etiqueta GTO.



También hay una transición indirecta a GTO IND (los fanáticos de HP-41 citan esto como evidencia de que la máquina de Turing está completa).



Al final del programa, se ingresa GTO… (aparece el mensaje EMBALAJE). En este punto, aparece END en la pantalla.



Por ejemplo, un programa para multiplicar cualquier número por 2 se ve así:



LBL "PRGNAME"
2
*
END

      
      





Trabajar con subrutinas (se permiten hasta seis anidamientos):



XEQ 04
...
LBL 04
......
RTN

      
      





Ramas condicionales:



X=Y?
2
1

      
      





En este ejemplo, si X es igual a Y, entonces se empuja 2 a la pila (registro X) De lo contrario 1

En otras palabras, si la condición no se cumple, entonces se omite el comando que sigue a la verificación.



Lazos



ISG: aumentar y omitir si es mayor

DSE: disminuir y omitir si es igual o menor que



Ejemplo



1.00301
STO 01
LBL 01     
BEEP
ISG 01     
GTO 01     

      
      





Este fragmento se puede utilizar en una entrevista en lugar de tapas de alcantarilla. Con la pregunta "¿Cuántas veces se ejecutará BEEP y por qué?" La respuesta correcta es 3 veces.



Explicación: Los parámetros de bucle se especifican con un único número fraccionario que se inserta en la pila. El número tiene el formato iiiii.fffcc, donde:



iiii - el inicial, es el actual, valor del contador (índice),

fff - el valor final

cc - paso



Por lo tanto, 1.00301 significa el conteo de 1 a 3 con un paso de 1

Obviamente, una solución tan peculiar le permite guardar memoria, aunque la legibilidad del código, digamos, sufre un poco.



Un poco sobre mostrar cadenas:



AVIEW muestra el registro ALPHA, VIEW muestra el registro X.



El comando APPEND agrega los caracteres especificados a una cadena en el registro ALPHA. Se ingresa desde el teclado como SHIFT K, en la fuente se ve como> "TEXTO"



Ejemplo:



"HELLO WORLD!"	;   ALPHA 
AVIEW ;   
PSE ;  
CLD ;  

      
      





Cuando se borra la pantalla, el símbolo estándar de "ganso volador" vuelve a indicar que el programa se está ejecutando. Si hay texto en la pantalla, el ganso no aparece.



Aunque la pantalla tiene 12 espacios de caracteres, la longitud máxima de línea en un paso del programa es 15. Con APPEND, puede obtener 24 (es decir, la longitud completa del registro ALPHA). Cuando se muestra una línea larga en la pantalla, se desplazará automáticamente:



"1234567890"
>"ABCDEFGHIJKLMN"
AVIEW

      
      





Las operaciones con cadenas están limitadas a tres comandos:

ASTO X - coloca los primeros 6 caracteres de ALPHA en el registro especificado

ARCL X - agrega al final de ALPHA una cadena del registro especificado

ASHF - desplaza ALPHA 6 caracteres a la izquierda (se pierden)



Entrada de datos:



PROMPT - muestra el contenido del ALPHA registra y detiene el programa (respectivamente, puede ingresar algo y presionar R / S, continuando así la ejecución)

PSE - pausa la ejecución del programa durante aproximadamente un segundo. En este caso, si se presionaron números o letras, la pausa se extiende por otro segundo y el valor total se coloca en un registro para su procesamiento posterior.



Sobre el sonido:



BEEP: reproduce una secuencia estándar de las mismas cuatro notas.

Número de TONO: un breve chirrido de una de las 10 frecuencias (0 - la más baja ... 9 - la más alta). Las frecuencias se eligen de una forma bastante extraña. Aparentemente, esto se debió al ahorro de memoria.



Una explicacion
«The biggest problem is the fact that the high or low time of the signal driving the piezo element has to be a multiple of the instruction cycle time. This cycle time is nominally 155.6uS. So, for example TONE 9 has a three-instruction low and high time, giving a frequency of 1071Hz. TONE 8 has a four-instruction low and high time, giving a frequency of 803Hz. TONE 7 has a five-instruction low and high time, giving a frequency of 643Hz. These tones are individually coded. The remainder of the tones use a common routine to save code space. This common routine is 6+n instruction time long (for each phase of the piezo drive). And n is set by the TONE number as follows: TONE 6 has n=2, TONE 5 has n=4, and so on, down to TONE 0 with n=14. So, you could get better control at the low end of the frequency range, but it would take more code space. I guess that what they came up with was a reasonable compromise.»





Periferia



Los dispositivos periféricos incluyen módulos de expansión de memoria, ROM con programas prefabricados, lector / grabador de cinta magnética (HP 82161A), tarjetas magnéticas (HP82104A), lector de código de barras, puerto de infrarrojos, impresora, trazador, reloj, interfaz HP-IL (a través de que puede conectar la calculadora a varios equipos) y más.



Tengo un lector / grabador de tarjetas magnéticas completo con HP-41. Las tarjetas son tiras de cinta magnética sobre una base de papel (el metro de Moscú solía tener un tipo similar de tarjeta de viaje).





Cada tira tiene dos pistas, es decir, se puede insertar con el lado izquierdo o derecho. 112 bytes caben en cada lado. Un programa típico abarca varias tarjetas.

Puede proteger el lado de la tarjeta de escritura cortando la esquina.

Cuando se inserta un módulo en la calculadora, se utiliza su ROM. En consecuencia, en la calculadora aparecen muchos comandos nuevos para trabajar con mapas. Puede leer y escribir programas, registros, etc. Incluso puede proteger el programa que se está grabando para que no se vea (es decir, puede descargarlo y ejecutarlo, pero no puede ver el programa en sí).



Aquí puede ver cómo funciona la unidad de tarjeta magnética.



Desafortunadamente, este dispositivo no es confiable y consume mucha batería (alimentado por la calculadora). El mío no funcionó: zumbaba con un motor, pero no estiró la cinta. Resultó que el rodillo de presión en el interior no solo se derrumbó, sino que desapareció por completo, dejando solo una gota de suciedad viscosa. Cambié el rodillo por uno casero, pero obviamente estira la cinta con dificultad; necesita ajustar con precisión el diámetro. El problema es tan común que eBay incluso vende kits de estos videos.



Otro dispositivo interesante. También es bastante común entre los propietarios de HP-41 un lector de códigos de barras, que se utiliza, entre otras cosas, para descargar programas a la calculadora directamente desde los libros. Imagínese, ¡no hay que conducir mucho en programas desde el teclado! .. Se ve así:







Desarrollo



Por supuesto, puede escribir en FOCAL directamente en la calculadora. Pero esto es bastante tedioso, es mucho más conveniente escribir el programa en un archivo de texto. Pero la situación con compiladores y emuladores es complicada. Todos ellos son bastante extraños y poco estables. De los que se ejecutan en Win10, hay sim41 y v41 (v.7b). El primero se inicia solo desde Visual Runfox, pero tiene un editor de programa separado (es decir, no es necesario ingresarlo y editarlo desde el teclado de la calculadora).

El segundo se lanza sin preludios, emula mucho mejor a la calculadora (aunque no a nivel de hardware, que se indica, por ejemplo, por la desincronización del sonido con el código), pero el programa debe ser ingresado o bien de forma completamente manual, o bien cargado como binario .raw, que no es código máquina. , y la representación binaria FOCAL). El problema es que para compilar una fuente de texto en bruto, tendrá que usar la utilidad HP41UC.EXE, que solo se puede ejecutar desde DOS. Usé vDos con un archivo por lotes, habiendo mapeado el directorio requerido al disco mediante el uso de f: c: \ tmp



Compilando la fuente en un binario:

hp41uc /t=test.txt /r=test.raw Descompilando



el binario en una fuente:

hp41uc /r=text.raw / t = texto.txt



Para tener una mejor idea de la plataforma, escribí una pequeña introducción de 256 bytes para la fiesta de demostración de DiHALT.





Son 256 bytes, simplemente porque la calculadora no cabría más, incluso con un módulo de expansión RAM instalado. Está claro que no se deben esperar efectos visuales especiales de la calculadora. Se utiliza la salida de varias líneas, incluido el desplazamiento automático de líneas largas. Animación con una cara: salida de dos líneas en un bucle. DTMF se simula de manera muy condicional, la música también es completamente diferente de la original, debido al hecho de que no será posible elegir la clave o la duración deseadas. Sin embargo, todavía suena a música. Al final, se utiliza una función de calculadora estándar: para mostrar un "ganso volador" cuando el procesador está ocupado y el registro ALPHA está vacío.



Inicialmente, la introducción fue dos veces más larga, incluso usando subrutinas. Pero cuando todo se depuró en el emulador y comencé a llevar este asunto a la calculadora, resultó que no encajaba allí (esperaba que el emulador reportara falta de memoria, pero no). Tuve que acortar y reescribir.



Aquí puedes ver ambas fuentes.



Programación sintética



La programación sintética es una técnica basada en la explotación de una vulnerabilidad que se encuentra en el editor de programas de la calculadora. Las instrucciones estándar regulares están codificadas en la memoria de la calculadora en varios bytes. La vulnerabilidad permite (después de un procedimiento preparatorio bastante complicado) cambiar estos bytes, recibiendo nuevas instrucciones con varias funcionalidades. Por ejemplo, puede obtener más sonidos del comando TONE de los permitidos por defecto. Puede mostrar más caracteres (de un conjunto en ROM), acceder a las banderas del sistema y una serie de otras cosas útiles. Una vez más, es difícil y tedioso utilizar esta técnica en la práctica. Es cierto que hay módulos con subrutinas que facilitan esto.





Pueden surgir situaciones en las que, como resultado de acciones sintéticas incorrectas o inexactas, la calculadora se congele (por ejemplo, no responderá a las teclas) hasta que sea necesario quitar e insertar las pilas. Esto me ha pasado. Es interesante que en la literatura haya advertencias de que, en algunos casos, para que la calculadora se encienda nuevamente, las baterías deben sacarse durante dos días (!).



Otro problema con las instrucciones sintéticas es que a veces se componen de caracteres que no son ASCII. Allí, surgen dificultades específicas tanto con su entrada como con la impresión de dicho programa en una impresora HP-41 estándar. Sí, incluso la publicación de un programa de este tipo en un libro o revista es todo un problema (por lo general, junto a los comandos, escriben explicaciones de cómo deben entenderse). Una de las soluciones al problema es leer cada carácter usando un lector de código de barras de una mesa especial:







En realidad, la programación sintética está muy cerca en espíritu de la "egogología" en las calculadoras compatibles con B3-34. Como ilustración, puedes ver esta carta .



¡La gente incluso escribió poesía sobre este tema! (tomado de Programación sintética para HP41C (WCWickes)



BLOQUEO DEL TECLADO
KEYBOARDLOCKY



'Twas octal, and the synthetic codes

were scanned without a loss.

In and out of PRGM mode,

Byte-jumpers nybbled the CMOS.



«Beware 0 STO c, my son,

The MEMORY LOST, the keyboard lock.

Beware the NNN, and shun

The curious phase 1 clock.»



He took his black box codes in hand,

Long time the backwards goose he sought;

The secret beast from Aitchpee land--

All searches came to nought.



In demented thought he stood, and then:

The goose, with LCD's alight,

A leap for every LBL 10,

Came honking left-to-right!



STO b! STO d!, and RCL P!

His keyboard went clickety-clack.

With the proper code in number mode

The goose came flapping back.



«And hast thou found the phantom fowl?

Come to my arms, my binary boy.

Let Corvallis hear us howl

As we chortle in our joy!»



'Twas octal, and the synthetic codes

Were scanned without a loss.

In and out of PRGM mode,

Byte-jumpers nybbled the CMOS.



--Apologies to Lewis Carroll





MCODE



Código de máquina ejecutado directamente por el microprocesador en calculadoras HP-41 llamado MCODE - es 5-120 veces más rápido que el FOCAL estándar.



Para ejecutar en la calculadora, el programa en MCODE debe escribirse en ROM (o en un emulador de ROM). Hay módulos especiales que le permiten cargar código a través de USB o RS232 e incluso escribir en M-CODE directamente en la calculadora. Se denominan colectivamente MLDL y son antiguos, de la propia HP, y modernos .

De los ensambladores cruzados, encontré solo el antiguo: para DOS.



Algunas palabras sobre la arquitectura del procesador. Dado que se centra principalmente en las matemáticas, existen especificidades. Los registros principales (¡y los registros del procesador no son los registros utilizados en FOCAL!) A, B, C, N, M son de 56 bits.

También hay registros más cortos para banderas, teclado, altavoz, punteros, un contador de instrucciones de 16 bits y una pila de retorno de cuatro niveles (cuatro registros de 16 bits).



En la ROM, que está conectada al procesador por un bus serie y donde se encuentra el programa de control de la calculadora escrito en MCODE, los bytes tienen 10 bits de ancho. El procesador direcciona 64K de ROM, de los cuales 12K están ocupados por el sistema operativo. En cuanto a la RAM, no está asignada al espacio de direcciones y es un dispositivo periférico para el procesador. Los bytes de RAM tienen un ancho de 8 bits, pero lógicamente el procesador trata a la RAM como registros de 56 bits.



Como no escribí en MCODE (estrangulado por un sapo por $ 250 para un emulador de ROM), no puedo compartir mi experiencia personal de programación en MCODE.



Las instrucciones son bastante tradicionales, aunque muchos de los mnemónicos son bastante específicos. Por ejemplo:



B=A	;    A  B
A<>C	;   A  C
A=A+B 	;  A  B     A
A=B=C=0	;  0   A,B,C
C=0 M	;  0   ( 3-12)  C
?A<C	;   ,  A  C
JC -02	;   ,    
READ n	;     ( 1  15)   C
PUSH addr	;     
GOSUB 815B ;   

      
      







Un análogo MCODE aproximado del comando FOCAL TONE n:



178 C=REG 5/M	; recalls status register M
358 ST=C	; rightmost byte (nybbles 1 and 0 ) are loaded in status bits (flags 0 to 7)
379 *
05A NCGO 16DE ;     XTONE  

      
      





En cuanto al control del indicador, su controlador no permite encender y apagar segmentos arbitrarios; puede mostrar solo los símbolos existentes en el generador de caracteres. Esta también se convirtió en la razón por la que no me molesté con el emulador de ROM y la programación en MCODE.



Para mostrar caracteres, debe seleccionar el indicador mediante la instrucción del procesador PRPH SLCT FD y luego trabajar con los registros del indicador a través de WRIT / READ



Epílogo



Para ser honesto, la lógica y el sistema de comandos de la calculadora son bastante confusos. En mi opinión, para una persona que puede dominar esto, no hay problema simplemente para escribir en códigos de máquina de algún procesador simple. En nuestras calculadoras compatibles con B3-34, todo, por supuesto, tampoco es fácil, pero hay muchas menos posibilidades, por lo que no había sensación de tanta confusión.

Básicamente, el argumento para apilar pseudocódigo sobre un microprocesador en la HP-41 es la necesidad de cálculos matemáticos, ya que, después de todo, esto debería ser fácil para el usuario típico de una calculadora.



Lo mismo se aplica al teclado: sería posible crear un teclado alfanumérico normal de inmediato, sin colgar comandos en los botones. Después de todo, la funcionalidad de la entrada de comandos letra por letra ya se ha implementado (sin embargo, pronto comenzaron a producirse calculadoras con un teclado completo).



He recopilado varios documentos de HP41 en un archivo, si alguien está interesado, puede descargarlo (lo publiqué por un tiempo, luego lo eliminaré).



All Articles