Kein !basic?
Das moderne Teufelszeug überlasse ich dem geneigten Leser zum Selbststudium
.
Es gibt 73 Antworten in diesem Thema, welches 11.918 mal aufgerufen wurde. Der letzte Beitrag (
Kein !basic?
Das moderne Teufelszeug überlasse ich dem geneigten Leser zum Selbststudium
.
Mit dem reinen Verschieben des Codes ist es ja nicht getan. Es sind etliche absolute Sprünge im Programm, die dann nicht mehr stimmen würden.
Ich überlege noch, wie ich das am besten mache. Aber ein BASIC-Stumpen ist durchaus geplant - vorausgesetzt, es sind keine Bugs mehr im Programm.
Mit dem reinen Verschieben des Codes ist es ja nicht getan. Es sind etliche absolute Sprünge im Programm, die dann nicht mehr stimmen würden.
Das habe ich in meiner Weisheit natürlich mitbedacht :-)!. Daher das etwas verwirrende *= Statement. Es ist alles für die richtige Adresse assembliert und funktioniert erst nach dem Kopieren.
Alles anzeigen"RAM-DISK 64" ist ein kleines, charmantes Programm, das direkt im Bereich $A000-$FFFF eine RAM-Disk anlegt, in der bis zu 16 Files gespeichert werden können. Man kann einzelne Dateien auch gezielt löschen, außerdem gibt es ein schlichtes Directory.
Optional kann man den Bereich $C000-$CFFF aus der RAM-Disk ausklammern. Diese Möglichkeit wird allerdings interessanterweise im Artikel gar nicht erwähnt. Das liegt wahrscheinlich daran, dass sie nicht richtig funktioniert. Ist die Option aktiviert, führt das Löschen einer Datei zuverlässig zum Absturz des Programms. Wer es trotzdem ausprobieren möchte: Die undokumentierte "INIT"-Routine wird im Originalprogramm mit SYS 39792 aufgerufen.
Überhaupt musste ich - wieder einmal - feststellen, dass im Programm zahlreiche Fehler waren. Einige Beispiele:
- Die BASIC-Speichergrenze ($37/$38) wird mitten durchs Programm gezogen. Das Anlegen von Stringvariablen überschreibt den Programmcode.
- Durch ein fehlendes "sec" werden alle Dateigrößen falsch berechnet.
- Man kann die 16. Datei nicht löschen
- ... usw. usf. ...
Außerdem ist die Originalversion - ebenfalls mal wieder - voll mit Selbstmodifikationen, die es schwer machen, dem Verlauf zu folgen.
Aus diesen Gründen habe ich letztlich größere Teile des Programms komplett neu geschrieben. Das war mühsam, aber auch interessant. Das Ergebnis ist die Version 2, mit der nun - hoffentlich - alles so funktioniert, wie es einst gedacht war! Ja, auch der Schutz für $C000-$CFFF.
Hier der originale Artikel aus der 64'er:
Bitte melde dich an, um diesen Anhang zu sehen.
Und hier einige Infos für Version 2 (Auszug aus dem Sourcecode):
Code Alles anzeigen; +=------------------------------------------------=+ ; ! **** RAM-DISK 64 v2.0 ! ; + ------------------------------------------------ ! ; ! AUFRUF: ! ; ! SYS 39936 ==> RAM-DISK initialisieren ! ; ! o Schutz einstellen ! ; ! o RAM-DISK formatieren ! ; ! SYS 39939 ==> nur Formatieren ! ; ! SYS 39942 "NAME" ==> Programm speichern ! ; ! SYS 39945 "NAME" ==> Programm laden ! ; ! SYS 39948 ==> Directory ausgeben ! ; ! SYS 39951 "NAME" ==> Programm löschen ! ; +=------------------------------------------------=+ ; ÄNDERUNGEN GEGENÜBER v1.0 ; ------------------------- ; # ALLGEMEIN: ; o Einführung einer Sprungtabelle ; o Redundanz durch Unterroutinen verringert ; o Selbstmodifikation durch indirekt-indizierte ; Adressierung ersetzt ; o Datenmüll und überflüssige Befehle entfernt ; o Schreibfehler in Texten korrigiert ; o ... und anderes mehr ... ; # INIT ; o BASIC-Speicherende wird jetzt richtig gesetzt ; # DELETE ; o komplette Routine neu geschrieben! ; o funktioniert jetzt auch im protected-Modus ; o Datei-Nr. 15 lässt sich jetzt löschen ; # DIR ; o Dateigröße (Blöcke) wird jetzt richtig berechnet ; o Beim Speichern wird die Anzahl der Dateien geprüft ; o Sinnvolle Ausgabe bei 0 DateienAuf dem d64-Image sind die Originalversion, die neue Version v2 und ein kleines Testprogramm, mit man beide (!) Versionen testen kann. Für Version 2 hänge ich außerdem den Sourcecode an.
Viel Spaß mit dem Programm.
Coole Idee.
Ideal wäre natürlich ...
Sowas könnte man erreichen
Bei der UC hätte man zwar "nur" drei Disketten Platz, aber dafür könnte man das Programm selbst auch im Modul unterbringen.
Coole Idee.
Ideal wäre natürlich ...
- wenn man keinen C64 RAM verwenden würde (Kompatibilität)
- wenn man etwas mehr RAM Speicher hätte
Sowas könnte man erreichen
- GEO RAM Cartridge (2 MB - 12 Disketten)
Dafür gibt es doch schon Bitte melde dich an, um diesen Link zu sehen. oder sehe ich das falsch
?
Dafür gibt es doch schon Neoramdrive v0.40 oder sehe ich das falsch
?
Ah kannte ich noch nicht, danke! ![]()
Daher das etwas verwirrende *= Statement.
Verwirrend in der Tat! Diesen "Trick" kannte ich noch nicht. Irgendwann wurde mir dann klar, dass das Starten mit RUN nur funktioniert, wenn das Programm tatsächlich mit ",8" geladen wird - und nicht mit ",8,1". Nicht schlecht! Update kommt. ![]()
UPDATE auf Version 2.3
Die schönste RAM-DISK aller Zeiten entwickelt sich langsam zu einem ernstzunehmenden Tool!
Mir wurden Hinweise zugespielt, nach denen das Programm auch ohne großen Aufwand mit "RUN" gestartet werden kann. Ich dachte zuerst an einen Scherz, aber es stimmt tatsächlich! Kryptische SYS-Befehle hassen diesen Trick!
Außerdem ist mir aufgefallen, dass Commodore-Fehlermeldungen nur echt sind mit doppeltem Space vor dem Wort "ERROR". Ich weiß zwar nicht, wozu das gut sein soll, aber ich ehre diesen jahrzehntealten Standard und habe aus dem plumpen FILE EXISTS ERROR ein täuschend echt wirkendes FILE EXISTS ERROR gemacht! Wahnsinn, was so ein Leerzeichen ausmachen kann.
Anyway... Screenshot:
Bitte melde dich an, um diesen Anhang zu sehen.
Kurzanleitung:
; +=------------------------------------------------=+
; ! STARTEN : LOAD "RAMDISK",8 und RUN !
; ! NEUAUFRUF nach Deaktivierung: SYS39968 !
; ! ------------------------------------------------ !
; ! Danach stehen folgende Befehle zur Verfügung: !
; ! ................................................ !
; ! £FR ==> RAM-DISK neu formatieren !
; ! £SV "NAME" ==> Programm speichern !
; ! £LD "NAME" ==> Programm laden !
; ! £DIR ==> Directory ausgeben !
; ! £DEL "NAME" ==> Programm löschen !
; ! £OFF ==> RAM-DISK deaktivieren !
; +=------------------------------------------------=+
Alles anzeigen
PRG und Source im Anhang.
Viel Spaß mit dem Programm! ![]()
Oh, vertippt. Muss korrekt heißen:
NEUAUFRUF nach Deaktivierung: SYS39936
Könnte man bei File exits error eine Abfrage einbauen, ob man überschreiben möchte.
Wie fändet ihr die gute alte "@:"-Syntax? Habe das schon mal testweise eingebaut:
Bitte melde dich an, um diesen Anhang zu sehen.
Könnte man bei File exits error eine Abfrage einbauen, ob man überschreiben möchte.
Wie fändet ihr die gute alte "@:"-Syntax? Habe das schon mal testweise eingebaut:
Bitte melde dich an, um diesen Anhang zu sehen.
Vielen Dank.
UPDATE auf Version 2.5
Puh, bei der schönsten RAM-DISK aller Zeiten gab es tatsächlich noch massiv Luft nach oben. Die wichtigsten Änderungen:
Noch etwas: Das Binärfile (PRG) habe ich so umgemodelt, dass man es jetzt sowohl mit ",8" als auch mit ",8,1" laden kann. Das war mir wichtig. Starten weiterhin ganz einfach mit RUN.
Die Source-Datei erzeugt ein Programm, das man nur mit ",8" laden kann (deshalb das Anhängsel "RL" = relativ laden).
Nach intensiven Tests habe ich jetzt keine Bugs mehr gefunden. Aber vielleicht habt ihr ja mehr "Glück".
Zum Abschluss die Kurzanleitung:
; +=------------------------------------------------=+
; ! STARTEN : LOAD "RAMDISK",8 und RUN !
; ! NEUAUFRUF nach Deaktivierung: SYS39936 !
; ! ------------------------------------------------ !
; ! Danach stehen folgende Befehle zur Verfügung: !
; ! ................................................ !
; ! £FR ==> RAM-DISK neu formatieren !
; ! £SV "NAME" ==> Programm speichern !
; ! £SV "@:NAME" ==> Programm ggf. überschreiben !
; ! £LD "NAME" ==> Programm laden !
; ! £DIR ==> Directory ausgeben !
; ! £DEL "NAME" ==> Programm löschen !
; ! £OFF ==> RAM-DISK deaktivieren !
; +=------------------------------------------------=+
Alles anzeigen
Screenshot:
Bitte melde dich an, um diesen Anhang zu sehen.
Viel Spaß mit dem Programm! ![]()
Der Grund warum ich die Ladeadresse so gelassen hatte, dass man das Programm mit ,8,1 an das Ende des Basicspeichers lädt war, dass man es evtl. auch im Nachhinein (wenn man schon ein wichtiges Basicprogramm geschrieben hat) laden und starten kann. Tatsächlich weiß ich aber gar nicht, ob das so überhaupt funktioniert, oder ob das Basicprogramm dann eh weg ist. Deine Entscheidung ![]()
Dafür würde sich wohl Autostart anbieten (mit ,8,1 laden => lädt sich nach oben in den Speicher, setzt eigene Vektoren, setzt BASIC-Vektoren wieder korrekt). Ist aber etwas frickelig, das dann so zu machen, dass auch ,8 noch funktioniert, plus Autostart ist etwas nervig, weil alternative naive LOAD-Implementierungen (die einfach immer linear in den Speicher "laden", siehe diverse Module) damit nicht funktionieren.
Übrigens: die Lösung mit dem @: finde ich gut! Wo stammt die Idee denn her?
Übrigens: die Lösung mit dem @: finde ich gut! Wo stammt die Idee denn her?
kommt von "@0". Diesen Ausdruck musste du beim Überschreiben auf Diskette nutzen, da es ansonsten zu Datenfehlern kommt (schon selbst leidvoll erfahren)
gibt es einen Grund die load save open vektoren nicht zu nutzen?
Übrigens: die Lösung mit dem @: finde ich gut! Wo stammt die Idee denn her?
Das steht so im 1541-Handbuch:
Bitte melde dich an, um diesen Anhang zu sehen.
Allerdings soll diese Funktion bei der 1541 nicht benutzt werden, da sie nach zahlreichen Berichten buggy ist.
gibt es einen Grund die load save open vektoren nicht zu nutzen?
Keine Ahnung! ![]()
Aber wenn du ein Beispiel bringst, wie man das in diesem Fall einsetzen könnte, gucke ich mir das sehr gerne an.
open geht nach ffco holt sich dort aus der Zeropage die Adresse.
Diese Adresse kann man umbiegen und dann eigenen code laufen lassen und danach zur richtigen Adresse Springen die zuvor in der Zeropage stand.
Das Gleiche kann man mit Load ffd5 save ffd8 close ffc3 getin ffe4....
Als beispie kannst du das Dos Wedge von der test demo disk nehmen.