Architektur und Programmierung des HP-41-Rechners

"... Oft müssen Sie eine synthetische Zwei-Byte-Anweisung über die Tastatur ausführen. Dies kann bei Ihrem täglichen Benutzer des HP-41 auftreten ..."

/ HP-41 Advanced Programming Tips /






Wie viele wissen, waren in den späten 1980er Jahren programmierbare Mikrorechner, die mit B3-34 kompatibel waren, in der UdSSR sehr beliebt: MK-54, MK-61, MK-52 . Für sie erstellten sie Programme, Spiele, erkundeten undokumentierte Funktionen und schrieben Artikel. Ich selbst habe das zu gegebener Zeit durchgemacht. Und erst kürzlich dachte ich: Aber auch in den USA hätte es etwas Ähnliches geben sollen, das im Geist zu allem ist, was um unsere programmierbaren Taschenrechner herum passiert ist. Und ja - ich hatte recht. Lernen Sie den HP-41 kennen.



Wie der B3-34 ist der HP-41 ein programmierbarer RPN-Rechner (RPN - umgekehrte polnische Notation, Berechnungen in der Form "2 2 +", nicht "2 + 2 =") mit einer ähnlichen Ideologie, aber viel funktionaler. Es erschien fast zeitgleich mit unserer B3-34 - 1979 und wurde bald zu einem Kultjahr: Viele Programme wurden dafür geschrieben, Bücher - einschließlich über undokumentierte Funktionen, und sogar Zusatzmodule werden noch veröffentlicht. Insgesamt wurden 1,5 Millionen dieser Taschenrechner hergestellt.



Zu einem ähnlichen Schicksal können wir hinzufügen, dass genau wie unser MK-52 auf der Sojus als Backup-Computer geflogen ist, auch der HP-41 auf dem Shuttle geflogen ist.



Obwohl es drei Modifikationen des HP-41 (C, CV, CX) gibt, können sie als vollständig kompatibel angesehen werden, da sie sich nur geringfügig unterscheiden - tatsächlich nur in der Speichermenge. HP Taschenrechner mit anderen Zahlen sind nicht mit dem HP-41 kompatibel, obwohl sie einige gemeinsame Funktionen haben.



Eines der Merkmale des HP-41 ist ein 14-Segment-Indikator, der für Taschenrechner eher selten ist. Auf diese Weise können Sie Buchstaben und verschiedene Symbole auf dem HP-41 anzeigen, was zusammen mit Sound- und Erweiterungsmodulen ein großer Vorteil gegenüber dem B3-34 ist.



Der HP-41C-Speicher besteht aus Anwendersicht aus 63 Registern mit jeweils 7 Byte. In diesem Fall können Sie auswählen, wie viel für das Programm und wie viel für die Daten verwendet wird. Erweiterungsmodule erhöhen den verfügbaren Speicher - sagen wir 82106A - das sind 64 weitere Register. Mit Hilfe solcher Module können Sie maximal 2 KB erhalten, wenn Sie alle vier Steckplätze belegen.



Der Prozessor ist spezifisch. Es wird am häufigsten als NUT-CPU bezeichnet, obwohl dies ein generischer Name für mehrere verschiedene Prozessoren ist. Taktfrequenz 0,35 MHz. Was die Bittiefe betrifft, wie es bei Taschenrechnern häufig der Fall ist, ist es aufgrund der Besonderheiten der Architektur schwierig, die genaue Zahl zu benennen.



Neben Speichermodulen (für HP-41C) gibt es viele weitere Erweiterungsmodule - Programmbibliotheken im ROM, einen Magnetkartenschreiber / -leser, einen Barcodeleser usw.



Neben dem herkömmlichen Befehlsmodus für alle Taschenrechner gibt es auch Berechnungen, wenn Berechnungen direkt ausgeführt werden Drei Möglichkeiten zum Programmieren des HP-41.



