Cdvdburn

Wieder nix in 2018, neuer Versuch in 2019

2018 neigt sich dem Ende, und im Jahresendspurt passiert erfahrungsgemäß vor lauter anderen Verpflichtungen eher wenig. Nachfolgend die Liste der Softwareprojekte, die ich “eigentlich” in 2018 erledigen wollte, die aber weiter ihrer Finalisierung harren. Oft fehlen nur Kleinigkeiten, oder “nur noch das letzte Feature”, oder etwas Feinschliff.

CDVDBurn

Der Klassiker gleich zu Anfang. Das letzte offizielle Release, Version 2.02b (auch wenn als Beta gelabeled), war Feburar 2007. Seither plane ich ein neues Release. Was ist seither passiert? DVD-RAM kann geschrieben werden. Blu-Ray kann als BD-R und BD-RE geschrieben werden. Ein Extraktor ist nun integriert, mit dem man unabhängig von CD(ROM)FS Daten-CDs/DVDs/BDs anschauen kann und Dateien extrahieren kann, inklusive Unterstützung für Joliet und ein Subset der Rockridge-Extensions (soweit unter RISC OS sinnvoll). Dazu wurde die Lauffähigkeit unter ARMv7 und ARMv8 sichergestellt (ein echtes Abenteuer mit dem uralten Ada-Compiler). USB-Unterstützung für RISC OS 5 ist an Bord, ebenfalls S-ATA-Unterstützung fürs neue ADFS (z.B. auf Titanium und IGEPv5).

Ich hatte die Hoffnung, auf zumindest einem gängigen USB- und S-ATA-Laufwerk das DVD-R-Schreiben hinzukriegen, bin aber gescheitert. Einen Versuch habe ich mir noch vorgenommen (Incremental Writing statt DAO/TAO mit reserved track), und dann wird endgültig released, egal ob mit oder ohne DVD-R-Unterstützung. Dual-Layer-Unterstützung für BD-R und BD-RE wäre auch noch schön. Das Update wird kostenpflichtig werden, ich hatte einige Investitionen in Laufwerke und andere Hardware.

TapirMail

David Llewellyn-Jones hat 2018 den Sourcecode für TapirMail auf GitHub freigegeben. Mein Plan war, den Sourcecode etwas aufzuräumen, mit aktueller OSLib und aktuellem GCC und DDE baubar zu machen (so richtig mit Makefile und so…) und dann per Pull-Requests die weitere Entwicklung voranzutreiben. Beispielsweise die Unterstützung für Secure POP3/SMTP, und ggf. auch IMAPS. Da bin ich mittendrin steckengeblieben – bauen tut alles, aber Weiterentwicklung ist nicht geschehen, und ich stecke noch in den Überlegungen, wie so ein RISC OS-Projekt unter GitHub anständig strukturiert sein sollte. Jetzt, mit Jeffreys Git-Client (oh, darüber wollte ich ja auch noch bloggen…), ergeben sich da neue Möglichkeiten.

Isofier

Aus der Reihe “Java-basierte Software für RISC OS, aber nicht unter RISC OS”: ein ISO9660/Joliet-Image-Erzeuger. Die Kommandozeilenvariante funktioniert prächtig, das grafische UI nicht so wirklich. Die Besonderheit ist die volle Unterstützung für die HostFS-Implementierungen von RPCEmu und VirtualRPC, es werden also die Filetype-Extensions automatisch in CDFS-Extensions gewandelt, unter Berücksichtigung der VRPC-extensions-Konfiguration und einer MimeMap-Datei.

ImageTransformer

Aus der Reihe “Java-basierte Software für RISC OS, aber nicht unter RISC OS”: ein Konverter für das CDVDBurn-Fake-Image-größer-als-2-GiB-Format. In beide Richtungen natürlich. Nützlich, um unter RISC OS erzeugte Images dann auf dem PC brennen zu können, oder auf dem PC erzeugte Images (z.B. mit oben genanntem Isofier) unter RISC OS brennen zu können.

SpriteConverter/SpriteViewer

