von slx » Do 2. Apr 2015, 03:36
Vorige Woche habe ich angefangen, mit meinen Söhnen einen Beitrag für den Tenliners-Contest zu programmieren. Natürlich war es lustig, mit vielen Abkürzungen möglichst viel in eine Zeile zu stopfen, aber danach extrem lästig, was daran zu ändern.
Daher habe ich ein kleines Utility geschrieben um mir das "Tenlinern" zu erleichtern. Aus "kann ja nicht so schwer sein" wurden gleich ein paar Tage, da ich es doch geschafft habe, mich mit Pointern, Offsets und Werten mehrmals gründlich zu verirren.
Mein "Slow and Dirty"-Utility SLXpress fragt nach Eingabe- und Ausgabedatei und lädt zunächst den BASIC-Programmheader, um die Dateigröße herauszufinden. Dann DIMt es einen String entsprechender Größe und lädt das ganze Programm mit einem CIO block load.
Danach scannt es das Programm Zeile für Zeile und wenn immer es eine ungerade Zeile nach einer geraden Zeile findet, versucht es die ungerade Zeile an die gerade anzuhängen. Das funktioniert auch für mehrere ungerade Zeilen (also zB 10,11,13,15,17), so lange die resultierende logische Zeile weniger als 256 bytes hat.
(Den Versuch, das Programm mit sich selbst in einen Ten-Liner zu verwandeln habe ich rasch wieder aufgegeben, da ich dazu die vielen GOTOs hätte ersetzen müssen.)
Während das Programm läuft werden die Zeilenanzahl, die Zeilennummer und die Länge der resultierenden Zeilen angezeigt. Wenn eine Zeile mehr als 256 byte hätte, wird die ungerade Zeile nicht angehängt und das Program sucht die nächste gerade Zeile.
Zwei Zeilen zu kombinieren spart 3 bytes (für den Header der zweiten Zeile).
Ich habe das ganze grob getestet, übernehme aber natürlich keine Verantwortung für die Resultate - es sei denn, das Resultat ist ein Siegerbeitrag beim Contest, dann möchte ich bei den Interviews nach der Siegerehrung lobend erwähnt werden

Insgesamt war das ganze eher eine lahme Entschuldigung, mit einem jenseits meiner Programmierkenntnisse ausgedachten 10-liners-Projekt ein wenig zu pausieren, aber natürlich sage ich jetzt lieber, dass es die Wahl zwischen "Pur" und "Extrem" demokratisiert und von einer Frage der Kenntnisse zu einer reinen Stilfrage macht

Notizen vom Programmieren:
Es ist toll, dass es am Atari für fast alles gute Dokumentation gibt. Atari BASIC source code hatte ich schon als Teenager gelesen, bin aber jetzt draufgekommen, dass die Beschreibung nicht ganz stimmt. Laut Buch sollte am Ende jeder BASIC-Zeile ein "end of statement" und ein "end of line"-Token kommen. Tatsächlich - und auch nicht unlogisch - ist es aber nur der "end of line" token.
Außerdem scheint der Offset für die erste Zeile im File nicht "Ende des Headers + DST" sondern "Anfang des zweiten Teils + DST" zu sein, was ich im Buch auch nicht so lese. War aber mit Ausprobieren leicht herauszufinden.
Zuerst habe ich probiert, das mit GET/PUT und zwei offenen Files zu lösen, aber da braucht man mindestens eine Zeilenlänge Puffer, weil die Zeilenlänge in Byte 3 erst nach Bearbeitung der ganzen Zeile feststeht. Es müsste noch schneller gehen, wenn man statt ASC/CHR$ PEEK/POKE in den String verwendet, aber für die Tenliners wird Speed wohl kein Problem sein.
Viel Spaß damit!