Ovládání Betadisku z jazyka BASIC

Tento popis platí pro TRDOS 5.05, s drobnými odlišnostmi ho lze použít i pro originální TRDOS 5.03 od firmy Technology Research Ltd., která kdysi TRDOS vyvinula.

Pro ZX Spectrum existuje diskových systémů několik (snad až příliš mnoho), a drtivá většina funguje tak, že svým DOSem rozšíří příkazy BASICu o své příkazy (např. Didaktik 40/80, dále jen D40). D40 to řeší tak, že odchytává volání rutiny pro zpracování chyby, která nastala v syntaxi basicového příkazu. Oproti tomu Betadisk, jelikož pracuje tak trochu skrytě BASIC standardně nerozšiřuje. To ovšem neznamená, že se nedá použít. Naopak, použít se dá a to velmi snadno. Jen je nutné před každým příkazem, který má být TRDOSem proveden zavolat TRDOS na adrese 15619 a nějak mu předat příslušný příkaz. V praxi se to provádí např. takto:

10 RANDOMIZE USR 15619: REM: CAT

Případně trochu složitěji, pokud chcete v Basicu zpracovávat i některé chyby.

10 LET error = USR 15619: REM: LOAD "filename" CODE 50000
20 LET error = USR 15619: REM: příkaz pro TRDOS

Při použití varianty s LET ... USR při volání TRDOSu získáte v proměnné error číslo chyby a nedojde-li ke kritické chybě tak program pokračuje v činnosti přičemž o zpracování, resp. reakci na chybu byste se měli ve svém programu postarat sami.

Máte-li ve svém Spectru zapojenu ISO ROM, pak je vaše práce ještě snazší, stačí totiž napsat:

10 !CAT
20 !LOAD "filename" SCREEN$
20 !RUN "filename" CODE 40000
...

Vykřičník před příkazem je důležitý, ISOROM ho interpretuje v podstatě úplně stejně jako konstrukci RANDOMIZE USR 15619: REM:, ale výsledný kód je výrazně přehlednější, čitelnější a taky o několik bytů na příkaz kratší, což může být někdy velmi důležité. Taky se tím částečně stírá jedna z výhod D40, kde se příkazy zapisují např. takto LOAD * "filename", krom speciálních příkazů, které se netýkají pásky jako CAT, FORMAT ... a pod.

Betadisk má ještě další zvláštnost a tou je existence příkazového řádku TRDOSu. Což je režim, v němž lze zadávat pouze příkazy TRDOSu bez předchozího RANDOMIZE USR nebo !. Pochopitelně je tento režim velice výhodný na počítačích bez ISO ROM, ale i s ní je užitečný pokud se dostanete do situace v níž potřebuje např. načíst 5 souborů, vypsat obsah disku a ještě něco k tomu. Pokud nejste vlastníkem ISO ROM tak tento režim vyvoláte pomocí RANDOMIZE USR 15616, v případě ISO ROM pak jediným vykřičníkem.

Seznam použitelných příkazů

