Olivetti P6060

  • Und da die stackrelevanten Opcodes ja offenbar Interesse finden, hier mal ein Beispiel wie das in existierendem Code aussieht:


    Code
                ;-- segment.s23:
    
                0x00003984      180d           lr r0, r13                  ; prolog 124
                0x00003986      41d0007c       la r13, 124
                0x0000398a      23dd           asa r13, r13
                0x0000398c      5000d000       st r0, 0(,r13)
                0x00003990      9029d004       stm r2, r9, 4(r13)
                0x00003994      0570           balr r7, r0                 ; balr.r7_3996

    Ah ja, das entspricht dem PROC Macro in der Form

    Code
            PROC R2,R9,ENDLOC=X+124,STARLOC=X


    Die "arg" sind Pseudo-Opcodes weil das dumme Radare2 mit der variablen Argumentzahl nicht klarkommt (wie es auch mit einigen anderen Dingen in diesem Befehlssatz nicht klarkommt).


    Tsts, und das von einem Unix-tool :))


    Erklärt auch warum ich so Schwierigkeiten beim lesen habe: /360 Mnemonics und Adressen in Kleinbuchstaben schaut aus wie Kauderwelsch, ich muss dauernd die Augen zusammenkneifen und im Kopf in Groß übersetzen bevor es Sinn ergibt :)) Genauso die durchgehende Verwendung von dezimalen Offsets bei Adressen.


    Code
    ----------- ; done
      └└└─└└└─> 0x00003cba      9324742a       ??93 1066(r7), 36           ; 0x3dc0
         │      0x00003cbe      5010c130       st r1, 304(,r12)
         │      0x00003cc2      9829d004       lm r2, r9, 4(r13)
         │      0x00003cc6      58d0d000       l r13, 0(,r13)
         │      0x00003cca      4100007c       la r0, 124
         │      0x00003cce      2200           fsa r0, r0
         │      0x00003cd0      2800           retext 0


    Das entspricht ab Zeile 3CC2 einem Rücksprung mit Stackframe auflösen und Register wiederherstellen.


    Code
            PRET


    Interessant dabei dass hier ein 22 als RETEXT umgesetzt wird. Wo hast D das her? Im Manual wird zwar RETEXT erwähnt, aber nicht weiter beschrieben.


    RETEXT geht wohl zusammen mit CALEXT und dürfte die BALR variante des CALL/RETS Pärchens (9A/20) sein.


    Genauso interessant die Verwendung von CALLEXS. Von der Kodierung her ist es ein SI Befehl, und die Adresse schaut ganz nach der vorher aufgestellten Parameterliste aus. Entsprechend dürfte das 1. Byte in Immediate sein, was sinn macht wenn man den als einen SVC mit Parameterliste auffasst. Packt den sonst so üblichen LA R1,par/SVC xx in einen einzigen Befehl. Spart Speicher.


    Lustig ist, dass diese Befehle zwar in der Befehlsübersicht des P6066 Manuals auftauchen, in der Beschreibung aber nicht, dafür aber in der Macroauflistung von PRET sowie bei der Beschreibung der/einiger Aufrufe in Kapitel 6, aber ohne genaue Beschreibung. Im P6066 Assembler Manual ist davon nur noch die Macroauflistung erhalten. Der Bearbeiter konnte die wohl nicht wegmachen ohne alles umzuschreiben :))


    Es muss also wo noch ein 'Systemprogrammierer'-Manual geben die ACT, CALEXS, CALEXT, RETEXT und RLSEM erklärt. ACT und RLSEM scheinen zur Verwaltung dynamisch geladener Erweiterungen zu sein. Wirklich nett was die alles ausgeknobelt haben.


    Der 93 ist übrigens einer von den undokumentierten Opcodes, vermutlich I/O.


    Kann sein. Weis nicht. 93 ist bei der /360 der TS - Test and Set - also locking. Dazu passt aber nicht unbedingt der Code der danach kommt.


    Wär interessant zu sehen was auf Adresse 3BDC ff und 3BE0 ff steht. Beides Wort-Adressen.


    In die lokalen Unterroutinen springen sie dann aber doch mit BAL oder BALR an und nicht mit CALL.


    Der Ansprung mit CALL ist nur nötig wenn Parameter abgelegt werden. Ohne kann man gleich nur den BAL verwenden :))

  • > Interessant dabei dass hier ein 22 als RETEXT umgesetzt wird. Wo hast D das her?


    Geraten :) und verifiziert dadurch, dass es bis jetzt an allen Stellen passt. Wie auch ein paar andere Dinge, die ich bis jetzt nirgendwo gefunden habe.


    > Wär interessant zu sehen was auf Adresse 3BDC ff und 3BE0 ff steht. Beides Wort-Adressen.


    Mit großer Wahrscheinlichkeit 4 Bytes, die die I/O-Aktion beschreiben. Was alles nicht zu dem "i_o fisico in assembler" Dokument passt, wo es 8 Bytes sind, und anders aufgebaut. Wie gesagt, ich verstehe es noch nicht. Konkret:


    Code
                0x00003dbc      .byte 0x00
                0x00003dbd      .byte 0x2b
                0x00003dbe      .byte 0xef
                0x00003dbf      .byte 0xef
                0x00003dc0      .byte 0x01
                0x00003dc1      .byte 0xff
                0x00003dc2      .byte 0xff
                0x00003dc3      .byte 0xff


    37 und 36 sind wahrscheinlich Kanalnummern, wobei es auch da Umsetzungen zu geben scheint, so dass die Kanalnummern der Basic-Befehle nur bedingt helfen.


    > Es muss also wo noch ein 'Systemprogrammierer'-Manual geben die ACT, CALEXS, CALEXT, RETEXT und RLSEM erklärt.


    Das wäre schön, aber ich vermute stark, da gibt's nur interne Dokumentation. CALEXT und RETEXT kommen dauernd vor, CALEXS und CALL habe ich bis jetzt nirgendwo gesehen, und ACT und RLSEM auch nicht. ACT und RLSEM sollten auch ziemlich offensichtlich sein, die Module/Segmente sind auf S. 3-11 im "Manuale generale del systema" erklärt. Im "üblichen Betrieb" werden die einfach über CALEXT angesprungen, ohne locking.


  • > Interessant dabei dass hier ein 22 als RETEXT umgesetzt wird. Wo hast D das her?


    Geraten :) und verifiziert dadurch, dass es bis jetzt an allen Stellen passt. Wie auch ein paar andere Dinge, die ich bis jetzt nirgendwo gefunden habe.


    Ist das so ? :)) Würde es Dir was ausmachen die 'paar anderen Dinge' zu teilen? Ich würd die gerne in meine Tabelle aufnehmen.


    > Wär interessant zu sehen was auf Adresse 3BDC ff und 3BE0 ff steht. Beides Wort-Adressen.


    Mit großer Wahrscheinlichkeit 4 Bytes, die die I/O-Aktion beschreiben. Was alles nicht zu dem "i_o fisico in assembler" Dokument passt, wo es 8 Bytes sind, und anders aufgebaut. Wie gesagt, ich verstehe es noch nicht. Konkret:


    Code
                0x00003dbc      .byte 0x00
                0x00003dbd      .byte 0x2b
                0x00003dbe      .byte 0xef
                0x00003dbf      .byte 0xef
                0x00003dc0      .byte 0x01
                0x00003dc1      .byte 0xff
                0x00003dc2      .byte 0xff
                0x00003dc3      .byte 0xff


    4 Byte reichen nicht. Eine I/O Aktion braucht wenigstens eine Kanal/Geräteadresse, eine Befehl, eine Adresse und eine Länge. Längensind 16 Bit und Adressen wenigstens 24. zusammen mit Befehl und Gerät also wenigstens 7 Byte. Das was in dem i_o fisico in assembler steht macht schon sehr viel sinn.


    4 Byte hingegen, noch dazu auf Wort ausgerichtet ist mit hoher Wahrscheinlichkeit eine Adresse. Da bei Adressen von der Hardware nur die niedrigsten 24 Bit ausgewertet wurden war es bei der /360 Usus das erste Byte für Flags zu verwenden. Oft als Semaphor oder ähnliches. Werte ungleich 0 bedeuteten belegt, 0 frei.


    TS (93) ist dafür da das ununterbrechbar zu machen. Dazu wurde er ursprünglich als Funktion des Kernspeichers implementiert - Kernspeicher musste ja nach lesen wieder neu geschrieben werden. Das machte die Kernspeichersteuerung ganz alleine. Der TS griff da ein und sorge dafür dass immer FF zurückgeschrieben wurde. Da das im Lesen des Speicher ablief war es Atomar über den Speicher, das heisst weder ein anderer Prozess, noch eine andere CPU konnte das verfälschen. Als Ergebnis liefert TS zurück ob das gelesene (!) Highbit gesetzt war oder nicht.


    War es gesetzt gehörte das lock schon jemand anderem, war es nicht gesetzt, dann hatte man die Resource bekommen. In der Folge schrieb man dann oft in die unteren 7 Bit eine Kennung der Funktion oder des Prozesses um das debuggen einfacher zu machen.


    Wie gesagt, I/O haut mit nur 4 bye nicht hin. Was ich mir jedoch vorstellen könnte ist dass Olivetti daraus einen Super-TS gemacht hat der die üblichen Befehle zusammenfasst. Ähnlich wie mit dem CALEXS. Hier sogar noch sinnvoller da es eine aktive Warteschleife, bzw. Schleife mit test und einem OS-Aufruf durch einen einzigen Befehl ersetzt der dann gleich wartet bis das Lock belegt werden kann. Wäre sehr hilfreich und performancefördernd, gerade bei kleinem langsamen System. Im Microprogramm würde der durchlaufen wenn er das Lock belegen kann und einen Trap machen wenn nicht, so das das OS sehen kann was man anstelle macht.


    Nur mal so als Idee.


    37 und 36 sind wahrscheinlich Kanalnummern, wobei es auch da Umsetzungen zu geben scheint, so dass die Kanalnummern der Basic-Befehle nur bedingt helfen.


    Da ist ja eine Tabelle, die passt aber nicht zu den Nummern. Auch seh ich jetzt nur 36 in deinen Codestücken - also X'24', sowas ist meist binär. Und 24 im Gegenzug passt auch nicht zu den Befehlsnummern. Ich würde also erstmal der Semaphoridee weiter nachgehen.



    > Es muss also wo noch ein 'Systemprogrammierer'-Manual geben die ACT, CALEXS, CALEXT, RETEXT und RLSEM erklärt.


    Das wäre schön, aber ich vermute stark, da gibt's nur interne Dokumentation. CALEXT und RETEXT kommen dauernd vor, CALEXS und CALL habe ich bis jetzt nirgendwo gesehen, und ACT und RLSEM auch nicht. ACT und RLSEM sollten auch ziemlich offensichtlich sein, die Module/Segmente sind auf S. 3-11 im "Manuale generale del systema" erklärt. Im "üblichen Betrieb" werden die einfach über CALEXT angesprungen, ohne locking.

    Ich weis ja nicht wo Du genau schaust, aber CALL ist nur innerhalb kleiner (Anwendugs-)Programme sinnvoll, da die Zieladresse prinzipiell nur innerhalb des Adressbereichs des aktiven Moduls liegen kann (ja, man kann das Basisregister natürlich anders laden, aber das ist ungewöhnlich). Daher ist CALL für Userprogramme die Unterprogramme mit Parameterübergabe haben. Und das dürfe eher selten sein, da man sowas in klassischer /360 Manier eher mit globalen Datenstrukturen oder Zeigern in Registern macht.


    CALEXT hingegen sollte idR mit einem L Rx,=V'Modul' eigenleitet werden, einer Adresse die vom Linker bzw. Ladereingesetzt wird.


    Ich seh da jetzt nicht wie CALEXT die Anzuspringende Adresse aus der dynamischen Modulstruktur auf 3-11 bekommen soll. Weder in dem Code noch kann ichs mir zusammenreimen. Dazu ist die Tabelle zu dynamisch.


    Die in 3-11 aufgezeigte Modulstruktur scheint mir das zu sein was über CALEXS angesprungen wird. Dabei würde der Immediate (das 2. Byte von CALEXS) gegen den 2. Eintrag in der Tabelle gesucht. wird der gefunden, dann startet die Ausführung an der Adresse (II?) wie bei einem CALEXT (also BALR mit Parametern). Wenn kein Eintrag mit der Nummer gefunden wird, dann gibts einen Trap und das Basissystem (PICOS) kümmert sich ums nachladen.


    Erstmal nur ne Vermutung.

  • Raffzahn Du kannst auch gerne selbst schauen, das Repo mit Extrakten und Radare-Plugins is hier. Syntax läßt sich auch zu Großschreibung und Hexadezimal ändern. Das alles ist WIP und teilweise etwas halbgar.


    Nur meine halbgaren Anmerkungen zu diversen Modulen sind nicht drin, die müssen noch in Radare-Befehle übertragen werden. Und ich muss Radare noch irgendwie dazu überreden, dass er Referenzen sinnvoll auflöst.


    Den Link hast du wahrscheinlich auch schon vor einem Jahr gesehen.

  • Da bei Adressen von der Hardware nur die niedrigsten 24 Bit ausgewertet wurden war es bei der /360 Usus das erste Byte für Flags zu verwenden.

    Das ist bis jetzt auch nur fundierte Spekulation, aber die P6060 hat für den /360-Adressraum nur 64K, also 16 bit-Adressen, die ein Byte addressieren.


    Der Mikrocode benutzt 16-bit Adressen, die ein Wort adressieren (d.h. der /360-Adressraum erscheint in der unteren Hälfte).


    Siehe das verlinkte Patent für Details, sowie das STAC-4 Dokument für ein paar Adressen:

    Code
    Physical memory map: Slot/Piastra, range, ...
      6  0000-1FFF  RAM Software  (16 K)
      6  2000-7FFF  RAM Utente    (48 K max)
      7  8000-87FF  ROM 4K
      8  8800-BFFF  RAM firmware  (24 K)
  • Wenn's ein 5100 und kein 5110 ist, würden wir den gerne adoptieren. Dann könnte ich mein Reverse-Engineering mit dem Disassemblieren der ROS beim 00er fortführen.

  • Das sind normale Disketten im 3740-Format. Natürlich nicht mit dem IBM Directory-System. Ich hatte mal alle unsere 6060-Disketten vor Jahren gesichert.

    @OP: Es gibt kein /360-Format.

  • Die ERMAP ist übrigens immer noch EBCDIC:



    Aber ich weiss nicht, ob die auf der P6060 überhaupt benutzt wird.

    Dein Tool ist kaputt. Der Text sollte ERMAP lauten, nicht EYTAW. Bei EBCDIC liegen die Buchstaben lochkartenbedingt in 9er-Gruppen ($C1-C9, $D1-D9 und $E2-E9)

  • Dein Tool ist kaputt. Der Text sollte ERMAP lauten, nicht EYTAW. Bei EBCDIC liegen die Buchstaben lochkartenbedingt in 9er-Gruppen ($C1-C9, $D1-D9 und $E2-E9)


    Das Tool zeigt ASCII an, nicht EBCDIC. (Was wesentlich sinnvoller ist, wenn die meisten Texte in ASCII sind...) Genauer gesagt, es zeigt 7-bit ASCII an, und ignoriert das 8te Bit.



    Code
    echo 'ERMAP' | iconv -f ascii -t ebcdic-us - | hexdump -C
    00000000  c5 d9 d4 c1 d7 25                                 |.....%|
  • Raffzahn Du kannst auch gerne selbst schauen, das Repo mit Extrakten und Radare-Plugins is hier. Syntax läßt sich auch zu Großschreibung und Hexadezimal ändern. Das alles ist WIP und teilweise etwas halbgar.


    Nett.


    > C.C. = condition code, 2 bit, used with 4 bit mask in branch?


    Ja. Jeder Befehl hinterläßte einen eindeutigen CC. Vergleiche z.B.


    0 für Gleich

    1 für Kleiner

    2 für Größer


    Integerrechnung das gleiche plus


    3 für Überlauf


    Die ganzen Vorzeichenlosen packen da dann Zero und Carry rein


    00 -> NC,Z

    01 -> NC,NZ

    10 -> C,Z

    11 -> C,NZ


    Die 4 bit in der Maske des BC(R) können den 4 möglichen werten


    1 -> 3

    2 -> 2

    4 -> 1

    8 -> 0


    Entsprechend kann man dann alle Kombinationen die es so braucht in einem Test machen, anstelle mehrere Sprünge zu brauchen wie z.B. auf einer Z80:


    47 8x -> Springen wenn Gleich

    47 Ax -> Springen wenn Gleich oder Größer

    47 6x -> Springen wenn Ungleich

    ...


    > Den Link hast du wahrscheinlich auch schon vor einem Jahr gesehen.


    Ja, und gefreut dass sich da jemand die Arbeit macht.


    Da bei Adressen von der Hardware nur die niedrigsten 24 Bit ausgewertet wurden war es bei der /360 Usus das erste Byte für Flags zu verwenden.

    Das ist bis jetzt auch nur fundierte Spekulation, aber die P6060 hat für den /360-Adressraum nur 64K, also 16 bit-Adressen, die ein Byte addressieren.


    Der Mikrocode benutzt 16-bit Adressen, die ein Wort adressieren (d.h. der /360-Adressraum erscheint in der unteren Hälfte).


    Also das widerspricht sich jetzt irgendwie. Wenn der Microcode Wortadressierung verwendet, dann sind es 256 Ki Bytes die adressiert werden können. Wieso der /360 Microcode dann nur die ersten 64 Ki davon adressieren können erschließt sich mir nicht. Kann es Sein dass es da noch eine Verwechselung zwischen Byteadressierung der Befehle und Wortorganisation des Speichers gibt? Das zu trennen war ja (einer) der genialen Dinge die die /360 gebracht hat: Die Trennung von Speicherschnittstelle und Adressierung. Aus Befehlssicht war der Speicher byteorganisiert (mit der Einschränkung dass Halbwort-, Wort- und Doppelwort-Zugriffe ausgerichtet sein mussten), auf der Speicherschnittstelle waren zugriffe aber immer 32 Bit oder mehr (die ersten kleine -30 ausgenommen, die arbeitete mit 16 bit Speicher).


    Könnte es daher nicht auch bei der P6060 so sein, dass der Speicher als Wort adressiert wird? Dann geht mit 16 bit Speicheradressen problemlos eine Adressierung von 256 KiB. Adressen die aus den niederwertigen 18 bit der effektiven Adresse der /360 Logik stammen.


    Das würde dann auch eher zu der P6066 die ich hier stehen habe passen - die hat 112 KiB Speicher eingebaut. Wär schon arg doof wenn davon mehr als die Hälfte nicht verwendbar wär.


    Siehe das verlinkte Patent für Details, sowie das STAC-4 Dokument für ein paar Adressen:

    Code
    Physical memory map: Slot/Piastra, range, ...
      6  0000-1FFF  RAM Software  (16 K)
      6  2000-7FFF  RAM Utente    (48 K max)
      7  8000-87FF  ROM 4K
      8  8800-BFFF  RAM firmware  (24 K)

    Äh, irgendwie addieren sich die werte nicht so ganz auf wenn das Byteadressen sein sollen:


    0000-1FFF sind für mich nur 8 Ki, keine 16

    2000-7FFF entsprechend auch nur 24 Ki

    8000-87FF sind 2 Ki

    und

    8800-BFFF sind 14 Ki, keine 24


    Wenn man mal annimmt dass das letzte einfach ein Tippfehler ist (hatte es schon einige) , dann schaut doch alles nach Faktor 2 aus - wie als wenn der Speicher nicht als 8 bit Worte, sondern 16 Bit Worte organisiert ist und die Adressbreite 16 bit, dann komm ich auf 64Ki Worte oder 128 Ki Byte ... was auch eher zu meiner P6066 mit 112 KiB RAM passt. Die Tabelle für den RAM Ausbau auf Seite 9 des STAC-4 weist das gleiche Phänomen auf, da wird dem Adressbereich 0000-7FFF, was 32 Ki Adressen sind beschieden 48KiB User-RAM (Utente) zu bieten, was 64 KiB physikalischem (fisici) RAM entspricht (16 KiB verwendet das System).


    Auf Seite 5 von STAC-2 gibt es eine Tabelle die 16 bit Adressen verwendet, im Kopf aber in 4 Ki Schritten von 0 bis 128 geht.


    Ergo: Der Speicher ist logisch wahrscheinlich als 16 Bit (32 Bit wie vor angenommen wohl nicht) organisiert, angesprochen mit 16 bit (Halb)Wortadressen. Daher braucht das Microprogramm nur 16 bit Speicheradressen in den Befehlen. wie die beiden Bytes im Wort adressiert werden müsste man im Microprogramm sehen.


    ---


    STAC-4 zeigt auch auf Seite 11 und 24 die physikalischen Kanalnummern. Die Nummerierung passt zu der Darstellung auf Seite 108 vom I/O fisico, spalte FISICO. Belegt Damit auch, dass jeder der UART wirklich gleich 2 Kanäle belegt. Seite 23 löst auch die Frage was das fehlende Bit in der Geräteadresse ist: Die Richtung :))


    ---


    Ach ja, das ganze hierändert natürlich nichts an der bei /360 Programmen üblichen Verwendung des ersten Bytes eines Wortes (und Adressen sind doch immer noch Worte in den P6060 Programmen (bearbeitet mit L/ST)?) um das es in der ursprünglichen Passage ging.

  • ...


    > Äh, irgendwie addieren sich die werte nicht so ganz auf wenn das Byteadressen sein sollen:


    Es sind Wortaddressen ("phyisch" = was der Mikrocode sieht). Die Größenangaben dagegen sind Bytes (um die mit den Prospekten in Einklang zu bringen).


    > Ergo: Der Speicher ist logisch wahrscheinlich als 16 Bit (32 Bit wie vor angenommen wohl nicht) organisiert, angesprochen mit 16 bit (Halb)Wortadressen. Daher braucht das Microprogramm nur 16 bit Speicheradressen in den Befehlen. wie die beiden Bytes im Wort adressiert werden müsste man im Microprogramm sehen.


    So ist es. Wahrscheinlich habe ich mich schlecht ausgedrückt.


    > und Adressen sind doch immer noch Worte in den P6060 Programmen


    Ich habe bis jetzt eigentlich immer nur relative Adressen gesehen, nie irgendwo absolute. Die Module sind verschiebbar, alle Adressen dort relativ. Referenzen auf Systemtabellen über R12 und R13, auf den Stack mit R14. Aber vielleicht stolpere ich mal über eine.

  • Wenn's ein 5100 und kein 5110 ist, würden wir den gerne adoptieren. Dann könnte ich mein Reverse-Engineering mit dem Disassemblieren der ROS beim 00er fortführen.

    es war die 6060 gemeint !


    Roland

    Zitat

    Unsere IBM 5100 musste auch schon von ihrem angestammten Platz weichen, weil wir Platz brauchen

    Das meinte ich ;)

  • > Ergo: Der Speicher ist logisch wahrscheinlich als 16 Bit (32 Bit wie vor angenommen wohl nicht) organisiert, angesprochen mit 16 bit (Halb)Wortadressen. Daher braucht das Microprogramm nur 16 bit Speicheradressen in den Befehlen. wie die beiden Bytes im Wort adressiert werden müsste man im Microprogramm sehen.


    So ist es. Wahrscheinlich habe ich mich schlecht ausgedrückt.


    Was halt bedeutet dass eine adresse im /360 Code wenigstens 17 gültige Bits hat - sprich mindestens 3 Byte zum Abspeichern braucht. Damit gelten die gleichen Regeln wie IBM: Eine Adresse hat 24 Bit und wird in einem Wort gespeichert und die Leute missbrauchen die obersten 8 bit für Flags/Marker/Locking. Dass von den 24 jetzt nur 17 gültig sind macht da keinen Unterschied.


    Und das ist genau was bei den beiden Fällen mit 93 mir aufgefallen ist.


    Deswegen muss auch in einen Start-IO das CCW aus mindestens 7 Byte bestehen. Weniger hat nicht genug Platz für alle benötigte Information. Test-IO und ähnliches kommt mit weniger daten aus.


    > und Adressen sind doch immer noch Worte in den P6060 Programmen


    Ich habe bis jetzt eigentlich immer nur relative Adressen gesehen, nie irgendwo absolute. Die Module sind verschiebbar, alle Adressen dort relativ. Referenzen auf Systemtabellen über R12 und R13, auf den Stack mit R14. Aber vielleicht stolpere ich mal über eine.


    Das (fast) alle Adressierung im Code Register-Relativ sind ist auch einer der genialen Züge die Amdahl gemacht hat (Fast weil ja auch ZP geht). Ist aber halt nur im Code. Und da jede Adressierung über ein Register geht müssen Adressen auch dorthin gelangen. Für die Adressierung im Code gibts da den Sonderfall des BALR Rx,0 der Rx mit der Adresse des nächsten Befehls läd - damit kann relativer Code die eigene Adressierung (BR 47 ..RX...) und die der statischen Datenbereiche im Code wie Münchhausen am Schopf aus dem Sumpf ziehen.


    Zwischen Modulen (oder Systemaufrufen) klappt das nicht. Man könnte zwar S-Adressen verwenden, macht man aber kaum, weil eher unhandlich zum Auflösen (braucht mehrere Befehle inkl. EX). Schau einfach mal in dem Code den Du hast nach der allbekannten 'LA Rx/ST Rx' Kombination - das ist die Ablage einer absoluten Adresse in einem Wort um die an andere Module weiterzugeben - z.B. die Adresse eines Puffers mit/für Daten. Das Gegenstück ist 'L Rx' gefolgt von Befehlen (meist MVC, CLC, etc.) die dann Rx zum Adressieren verwenden, egal ob als Quelle oder Ziel.


    (Irgendwie hab ich da auf Github jetzt keine Codestücke gefunden, sonst hätt ich gleich mal Beispiele rausgesucht.)

  • Was halt bedeutet dass eine adresse im /360 Code wenigstens 17 gültige Bits hat - sprich mindestens 3 Byte zum Abspeichern braucht.

    Nein, sie hat 16 gültige Bits. An die Firmware (Mikrocode) kommt sie nicht ran. Siehe die Patente.


    > (Irgendwie hab ich da auf Github jetzt keine Codestücke gefunden, sonst hätt ich gleich mal Beispiele rausgesucht.)


    Da sind keine Codestücke, du musst Radere2 mit dem P6060-Plugin auf das P6SW-Extrakt anwenden. Dann hast du alles komplett. :)

  • Was halt bedeutet dass eine adresse im /360 Code wenigstens 17 gültige Bits hat - sprich mindestens 3 Byte zum Abspeichern braucht.

    Nein, sie hat 16 gültige Bits. An die Firmware (Mikrocode) kommt sie nicht ran. Siehe die Patente.


    Ich schätz mal wir reden gerade wieder aneinander vorbei. Die /360 Seite arbeitet mit Byteadressen, nicht Wortadressen. Entsprechend braucht es 17 bit um 128 KiB zu adressieren. Und genau das sind die 17 gültigen Bits die Bedingen dass es 3 von 4 Bytes eines Adressworts belegen. Nicht? Dass der Microcode die oberen 16 dann als 16 bit Wortadresse verwendet und das niederwertigste zu Selektion des Bytes ist nicht das Problem des /360 codes - und auf der Ebene reden wir, oder nicht?


    > (Irgendwie hab ich da auf Github jetzt keine Codestücke gefunden, sonst hätt ich gleich mal Beispiele rausgesucht.)


    Da sind keine Codestücke, du musst Radere2 mit dem P6060-Plugin auf das P6SW-Extrakt anwenden. Dann hast du alles komplett. :)

    Ah. Passt. Den Spaß lass ich erstmal Dir :)) ::pc::

  • Ich schätz mal wir reden gerade wieder aneinander vorbei. Die 360 Seite arbeitet mit Byteadressen, nicht Wortadressen. Entsprechend braucht es 17 bit um 128 KiB zu adressieren. Und genau das sind die 17 gültigen Bits die Bedingen dass es 3 von 4 Bytes eines Adressworts belegen. Nicht?

    Fast richtig, aber es werden nur die unteren 64KiB addressiert. In den oberen 64KiB ist nur Mikrocode, auf den hat die /360-Seite keinen Zugriff (und braucht auch keine Zugriff) Deshalb sind es nur 16 gültige Bits. (Außerdem wäre es eine Verschwendung, den Mikrocode zu zwingen, für das eine Bit noch haufenweise zusätzlichen Code hinzustellen. Soviel Speicher hat das Ding nicht). Wie gesagt, siehe Patente.

  • Fast richtig, aber es werden nur die unteren 64KiB addressiert. In den oberen 64KiB ist nur Mikrocode, auf den hat die /360-Seite keinen Zugriff (und braucht auch keine Zugriff) Deshalb sind es nur 16 gültige Bits. (Außerdem wäre es eine Verschwendung, den Mikrocode zu zwingen, für das eine Bit noch haufenweise zusätzlichen Code hinzustellen. Soviel Speicher hat das Ding nicht).

    Und welchen Sinn macht dann bitte eine Speichererweiterung über 64 KiByte RAM hinaus - so wie ich sie in wenigstens 2 Maschinen hab:

    Das würde dann auch eher zu der P6066 die ich hier stehen habe passen - die hat 112 KiB Speicher eingebaut. Wär schon arg doof wenn davon mehr als die Hälfte nicht verwendbar wär.

    Der Microcode muss also einen Weg haben darauf zuzugreifen - so wie er einen Weg haben muss auf eigene Konstanten im eigenen Code zuzugreifen. So wie sich die Tabellen in den bisher zitierteten Papieren lesen hat die Kiste 64 Ki Adressraum und adressiert damit 16 bit Speicherworte. Die Unterscheidung High/Lowbyte braucht auch nicht Haufenweise code. Da gibts eine Vielzahl von Möglichkeiten das übersichtlich zu halten.


    Wie gesagt, siehe Patente.


    Patente sind keine Pläne und kein Beleg für eine Implementierung. Sie dienen zum Schutz einer grundsätzlichen Idee, nicht um den Nachbau zu ermöglichen oder den eigenen Rechner zu verstehen. Aus Erfahrung würde ich mich da nur auf den grundsätzlichen Aufbau verlassen, aber jedes Implementationsdetail hinterfragen.

  • Hier noch ein paar Bilder bevor ich die P6066 wieder zumache:



    Beschriftung der Einbauplätze von Oben nach Unten:

    BASIS-I/O, 2x Floppy, 2x CPU, RAM, ROM, RAM-Erweiterung, Freie Erweiterungen, ganz unten dann I/O-Kanal



    Mit Verkabelung und Steckern. Letztere sind interessant, da sie Ober- und Unterseite vertauschen.

    Die Stecker sind die Gleichen für das CPU-Doppel und die Floppy.

    Grund ist wohl dass man so die Baugruppen bei Entwicklung und Fehlersuche nebeneinander legen und mit einem direkten Kabel verbinden konnte.



    Basis-I/O:



    Floppy (Obere Platine)



    Floppy (Untere Platine)


    forum.classic-computing.de/index.php?attachment/173156/


    CPU (Obere Platine)



    CPU (Untere Platine)



    Basis-RAM (48 KiB) mit 4116ern.

    Interessant die Verwendung des 3242 DRAM Multiplexers/Refreshcounters. Sehr praktischer Chip der komischerweise bei Micros selten aufgetaucht ist.



    ROM. Wohl hauptsächlich Microcode.



    RAM-Erweiterung (64 KiB, auch 4116)


  • Eine hab ich noch:


    Der Kanalcontroller/Interface:




    Die sichtbaren Kartenstecker gehören übrigens zu den Hartnäckigsten die ich je hatte. Fürs ziehen musste ich einen Kartenzieher basteln, weil die Greifer meines verstellbaren etwas zu dickwaren. Soweit normal. Aber fürs Reinstecken musste ich den Rechner gegen eine Wand stellen und mir eine 'Drückhilfe' bauen. Für einfach auf die Kante drücken waren meine Fingerchen zu schwach :))

  • Und welchen Sinn macht dann bitte eine Speichererweiterung über 64 KiByte RAM hinaus - so wie ich sie in wenigstens 2 Maschinen hab:

    Du brauchst immer 24K für den Mikrocode RAM, und wenn du 64K RAM unten noch hast, gibt das maximal 88K RAM.

    Das würde dann auch eher zu der P6066 die ich hier stehen habe passen - die hat 112 KiB Speicher eingebaut. Wär schon arg doof wenn davon mehr als die Hälfte nicht verwendbar wär.

    Das würde ich gerne sehen, wie die RAM-Karten da eingebaut sind, und ob die wirklich 112K hat. Die STAC-Dokumente erklären ja die RAM-Konfiguration.


    Unsere zwei P6060 waren klassizifizert nach "benutzbarem" RAM, die eine hatte 16K, die andere hatte 48K. Rechnet man 16K System-RAM unten und 24K Mikrocode-RAM dazu, sind das insgesamt 56K bzw. eben die 88K im Vollausbau.

    Der Microcode muss also einen Weg haben darauf zuzugreifen - so wie er einen Weg haben muss auf eigene Konstanten im eigenen Code zuzugreifen. So wie sich die Tabellen in den bisher zitierteten Papieren lesen hat die Kiste 64 Ki Adressraum und adressiert damit 16 bit Speicherworte. Die Unterscheidung High/Lowbyte braucht auch nicht Haufenweise code. Da gibts eine Vielzahl von Möglichkeiten das übersichtlich zu halten.

    Schau dir mal die ROMA, CRTA und CRTB Mikrocode-Befehle auf der einen Seite an (die lesen 16-bit Worte aus dem wort-addressierten Adressraum) und die MAD/AMD/AMI/BMI sowie AMIP/BMIP/MAIP/MBIP Mikrocode-Befehle auf der anderen Seite an (die schreiben und lesen 8-bit Bytes aus dem unteren byte-addressierten Adressraum, dazu wird der Shifter im Datenpfad benutzt, die oberen 15-bit produzieren die Wortadresse, und das niedrigste Bit steuert dedizierte Hardware für das low/high-byte an).


    Das ist alles so gemacht, dass man die unteren 64K RAM effizient für die CPU-Emulation verwenden kann, und aus den oberen 64K für Mikrocode-interne Zwecke nur gelesen wird.


    Die Infrastruktur für durchgehende 17-Bit Addressierung zu verwenden wäre dann sehr überraschend.


    Aber vielleicht hast du ja recht, und ich irre mich. Du hast ja Zugriff auf funktionierende P6060, also kann man das einfach testen: Schreibe ein kleines Assemblerprogramm, das z.B. 0x00000 (System-RAM) und 0x10000 (Boot-ROM) liest, und vergleiche die Werte. Wenn das wieder Erwarten funktioniert, und die /360-Seite wirklich Zugriff auf die oberen 64K hat, dann kannst die gleich den Boot-ROM dumpen, denn den bräuchte man noch.


  • So, nochmal nach dem RAM geschaut. In verschiedenen Versionen das STAC findet sich zunächst dieses hier:



    Also "48K MASSIMI", maximaler Nutzspeicher 48K, in Slots 4 und 5, Slot 6 hat 16K für das System, und Slot 8 hat 16K für die Firmware. (Das ist auch die Konfiguration, die hier auf der Olivetti P6060 klebt).


    Der Bereich 8800-9FFF ist nicht genutzt.


    Dann gibt es diese Variante:



    Im Prinzip wie oben, nur kann Slot 6 jetzt die ganzen 64K enthalten, und der Firmware-RAM ist auf 28K gestiegen (die 24K von mir waren ein Abschreibfehler). Immer noch 48K maximaler nutzbarer Speicher.


    Dann gibt es dieses hier, Notizen für die "neue 64K-RAM Karte":



    Man kann da also mit Banking und Klingelchen und Glöckchen spielen, aber das Grundlayout des Speichers bleibt wohl gleich.

  • Und hier kann man den Konfigurations-Aufkleber einer P6066 sehen:



    Das entspricht der Speicheraufteilung im zweiten STAC: Slot 6 kann bis zu 64K für den unteren Speicher, von den 32K im oberen Speicher werden wahrscheinlich 4K durch den ROM überlagert. Mehr ist nicht vorgesehen.


    Raffzahn, wenn deine P6066 einen ähnlichen Aufkleber hätte, wäre das interessant, denn ich verstehe wirklich nicht, wie 64K und 48K in dieses Schema passen.


    In dem STAC mit der 64K-Karte ist noch eine interessante Beispielkonfiguration:



    Man beachte das Loch bei C000-C800, das dem ROM bei 8000-8800 entspricht. Sie schreiben leider nicht dazu, wozu man diese Konfiguration gebrauchen kann. Es gibt Anzeichen, dass der Mikrocode nur 10-Bit Springadressen verwendet, und damit wirklich auf 8000-BFFF beschränkt wäre. Dann wäre diese Erweiterung auch nicht für mehr Overlay-RAM für die Firmware zu gebrauchen.


    Oder man kann tatsächlich den ROM auf C000-C7FF verschieben. Dann wäre die Firmware in den ganz oberen 32K, und man hätte 64K+32K zusammenhängenden Speicher für den /360-Teil. Das bräuchte dann wirklich ein 17tes Bit, und in diesem Fall würde ich erwarten, dass die zugehörige Firmware auf den Systemdisketten signifikant anders ist als bei der P6060 und der P6066 mit der "klassischen" Aufteilung.


    Raffzahn, falls deine P6066 also Systemdisketten hat, die wirklich mehr RAM als 64K nutzen (sollte ENVIRONMENT eigentlich anzeigen), wäre ein Image davon extrem interessant.

  • Hier noch ein paar Bilder bevor ich die P6066 wieder zumache:

    Basis-RAM (48 KiB) mit 4116ern.

    Interessant die Verwendung des 3242 DRAM Multiplexers/Refreshcounters. Sehr praktischer Chip der komischerweise bei Micros selten aufgetaucht ist.

    Und vielleicht bin ich ja blind, aber ich zähle da 17x einen 4116-Chip (in der unteren Reihe ist noch ein artfremder dazwischen). Das wären dann 16 Bit + Parität auf 16K, also zusammen 32K (und nicht 48K), was auch zu der Bezeichnung "ME006" passt.


    Damit hättest du dann die normale Konfiguration der P6066.

  • 1ST1 Kurzes Update: Ich war heute im Technikum, und mit freundlicher Unterstützung von Roland_t29 habe ich mal versucht, ein paar von den Disketten als Images zu sichern. Die Disketten sind in schlechtem Zustand (sieht man teilweise auch mit bloßem Auge, einige haben erkennbare Flecken wie die, die in den Laufwerken waren). Nachdem ich die Number of Retries in Imagedisk auf 10 hochgesetzt hatte, ging es etwas besser, aber die vielen Lesefehler machen das eine sehr langwierige Geschichte. Nach einem halben Tag Arbeit hatten wir ein einziges Image ohne Fehler, und 5 Images mit zwischen 4 und ca. 60 kaputten Sektoren.


    Evtl. muss dann da doch Kryoflux ran.


    Das Image ohne Fehler war übrigens eine Systemdiskette. Das Betriebssystem ist Release 3.0.

  • 1ST1 Kurzes Update: Ich war heute im Technikum, und mit freundlicher Unterstützung von Roland_t29 habe ich mal versucht, ein paar von den Disketten als Images zu sichern. Die Disketten sind in schlechtem Zustand (sieht man teilweise auch mit bloßem Auge, einige haben erkennbare Flecken wie die, die in den Laufwerken waren). Nachdem ich die Number of Retries in Imagedisk auf 10 hochgesetzt hatte, ging es etwas besser, aber die vielen Lesefehler machen das eine sehr langwierige Geschichte. Nach einem halben Tag Arbeit hatten wir ein einziges Image ohne Fehler, und 5 Images mit zwischen 4 und ca. 60 kaputten Sektoren.


    Evtl. muss dann da doch Kryoflux ran.


    Das Image ohne Fehler war übrigens eine Systemdiskette. Das Betriebssystem ist Release 3.0.

    Kryoflux wird das nicht viel besser können, aber vlt. hast du ja Glück.

    Hast du die Scheibe aus der Hülle rausgenommen und gereinigt? (Wasser/Spüli oder, was ich bevorzuge, Screen99). Das mache ich bei fleckigen und gammeligen Disketten immer.