Das Basicprogramm lädt nicht.

Es gibt 20 Antworten in diesem Thema, welches 3.137 mal aufgerufen wurde. Der letzte Beitrag (29. Mai 2019 um 20:35) ist von JeeK.

  • Das Basicprogramm fängt an zu laden mit der Floppy, hört aber nicht auf.
    Woran liegt das bitte?

    Alleine kann ich das ASM-Programm nach 40960 laden und mit Sys starten

    Dies ist das Basicprogram um das ASM-Programm "vscreen.p" zuladen und zu starten.

    Code
    load "vscreen.p",8,1
    sys 40960


    Dies ist das ASM-Programm "vscreen.p"

  • Das Basicprogramm fängt an zu laden mit der Floppy, hört aber nicht auf.
    Woran liegt das bitte?

    Weil ein in einem BASIC-Programm ausgeführtes LOAD dieses Programm wieder von vorne startet. Vermutlich dachten sich die Programmierer des BASIC-Interpreters, dass man mit dem Befehl ein anderes BASIC-Programm nachladen will, wo es nicht sinnvoll wäre irgendwo mittendrin weiterzumachen.

    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.

  • Danke für die Info.

    Eine andere Lösung fällt mir jetzt für das Basic nicht ein.

    Gruss

  • Gerne genommen - zumindest auf dem C64 - wird sowas:

    Code
    IF A = 0 THEN A = 1 : LOAD "VSCREEN.P",8,1
    SYS 4096
  • Danke für die Hilfe. Aber es wird immer weiter geladen.

    Gruss

  • Hab ihn in der ersten Zeile.

    Gruss

  • Frage:

    Was Passiert mit der Variable A, nachdem sie auf 1 erhöht wird?

    Muss die nicht mit ELSE noch verknüpft werden, so dass der LOAD Befehl erst ausgeführt wird, wenn A=1 ist?

    Systemshock war eines meiner ersten Computerspiele auf CD-Rom, welches mich sehr gefesselt hat. Wer oder was ist SHODAN: Bitte melde dich an, um diesen Link zu sehen.

  • :schande:

    Shame on me.

    Hab ich nicht gewusst. :)

    Systemshock war eines meiner ersten Computerspiele auf CD-Rom, welches mich sehr gefesselt hat. Wer oder was ist SHODAN: Bitte melde dich an, um diesen Link zu sehen.

  • Hab ihn in der ersten Zeile.

    Mit den Speicherkonfigurationen des VC20 kenne ich mich nicht aus. Hast du denn auch tatsächlich RAM im Bereich, den du verwenden möchtest? Falls nicht, wird an den nicht belegten Adressen anderer Speicher gespiegelt, wenn ich mich recht erinnere.


    Was Passiert mit der Variable A, nachdem sie auf 1 erhöht wird?

    Ein ELSE, wenn es das denn gäbe, macht in diesem Zusammenhang übrigens nicht recht Sinn, weil es ohne einfacher geht. Um das mal genauer zu erklären: Beim ersten Start mit RUN ist A ja noch nicht definiert, also = 0 und wird daher auf 1 gesetzt. Anschließend wird der LOAD-Befehl ausgeführt. Nach beendetem Laden wird das das BASIC-Programm nicht fortgesetzt, sondern startet automatisch neu. A ist dann immer noch 1. Der LOAD-Befehl wird dadurch also nicht mehr ausgeführt und das Programm macht in der folgenden Zeile weiter. So funktioniert es zumindest am C64. Da das BASIC des VC20 m.W. identisch ist, hätte ich erwartet, dass es da dann auch klappt.

  • Ich habe die 28kb aktivert beim Vice und es wird 28159 Bytes Free angezeigt.
    Gruss

  • Ich habe die 28kb aktivert beim Vice und es wird 28159 Bytes Free angezeigt.

    Und an welchen Adressen befindet sich dann damit RAM? Wenn die RAM-Belegung lückenlos sein sollte und ab $0000 beginnt, kann an Adresse $A000 (40960) kein RAM sein.

  • Mit den Speicherkonfigurationen des VC20 kenne ich mich nicht aus. Hast du denn auch tatsächlich RAM im Bereich, den du verwenden möchtest? Falls nicht, wird an den nicht belegten Adressen anderer Speicher gespiegelt, wenn ich mich recht erinnere.

    Ein ELSE, wenn es das denn gäbe, macht in diesem Zusammenhang übrigens nicht recht Sinn, weil es ohne einfacher geht. Um das mal genauer zu erklären: Beim ersten Start mit RUN ist A ja noch nicht definiert, also = 0 und wird daher auf 1 gesetzt. Anschließend wird der LOAD-Befehl ausgeführt. Nach beendetem Laden wird das das BASIC-Programm nicht fortgesetzt, sondern startet automatisch neu. A ist dann immer noch 1. Der LOAD-Befehl wird dadurch also nicht mehr ausgeführt und das Programm macht in der folgenden Zeile weiter. So funktioniert es zumindest am C64. Da das BASIC des VC20 m.W. identisch ist, hätte ich erwartet, dass es da dann auch klappt.

    Merci für die Erklärung. :)

    Ich bin davon ausgegangen das der Loadbefehl dennoch ausgeführt wird.

    Systemshock war eines meiner ersten Computerspiele auf CD-Rom, welches mich sehr gefesselt hat. Wer oder was ist SHODAN: Bitte melde dich an, um diesen Link zu sehen.

    Einmal editiert, zuletzt von Shodan (28. Mai 2019 um 16:52)

  • Ich bin davon ausgegangen das der Loadbefehl dennoch ausgeführt wird.

    Nein, das ist der Trick dabei. Basic sieht IF A=0 und macht quasi gleich in der nächsten Zeile weiter, da A ja nach dem Neustart 1 ist und die Bedingung somit nicht erfüllt. Wenn die Bedingung wahr ist (also beim ersten Starten), dann wird alles nach dem Doppelpunkt in der Zeile ausgeführt.

  • Und an welchen Adressen befindet sich dann damit RAM? Wenn die RAM-Belegung lückenlos sein sollte und ab $0000 beginnt, kann an Adresse $A000 (40960) kein RAM sein.

    Hätt ich auch gesagt. Siehe Bitte melde dich an, um diesen Link zu sehen.
    BLK5 wird eher unbenutzt sein.

    Übrigens bietet sich statt dem IFA=0THENA=1:LOAD ... auch eine Variante an, die z.B. auf ein Signatur-Byte prüft, z.B.

    10 IFPEEK(40960)<>169THENLOAD"....",8,1

    Man nimmt da am besten eine charakteristische Speicherstelle, vielleicht nicht gleich die erste Adresse, die nicht selten einen häufig vorkommenden LDA-/LDX-/LDY-Opcode enthält.
    Vorteil (wenn an der Stelle RAM ist): Die Erweiterung wird wirklich nur dann geladen, wenn sie noch nicht im Speicher ist. Die bisherige Variante lädt immer 1 mal nach.
    Nachteil: Wenn das Nachgeladene irgendwie korrumpiert wurde, dann bleibt es mitunter kaputt ... (aber da ist dann vielleicht sowieso schon das BASIC-Programm angeschlagen ...) ;)

  • Danke, dieses funktioniert jetzt:

    10 if peek(40960)<>169 then load "vscreen.p",8,1
    20 sys 40960

    Gruss

  • Super!
    Aber ist da tatsächlich RAM an der Stelle? Ich kenn die RAM-Erweiterungen nicht so genau. Technisch könnte es freilich schon so sein (auch wenn es nicht direkt für BASIC zur Verfügung stünde). ^^

  • Das ist der RAM ab $A000 der vom Basic nicht erreicht wird im VIC20. Es ist eine RAM-Erweiterung.

    Gruss