Aus der Reihe “Java-basierte Software für RISC OS, aber nicht unter RISC OS”: SpriteConverter ist ein Kommandozeilentool zur Konvertierung einer Sprite-Datei (also allen oder einzelnen Sprites darin) in PNG, JPEG, GIF oder was auch immer als Java ImageIO-Plugin zur Verfügung steht. SpriteViewer setzt auf demselben Code auf und zeigt in einer grafischen Oberfläche den Inhalt einer Sprite-Datei an, einmal in einer !Paint-artigen Übersicht, dann aber auch per Doppelclick in Originalgröße mit Zoommöglichkeit und Palette. Man kann einzelne Sprites daraus auch direkt als PNG, JPEG oder GIF exportieren. Geplant als kostenlose Software.

ArchiveViewer

Aus der Reihe “Java-basierte Software für RISC OS, aber nicht unter RISC OS”: eine grafische Oberfläche zur Anzeige der Inhalte typischer RISC OS-Archivdateien wie Spark, ArcFS, PackDir, Squash und ZIP, mit voller Filetype-Unterstützung. Basiert hauptsächlich auf der großartigen Vorarbeit namens riscosarc von James Woodcock. Geplant als kostenlose Software.

BBC BASIC Detokenizer

Aus der Reihe “Java-basierte Software für RISC OS, aber nicht unter RISC OS”: ein kleines Tool, um tokenisiertes BBC BASIC V/VI in plain text umzuwandeln. Mit oder ohne Zeilennummern. Geplant als kostenlose Software.

FilecoreImageReader

Software, um Sprites zu lesen, um Archive zu lesen, um BBC BASIC zu lesen…wofür das alles? Auslöser war der vorerst letzte Teil aus der Reihe “Java-basierte Software für RISC OS, aber nicht unter RISC OS”: ein mächtiges Werkzeug, um Filecore-Images (.adf, .hdf) anzuschauen und Dateien und/oder Verzeichnisse daraus zu extrahieren. Unterstützt D, E(+) und F(+)-Format, minimaler Speicherverbrauch auch bei riesigen Images. Anzeige des Verzeichnisbaumes mit den “echten” RISC OS-Icons. Anzeige der Inhalte von Sprite-Dateien, Archiv-Dateien, Plain-Text-Dateien und BASIC-Dateien (andere Dateitypen werden in einer Hexdump-View angezeigt). Im Moment baue ich gerade echte Acorn Latin 1 Codepage-Unterstützung, um sowohl die Plain-Text-Anzeige als auch die Konvertierung der Dateinamen besser hinzukriegen. Und ich hätte gerne eine Filer-like-Ansicht für einige Inhalte, damit das eleganter aussieht. Und es gibt noch irgendwo einen Bug, der bei einem Disc-Image das mir vorliegt bei, Scannen der Verzeichnisstruktur in eine Endlosschleife gerät. Mindestens das Erkennen der Endlosschleife mit sauberem Abbruch des Lesevorgangs wäre Voraussetzung für ein baldiges Release. Außerdem würde ich gerne automatisch die !Sprites-Dateien von Apps direkt zur Visualisierung verwenden.

Ein Projekt wie FilecoreImageReader ist natürlich in ständiger Gefahr, dem “Feature Creep” zu erliegen. Man könnte doch bekannte Filetypes aus der PC-Welt auch noch direkt als Inhalt anzeigen (Grafikformate, PDF, PostScript…). Und generell die UI Filer-like machen. Und noch ein RISC OS-artiges Look&Feel für Swing bauen. Und eine Anzeige von Draw-Files ermöglichen. Und Templates. Und Impression…und Artworks…

Auf jeden Fall wird es eine kostenpflichtige Version mit all den coolen Features geben, und eine freie Version wo man nur den nackten Verzeichnisbaum mit Extraktionsmöglichkeit hat, möglicherweise auch limitiert auf Floppy-Images.

20 Jahre CD(VD)Burn

Man schrieb den 31.Oktober 1997. In London fand die Acorn World statt, und CDBurn wurde dort im Vertrieb von WSS (Warm Silence Software) zum ersten Mal öffentlich vorgestellt.