č.příkazpříkladStručný popis funkce příkazu
01CATCAT
CAT "a:"
Vypíše na obrazovku adresář diskety v aktuální, nebo zvolené mechanice.
02**"a:", *a Nastaví aktuální mechaniku, která může být a,b,c nebo d. První zápis funguje ve všech verzích TRDOSu. Druhý zápis jen v 5.04 a novější. Proto doporučuju v programech použít první variantu.
03FORMATFORMAT "a:jméno" Naformátuje disketu na 40, nebo 80 stop v závislosti na typu mechaniky, nebo na nastavení příkazem 40 a 80. Pokud je první znak jména disku $ pak bude disketa formátována jako jednostranná. Pozor! Protože novější verze DOSu neprovádějí test mechaniky po resetu (takové to děsné skřípění), bývají pevně naprogramovány nejčastěji na 80 stopé mechaniky (nezáleží jestli 5 1/4 nebo 3 1/2).
04MOVEMOVE setřese obsah disku, tj. provede jakousi defragmentaci. Protože TRDOS nepoužívá FAT tabulku, ale pouze adresář. Vznikají po smazání souborů, které nejsou poslední v pořadí volná místa. Tato volná místa nemohou být zaplněna, takže občas je nutné provést jejich odstranění příkazem MOVE. Obvykle to není zas tak moc potřeba.
05NEWNEW "nové_jméno","staré_jméno"
NEW "jméno_disku"
NEW "a:jmenodisku"
První zápis příkazu přejmenuje soubor a funguje na všech verzích DOSu. Druhá a třetí varianta provede přejmenování diskety a může být použit pouze od verze 5.04 výše.
06ERASEERASE "jmeno souboru"
ERASE "*"
ERASE "a:*"
První varianta smaže soubor příslušého jména. Jedná-li se o bytes pak za tímto příkazem musí následovat CODE. Stejně jako u LOAD a SAVE pro kazety. Druhá varianta existuje jen v novějších DOSech a provede úplné vymazání celého adresáře (zaplní ho nulama).
07LOADLOAD
LOAD "jmeno"
LOAD "a:jmeno"
LOAD "jmeno" CODE
LOAD "jmeno" SCREEN$
Tento příkaz pracuje téměř stejně jako v BASICu při práci s páskou. Protože se jedná o disketu je však nutné vždy zadat jméno souboru. Tak, ale já uvedl příklad použití bez jména. To je sice opravdu nesmysl, jenže v tomto případě doplní TRDOS jméno "boot" a načte program s tímto jménem. Existuje ještě jeden rozdíl oproti pásce a ten, že lze zadat pomocí x: jednotku (a až d) z níž se bude soubor číst. Vše ostatní je stejné.
Pozor! Syntaxe se SCREEN$ funguje jen v TRDOSu 5.04 a novějším.
08SAVESAVE "jmeno"
SAVE "a:jmeno"
SAVE "jmeno" CODE adresa, délka
SAVE "jmeno" SCREEN$
Zde platí prakticky to samé jako pro LOAD a to včetně poznámky o použití SCREEN$. Stejně jako pro pásku musí za CODE následovat adresa odkud se má ukládat kód stejně jako počet bytů, které se mají uložit Při ukládání BASICu lze použít rozšíření LINE k určení spouštěcího řádku programu. Stejně jako v BASICu lze ukládat i DATA a ARRAY (pole), ale to není tak důležité.
09RETURNRETURN Provede návrat z DOSového řádku do editoru BASICu. Do dialogového řádku TRDOSu se můžete dostat příkazem RANDOMIZE USR 15616, nebo máte-li ISO ROM odesláním !.
10PEEKPEEK "jméno souboru" adresa,sektor Přečte sektor n-tý sektor ze zadaného souboru a uloží ho do paměti na zadanou adresu. Přičemž n může být od jedné až do délky souboru, která se vypisuje např. při použití příkazu CAT.
11POKEPOKE "jmeno souboru" adresa,sektor Pracuje opačně než příkaz PEEK. Ze zadané adresy v paměti uloží data jako n-tý sektor zadaného souboru.
12MERGEMERGE "jmeno souboru"Jako LOAD, ale neprovede spuštění programu. Týká se jen programů v BASICu a pracuje stejně jako příkaz pro pásku.
13RUNRUN
RUN "jmeno souboru"
Tento příkaz funguje skoro stejně jako LOAD, jenže po načtení souboru provede okamžitě jeho spuštění. U BASICU buď od startovního řádku nebo od řádku 0 tak jako by za příkazem LOAD následoval příkaz RUN. Toale není vše, příkaz umí spouštět i bytesy. Po načtení do paměti provede skok na adresu, kam byl soubor načten. Např.příkaz RUN "stroják" CODE 49152,8192 načte soubor strojak na adresu 49152 a provede RANDOMIZE USR 49152 ihned po načtení. Velmi často se toho používá při dekomprimaci mnoho souborových programů, které se načítají do paměti najednou, mimo jiné se tím velmi zkracuje délka basicového zavaděče.

