/ HP-41 Advanced Programming Tips /
Como muitos sabem, no final da década de 1980, os microcalculadores programáveis compatíveis com B3-34 eram muito populares na URSS: MK-54, MK-61, MK-52 . Para eles, eles criaram programas, jogos, exploraram recursos não documentados, escreveram artigos. Eu mesma passei por isso no tempo devido. E recentemente eu pensei: mas nos EUA também deveria haver algo semelhante, próximo em espírito a tudo o que aconteceu em torno de nossas calculadoras programáveis. E sim - eu estava certo. Conheça o HP-41.
Como o B3-34, o HP-41 é uma calculadora programável RPN (RPN - notação polonesa reversa, cálculos na forma "2 2 +", não "2 + 2 =") com uma ideologia semelhante, mas muito mais funcional. Ele apareceu quase ao mesmo tempo que nosso B3-34 - 1979 e logo se tornou um ano cult: muitos programas foram escritos para ele, livros - incluindo sobre recursos não documentados, e até módulos adicionais ainda estão sendo lançados. Um total de 1,5 milhão dessas calculadoras foi produzido.
A um destino semelhante, podemos acrescentar que, assim como nosso MK-52 voou no Soyuz como um dispositivo de backup de computação, o HP-41 voou no Shuttle.
Embora existam três modificações do HP-41 (C, CV, CX), eles podem ser considerados totalmente compatíveis, uma vez que diferem muito ligeiramente - na verdade, apenas na quantidade de memória. As calculadoras HP com outros números não são compatíveis com a HP-41, embora tenham alguns recursos comuns.
Uma das características do HP-41 é um indicador de 14 segmentos, o que é bastante raro para calculadoras. Isso permite que você exiba letras e vários símbolos no HP-41, o que, junto com os módulos de som e expansão, é uma grande vantagem em relação ao B3-34.
A memória da HP-41C, do ponto de vista do usuário, é de 63 registros, 7 bytes cada. Nesse caso, você pode escolher quanto é usado para o programa e quanto para os dados. Módulos de expansão aumentam a memória disponível - digamos 82106A - são mais 64 registradores. No máximo, com a ajuda de tais módulos, você pode obter cerca de 2kb se ocupar todos os quatro slots.
O processador é próprio, específico. É mais comumente referido como NUT CPU, embora seja um nome genérico para vários processadores diferentes. Freqüência do relógio 0,35 MHz. Quanto à profundidade de bits, como costuma ser o caso das calculadoras, devido às especificidades da arquitetura, é difícil nomear o valor exato.
Além dos módulos de memória (para HP-41C), existem muitos outros módulos de expansão - bibliotecas de programas em ROM, um gravador / leitor de cartão magnético, leitor de código de barras, etc.
Junto com o modo de comando tradicional para todas as calculadoras, quando os cálculos são realizados diretamente, existem três maneiras de programar o HP-41.
O primeiro e principal é o idioma padrão da calculadora programável. Ideologicamente, é semelhante à linguagem B3-34 e, embora seja chamada de FOCAL, não tem nada a ver com a linguagem de programação de mesmo nome - a palavra significa “Forty One Calculator Language”. Os comandos FOCAL são, na verdade, chamadas a sub-rotinas em códigos de máquina - algo como instruções em uma máquina virtual, afiadas para cálculos, sistema decimal e ponto flutuante.
O segundo método, muito popular, é chamado de programação sintética e é um conjunto de extensões FOCAL não documentadas baseadas na exploração de uma vulnerabilidade no firmware da calculadora que permite a criação de novos comandos.
A terceira forma rara é programar diretamente nos códigos de máquina do microprocessador da calculadora, chamado MCODE. Este método é bastante complicado pelos motivos que serão discutidos a seguir.
Neste artigo, falarei principalmente sobre o primeiro método; os outros dois abordarei apenas brevemente.
Teclado e modo de comando
Apesar do indicador alfanumérico avançado, o teclado da calculadora é o mais comum. Isso, com um grande número de modos e funções diferentes, torna a entrada no programa e as operações com ele uma tarefa muito tediosa (bastante comparável ao das calculadoras compatíveis com B3-34).
Cada tecla tem três funções (em alguns casos, mais). Por exemplo, o botão "0", além do número 0, destina-se a inserir um espaço e o número Pi.
Nem todas as funções estão disponíveis por meio de combinações de botões - algumas precisam ser digitadas em letras, no modo "ALPHA". As letras são rotuladas na parte inferior dos botões na ordem "ABCDEF ...".
Devo dizer que o teclado é feito de altíssima qualidade. Uma técnica típica para hardware HP é usada - o botão tem um eixo na parte inferior e, quando pressionado, gira em torno dele. O indicador, apesar da falta de luz de fundo, também é bastante legível. Apenas a atualização lenta da imagem causa desgaste (o que provavelmente se deve a um processador lento).
É interessante que os operadores disponíveis através de uma combinação de botões também possam ser inseridos letra por letra. Por exemplo, um bipe ("BEEP") é obtido pressionando SHIFT 4, mas você pode pressionar o botão XEQ e, em seguida, ALPHA, soletrar a palavra "BEEP" e pressionar ALPHA novamente.
Na verdade, o XEQ (da palavra "executar") permite que você execute imediatamente qualquer função embutida ou chame uma existente na RAM ou ROM - inclusive em um módulo de expansão.
Uma lista de todas as funções realmente disponíveis na calculadora pode ser obtida via SHIFT CATALOG 3 (visualizar o controle via R / S, SST, BST)
Registra e trabalha com eles
Abaixo estamos falando sobre os registros diretamente acessíveis ao usuário da calculadora. Estes não são registros de microprocessador!
Registro ALPHA (A) - pode armazenar até 24 caracteres e seu conteúdo é exibido na tela.
0,1,2,3, ... - registradores de dados, podem armazenar um número ou até 6 caracteres (ou até 7 etapas do programa)
X, Y, Z, T - registradores de pilha (na verdade, também registradores de dados, mas organizados em exibição de pilha). X - topo.
L - o último, antes da alteração, o conteúdo do registro X é armazenado
PC - a etapa do programa atual
O visor geralmente mostra o conteúdo do registro X ou ALPHA, mas outros podem ser exibidos.
Se você apenas digitar um número no teclado, ele cairá no registro X (portanto, ele é exibido na tela).
Se você digitar uma string de caracteres no teclado (após pressionar o botão ALPHA), a string será colocada no registro ALPHA (da mesma forma, ela é exibida na tela).
Porém, a própria presença de qualquer informação na tela não significa que ela esteja no cadastro. Isso se aplica, por exemplo, a mensagens de erro e resultados VIEW. Eles meio que fecham o registro exibido no topo. Nesses casos, para apagar a mensagem sem alterar o conteúdo dos registros, use a tecla "<-".
No caso em que o conteúdo do registro é exibido na tela, a mesma tecla "<-" apaga seu conteúdo.
Pressionar ENTER coloca uma cópia do número na pilha. Ou seja, se você digitar 1 ENTER, então 1 aparecerá no registro X e no registro Y. Se você digitar 2, o registro X será 2, o registro Y será 1.
CLX limpa X, CLA limpa ALPHA
X <> Y troca o conteúdo de X e Y
+, -, *, / executa uma operação no conteúdo de X e Y e coloca o resultado em X, enquanto o que estava no registro Y é perdido e o que estava em X é colocado no registro L (pode ser copiado de volta para X com o comando LASTX se necessário).
RCL register_number - copia o conteúdo do registro de dados com o número especificado para X (ou seja, mapeia)
ARCL register_number - anexa o conteúdo do registro de dados com o número especificado ao registro ALPHA
ASHF muda o conteúdo do registro ALPHA para a esquerda em 6 caracteres (os 6 primeiros caracteres são perdidos).
Você pode visualizar o conteúdo do registro sem colocá-lo no X exibido. Para fazer isso, use o comando VIEW (para visualizar os registros da pilha) e AVIEW (para visualizar o registro ALPHA).
Deve-se notar que não há outras operações com strings no sistema de comando. E isso não é por acaso - o fato é que há tão pouca memória que trabalhar com strings, mesmo com um módulo de expansão de memória, não faz muito sentido. No entanto, existem módulos de extensão onde as operações de string são implementadas.
STO register_number - Copia o conteúdo do registro X para o registro de dados especificado
ASTO register_number - copia o conteúdo do registro ALPHA (apenas os primeiros 6 caracteres!)
Para o registro de dados especificado Para que RCL e STO funcionem com registros de pilha nomeados, adicione ".": STO .Z
O comando SIZE define o número de registros de dados que podem ser usados (respectivamente, o número de etapas disponíveis do programa aumenta ou diminui):
Quanto menor o SIZE, mais espaço para o código.
Para limpar toda a memória, você precisa ligar a calculadora segurando o botão "<-" e soltá-lo imediatamente após ligá-la. A mensagem "MEMORYLOST" deve aparecer (não muito estável).
Modo de programa
Mudar para o modo de programação (e voltar) - pressionando a tecla PRGM. Se não houver nenhum programa, "00 REG nn" será exibido. O número nn mostra o número de registros disponíveis para as etapas do programa (veja acima sobre SIZE). Conforme você digita o programa, a calculadora às vezes escreve PACKING para tentar compactar o código. Se não houver memória suficiente para o próximo comando, escreva TRY AGAIN.
Ao entrar em um programa, o passo atual é mostrado à esquerda. Uma etapa - um comando (não importa, digitado por uma tecla ou letra por letra). Mas deve-se ter em mente que uma etapa pode ocupar diferentes quantidades de memória - pouco se for um comando simples como o CLA, e muito se for, digamos, uma longa string de texto.
Movendo-se em etapas - SST (para frente) e BST (para trás). Excluindo a etapa atual - "<-".
O programa é iniciado no modo de comando (ou seja, PRGM deve ser pressionado novamente) com a tecla R / S. Ela também para.
No modo de programa, quase todas as funções disponíveis no modo de comando estão disponíveis. A entrada dos comandos marcados nas teclas é feita simplesmente pressionando. O restante dos comandos são inseridos por meio do XEQ. Por exemplo, para inserir o TOM 3, pressione XEQ, depois pressione ALPHA e, em seguida, digite TONE letra por letra, pressione ALPHA novamente e pressione 3.
Apagando o programa: rótulo CLP (apagado do rótulo para END)
Vá para uma etapa específica: GTO.002 (você deve primeiro sair do programa modo).
Vá para o início: SHIFT RTN
Você pode descobrir a posição atual no modo de comando pressionando e segurando a tecla R / S ou SST
Os rótulos, que podem ser acessados em seguida, são definidos por meio do "rótulo LBL" e são de dois tipos - global (nomes de texto, inseridos no modo ALPHA) e local (nomes de texto numéricos ou de uma letra). Os dígitos ocupam menos memória.
Vá para o rótulo "Rótulo GTP"
É útil sempre colocar um rótulo na primeira etapa do programa. Isso permite que você execute sem ir para o início todas as vezes - por meio de um rótulo XEQ ou um rótulo GTO.
Há também uma transição indireta para o GTO IND (os fãs da HP-41 citam isso como evidência de que a máquina de Turing está completa;).
No final do programa, GTO… é inserido (aparece a mensagem PACKING). Neste ponto, END aparece na tela
Por exemplo, um programa para multiplicar qualquer número por 2 se parece com este:
LBL "PRGNAME" 2 * END
Trabalhar com sub-rotinas (até seis aninhamentos são permitidos):
XEQ 04 ... LBL 04 ...... RTN
Ramos condicionais:
X=Y? 2 1
Neste exemplo, se X for igual a Y, então 2 é colocado na pilha (registro X). Caso contrário, 1
Em outras palavras, se a condição não for atendida, o comando após a verificação será ignorado. ISG
Loops
- Incrementar e ignorar se for maior
DSE - Diminuir e ignorar se for igual ou menor que
Exemplo
1.00301 STO 01 LBL 01 BEEP ISG 01 GTO 01
Este trecho pode ser usado em uma entrevista em vez de tampas de bueiros. Com a pergunta "Quantas vezes o BEEP será executado e por quê?" A resposta correta é 3 vezes.
Explicação: Os parâmetros de loop são especificados com um único número fracionário que é colocado na pilha. O número tem o formato iiiii.fffcc, onde:
iiii - o inicial, é o atual, valor do contador (índice),
fff - o valor final
cc - passo
Assim, 1,00301 significa a contagem de 1 a 3 com um passo de 1
Obviamente, uma solução tão peculiar permite que você salve memória, embora a legibilidade do código, digamos, sofra um pouco.
Um pouco sobre a exibição de strings:
AVIEW exibe o registro ALPHA, VIEW exibe o registro X.
O comando APPEND anexa os caracteres especificados a uma string no registro ALPHA. É inserido no teclado como SHIFT K, na fonte parece> "TEXTO"
Exemplo:
"HELLO WORLD!" ; ALPHA AVIEW ; PSE ; CLD ;
Quando a tela é limpa, o símbolo padrão "ganso voador" retorna para indicar que o programa está sendo executado. Se houver texto na tela, o ganso não aparecerá.
Embora a tela tenha espaços de 12 caracteres, o comprimento máximo da linha em uma etapa do programa é 15. Usando APPEND, você pode obter 24 (ou seja, o comprimento total do registro ALPHA). Quando uma linha longa é exibida na tela, ela rola automaticamente:
"1234567890" >"ABCDEFGHIJKLMN" AVIEW
Operações com strings são limitadas a três comandos:
ASTO X - coloca os primeiros 6 caracteres de ALPHA no registro especificado
ARCL X - anexa ao final de ALPHA uma string do registro especificado
ASHF - desloca ALPHA 6 caracteres para a esquerda (eles são perdidos)
Entrada de dados:
PROMPT - exibe o conteúdo do registro ALPHA e para o programa (respectivamente, você pode inserir algo e pressionar R / S, continuando a execução)
PSE - pausa a execução do programa por cerca de um segundo. Nesse caso, se números ou letras forem pressionados, a pausa é estendida por mais um segundo e o valor total é colocado em um registro para processamento posterior.
Sobre o som:
BEEP - reproduz uma sequência padrão das mesmas quatro notas
Número do TOM - um pequeno ruído de uma das 10 frequências (0 - mais baixo ... 9 - mais alto). As frequências são escolhidas de uma forma bastante estranha. Aparentemente, isso foi devido à economia de memória.
Uma explicação
«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
Dispositivos periféricos incluem módulos de expansão de memória, ROM com programas prontos, leitor / gravador de fita magnética (HP 82161A), cartões magnéticos (HP82104A), leitor de código de barras, porta infravermelha, impressora, plotter, relógio, interface HP-IL (via que pode conectar a calculadora a vários equipamentos) e muito mais.
Eu tenho um leitor / gravador de cartão magnético completo com HP-41. Os cartões são tiras de fita magnética sobre uma base de papel (o metrô de Moscou costumava ter um tipo semelhante de cartão de viagem).
Cada faixa tem duas faixas - ou seja, pode ser inserido com o lado esquerdo ou direito. 112 bytes cabem em cada lado. Um programa típico abrange vários cartões.
Você pode proteger a lateral do cartão de escrita cortando o canto.
Quando um módulo é inserido na calculadora, seu ROM é usado. Conseqüentemente, muitos novos comandos para trabalhar com mapas aparecem na calculadora. Você pode ler e escrever programas, registros, etc. Você pode até mesmo proteger o programa que está sendo gravado de ser visto (ou seja, você pode baixar e executá-lo, mas não pode ver o programa em si).
Aqui você pode ver como funciona a unidade de cartão magnético.
Infelizmente, este dispositivo não é confiável e consome muita bateria (alimentado pela própria calculadora). O meu não funcionou - zumbiu com um motor, mas não esticou a fita. Acontece que o rolo de pressão interno não apenas se desfez, mas desapareceu completamente, deixando para trás apenas uma gota de sujeira viscosa. Troquei o rolo por um feito em casa, mas obviamente estica a fita com dificuldade - você precisa ajustar o diâmetro com precisão. O problema é tão comum que o ebay chega a vender kits desses vídeos.
Outro dispositivo interessante. Também bastante comum entre os proprietários de HP-41 é um leitor de código de barras, que é usado, entre outras coisas, para baixar programas para a calculadora diretamente dos livros. Imagine - chega de dirigir programas pelo teclado! .. Tem a seguinte aparência:
Desenvolvimento
Claro, você pode escrever em FOCAL diretamente na calculadora. Mas isso é muito tedioso - é muito mais conveniente escrever o programa em um arquivo de texto. Mas com compiladores e emuladores, a situação é difícil. Todos eles são bastante estranhos e não muito estáveis. Daqueles que são executados no Win10, existem sim41 e v41 (v.7b). O primeiro é iniciado apenas a partir do Visual Runfox, mas tem um editor de programa separado (ou seja, não é necessário inseri-lo e editá-lo no teclado da calculadora).
O segundo é lançado sem prelúdios, emula muito melhor a calculadora (embora não no nível do hardware, o que é indicado, por exemplo, pela dessincronização do som com o código), mas o programa deve ser inserido completamente manualmente ou carregado como um binário .raw, que não é um código de máquina e a representação binária FOCAL). O problema é que para compilar uma fonte de texto em bruto, você terá que usar o utilitário HP41UC.EXE, que só pode ser executado no DOS. Usei o vDos com um arquivo em lote, tendo mapeado o diretório necessário para o disco usando f: c: \ tmp
Compilando a fonte em um binário:
hp41uc /t=test.txt /r=test.raw
Descompilando o binário em uma fonte:
hp41uc /r=text.raw / t = text.txt
Para ter uma ideia melhor da plataforma, escrevi uma pequena introdução de 256 bytes para a festa de demonstração DiHALT.
São 256 bytes, simplesmente porque a calculadora não caberia mais, mesmo com um módulo de expansão de RAM instalado. É claro que não se deve esperar nenhum efeito visual especial da calculadora. A saída de várias linhas é usada, incluindo a rolagem automática de linhas longas. Animação com um rosto - produza duas linhas em um loop. O DTMF é simulado de forma muito condicional, a música também é completamente diferente da original - devido ao facto de não ser possível escolher o tom ou a duração pretendidos. No entanto, ainda soa como música. No final, um recurso padrão de calculadora é usado - para exibir um "ganso voador" quando o processador está ocupado e o registro ALPHA está vazio.
Inicialmente, a introdução era duas vezes mais longa, mesmo usando sub-rotinas. Mas quando tudo foi depurado no emulador e comecei a colocar esse gabinete na calculadora, descobri que não cabia lá (esperava que o emulador relatasse falta de memória, mas não). Tive que encurtar e reescrever.
Aqui você pode ver as duas fontes.
Programação sintética
A programação sintética é uma técnica baseada na exploração de uma vulnerabilidade encontrada no editor do programa da calculadora. As instruções padrão regulares são codificadas na memória da calculadora em vários bytes. A vulnerabilidade permite (após um procedimento preparatório bastante complicado) alterar esses bytes, recebendo novas instruções com várias funcionalidades. Por exemplo, você pode obter mais sons do comando TONE do que o permitido por padrão. Você pode exibir mais caracteres (de um conjunto na ROM), acessar sinalizadores de sistema e uma série de outras coisas úteis. Novamente, é difícil e tedioso usar essa técnica na prática. É verdade que existem módulos com sub-rotinas que facilitam isso.
Podem surgir situações em que, como resultado de ações sintéticas incorretas ou imprecisas, a calculadora congela (por exemplo, não responde às teclas) até que seja necessário remover e inserir as baterias. Isso aconteceu comigo. É interessante que na literatura haja avisos de que, em alguns casos, para que a calculadora volte a ligar é necessário retirar as pilhas por dois dias (!).
Outro problema com as instruções sintéticas é que às vezes elas são compostas de caracteres não ASCII. Lá, surgem dificuldades específicas tanto com sua entrada quanto com a impressão de tal programa em uma impressora HP-41 padrão. Sim, até mesmo publicar tal programa em um livro ou revista já é um problema (geralmente, ao lado dos comandos, eles escrevem explicações de como devem ser entendidos). Uma das soluções para o problema é ler cada caractere usando um leitor de código de barras de uma tabela especial:
Na verdade, a programação sintética é muito próxima em espírito à "egogologia" das calculadoras compatíveis com B3-34. Como ilustração, você pode ver esta carta .
As pessoas até escreveram poesia sobre este assunto! (retirado de Programação sintética para a HP41C (WCWickes)
KEYBOARDLOCKY
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
'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 executado diretamente pelo microprocessador nas calculadoras HP-41 chamadas MCODE - é 5-120 vezes mais rápido que o FOCAL padrão.
Para ser executado na calculadora, o programa em MCODE deve ser escrito em ROM (ou em um emulador de ROM). Existem módulos especiais que permitem carregar o código via USB ou RS232 e até mesmo escrever no M-CODE diretamente na calculadora. Eles são chamados coletivamente de MLDL e são antigos, da própria HP, e modernos .
Dos cross-assemblers, encontrei apenas o antigo - para DOS.
Algumas palavras sobre a arquitetura do processador. Por ser voltado principalmente para a matemática, existem especificidades. Os registradores principais (e os registradores do processador não são os registradores usados no FOCAL!) A, B, C, N, M são de 56 bits.
Também existem registros mais curtos para sinalizadores, teclado, alto-falante, ponteiros, um contador de instruções de 16 bits e uma pilha de retorno de quatro níveis (quatro registros de 16 bits).
Na ROM, que é conectada ao processador por um barramento serial e onde o programa de controle da calculadora escrito em MCODE está localizado, os bytes têm 10 bits de largura. O processador endereça 64 K de ROM, dos quais 12 K são ocupados pelo sistema operacional. Quanto à RAM, ela não está mapeada no espaço de endereço e é um dispositivo periférico para o processador. Os bytes da RAM têm 8 bits de largura, mas logicamente o processador trata a RAM como registradores de 56 bits.
Como não escrevi em MCODE (estrangulado por um sapo por US $ 250 para um emulador de ROM), não posso compartilhar minha experiência pessoal de programação em MCODE.
As instruções lá são bastante tradicionais, embora muitos dos mnemônicos sejam bastante específicos. Por exemplo:
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 ;
Um MCODE aproximado análogo do 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
Quanto ao controle do indicador, seu controlador não permite ligar e desligar segmentos arbitrários - você pode exibir apenas os símbolos existentes no gerador de caracteres. Este também se tornou o motivo pelo qual eu não me preocupei com o emulador de ROM e programação em MCODE.
Para exibir os caracteres, você precisa selecionar o indicador pela instrução do processador PRPH SLCT FD e, em seguida, trabalhar com os registros do indicador via WRIT / READ
Epílogo
Para ser honesto, a lógica e o sistema de comando da calculadora são bastante confusos. Na minha opinião, para uma pessoa que pode dominar isso, não há problema em simplesmente escrever códigos de máquina de algum processador simples. Em nossas calculadoras compatíveis com B3-34, tudo, claro, também não é fácil, mas também existem muito menos possibilidades, razão pela qual não havia sentimento de tal confusão.
Basicamente, o argumento para empilhar pseudocódigo em cima de um microprocessador no HP-41 é a necessidade de cálculos matemáticos, já que, afinal, isso deve ser fácil para o usuário típico de calculadora.
O mesmo se aplica ao teclado - seria possível fazer um teclado alfanumérico regular imediatamente, sem pendurar comandos nos botões. Afinal, a funcionalidade de entrada de comando letra a letra já foi implementada (no entanto, calculadoras com um teclado completo logo começaram a ser produzidas).
Eu reuni várias documentações da HP41 em um arquivo, se alguém estiver interessado, você pode fazer o download (eu postei por um tempo, depois irei removê-la).