Proč má Commodore 64 sviňsky pomalou disketovku

Commodore 64 mohl být nejlepším osmibitovým počítačem.
Za předpokladu, že by nejlepším osmibitovým počítačem nebyl Apple II, Commodore VIC-20, Sinclair ZX-81, Sinclair ZX Spectrum, Amstrad CPC, Enterprise 128 nebo dokonce dvaatřicetibitový Sinclair QL
Začalo to takhle:
Narozdíl od mnoha jiných (jako na tomto fóru) si nemyslím, že Applácká CFFA-I by byla vhodná pro připojení k počítači Micro-KIM.
Důvody, proč ne:
Nutnost předrátovat Micro-KIM expansion connector na standardní Apple I sběrnici. Netriviální a zbytečné.
CFFA-I používá mapování paměti a ROMkové cally na míru Apple I. Využívá jeho systémové proměnné v zeropage a i podpora ukládání a nahrávání programu v Basicu je psaná na míru Apple I integer basicu od Wozniaka. Její použití u Micro-KIMu by si tedy žádalo přepsat firmware.
Dále, zabírá hned tři “paměťové sloty” – celkem asi 12 KB adresového prostoru! Lze si takové plýtvání u Micro-KIMu dovolit?
Tahle paměťová nenažranost CFFA-I i na původním Apple I či Replice způsobuje, že koliduje s Multi-I/O kartou a není možno používat programátor EEPROM!
Navíc, CFFA-I pracuje s formátem ProDOS do velikosti 32 MB.
Omezení co do velikosti asi vadit nebude, ale jak na CF kartu dostat data?
Jediným řešením je použít Apple II s kartou CFFA-II.
Lze taky použít Macintosh se starým operačnám systémem, který formátování a čtení ProDOS disků podporoval. CF kartu by bylo ale nutné připojit jako IDE disk, což 90% starých Maců neumí, protože mají SCSI.
Navíc, historicky KIM-1 a Apple I nemají (krom procesoru, ale ani to není stoprocentně pravda) vlastně nic společného.
Tak proč ke KIMu násilím cpát něco, co k němu nepatří?
Historicky KIM-1 používal dvě vnější paměťová média:
1) papírovou děrnou pásku – čtečka a děrovačka byla připojena přes pass-thru (průchozí) konektor terminálu nebo dálnopisu (tehdejší terminály to uměly, ty novější už pass-thru nemají).
Na současných počítačích s emulátory terminálu jde páska nahradit funkcí pro text capture a odeslání textového souboru.
Funkce pro zápis a čtení se dala snadno zavolat ze systémového monitoru KIM-1 v terminálovém režimu.
Při čtení nebylo nutné díky papertape datovému formátu ani zadávat délku čteného souboru.
Uživatelské programy (assembler MicroADE, TINY Basic, Microsoft Basic, Forth …) vstup a výstup svých datových souborů na papírovou děrnou pásku ale nepodporovaly.
2) kazeta. Jeden pin vestavěné 6522 slouží pro připojení kazetového magnetofonu. Ten se dá ovládat (zdánlivě komplikovaně) ze systémového monitoru jak v režimu teminálu, tak v režimu ovládání přes keypad a displej.
Vstup a výstup přes kazeťák podporuje naprostá většina programů. Obsluha magnetofonu je uložena v ROM a 99% programů tuto službu korektně volá.
Jaký je tedy můj návrh?
Použít MMC2IEC.
MMC2IEC emuluje commodoráckou disketovku 1541, takže je povaze KIMu (považovaného za první počítač firmy Commodore, i když ta ho koupila s celým MOSem už hotový) mnohem bližší než applácká CFFA-I.
K ovládání IEC stačí 3 dráty místo bohatýrsky obsazeného paměťového prostoru (CFFA-I mapuje části CF karty v paměťovém režimu do paměťového prostoru Apple I).
Dále, MMC2IEC zapisuje a čte ze SD karty formátované ve standardní FAT 16/32. Není tedy problém v přenosu dat mezi KIMem a vnějším světem.
A dále, o file handling a správu toho FAT formátu se stará MMC2IEC sám. KIMu pak stačí jen poslat požadavek “tento soubor chci nahrát” nebo “tento soubor chci uložit (v podstatě pár jednobajtových řídících kódů a jméno souboru) a je hotovo, softwarová obsluha na straně KIMu by byla (nepočítám-li samotnou emulaci sériového vstupu a výstupu na paralelní bráně) velmi krátká a jednoduchá.
Protože KIM už nemá volné vstupy a výstupy (má rezervované dva fousy pro kazetový interface, to je ale na IEC málo), je potřeba k němu připojit 6522 nebo podobný čip, a doplnit software.
Úplně ideální by bylo pozměnit aktuální ROM a odchytávat skoky na obsluhu magnetofonu – veškerý software, který čte z kazety a ukládá na ni by pak bez úpravy pracoval s disketou (pardon, se SD kartou).
Tato hardwarová úprava by měla být jednoduchá.
Ani se software není problém, protože existuje způsob, jak připojit disketovku od Commodore k počítači SYM-1, který je zdokonalením KIM-1 a je s ním zpětně kopmpatibilní. Pro komunikaci s disketovkou používá rutiny opsané z ROMky VIC-20.