Die erste und wichtigste ist die Standardsprache des programmierbaren Rechners. Ideologisch ähnelt es der Sprache B3-34 und hat, obwohl es FOCAL heißt, nichts mit der gleichnamigen Programmiersprache zu tun - das Wort steht für „Forty One Calculator Language“. FOCAL-Befehle sind in der Tat Aufrufe von Unterprogrammen in Maschinencodes - so etwas wie Anweisungen in einer virtuellen Maschine, die für Berechnungen, Dezimalsystem und Gleitkomma geschärft wurden.



Die zweite, sehr beliebte Methode heißt Synthetic Programming und besteht aus einer Reihe von undokumentierten FOCAL-Erweiterungen, die auf der Ausnutzung einer Sicherheitsanfälligkeit in der Firmware des Rechners basieren, mit der neue Befehle erstellt werden können.



Die dritte, seltene Möglichkeit besteht darin, direkt in die Maschinencodes des Mikroprozessors des Rechners namens MCODE zu programmieren. Diese Methode ist aus den unten diskutierten Gründen ziemlich kompliziert.



In diesem Artikel werde ich hauptsächlich auf die erste Methode eingehen, die anderen beiden werde ich nur kurz ansprechen.



Tastatur- und Befehlsmodus



Trotz der erweiterten alphanumerischen Anzeige ist die Tastatur des Rechners am gebräuchlichsten. Aufgrund der Vielzahl unterschiedlicher Modi und Funktionen ist die Eingabe des Programms und der damit verbundenen Operationen eine sehr mühsame Aufgabe (vergleichbar mit der für B3-34-kompatible Taschenrechner).



Jede Taste hat drei Funktionen (in einigen Fällen mehr). Beispielsweise soll die Schaltfläche "0" zusätzlich zur Nummer 0 ein Leerzeichen und die Nummer Pi eingeben.

Nicht alle Funktionen sind über Tastenkombinationen verfügbar - einige müssen im "ALPHA" -Modus in Buchstaben eingegeben werden. Die Buchstaben sind am unteren Rand der Schaltflächen in der Reihenfolge "ABCDEF ..." gekennzeichnet.





Ich muss sagen, dass die Tastatur von sehr hoher Qualität ist. Eine typische Technik für HP Hardware wird verwendet - die Taste hat unten eine Achse und dreht sich beim Drücken um diese. Die Anzeige ist trotz fehlender Hintergrundbeleuchtung auch gut lesbar. Nur eine langsame Bildaktualisierung ist anstrengend (was höchstwahrscheinlich auf einen langsamen Prozessor zurückzuführen ist).



Es ist interessant, dass Operatoren, die über eine Kombination von Schaltflächen verfügbar sind, Buchstabe für Buchstabe eingegeben werden können. Zum Beispiel wird der Piepton ("BEEP") durch Drücken von SHIFT 4 erhalten, aber Sie können die XEQ-Taste drücken, dann ALPHA, das Wort "BEEP" buchstabieren und erneut ALPHA drücken.



Tatsächlich können Sie mit XEQ (ab dem Wort "Ausführen") jede integrierte Funktion sofort ausführen oder eine vorhandene Funktion im RAM oder ROM aufrufen - auch in einem Erweiterungsmodul.



Eine Liste aller tatsächlich im Rechner verfügbaren Funktionen erhalten Sie über SHIFT CATALOGUE 3 (Ansichtssteuerung über R / S, SST, BST).



Registriert sich und arbeitet mit ihnen



Im Folgenden geht es um die Register, auf die der Benutzer des Rechners direkt zugreifen kann. Dies sind keine Mikroprozessorregister!



ALPHA-Register (A) - kann bis zu 24 Zeichen speichern und sein Inhalt wird auf dem Bildschirm angezeigt.

0,1,2,3, ... - Datenregister, können entweder eine Zahl oder bis zu 6 Zeichen (oder bis zu 7 Programmschritte) speichern.

X-, Y-, Z-, T-Stapelregister (tatsächlich auch Datenregister, aber organisiert in) Stapelansicht). X - oben.