Stejně jako LOAD tak i RUN bez parametru provede spuštění programu boot, pokud je na disketě. Není-li boot.B nalezen, tak provede alespoň výpis katalogu diskety.
14OPEN #OPEN #n,"jméno_souboru",W Otevře ntý (ne méně než 3., protože 1. a 2. kanál jsou rezervovány pro výpis na obrazovku a 3. je tuším rezervován pro tiskárnu) kanál pro sekvenční zápis, ten pak je využíván pomocí příkazů vypisujících text, například PRINT #n;"nějaký text", LIST #n, !CAT #n ..., aby došlo k zápisu je nutné kanál uzavřít. Celková délka souboru samozřejmě nemůže být delší než kolik umožňuje TRDOS, tj. 64kB. Pokud už na disku existuje soubor stejného jména, tak se k němu další data přidávají. W za jménem souboru znamená Write, stream/kanál je samozřejmě možné otevřít i pro čtení a pak se s ním pracuje pomocí příkazu INPUT#n; A$, kde A$ je proměnná, kam se data načítají s disku. Příkazům OPEN # i CLOSE # musí předcházet volání TRDOSu, příkazům pro práci s textem nikoliv, ty zůstávají stejné bez ohledu na to kam je stream/kanál směrován. Při testování buďte opatrní, některé ROM s Basicem a některé verze TRDOSu obsahovaly chyby.
15CLOSE #CLOSE #n Uzavře ntý kanál, tj. vyprázdní buffery a data zapíše na disk.
16COPYCOPY "cíl","zdroj"
COPY "b:cíl","a:zdroj"
Zkopíruje souboru z místa zdroj na místo cíl. Cíl i zdroj mohou být na jedné disketě a potom TRDOS požádá (i několikrát) o výměnu diskety. Nebude-li výměna diskety provedena zkopíruje soubor pod jiným jménem na tutéž disketu. Při kopírování mezi 2 mechanikami zařídí vše sám pokud nenastane chyba. Vyžaduje hodně paměti pod RAMTOPem, nedoporučuji používat ke kopírování dlouhých souborů, je to silně nepraktické - vyžaduje zbytečně mnoho výměn disket.
174040 Tento příkaz říká TRDOSu, že má s disketou pracovat jako se 40 stopou. Je-li TRDOS nastaven ma 80 stopou mechaniku, bude vynechávat každou 2. stopu.
18GOTOGOTO "jmeno_souboru" CODE Tento příkaz je trochu zvláštní syntaxí, ale ve skutečnosti se jedná o další variantu příkazu LOAD. Tento je určený výhradně ke spouštění SNAPSHOTů a nelze ho použít bez rozšíření CODE. Nicméně za CODE nikdy nenásleduje určení adresy, nebo délky !
198080 Tento příkaz přepne na 80 stoppý režim práce s mechanikou.
20LISTLIST
LIST "a:"
Provede podrobný výpis obsahu diskety včetně adresy u bytesů, délky v bytech, délky BASICu bez proměnných a čísla spouštěcího řádku.
21VERIFYVERIFY "jmeno" Porovná obsah souboru s obsahem paměti, tedy chová se stejně jako příkaz pro pásku. Rozšíření příkazu pomocí CODE a SCREEN$ je stejné jako u LOAD a SAVE.

Přehled rozšíření a změn TRDOSu 5.04 (a taky 5.05) oproti verzi 5.03

TRDOS verze 5.03 od Kamilsoft je téměř shodná s původní 5.03

  • Je vyřazeno testování mechanik po každém resetu (způsobující nepříjemné zvuky a zdržení). Toto nastavení je natvrdo naprogramováno v EPROM (obvykle 80 stop - nezáleží jestli 5 1/4 nebo 3 1/2).
  • Je zabudován monitor Devast, který se spouští příkazem "!" z dialogového řádku TRDOSu.
  • U příkazu LIST byl odstraněn opakovaný výpis hlavičky.
  • Program "boot" je spouštěn libovolným příkazem pro čtení pokud není zadáno jméno souboru, tedy nejenom RUN, ale i LOAD, MERGE, PEEK.
  • Není-li "boot" nalezen je vypsán katalog.
  • Je zlepšena spolupráce se ZX 128kB, systém vytváří přídavné systémové proměnné.
  • Je upravena obsluha tlačítka Magic Button, takže nedochází k přepisu adres 23552 a 23553, ale RET se ukládá na adresu 22527 do obrazovky.
  • Při pokusu o zápis souboru se stejným jménem jako má jiný soubor na disketě lze stiskem klávesy "Y" starý soubor přepsat.

Další úpravy od autora BetaPolák

  • Umožněn zápis na 40 stopou disketu v 80 stopé mechanice.
  • Při nenalezení sektoru, není před novým najetím na stopu snížena krokovací rychlost.
  • Volání monitoru Devast je upraveno na "!!".

