Wo sind meine zwei Bytes?

Es gibt 63 Antworten in diesem Thema, welches 6.248 mal aufgerufen wurde. Der letzte Beitrag (8. Juli 2022 um 21:21) ist von goloMAK.

  • ...ich probiere mal den Basic-Fix frei aus dem Kopf... Reset und dann


    POKE1164,48:POKE1165,57

    LOL. :D

    Ich habe das noch ein wenig verfeinert: POKE 1160,57.

    So. Jetzt habe ich mehr als 916 KB frei. Bitte melde dich an, um diesen Anhang zu sehen.

  • Da fallen die 2 Byte nun gar nicht mehr auf :)

    Das Drachenboot liegt schon am Strand.

    Die Königin sie zittert.

    Und wenn der Wind die Segel bläht,

    dann hab ich Blut gewittert.

    Einmal Wikinger immer Wikinger.

  • Nein. Der BASIC-Speicher geht explizit von $0801..$9FFF (beide Adressen inklusive), das sind 38911 Bytes. Die Null in $0800 vor dem BASIC-Start braucht der Interpreter als "Zeilenend"-Markierung einer fiktiven Zeile vor dem BASIC-Programm.

    Wobei das ja inkonsequent ist. Die führende Null in $0800 braucht der Interpreter genau so wie die Ende-Nullen.

    Die drei Nullen sind also eigentlich gleichberechtigt.

    Wieso also 38911 und nicht 38912 in der Einschaltmeldung? Oder eben die 38909, wenn man die Nullen berücksichtigt.

    Ich bin für eine Sammelklage in NAR...

  • Ich bin für eine Sammelklage...

    Das bringt doch nichts. Packt eure Mistgabeln und Fackeln ein! Und lasst uns die Sache selbst in die Hand nehmen! :picard:

    Bitte melde dich an, um diesen Anhang zu sehen.

  • wozu der Besen?:D Ob er damit den Speicher auskehren will?

  • Wobei die Zahl glaube ich ermittelt und hingeschrieben wird, bevor die 2 Byte gesetzt werden

    So ist es.

    Code
    $E402:    BASIC-RAM-Start ($0800) bestimmen
    $E40A:    BASIC-RAM-Ende ($A000) bestimmen // exklusiv
    $E416:    #$00 an BASIC-RAM-Start setzen (ist Teil des BASIC-RAMs $0800-$9FFF, aber nicht des Programmspeichers $0801-$9FFF)
    $E41B:    BASIC-Start ($0801) setzen
    $E429:    "{clr}{cr}    **** commodore 64 basic v2 ****{cr}{cr} 64k ram system  " ausgeben
    $E430:    BASIC-RAM-Ende minus BASIC-Start berechnen (38911) und ausgeben
    $E43D:    " basic bytes free{cr}" ausgeben. An dieser Stelle ist der definierte BASIC-Programm-Speicher komplett leer => Einschaltmeldung stimmt.
    
    Erst jetzt wird das Leerprogramm angelegt, das aufgrund des Programm-Ende-Terminators zwei Bytes verbraucht. Das macht der Befehl NEW.
    $E444:    Sprung zum NEW-Befehl, wo als erstes der Terminator (#$0000) nach [BASIC-Start+0 = $0801] und [BASIC-Start+1 = $0802] geschrieben wird.

    Das System hat demnach beim Einschalten 38911 BASIC Bytes frei, so wie eine Festplatte vor dem Formatieren das frei hat, was auf dem Label steht. Da kamen bei uns Kunden in den Laden, fühlten sich betrogen und beschwerten sich, dass ihr Windows nicht die freie Menge anzeigt, die die Platte angeblich hätte. Man sollte die C64-Meldung vllt. auch eher als Label verstehen, und darunter geht es dann schon los mit dem Leerprogramm, das die ersten zwei Bytes verbrät. Ansonsten wäre statt "free" so was wie "available" weniger verwirrend, aber das passt ja schon wieder nicht mehr in die Zeile. Viel Schwurbelei, das ist eher was fürs F64-Forum, aber nicht für den C64-Screen. ;)

  • Da aber schon während des Einschaltvorgangs feststeht, dass 2 Bytes für die Endmarkierung abgezwackt werden müssen, ist die Einschaltmeldung gaaaaanz strenggenommen trotzdem nicht in Ordnung.

    EDIT: Obwohl, denkbar wäre natürlich auch eine BASIC-Variante, die ohne 2-Byte-Endmarkierung auskommt. So gesehen wäre $E340 dann wieder unschuldig. :)

    Würde es nicht z.B. reichen, der letzten Zeile $ffff als Vorwärtslink zu geben? Daran wäre sie dann ohne Zusatzmarkierung erkennbar. Dazu müsste natürlich, wie gesagt, der Interpreter angepasst werden.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

    6 Mal editiert, zuletzt von goloMAK (3. Juli 2022 um 15:03)

  • Da aber schon während des Einschaltvorgangs feststeht, dass 2 Bytes für die Endmarkierung abgezwackt werden müssen, ist die Einschaltmeldung gaaaaanz strenggenommen trotzdem nicht in Ordnung.

    Nochmal drüber nachgedacht: Es kommt darauf an.

    Angenommen, ich habe ein BASIC-Programme, dass von $0801 bis $A001 geht. D.h., die Endemarkierung steht in $A000/$A001.

    Sofern das Programm keinen Fehler hat (z.B. kein GOTO/GOSUB auf eine Zeilennummer, die größer ist als die größte vorhandene Zeilennummer) und das Programm endweder durchläuft, oder explizit ein END als Befehl hat, würde es sogar funktionieren, die 38911 Byte auszureizen.

    Ich bin mir nicht ganz sicher, ob der Editor damit zurechtkäme, aber ausführen ließe sich so ein Programm doch.

    Bei der Null in $0800 sieht es anders aus, die wird tatsächlich für das RUN gebraucht.

  • ...oder eine Data-Zeile am Ende, über deren Ende nicht hinausgelesen wird? Oh, Variablen darf man dann leider auch nicht benutzen, aber wer braucht die schon ^^

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

  • ...oder eine Data-Zeile am Ende, über deren Ende nicht hinausgelesen wird?

    Ich habe ja "z.B." geschrieben. Das DATA-Beispiel war mir auch noch in den Sinn gekommen.

    Oh, Variablen darf man dann leider auch nicht benutzen, aber wer braucht die schon

    Öhm... An dieses klitzekleine Detail hatte ich jetzt tatsächlich nicht gedacht. Aber, du hast recht, wer braucht dir schon? ;)

  • Da aber schon während des Einschaltvorgangs feststeht, dass 2 Bytes für die Endmarkierung abgezwackt werden müssen, ist die Einschaltmeldung gaaaaanz strenggenommen trotzdem nicht in Ordnung.

    Nochmal drüber nachgedacht: Es kommt darauf an.

    Angenommen, ich habe ein BASIC-Programme, dass von $0801 bis $A001 geht. D.h., die Endemarkierung steht in $A000/$A001.

    Na ja, da stehen $94 und $E3 im ROM, und das RAM sieht doch der Interpreter nicht. Oder wie muss ich mir das vorstellen?

    EDIT: Ach so, du meinst wohl, dass der Vorwärtslink auf $a000 nie zum Einsatz kommt, weil das entsprechend über z.B. GOTO oder END verhindert wird.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

    Einmal editiert, zuletzt von goloMAK (3. Juli 2022 um 15:21)

  • Wobei ich eine Compo mit Variablen-losen maximal großen Basicprogrammen gar nicht so uninteressant fände :D

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

  • Na ja, da stehen $94 und $E3 im ROM, und das RAM sieht doch der Interpreter nicht.

    Richtig. Er bräuchte sie aber auch "meistens" nicht (außer zum Feststellen das Programmendes, z.B. beim GOTO mit einer "zu hohen" Zeilennummer; einem Programm, welches ohne END enden will; die DATA-Zeilen, über die hinaus gelesen wird (was aber eh zu einem READ w/o DATA führen würde).

    Deshalb dürften sie unter dem ROM liegen, weil nicht benötigt.

    Kann man den Variablen-Bereich nicht nach $033C oder $C000 verschieben? Bzw. nach $CFFF, fallend?

    $033C müsste man testen, ob das BASIC irgendwo die Annahme macht, dass es nach dem Programmcode kommt (was ist mit Stringzuweisungen aus dem Text, z.B. A$="XYZ"? Er erkennt doch, dass es im Code ist, weil die Adresse kleiner des Variablenanfangs ist. Das dürfte spätestens bei der GC in die Hose gehen)

    $C000-$CFFF ist aber eine interessante Idee; ich könnte mir vorstellen, dass das sogar klappen könnte.

  • Ich denke, man darf das einfach nicht so wörtlich nehmen und soll dieses "frei" verstehen wie "für BASIC verfügbar". Ich würde was geben für eine Aufzeichnung der originalen damaligen Diskussion um die Einschaltmeldung. Möglicherweise hatte schon damals jemand auf den Umstand hingewiesen, aber ich vermute, sie waren sich einig, eben den gesamten verfügbaren BASIC-Speicher in der Einschaltmeldung zu nennen und nicht abzüglich des sozusagen angefangenen Programms. Möglicherweise hatten sie dann auch über den Wortlaut diskutiert, aber "free" passte da genau hin, und die Mehrheit fand das schön so. So ungefähr stelle ich mir das vor.

    Wegen mir hätte man die zweite Zeile weglassen können und mit den ersparten Bytes die FREE()-Funktion ändern sollen. Auch, dass der C64 64k RAM hat, waren dem Kleinkind und dem Hund bekannt.

    Ein BASIC-Programm ohne Variablen? Ja, kann ich mir vorstellen: Ein Meer aus PEEKs und POKEs.

  • Ein BASIC-Programm ohne Variablen? Ja, kann ich mir vorstellen: Ein Meer aus PEEKs und POKEs.

    Nee, wenn schon dann ohne schummeln und wirklich ohne State.

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

  • Ich würde was geben für eine Aufzeichnung der originalen damaligen Diskussion um die Einschaltmeldung. Möglicherweise hatte schon damals jemand auf den Umstand hingewiesen, aber ich vermute, sie waren sich einig, eben den gesamten verfügbaren BASIC-Speicher in der Einschaltmeldung zu nennen und nicht abzüglich des sozusagen angefangenen Programms

    Ich vermute eher, dass da gar nicht drüber nachgedacht wurde. Die konnten ja nicht ahnen, dass ein paar alternde, grauhaarige Korinthenkacker 40 Jahre später solche Diskussionen führen würden.

    Wobei ich mich an die Diskussionen 38909 vs. 38911 auch schon in den 80ern erinnern kann; ich denke, dass das auch mal in der 64'er (als Erklärung, wo die Differenz herkommt) thematisiert wurde.

  • Oh, Variablen darf man dann leider auch nicht benutzen, aber wer braucht die schon ^^

    Ich finde auch, dass die total überbewertet werden. Und ich habe die auch noch nie benutzt.

    Meine Programme sehen immer so aus:

    Code: Das meistgeschriebene C64 Programm
    10 PRINT"HALLO ";
    20 GOTO 10