L - der letzte, vor der Änderung, der Inhalt des X-Registers wird gespeichert

PC - der aktuelle Programmschritt



Das Display zeigt normalerweise den Inhalt des X- oder ALPHA-Registers an, aber andere können angezeigt werden.



Wenn Sie nur eine Zahl auf der Tastatur eingeben, fällt diese in das X-Register (entsprechend wird sie auf dem Bildschirm angezeigt).

Wenn Sie eine Zeichenfolge auf der Tastatur eingeben (nachdem Sie die ALPHA-Taste gedrückt haben), wird die Zeichenfolge in das ALPHA-Register eingefügt (ähnlich wird sie auf dem Bildschirm angezeigt).



Das Vorhandensein von Informationen auf dem Bildschirm bedeutet jedoch nicht, dass sie im Register enthalten sind. Dies gilt beispielsweise für Fehlermeldungen und VIEW-Ergebnisse. Sie schließen das angezeigte Register oben. Verwenden Sie in solchen Fällen die Taste "<-", um die Nachricht zu löschen, ohne den Inhalt der Register zu ändern.

Wenn der Inhalt des Registers auf dem Bildschirm angezeigt wird, löscht dieselbe "<-" - Taste seinen Inhalt.



Durch Drücken der EINGABETASTE wird eine Kopie der Nummer auf den Stapel gelegt. Das heißt, wenn Sie 1 ENTER eingeben, wird 1 sowohl im X-Register als auch im Y-Register angezeigt. Wenn Sie dann 2 eingeben, ist das X-Register 2, das Y-Register ist 1.



CLX löscht X, CLA löscht ALPHA



X <> Y. Vertauscht den Inhalt von X und Y

+, -, *, / führt eine Operation mit dem Inhalt von X und Y durch und setzt das Ergebnis in X, während das, was im Y-Register war, verloren geht und das, was in X war, im L-Register abgelegt wird (kann bei Bedarf mit dem Befehl LASTX zurück nach X kopiert werden).



RCL-Registernummer - kopiert den Inhalt des Datenregisters mit der angegebenen Nummer nach X (d. H.

Ordnet ihn zu). ARCL-Registernummer - Hängt den Inhalt des Datenregisters mit der angegebenen Nummer an das ALPHA-Register an



ASHF verschiebt den Inhalt des ALPHA-Registers um 6 Zeichen nach links (die ersten 6 Zeichen gehen verloren).



Sie können den Inhalt des Registers anzeigen, ohne ihn im angezeigten X zu platzieren. Verwenden Sie dazu den Befehl VIEW (zum Anzeigen der Stapelregister) und AVIEW (zum Anzeigen des ALPHA-Registers).



Es ist zu beachten, dass das Befehlssystem keine anderen Operationen mit Zeichenfolgen enthält. Und das ist kein Zufall - Tatsache ist, dass es so wenig Speicher gibt, dass die Arbeit mit Strings, selbst mit einem Speichererweiterungsmodul, nicht viel Sinn macht. Es gibt jedoch Erweiterungsmodule, in denen Zeichenfolgenoperationen implementiert sind.



STO register_number - Kopiert den Inhalt des X-Registers in das angegebene Datenregister

ASTO register_num - kopiert den Inhalt des ALPHA-Registers (nur die ersten 6 Zeichen!) In das angegebene Datenregister.



Damit RCL und STO mit benannten Stapelregistern arbeiten können, fügen Sie ".": STO .Z hinzu.



Der Befehl SIZE legt die Anzahl der Datenregister fest, die verwendet werden können (bzw.) Die Anzahl der verfügbaren Programmschritte nimmt zu oder ab.):

Je kleiner die GRÖSSE, desto mehr Platz für den Code.



Um den gesamten Speicher zu löschen, müssen Sie den Rechner einschalten, indem Sie die Taste "<-" gedrückt halten und ihn nach dem Einschalten sofort loslassen. Die Meldung "MEMORYLOST" sollte erscheinen (nicht sehr stabil).



