SIO a data na disketě

Myslím, že zatím málo programátorů při tvorbě svých datových bází, kartoték a při editování textu pracuje přímo se sektory. Navykli jsme si záznamy(records) odesílat do souborů pomocí PRINT #n a číst s INPUT #n. Soubory ukládáme jako celek na disketu pomocí SAVE (zpět s LOAD Dn:...), nebo ve strojovém kódu použitím CIOMAIN a rutin z tabulky HATABS.

Přímá I/O manipulace se sektory na disketě pomocí SIO (Serial I/O) a její DCB (Data Control Block na adresách $0300..$030B) je jednodušší a lépe využívá operační pamět i stopy (traces) na disketě.

Podívejme se na krátkou ukázku SIODIR.TBA. Strojová rutina načtená do 6.stránky (ř.2..18) najde a zpracuje VTOC (sektory č. 361..368, $0169..$0170). Sektor se jako celek uloží do řetězce Z$ příkazem na ř.32. Parametr $5240 určuje, že se jedná o natažení sektoru do operační paměti, čtení. Pak se údaje o jednotlivých souborech vypíší na obrazovku. Z výpisu vidíme kolik a které sektory jsou na disketě obsazeny, a které jsou volné pro naše případné použití.

Na ř.76 a d. je ukázáno, jak vytvořit/editovat sektor, uložit ho na disketu, a pak - podle potřeby - ho z ní zase přečíst. Samozřejmě že ve skutečnosti bude Z$/sektor představovat náš záznam/record, a že v něm budou přesně stanoveny začátky a délky jednotlivých položek/polí. Zvolíme si číslo sektoru a tam záznam odešleme (ř.84). Vidíme, že pro zápis sektoru měníme ve funkci USR 1.parametr za $5780, t.j. Write. A databáze (ze dvou záznamů/sektorů) je hotova, uložena na periferii. Přečteme ji a dále zpracováváme již známým příkazem (viz řádek 94). Je samozřejmé, že vlastní databázi si budete tvořit podle svých potřeb; TurboBasic k tomu skýtá dost možností.

Jistě jste si všimli vysokého čísla sektoru pro náš příklad. Na každé disketě, formátované s FM# používá operační systém celkem 1024 sektorů (3 t.zv. Boot-sektory, 10 sektorů pro tabulku VTOC a mapy diskety); nám DOS dovoluje obsadit 1009 sektorů. Přesto však je disketa formátována na 1040 sektorů. Těch posledních 15 sektorů lze bez obav použít na každé disketě, i na těch, na kterých je dodáván magazín Flop. Můžete si to zkusit.

Budeme-li s FM#-formátovanou disketou zacházet jako bychom měli pro soubory jen 707 sektorů ("single"), pak na disketu dostaneme už 333 sektorů s naší databází. A konečně, vyčleníme-li celou disketu pro svá data, obě strany jenom sformátujeme s FM# a budeme mít 2080 sektorů, tedy 266 kB k dispozici.

Ukládat sektory můžeme i do RamDisku (RD). Zrychlí se tím jejich přesun sem-tam asi 10-tinásobně. Tuto časovou výhodu zase ztratíme, když budeme přesouvat svou databázi z RD na disketu (jen přes operační paměť, přímo to nejde). RamDisk (nejlépe u t.zv. rozšíření paměti o 256 kB) musí být definován buď jako D2:, nebo D3: či D4: (DCB obsluhuje 4 řadiče). Používáme-li Q-MEG, pak tento operační systém automaticky definuje RamDisk A nejen jako D8:, ale i D3:, a RD B jako D4:.

Do DCB (a.$0301) musíme tedy vložit číslo řadiče: POKE 1543,3 (pro RD A), nebo POKE 1543,4 (RD B), a už putují naše sektory z operační paměti na příslušný RD nebo naopak. Ale pozor: DOSem jsou při zapnutí přístroje přesunuty 3 boot-sektory do RD A, které my nesmíme obsazovat. Máme tedy k dispozici v RD A 1040-3 sektory; v RD B boot-sektory nejsou, ale zato je tento RD menší: má 467 sec (1..467).

Deklarovaná rychlost sériových operací se sektory je 19,2 kBaudů (pro disketovou jednotku A 1050). V praxi ale přesuneme 100 sec á 128 B z operační paměti do RD jen za méně než 1 s; a stejně tak i naopak. Přesun stovky sektorů z operační paměti na D1: bude trvat asi 11,5 sekundy, což i tak je rychlost dostatečná.

Vše co bylo uvedeno pro sériovou manipulaci s malými (128 B) sektory platí v principu i pro SIO a sektory 256-ti bajtové (disketové jednotky XF 551 nebo ATTACK 360). Do DCB musíme zapsat počet bajtů přenášených na jeden záběr (DPOKE $0308,$0100). Na disketě formátované s dvojitou hustotou (kupř. BIBODOSem) máme max. 1440 sektorů, což představuje 368,64 kB, čili již útlou knížku.

Na jednu stranu diskety formátované s FD# lze uložit ne 707 sektorů, jak nám ukazuje výpis direktoráře (/-A), ale dokonce 720 sektorů.

Vladimír Liška a Emil Slánský, Pardubice