Mein erstes Overlay-Programm

    In Zeiten der weitverbreiteten Dominanz von Tablets und Smartphones ist es kaum zu glauben, dass das Spielen mit einem Taschenrechner in letzter Zeit viel Spaß machen könnte. Natürlich meine ich keinen gewöhnlichen (oder sogar technischen) Taschenrechner, sondern einen programmierbaren . Ich möchte über ein Gerät sprechen, das mein Leben buchstäblich verändert und mich dazu gedrängt hat, Programmierer zu werden.

    In den späten 70er Jahren des letzten Jahrhunderts war die Computertechnologie in der UdSSR knapp. Mein Vater arbeitete als Programmierer. Kampagnen für seine Arbeit im Central Department Store, wo ich mit einem Minsker Computer in Nimes spielte , werden für immer in meiner Erinnerung bleiben.und längeres Füllen von Programmen mit Messingringen auf den damals von der Sberbank verwendeten Sparks-Tabletten. Zu meiner persönlichen Verfügung etwas zu haben, das Programme ausführen kann, davon konnte ich natürlich nicht einmal träumen.

    Mit dem Aufkommen der programmierbaren Mikrokalkulatoren (PMK) hat sich alles geändert. Jetzt konnte ich träumen. Genau das habe ich getan, indem ich Artikel in der Technik der Jugend gelesen habe , da es in Kasan nicht möglich war, dieses programmierbare Wunder zu erlangen. Aber eines Tages kamen meine Eltern und ich nach Moskau.

    Nachdem ich erhebliche Anstrengungen unternommen hatte, überredete ich meine Eltern , den damals nicht billigen MK-61 zu kaufen und bei Lieferung die alten Quantum- Magazine abzulegenNachdem er sich in der Wohnung unserer Verwandten verbarrikadiert hatte, reagierte er bis zu seiner Abreise nicht mehr auf äußere Reize.

    Ich las alles, was damals auf programmierbaren Rechnern gedruckt wurde, noch einmal durch, richtete ein allgemeines Notizbuch ein und kopierte sorgfältig besonders beliebte Programme hinein. Allmählich kam ich zu dem Punkt, dass ich meine Korrekturen und Verbesserungen an ihnen vornehmen konnte (die Erfahrungen, die ich in der Mahnwache beim Programmieren von Sparks gesammelt hatte, waren nicht vergebens). Nach einer Weile konnte ich selbst Programme schreiben.

    Als ich mich mit MK-61 schon ziemlich wohl fühlte, bekam einer meiner Freunde eine verbesserte Version - MK-52. Laut Befehlssystem unterschied es sich praktisch nicht von MK-61, hatte aber die Möglichkeit, Programme im EEPROM zu speichern und wurde mit mehreren Kassetten mit vorgefertigten Programmen geliefert. Natürlich wollte ich sofort etwas speziell für sie schreiben.

    Lyrischer Exkurs
    Ich muss sagen, dass die Frage der Speicherung von Programmen für das PMK zu dieser Zeit ein erhöhtes Interesse hervorrief. Es war wirklich unpraktisch, jedes Mal ein ziemlich großes Programm nachzufüllen. Außerdem musste das eingeführte Programm sorgfältig auf verschiedene Fehler überprüft werden.

    Enthusiasten haben viele Schaltungslösungen für dieses Problem vorgeschlagen. Einmal habe ich sogar einen Artikel gesehen, der ein Gerät zum Speichern von Taschenrechnerprogrammen auf Magnetbändern beschreibt. Die Ausgabe von MK-52 beendete diese schwierige Frage.

    Die Wahl fiel auf die "Seeschlacht". Ich wollte es schon lange machen, konnte aber nicht alle erforderlichen Funktionen in den Adressraum des Rechners packen. Die Fähigkeit, Programme aus dem EEPROM zu laden, erlaubte es, das Programm in zwei Teile aufzuteilen. Der erste Block - arrangierte die Schiffe, der zweite (eigentlich das Spiel) bot einen Dialog mit dem Benutzer. Einige der Routinen wurden von beiden Blöcken verwendet.

    So sah dieses Wunder aus (das Bild ist nichts für schwache Nerven)
    Bild

    Da dieses Höhlengemälde in dieser Form praktisch nicht zu entziffern ist, gebe ich diesen Code in einer besser lesbaren Form:

    Schiffspositioniereinheit
    00|46 01.07 02.12 03.08 04.11 05.34 06.15 07.45 08|53 09:75 
    10.06 11.53 12:67 13.5E 14:08 15.62 16.53 17:37 18.6E 19.01 
    20.11 21.4E 22|53 23:34 24.6E 25.02 26.10 27.4E 28.53 29:34
    30.5D 31:08 32.63 33.50 34|62 35.02 36.10 37|65 38.12 39.01
    40.10 41.DE 42.38 43.BE 44.52 45.11 46.4E 47.53 48:58 
                                                          49.6E
    50.02 51.10 52.4E 53.53 54:58 55.5D 56:22 57.27 58|61 59|65
    60.12 61.01 62.10 63.DE 64.38 65.BE 66.52 67|65 68.12 69.01
    70.10 71.DE 72.37 73.35 74.52 75|66 76.01 77.01 78.12 79.20
    80.10 81.35 82.46 83.07 84.12 85.07 86.10 87.4E 88.65 89.04
    90.15 91.12 92.45 93.01 94.11 95.59 96:A2 97.65 98.07 99.15
    A0.13 A1.45 A2|52
    
    Herunterladbarer Spielblock
    00.40 01.50 02.57 03:41 04.0B 05.15 06.45 07.14 08.06 09.10
    10.4E 11.02 12.53 13:67 14.57 15:22 16.0F 17.DE 18.39 19.BE
    20.64 21.52 22|53 23:75 24.01 25.53 26:67 27.5E 28.22 29.15
    30.53 31:59 32.6E 33.06 34.11 35.62 36.12 37.65 38.17 39.11
    40.52 41|53 42:58 43.6E 44.01 45.11 46.4E 47.53 48:58
    

    Hier verwende ich Befehlscodes, da die vom PMK-Hersteller vorgeschlagenen Bezeichnungen für die Auflistung von Auflistungen nicht sehr praktisch sind. Die Entsprechung der Codes zu den Befehlen ist auf dem Tablett zu sehen (freundlicherweise von mir in den gleichen Jahren gezeichnet):

    Codes MK-52
    Bild
    Ein kurzer Ausflug in das Kommandosystem
    Mit etwas Übung waren die Befehlscodes leicht zu merken (was notwendig war, da die eingegebenen Programme überprüft werden mussten). Die am häufigsten verwendeten waren:

    1. Arithmetische Befehle (10-13), die die entsprechende Aktion mit den beiden unteren Registern des Operationsstapels (X, Y) ausführen und das Ergebnis in X setzen
    2. Befehle zum Schreiben und Lesen von Speicherregistern (40-4E bzw. 60-6E)
    3. Befehle, die die Ausführung des Programms steuern (50-5E), darunter der Stoppbefehl (50) sowie der Befehl, das Unterprogramm (53) aufzurufen und von dort zurückzukehren (52)
    4. Indirekte Adressierungsbefehle (B0-BE, D0-DE) waren sehr nützlich, um auf das Speicherregister zuzugreifen, dessen Nummer in ein anderes Register geschrieben wurde

    Obwohl in den Befehlscodes hexadezimale Ziffern verwendet wurden, wurden auf dem Bildschirm Bilder aus dem Film „Predator“ im Speicher angezeigt:

    Bild

    Der Einfachheit halber habe ich im Code die Adresse der Übergangsbefehle (ein Doppelpunkt nach der Adresse des Befehls) sowie den Einstiegspunkt (vertikale Leiste) hervorgehoben. Auf diese Weise können Sie die Beziehung der Unterprogramme deutlicher erkennen (besonders interessant ist der Unterprogrammaufruf unter der Adresse 22, der eine Art „Polymorphismus“ liefert. Beim Zugriff auf dieses Unterprogramm wurde die Steuerung an verschiedene Stellen übertragen, je nachdem, welcher Block geladen wurde).

    Sie werden vielleicht bemerken, dass die Übergänge zur Mitte (und nicht zum Anfang) des Unterprogramms nichts Außergewöhnliches waren. Aufgrund der extrem begrenzten Größe des adressierten Speichers musste buchstäblich alles gespart werden. Übergänge an die Adresse eines anderen Übergangs (in diesem Fall als Befehlscode behandelt) galten als besonders schick.

    Da der funktionierende Rechner nicht mehr zur Hand ist, habe ich verwendetEmulator :

    Bild

    Alle vorbereiteten Bilder wurden auf GitHub hochgeladen .

    Das erste Bild kann verwendet werden, um „Schiffe“ anzuordnen: Der

    Bild

    Anfangswert für den Pseudozufallszahlengenerator (0,1234567) kann geändert werden. Nach dem Start zur Ausführung (I / O s / p) läuft das Programm ziemlich lange und zeigt schließlich die Adresse zum Laden des Spielemoduls aus dem ROM an (es gab keine Möglichkeit, vom Programm aus automatisch auf das ROM zuzugreifen):

    Bild

    Seit dem Emulator (zumindest das Die von mir verwendete Version ignorierte meine Versuche, auf das EPROM zuzugreifen, völlig. Ich erstellte ein Bild mit dem von meinen Händen eingetriebenen Spielmodul und der bereits abgeschlossenen Anordnung der Schiffe.

    Die Anordnung selbst ist in den Speicherregistern 7 bis D gespeichert. Hier ein Beispiel für die zweite Zeile (8. Register):

    Bild

    Zwei codieren die Position der „Schiffe“. Basierend auf dem obigen Anfangswert wurde die folgende Anordnung generiert:

    0 0 0 0 1 0 1
    0 0 1 0 0 0 0
    1 0 0 0 0 1 0
    0 0 1 0 0 0 0
    0 0 0 0 0 0 0
    0 1 0 0 0 0 1
    0 0 0 1 0 0 0
    

    Sie können sehen, dass das Programm neun nicht zusammenhängende „Single-Deck-Schiffe“ auf einem 7x7-Quadratfeld platziert hat.

    Um das Spiel zu starten, müssen Sie die Anzahl der Schiffe eingeben (9 in / ungefähr s / n) und dann die Koordinaten der "Schüsse" eingeben (zum Beispiel 2 V ^ 2 s / n). Da wir die Position der "Schiffe" ausspioniert haben, war es für uns nicht schwierig, das "eine Deck" zu versenken:

    Bild

    Wir werden es jedoch nicht das zweite Mal treffen können:

    Bild

    Wir werden es versuchen (2 V ^ 2 s / n). Wie erwartet schlägt der Rechner zurück:

    Bild

    Die erste Stelle ist hier die vertikale Koordinate (von unten nach oben), die zweite - horizontal (von links nach rechts).

    Wenig später bemerkte ich, dass durch Ändern einiger Befehle (auf dem ersten Foto mit dem Programmtext sind sie rot markiert) sichergestellt werden kann, dass die platzierten Schiffe Kontakt haben, jedoch nicht mit Ecken, sondern mit Seiten (Bilder 0003 und 0004 ). Das Ergebnis war die folgende Anordnung von "Mehrdeckern":

    0 0 0 0 1 0 0
    0 0 0 0 0 0 0
    0 0 1 0 0 1 0
    0 0 1 0 0 0 0
    0 0 0 0 0 0 0
    1 1 0 1 0 0 1
    0 0 0 1 0 0 0
    

    Gott weiß was, aber nicht schlecht, wenn man bedenkt, dass nur zwei Teams wechseln mussten.

    Separat sollte über Fehler (noch wahrscheinlicher über Fehler) gesprochen werden, obwohl dies ein Thema für einen separaten Artikel ist, wenn nicht für deren Zyklus. Tatsache ist, dass die Rechner der beschriebenen Serie buchstäblich mit verschiedenen Beispielen für Fehler und undokumentiertes Verhalten überfüllt waren. Unter Amateuren führte dies zur Entwicklung einer Kultur der Erforschung dieser undokumentierten Möglichkeiten, die unter der Bezeichnung YSGOG-ology bekannt ist .

    Einige Beispiele für solche Fehler sind lustig, andere gefährlich und einige überraschend nützlich. Ein gutes Beispiel für dieses möglicherweise nützliche Verhalten ist die Ausführung des Befehls "Order Entry" (VI) nach dem Schreiben in das Speicherregister. Im Programmausführungsmodus führte dies zum „Abschneiden“ der ersten Ziffer der Zahl im X-Register (auf dem Indikator angezeigt), und bei schrittweiser Ausführung (ja, ja, so war es) funktionierte das Team ganz normal. Es war unmöglich, auf andere vernünftige Weise ein solches Ergebnis zu erzielen.

    Angesichts dieses ungewöhnlichen Verhaltens des VP-Befehls habe ich das Programm korrigiert, indem ich die Befehlsfolge 35. VP 36.1 auf 35. IP2 36.x geändert habe (ich musste die Konstante 10 im 2. Register speichern). Da es keinen Live-Rechner gibt, kann ich nicht mehr prüfen, ob der VI-Befehl in diesem Zusammenhang zu einem Fehler geführt hat. Unter dem Emulator funktionieren beide Optionen ganz normal.

    Leider kenne ich die Implementierung des Emulators nicht, der alle Beispiele für undokumentiertes Verhalten wiedergibt.

    Nach all dem gab es Mikroshi, BK-shki und Spectrum. Es gab eine EU-1046 , die ich am Institut angetroffen habe. Es gab PDP-shki und VAX-s. Vor dem Aufkommen des IBM-PCs war das Warten kurz.

    Jetzt auch beliebt: