000
16.02.2026, 21:56 Uhr
hu_dd
|
Hallo,
für den Fall dass irgendwo auf dieser Welt jemand auf die Idee kommt, zu untersuchen was ein SIOS-Programm an irgend einer Stelle tut oder tun sollte, würde ich euch mal in Kurzform am Ergebnis meines diesbezüglichen Irrweges teilhaben lassen (und motivieren dass Softwarearcheologie manchmal interessant sein kann ;-)).
Also es gibt ja unter SIOS (und BROS) quasi eine Makro-Sprache die unvermittelt (nein mit RST28) im Assembler auftaucht und an deren Syntax gängige Z80-Dissassembler dann scheitern.
Da ich dieses entzückende Heft nicht habe, half mir auf dem Weg des Verständnisses das beim Internet-Archive erhältliche Heft robotron SIOS 1520 Assemblersprachbeschreibung MABS 1520 Makrobefehle. Dieses wurde unter dem Motto "ein schlechter Scan ist besser als gar kein Scan" erfasst und ist seitenweise etwas anstrengend - besser aber als nichts.
Aus den Informationen in diesem Heft habe ich mir die unten stehende CSV-Tabelle mit der Befehlsbeschreibung zusammen gebaut, es gibt keinen Anspruch auf Fehlerfreiheit aber im Gegensatz zu den Tabellen im Anhang kann man es immerhin lesen.
Nun konnte ich zu Fuß im Ram-Dump Dinge entschlüsseln, war aber immer noch zu langsam und wollte mir eigentlich ein kleines Programm zum Dekodieren bauen.
Weil alle immer sagen, der Chatgpt könne so gut programmieren und sowieso alles so gut, habe ich den mal gefragt - also gut programmieren konnte er zwar nicht und hat auch nicht so viel intelligentes erzählt wie man von einer Intelligenz erwarten würde. Aber er war in der Lage die Fleißarbeit zu machen, aus meiner Tabelle und dem RAM-Dump zumindest die Absätze die ich ihm vorher raus gesucht habe weil ich sie interessant fand lesbar zu gestalten, das sah dann quasi so aus:
| Quellcode: | ; ===== Label E154 (angesprungen von BC@E125) ===== E154: 2C 50 21 03 00 POS par=$50, H=$21, V=$03, g=$00 ; Positionierung von Zeichen auf einem Ausgabegerät E159: 23 01 4C C5 01 ENTF l=$01, adr=$C54C, nz=$01 ; Mehrzeilige Zeicheneingabe E15E: 03 3E 32 E0 BCA stc=$3E, adr=$E032 ; Bedingter Sprung in Abh. von Starttastencode Reg. A ; Dispatch stc=$3E ? $E032 E162: 61 31 4C C5 CLI d1=$31, adr=$C54C ; Vergleich mit Direktoperand E166: 0D 40 C6 E4 BC n0=$40, adr=$E4C6 ; Bedingter Sprung in Abh. von Bedingungscode ; Bedingt (n=$00) ? $E4C6 E16A: 61 38 4C C5 CLI d1=$38, adr=$C54C ; Vergleich mit Direktoperand E16E: 0D 20 C6 E4 BC n0=$20, adr=$E4C6 ; Bedingter Sprung in Abh. von Bedingungscode ; Bedingt (n=$00) ? $E4C6 E172: 2C 50 30 03 00 POS par=$50, H=$30, V=$03, g=$00 ; Positionierung von Zeichen auf einem Ausgabegerät E177: 23 02 4D C5 01 ENTF l=$02, adr=$C54D, nz=$01 ; Mehrzeilige Zeicheneingabe
|
Damit konnte man das plötzlich ganz gut lesen - verstehen musste man noch selbst machen, da ist mit diesen Angaben die Intelligenz auch gescheitert. Aber ich will ihn nicht so schlecht reden, immerhin hat er mir unbürokratisch geholfen und Fleißarbeit abgenommen weil ich sonst immer noch mit meinem Bleistiftkrakelzettel da sitzen würde.
Und das Ende vom Lied - ich konnte keine Blöcke mit 4 Byte "Passwort" finden, weil der Programmierer sich gedacht hat, es reicht wenn er 3 Byte speichert und die vierte Zahl kann man irgendwas eingeben, dann ist das auch eine lustige Idee um die Russen zu verwirren.
Und ganz am Schluss noch die besagte CSV als Angebot für eine Nachnutzung im Rahmen der Neuererbewegung - und zuvor verabschiede ich mich und gehe mal wieder zurück in meinen Software-Randgruppen-Keller ;-).
MfG Henry
| Quellcode: | Byte 0;Byte 1;Byte 2;Byte 3;Byte 4;Byte 5;Byte 6;Byte 7;Anzahl I-Bits Befehlscode;Anzahl I-Bits Zusatzbyte;Kurzbezeichnung;Bezeichnung 0;;;;;;;;0;;NOP;Keine Operation 3;stc;adr_l;adr_h;;;;;1;;BCA;Bedingter Sprung in Abh. von Starttastencode Reg. A 4;stc;adr_l;adr_h;;;;;1;;BCN;Bedingter Sprung in Abh. von Starttastencode Reg. N 5;sc;adr_l;adr_h;;;;;1;;BCS;Bedingter Sprung in Abh. von Statusregister S 6;sc;adr_l;adr_h;;;;;1;;BCK;Bedingter Sprung in Abh. von Starttastencode Reg. 7;sc;adr_l;adr_h;;;;;1;;BCKR;Bedingter Sprung in Abh. Von Sel.-Register KR 8;cnc;adr_l;adr_h;;;;;1;;ON;Bedingter Sprung in Abh. Von ON-Code 9;l;adr_l;adr_h;;;;;1;;PA;Laden Adresse Parameterliste von Haupt- in Unterprogramm (unmittelbar nach CALL) 10;l1;adr1_l;adr1_h;l2;adr2_l;adr2_h;;2;;A;Addition 11;l1;adr1_l;adr1_h;l2;adr2_l;adr2_h;;2;;S;Subtraktion 12;l1;adr1_l;adr1_h;l2;adr2_l;adr2_h;n;2;;M;Multiplikation 13;l1;adr1_l;adr1_h;l2;adr2_l;adr2_h;n;2;;D;Division 14;l1;adr1_l;adr1_h;l2;adr2_l;adr2_h;;2;;C;Numerischer Vergleich 2 maskierter numerischer Operanden 16;l1;adr1_l;adr1_h;l2;adr2_l;adr2_h;;2;;MVM;Transport mehrfach links beginnend 17;l1;adr1_l;adr1_h;l2;adr2_l;adr2_h;;2;;MV;Transport rechts beginnend mit Auffüllen von NUL bis Adr. 1 18;l;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;TR;Codewandlung 19;l;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;N;Logisches UND 20;l;adr1_l;adr1_h;adr2_l;adr2_h;;;1;;ENTD;Numerische Eingabe über die Tastatur mit Anzeige auf Dialoggerät und Speicherung 21;p10;adr_l;adr_h;;;;;1;;ENTP;Numerische Eingabe gepackt mit Speicherung 22;l;adr_l;adr_h;;;;;1;;ENTS;Zeicheneingabe, abbruch bei Zeichenzahl 23;l;adr_l;adr_h;nz;;;;1;;ENTF;Mehrzeilige Zeicheneingabe 24;l;adr_l;adr_h;;;;;1;;ENT;Numerische Eingabe 25;l;adr_l;adr_h;;;;;1;;ENTM;Zeicheneingabe mit Speicherung 26;l;adr_l;adr_h;nz;;;;1;;ENTU;Ändern von Zeichen auf Dialoggerät über Tastatur 27;par;adr_l;adr_h;g;;;;1;;CD; 28;l;adr1_l;adr1_h;g;adr2_l;adr2_h;;1;;PUT;Ausgabe numerischer Daten auf das logische Gerät g 29;p10;adr_l;adr_h;g;m;;;1;;PUTP;Ausgabe gepackter Dezimalzahlen auf das logische Gerät g 30;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;;AB;Binäre Addition 31;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;;SB;Binäre Subtraktion 32;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;;MB;Binäre Multiplikation 33;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;;CB;Binärer Vergleich 34;l;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;CV;Konvertieren Dezimalzahl in Binärzahl 35;l;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;CVC;Konvertieren Binärzahl in Dezimalzahl 36;p12;adr1_l;adr1_h;adr2_l;adr2_h;m;;2;;UNPK;Konvertieren Dezimalzahl in gepackte Dezimalzahl 37;p12;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;PACK;Konvertieren gepackte Dezimalzahl in Dezimalzahl 38;p11;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;CVB;Konvertieren gepackte Dezimalzahl in Binärzahl 39;p11;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;CVD;Konvertieren Binärzahl in gepackte Dezimalzahl 40;z2;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;READ;Lesen eines Satzes von Datenträger 41;z3;adr1_l;adr1_h;adr2_l;adr2_h;adr3_l;adr3_h;;3;READD;Lesen eines Satzes von Datenträger direkt adressiert 42;z4;adr1_l;adr1_h;adr2_l;adr2_h;adr3_l;adr3_h;;3;READK;Schlüsselindiziertes Lesen eines Satzes auf Datenträger 43;z1;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;READS;Suchen eines Satzes entsprechend einer Suchmaske 44;z2;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;WRITE;Schreiben eines Satzes auf Datenträger 45;z3;adr1_l;adr1_h;adr2_l;adr2_h;adr3_l;adr3_h;;3;WRITED;Schreiben eines Satzes auf Datenträger direkt adressiert 47;z3;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;ONF;Herstellen einer Verbindung zwischen UP und Datei 60;d1;adr_l;adr_h;;;;;1;;MVI;Transport Direktoperand 61;d1;adr_l;adr_h;;;;;1;;CLI;Vergleich mit Direktoperand 62;d1;adr_l;adr_h;;;;;1;;TM;Prüfen der Bitkonfiguration ein Byte 63;d;2;adr_l;adr_h;;;;1;;CBI;Binärer Vergleich mit 2 Byte Direktop. 64;d;2;adr_l;adr_h;;;;1;;MVBI;Transport eines 2 Byte Direktoperanden 65;d;2;adr_l;adr_h;;;;1;;ABI;Addition eines 2 Byte Direktoperanden 66;adr_l;adr_h;;;;;;1;;MLF;Modifikation 2. Byte Folgebefehl 67;adr_l;adr_h;;;;;;1;;MLS;Modifikation 5. Byte Folgebefehl 68;adr_l;adr_h;;;;;;1;;MVA;Transport Starttastenregister A an Adresse 69;adr_l;adr_h;;;;;;1;;MVN;Transport Starttastenregister N 69;adr_l;adr_h;;;;;;1;;MVN;Transport Starttastenregister N an Adresse 0a;l;adr_l;adr_h;;;;;1;;PL;Laden von Parameterliste vom Haupt- in Unterprogramm (im Unterprogramm) 0b;adr_l;adr_h;;;;;;1;;CALL;Aufruf Unterprogramm in Makrobefehlssprache 0c;adr_l;adr_h;;;;;;1;;CALC;Aufruf Unterprogramm in Maschinensprache U880 0d;"""F0""";adr_l;adr_h;;;;;1;;B;Unbedingter Sprung 0d;n0;adr_l;adr_h;;;;;1;;BC;Bedingter Sprung in Abh. von Bedingungscode 1a;l;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;O;Logisches ODER 1b;l;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;X;Logisches XOR 1c;l;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;CLC;Logischer Vergleich links beginnend 1d;l;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;MVC;Transport links beginend 2a;l;adr_l;adr_h;g;;;;1;;PUTC;Zeichenausgabe aus Speicher auf logisches Gerät g 2b;l;adr_l;adr_h;g;ns;;;1;;PUTF;Mehrzeilige Ausgabe auf ein logisches Gerät 2c;par;H;V;g;;;;0;;POS;Positionierung von Zeichen auf einem Ausgabegerät 2d;l;adr_l;adr_h;g;;;;1;;GET;Eingabe von logischem Gerät g 2e;fctc;adr_l;adr_h;;;;;1;;CTRL; 3a;p1;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;AP;Addition gepackt 3a;p2;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;APR;Subtraktion gepackt bei gesetztem K0-Bit 3a;p3;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;SP;Subtraktion gepackt 3a;p4;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;SPR;Addition gepackt bei gesetztem K0-Bit 3a;p5;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;MP;Multiplikation gepackt 3a;p6;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;D;Division gepackt 3a;p7;adr1_l;adr1_h;adr2_l;adr2_h;;;2;;CP;Vorzeichengerechter Vergleich gepackt 3c;p8;adr_l;adr_h;;;;;1;;SL;Linksverschiebung gepackt 3c;p9;adr_l;adr_h;;;;;1;;SR;Rechtsverschiebung gepackt 3d;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;;BCT;Bedingter Sprung in Abh. von einem Zählwert 3e;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;;BX;Befehlsaustausch mit Modifizierung 3f;adr1_l;adr1_h;adr2_l;adr2_h;;;;2;;TIMER;Bedingter Sprung in Abh. von Zeit 6a;adr_l;adr_h;;;;;;1;;GUIDE;Bedienerführung 6b;adr_l;adr_h;;;;;;1;;OPEN;Öffnen einer Datei 6c;adr_l;adr_h;;;;;;1;;CLOSE;Schließen einer Datei 6d;adr1_l;adr1_h;adr2_l;adr2_h;;;;1;;WAITC;Warten auf Beendigung E/A Operation u testen fehlerfreie Ausf. 6e;adr_l;adr_h;;;;;;1;;WAIT;Warten auf Beendigung E/A Operation c0;;;;;;;;0;;EOI;Aufheben des Interpreterstatus (alle folgenden Befehle CPU-Befehle) c1;;;;;;;;0;;RET;Rückkehr vom Unterprogramm in rufendes Programm c2;;;;;;;;0;;EOP;Ende eines Programms c4;l;15;;;;;;0;;SETS;Setzen Selektoren Gruppe S c5;l;15;;;;;;0;;RESS;Rücksetzen Selektoren Gruppe S c6;l;15;;;;;;0;;SETK;Setzen Selektoren Gruppe K c7;l;15;;;;;;0;;RESK;Rücksetzen Selektoren Gruppe K ca;d1;;;;;;;0;;SETPS;Setzen Programmstatus cb;;;;;;;;0;;EXIT;Aufheben Unterbrechungsstatus cc;;;;;;;;0;;OFF;Ausschalten des Gerätes cd;0;adr_l;adr_h;;;;;0;1;ADRE;Bereitstellen Endadresse RAM cd;1;adr_l;adr_h;;;;;0;1;ADRD;Bereitstellen Anfangsadresse Bildwiederholspeicher cd;2;adr_l;adr_h;;;;;0;1;CLOCK;Bereitstellen der akt. Zeit cd;3;adr_l;adr_h;;;;;0;1;DATE;Bereitstellen des akt. Datums cd;4;adr_l;adr_h;;;;;0;1;SETC;Eintrag Zeit in Zeitregister cd;5;adr_l;adr_h;;;;;0;1;SETD;Eintrag Datum in Datumsregister (8 Byte) cd;9;adr_l;adr_h;;;;;0;1;CALP;Laden Programm aus Phasenbibliothek und Starten Programm ef;;;;;;;;0;;SOP;Start eines Makroprogramms |
|