Překvapením bylo moje zjištění, že IEC, stejně jako před ním použité IEEE, je sice protokol triviální, ale s velkými možnostmi.
Umí obsluhovat celou řadu současně připojených zařízení, navíc na každém umí pracovat s několika soubory současně.
Skoro se až ptám, proč takhle vymyšlený protokol, který vyžaduje spolupráci inteligentního periferního zařízení, je implementován tak blbě, že je neskutečně pomalý.
Tady je odpověď:

VIC-20 a jeho IEC konektor
Konektory a kabely pro IEEE-488 sběrnici vyráběl jediný výrobce: Belden cables.
A stalo se, že z nějakého důvodu (snad armádní zakázky) nestíhal dodávat Commodoru dostatečný počet kabelů.
Čili Tramiel měl spousty počítačů a disketovek na skladě, a neměl je čím propojit.
Přikázal proto vymyslet kabel, který by dokázal vyrobit kdokoliv.
Výběr padl na serializaci sběrnice a šestikolíkový DIN konektor.
Samotná sběrnice měla být sériová a protokol organizován podobně jako původní IEEE, a do designu počítače VIC-20 se počítalo s čipem 6522 VIA, který díky shift registru uměl přijmout bajt po jednotlivých bitech a nabídnout ho pak procesoru jako celek.
Problém byl, což hardwaristi nevěděli, že je v shift registru chyba (používal se dříve pro tvorbu zvuku a při tom bylo zjištěno, že bohužel interferuje s ostatními funkcemi – přesný popis problému jsem nenašel).
Přišlo se na to až v době, kdy byly desky pro VIC-20 ve výrobě a na vývoj nového čipu bylo pozdě.
VIC-20 musel být přeprogramován a tak místo odchytávání bajtů musel softwarově odchytávat jednotlivé bity – čímž se zpomalil asi 8x.
Odpovídajícím způsobem musela být proto upravena i disketová jednotka 1540, která rovněž obsahovala VIA čip.
Commodore 64 mělo místo 6522 VIA osazen 6526 CIA. Ten neobsahoval už chybu v shift registru a počítalo se s obnovením původního plánu na rychlou sběrnici.
Vedení ovšem z nějakého důvodu, kterým byla chystaná jednotka 1541, rozhodlo, kvůli kompatibilitě s VIC-20, zůstat u pomalejšího chroupání jednotlivých bitů.
S tím se ale objevil ještě jeden problém – nový grafický čip VIC-II, který po každé řádce textu, tedy po 8 mikrořádcích, zastavil procesor na minimálně 42 mikrosekund (při použití hardwarových spritů i na dobu delší).
Na emulovanou sériovou sběrnici ale přicházel jeden bit každých 20 mikrosekund – a docházelo by ke ztrátám dat při přenosu.
Řešením bylo přenos ještě více zpomalit, aby ani při delším waitnutí procesoru nedošlo ke ztrátě byť jediného bitu.
Proto je Commodore 64 při přenosu ještě pomalejší, než VIC-20!
Disketovka 1541 proto umí (tuším, že je to povel “U”) zapnout VIC-20 kompatibilní mód (kompatibilní s 1540), kde pak s počítačem VIC-20 komunikuje rychleji, než v defaultním C64 režimu.
Rychlá komunikace s disketovkou se objevila až u stroje Commodore 128 a funguje ve spojení s disketovkou 1571, která je tak při připojení k Commodore 128 mnohanásobně rychlejší, než při připojení k Commodore 64 (a její schopnost je tak u C64 trestuhodně nevyužita).
Naopak, Commodore 128 se standardní 1541 komunikuje mnohem pomaleji, než s 1571.
Velmi pomalá komunikace s periferními zařízeními je, vedle vyblitých barev a netriviálního uspořádání videopaměti, důvodem, proč není Commodore 64 naprosto jednoznačným kandidátem na nejlepší osmibitový počítač, i když oblíbeností, dobrou grafikou a zvukovými možnostmi má na hodně.

