[gelöst] Umrechnen von Byte in Blöcke

Es gibt 12 Antworten in diesem Thema, welches 2.875 mal aufgerufen wurde. Der letzte Beitrag (13. Februar 2011 um 14:06) ist von Lysosom.

  • Hallo zusammen,

    ich möchte ein altes BASIC-Programm (1986) mittels cc65 neu schreiben. Allein die Bildschirmmaske benötigt auf der Original-Diskette 20 Blöcke. Sie besteht aus vielen, zum großen Teil redundanten, Strings.

    Ich erhoffe mir von cc65 insgesamt eine Geschwindigkeitssteigerung, obwohl das Programm keine wirklich zeitkritischen Funktionen hat. Die Strings der Maske sollen auch nicht mehr mehrfach vorgehalten werden. Damit spare ich immens Speicherplatz. Allerdings muss die Maske dann über Funktionen programmiert werden, was ja auch wieder Speicher kostet.

    Meine Frage nun: Wie kann ich die Größe der von cc65 erstellten Datei (in Byte) mit der Datei auf Diskette (in Blöcken) vergleichen? Kann mich jemand in die richtige Richtung schubsen?

    Vielen Dank

    1 x C64, 1x C64 II, 1 x 1541, 1 x 1541 II, 1 x 1530, XU1541, sd2Ieec, Chameleon
    1 x C128, 1 x 1571, 1 x C128D
    1 x A1000, 1 x A500, 1 x A600, 1 x A570 CD-Laufwerk, 1 x Golem 2MB

    1 x MEGA65 R3, 1 x MEGA65 R6

  • Ein Sektor auf einer 1541 formatierten Diskette fasst 256 bytes, wovon die ersten zwei auf den nächsten Track/Sektor zeigen. Der letzte Sektor einer Datei sollte auf Track/Sektor 00/00 zeigen. Also hast du 254 bytes Nutzdaten pro Sektor.
    Ähdit: Block und Sektor sind in diesem Fall synonym.

  • Einfach die Anzahl der Bytes des Programmes durch 254 teilen und Du erhältst die Anzahl der benötigten Blöcke.
    Ein Block hat 256 Byte, wovon aber nur 254 Bytes genutzt werden können, weil die letzten beiden den nächsten Block referenzieren.
    @Edit: +++ war schneller (-;

    LIFE IS SHORT - Break the rules, do more, need less, smile often, be brave, stay true, dream big, forgive quickley, kiss slowly, love truly, laugh uncontrollably and never regret anything that made you smile.

  • Na das ist ja einfach ...

    Manchmal glaube ich , ich sollte wirklich die Finger von Computern lassen und schon gar nicht programmieren.

    Vielen Dank für die schnelle Antwort.

    1 x C64, 1x C64 II, 1 x 1541, 1 x 1541 II, 1 x 1530, XU1541, sd2Ieec, Chameleon
    1 x C128, 1 x 1571, 1 x C128D
    1 x A1000, 1 x A500, 1 x A600, 1 x A570 CD-Laufwerk, 1 x Golem 2MB

    1 x MEGA65 R3, 1 x MEGA65 R6

  • Und ich dachte immer dass ein Block auf Diskette genau 256 Byte groß ist, naja, wieder was dazu gelernt :)
    Jetzt leuchtet es mir auch ein dass ein Hires Bild immer 33 anstelle von 32 Blocks brauchte ;)

  • Und ich dachte immer dass ein Block auf Diskette genau 256 Byte groß ist, naja, wieder was dazu gelernt :)
    Jetzt leuchtet es mir auch ein dass ein Hires Bild immer 33 anstelle von 32 Blocks brauchte ;)

    Was aber ein Fehler war. 8000 Bytes oder 8002 Bytes inkl. Ladeadresse oder allenfalls noch 8004 Bytes mit Vorder/Hintergrundfarbe passen auch in 32 Blocks. Oder doch nicht?

    Zumindest hab ich Diashows mit 32 Blöcken gesehen ...

    Code: Floppy Fehlerkanal abfragen - Ausserdem kann ich bei "drive not ready" den I: und N: Befehl verwenden und notfalls den Kopf manuell zurückschieben. Und Finger weg vom Stepper!
    10 open1,8,15                   : rem 8 ist die Geräteadresse und das kann man bei Bedarf natürlich anpassen
    20 get#1,a$:?a$;:ifst<>64goto20 : rem Das CLOSE 1 am Ende kann man sich sparen, weil beim RUN automatisch ein CLOSE ALL ausgeführt wird.
    RUN
  • ITDS, die redundanten Strings in der Maske kannst Du mit einer selbstgeschriebenen Funktion "translate(char * in, char * out)" eliminieren, die Dir Platzhalter im Eingabestring durch die gewünschten Strings aus einer Tabelle ersetzt. So kann ein Eingabestring, wie "----> @M0@ : @M1@", leicht in eine umfangreichere Ausgabe, wie "----> Hauptmenue : Disk" überführt werden.
    Wenn der Speicherplatz nicht zu knapp ist, möchte ich allerdings empfehlen als Platzhalter sprechende Namen zu verwenden, z.B. "@M_MAIN@" oder "@M_DISK@", da man sonst als Entwickler leicht den Überblick verliert, weil die Masken nicht mehr "Human Readable" sind.
    Sowas kann man auch benutzen, um die Masken mehrsprachig zu machen.

    LIFE IS SHORT - Break the rules, do more, need less, smile often, be brave, stay true, dream big, forgive quickley, kiss slowly, love truly, laugh uncontrollably and never regret anything that made you smile.

  • Früher in den unwissenden Jahren, wo man in der Grundschule noch nichts nachgooglen konnte, hab' ich Hiresbilder immer mit ner Größe von 8K aus dem RAM abgespeichert, daher hatten meine Bilder 33 Blocks auf Diskette.

  • Wenn man pingelig ist, rechnet man die Startadresse vom ersten Block noch ab, da passen also nur 252 Bytes rein. Und wenn man aus Bequemlichkeit (oder weil man nicht genau nachgerechnet hat) für eine Bitmap 8192 statt 8000 Bytes speichert, dann verschlonzt man halt noch einen Block extra.

  • Ein Sektor auf einer 1541 formatierten Diskette fasst 256 bytes, wovon die ersten zwei auf den nächsten Track/Sektor zeigen. Der letzte Sektor einer Datei sollte auf Track/Sektor 00/00 zeigen. Also hast du 254 bytes Nutzdaten pro Sektor.
    Ähdit: Block und Sektor sind in diesem Fall synonym.

    Fast richtig. Die erste Byte des letzten Blocks ist 0, das zweite Byte beziffert die Anzahl der restlichen zur Datei gehörenden Bytes in diesem Block :)

  • Fast richtig. Die erste Byte des letzten Blocks ist 0, das zweite Byte beziffert die Anzahl der restlichen zur Datei gehörenden Bytes in diesem Block :)


    Wenn du es so genau nehmen willst ist das zweite Byte eigentlich der Offset des letzten gültigen Bytes, d.h. die Anzahl der Restbytes plus eins. :)

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Draco: Ja sowas hatte mir vorgeschwebt. Das mit der Mehrsprachigkeit ist ein guter Hinweis. Vielen Dank.

    1 x C64, 1x C64 II, 1 x 1541, 1 x 1541 II, 1 x 1530, XU1541, sd2Ieec, Chameleon
    1 x C128, 1 x 1571, 1 x C128D
    1 x A1000, 1 x A500, 1 x A600, 1 x A570 CD-Laufwerk, 1 x Golem 2MB

    1 x MEGA65 R3, 1 x MEGA65 R6