Programmiermodus



Umschalten in den Programmiermodus (und zurück) - durch Drücken der PRGM-Taste. Wenn kein Programm vorhanden ist, wird "00 REG nn" angezeigt. Die Nummer nn gibt die Anzahl der für Programmschritte verfügbaren Register an (siehe oben zu GRÖSSE). Während Sie das Programm eingeben, schreibt der Rechner manchmal PACKING, um zu versuchen, den Code zu komprimieren. Wenn nicht genügend Speicher für den nächsten Befehl vorhanden ist, schreiben Sie TRY AGAIN.



Bei der Eingabe eines Programms wird links der aktuelle Schritt angezeigt. Ein Schritt - ein Befehl (egal, eingegeben mit einer Taste oder Buchstabe für Buchstabe). Es sollte jedoch berücksichtigt werden, dass ein Schritt eine andere Speichermenge beanspruchen kann - wenig, wenn es sich um einen einfachen Befehl wie CLA handelt, und viel, wenn es sich beispielsweise um eine lange Textzeichenfolge handelt.

In Schritten bewegen - SST (vorwärts) und BST (rückwärts). Löschen des aktuellen Schritts - "<-".



Das Programm wird im Befehlsmodus (dh PRGM muss erneut gedrückt werden) mit der R / S-Taste gestartet. Sie hört auch auf.



Im Programmiermodus stehen fast alle im Befehlsmodus verfügbaren Funktionen zur Verfügung. Die Eingabe der auf den Tasten markierten Befehle erfolgt durch einfaches Drücken. Der Rest der Befehle wird über XEQ eingegeben. Um beispielsweise TONE 3 einzugeben, drücken Sie XEQ, dann ALPHA, geben Sie TONE Buchstabe für Buchstabe ein, drücken Sie erneut ALPHA und dann 3.



Löschen des Programms: CLP-Label (vom Label bis END gelöscht)



Gehen Sie zu einem bestimmten Schritt: GTO.002 (Sie müssen zuerst das Programm beenden Modus).

Zum Anfang gehen: SHIFT RTN



Sie können die aktuelle Position im Befehlsmodus ermitteln, indem Sie die Taste R / S oder SST gedrückt halten



Beschriftungen, zu denen dann gesprungen werden kann, werden durch die "LBL-Beschriftung" gesetzt und sind von zwei Typen - global (Textnamen, im ALPHA-Modus eingegeben) und lokal (numerische oder Einzelbuchstaben-Textnamen). Ziffern beanspruchen weniger Speicher.

Zum Label "GTP-Label" springen



Es ist nützlich, im ersten Schritt des Programms immer ein Label zu setzen. Auf diese Weise können Sie es ausführen, ohne jedes Mal zum Anfang zu gehen - über ein XEQ-Label oder ein GTO-Label.



Es gibt auch einen indirekten Übergang zu GTO IND (HP-41-Fans führen dies als Beweis dafür an, dass die Turing-Maschine vollständig ist;).



Am Ende des Programms wird GTO… eingegeben (die Meldung PACKING wird angezeigt). Zu diesem Zeitpunkt wird ENDE auf dem Bildschirm angezeigt



Ein Programm zum Multiplizieren einer beliebigen Zahl mit 2 sieht beispielsweise folgendermaßen aus:



LBL "PRGNAME"
2
*
END

      
      





Arbeiten mit Unterprogrammen (bis zu sechs Verschachtelungen sind zulässig):



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

      
      





Bedingte Zweige:



X=Y?
2
1

      
      





Wenn in diesem Beispiel X gleich Y ist, wird 2 auf den Stapel geschoben (Register X). Andernfalls 1

Wenn die Bedingung nicht erfüllt ist, wird der Befehl nach der Prüfung übersprungen. ISG-



Schleifen



- Inkrementieren und überspringen, wenn

