SIFTRD - zálohovací utilita pro Betadisk
Úvod
Betadiskové diskety formátované TRDOSem lze pomocí PC číst jen obtížně. Nejčastější příčinou je absence číslování stran diskety s čímž si řadiče neumí poradit. Komplikací je i odlišná velikost sektorů, kopírovací programy z principu nefungují v Linuxu ani v novějších Windows než Windows 98, protože tyto systémy nedovolují tak snadno přistupovat přímo k registrům řadiče, nemluvě o tom, že z moderních PC (rok 2021) disketové mechaniky už dávno vymizely. Ani USB disketové mechaniky nejsou řešením, jen málokterá uměla jiný formát disket než 1.44MB s 512 byty na sektor. Proto je nejlépe s disketami pracovat přímo na Betadisku a data mezi PC a ZX Spectrum předávat jinak.
Způsobů jak přenést data mezi ZX Spectrum a PC je hodně, jedním ze způsobů je sériový port RS232, který je tu s námi už od roku 1960 a stále se používá pro nejrůznější servisní účely i u dnešních PC. I v roce 2021 jsou dostupné USB-RS232 převodníky a karty do PC (PCI i PCIe).
Pokud však stále ještě máte k dispozici počítač s MSDOSem a vhodnou disketovou mechanikou, tak můžete zkusit i utility ZX Tools a Hobeta stáhnutelné na konci tohoto seznamu.
SIFTRD 2009
První verzi programu jsem napsal krátce po té, co jsem si od Pavla Urbančíka koupil sériový port SIF. To bylo někdy počátkem roku 2009. A z té první verze se postupně vyvinul relativně primitivní, ale funkční, kopírovací program, který jsem nazval SIFTRD (a taky jednoduchý terminál ze kterého se stal SIFTERM). Neuměl toho mnoho. V podstatě dovoloval pouze zálohovat 640kB image diskety a stejně velký image diskety zapsat zpět na disketu.
Protože jsem to neuměl, snažil jsem se obejít bez softwaru na straně PC, resp. snažil jsem se využít už existující vlastnosti Linuxu a utility běžně dostupné v každé linuxové distribuci (stty, cat).
Bohužel absence programu na straně PC sebou nese riziko chyb, protože starý SIFTRD nepočítá žádný kontrolní součet podle kterého by se dala zkontrolovat správnost přenesených dat. Jedinou kontrolou je počet bytů. Když je výsledný soubor na PC veliký 655360 bytů, je přenesený pravděpodobně správně. A naopak, když ZX Spectrum přijme celý odeslaný TRD image a na konci ohlásí, že je disk plný, tak bylo přijato přesně 655360 bytů a přenos je nejspíš dokončen.
Prakticky jsem několikrát zkoušel přenést a zapsat disketu z image a tu disketu přenést zpět na PC a potom porovnat obsah např. pomocí md5sum a správně to bylo. Ale velká jistota tam není. Samotný TRD image taky kontrolní součty neobsahuje, nelze proto nijak dodatečně ověřit, že je bezchybný.
Největší riziko nastává na začátku přenosu. I když SIFTRD před zahájením přenosu nejprve zkouší číst ze sériového portu a vyprázdnit buffery na straně PC, může se stát, že tam po předchozím nedokončeném přenosu pár bytů zbude a celý obsah diskety bude o těch pár bytů posunutý. To vše, jsem se pokusil řešit až v nové verzi programu.
Ovládání
SIFTRD 2009 má jen velmi základní menu. Disk lze číst a poslat do PC, nebo naopak. Lze zobrazit obsah zvolené disketové mechaniky a přepínat mezi nimi. Toť vše.
Pokud program zobrazuje hlášku "Disc error!" jako na obrázku, pak to znamená, že na disketě není přítomna značka TRDOSu. Programu to nevadí, data přenese (oběma směry), ale disk není čitelný TRDOSem v BASICu. Na screenshotu to je důsledek chybně zapsaného obsahu na disketě. Hlášku lze ignorovat a disk klidně přepsat správným obsahem.
Při práci s disketou se zobrazuje malá ikonka, modrá znamená čtení z diskety, červená zápis na disketu.
Před zahájením zápisu na disk program čte data z RS232 dokud se nevyprázdní všechny buffery. Mělo by to fungovat i s USB-RS232 redukcemi, které mají buffer docela velký. Tím se snažím předejít chybám, které nastávají po přerušení přenosu při kterých může část dat v nějakém bufferu zůstat. Pokud program zůstane v nějaké situaci zastavený se žlutým okrajem obrazovky, pak to znamená, že čeká na data z PC, která nepřicházejí, nebo se data snaží poslat a příjemce je nepřijímá.
Před zahájením zápisu na disketu SIFTRD varuje, jakmile zápis povolíte, data na disketě budou definitivně ztracena. Po přepsání už není cesty zpět.
Ačkoli verzi z roku 2009 nechávám k dispozici, nedoporučuji ji používat. Vše, co stará verze uměla, nová umí taky a doufám lépe. Detaily o nastavení RS232 viz dále.
Download
- 2009-11-01_siftrd.tar.gz - verze programu 2009-11 včetně zdrojových kódů zastaralé! / deprecated!
SIFTRD 2021
Koncem roku 2019 jsem se víc zabýval sériovým portem, protože jsem objevil RS232 ROM Paula Farrowa a protože jsme společně s dalšími lidmi z Oldcomp.cz zkoumali možnosti softwarové RS232, která je standardní součástí originálního ZX Spectrum 128k i několika dalších počítačů. V roce 2019 se také objevila utilita sercp Pavla Vymetálka, která se stala díky své užitečnosti součástí ESXDOSu.
To vše dohromady bylo velkou inspirací a když jsem opět potřeboval přenést nějaké image disket na skutečný Betadisk, tak jsem začal přemýšlet, jak to celé vylepšit a možná se obejít bez SIFu, který se mezi uživateli nijak zvlášť nerozšířil.
Program SIFTRD jsem proto z velké části přepsal a rozšířil. Nyní:
- umí zálohovat disketu jako RAW data do PC přes SIF rychlostí 115200bps
- umí obnovit disketu jako RAW data z PC přes SIF rychlostí 115200bps
- umí zálohovat disketu jako RAW data do PC přes softwarovou RS232 na AY rychlostí 57600bps
- umí obnovit disketu z PC přes softwarovou RS232 na AY rychlostí 38400bps kompatibilní se sercp
- při přenosu RAW dat počítá CRC32, které lze ověřit různými utilitami na PC
- sercp má vlastní kontrolní součty společně s XOR na hlavičku i datové bloky
- má rozšířenou nápovědu vč. zapojení kabelu
- před zápisem ověřuje přítomnost značky TRDOSu a formát diskety
- má ošetřeno víc chybových stavů
- má přehlednější ovládání
Program nijak neřeší obsah diskety. Neumí rozlišovat, jestli je z diskety obsazená jen malá část, nebo všechny sektory. Neumí zmenšit TRD image, podle adresáře. Jedním z důvodů je, že se vyskytují diskety, byť vzácně, u nichž se adresář s obsazenými sektory neshoduje a přenesením jen sektorů, na které ukazují soubory, by se část dat ztratila. Druhým důvodem je jednoduchost algoritmu. Přenést disketu bez jakéhokoli zkoumání obsahu je mnohem snazší.
Program SIFTRD předpokládá, že je načtený z diskety. Ale protože je v distribučním balíčku i TAP, resp. TAP se vytvoří po kompilaci, je nutné TRDOS inicializovat před načtením z TAPky předem, např. skokem do příkazového řádku a návratem zpět, aby se následně SIFTRD nezhroutil při prvním volání TRDOSu. Předpokládám, že TAP verze obvykle poslouží jen jednou k přenesení TRD image se SIFTRDem a pak už může být program spouštěný jen z diskety.
Na disketu jsem pak pro jistotu přidal dvě verze. Jednu kompletní i s úvodním obrázkem a druhou minimalizovanou pro rychlé načítání, samotný program SIFTRD je stejný
RAW backup přes SIF
Při použití SIFu je postup i nastavení shodné pro starou i novou verzi SIFTRDu, kromě výpočtu CRC32.
- Na PC nastavte sériový port (v Linuxu příkazem stty).
- Na PC spusťte příjem a ukládání dat do souboru (v Linuxu příkazem cat)
- V SIFTRD zvolte sériový port "SIF 115200bps UART 16C650" (výchozí)
- V SIFTRD zvolte drive se zdrojovou disketou
- V SIFTRD zvolte BACKUP TRDOS disk
- čekejte
- Když ZXS ohlásí dokončení na PC ukončete příjem dat (na Linuxu CTRL+C)
- Soubor by měl být velký přesně 655360 bytů (resp. 327680, nebo 163840 pro menší kapacity)
- Porovnejte CRC32, které zobrazuje SIFTRD proti CRC32 spočítanému na PC na přijatém souboru
stty -F /dev/ttyS0 115200 cs8 clocal cread cstopb -parenb -parodd crtscts raw
cat /dev/ttyS0 > cilovy_image_diskety.trd
Na Windows, které obvykle nepoužívám, jsem zkoušel pro přenos dat program RealTerm a ke kontrole CRC32 program HashCalc a taky to šlo.
RAW obnova přes SIF
Při použití SIFu je postup i nastavení shodné pro starou i novou verzi SIFTRDu, kromě výpočtu CRC32, to stará verze neumí.
Tato metoda je možná jen díky malé vyrovnávací paměti přímo v čipu 16C650 (32 bytů FIFO buffer). Bez ní a bez řízení toku dat přímo čipem 16C650 by se při přenosu mohla ztrácet data a přenos by nebyl použitelný.
- Na PC nastavte sériový port (v Linuxu příkazem stty).
- V SIFTRD zvolte sériový port "SIF 115200bps UART 16C650".
- V SIFTRD zvolte drive s cílovou disketou.
- Ujistěte se, že je opravdu vložená správná disketa, původní data na ní budou ztracena.
- V SIFTRD zvolte RESTORE TRDOS disk
- SIFTRD se nejprve pokusí vyprázdnit buffery krátkým příjmem dat
- Teď odešlete data z PC např. příkazem CAT
- SIFTRD přijme první 4kB a ověří správnost značky TRDOSu a formátu diskety.
- Pokud je vše ok, SIFTRD pokračuje v příjmu dat a zapisuje na disketu.
- Pokud značka a formát TRDOSu chybí, může uživatel pokračování odsouhlasit.
- čekejte
- V okamžiku, kdy příkaz cat dokončí odesílání dat, by SIFTRD měl ohlásit dokončení přenosu.
- Porovnejte CRC32, které zobrazuje SIFTRD proti CRC32 spočítanému na PC z odeslaného souboru
stty -F /dev/ttyS0 115200 cs8 clocal cread cstopb -parenb -parodd crtscts raw
cat cilovy_image_diskety.trd > /dev/ttyS0
Vypráznění bufferů na straně PC je asi největší záludnost při obnově disket. Sériové porty v PC občas neodešlou všechny byty z bufferu a někdy je nutno tato data pošťouchnout zadáním např. příkazu stty na PC a zopakováním vyprazdňování bufferů SIFTRDem. To obvykle pomůže.
Kdyby buffer na straně PC nebyl před obnovou diskety prázdný, tak by se tyto byty mohly přidat na začátek přenášeného bloku dat a obsah diskety by byl chybný.
RAW backup přes softwarovou RS232
Tento postup se kromě přenosové rychlosti neliší od předchozího zálohování přes SIF.
- Na PC nastavte sériový port (v Linuxu příkazem stty).
- Na PC spusťte příjem a ukládání dat do souboru (v Linuxu příkazem cat)
- V SIFTRD zvolte sériový port "RAW 57600bps (AY-3-8912)"
- V SIFTRD zvolte drive se zdrojovou disketou
- V SIFTRD zvolte BACKUP TRDOS disk
- čekejte
- Když ZXS ohlásí dokončení na PC ukončete příjem dat (na Linuxu CTRL+C)
- Soubor by měl být velký přesně 655360 bytů (resp. 327680, nebo 163840 pro menší kapacity)
- Porovnejte CRC32, které zobrazuje SIFTRD proti CRC32 spočítanému na PC na přijatém souboru
stty -F /dev/ttyS0 57600 cs8 clocal cread cstopb -parenb -parodd crtscts raw
cat /dev/ttyS0 > cilovy_image_diskety.trd
Na Windows, které obvykle nepoužívám, jsem zkoušel pro přenos dat program RealTerm a ke kontrole CRC32 program HashCalc a taky to šlo.
RAW obnova přes softwarovou RS232
Tato možnost zůstala v programu zachována, ale prakticky nefunguje. Protože ZX Spectrum nestíhá přijímat data touto rychlostí, pokud není zaručeno, že PC přestane vysílat ihned po deaktivaci signálu RTS. A to v praxi není, PC vždy pošle malý, ale nepředvídatelný počet bytů, které už byly ve výstupním bufferu dřív než ZX Spectrum změnilo stav signálu RTS.
Aby toho nebylo málo, tak během čekání na START BIT nezbývá čas na testování klávesy BREAK. ZX Spectrum proto přestane reagovat, dokud nepřijde očekávaný blok dat.
Oba problémy řeší sercp. Nižší baudrate dovoluje testovat BREAK i během čekání na START BIT a zároveň utilita na PC zajišťuje posílání datových bloků, jejichž velikost je na ZX Spectrum očekávána. Po dokončení bloku PC nepošle další, dokud ZX Spectrum opět neaktivuje signál RTS.
Teoreticky by tento způsob mohl být použitelný mezi dvěma ZX Spectry. Kdo to vyzkouší?
obnova pomocí SERCP přes softwarovou RS232
Sercp řeší potíže s řízením toku dat a pozastavováním po dobu zapisování dat na disketu. Aby se data posílaná z PC do ZX Spectra neztrácela posílá sercp na PC (nebo sercp na jiném ZX Spectrum) po blocích, jejichž velikost je předem známá. Po dokončení odesílání bloku dat krátký čas počká a teprve potom začne testovat, jestli je opět přijímající počítač schopen přijímat.
- V SIFTRD zvolte sériový port "SERCP 34800bps (AY-3-8912)".
- V SIFTRD zvolte drive s cílovou disketou.
- Ujistěte se, že je opravdu vložená správná disketa, původní data na ní budou ztracena.
- V SIFTRD zvolte RESTORE TRDOS disk
- SIFTRD se nejprve pokusí vyprázdnit buffery krátkým příjmem dat
- Po vyprázdnění bufferů spustit sercp s příslušnými parametry na PC.
- SIFTRD přijme fileinfo a první datový blok, ověří správnost značky TRDOSu a formátu diskety.
- Pokud je vše ok, SIFTRD pokračuje v příjmu dat a zapisuje na disketu.
- Pokud značka a formát TRDOSu chybí a přesto souhlasí kontrolní součty, může uživatel pokračování odsouhlasit.
- Nesedí-li kontrolní součty, SIFTRD příjem dat přeruší a přestane ukládat.
- Po dokončení přenosu dat na obou počítačích sercp úspěšně skončí.
Rychlost sériového portu si sercp nastavuje samo. Použití by mělo být na všech Pavlem Vymetálkem podporovaných operačních systémech stejné.
Stejně jako při obnově obsahu diskety přes SIF i u sercp hrozí potíže s nevyprázdněným bufferem na straně PC a taky se ten problém dá řešit stejně, např. zadáním příkazu stty s příslušnými parametry. Pokud jde vše dobře, tak to nebývá potřeba. Problém může nastat po přerušení přenosu uživatelem, pokud to přerušení nastane na přijímací straně dřív než na vysílací. Např. když se na disketě objeví vadný sektor, nelze přijmout další data, ale PC už nějakou malou část odeslalo a ta část čeká v bufferu na aktivaci řídících signálů.
Právě takovou situaci by mělo řešit vyprazňování bufferů před samotným přenosem, kdy ZX Spectrum přijímá vše a data zahazuje tak dlouho, dokud nepřestanou přicházet a linka není určitou dobu v klidu, ale z nějakého důvodu to nestačí vždy.
stty -F /dev/ttyS0 38400 cs8 clocal cread -cstopb -parenb -parodd crtscts raw
Proč neumí SIFTRD zálohovat přes sercp?
Zálohování pomocí sercp zatím SIFTRD neumí, protože sercp je navržený tak, že nejprve musí poslat pevně definovaný blok fileinfo obsahující informace a kontrolní součty všech následujících bloků. Kvůli tomu je nutné nejprve přečíst celou disketu, spočítat všechny kontrolní součty, poslat první blok fileinfo s informacemi a teprve pak mohou být přenášeny datové bloky s obsahem diskety. To znamená, že by bylo nutné disketu přečíst dvakrát. S flashdiskem, nebo harddiskem v ESXDOSu to není tak velký problém, ale s pomalou disketou Betadisku už to problém je. Proto jsem zálohování pomocí sercp zatím nepřidal. Je to technicky možné, ale přenášet RAW data je pohodlnější a rychlejší.
Jak dlouho záloha, nebo obnova diskety trvá?
Provedl jsem několik měření na svém Sinclair ZX Spectrum 128k +2 s Betadiskem podle Mikrobáze 89', v Betadisku mám TRDOS 5.05CZ, používám 80 stopou disketovou mechaniku 3.5" a diskety formátované na 640kB. Je možné, že s 5.25" mechanikou budou rychlosti mírně odlišné, určitě budou výsledky odlišné s pomalejšími verzemi TRDOSu, například s originální verzí 5.03.
protokol | RS232 | směr | velikost | doba | rychlost |
---|---|---|---|---|---|
RAW backup vč. CRC32 | SIF UART 16C650 - 115200bps | ze ZXS do PC | 640kB | 194s | 3.30kB/s |
RAW restore vč. CRC32 | SIF UART 16C650 - 115200bps | z PC do ZXS | 640kB | 162s | 3.95kB/s |
RAW backup vč. CRC32 | software RS232 - 57600bps | ze ZXS do PC | 640kB | 230s | 2.78kB/s |
SERCP restore | software RS232 - 38400bps | z PC do ZXS | 640kB | 261s | 2.45kB/s |
Každou disketu jsem při měření nechal přečíst i zapsat několikrát a výsledné časy jsem zprůměroval. Výsledky byly konzistentní, největší odlišnosti v měření jsem způsobil já, podle toho, jak rychle jsem stihl reagovat a zastavit stopky. Práce s disketou, nebo výpočet CRC32 zaberou významnou část času, proto rychlosti nejsou tak moc odlišné pro různé přenosové rychlosti.
Obsah balíčku s verzí 2021
Soubor siftrd.tap je základní verze k prvotnímu zavedení, siftrd.trd je obraz diskety s plně TRDOSovou verzí SIFTRDu.
FILENAME TYPE SECTORS ADDRESS LENGTH TRACK SECTOR. -------------------------------------------------------------- siftrd <B> BASIC PROGRAM 2 369 369 1 0 SIFTRD_1 <C> CODE (BYTES) 13 50000 3082 1 2 SIFTRD_2 <C> CODE (BYTES) 36 32768 8961 1 15 siftrds <B> BASIC PROGRAM 1 84 84 4 3
Soubor siftrd.B je zavaděč plné verze, siftrds.B je zjednodušený zavaděč bez úvodního obrázku.
Dodatek
Používejte program opatrně ať si nesmažete důležitá data, nebo ať nespoléháte na nesprávně pořízenou zálohu.
Nezapomeňte, že jsem si SIFTRD psal hlavně pro sebe, primárně pro DD DS 640kB diskety a určitě není v mých možnostech ho zkoušet na všech možných kombinacích hardwaru, formátů disket, verzích TRDOSu a sériových portů. Zvláště USB redukce mohou být záludné.
Narazíte-li na nějakou chybu, napište mi. Podaří-li se vám chybu diagnostikovat, nebo dokonce opravit, ještě lépe, určitě si to nenechávejte pro sebe.
Download
- 2009-11-01_siftrd.tar.gz - verze programu 2009-11 včetně zdrojových kódů zastaralé! / deprecated!
- 2021-12-14_siftrd.tar.bz2 - verze programu 2021 včetně zdrojových kódů
- sif-trd_user_guide.pdf - simple user guide in English
Související odkazy
- web Pavla Urbančíka o SIFu - nyní už neexistuje, pouze kopie na Archive.org
- odkaz na web NXP - výrobce čipu SC16C650B
- diskuze o SIF Termu na Oldcomp.cz
Historie změn článku
- 2009-11-01 - Zveřejněna první použitelná verze.
- 2021-12-14 - Zveřejněna nová verze SIFTRD 2021 a při té příležitosti aktualizován i tento web.