Programátoři z pekel zde za šat a stravu programují čipová pseuda. Nyní s favicon!

Sinclair QL – přenos souborů a zip

Rozhodl jsem se uspořádat software pro QL, který mám, tak, aby mohl běhat na QubIDE. Chtěl jsem tím vytvořit image pro ty, kdo si QubIDE nebo QL-SD taky pořídili a zkompletovaná sbírka her a programů by se jim hodila. No ale nebude to taková prdel, jak jsem myslel.

Občas se někde od někoho nebo někoho jiného objeví informace, že na QL je software málo.

Eh, kdyby tomu tak bylo, byl by můj úkol jednoduchý.
Něco jako sbírat hry pro Amstrad GX-4000 (těch bylo 27) nebo Mattel Aquarius (těch bylo asi 13 včetně Basicu, Loga, biorytmů a šachů) či cartridge pro Sord m5 (asi 28).

Pravda, je ho sice dost, ale shání se špatně. Buď se kupuje komerčně, takže při pár librách za hru si můžete vybrat, jestli si koupíte programy pro QL, nebo dům a auto. Nebo je někde ke stažení, a pak nastává dumání, jak ty soubory dostat do QL.
Často se dočtete o tom, že existuje ten či onen program nebo hra, které by vás zajímaly, ale nemáte, jak se k nim dostat.
Ovšem že by software bylo málo?

Já sám mám přes 100 disket, a to hlavně proto, že programy a hrami, které se dají odněkud stáhnout, jsem se zatím nějak nezabýval. Jednak za to mohlo to, že jsem neměl vytvořen řetěz přenosu dat na QL (i když možných cest je hodně), druhak to, že kvalitní diskety se dnes neshání úplně dobře, a dále, že je toho na netu opravdu hodně a dá práci se v tom vyznat.
Nic není uspořádané, nikde nepoznáte, zda ze dvou programů, dělajících totéž, je jeden lepší a druhý horší, a v čem.
Často jsou popisky u souborů ke stažení nicneříkající, není z nich jasné, zda program dělá opravdu to, co očekáváte, není jasné, jaké jsou jeho nároky, zda nepotřebuje nějakou komponentu, kterou vy nemáte a která není součástí archivu s programem (třeba proto, že se stále prodává komerčně – viď, menu_rext), někdy dokonce nesouhlasí číslo verze v popisku a ve skutečnosti (takže si stahnete archiv s popiskem nové verze 2.20 a v archivu je stará verze 2.12, viď, Toolkite II).

Problém verzí je širší, existuje kopec verzí různých toolkitů, různých komponentů Pointer Environmentu, a člověk by chtěl mít samořejmě ty poslední. Na disketách je to peklo, protože je zvykem na každou disketu, kde je nahrán program využívající Pointer Environment, nahrát i komponenty toho Pointer Environmentu, ale pak zjistíte, že na sedmi disketách máte sedm různých verzí.
V tomhle by QubIDE mělo být osvobozující, protože na disku stačí mít jedinou kopii Pointer Environmentu, která bude sloužit všem programům, které jej vyžadují, a tuto jednu kopii pak snadno udržovat aktuální.
Dobrá zpráva je, že i ty komponenty, které se nedají běžně stáhnout z netu, bych měl mít někde na disketách. To je výhoda více zdrojů, co není v jednom, bude v druhém.

Tedy, moje představa byla jednoduchá.
Vzít QL s QubIDE, vzít QL s disketovkami, propojit je pomocí Q-Lan, kopírovat po síti soubory z disket na QubIDE disk a upravovat zaváděcí Basic tak, aby místo floppy nebo microdrivu (ano, na disketách mám i spoustu neupravených zaváděcích Basiců psaných ještě pro Microdrive – mimochodem, toto se bohužel týká i prodávaných kompletů od RWAP!) pracovaly s harddiskem (nebo s virtuálním zařízením, kterému se při bootu počítače přiřadí, zda jde o harddisk, floppy nebo microdrive).