größer DSE - Dekrementieren und überspringen, wenn gleich oder kleiner als



Beispiel



1.00301
STO 01
LBL 01     
BEEP
ISG 01     
GTO 01     

      
      





Dieses Snippet kann in einem Interview anstelle von Schachtabdeckungen verwendet werden. Mit der Frage "Wie oft läuft BEEP und warum?" Die richtige Antwort ist 3 mal.



Erläuterung: Die Schleifenparameter werden mit einer einzelnen Bruchzahl angegeben, die auf den Stapel verschoben wird. Die Zahl hat das Format iiiii.fffcc, wobei:



iiii - der Anfangsbuchstabe, es ist der aktuelle Zählerwert (Index),

fff - der Endwert

cc - Schritt



Somit bedeutet 1,00301 die Zählung von 1 bis 3 mit einem Schritt von 1.

Offensichtlich können Sie mit einer solchen besonderen Lösung speichern Speicher, obwohl die Lesbarkeit des Codes, sagen wir, leicht leidet.



Ein wenig zum Anzeigen von Zeichenfolgen:



AVIEW zeigt das ALPHA-Register an, VIEW zeigt das X-Register an.



Mit dem Befehl APPEND werden die angegebenen Zeichen an eine Zeichenfolge im ALPHA-Register angehängt. Es wird über die Tastatur als UMSCHALT K eingegeben. In der Quelle sieht es aus wie> "TEXT".



Beispiel:



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

      
      





Wenn der Bildschirm gelöscht wird, kehrt das Standardsymbol "Fliegende Gans" zurück, um anzuzeigen, dass das Programm ausgeführt wird. Wenn auf dem Bildschirm Text angezeigt wird, wird die Gans nicht angezeigt.



Obwohl der Bildschirm 12 Zeichen enthält, beträgt die maximale Zeilenlänge in einem Programmschritt 15. Mit APPEND erhalten Sie 24 (dh die volle Länge des ALPHA-Registers). Wenn eine lange Zeile auf dem Bildschirm angezeigt wird, wird automatisch gescrollt:



"1234567890"
>"ABCDEFGHIJKLMN"
AVIEW

      
      





Operationen mit Zeichenfolgen sind auf drei Befehle beschränkt:

ASTO X -

fügt die ersten 6 Zeichen von ALPHA in das angegebene Register ein ARCL X - fügt am Ende von ALPHA eine Zeichenfolge aus dem angegebenen Register

ASHF an - verschiebt ALPHA 6 Zeichen nach links (sie gehen verloren) Dateneingabe



:



PROMPT - Anzeigen Der Inhalt des ALPHA-Registers und das Stoppen des Programms (Sie können jeweils etwas eingeben und R / S drücken, um die Ausführung fortzusetzen).

PSE - Unterbricht die Programmausführung für etwa eine Sekunde. Wenn in diesem Fall Zahlen oder Buchstaben gedrückt wurden, wird die Pause um eine weitere Sekunde verlängert und der Gesamtwert zur weiteren Verarbeitung in ein Register eingetragen.



Über Sound:



BEEP - spielt eine Standardsequenz derselben

TONE-Nummer mit vier Noten - ein kurzes Quietschen einer von 10 Frequenzen (0 - niedrigste ... 9 - höchste). Die Frequenzen werden auf seltsame Weise gewählt. Anscheinend war dies auf Speichereinsparungen zurückzuführen.



Eine Erklärung
«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.»





Peripherie



Zu den Peripheriegeräten gehören Speichererweiterungsmodule, ein ROM mit vorgefertigten Programmen, ein Magnetbandleser / -schreiber (HP 82161A), Magnetkarten (HP82104A), ein Barcodeleser, ein Infrarotanschluss, ein Drucker, ein Plotter, eine Uhr und eine HP-IL-Schnittstelle (über) die den Rechner an verschiedene Geräte anschließen können) und mehr.