Až mne překvapilo, jak málo lidí využilo vlastností “inteligentní” disketovky 1541 pro připojení ke svým počítačům, mně přijde pro 6502 stroje jako stvořená (až na tu “rychlost”).
Dá se říct, že kromě Commodoru samotných se objevila konstrukce umožňující připojení k ZX-81 (což je stroj se Z-80), jugoslávci ji přidrátovali k ZX-Spectru (rovněž Z-80) a z 6502 strojů jsem našel jen připojení ke stroji SYM-1, což je shodou okolností stroj v mnohém podobný KIMu.
Synertek SYM-1
Zajímavé je, že realizovat připojení bylo jednoduché (v případě použití takzvané DTV verze zařízení MMC2IEC není dokonce potřeba žádná elektronická bižuterie okolo a stačí jen 3 dráty) a díky tomu, že stačilo vzít IEC rutiny z VIC-20, očistit je a nechat volání několika málo povelů CBM DOSu, i softwarová podpora je celkem krátká – včetně SYM DOS CLI, podpory rezidentního assembleru RAE a SYM-1 Basicu a dvouřádkového výpisu copyrightu se obsluha vešla do 3 kB.
Přesto ale v další fázi uživatel přikročil k tomu, vyměnit 1541 interface za řadič převzatý z TRS-80 založený na řadiči WD.
SYM-1 s diskem
Manuál i nákres interface pro připojení 6502 k SYM-1 se mi sehnat podařilo.
ROM se ale vyskytuje jen jako object code, a i když se dodával s interface přímo i zdroják, na netu není (je ale k dispozici disassembling a cross reference, takže by se strojově definovaná návěští dala přejmenovat podle cross referencí a bez komentářů se holt budu muset obejít).
Zajímavější mi přijde, že tak oblíbený a rozšířený počítač, jako je VIC-20, nemá nikde dostupný komentovaný disassembling kernelu, odkud by se daly rutiny nejnižší úrovně vypreparovat.
Na disassembling SYM DOSu jsem se už díval, spousta částí, jako podpora RAE a Basicu, jsou zbytečné (pokud se na KIMu bude volat emulace kazety). Používá VIA 6522 připojenou od adresy A000. Což nesedí s tím, kde má Micro-KIM připojen 6532 RIOT, ale to vůbec nevadí.
Shodou okolností rozšířená 32 kB paměť končí na 9FFF, takže od A000 se dá VIA připojit – a nebude se ani tlouct s druhou 6532, pokud si ji někdo připojí!
Samotná realizace připojení 6522 by neměla být obtížná.
V kódu bude nutné přepsat části, které využívají paměti SYM-1 od adresy A600, kam si ukládá monitor systémové proměnné a vektory – pomocí kterých se rozšiřuje příkazový soubor monitoru o diskové povely. V tomhle má SYM-1 software promyšlenější než KIM.
No, tak se v tom prostě budu zatím vrtat