Nevím, jak často s disketami pracujete, ale zejména ty HD nejsou moc spolehlivé.
Formátování trvá nějakou dobu, diskety přestávají být čitelné a z hromádky disket, připravené na to, že je použiju při přenosu jako buffer v okamžiku, kdy budu potřebovat zazálohovat již upravený a utříděný obsah QubIDE, to přeformátovat nebo změnit rozložení partition a zas obsah nakopírovat zpátky, jsem vyhodil naprostou většinu (10 z 12).
Rovněž tak vadné sektory na disketách mi čím dál víc vadí, například můj Q-Route má vadné sektory zrovna v mapových souborech, takže je k ničemu (budu si muset koupit novou sadu map).
Proto tak trochu spoléhám na QubIDE, že bude jako médium spolehlivější a snáze zálohovatelné (dejme tomu jako image celého média), než diskety.
Nevím, zda si pamatujete, jak to vypadalo, když ARJ rozbalovalo Dooma přineseného domů na dvaceti disketách, ale i na QL zabere práce s disketami celé hezké půldne.

První, co mne napadlo, že bude na QubIDE potřeba, byl Toolkit II.
Nevím, jakou kdo bude používat konfiguraci, ale je možné, že bude chtít mít v ROM slotu raději cosi jiného – mICE interface s myší, QL-SD, QubIDE samotné nebo nějakou jinou externí ROM (monitor, ROM k překladači Céčka, …) atd., než Toolkit.
Proto by se hodilo mít na disku verzi nahrávanou do RAM (pokud ji někdo nechce, třeba proto, že má Toolkit II v ROM, může si příslušný řádek v BOOOTu zaREMovat).
Poslední verze Toolkitu II by měla být 2.20.
U Dilwyna byl „configurable Toolkit“, nahrávaný do RAM, staré verze 2.06 a údajná verze ROM 2.20 upravená pomocí MagneticEPROM tak, že se dá nahrát do RAM, ovšem po jejím převodu do QL jsem zjistil, že je to stará verze 2.12.
Nezbyde tedy, než vzít ROM verzi 2.20, převést MagneticEPROM do QL a ROM upravit.

Se ZIPem je taky legrace.
Spustitelné soubory (ne datové soubory, a ne Basicové programy – Basicový program na QL je prostý textový soubor) mají hlavičku, podobně jako na ZX Spectru.
Při přenosu souboru na PC, které tyto hlavičky nezpracovává (nebo na jakoukoli platformu, která toto specifikum QL souborů nerespektuje), dojde ke ztrátě této hlavičky (podobně, jako se ztrácely „resource forky“ souborů z klasického Macintoshe, dokud byly resource forky ještě od Apple podporovány) a při přenosu zpět na QL nejde soubor spustit, protože podle neexistující hlavičky není spustitelný.
(Popravdě tato teorie je trochu nejasná, protože například při přenosu souboru po RS-232 si můžete vybrat, zda se má přenášet s hlavičkou nebo bez hlavičky – a po uložení na PC je pak hlavička součástí souboru. Při přenosu zpět na QL by tak měla zůstat zachována. Při přenosu z disku na disk se toto zřejmě nerespektuje.)

Vzhledem k tomu, že britští QLkáři jsou povětšinou emulátoristi (před 30 lety si koupili QL, u něj setrvali, používají stále podobný operační systém, stejné programy, jen ten černý hardware vyměnili za modernější notebooky s Windows), řeší to používáním zazipovaných archivů.
Takový .zip soubor obsahuje kdejaké informace, včetně QL hlaviček. Pokud takový .zip rozbalíte na PC nebo Macu, dojde k popravě uvnitř zabalených souborů – hlavička se prostě usekne a zahodí, získaný soubor už na QL nikdy nespustíte (hlavičku mu znovu nevytvoříte).
Správné řešení tedy je takový .zip archiv vzít, přenést na QL a tam jej pomocí Unzipu rozbalit.

To se snadno řekne, ale v těch .zip archivech je kdeco.
Třeba kompletní dokumentace v html i s obrázky .png či .jpg. Blbý terminálový program má díky takové přibalené dokumentaci v .zip souboru půl mega.
SMSQ/E je v .zipu zabalené pro všechny platformy, ten .zip má jeden a půl mega, to už se ani nevejde na HD disketu.

Navíc po rozbalení takového dárečku máte na disku v QL velký bordel souborů, které nepotřebujete a překáží vám, a musíte je jeden po druhém procházet, dumat, zda zrovna tento potřebujete nebo nepotřebujete, a ty, které vyhodnotíte jako nežádoucí, pak mazat. No a nebo tam nechat bordel, kdy při výpisu obsahu adresáře vám bude scrollovat několik obrazovek s css, jpegy a html.