Ich habe einen Magnetkartenleser / -schreiber mit HP-41. Karten sind Magnetbandstreifen auf Papierbasis (die Moskauer U-Bahn hatte früher eine ähnliche Art von Reisekarte).





Jeder Streifen hat zwei Spuren - d.h. Es kann mit der linken oder rechten Seite eingefügt werden. Auf jeder Seite passen 112 Bytes. Ein typisches Programm umfasst mehrere Karten.

Sie können die Seite der Karte vor dem Schreiben schützen, indem Sie die Ecke abschneiden.

Wenn ein Modul in den Taschenrechner eingefügt wird, wird dessen ROM verwendet. Dementsprechend erscheinen im Taschenrechner viele neue Befehle zum Arbeiten mit Karten. Sie können Programme, Register usw. lesen und schreiben. Sie können das aufgezeichnete Programm sogar vor dem Anzeigen schützen (d. H. Sie können es herunterladen und ausführen, aber Sie können das Programm selbst nicht sehen).



Hier können Sie sehen, wie das Magnetkartenlaufwerk funktioniert.



Leider ist dieses Gerät unzuverlässig und sehr batteriehungrig (wird vom Taschenrechner selbst angetrieben). Meins hat nicht funktioniert - es summte mit einem Motor, aber es spannte das Band nicht. Es stellte sich heraus, dass die Druckwalze im Inneren nicht nur auseinander fiel, sondern vollständig verschwand und nur einen Tropfen viskosen Schmutzes zurückließ. Ich habe die Walze gegen eine selbstgemachte ausgetauscht, aber das Band wird offensichtlich nur schwer gedehnt - Sie müssen den Durchmesser genau einstellen. Das Problem ist so häufig, dass ebay sogar Kits dieser Videos verkauft.



Ein weiteres interessantes Gerät. Ebenfalls unter HP-41-Besitzern üblich ist ein Barcodeleser, mit dem unter anderem Programme direkt aus Büchern in den Taschenrechner geladen werden. Stellen Sie sich vor - Sie müssen nicht mehr lange Programme über die Tastatur einspielen! .. Es sieht so aus:







Entwicklung



Natürlich können Sie in FOCAL direkt auf den Rechner schreiben. Dies ist jedoch ziemlich langwierig - es ist viel bequemer, das Programm in eine Textdatei zu schreiben. Die Situation mit Compilern und Emulatoren ist jedoch kompliziert. Alle von ihnen sind ziemlich seltsam und nicht sehr stabil. Von denen, die unter Win10 laufen, gibt es sim41 und v41 (v.7b). Der erste wird nur über Visual Runfox gestartet, verfügt jedoch über einen separaten Programmeditor (d. H. Es ist nicht erforderlich, ihn über die Tastatur des Rechners einzugeben und zu bearbeiten).

Das zweite Programm wird ohne Vorspiel gestartet und emuliert den Rechner viel besser (obwohl nicht auf Hardwareebene, was beispielsweise durch die Desynchronisation des Tons mit dem Code angezeigt wird), aber das Programm muss entweder vollständig manuell eingegeben oder als binäres .raw geladen werden, das kein Maschinencode ist und die binäre Darstellung FOCAL). Das Problem ist, dass Sie zum Kompilieren einer Textquelle in Raw das Dienstprogramm HP41UC.EXE verwenden müssen, das nur unter DOS ausgeführt werden kann. Ich habe vDos mit einer Batchdatei verwendet, nachdem ich das erforderliche Verzeichnis mithilfe von f: c: \ tmp



der Festplatte zugeordnet hatte. Kompilieren der Quelle in eine Binärdatei:

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



Dekompilieren der Binärdatei in eine Quelle:

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



Um ein besseres Gefühl für die Plattform zu bekommen, habe ich ein kleines 256-Byte-Intro für die DiHALT-Demo-Party geschrieben.





