EVEN ODD BIOS-Dateien vereinen

  • Ich hab hier ein altes 286er BIOS, das auf 2 Dateien EVEN (= LOW) und ODD (= HIGH) aufgeteilt ist. Aus beiden Dateien werden jeweils 8-bit gleichzeitig gelesen und ergeben dann die 16-bit für die CPU.

    Jetzt will ich das BIOS aber nicht flashen, sondern durch einen Disassembler laufen lassen. Dazu müßten die beiden Dateien vorher nach einem Reißverschlußverfahren vereinigt werden, also ein Byte vom EVEN, dann ein Byte vom ODD, wieder ein Byte vom EVEN, dann vom ODD usw.

    Gibt's da irgendeine Möglichkeit, den Vorgang zu automatisieren? :/

    Oder muß ich mich da händisch mit STRG+X und STRG+V durchwühlen? <X

    Ich werde mich von keinem einzzzigen Prozzzessor trennen.
    Jedoch lockt es mich beinahe, ihn Dir zu überlassen, nur um zu sehen, wie er Dich in den Wahnsinn treibt :evil:

    Meine Begehren

  • Ah, das sollte simpel sein, aber heute Abend bringe ich dir das nicht mehr zusammen. Im Prinzip ist der Task sogar supereinfach. Ich müßte in der Lage sein, das in Kürze in Perl runterzuschreiben, ist ja eine simple Aufgabe, man muß nur ein klein wenig programmieren.

    Aber heute sicher nicht mehr. ;)

    Sinnvoll wäre es, wenn du die beiden Dateien hier bereitstellen würdest. Als .zip oder so. Damit Leute damit arbeiten können.

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Erledigt!

    Skript: [byte_interleave.pl]

    Interpreter: Perl

    Getestet mit: Perl v5.16.3 auf Linux, Perl v5.32.0 auf FreeBSD UNIX und Strawberry Perl v5.20.1 auf Windows XP x64.

    Beispiel auf UNIXoiden Systemen: $ ./byte_interleave.pl './2hlm002l.bin' './2hlm002h.bin' './output.bin'

    Beispiel auf Windows-Systemen: perl.exe ".\byte_interleave.pl" ".\2hlm002l.bin" ".\2hlm002h.bin" ".\output.bin"

    Quellcode von byte_interleave.pl:

    Zuerst hatte ich es über stdout versucht, also z.B. mit >".\output.bin", aber das ist auf Windows kaputgegangen. Lag wohl nur an mir, also übergibt man die zu schreibende Ausgabedatei halt an's Skript, auch egal.

    Läuft auf MS Windows halt leider nicht mit Bordmitteln, aber in PowerShell bin ich leider zu Scheiße.

    Bitte ausprobieren und dann zurückmelden, ob das paßt!

    Dateien

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

    3 Mal editiert, zuletzt von GrandAdmiralThrawn (26. Oktober 2020 um 09:28)

  • Nach einem ersten kurzen Vergleich der ersten 4 bzw. 8 Bytes sollte es passen. :spitze:

    Für den Aufruf unter openSUSE mußte ich aber das $ durch perl ersetzen. DuckDuckGo half. Bin halt noch ziemlich grün hinter den Ohren, was Linux und Programmierung betrifft. :whistling:

    Ich werde mich von keinem einzzzigen Prozzzessor trennen.
    Jedoch lockt es mich beinahe, ihn Dir zu überlassen, nur um zu sehen, wie er Dich in den Wahnsinn treibt :evil:

    Meine Begehren

  • Das $ steht für die Privilegien mit denen das Kommando auszuführen ist. $ bedeutet (oder soll bedeuten) daß du als normaler Benutzer eingelogged sein solltest, das ist nicht Teil der Eingabe. Ein # oder % stünde dafür, daß du Superuser root sein solltest. Ich habe mir hier den Stil der FreeBSD Dokumentation angeeignet, wird auch von einigen Linux Distributoren so benutzt.

    Wenn du als normaler Nutzer auf einem Linux Terminal bist, solltest ein $ links von deinem Cursor stehen sehen. :)

    "perl" solltest nicht hinschreiben müssen, dafür sorgt unter UNIX-artigen Systemen die POSIX-konforme Shebang-Zeile #!/usr/bin/env perl am Start des Skripts. Du kannst es also direkt per ./byte_interleave.pl starten. Unter Windows auf der cmd oder der Powershell funktioniert das aber nicht, daher braucht's dort den expliziten Aufruf per perl.exe.

    Aber wurscht, wenn's funktioniert, dann paßt's. :)

    Ich habe auch nicht die ganze Ergebnisdatei geprüft, und dachte mir... solange du nicht planst das zu flashen isses ok. Dann hätte ich mir nämlich etwas mehr Sorgen bei dem Skript gemacht. xD

    Edit: Eines würde ich jetzt aber gerne noch wissen... warum um alles in der Welt haben die das BIOS auf eine solche Art und Weise herausgebracht? Bringt das irgendeinen Vorteil?! Das BIOS ist so winzig, daß es nicht an der Floppydiskgröße liegen sollte.. 64kiB kriegt man ja platztechnisch auf so gut wie alles drauf was in der Zeit zusätzlich noch DOS booten konnte?!

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Wenn du als normaler Nutzer auf einem Linux Terminal bist, solltest ein $ links von deinem Cursor stehen sehen.

    Wenn ich auf meinem openSUSE Leap 15.2 eine Konsole öffne, steht da Mein_Benutzername@Doppelbock:~> :/


    Ist aber auch egal. Hauptsache wieder was gelernt. :) Mal schaun, wann ich's wieder vergessen hab. ;)

    Du kannst es also direkt per ./byte_interleave.pl starten.

    Wenn ich das so mache, kommt: bash: ./byte_interleave.pl: Keine Berechtigung :huh:

    Ich habe auch nicht die ganze Ergebnisdatei geprüft, und dachte mir... solange du nicht planst das zu flashen isses ok. Dann hätte ich mir nämlich etwas mehr Sorgen bei dem Skript gemacht. xD

    Nun, ich hab auch noch die letzten acht Bytes geprüft. Wär schon blöd, wenn man da monatelang drauf starrt, und am Ende war die Datei fehlerhaft. Scheint aber zu passen, der initiale Sprungbefehl ist jedenfalls an der Adresse 0xFFFF0 :) und IDA Pro erkennt ein paar Diagnoseroutinen für Tastaturcontroller, RTC, DMA-Controller, Interrupt-Controller, Grafikkarte, manufacture's diagnostic checkpoint...

    warum um alles in der Welt haben die das BIOS auf eine solche Art und Weise herausgebracht?

    Da kann ich auch nur spekulieren: Die ROM-Chips liefern nur 8-bit auf einmal. Schaltet man zwei sozusagen parallel, hat man 16-bit. Keine Ahnung, ob es damals schon bessere Chips gab. Aber wenn, waren die sicher teuer. :topmodel:

    Ich werde mich von keinem einzzzigen Prozzzessor trennen.
    Jedoch lockt es mich beinahe, ihn Dir zu überlassen, nur um zu sehen, wie er Dich in den Wahnsinn treibt :evil:

    Meine Begehren

  • Hmm, interessant, das mit dem Chip. Von sowas habe ich auch noch nie gehört. Die Zeiten als Speicher wirklich teuer war habe ich nur als Kind bzw. ahnungsloser Jugendlicher mitbekommen. ;)

    Zu dem mit "Keine Berechtigung": $ chmod +x ./byte_interleave.pl, damit es ausführbar ist. Jedes ausführbare Programm muß +x gesetzt haben, damit die Berechtigung zum Ausführen auch da ist. Im POSIX Standard gibt es drei Berechtigungen, jeweils für den besitzenden Benutzer, die besitzende Gruppe und für alle andere: r (lesen), w (schreiben), und x (ausführen). Rufst du explizit mit perl auf, so ist nur ein r nötig, weil das Perl Programm die Datei dann nur lesen und interpretieren muß. Im Fall des direkten Aufrufs muß das Ding aber ausführbar sein, um die Shebangzeile zu starten.

    Mit den Jahren kommen diese Dinge als Admin wohl einfach intuitiv, daher vergesse ich oft darauf, solche Details zu erwähnen.

    Bei openSuSE haben's wohl das Shell Prompt etwas anders gestaltet, nicht dem Auslieferungszustand der Bash entsprechend (vermute ich nur Mal). Bei mir z.B.: [user@BEAST ~]$ _ auf der UNIX Kiste oder auf einer Linuxbox, auch mit Bash: [user@geheimerserver ~]$ _.

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Sooo,

    mit chmod +x hat dann auch der direkte Aufruf geklappt.:thumbup:

    Warum steht da eigentlich immer ./ vor den Dateinamen?

    Hmm, interessant, das mit dem Chip. Von sowas habe ich auch noch nie gehört.

    Im Vergleich zum weit verbreiteten i8088 war das schon ein echter Fortschritt. Der kleine Bruder des i8086 hat intern zwar mit 16-bit Registern gerechnet, hatte extern aber nur einen 8-bit breiten Datenbus. Der mußte sich die beiden Bytes daher nacheinander holen. Kostete natürlich Zeit und Performance. :bonk:

    Ich werde mich von keinem einzzzigen Prozzzessor trennen.
    Jedoch lockt es mich beinahe, ihn Dir zu überlassen, nur um zu sehen, wie er Dich in den Wahnsinn treibt :evil:

    Meine Begehren

  • "./" bedeutet in diesem Fall das aktuelle Verzeichnis bei relativen Pfadangaben in der Bourne Shell. Das kann man auch weglassen.

    Das Ausführen einer Binärdatei funktioniert nur dann, wenn die Datei als ausführbar markiert ist und der User entsprechende Rechte dazu hat. Üblicherweise sind die Rechte dazu 1755, festgelegt mit chmod. "chmod 1755 dateiname" setzt das Executable Flag. "chmod +x" ist ne später dazugekommene Vereinfachung.

    UNIX eben. Viele dieser Befehle sind historisch gewachsen und leben bis heute in der Boune Again Shell (BASH) fort.

    Nimmst du ne andere Shell, wie z.B. die Korn Shell oder die C Shell, gibts für jede teilweise andere Befehle und Steuerzeichen.

    Deswegen ist es in Shellskripten immer ratsam, die dazugehörige Shell anzugeben. Das macht man mit einem, wie GAT schon sagte, sogenannten Shebang "#!".

    In den meisten Shellskripten steht als erstes "#! /bin/bash" oder "#! /bin/sh". Steht nichts drin, wird immer die Bourne Again Shell angenommen. Dies ist ein uralter POSIX-Standard.

    Die Manpage zur BASH ist riesig und enthält viele nützliche Tips. Aufzurufen mit "man bash".

    Die älteste, originale UNIX-Shell ist die Thompson-Shell. Sie wurde von Ken Thompson, einem der beiden UNIX-Erfinder, benannt.

    Ende der 1970er Jahre kam dann die Bourne-Shell auf, die sich sozusagen als Standard etabliert hat.

    "Du bist und bleibst a Mensch und du kannst eben net deine menschlichkeit überwinden."

    Dennis_50300

    3 Mal editiert, zuletzt von CryptonNite (27. Oktober 2020 um 11:13)

  • "./" bedeutet in diesem Fall das aktuelle Verzeichnis bei relativen Pfadangaben

    Diese Bedeutung kam mir auch gerade in den Sinn, als ich auf dem Thron der Weißheit saß, weil man unter DOS nach einem DIR als ersten Eintrag ein . <DIR> und als zweiten ein .. <DIR> sieht. Ersterer steht für das aktuelle Verzeichnis, letzterer für das übergeordnete Verzeichnis.

    Da DOS aber statt / \ verwendet, um die Verzeichnisebenen darzustellen, hat's halt mal wieder etwas gedauert, bis es Klick gemacht hat. :rolleyes: Die Stille und die Dämpfe auf dem Lokus sind einfach am Besten dazu geeignet, den Geist in Schwung zu bringen. ^^

    Danke aber trotzdem noch mal für die Erklärung. :thumbup:

    Ich werde mich von keinem einzzzigen Prozzzessor trennen.
    Jedoch lockt es mich beinahe, ihn Dir zu überlassen, nur um zu sehen, wie er Dich in den Wahnsinn treibt :evil:

    Meine Begehren

  • ./ kannst aber nur weglassen, wenn du Dateien mit einem anderen Programm lesen oder schreiben willst. Bei der Ausführung einer Datei funktioniert das nur, wenn sich . in $PATH (dem Suchpfad) befindet. Das ist auf keinem UNIX-artigen System so das ich bisher gesehen habe. Siehe:

    Lokales Verzeichnis, hier in unveränderter Standardumgebung von CentOS Linux

    Und Shebangs a la #!/bin/bash für Shellskripte versuche ich zu meiden, weil das nicht so portabel ist. Hier gibt es Stimmen für und gegen meine Vorgehensweise, aber einige UNIX-artige Systeme legen die Bash in /usr/local/bin/. #!/usr/bin/env bash findet die bash, solange sie nur irgendwo im Suchpfad steht. Das mache ich, damit meine Skripte unverändert auf allen möglichen Systemen laufen, ohne daß man irgendwas umschreiben muß. env liegt nämlich immer in /usr/bin/, zumindest auf allen UNIX-artigen Systemen die ich kenne (Open-/Net-/Midnight-/DragonFly-/FreeBSD, TrueOS, Solaris, zig verschiedene Linux).

    Bei Perl mache ich das auch so, weil Perl 5 ist schon so alt und schon so lange "relativ gleich", daß man nicht leicht eine flasche Version erwischen kann, wenn man env entscheiden läßt. Selbst wenn man 17 verschiedene Perl-Versionen installiert hätte. Schon gar nicht bei einem Programm das so simpel ist und keine Extramodule braucht. Bei Python is das schon haariger, weil der Wechsel von Python 2 -> 3 noch immer nicht soo ganz durch ist.

    Da könnte man noch 700 weitere Anekdoten runterfaseln, man muß da einfach über ein paar Jahre hinweg reinwachsen, wie bei jeder Betriebssystemfamilie.

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"