No a jak lépe dostat na QL samotný Unzip, než v .zip archivu?
(Teď jej akorát mít čím rozbalit.)

Bohužel, Zip a Unzip nejsou programy vytvořené přímo pro QL. Jsou to programy portované z nějakého UNiXu. To je operační systém, který často běží na platformách, kde pár megabajtů RAM nic není a používají se různé zaběhané techniky, které na QL nejsou úplně doma.
Samy o sobě sice nezabírají zas tak moc místa, ale udržují si v paměti velké buffery a základní paměť QL jim nemusí stačit.
Navíc – jak je dostat do QL?

Už jsem napsal, že datové soubory, třeba textové, nemají hlavičku. A program v Basicu je textový soubor (s UNiXovými konci řádek).
Takže program v Basicu přenést umíme.
A co takhle napsat Basic, který vytvoří soubor, vygeneruje do něj obsah a dá mu spustitelnou hlavičku?
Existuje na to dokonce utilita Job2Bas.
Vygeneruje program, který po spuštění do paměti napoukuje kód a pak jej uloží jako spustitelný.
Do paměti se tak musí vejít jak program v Basicu s mohutnou náloží povelů DATA, tak binárka hotového programu.

Problém je, že poukování hodnot do paměti v Basicu je pomalé a neekonomičnost ukládání do příkazu DATA je strašná.
Wordy uložené v dekadické podobě sežerou 6 až 7 bajtů Basicu na 2 bajty kódu. Kdyby to bylo uložené třeba v řetězci hexadecimálně, to by byly dva bajty na bajt plus (nějaká ta režie okolo – uvozovky a samotný povel DATA).
Asi čtyřicetikilový Unzip má v Basicu skoro půl mega!
(Pokud bych to měl psát já, vůbec bych meziprodukt do RAM neukládal, otevřel bych soubor a rval to z DAT rovnou na disk. Dále bych použil spíš hexadecimální řetězce než řadu čísel, nejlépe i s kontrolními součty. No ale proč to dělat, když už to někdo jiný udělal nějak jinak…)

Druhý problém je, že ačkoli QL s QubIDE včetně RAM má nějakých 640 kB, u 128 MB partiton se čtyřsektorovými bloky, jakou jsme použil já, nechává mapa disku (pro 65536 bloků) v RAM volných necelých 400 kB.
Do tohoto volného prostoru nejde ten Basic skoro ani nahrát, natož generovat nějaké soubory.

Jak jsem to tedy provedl?

Nejprve je třeba dostat soubory do QL.
Nějak.

Možných způsobů je více.
* Sinclair QL má sériové porty, umožňuje přenos přes sériák, je to jedna cesta.
* Dále jsem už přes tyto sériové porty úspěšně připojil ConnectOne iWiFi modul.
S jeho pomocí by šlo stahovat nejen z vašeho PC, ale i přímo z webu.
* Pak existuje možnost zapisovat na QL disk přímo pomocí utilit na PC (ať na diskety, nebo na QubIDE disky).

Mám, narozdíl od běžných smrtelníků, štěstí, že jsem si stihl pořídit zařízení Ser_USB, dokud bylo k mání.
Jde o čtečku SD karet a USB disků, která se připojuje ke QL přes sériový port.
To by nebylo tak zajímavé, protože i když jde o velkokapacitní médium, na holém QL se nezbavíte problému s mapou disku, ukusující cennou paměť, a komunikace přes sériák není nejrychlejší, rozhodně disketovka a snad možná i microdrive jsou rychlejší.

Jenže… Jenže to zařízení umí číst FAT formát. Samo od sebe.
Ani nepotřebujete v paměti mít adresář či mapu disku, takže na holém QL nezabírá navíc v paměti ani bajt.
Prostě pošlete povel „vlez do adresáře toho a toho“, „pošli mi výpis adresáře“, „smaž soubor ten a ten“, „pošli mi soubor ten a ten“ a Ser_USB poslušně pracuje (jako byste přes terminál ovládali další počítač).

(Koneckonců, i nativní QL filesystém, pro který existuje ovladač, je na Ser_USB realizován pomocí povelů „zapiš do sektoru číslo …“, „přečti sektor číslo …“, a teoreticky by to nemuselo být realizováno přímo na médiu, ale uvnitř image souboru – „přečti z tohoto image souboru sektor číslo …“. Obsluhu nativního filesystému si ale, kromě načítání a zápisu sektoru, dělá QL samo – včetně udržování diskových map v RAMce.)

