Hallo Besucher, der Thread wurde 6,5k mal aufgerufen und enthält 24 Antworten

letzter Beitrag von Tale-X am

PRG File splitten unter LINUX ?

  • Hallo Leute,


    ich würde gerne ein PRG File, das ich aus einem .d64 Image exportiert habe am PC kürzen.
    D.h. als Beispiel, mein File hat als Load Adresse $0801 und geht z.B. bis $3000. Den Bereich von Loadadresse bis einschl. $1fff soll weg. Danach soll das File wieder gespeichert werden (ggf. anderer Dateiname) mit neuer Loadadresse $2000 und Daten dann entsprechend von $2000- $3000.
    Gibt es dafür etwas für die Kommandozeile ?

  • kein Problem mit der Linux-Shell....


    Code
    1. printf '\x00\x20' > zieldatei.prg
    2. dd if=quelldatei.prg of=/tmp/tempfile skip=6140 ##### ---> $1FFF - $0801 - $2 = $17FC = 6140
    3. cat /tmp/tempfile >> zieldatei.prg
    4. rm /tmp/tempfile

    alternativ ginge auch die Zusammenfassung der Zeilen 2, 3 und 4 mit .....

    Code
    1. dd if=quelldatei.prg skip=6140 >> zieldatei.prg


    EDIT: ups, Tale-X und Kongo-Otto waren schneller :)
    ich habs dann mal in Form gebracht :D

  • Wow ja, danke. An dd hatte ich gar nicht gedacht. Hab mir split angesehen und bin damit nicht wirklich klar gekommen.
    Da das Ganze eh in ein BASH Script rein kommt ist die Lösung von @GI-Joe top.


    Daaaankeee !

  • Oder man schreibt sich schnell was, das ist dann etwas komfortabler als gescriptete Lösungen :)

  • Oder man schreibt sich schnell was, das ist dann etwas komfortabler als gescriptete Lösungen

    naja, 2 Zeilen vs 157 Zeilen .... :rolleyes:

    dd if=quelldatei.prg skip=6140 >> zieldatei.prg

    btw: ups, kleiner Fehler in meiner dd-Zeile .... :whistling:
    es muß heißen: skip=6144, denn $1FFF - $0801 + $2 = $1800 = 6144
    also:

    Code
    1. dd if=quelldatei.prg skip=6144 >> zieldatei.prg ##### ---> $1FFF - $0801 + $2 = $1800 = 6144
  • Ich wollte dafür auch nicht lange etwas kompilieren :-)
    Das BASH Script lebt eh im Moment, da ich 1. das aus Spaß an der Freude mache und 2. noch nicht alles an (Hilfs-) Programmen und Coding da ist, was ich eigentlich brauche....


    Egal für mich ist die Script Variante jedenfalls voll in Ordnung für meine Zwecke und erspart mir rumgefummel in VICE mit hin und her kopieren von Dateien von PC in .d64 und zurück.

  • Hier mal ein Teil einer CASE Anweisung, so wie das dann später laufen soll:
    Bitte nicht hauen... ist mein erstes BASH Script :-)


  • naja, 2 Zeilen vs 157 Zeilen .... :rolleyes: btw: ups, [...]

    Naja, geschrieben ist das in 30 Minuten, und vermeidet derlei "ups", weil das entstehende Tool das Dateiformat "kennt" und ein paar Plausibilitätsprüfungen machen kann usw. Klar geht es mit vorhandenen Tools und Scripting, aber das ist schlecht lesbar und fehleranfällig --- eigentlich nur sinnvoll wenn man es vermutlich nur ein einziges mal braucht.


    Etwas gleichwertiges wie in C wäre sicher in Perl mit weniger Zeilen möglich. Da würde ich persönlich aber länger brauchen weil ich perl zu selten verwende.

    Ich wollte dafür auch nicht lange etwas kompilieren :-)

    Das ist mit einem super-simplen cc -oprgextract prgextract.c getan, und wenn du wirklich die zeit bemerken kannst bevor der prompt wieder da ist brauchst du einen neuen PC...

  • Das ist mit einem super-simplen cc -oprgextract prgextract.c getan, und wenn du wirklich die zeit bemerken kannst bevor der prompt wieder da ist brauchst du einen neuen PC...

    Ja ist mir klar, dass das irgendwo im Millisekunden Bereich liegt. Aber das Auftrennen der Datei ist ja nur ein Schritt von mehreren. Wenn ich das alles in einem Programm haben möchte, damit es sauber ist,
    dann müsste petcat, c1541, exomizer, tar uvm. mit da rein. Und das will ich mir nicht antun ;)
    Trotzdem bin ich natürlich dankbar für Deinen Vorschlag. Vielleicht greife ich das später mal auf, wenn mir das Script nicht mehr reichen sollte.

  • Wenn ich das alles in einem Programm haben möchte, damit es sauber ist, dann müsste petcat, c1541, exomizer, tar uvm. mit da rein. Und das will ich mir nicht antun ;)

    Nicht unbedingt, für die "high level" Ebene eignen sich Scripts dann ja ganz gut :) Das Extrahieren eines bestimmten Bereichs aus einem .PRG ist aber eine recht spezielle Teilaufgabe, die man natürlich z.B. mit dd lösen kann, aber das ist dann in einem Script nicht mehr schön, das Beispiel oben verwendet dazu ein temporäres File -- kann man schon machen, kann man auch hinterher wieder aufräumen; richtig blöd wird es natürlich, wenn du nicht immer ab der gleichen Adresse extrahieren willst. Da kann ein kleines Tool nach dem Prinzip "one job, one tool" durchaus sinnvoll sein, das Shellscript orchestriert dann die ganzen kleinen Tools :)

  • Der Dateibereich der weg soll ist bei mir immer identisch. Das ist auch nur ne Krücke, solange der Blitz Compiler noch keine reinen P-Code (Module) Files speichern kann.
    So muss ich aktuell (noch) den Runtime Code des Compilers immer hinterher wieder entfernen.
    Und da ich eh auf ein Script zurückgreife, ist der Einzeiler mit dd schon passend.

  • Ja, wenn's immer exakt gleich ist tut es das, dann kann man sich noch das temporäre file sparen um es wenigstens ein bisschen schöner zu machen:


    (printf '\x00\x20'; dd if=in.prg skip=6144 of=-) >out.prg oder so ähnlich.*


    --
    * habe gerade kein *nix System hier zum testen und bin mir nicht ganz sicher wie sich dd verhält. Mag sein, dass of= überflüssig ist, weil es eh zu stdout schreibt. Eventuell versteht es auch of=- gar nicht, dann würde es aber of=/dev/stdout tun :)

  • Also sähe die finale Version dann so aus ?!:


    Code
    1. (printf '\x93\x1f'; dd if=c-temp.prg skip=6035) >c-midnight.prg

    Edit: Geht so nicht.


    dd: c-createtest.prg: es ist nicht möglich, zum angegebenen Offset zu springen
    0+0 Datensätze ein
    0+0 Datensätze aus
    0 bytes copied, 5,9929e-05 s, 0,0 kB/s


    lt. Ubuntu WIKI überliest dd bei Parameter skip BLOCKS und nicht Bytes.
    Dann müsste da noch ein obs=1b oder so dran ? ?(