Es sind genau 256 Bytes, einfach weil es selbst mit einem installierten RAM-Erweiterungsmodul nicht mehr in den Rechner passt. Es ist klar, dass man vom Taschenrechner keine besonderen visuellen Effekte erwarten sollte. Die Ausgabe verschiedener Zeilen wird verwendet, einschließlich des automatischen Bildlaufs langer Zeilen. Animation mit Gesicht - zwei Zeilen in einer Schleife ausgeben. DTMF wird sehr bedingt simuliert, die Musik unterscheidet sich auch völlig vom Original - da weder die gewünschte Tonart noch die gewünschte Dauer gewählt werden können. Trotzdem klingt es immer noch nach Musik. Am Ende wird eine Standard-Taschenrechnerfunktion verwendet, um eine "fliegende Gans" anzuzeigen, wenn der Prozessor beschäftigt ist und das ALPHA-Register leer ist.



Anfangs war das Intro doppelt so lang, selbst wenn Subroutinen verwendet wurden. Aber als im Emulator alles debuggt war und ich anfing, diesen Fall in den Taschenrechner zu fahren, stellte sich heraus, dass er dort nicht hineinpasste (ich hoffte, dass der Emulator einen Speichermangel melden würde, aber nein). Ich musste kürzen und umschreiben.



Hier sehen Sie beide Quellen.



Synthetische Programmierung



Synthetische Programmierung ist eine Technik, die auf der Ausnutzung einer im Programmiereditor des Taschenrechners gefundenen Sicherheitsanfälligkeit basiert. Regelmäßige Standardbefehle werden im Speicher des Rechners in mehreren Bytes codiert. Die Sicherheitsanfälligkeit ermöglicht es (nach einem ziemlich komplizierten Vorbereitungsvorgang), diese Bytes zu ändern und neue Anweisungen mit verschiedenen Funktionen zu erhalten. Beispielsweise können Sie mit dem Befehl TONE mehr Sounds abrufen, als standardmäßig zulässig sind. Sie können mehr Zeichen (aus dem im ROM festgelegten Satz) anzeigen, auf Systemflags zugreifen und eine Reihe anderer nützlicher Dinge. Auch hier ist es schwierig und mühsam, diese Technik in der Praxis anzuwenden. Es stimmt, es gibt Module mit Unterprogrammen, die dies erleichtern.





Es kann Situationen geben, in denen der Taschenrechner aufgrund falscher oder ungenauer synthetischer Aktionen einfriert (z. B. reagiert er nicht auf Tasten), bis die Batterien entfernt und eingelegt werden müssen. Das ist mir passiert. Es ist interessant, dass es in der Literatur Warnungen gibt, dass in einigen Fällen die Batterien für zwei Tage (!) Herausgezogen werden müssen, damit der Rechner wieder eingeschaltet werden kann.



Ein weiteres Problem bei synthetischen Anweisungen besteht darin, dass sie manchmal aus Nicht-ASCII-Zeichen bestehen. Dort treten sowohl bei der Eingabe als auch beim Drucken eines solchen Programms auf einem Standard-HP-41-Drucker besondere Schwierigkeiten auf. Ja, selbst die Veröffentlichung eines solchen Programms in einem Buch oder einer Zeitschrift ist ein ganzes Problem (normalerweise schreiben sie neben den Befehlen Erklärungen, wie sie verstanden werden sollten). Eine der Lösungen für das Problem besteht darin, jedes Zeichen mit einem Barcodeleser aus einer speziellen Tabelle zu lesen:







Tatsächlich ist die synthetische Programmierung der "Egogologie" in B3-34-kompatiblen Taschenrechnern sehr ähnlich. Zur Veranschaulichung sehen Sie diesen Brief .