Doplňte si to příkazem pro kopírování z FAT disku na jiné nativní zařízení na QL (lze dokonce z FAT disku v Ser_USB kopírovat na jiný disk v Ser_USB v nativním QL formátu) – a obráceně – a máte ideální prostředek na přenos souborů z PC – a obráceně.

Tedy jsem nahrál na USB flash disk potřebné soubory (Basic se Zipem a Unzipem, zazipované archivy) a …
Inu, mám manuál a nativní QL ovladač na disketě verze 1.03.
Mám modul do ROM slotu s nativním QL ovladačem a FAT driverem verze 1.4 (bez manuálu).
Na netu je ke stažení manuál k verzi 2 (ale nejsou ke stažení ovladače verze 2), manuály ke starším verzím na netu nejsou.

Verze 1.x a verze 2.x se bohužel ovládají každá lautr jinak (dokonce i jméno zařízení se v obou verzích liší).
Takže jsem tam stál se svým FAT ovladačem 1.4 v ROM a nemohl si zaboha vzpomenout, jak se ta věc vlastně ovládá.

Naštěstí jsem geniální a za půl dne se mi to podařilo rozběhat.
(Nebudu ani psát, jaké příkazy to žere, na světě je těchto zařízení stejně jen pár.)
A rovnou koukám, že zařízení je připojeno rychlostí 9600 baud.
No, jsem sice rád, že nemám připojení 4800 baud, ale říkám si, že to přeci dřívávějc chodívalo rychleji.
Jal jsem se tedy pátrat, jaké přenosové rychlosti ještě existují, a protože mám v QL Hermes čip, dosáhl jsem nakonec rychlosti 19200. Což je na kopírování půlmegových .zip souborů najednou mnohem lepší.

Špatné je, že můj FAT ovladač je uložen v EPROM, která se vkládá do externího ROM slotu. Špatné je to proto, že můj Super Toolkit (tedy Toolkit II verze 2.20) je uložen v EPROM, která se vkládá do externího ROM slotu.
Nemohl jsem si tedy dovolit používat při přenosu povely Toolkitu (můj oblíbený WTV – zadaný bez parametrů udělá přesně to, co potřebuji – nastaví televizní režim, takže je obraz na obrazovce celý, ale přitom nastaví mode 4 s větším množstvím znaků na řádek – je jich 74, v monitorovém režimu by se vešlo 85).
Jak jsem ale přenesl a zprovoznil Toolkit nahrávaný do RAM, hned to bylo pohodlnější.

Jak si to člověk jednou osvěží a osvojí si tu techniku, jde to dál jako po másle, a QubIDE disk jsem začal plnit .zip archivy.

Mimochodem, jak jsem uvedl, 256 MB disk jsem se rozhodl rozdělit na dva oddíly (jeden pro užitkové programy, jeden pro hry), každý 128 MB, raději po blocích velikosti 4 sektory než 8 sektorů (předpokládal jsem ve finále spíš větší množství kratších souborů, než několik málo velkých, a chtěl jsem neplýtvat místem).
Při namountování jedné partition (a nahrání 17 kB Toolkit II do RAM – funkce FREE_MEM je totiž součástí Toolkitu) bylo z celkových 640 kB volných asi 370 kB.
Zatracená mapa disku!

Naštěstí jsem druhou partition ani nevytvořil a nechal na disku nevyužité místo, nevím, kolik RAM by zbylo, kdybych namountoval obě.

Proto jsem se rozhodl to přeplánovat – vytvořit raději více menších partition, z nichž některé nemusí být při startu ani namountované. Teoreticky stačí mít při běžném provozu namountovanou jednu partition, při kopírování z jedné na druhou pak dvě partition.

Dalo by se to rozdělit třeba na programy, které nepotřebují Pointer Environment (pak ho při bootu počítače ani nemusíte nahrávat a ušetříte místo v paměti) a programy používající Pointer Environment.
No a ten zbytek, tedy hry, by se dal rozdělit třeba podle žánru.
Mezi textovkami mohou být grafické adventury zabírající mnoho místa na disku, akčních her bude zase mnohem víc, daly by se vyčlenit simulátory – pro QL existují tři kvalitní (i když jeden zřejmě nepůjde provozovat bez disketovky kvůli ochraně).
A ano, existují i hry pro Pointer Environment :o)

