Was passiert bei Load"$",8,1?

Es gibt 14 Antworten in diesem Thema, welches 14.216 mal aufgerufen wurde. Der letzte Beitrag (23. Februar 2021 um 21:01) ist von 1570.

  • Hi,

    es interessiert mich, was der C64 eigentlich ausführt, wenn ich load"$",8,1 eingebe.

    Soweit ich das verstanden habe, bedeutet load"*",8,1 bzw. load"<programmname>",8,1 dass das Programm absolut geladen wird. Wobei ich noch nicht ganz verstanden habe, was genau hier passiert und warum es einen Unterschied bei manchen Programmen macht.

    Die Routine load"$",8 um das Directory auszugeben "missbraucht" den Basis Interpreter, um mit List den Inhalt anzuzeigen, dass vom Laufwerk bereitgestellt wird. Was aber wird ausgeführt, wenn ich load"$",8,1 eingebe?

    Ich sehe zunächst einmal nur Zeichensalat der von oben nach unten wächst und List gibt keinen Inhalt zurück.

  • Gibtst Du nur ,8 ein wird das Programm immer bei $0801 eingeladen, Bei ,8,1 werden die ersten zwei Byte vom Programm als Ladeadresse verwendet und da im Directory häufig 12 04 für den nächsten Direcrory Sektor drinsteht wird das in den Bildschirmspeicher ab $0412 gedumpt.

  • Gibtst Du nur ,8 ein wird das Programm immer bei $0801 eingeladen, Bei ,8,1 werden die ersten zwei Byte vom Programm als Ladeadresse verwendet und da im Directory häufig 12 04 für den nächsten Direcrory Sektor drinsteht wird das in den Bildschirmspeicher ab $0412 gedumpt.

    Sehr gut, das verstehe ich :smile:

    Deshalb passiert das also mit dem Zeichensalat auch nicht immer.

    Danke!

  • Soweit ich mich erinnern kann, werden die ersten beiden Bytes der Datei als Ladeadresse interpretiert. Dorthin werden bei einem ,8,1 hinter dem Programmnamen die Daten geladen. Was immer auch "$" dann an Daten liefert, die ersten beiden Bytes werden als Ladeadresse interpretiert. Bei ,8 wird die Datei immer an den Anfang des Basic-Bereichs ($0801) geladen.

    Bitte melde dich an, um dieses Bild zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.

  • Stimmt leider nicht, was ich behauptet hab. Er lädt das Dir immer ab $0401. Die Header sind ja auch zur Disk Organistation, also totaler Blödsinn.

    Ich habe den Grund hier gefunden. Es kommt vom Commodore DOS selbst.

    Bitte melde dich an, um diesen Link zu sehen.

  • Den genauen Grund müsste ich erst raussuchen, oder jemand hier weiß es.

    Die 1541 sendet $0401 als Ladeadresse des Directories, weil die alten IEEE-Laufwerke das schon so gemacht haben und die haben das gemacht, weil manche ROM-Versionen der PET-Systeme Programme immer an die in der Datei enthaltenen Ladeadresse geladen haben und dort daher $0401 stehen musste, damit das Directory an die BASIC-Startadresse geladen wird.

    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.

  • Siehe auch das 1541-ROM:

    Bitte melde dich an, um diesen Link zu sehen.

    Code
    ECBC: A9 01     LDA #$01        ; 1
    ECBE: 20 F1 CF  JSR $CFF1       ; write in buffer
    ECC1: A9 04     LDA #$04        ; 4, start address $0401
    ECC3: 20 F1 CF  JSR $CFF1       ; write in buffer

    Schon ulkig, dass das Directory einfach laufwerksseitig als BASIC-"Programm" verpackt wurde. Ein Hoch auf Hacks! ;)

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

  • Schon ulkig, dass das Directory einfach laufwerksseitig als BASIC-"Programm" verpackt wurde. Ein Hoch auf Hacks!

    Das ist noch interessanter wenn man sich die Formatierung im Detail anschaut: Damit die Namen alle untereinander ausgerichtet sind muss das Laufwerk die zur Blockzahl passende Anzahl von Leerzeichen vor dem Namen einfügen - und aus Gründen, die mir nicht ganz klar sind werden die dafür"unnötigen" Leerzeichen am Zeilenende angehängt, damit alle so erzeugten BASIC-Zeilen 32 Byte lang sind.

    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.

  • Deshalb passiert das also mit dem Zeichensalat auch nicht immer.

    Vermutlich ist es mir dann bei sehr kleinen Directories nur nicht immer aufgefallen oder ich habe mich mit dem VC20 vertan, für den load"*",8,1 den Inhalt an die richtige Stelle lädt.

    Danke euch allen für die Einblicke in diese Ecke.

  • :cry:Nee, ich hab ja oben schon gesagt, dass das falsch war :schande:

    Es ist Wurscht wie kurz oder lang das Directroy ist. Im 1541 ROM steht drin, dass es immer in den Bildschirmspeicher geschrieben wird, wie 1570 oben geschrieben hat. Und die Header im Block verweisen auch nur auf den nächsten Directory Block wo es dann weitergeht. Also Doppelschmarrn, tut mir leid.

    So, wenn das jetzt genug Canossa war, kann es eigentlich zu, oder? :weg:

  • Bei ,8 wird die Datei immer an den Anfang des Basic-Bereichs ($0801) geladen.

    Wobei man nicht verschweigen sollte, daß man den BASIC-Start auch an andere Adressen legen kann, was viele Programme auch machen. Insbesondere bietet sich das an, um zu verhindert, daß Sprites, Grafik und Zeichensätze im laufenden Programm von den BASIC-Strings und Variablen überschrieben werden.

  • Vermutlich ist es mir dann bei sehr kleinen Directories nur nicht immer aufgefallen oder ich habe mich mit dem VC20 vertan, für den load"*",8,1 den Inhalt an die richtige Stelle lädt.

    Nö, LOAD"*",8,1 funktioniert bei C64 und VC-20 genau gleich und LOAD"$",8,1 lädt auch beim VC-20 nicht an die 'richtige' Stelle. Ohne Speichererweiterung ist der BASIC-Start bei $1001, mit +8K RAM oder mehr bei $1201. Nur wenn eine +3K-RAM-Erweiterung gesteckt ist, ist der BASIC-Start dann bei $0401 und dann funktioniert LOAD"$",8,1 - aber auch nur weil der BASIC-Start dann zufälligerweise mit dem fixem Wert aus dem CBM DOS übereinstimmt. Natürlich funktioniert LOAD"$",8 auch beim VC-20 immer richtig, egal wo der BASIC-Start ist.

    Die noch älteren PET-CBM-Rechner hatten aber, wie Unseen schon schrieb, den BASIC-Start fix bei $0401 und waren gar nicht dazu in der Lage, BASIC-Programme woanders als nach $0401 hin zu laden. Da das Directory aber als BASIC-Programm geladen werden können sollte, mußte es die gleiche Ladeadresse wie 'normale' BASIC-Programme der PET-CBM-Rechner bekommen.

  • LOAD"$",8,1 lädt auch beim VC-20 nicht an die 'richtige' Stelle

    Das war im C64-Wiki fehlerhaft, das sollte "PET" heißen, nicht VC-20. Ist bereits korrigiert. :)

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