Die Leute haben sogar Gedichte zu diesem Thema geschrieben! (entnommen aus der synthetischen Programmierung für den 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





MCODE



Maschinencode, der direkt vom Mikroprozessor in HP-41-Taschenrechnern namens MCODE ausgeführt wird - er ist 5-120-mal schneller als Standard-FOCAL.



Um auf dem Rechner ausgeführt zu werden, muss das Programm in MCODE in das ROM (oder in einen ROM-Emulator) geschrieben werden. Es gibt spezielle Module, mit denen Sie Code über USB oder RS232 laden und sogar direkt auf dem Rechner in M-CODE schreiben können. Sie werden gemeinsam als MLDL bezeichnet und sind sowohl uralt, von HP selbst als auch modern .

Von den Cross-Assemblern habe ich nur den alten gefunden - für DOS.



Ein paar Worte zur Prozessorarchitektur. Da es sich hauptsächlich um Mathematik handelt, gibt es Besonderheiten. Die Hauptregister (und die Prozessorregister sind nicht die in FOCAL verwendeten Register!) A, B, C, N, M sind 56-Bit.

Es gibt auch kürzere Register für Flags, Tastaturen, Lautsprecher, Zeiger, einen 16-Bit-Befehlszähler und einen vierstufigen Rückgabestapel (vier 16-Bit-Register).



In dem ROM, der über einen seriellen Bus mit dem Prozessor verbunden ist und in dem sich das in MCODE geschriebene Steuerprogramm des Rechners befindet, sind die Bytes 10 Bit breit. Der Prozessor adressiert 64 KB ROM, von denen 12 KB vom Betriebssystem belegt werden. Der RAM wird nicht in den Adressraum abgebildet und ist ein Peripheriegerät für den Prozessor. Die RAM-Bytes sind 8 Bit breit, aber logischerweise behandelt der Prozessor RAM als 56-Bit-Register.



Da ich nicht in MCODE geschrieben habe (erwürgt von einer Kröte für 250 US-Dollar für einen ROM-Emulator), kann ich meine persönlichen Erfahrungen mit der Programmierung in MCODE nicht teilen.



Die Anweisungen dort sind ziemlich traditionell, obwohl viele der Mnemoniken ziemlich spezifisch sind. Z.B:



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 ;   

      
      







Ein Beispiel für ein MCODE-Analogon des FOCAL-Befehls 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  

      
      





Für die Steuerung der Anzeige erlaubt die Steuerung nicht das Ein- und Ausschalten beliebiger Segmente - Sie können nur die im Zeichengenerator vorhandenen Symbole anzeigen. Dies wurde auch der Grund, warum ich mich nicht mit dem ROM-Emulator und der Programmierung in MCODE beschäftigte.



Um Zeichen anzuzeigen, müssen Sie den Indikator durch die Anweisung PRPH SLCT FD-Prozessor auswählen und dann über WRIT / READ mit den Indikatorregistern arbeiten



Epilog



Um ehrlich zu sein, sind die Logik und das Befehlssystem des Rechners ziemlich verwirrend. Meiner Meinung nach ist es für eine Person, die dies beherrschen kann, kein Problem, einfach Maschinencodes eines einfachen Prozessors einzugeben. In unseren B3-34-kompatiblen Taschenrechnern ist natürlich auch nicht alles einfach, aber es gibt viel weniger Möglichkeiten, weshalb es kein Gefühl solcher Verwirrung gab.

Grundsätzlich ist das Argument für das Aufstapeln von Pseudocode auf einem Mikroprozessor im HP-41 die Notwendigkeit mathematischer Berechnungen, da dies für den typischen Taschenrechnerbenutzer schließlich einfach sein sollte.



Gleiches gilt für die Tastatur - es wäre möglich, sofort eine normale alphanumerische Tastatur zu erstellen, ohne Befehle an die Tasten zu hängen. Immerhin wurde die Funktionalität der buchstabenweisen Befehlseingabe bereits implementiert (jedoch wurden bald Taschenrechner mit einer vollwertigen Tastatur hergestellt).



Ich habe verschiedene HP41-Dokumentationen in einem Archiv gesammelt. Wenn jemand interessiert ist, können Sie sie herunterladen (ich habe sie eine Weile gepostet, dann werde ich sie entfernen).



All Articles