PROM-Inhalte zusammenführen und binär darstellen

  • Hallo ich habe ein Problem!


    Ich habe drei PROMs je 1k x 8. Diese sind im Computer so zusammengeschaltet, daß jede Adresse ein 24 Bit Wort (3 x 8 Bits) liefert.

    Wie bekomme ich diese 24 Bits aus den drei Prom-Dateien zusammengesetzt und in binärer Form angezeigt/ausgedruckt.

    PROMs.zip


    Gruß Axel

  • Ich würde ja ein kleines Progrämmchen in Java schreiben:
    1) Die drei Dateien öffnen und in je ein Bytearray einlesen.
    2) Neues int Array erstellen: int[] result = new int[1024]
    3) Schleife über die 1024 Bytes
    4) Darin den Wert zusammensetzen: result[i] = arr1[i]<<16 + arr2[i]<<8 + arr3[i]

    5) Dann speichern, drucken oder was anderes damit anstellen


    Also ungefähr so ...



    ::heilig::

  • Es war schon spät ...
    In der Schleife müsste es für korrekte Ergebnisse wie folgt aussehen


    Code
    for (int i=0; i<1024; i++) {
        result[i] = ((d1[i] & 0xFF) << 16) + ((d2[i] & 0xFF) << 8) + (d3[i] & 0xFF);
        System.out.println(String.format("Address %04X = %08X", i, result[i]));
    }

    Ob die Reihenfolge der Bytes korrekt ist, kann ich nicht sagen.

  • Ich würde ja ein kleines Progrämmchen in Java schreiben:

    Ich kenne mich mit Java nicht aus, deshalb die Fragen bitte als Fragen und nicht als Rechtfertigung verstehen.


    Ist "d[i] & 0xFF" nötig, weil d[] doch als byte definiert ist und daher sowieso 8bit breit ist?


    Und m.E. muss result kein Array sein. Der Ergebnis, das in result[] gespeichert wird, ist ja nur temporär.

    Aber das nur nebenbei.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Es gibt eine sehr schöne Seite mit einem EPROM Brenner Tool, die hier auch schon paarmal verlinkt war (mir fällt nur gerade nix passendes ein, vielleicht findet es sich ja noch) und das genau das kann. Ob mit 3 EPROMs kann ich nicht sagen, aber wahrscheinlich auch das.


    Ansonsten ist der Ansatz von oben brauchbar. Man kann das sogar auf der Kommandozeile (Unixoide) machen. Das sieht dann so aus



    Eingabe sind die (Filelänge-1) und die drei Namen. Also z.B. für 3 Files mit 1024 Byte Länge


    rommixer 1023 rom1 rom2 rom3


    Das Skript sammelt (auf eine unglücklich komplizierte Weise) jeweils ein Byte von jeder der drei Dateien ein und schreibt diese hintereinander in out.file in der Reihenfolge wie in der Befehlszeile. Danach dann das nächste Byte usf - von 0 bis zur eingegebenen Zahl.


    Wenn man das mehrmals laufen lassen will, muß zwischendurch das out.file immer per Hand gelöscht werden.



    Kein Ahnung, wie gut das klappt, sollte aber.



    Anzeigen geht am Besten mit einem Hexeditor. "hexdump" ("hd") oder "tweak" wären Linuxvarianten, sowas gibt es aber für alle Systeme.


    Wenn Du es als 32 Bit Zahlen haben willst, müßtest Du noch eine weitere Datei anlegen, die nur "00" Bytes enthält und diese als vierte dazubringen. (braucht dann eine weitere "dd" Zeile im Script, genau wie die anderen, nur eben mit "f4", und noch dazu "f4=$5" am Beginn).


    Wichtig ist außerdem die Reihenfolge der Bytes. Je nachdem was das Zielsystem erwartet, müßte "rom1 rom2 rom3" oder "rom3 rom2 rom1" benutzt werden zum Verknüpfen.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Wenn Du es als 32 Bit Zahlen haben willst, müßtest Du noch eine weitere Datei anlegen, die nur "00" Bytes enthält und diese als vierte dazubringen. (braucht dann eine weitere "dd" Zeile im Script, genau wie die anderen, nur eben mit "f4", und noch dazu "f4=$5" am Beginn).

    Oder für die vierte Datei einfach /dev/zero nehmen. Skip kannste dann auch weglassen.

  • Zitat

    Ist "d[i] & 0xFF" nötig, weil d[] doch als byte definiert ist und daher sowieso 8bit breit ist?

    Ja leider muss man das in Java so machen, die Schiebeoperationen erweitern byte automatisch nach int, natürlich Vorzeichengerecht. Das Array Result ist in dem Fall tatsächlich nicht notwendig, nur falls man das Ergebnis noch irgendwie weiterverarbeiten wollte.

  • Danke für Eure Antworten!

    Komisch war jetzt nur, daß bei mir die "Glocke" in der Programmkopfzeile des Forum nicht geläutet hat und

    ich diesen Thread im Forumsverlauf wiedersuchen musste.

    Sonst hätte ich eher reagiert.

    Beim Programmieren bin ich Laie. Assembler (Z80) kann ich teilweise verstehen und kleine Modifikationen vornehmen.


    Wofür ich das jetzt "brauche" mal kurz zusammengefasst:

    Die drei ROMs beinhalten den Microcode der 21MX CPU einer HP1000E

    Die CPU ist defekt. Hatte die ROMs mit Images von den Bitsavern schon mal neu erstellt, falls in den Alten etwas nicht mehr i.O.

    sein sollte. Hat am äußerlich sichtbaren Verhalten der CPU nichts geändert. Habe dann den Adressbus der ROMs mit einem LA angezapft

    und die Schritte im Microcode (gibt es von HP als lesbaren Code mit Kommentaren) nachverfolgt.

    Dabei konnte ich schon mal feststellen, daß die JUMP-Befehle nicht so funktionieren, wie sie sollten.

    Beispiel: Lt. Code soll an die Romadresse (OCT) 261 (=1011 0001) gesprungen werden. Springt dann aber gleich nach (OCT) 270 (=1011 1000)

    Lt Handbuch steht in den letzten Bits des 24-bittigen Microcode dieser Sprunganweisung die Ziel-Sprungadresse.

    Ich habe jetzt vor, anhand des Schaltplans herauszufinden, was/wer aus einer 1011 0001 eine 1011 1000 macht.

    Dafür brauche die 24-Bit Darstellung der ROM-Speicherstelle.


    Gruß

    Axel

  • Hier noch eine Powershell-Variante:

  • die Schiebeoperationen erweitern byte automatisch nach int, natürlich Vorzeichengerecht.

    Ich haette byte als unsigned angesehen, das dann auf unsigned int erweitert wird.

    Aber gut.

    Danke fuer die Info.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Hurra Hurra! :sunny:


    Der 21 M Prozessor der HP1000E funktioniert wieder.

    Und wie immer kleine Ursache große Wirkung:

    Ein Am9334 (74LS259) mit HP-Bezeichnung (3 zu 8 Dekoder)


    Dieser Baustein arbeitet als 3 zu 8 Multiplexer und generiert aus 3 Bits des Microcodes 8 Steuersignale für die CPU, nachdem die mit den passenenden

    Clocksignalen (davon gibt es mehrere) synchronisiert (NAND und andere Logikschaltungen )wurden.



    In diesem Falle das FETCH-Signal: MIR3 ist das Signal aus dem Multiplexer. Darüber MIR4 zeigt ein Clocksignal mit dem geNANDet wird. Heraus kommt

    das Fetch als LOW-Signal. Weiter rechts ist ein weiteres Signal aus dem zu diesen Zeitpunkt ge"disable"ten Multiplexer. Es tauchen sehr viele auf, aber

    solange die Clock nicht zeitgleich taktet gibt es keinen Fetch und stört nicht. Überhaupt soll das Signal nur einmal direkt nach dem Einschalten des Rechners kommen und die CPU warten lassen bis das Power-On (=Powergood) vom Netzteil kommt.

    Das FETCH-Signal resettet/löscht den Stack-Pointer. D.h. Die CPU hat vergessen wo die Rücksprungadressen (z. Bsp. beim Return-Befehl) abgelegt wurden.

    Ein Problem war, das man nur wenige der vielen Fetch-Signale sehen konnte. Das liegt darin begründet, daß das Clock-Signal die Signallänge

    definiert. Wenn sich das Signal aus dem Multiplexer nur ganz gering mit der Clock überschneitet wird das Signal ganz schmal. Wenn dann die Sample-Zeit

    des Logikanalysators nicht schnell genug eingestellt ist, werden sie als Signal nicht erkannt.

    Wir haben mit unserer Einstellung, die fur die normalen Signalbreiten ausgelegt war nur wenige gesehen. Außerdem lagen sie zunächst außerhalb

    der untersuchten Abschnitte. Die CPU blieb nach dem Resetten des Stackpointern ja nicht stehen, sondern verhielt sich wie "anschossen" und blieb

    irgendwann in einer Schleife hängen. Wir sind den Code Schritt für Schritt durch gegangen, um den (ersten) "Tatort" zu finden.

    War natürlich eine Stelle, bei der das Signal zu schmal für die Aufzeichnung war. Wir wussten daß was mit dem Stack nicht stimmt, aber warum.

    Wir haben die ICs des Stacks ausgelötet und ersetzt. Kein Fehler. Dann den Pointer mit allen Anschlüssen überprüft. An der Stelle gab es keinen

    Hinweis. Erst beim Durchscrollen tauchte ein sichtbares Fetch-Signal am Clear-Eingang des Pointers auf. Was macht das da? Gehört das dahin?

    Der Microcode an der Adresse sagt nein. Und dann gab ne noch mehrere dieser Signale. Wo kommen die her? usw. usw.

    So haben wir den Multiplexer gefunden.


    Der OP-Tisch: Das EKG wurde gerade abgeklemmt



    Da saß er (jetzt 74LS259)


    Die CPU


    Danke an alle, die uns hier geholfen haben :thumbup:


    Rolf und Axel


    PS: Wer es noch nicht mitbekommen hat Rolf ist mein Bruder. Uns gibt es immer im Doppelpack

  • Nachtrag:




    Hinter der Tür


    Die CPU befindet unten im CPU-Modul (Bedenplatte entfernt und von unten fotografiert)

    Durch die beiden Schächte links und rechts oben kommt Kühlluft von den Netzteillüftern und sorgt für Luftaustausch.

    50 Watt Strom werden hier vorallem in Wärme umgewandelt.


    Das ist die Huckepackplatine unten links.

    Es ist das FAB-Board zur Aufnahme von Erweiterungsroms. Sie ergänzen den Microcode auf der CPU-Platine, damit diese

    "lernt" das Bandlaufwerk und das Wechselplattenlaufwerk anzusprechen. Die notwendige Hardware, also die Interface-

    karten finden oben als Einsteckkarte in den BUS ihren Platz. Wie man sieht läßt sich das noch erweitern.

    Erwähnenswert sind noch die Transistoren im Metallgehäuse. Diese schalten den Strom für die ROMs ein und aus, je nachdem

    ob sie gerade gebraucht werden oder nicht. Man könnte meinen, daß man damit den Stromverbrauch reduzieren wollte. Aber

    weit gefehlt. Die ICs laufen heiß, wenn man sie eingeschaltet läßt, denn hierher kommt nicht genug Kühlluft.


    Für wichtige ROM-Erweiterungen gibt es noch das FEB-Board. Hier sind die ROMs für die Floatingpointerweiterung oder selbstgeschriebene

    Befehlssatzerweiterungen in Microcode (z.Bsp. für selbstentwickelte Hardware) . Die Karte sitzt zwischen den Interfacekarten und wird mit einem zusätzlichen Flachbandkabel direkt mit der CPU verbunden. Die ROMs auf dem FEB besitzen eine höhere Priorität im System als die auf dem FAB.

    Dies Erweiterung habe ich nicht.

    direkt mit der CPU verbunden