Man erinnere sich zurück: es war die letzte Acorn World, der Risc PC war noch “state of the art” und hatte gerade durch den StrongARM eine Frischzellenkur erhalten. CD-Brenner waren teuer und nur als SCSI-Geräte erhältlich. CD-R-Medien kosteten mindestens 10 DM, oft auch 15 DM. 74min/650MiB waren die maximal erhältliche Kapazität. Fast unendliche Weiten in Zeiten, wo die Festplatten noch im deutlich einstelligen GB-Bereich unterwegs waren, vor allem in der Geschmacksrichtung SCSI waren 2 GB schon fast High-End. Ironischerweise wurde die Software selbst noch auf Floppy Disc verkauft. DD 800 KiB wohlgemerkt.

Der einzige unterstützte Brenner war der Philips CDD2000, die Variante CDD2600 folge kurz darauf. Ich hatte damals das Glück, dass ich einen Brenner gekauft hatte, der eine öffentlich zugängliche Doku zum Command Set hatte – die Konkurrenz von Teac, Sony und Yamaha war da wesentlich verschlossener, man musste tatsächlich NDAs nach USA faxen, und die Antwort brauchte teilweise Monate. Von Teac habe ich bis heute nix gehört.

Die erste CDBurn-Version war “gerade so” fertig geworden (und meine Entscheidung, die Software in Ada zu schreiben, ist im Rückblick auch nur durch eine Mischung aus Optimismus und Wahnsinn zu erklären) – die Audio-CD-Funktionalität war schon recht ausgereift, aber bei den Daten-CDs haperte es noch gewaltig. Es gab noch keine Möglichkeit, ein ISO-Image zu erzeugen, ehrlicherweise war es deshalb auch die Versionsnummer 0.99 – deshalb wurde ein quick’n’dirty port von mkisofs beigelegt, um zumindest nominell dieses Feature abhaken zu können. Auf der Acorn World sprach ich mit vielen potenziellen Käufern und versprach baldige Lieferung des ISO9660-Formatters – ein Versprechen, das viele vom Kauf überzeugte und das ich Gott sei Dank noch im selben Jahr mit dem Release 1.00 (ein kostenloses Update) halten konnte.

Einzige Konkurrenz damals war CDScribe von Eesox – die verkauften aber die Software nur im Bundle mit dem Laufwerk, und dieses auch noch gut doppelt so teuer wie das Laufwerk alleine kostete. Audiotechnisch war die Software auch stark unterbelichtet, und der beigelegte ISO9660-Formatter war auch nicht der Weisheit letzter Schluss. Vermutlich deshalb eroberte CDBurn den Markt im Sturm, obwohl gemessen an der PC-Konkurrenz doch eher featurearm und nicht billig.

Über die Jahre wurde featuretechnisch kräftig aufgerüstet, die Updates blieben kostenlos: Multisession-Unterstützung, Joliet-Unterstützung und konfigurierbares Namemapping für ISO9660, CD-RW-Unterstützung, Unterstützung aller MMC-kompatibler Laufwerke, IDE-Unterstützung für Risc PC/A7000, APDL/Microdigital und Simtec/RiscStation, Upgrader um endlich neue Versionen per Download anbieten zu können, und schließlich 32bit-Kompatibilität und Unterstützung für den IYONIX pc. Abfallprodukt der IYONIX-Kompatibilität war die abgespeckte Version CDBurn Lite, die jedem Castle IYONIX pc beilag.

Besonders die 32bit-Kompatibilität halte ich bis heute für ein Wunder, das nur durch Dummenglück erklärbar ist. Klar, es hilft auch, wenn man einen Martin Würthner kennt, der mal kurzerhand eine GNAT-Runtime patchen kann. Aber dass das ARM-Backend des GCC 2.7.2.1 tatsächlich ARMv8-kompatiblen Code erzeugen kann, ist auch als so ein Wunder zu bewerten.

2004 gründete ich dann hubersn Software, um den Vertrieb in die eigene Hand zu nehmen. Es folgte die Integration der DVD-Unterstützung für die neue Generation DVD-Brenner, was die Umbenennung in CDVDBurn nach sich zog, um schon namentlich klar zu machen, dass nun sowohl CDs als auch DVDs gebrannt werden konnten.