Tak, a teď bylo potřeba .zip archivy rozzipovat. Ale pořád mám zatím Unzip jen v podobě dat uvnitř Basicového programu, který se nevejde do paměti.

No, ne tak.
Shodou okolností jsem tak nějak předpokládal, že ji budu potřebovat… (Ve skutečnosti jsem si ji předem připravil proto, že umí číst HD a ED diskety, jejichž obsah budu chtít na QubIDE dostat).
Ano, Super Gold Card má 4 MB RAM.
(Jak jsem psal minule, i QubIDE by teoreticky bylo možné zkombinovat s 256 kB RAM a získat tak 896 kB RAM! Odstranilo by se tak dost problémů, i při 300 kB velké mapě disku by zůstávalo skoro 600 kB volných pro uživatele. Bohužel José Leandro dekódovací logiku pro výběr čipu v příslušném adresovém prostoru sám vytvořit nezvládne.)

Vtip je v tom, že Leandrovo QubIDE není průchozí (nedá se tedy snadno připojit spolu s Gold kartou) a nese těch 512 kB RAM (které by se s Goldkartou tloukly), takže spojení QubIDE disku a 4 MB RAM pro rozbalení .zipu mi nejde.
(Jinak, byť je Gold karta „ošklivě se chovající“ zařízení, které si v paměťovém prostoru dělá, co chce, dá se zkombinovat s průchozím QubIDE na adrese 0C000.)

Použil jsem tedy typickou vlastnost QL – „síť je počítač“.
QL se Super Gold kartou (obsahuje ty 4 MB RAM a v tuto chvíli důležitý Toolkit II) jsem zapojil jako bezdiskovou stanici (bez disketovek).
Druhé QL mělo QubIDE s 512 kB RAM. Obě QL jsem propojil. Vyndal jsem EPROM s FAT driverem pro Ser_USB a strčil tam místo toho (v tuto chvíli důležitý) Toolkit. Povelem FSERVE jsem zapnul sdílení souborů.
No a sedl jsem k bezdiskové stanici a nahrál ze severu Basic pro vytvoření Zip programu.
Nahrál se, spustil se a začal poukovat do paměti, po nějaké době chtěl vzniklý Zip uložit. Zadal jsem cestu na server a program uložil.

Vybral jsem si .zip archiv k rozbalení a program se správnými parametry spustil.
Hodilo to chybu.
Nu, on to nebyl Unzip. Byl to Zip.
Pakování a depakování je v tomto případě ve dvou oddělených programech. Není to jeden, který umí oboje.

Znovu lépe a radostněji, přenesl jsem pomocí Ser_USB tentokrát opravdu Unzip, znovu sesíťoval QL a nechal Unzip vygenerovat.
A pak to přišlo. Nejprve rozbalíme Pointer Environment.
EW ZIP;'-d n1_win1_ -j n1_win1_pe_zip'
Rozzipovalo se to.
Program byl uložen na QL s QubIDe, .zip archiv byl na QL s QubIDE, rozbalené soubory se uložily na QL s QubIDe, ale já seděl u QL se Super Gold kartou, zcela bez disků a program a data běhaly v jeho RAM.

Teď jsem mohl brát jeden .zip za druhým, dívat se, co vyprodukovaly, zkoušet programy, mazat nepotřebné soubory a dělat v tom trochu pořádek.
(Ten parametr -j v unzipu má ignorovat adresáře. Nechtěl jsem, aby mi Unzip rozestrkával věci do podadresářů.)

Při rozbalování nejmenovaného terminálového programu jsem si zasral disk těmi html a .png srágorami, takže jsem raději už hotový obsah zazálohoval na diskety, disk celý smazal a, jak to v životě často bývá, začal znovu.

No a teď si představte, že bych o všechnu tu srandu přišel.

Že bych třeba měl, jako obyčejný smrtelník, nějaké PC s Windows, na které bych si nahrál Habiho Image Editor, připojil QubIDE disk jako reálný disk, připojil si .zip archiv jako image se soubory pro QL, naklikal bych si na QubIDE disku adresáře, vybral si ze .zipu soubory, které chci přenést a které ne, a myší bych je přetáhl do správného adresáře, …

..a hotový nahraný disk bych pak píchnul v QL do QubIDE…

No, počkejte…
Možná tu přeci jen možná nějaké PC s Windows mám…