Další úpravy TRDOSu 5.04 - autor neuveden

  • Je zkráceno klávesové echo podle ISO ROM.
  • Je zrychlena komunikace s diskem díky zkrácení časových smyček a zvýšení rychlosti krokování v příkazech.
  • Je tokenizován i příkaz RETURN, kvůli LECROM.
  • Je akceptován i příkaz LOAD "jméno" SCREEN$.
  • Z monitoru Devast je odstraněn trojský kůň (ochrana firmy Proxima) a rozšíření znaků je provedeno vlevo, kvůli čitelnosti na počítačích Didaktik i Didaktik.
  • Je zastaven motor a zrušen select pokud není přítomen disk.
  • Při nenalezení sektoru je proveden návrat na 0 pouze jednou, v dalších pokusech je prováděn jen 1 krok zpět (resp. 1 krok vpřed jedná-li se o nečitelný sektor na stopě 0 nebo 1).
  • Při chybě "DISK ERROR" je vypsáno skutečné číslo sektoru. Stane-li se tak při použití CAT, nebo LIST dojde k obnovení původního čísla kanálu pro výpis.
  • Byla opravena chyba služby číslo 7 (výpis katalogu), takže nyní ji lze použít pro libovolnou mechaniku.
  • Příkaz LIST po dokončení výpisu vrátí hlavu mechaniky na stopu 0 a vytiskne kód CR, kvůli možnému tisku na tiskárnách. Pokud totiž tiskárně nepošlete kód CR nevytiskne obsah bufferu (tj. např. poslední řádek).
  • Příkaz LIST potřebuje o 32 bytů méně paměti a po provedení je použitá paměť opět uvolněna, takže lze tento příkaz zadávat opakovaně bez obav z hlášení "Out of RAM" (pokud nastane tak vždy a ne až po několikátém LISTu).
  • Příkaz VERIFY umožňuje porovnávat obsah celého souboru s obsahem paměti, při neshodě vytiskne:
    Verify ERROR
    xxxxx/yyy/zzz
    Abort,Ignore ?
    
    Kde xxxxx je adresa v paměti, yyy je obsah adresy xxxxx, a zzz je byte v souboru na disku s nímž se paměť neshoduje. Klávesou A lze porovnávání ukončit, klávesou I lze pokračovat na další adrese.
  • Na adresu 15607 byla umístěna sekvence IN a,(c) a RET což umožňuje číst registry řadiče při jeho přímém ovládání. Sekvence OUT (c),a a RET je umístěna jinde. Díky tomu není potřeba hardwarově upravovat desku DOSu.
  • Při formátování je vypisováno skutečné číslo formátované stopy (bez ohledu na stranu).
  • Jsou umožněny multisektorové operace se sektorem o velikosti 512 bytů (což umožňuje snadněji pracovat s disketami formátu MS-DOS, M-DOS (D40), CP/M ) pomocí služeb 5 a 6. Za tím účelem je využit bit 3 systémové proměnné pro zvolenou mechaniku (drive A - 23752 až drive D - 23755) a to tak že 0=256 bytů, 1=512 bytů na sektor.
bitvýznam
0formát diskety 0=40 stop, 1=80 stop
1počet stran 0=jednostranně, 1=oboustranně
2----
3délka sektorů 0=256bytů, 1=512 bytů
4----
5----
6----
7typ mechaniky 0=40stop, 1=80stop

Standardní TRDOS umí číst i sektory 128 nebo 1024 bytů dlouhé, ale nikoliv více najednou, pouze po jednom a navíc je nutno měnit programově (nestará se o to DOS) adresu bufferu kam se sektor uloží/ odkud se zapíše.

Bity 0,1,2 jsou ovlivňovány službou 24 (inicializace), která je volána při každém příkazu DOSu (netýká se služeb pro přímou práci se sektorem).

Bit 7 je ovlivňován pouze příkazem 40, nebo příkazem 80. Toto nastavení je pevně naprogramováno v EPROM na adrese 12210 pro mechaniku A, C a na adrese 12211 pro mechaniku B, D. 80h znamená 80 stopou mechaniku, 00h znamená mechaniku 40 stopou. Hodnoty je pochopitelně nutné zadat před programováním EPROM.

  • Jsou odstraněny všechny chyby příkazů PEEK a POKE (později doplním podrobnosti)
  • Příkaz ERASE byl rozšířen o možnost smazat úplně všechny soubory na disketě (ERASE "*"). Jedná se víceméně o rychlý formát diskety, protože adresář je zaplněn hodnotou 0 a tím je prakticky znemožněno obnovení souborů.
  • Příkaz NEW byl rozšířen o možnost přejmenovat i disketu (nejenom soubor) a to v případě je-li zadánou pouze jedno jméno.
  • Změnu mechaniky je možné provést příkazem *b: ačkoliv funguje starší verze *"b:"
screenshot výchozí obrazovky TRDOSu 5.05 (cz) screenshot devast+

Vlevo výchozí obrazovka při vstupu do TRDOSového příkazového řádku, vpravo obrazovkový disassembler Devast+.

Tak to je asi vše. Jestli TRDOS 5.04 přece jen obsahoval nějaké chyby, tak ty byly jistě opraveny ve verzi 5.05. Stáhnete-li si z této stránky (viz. všemožné ROMky) nějaký TRDOS určitě ho budete moct použít v emulátoru X128.

Použitá literatura : Mikrobáze z roku 1989, návod k TR DOSu 5.04 od Betaklubu v Brně a k tomu vlastní dlouhodobé zkušenosti

[ Zpět na hlavní stránku ]

Cygnusova stránka o ZX Spectru a kompatibilních počítačích byla napsána (přepsána) výhradně pomocí svobodného Open Source softwaru. V případě že naleznete chybu, nebo byste rádi cokoliv co se ZX Spectrem souvisí, neváhejte mi napsat na některý z mých emailů, nebo pracovně do zaměstnání. Stručně o mém webu se můžete dočíst zde.