Und damit endet die Geschichte der offiziellen Releases – bis heute sind die Ergebnisse der weiteren Entwicklung nicht in einem neuen Release gemündet, sondern werden nur an Interessierte als Beta-Testversionen verteilt. Dazu gehört die DVD-RAM-Unterstützung, die USB-Unterstützung für RISC OS 5, die Blu-Ray-Unterstützung, der CD/DVD/Blu-Ray-Extraktor, die ARMv7-/ARMv8-Kompatibilität für die neue Hardware-Generation vom BeagleBoard bis zum Raspberry Pi 3, die Unterstützung für das neue S-ATA-taugliche ADFS im Titanium.

Der letzte Plan war, all diese Erweiterungen in einem “20th anniversary release” zu bündeln, aber es fehlte etwas Zeit, um die Sache abzurunden: BD-R und BD-RE in der Dual-Layer und XL-Variante ist noch nicht unterstützt, DVD-R kann nach wie vor nicht geschrieben werden, und an der Kompatibilität mit den modernen (sprich: noch im Handel verfügbaren) Laufwerken hapert es auch noch. Ziel wäre, ein USB-Laufwerk und ein S-ATA-Laufwerk zu finden, mit dem problemlos CD-R/CD-RW/DVD+R/DVD+RW/DVD-RAM/BD-R/BD-RE geschrieben werden können.

Sollte es doch dieses Jahr noch ein Release geben – Arbeitstitel “CDVDBurn 3” – Leser dieses Blogs erfahren es als erste.

Ada, RISC OS und ARMv8

CDVDBurn ist in Ada geschrieben. Und wird mit dem einzigen Ada-Compiler compiliert, der je unter RISC OS existiert hat: GNAT 3.03, basierend auf GCC 2.7.2.1. Also Technik von 1996. Natürlich nicht 32bit-kompatibel, ich compiliere also entweder auf dem dicken PC im Emulator, oder per Aemulor auf dem ARMX6. Durch glückliche Fügung erzeugt der Compiler 32bit-kompatiblen Code (zumindest meistens – es gibt einige Ada-Features die man besser nicht nutzen sollte wie z.B. Representation Clauses) – das ARM-Backend des GCC konnte das eh schon länger, die GCC-Runtime habe ich damals 2002 als der IYONIX pc erschien aus einem GCC 2.95 extrahiert, und die GNAT-Runtime hat mir Martin Würthner persönlich auf Binärebene angepasst.

Nun hat sich allerdings in den letzten Tagen herausgestellt, dass der erzeugte Code doch nicht so ganz hasenrein war, was die 32bit-Kompatibilität angeht. Ein Sack voll deprecated LDM-Instruktionen haben sich in der GCC-Runtime gefunden, die zwar auf bisherigen 32bit-Maschinen – vom IYONIX über den Pi 1 bis zum ARMX6 – trotzdem funktioniert haben, aber beim Pi 3 mit einem gnadenlosen “Undefined Instruction” abgebügelt werden. Konsultation mit Experten und nähere Analyse mit ARMalyser zeigten den Schuldigen: die GCC-Runtime enthält im main-Entrycode non-32bit-Code. Die Suche nach Sourcecode, auf dem die Runtime basiert, war leider nicht erfolgreich, und so versuchte ich mein Glück mit händischem Binär-Patch.

Scheint mein Glückstag gewesen zu sein: CDVDBurn läuft nun einwandfrei auf dem Raspberry Pi 3. Ich hoffe inständig, dass das auch so bleibt falls RISC OS auf weiteren ARMv8-Plattformen stattfinden wird. Ich bin zu alt für diesen Scheiß.

CDVDBurn für Titanium

Die letzten Tage habe ich ein paar Stunden investiert, um CDVDBurn so anzupassen, dass S-ATA-Geräte am Titanium-Board unterstützt werden.

Die Anpassung an “yet another transport system” ist eine regelmäßig wiederkehrende und zuweilen nervige Arbeit. Historisch hat CDVDBurn, als es noch CDBurn hieß und man das Jahr 1997 schrieb, nur SCSI-Laufwerke unterstützt. Die gute alte Zeit. Egal welche SCSI-Karte, alle unterstützten die von Acorn vorgegebene API, und es gab nur wenige böse Überraschungen (der Connect32 war mit frühen Firmwareversionen bei größeren Blockgrößen etwas instabil, und das EESOX-SCSI-Podule hatte etwas abweichende Vorstellungen, wie der SCSI_Op genau bestückt wird).

Dann kam IDE. Risc PC und A7000 verwenden ADFS zum Zugriff, bei Simtec- und APDL-IDE-Podules wurde jeweils eine ganz eigene API rund um das dort verwendete IDEFS verwendet. Das RapIDE-Podule hatte wieder eine andere Idee, immerhin war dort die ATAPI-API sehr ähnlich der bewährten SCSI-API. Also: 4 unterschiedliche Transporter für den Eintritt ins IDE-Zeitalter.

Dann kam neue Hardware, aber zum Glück verwendeten die RiscStation-Maschinen die Simtec-API und die MicroDigital-Maschinen die APDL-API. Erst der IYONIX pc machte das Fass wieder auf – aber die Anpassung war initial einfach: CD_SCSIUserOp wurde ins CDFS reingedengelt, mit einer SCSI-ähnlichen API, aber man musste CDFS-Control-Blocks verwenden statt der SCSI-ID. Erst nach und nach kamen Einschränkungen ans Licht, vor allem bezüglich der Auswertung von Fehlern per Sense-Request. Auch unschön: CDFS musste das Laufwerk auch tatsächlich erkennen, was nicht immer der Fall war. Der IYONIX hatte aber eine Alternative zu bieten: dort hat ADFS in der Version 3 das IDE-Zepter geschwungen, und hatte endlich eine ATAPI-API anzubieten (beim ADFS von Risc PC und A7000 musste man noch Magic betreiben, um ATAPI-Kommandos abzusetzen).

Dann fing wieder die Glückssträhne an: die RISC OS 5-API für USB setzte sich durch, und dort wurden die Geräte schlicht als SCSI-Geräte behandelt. RISC OS 5 hatte nämlich den klassischen Acorn-SCSIDriver so erweitert, dass nun – ähnlich der softloadable drivers bei CDFS – per SCSISwitcher unterschiedliche Hardwaretreiber eingebunden werden konnten. So hätte das von Anfang an laufen sollen, IDE-Geräte wären nur spezielle SCSI-Devices gewesen und alle wären glücklich und zufrieden. Also: alles klar bei BeagleBoard, PandaBoard, Raspberry Pi und Konsorten. Auch beim ARMX6 gab es kein neues Problem – der bindet S-ATA-Geräte (oder besser: DAS S-ATA-Gerät, denn er hat nur einen S-ATA-Anschluss und S-ATA-Multiplexer werden derzeit nicht unterstützt) per softloadable SCSI driver ein. Aber da niemand seine schnelle S-ATA-Platte gegen ein S-ATA-DVD-Laufwerk tauschen will, ist das nur ein theoretischer Glücksfall.

Wer nun aber dachte, dass die softloadable SCSI drivers der Weg der Zukunft sein würde, sah sich mit dem Erscheinen des Titanium-Boards eines Besseren belehrt. ADFS 4 wurde aus der Taufe gehoben. Mehr oder weniger kompatibel zum alten ADFS, aber nicht kompatibel genug: CDVDBurn fand beim Drive-Scan keine Laufwerke.

Gott sei Dank gab es aber eine einfache Möglichkeit, den IYONIX-ADFS-Transport so aufzubohren, dass nun sowohl der IYONIX als auch das Titanium-Board mit einem Transport-System unterstützt werden können. Angenehmer Nebeneffekt: statt jedes Laufwerk einer ATAPI-Erkennungsprozedur zu unterziehen, wird jetzt auf die Ergebnisse, die ADFS beim Device-Scan erzielt, direkt zugegriffen (per ADFS_IDEDeviceInfo). Die Testergebnisse meiner Titanium-Tester sind noch durchwachsen, aber das könnte andere Gründe haben.

Wer zufällig ein Titanium-Board sein eigen nennt und beim Testen helfen will – E-Mail genügt.