Komentovany_vypis_ROM_D40

Transkript

Komentovany_vypis_ROM_D40
Komentovan˝ v˝pis MDOSu
verze 1.0 a jeho opravy
© 1995 KVAKSOFT
1. Jako obvykle zaËneme ˙vodem
Je to jiû nÏkolik let, co se mezi n·s dostala disketov· jednotka, pojmenovan· D40 nebo D80. Za tu
dobu se velice rychle stala jednou z nejpouûÌvanÏjöÌch perifÈriÌ, p¯ipojen˝ch k naöemu starÈmu ZX Spectru
nebo novÏjöÌmu Didaktiku ze Skalice, kde se takÈ uveden· disketov· jednotka vyr·bÌ (spÌöe vyr·bÏla,
protoûe v souËasnÈ dobÏ uû to je v ˙tlumu). Za tu dobu na nÌ vzniklo i mnoho software, aù lepöÌ nebo horöÌ
kvality, kter˝ umÏl s danou disketovou jednotkou pracovat, a tÌm i zvyöovat jejÌ pouûitelnost. TÌm
nechci ¯Ìci, ûe se s nÌ pracuje öpatnÏ. Pracuje se s nÌm velice dob¯e, ale posuÔte sami, ûe kdyû kopÌrujete
soubory pomocÌ DISKCOPY a pomocÌ MOVE, tak je v tom p¯ece jen nÏjak˝ rozdÌl. Jsou to hlavnÏ toolsy,
disk doktory, vznikl tabulkov˝ procesor, slovnÌk, textov˝ editor. A hlavnÏ doch·zÌ k ˙prav·m her,
p¯ev·ûnÏ dÌlov˝ch. Odpad· tak vÏËnÈ nahr·v·nÌ kaûdÈho dÌlu z kazety. To, co vzniklo za tyto roky, je
obrovsk˝ kus pr·ce. Jenomûe po¯·d tady nÏco chybÌ. Ano, je to komentovan˝ v˝pis obsahu ROM
v disketovÈ jednotce. Kaûd˝ autor programu pro D40 si musel udÏlat s·m nÏjak˝ takov˝ v˝pis, aby
v˘bec zjistil, jak D40 pracuje. A takov˝ch v˝pis˘ jistÏ existuje velkÈ mnoûstvÌ. NÏkdo p¯iöel na to, nÏkdo
na ono. Samotn˝ autor nedal v˝pis nikomu k dispozici. Na m˝ch nÏkolik dotaz˘ mi bylo vûdy odpovÏzeno, ûe obsah podlÈh· autorsk˝m pr·v˘m a ûe mi ho tedy nemohou poskytnout (prod·vajÌ v˝robek
a neposkytnou o nÏm informace, aby se mohl vytvo¯it software), a po rozmluvÏ s jednÌm ze spolupracovnÌk˘ autora mi bylo dokonce ¯eËeno, ûe ho nevlastnÌ ani autor (on ho sice m·, ale koment·¯e jsou
jenom asi 2 ¯·dky) ñ takûe Ñpomoz si s·mì. Samoz¯ejmÏ, ûe doölo k publikaci r˘zn˝ch adres, kde jsou
uloûeny nÏkterÈ podprogramy (v ZX MagazÌnu, kniha Rutiny ROM D40), ale to jsou jenom takovÈ
zlomky (je to asi stejnÈ, jako publikace nÏkolika adres v ZX ROM) a jeötÏ jsou nÏkterÈ vÏci nep¯esnÈ (to
nenÌ v˝tka autor˘m, snaûili se). Pr·vÏ to mÏ vedlo k tomu, ûe jsem se pokusil o vytvo¯enÌ celkovÈho
popisu disketovÈ jednotky a okomentov·nÌ celÈho MDOSu (tak se jmenuje operaËnÌ systÈm, kter˝
ovl·d· D40). ChtÏl bych touto cestou podÏkovat Standovi Skapovi, kter˝ mi dal assemblerov˝ v˝pis (j·
uû jsem si ho musel okomentovat), a Jardovi KrejËÌmu, kter˝ mi vnuknul tento n·pad ñ ÑBylo by dobrÈ,
kdyby to nÏkdo udÏlalì. No a nejvÌce s·m sobÏ, ûe jsem u toho vydrûel a neshodil to ze stolu (aspoÚ
bych si tam uklidil). Douf·m, ûe V·m tato pom˘cka pom˘ûe k tvorbÏ dalöÌch kvalitnÌch program˘ na
ZX Spectrum nebo Didaktik s touto disketovou jednotkou.
KVAKSOFT
PS: Tento komentovan˝ v˝pis jsem vöak musel ps·t v Microsoft Wordu, protoûe do Spectra
se mi neveöel (a to m·m ve Speccy 272 KB).
1.1. Disketov· jednotka D40/80
Co to v˘bec je disketov· jednotka? Je to za¯ÌzenÌ, kterÈ slouûÌ k uloûenÌ dat na vnÏjöÌ pamÏti ñ
diskety. Nahrazuje n·m tak kazetov˝ magnetofon. Rychlost p¯enosu dat je o mnoho rychlejöÌ neû
u kazetovÈho magnetofonu a cena mÈdiÌ se v p¯epoËtu na 1 byte liöÌ jen o smÏönou Ë·stku. Roste
i spolehlivost ukl·dan˝ch dat (jak se to vezme, protoûe i diskety majÌ svÈ mouchy).
1.2. OperaËnÌ systÈm MDOS
OperaËnÌ systÈm MDOS (M Disk Operating System) n·m umoûÚuje pouûÌvat p¯Ìkazy jazyka BASIC
pro komunikaci s disketovou jednotkou. Je umÌstÏn v pamÏti ROM disketovÈ jednotky. Je trochu
odliön˝ od jin˝ch operaËnÌch systÈm˘ (MICRODRIVE, DISCIPLE, BETADISK atd.) a nespolupracuje
s programy, kterÈ majÌ sv˘j syntaktick˝ analyz·tor ñ nap¯. SKYLINE BASIC (tam si ale jde dodefinovat),
MEGA BASIC, BETA BASIC atd. Popis p¯Ìkaz˘ operaËnÌho systÈmu MDOS si uvedeme p¯Ìmo
v komentovanÈm v˝pisu.
2
Komentovan˝ v˝pis MDOSu
2. TechnickÈ ˙daje o disketovÈ jednotce
2.1. ÿÌdÌcÌ jednotka
Z·klad tvo¯Ì ¯adiË WD2797, pamÏù EPROM 16 KB, pamÏù SRAM 2 KB a obvod 8255. ÿadiË zabezpeËuje komunikaci mezi poËÌtaËem a mechanikami. ÿÌdÌcÌ jednotka umoûÚuje p¯ipojenÌ dvou mechanik, p¯estoûe ¯adiË WD2797 umÌ ovl·dat aû 4 mechaniky. PamÏù EPROM obsahuje operaËnÌ systÈm
MDOS a je od adresy 0 do #37FF. PamÏù SRAM je od #3800 do #3FFF (p¯ekr˝v· EPROM) a slouûÌ k
uloûenÌ pomocn˝ch dat disketovÈ jednotky. Obvod 8255 slouûÌ jako interface pro p¯ipojenÌ ostatnÌch
perifÈriÌ.
2.2. ÿadiË WD2797
WD2797 m˘ûeme povaûovat za slouËenÌ obvod˘ FD1771 a FD179x, je kompatibilnÌ s form·tem
IBM 3740 v reûimu jednoduchÈ hustoty a s form·tem IBM 34 v reûimu dvojitÈ hustoty. Je zabudov·n
v disketov˝ch jednotk·ch D40 a D80 s verzÌ MDOSu 1.0 a jeho oprav·ch.
RozhranÌ procesoru se skl·d· z 8-mi bitovÈ oboustranÈ sbÏrnice pro p¯enos dat, stavu a ¯ÌdÌcÌho
slova.
Obr·zek Ë. 0 ñ rozmÌstÏnÌ v˝vod˘ obvodu WD2797
2.2.1. Popis v˝vod˘
Tabulku s popisem jenotliv˝ch v˝vod˘ naleznete na dalöÌ stranÏ
Komentovan˝ v˝pis MDOSu
3
P in
1
Sig nál
ENABLE PRECOMP
ENP
19 MASTER RESET/
MR/
20 GROUND
21 POWER
GND
Vc c
2
WRITE ENABLE/
WE/
3
CHIP SELECT/
CS/
4
READ ENABLE/
RE/
5, 6 REGISTR SELECT LINES
7–14 DATA ACCES LINES
A0, A1
DAL0–7
24 CLOCK
CLK
38 DATA REQUEST
DRQ
39 INTER. REQUEST
INTRQ
15 STEP
16 DIRECTION
17 5 1/4", 8" SELECT
STEP
DIRC
5/8
18 READ PULSE WIDTH
RPW
22 TEST/
23 PUMP
TEST/
PUMP
25 SIDE SELECT OUTPUT
27 RAW READ/
28 HEAD LOAD
SSO
RAWRD/
HLD
29 TRACK GATHER
TG43
30 WRITE GATE
31 WRITE DATA
WG
WD
32 READY
READY
33 WRITE PRECOMP
34 TRACK 00/
35 INDEX PULS/
WPW
TR00/
IP/
36 WRITE PROTECT/
WP/
37 DOUBLE DENSITY/
40 HEAD LOAD TIMING
4
Oznaèe ní
DDEN/
HLT
P o p is
‚0‘ na to mto vstup u umo žní záp is p re ko mp e nzace p ro p o užití re žimu
d vo jité husto ty p øi záp isu d at
‚0‘ (T>50µs) na to mto vstup u p ro ve d e re se t zaøíze ní a nastaví 3 d o
re g istru p øíkazu. Bì he m aktivního MR/ je nulo ván b it „No t re ad y“. Kd yž
MR/ sig nál p øe jd e d o ‚1‘ a je p ro ve d e n p øíkaz RESTORE ne závisle na
stavu sig nálu READY o d d rivu a d o se kto ru re g istru je nastave na
ho d no ta ‚1‘.
Ze m nap áje ní.
Klad ný p ó l nap áje ní (+5V)
Ro zhraní p o èítaèe
‚0‘ na to mto vstup u o znamuje p latná d ata na DAL vo d ièích p o kud CS=,0‘.
‚0‘ na to mto vstup u zp ùso b í p øip o je ní o b vo d u a umo žní ko munikaci
s p ro ce so re m
‚0‘ na to mto vstup u øíd í se jmutí d at z vyb rané ho re g istru d at na vo d ièe
DAL p øi CS=,0‘.
Výb ì r re g istru p ro I/O
8-b ito vá o b o usmì rná sb ì rnice p ro p øe no s d at, p øíkazu a stavu.
Te nto vstup vyžad uje ho d ino vý sig nál p ro vnitøní èaso vání (2 MHz p ro 8"
a 1 MHz p ro 5 1/4").
Te nto výstup info rmuje , že v d ata re g istru jso u p øip rave na d ata (ète ní)
ne b o že d ata re g istr je vo lný (záp is). Sig nál je nulo ván, p o kud p ro ce so r
d ata p øe ve zme ne b o d o d á.
Te nto výstup je nastave n p øi d o ko nèe ní výko nu p øíkazu a je nulo ván p o
p øe ète ní status re g istru ne b o záp ise m p øíkazu.
Ro zhraní d isku
Výstup kro ku. Vytváøí p uls p ro každ ý kro k me zi sto p ami.
Výstup smì ru kro ku. Pro kro k ke kraji je ‚0‘.
Vstup p ro výb ì r kmito ètu VCO p ro p o užití 5 1/4" ne b o 8" d rivu.
Vstup p ro vnì jší p o te ncio me tr p ro nastave ní fázo vé ho ko mp aráto ru p ro
d ato vý se p aráto r.
‚0‘ na to mto vstup u umo žòuje nastave ní trimru VCO, RPW, WPW.
Vyso ko imp e d anèní výstup ní sig nál p ro re g ulaci VCO.
Lo g ická úro ve ò výstup u výb ì ru strany je p øímo øíze na o d p øíznaku ‚S‘
v p øíkaze ch I a II, p o kud U=lo g . 1 SSO je nastave n také na lo g . 1.
Vstup sig nálu d at p øímo z d rivu.
Výstup øíd ící nastave ní hlavy k mé d iu p øi R/W o p e racích.
Výstup info rmuje d rive , že hlava je umístì na me zi sto p o u 44 a vnitøními
sto p ami. Je nastave n p o uze p øi p ro vád ì ní R/W o p e rací.
Výstup o znamuje d rivu, že d ata na WD jso u p latná.
Výstup d at d o d rivu.
Te nto vstup ind ikuje p øip rave no st d rivu. Pøe d p ro ve d e ním o p e race R/W
musí b ýt ‚1‘, jinak ne jso u o p e race p ro ve d e ny a je g e ne ro váno p øe ruše ní. Te nto vstup je v inve rto vané m tvaru o b saze n ve status re g istru.
Vstup p ro p øip o je ní p o te ncio me tru p ro øíze ní p re ko mp e nzace záp isu.
Vstup , kte rým d rive o znamuje , že hlava se nachází nad sto p o u 0.
Sig nál z d iske ty. Nulo vý p uls zname ná ind e xo vo u d íru.
Vstup je vyho d no co ván p øi o p e raci záp isu. Po kud je zd e ‚0‘, o p e race
ne b ud e p ro ve d e na a je nastave n „Write p rt“ b it ve status re g istru.
Tímto vstup e m se vyb írá d vo jitá ‚0‘ ne b o je d no d uchá ‚1‘ husto ta.
Po kud je zd e ‚1‘, p o važuje øad iè hlavu za p øilo že no u.
Komentovan˝ v˝pis MDOSu
2.2.2. Organizace ¯adiËe
Posuvn˝ registr dat ñ 8-bitov˝ registr, je pouûit jako registr, kter˝ bÏhem R/W operacÌ p¯ev·dÌ data
sÈriov· na paralelnÌ a naopak.
Registr dat ñ 8-bitov˝ registr spolupracujÌcÌ s posuvn˝m registrem. Tento registr je naplnÏn z DAL
pod ¯ÌzenÌm procesoru.
Registr stopy ñ 8-bitov˝ registr, obsahuje aktu·lnÌ ËÌslo stopy. To je zvyöov·no pokaûdÈ, kdyû je
hlava posunuta ke st¯edu diskety a sniûov·no, kdyû hlava krokuje smÏrem k okraji. Obsah registru je
porovn·v·n se zaznamenan˝m ËÌslem stopy v ID poli bÏhem R/W a verify operacÌ. Registr stopy m˘ûe
b˝t naplnÏn z DAL. Registr nem˘ûe b˝t naplnÏn pokud za¯ÌzenÌ nenÌ p¯ipraveno.
Registr sektoru ñ 8-bitov˝ registr, obsahuje adresu pozice ve stopÏ (ËÌslo sektoru). Obsah registru
je porovn·v·n se zaznamenan˝m ËÌslem sektoru v ID poli bÏhem R/W operacÌ. Registr sektoru nem˘ûe
b˝t naplnÏn, pokud za¯ÌzenÌ nenÌ p¯ipraveno.
Registr p¯Ìkazu ñ 8-bitov˝ registr, obsahuje p¯Ìkaz, kter˝ m· b˝t zanedlouho proveden. Tento registr nelze nastavit, pokud nenÌ za¯ÌzenÌ p¯ipraveno. V˝jimkou je p¯Ìkaz n·silnÈho p¯eruöenÌ. Z·pis je moûn˝
p¯es DAL, ale nenÌ moûnÈ p¯Ìkaz ËÌst.
Stavov˝ registr ñ 8-bitov˝ registr, obsahuje informace o stavu za¯ÌzenÌ. Stav registru je funkcÌ typu
pr·vÏ provedenÈho p¯Ìkazu. Registr se Ëte pomocÌ DAL, ale nelze ho zapsat.
CRC logika ñ tato logika je pouûita pro zjiötÏnÌ chyby a generov·nÌ 16-ti bitovÈho kontrolnÌho
souËtu (CRC). CRC zahrnuje vöechny informace poËÌnaje ID polem aû do CRC znaku.
D·le je zde aritmeticko logick· jednotka, Ëasov·nÌ a ¯ÌzenÌ, datov˝ separ·tor.
2.2.3. RozhranÌ procesoru
Je zjednoduöeno na 8-bitovou sbÏrnici DAL a odpovÌdajÌcÌch ¯ÌdÌcÌch sign·l˘. DAL vodiËe jsou
pouûity pro p¯enos dat, stavu a ¯ÌdÌcÌho slova mezi procesoren a ¯adiËem. DAL je t¯Ìstavov· a je
vyhodnocena jako v˝stupnÌ p¯i CS=,0ë a RE=,0ë a jako vstupnÌ p¯i CS=,0ë a WE=Ç0ë. P¯i p¯en·öenÌ dat mezi
CPU a ¯adiËem vybÌr·me registry pomocÌ vodiˢ A0, A1 v kombinaci RE a WE.
A1
A0
ètení (RE=,0‘)
zápis (WE=,0‘)
0
0
1
1
0
1
0
1
stav
stopa
sektor
data
pøíkaz
stopa
sektor
data
Jsou dosaûitelnÈ dÈlky sektoru 128, 256, 512, 1024 byt˘. DÈlka sektoru je nastavena v ID poli v dobÏ
form·tov·nÌ.
Oznaèení délky sektoru
Poèet bytù dat v sektoru
00
128
01
25 6
02
5 12
03
1024
2.2.4. Popis p¯Ìkaz˘ ¯adiËe
WD2797 akceptuje 11 p¯Ìkaz˘. P¯Ìkaz m˘ûe b˝t nastaven do registru p¯Ìkaz˘, kdyû je bit ÑBUSYì ve
stavovÈm slovÏ Ç0ë s v˝jimkou p¯Ìkazu n·silnÈho p¯eruöenÌ. Vûdy, kdyû je p¯Ìkaz prov·dÏn, je ÑBUSYì bit
stavovÈho slova nastaven na Ç1ë. Po dokonËenÌ p¯Ìkazu je generov·no p¯eruöenÌ a bit je nulov·n.
Stavov˝ registr vûdy indikuje kompletnÌ dokonËenÌ operace nebo chybu. Pro snadnÏjöÌ rozliöenÌ jsou
p¯Ìkazy rozdÏleny do Ëty¯ typ˘ (viz tabulka na dalöÌ stranÏ).
Komentovan˝ v˝pis MDOSu
5
Typ
I
I
I
I
I
II
II
III
III
III
IV
Pøíkaz
Restore
S eek
Step
Step in
Step out
Read sector
Write sector
Read address
Read track
Write track
Force interrupt
7
0
0
0
0
0
1
1
1
1
1
1
6
0
0
0
1
1
0
0
1
1
1
1
5
0
0
1
0
1
0
1
0
1
1
0
4
0
1
T
T
T
m
m
0
0
1
1
3
h
h
h
h
h
L
L
0
0
0
i3
2
V
V
V
V
V
E
E
E
E
E
i2
1
r1
r1
r1
r1
r1
U
U
U
U
U
i1
0
r0
r0
r0
r0
r0
0
a0
0
0
0
i0
VysvÏtlivky
r0, r1
V
rychlost krokování
ovìøování èísla stopy
h
pøiložení hlavy
T
definice stopy
a0
znaèka adresy dat
U
definice strany
E
zaøazení prodlevy
L
délka sektoru
m
vícenásobný záznam
i0, i1, i2, i3
podmínky pro pøerušení
V=0
V=1
h=0
h=1
T=0
T=1
a0=0
a0=1
U=0
U=1
E=0
E=1
ID
L=0
L=1
m=0
m=1
i0=1
i1=1
i2=1
i3=1
i0–i3=0
bez ovìøení
ovìøení ètením èísla stopy
hlava nepøiložena
hlava pøiložena
není
definována registrem stopy
#FB (DAM)
#F8 (vypuštìná DAM)
strana 0
strana 1
není prodleva
je vložena prodleva 15 ms
00
01
01
11
25 6
5 12
1024
128
128
25 6
5 12
1024
jednoduchý záznam
vícenásobný záznam
pøechod do pøipravenosti
pøechod do nepøipravenosti
index puls
pøímé pøerušení
zastaví bez pøerušení
2.2.4.1. P¯Ìkazy typu I
RESTORE ñ P¯Ìkaz, kter˝ nastavÌ hlavu na stopu 0. Je vykon·v·n po tu dobu, kdy je TR00=,0ë.
Jestliûe je TR00=,1ë, je hlava nad stopou 0, do registru stopy je zaps·na 0 a je generov·no p¯eruöenÌ.
Pokud TR00=,0ë i po 255 krokovacÌch pulsech, WD2797 zastavÌ Ëinnost a konec je hl·öen bitem ÑSeek
errorì ve stavovÈm slovÏ. Pokud V=,1ë, je provedeno ovϯenÌ stopy ËtenÌm. Bit Ñhì ¯ÌdÌcÌho slova
umoûÚuje p¯it·hnout hlavu hned na zaË·tku p¯Ìkazu.
SEEK ñ P¯Ìkaz porovn· obsah registru stopy a registru dat obsahujÌcÌ ËÌslo poûadovanÈ stopy.
WD2797 definuje registr stopy a vyd·v· krokovacÌ pulsy v pot¯ebnÈm smÏru, dokud obsah registru
stopy nenÌ roven obsahu datovÈho registru. V p¯ÌpadÏ V=,1ë je provedeno ovϯenÌ stopy. Pokud h=,1ë, je
hned na zaË·tku p¯Ìkazu provedeno p¯iloûenÌ hlavy. Po ˙plnÈm dokonËenÌ p¯Ìkazu je generov·no
p¯eruöenÌ. P¯i ¯ÌzenÌ vÌce driv˘ jednÌm ¯adiËem musÌ b˝t ËÌslo stopy vûdy definov·no p¯ed v˝konem
p¯Ìkazu SEEK, protoûe ¯adiË pouûÌv· jeden registr dat pro vöechny mechaniky (nem· pro kaûdou
mechaniku jeden registr ñ je d˘leûitÈ si to uvÏdomit).
6
Komentovan˝ v˝pis MDOSu
STEP ñ Prov·dÌ posun hlavy o jeden krok. P¯i prov·dÏnÌ tohoto p¯Ìkazu vyd· WD2797 krokovacÌ
puls do drivu. SmÏr krokov·nÌ je stejn˝ jako v p¯edchozÌm p¯Ìkazu krokov·nÌ. Pokud V=,1ë, potom po
dobÏ definovanÈ polem r1, r0 je provedeno ovϯenÌ. Pokud T=,1ë, je registr stopy definov·n. Bit Ñhì
umoûÚuje p¯iloûenÌ hlavy na zaË·tku p¯Ìkazu. Po kompletnÌm ukonËenÌ p¯Ìkazu je generov·no p¯eruöenÌ.
STEP IN ñ Prov·dÌ posun hlavy o jeden krok smÏrem od stopy 0. P¯i prov·dÏnÌ tohoto p¯Ìkazu poöle
WD2797 krokovacÌ puls a p¯edtÌm nastavÌ smÏr krokov·nÌ od stopy 0. Pokud T=,1ë, je registr stopy
zv˝öen o 1. Po dobÏ, definovanÈ r0, r1, je p¯i V=,1ë provedeno ovϯenÌ stopy. Bit Ñhì umoûÚuje p¯iloûenÌ
hlavy na zaË·tku p¯Ìkazu. Po kompletnÌm ukonËenÌ p¯Ìkazu je generov·no p¯eruöenÌ.
STEP OUT ñ Prov·dÌ posun hlavy o jeden krok smÏrem k stopÏ 0. P¯i prov·dÏnÌ tohoto p¯Ìkazu
poöle WD2797 krokovacÌ puls a p¯edtÌm nastavÌ smÏr krokov·nÌ k stopÏ 0. Pokud T=,1ë, je registr stopy
snÌûen o 1. Po dobÏ, definovanÈ r0, r1, je p¯i V=,1ë provedeno ovϯenÌ stopy. Bit Ñhì umoûÚuje p¯iloûenÌ
hlavy na zaË·tku p¯Ìkazu. Po kompletnÌm ukonËenÌ p¯Ìkazu je generov·no p¯eruöenÌ.
2.2.4.2. P¯Ìkazy typu II
Sem pat¯Ì p¯Ìkazy READ SECTOR a WRITE SECTOR. PrvnÌ, co ¯adiË udÏl· po p¯evzetÌ tÏchto
p¯Ìkaz˘ je, ûe naplnÌ sektor registr ËÌslem poûadovanÈho sektoru. Dokud je p¯Ìkaz typu II prov·dÏn, je
nastaven ÑBUSYì bit ve status registru. S ID polem na disku se porovn·v· registr stopy. Pokud srovn·nÌ
nevyölo, je provedeno naËtenÌ dalöÌho ID pole a znovu porovn·no. Pokud je nynÌ vpo¯·dku, je porovn·n
regist sektoru s ID, a pokud nevyölo, je Ëteno dalöÌ ID a provedeno novÈ porovn·nÌ. Pokud ID pole i CRC
je odpovÌdajÌcÌ, n·sleduje datovÈ pole pro z·pis nebo ËtenÌ podle druhu p¯Ìkazu. ÿadiË musÌ najÌt ID
pole bÏhem 5 ot·Ëek diskety. V opaËnÈm p¯ÌpadÏ je nastaven bit ÑRNFì, p¯Ìkaz je zastaven a je
generov·no p¯eruöenÌ.
READ SECTOR ñ P¯i prov·dÏnÌ p¯Ìkazu je p¯iloûena hlava, nastaven ÑBUSYì bit stavovÈho slova
a po nalezenÌ odpovÌdajÌcÌho ID pole jsou data z disku p¯ed·v·na procesoru. ZnaËka adresy dat
datovÈho pole musÌ b˝t nalezena uvnit¯ 30 byt˘ pro SD nebo 43 byt˘ pro DD v poslednÌm ID poli. Pokud
se tak nestane, je vyhled·v·nÌ opakov·no. Kdyû je prvnÌ byte z datovÈho pole nahr·n do posuvnÈho
registru, je p¯enesen do datovÈho registru a je aktivov·no DRQ. Kdyû je dalöÌ byte naËten do posuvnÈho
registru, je p¯enesen do datovÈho registru a je znovu aktivov·no DRQ. Pokud procesor nep¯eËetl do tÈ
doby obsah datovÈho registru, jsou data ztracena a je nastaven bit ÑLost dataì. Tento postup je
opakov·n aû do kompletnÌho p¯eËtenÌ datovÈho pole. Jestliûe je na konci nalezen chybn˝ CRC souËet,
je nastaven bit CRC error ve stavovÈm registru a p¯Ìkaz je zastaven. Na konci ËtenÌ je ve stavovÈm
registru v 5. bitu zaznamen·n typ znaËky dat: Ç1ë = vypuötÏna datov· znaËka, Ç0ë = datov· znaËka.
WRITE SECTOR ñ P¯i vykon·v·nÌ p¯Ìkazu je p¯iloûena hlava a nastaven ÑBUSYì bit ve stavovÈm slovÏ.
Kdyû je nalezeno odpovÌdajÌcÌ ID pole, je generov·n sign·l DRQ. ÿadiË odpoËÌt· 11 (SD) nebo 22 (DD) byt˘
a aktivuje vstup WG, pokud bylo DRQ obslouûeno (procesorem byla dod·na data). Pokud se tak nestalo,
je nastaven ÑLost dataì bit (data ztracena) a je generov·no p¯eruöenÌ. Jestli bylo DRQ obslouûeno, je WG
aktivov·n a 6 nulov˝ch byt˘ (SD) nebo 12 byt˘ (DD) je zaps·no na disk. V tÈ dobÏ je zaps·na znaËka adresy
dat tak, jak je urËeno a0 bitem p¯Ìkazu. Pro a0=,1ë je vypuötÏna znaËka dat, a0=,0ë je znaËka dat. WD2797
potom zapÌöe datovÈ pole a geneguje DRQ pro procesor. Pokud nejsou v pot¯ebnÈ dobÏ dod·na nov·
data, je nastaven bit ÑLost dataì a na disk jsou zaps·ny nuly. P¯Ìkaz nenÌ zastaven. Po zaps·nÌ poslednÌch
dat na disk jsou ¯adiËem zaps·ny dva byty CRC n·sledovanÈ bytem #FE. WG v˝stup je pasivov·n.
2.2.4.3. P¯Ìkazy typu III
READ ADDRESS ñ P¯i vykon·v·nÌ p¯Ìkazu je p¯iloûena hlava a nastaven ÑBUSYì bit. Z disku je
naËteno n·sledujÌcÌ ID pole a 6 datov˝ch byt˘ ID pole je p¯eneseno do datovÈho registru a je generov·no DRQ pro kaûd˝ tento byte. Po¯adÌ je na n·sledujÌcÌ: ËÌslo stopy, ËÌslo sektoru, ËÌslo strany, dÈlka
sektoru, CRC LSB, CRC MSB.
Vöechny CRC znaky jsou p¯eneseny do poËÌtaËe, WD2797 je kontroluje a p¯i nesouhlasu je nastaven
ÑCRC errorì bit. »Ìslo stopy je p¯eneseno do registru. Na konci Ëinnosti je generov·no p¯eruöenÌ a je
nulov·n ÑBUSYì bit.
Komentovan˝ v˝pis MDOSu
7
READ TRACK ñ P¯i v˝konu tohoto p¯Ìkazu je p¯iloûena hlava a nastaven ÑBUSYì bit. »tenÌ zaËÌn·
˙vodnÌm synchronizaËnÌm pulsem za prvnÌm index pulsem a pokraËuje aû do n·sledujÌcÌho index pulsu.
Vöechny mezery a hlaviËky jsou p¯eneseny do datovÈho registru a DRQ je generov·no pro kaûd˝ byte.
Po kompletnÌm provedenÌ p¯Ìkazu je generov·no p¯eruöenÌ. Tento p¯Ìkaz nelze pouûÌt pro kopÌrov·nÌ
cel˝ch stop vzhledem k synchronizaËnÌm problÈm˘m.
WRITE TRACK ñ P¯Ìkaz k form·tov·nÌ stopy. P¯i prov·dÏnÌ p¯Ìkazu je p¯iloûena hlava a nastaven
ÑBUSYì bit. Z·pis zaËÌn· zavedenÌm synchronizace po prvnÌm index pulsu a pokraËuje aû do n·sledujÌcÌho index pulsu, kdy je generov·no p¯eruöenÌ. DRQ je aktivov·n ihned po zad·nÌ p¯Ìkazu, ale z·pis
nezaËnÈ d¯ive, neû je dod·n prvnÌ byte do datovÈho registru. Pokud datov˝ registr nenÌ naplnÏn (v dobÏ
t¯Ì byt˘), je Ëinnost zastavena, ¯adiË se ohl·sÌ ÑNot busyì, je nastaven ÑLost dataì bit a generov·no
p¯eruöenÌ. Jestliûe nenÌ v pot¯ebnÈ dobÏ registr naplnÏn, jsou dosazeny nuly.
2.2.4.4. P¯Ìkaz typu IV
FORCE INTERRUPT ñ P¯Ìkaz n·silnÈho p¯eruöenÌ je zejmÈna pouûit pro zastavenÌ vÌcen·sobnÈho
ËtenÌ/z·pisu sektoru nebo pro zabezpeËenÌ typu I stavu ve stavovÈm registru. Tento p¯Ìkaz m˘ûe b˝t
nahran do registru p¯Ìkaz˘ kdykoliv. Jestli je nÏjak˝ p¯Ìkaz vykon·v·n (ÑBUSYì bit je ,1ë), bude tento
p¯Ìkaz zastaven a ÑBUSYì bude nulov·n. NiûöÌ 4 bity p¯Ìkazu urËujÌ podmÌnky p¯eruöenÌ.
2.2.5. Stavov˝ registr
P¯i vykon·v·nÌ jakÈhokoliv p¯Ìkazu, mimo n·silnÈho p¯eruöenÌ, je ÑBUSYì bit nastaven na Ç1ë a stavovÈ
bity jsou definov·ny pro nov˝ p¯Ìkaz. Jestliûe je p¯ijato n·silnÈ p¯eruöenÌ, je ÑBUSYì nulov·n a stavovÈ
bity nejsou zmÏnÏny. Pokud je p¯Ìkaz p¯eruöenÌ p¯ijat, kdyû nenÌ û·dn˝ p¯Ìkaz vykon·v·n, je ÑBUSYì
nulov·n a stavovÈ bity jsou definov·ny. V tom p¯ÌpadÏ stav odpovÌd· vykon·nÌ p¯Ìkazu typu I. Uûivatel
m· moûnost ËÌst stavov˝ registr pomocÌ programovÈho ¯ÌzenÌ nebo pouûitÌ DRQ s DMA nebo p¯eruöovacÌ metodou. Kdyû je Ëten datov˝ registr, je DRQ ve stavovÈm slovÏ i DRQ v˝stup automaticky
nulov·n. Z·pis do datovÈho registru p˘sobÌ stejnÏ. ÑBusyì bit stavovÈho slova m˘ûe b˝t sledov·n
uûvatelsk˝m programem pro urËenÌ, zda je p¯Ìkaz kompletnÌ, v p¯ÌpadÏ, ûe nepouûijeme INTRQ. P¯i
pouûitÌ INTRQ nenÌ doporuËeno zjiöùovat stav ÑBUSYì bitu, protoûe testov·nÌ ÑBUSYì by znamenalo
nulov·nÌ INTRQ v˝stupu. Pro spr·vnÈ programovÈ ¯ÌzenÌ je t¯eba zn·t ËasovÈ prodlevy, proto si teÔ
uvedeme tabulku pro 2 MHz.
èinnost
následující èinnost
prodleva FM
prodleva MFM
zápis pøíkazu
ètení BUSY bitu 0
12 µs
6 µs
zápis pøíkazu
ètení stavu 1–7
28 µs
14 µs
zápis do registru
ètení z jiného registru
0 µs
0 µs
NynÌ si uvedeme tabulku stavovÈho registru
Bi t
7
6
5
4
3
2
1
0
8
Typ I
Not ready
Write protect
Head load
Seek error
CRC error
Track 0
INDEX
BUSY
Read
address
Not ready
0
0
RNF
CRC error
Lost data
DRQ
BUSY
Read sector
Read track
Write sector
Not ready
0
Rec type
RNF
CRC error
Lost data
DRQ
BUSY
Not ready
0
0
0
0
Lost data
DRQ
BUSY
Not ready
Not ready
Write protect Write protect
0
0
RNF
0
CRC error
0
Lost data
Lost data
DRQ
DRQ
BUSY
BUSY
Komentovan˝ v˝pis MDOSu
Write track
VysvÏtlivky
Not ready
Tento bit indikuje, že drive není pøipraven. Pokud je ‚0‘, je drive pøipraven. Jeho stav je
urèen negací READY vstupu a logickým souètem s MR.
Write protect Pokud je bit nastaven, je disketa chránìná proti zápisu. Stav je urèen negací vstupu WRPT.
Head load Pokud je nastaven, je hlava pøiložena k médiu. Bit je dán logickým souèinem stavù HLT a HLD.
Seek error Pokud je nastaven, nebylo úspìšné požadované ovìøení nastavení stopy.
CRC error CRC naètené v ID poli není v poøádku.
TRACK 0
Bit indikuje, že se hlava nachází nad stopu 0.
INDEX
Bit informuje, že byla z drivu naètena indexová znaèka. Bit je urèen negací vstupu ID.
BUSY
Nastaven, pokud øadiè právì vykonává pøikaz.
Rec type
Pøi ètení záznamu vrací znaèku dat: ‚0‘ = datová znaèka, ,1‘ = bez datové znaèky.
RNF
Nastavený bit hlásí, že sektor nebyl nalezen.
Lost data
Pøi nastavení informuje, že nebyla dodržena spolupráce øadièe a procesoru (DRQ a DAL)
a byla ztracena data.
DRQ
Bit kopíruje stav DRQ výstupu. Nastavení znamená, že datový registr je volný pro zápis
nebo pøipraven pro ètení.
2.3. WD2797 v D40
ÿadiË pracuje v reûimu dvojitÈ hustoty (MFM) a dvoustrannÈ diskety. Sign·l ÑREADYì nenÌ zapojen,
MDOS si p¯ipravenost diskety zjiöùuje programovÏ. Pokud se podÌv·te do schÈmatu zapojenÌ disketovÈ jednotky a d·te si tu pr·ci, ûe si zjistÌte ovl·dacÌ porty, dojdete k n·sledujÌcÌm v˝sledk˘m:
V˝bÏr mechanik je na portu #89 (137).
DS0 ñ 0. bit
DS1 ñ 1. bit
MO0 ñ 2. bit
MO1 ñ 3. bit
NMI ñ 6. bit
(DS=drive select; MO=motor on)
Ke ËtenÌ status registru a zad·nÌ p¯Ìkazu ¯adiËi je port #81 (129).
Zasl·nÌ ËÌsla stopy je na portu #83 (131).
Zasl·nÌ ËÌsla sektoru je na portu #85 (133).
JistÏ V·s zarazilo, ûe na 6. bitu v˝bÏru mechanik je NMI. Nespletl jsem se. Tento bit je velice d˘leûit˝
p¯i vykon·v·nÌ ËtenÌ a z·pisu na disketu v MDOSu. Tyto operace totiû fungujÌ v MDOSu p¯es NMI! Pro
kaûd˝ byte, kter˝ je naËten nebo zaps·n, je vyvol·no NMI. Funguje to n·sledovnÏ: p¯i poûadavku ËtenÌ
nebo z·pisu se p¯i vybÌr·nÌ a rozt·ËenÌ mechaniky nastavÌ 6. bit. NynÌ se poöle ¯adiËi p¯Ìkaz pro ËtenÌ nebo
z·pis na disketu. Jak bylo v˝öe uvedeno v popisu tÏchto operacÌ, jestliûe sign·l DRQ je ve stavu 1, je ¯adiË
p¯ipraven p¯ijmout byte pro zaps·nÌ na disketu nebo m· v datovÈm registru naËten dalöÌ byte z diskety.
Jakmile je DRQ roven 1 a byl nastaven 6. bit p¯i v˝bÏru mechaniky, je vyvol·no NMI, kterÈ sk·Ëe na adresu
#0066. Zde je v MDOSu skok na adresu v registru IX, kde se buÔ provede z·pis bytu do datovÈho registru
¯adiËe nebo naËtenÌ byte z datovÈho registru ¯adiËe. Po provedenÌ operace se ¯ÌzenÌ vr·tÌ zpÏt do mÌsta,
kde doölo k vyvol·nÌ p¯eruöenÌ. Toto se opakuje 512 kr·t. Po provedenÌ operace se 6. bit zase vynuluje ñ
je to d˘leûitÈ, protoûe nap¯. p¯i operaci SEEK, RESTORE a dalöÌch typu I je taky nastaven DRQ a NMI by
n·m stejnÏ bylo k niËemu (spÌöe by nadÏlalo vÌce problÈm˘ neû uûitku).
Zd· se to b˝t sice trochu komplikovanÈ, ale zato geni·lnÌ ¯eöenÌ a asi ten nejrychlejöÌ a nejspolehlivÏjöÌ zp˘sob prov·dÏnÌ R/W operacÌ (tento zp˘sob trv· nejmÈnÏ takt˘).
2.4. PamÏt EPROM a SRAM
PamÏù EPROM obsahuje operaËnÌ systÈm MDOS, kter˝ n·m rozöi¯uje standartnÌ BASIC o novou
t¯Ìdu p¯Ìkaz˘, kterÈ pracujÌ s disketovou jednotkou. ZaËÌn· na adrese #0000 a konËÌ na #37FF. Jak v˘bec
doch·zÌ k tomu, ûe lze pouûÌvat tuto pamÏù?
Komentovan˝ v˝pis MDOSu
9
ÿÌdÌcÌ jednotka obsahuje obvod, kter˝ je ovl·dan˝ dekodÈrem instrukcÌ a kter˝ pracuje takto: p¯i
ËtenÌ instrukce z adres #0000 nebo #0008 se p¯epne na v˝bÏr vnÏjöÌ pamÏti ñ EPROM a p¯i ËtenÌ
instrukce z adresy #1700 se p¯epne na v˝bÏr vnit¯nÌ pamÏti ñ ZX ROM. Adresy #0000 a #0008 jsou
vstupnÌ br·ny do EPROM ze ZX ROM a adresa #1700 je vstupnÌ br·na do ZX ROM z EPROM. NemusÌ se
tedy prov·dÏt û·dn˝ OUT, ale p¯epÌn·nÌ je zajiötÏno hardwarem. Jak se zpracov·vajÌ p¯Ìkazy MDOSu?
Pokud jste alespoÚ trochu sezn·meni se ZX ROM a syntaktickou anal˝zou BASIC p¯Ìkaz˘ v nÌ, tak to pro
V·s nebude nic sloûitÈho. P¯i anal˝ze p¯ikazu MDOSu ZX ROM dojde k tomu, ûe takovou syntaxi p¯Ìkazu
nezn· a sk·Ëe na adresu #0008 pro v˝pis chyby. Jenomûe tato adresa slouûÌ jako vstupnÌ br·na do
EPROM, kde je umÌstÏn MDOS. Takûe p¯i skoku na adresu #0008 dojde k p¯estr·nkov·nÌ a mÌsto ZX
ROM je MDOS v ROM D40. A ten zaËne zpracov·vat p¯Ìkaz od mÌsta, kde analyz·tor BASICu v ZX ROM
p¯estal. Pokud dan˝ p¯Ìkaz zn·, zpracuje ho a vykon· nebo vypÌöe chybu a vr·tÌ ¯ÌzenÌ ZX ROM.
Spolu s EPROM je v ¯ÌdÌcÌ jednotce pamÏù SRAM, kter· je od adresy #3800 do adresy #3FFF. P¯epÌn·
se spoleËnÏ s pamÏtÌ EPROM. MDOS si do nÌ ukl·d· pot¯ebnÈ informace, aby nezabÌraly zbyteËnÏ
mÌsto v pamÏti poËÌtaËe.
2.5. TlaËÌtko SNAP
Celkem zajÌmavÈ za¯ÌzenÌ, kterÈ slouûÌ k z·znamu celÈho obsahu pamÏti vËetnÏ regist˘ a p¯eruöenÌ na
disk do souboru. Abych to ¯ekl spr·vnÏ, tak tlaËÌtko vyvol· nemaskovanÈ p¯eruöenÌ NMI, kdy je vygenerov·n skok na adresu #0066. Tady je v ZX ROM uloûena rutina, kter· obsluhuje nemaskovanÈ p¯eruöenÌ
NMI. Jak jistÏ vÌte, tak tato rutina v ZX Spectru obsahuje chybu, ale v Didaktiku Gama uû je opravena. Ale
i tak by n·m to bylo na nic ñ maxim·lnÏ pro skok do BASICu. Jenomûe n·m se uloûÌ obsah pamÏti na
disketu. Jak? K tomu pr·vÏ slouûÌ druh· Ë·st obvodu, kter˝ n·m str·nkuje EPROM. P¯i stisknutÌ tlaËÌtka se
sice provede skok na adresu #0066, ale dan˝ obvod vnutÌ na tuto adresu instrukci RST 0 (skok na adresu
#0000) mÌsto skuteËnÈ instrukce, kter· je na tÈto adrese uloûena (a tam je PUSH AF). Takûe po skoku na
adresu #0066 se mÌsto instrukce PUSH AF provede RST 0 a tak se skoËÌ na adresu #0000, kter· slouûÌ jako
vstupnÌ br·na do EPROM. Je to podobnÈ jako u RST 8. A tady uû si MDOS zjistÌ, ûe doölo k stisknutÌ
tlaËÌtka SNAP (podle n·vratovÈ adresy na vrcholu z·sobnÌku, kde je #0067) a provede uloûenÌ obsahu
pamÏti na disketu. Potom se ¯ÌzenÌ vr·tÌ zpÏt na to mÌsto, kde doölo k p¯eruöenÌ tlaËÌtkem SNAP a program
pokraËuje d·le. Takto to ale funguje jen tehdy, pokud je od adresy #0000 ZX ROM. Pokud je od #0000 ROM
D40, funguje NMI norm·lnÏ. NÏkdy se vöak m˘ûe st·t, ûe se program po n·vratu ze snapu zablokuje.
D˘vod je ten, ûe v okamûiku, kdy doölo k stisknutÌ tlaËÌtka SNAP, program pr·vÏ prov·dÏl nÏjakou
specifickou operaci se z·sobnÌkem (nap¯Ìklad nÏjakou modifikaci programu pomocÌ z·sobnÌku). Protoûe
p¯i vyvol·nÌ NMI se na z·sobnÌk ukl·d· n·vratov· adresa a dalöÌ registry, mohlo dojÌt k p¯eps·nÌ dat, kter·
jsou pro program d˘leûit·, a tak se po n·vratu z NMI mohl zhroutit. Takûe i data, kter· jsme si pomocÌ NMI
uloûili na disketu jsou taky neplatn· (kdyû si totiû nahrajete snap zpÏt do pamÏti, dostanete se do ˙plnÏ
stejnÈ situace). Proto se doporuËuje pouûÌvat tlaËÌtko SNAP v tÈ dobÏ, kdy program Ëek· nap¯. na stisk
kl·vesy. TlaËÌtko SNAP lze v jednom programu pouûÌvat vÌcekr·t. PamÏù se ukl·d· do soubor˘ se jmÈnem
SNAPSHOTXX.S, kde XX je po¯adovÈ ËÌslo snapu od resetu poËÌtaËe. Pokud jiû takov˝ snap soubor na
disketÏ existuje, je p¯eps·n bez dotazu na p¯eps·nÌ.
2.6. Obvod 8255
Jak uû jsem uvedl, tak slouûÌ k p¯ipojenÌ ostatnÌch perifÈriÌ. Tento obvod tvo¯Ì z·klad mnoha
interfac˘ (UR 4, M/P atd). Aby nedoölo ke kolizi s jin˝m obvodem 8255 (nap¯. u Didaktik GAMA, kde je
obvod 8255 zabudov·n uvnit¯), je moûnÈ tento obvod v D40 zablokovat. P¯Ìkaz na odblokov·nÌ je OUT
153, 16 a na zablokov·nÌ je OUT 153, 0. Konektor INTERFACE je shodn˝ s konektorem interface M/P.
Porty obvodu jsou umÌstÏny na tÏchto adres·ch:
ñ adresa 31
(#1F) ñ port A
ñ adresa 63
(#3F) ñ port B
ñ adresa 95
(#5F) ñ port C
ñ adresa 127 (#7F) ñ ¯ÌdÌcÌ slovo
10
Komentovan˝ v˝pis MDOSu
Mimo samotnÈho zablokov·nÌ a odblokov·nÌ obvodu 8255 lze jeötÏ povolit a zak·zat odblokov·nÌ
obvodu. P¯Ìkaz OUT 145, 0 zak·ûe odblokov·nÌ obvodu 8255 a OUT 145, 32 povolÌ odblokov·nÌ
obvodu. BliûöÌ popis tohoto obvodu m˘ûete najÌt v AmatÈrskÈm r·diu nebo ZX MagazÌnu.
2.7. Mechaniky
Vcelku se d· ¯Ìci, ûe nem˘ûete p¯ipojit libovolnou mechaniku. Sami v˝robci totiû museli peËlivÏ
vybÌrat z velkÈho poËtu mechanik. ProblÈm se V·m neprojevÌ, pokud budete p¯ipojovat pouze jednu
mechaniku. Jestli vöak budete p¯ipojovat dvÏ mechaniky (a z nich bude alespoÚ jedna 5 1/4" DD
mechanika), m˘ûete (ale nemusÌte) se dostat do problÈm˘. Kdyû zapojÌte dvÏ mechaniky, m˘ûou
pracovat okamûitÏ a bez problÈm˘ nebo nebudou pracovat v˘bec ñ p¯i resetu se rozbÏhnou, ale
nep¯ihl·sÌ se (p¯ijdete o to n·dhernÈ hrk·nÌ s hlavou). Jedn· se pr·vÏ o 5 1/4" DD mechaniky (360 KB).
Jak by se dal tento problÈm vy¯eöit? Jako prvnÌ V·m doporuËÌm vyhledat odborn˝ servis, to pokud jste
slaböÌ povahy. Jestli jste vöak trochu odv·ûnÏjöÌ, m˘ûete se pokusit o vlastnÌ opravu. Kdyû se podÌv·te
na mechaniku (jeötÏ jednou p¯ipomÌn·m, ûe se jedn· pouze o 5 1/4"Ç mechaniky, u 3,5" mechanik to nenÌ),
najdete na mÌstÏ, kde se p¯ipojuje kabel mal˝ obvod s 8-mi v˝vody. Je to ÑhybridnÌì rezistor a jestli uû
ho neodstranil v˝robce, musÌte ho odstranit vy (pokud se v·m ho nechce odp·jet, ulomte ho neust·l˝m
vikl·nÌm. Jestli m·te 5 1/4" DD mechaniku p¯Ìmo od v˝robce, tak se podÌvejte, jestli ho tam m·te (j· ho
u origin·lnÌ mechaniky nemÏl). Pokud ani po tÈto drastickÈ operaci nebudou mechaniky spolupracovat,
musÌte vyhledat servisnÌ st¯edisko ñ j· jsem to zkouöel a fungovalo to (myslÌm to odstranÏnÌ obvodu).
Jak jsem jiû p¯edtÌm uvedl, dajÌ se p¯ipojit pouze dvÏ mechaniky, coû je d·no obvodem pro v˝bÏr
mechanik (celkem lze k WD2797 p¯ipojit 4 mechaniky, k D40 by se daly p¯ipojit 3 mechaniky, protoûe
mÌsto pro 3. mechaniku na portu 137 je ñ 4. a 5. bit). Z·znam na mechaniky se prov·dÌ v reûimu MFM,
mechaniky pracujÌ s form·tem DD (double density). M˘ûete tedy p¯ipojit DD nebo HD mechaniku 5 1/4"Ç
nebo 3,5" mechaniku. Pokud p¯ipojÌte HD mechaniku, bude pracovat v reûmu DD (takûe û·dn˝ch 1,44
MB, ale jen 720 KB). StandardnÏ se dod·v· pouze jedna mechanika. Druhou si lze p¯ipojit p¯es konektor
EXTENDED. P¯i p¯ipojov·nÌ druhÈ mechaniky musÌ b˝t jejÌ piny zapojeny ˙plnÏ stejnÏ jako u prvnÌ
mechaniky (nap¯. pokud je pin Ë. 5 prvnÌ mechaniky p¯ipojen na nÏjak˝ v˝vod ¯ÌdÌcÌ jednotky, je zde
p¯ipojen i pin Ë. 5 druhÈ mechaniky). Jedin· v˝jimka je u pin˘ DS0, DS1, MO0, MO1. Piny MO0 a MO1
u druhÈ mechaniky musÌte vûdy zamÏnit (tam, kde je u prvnÌ mechaniky zapojen pin MO0, je u druhÈ
mechaniky zapojen pin MO1). Tyto sign·ly slouûÌ k roztoËenÌ motoru mechaniky. Pokud byste je
nezamÏnili, rozebÏhly by se V·m obÏ mechaniky najednou nebo by se nerozebÏhla ani jedna. U pin˘ DS0
a DS1 m·me dvÏ moûnosti. BuÔ je p¯ipojÌme stejnÏ jako u prvnÌ mechaniky a potom, kdyû budeme
nastavovat po¯adÌ mechanik, tak prvnÌ nastavÌme jako A a druhou jako B, nebo piny DS0 a DS1 u druhÈ
mechaniky zamÏnÌme a obÏ mechaniky nastavÌme jako A. Sign·l DSx n·m totiû vybÌr· mechaniku, se
kterou se bude pracovat. Vöechny ostatnÌ piny u druhÈ mechaniky majÌ stejn˝ v˝znam jako u prvnÌ, takûe
musÌ b˝t zapojeny stejnÏ.
Toto byl tedy z·kladnÌ popis technickÈ str·nky disketovÈ jednotky D40. Samoz¯ejmÏ
nebyl ˙plnÏ vyËerp·vajÌcÌ, ale to nenÌ ˙kolem tÈto knihy. NynÌ se budeme spÌöe vÏnovat
popisu operaËnÌho systÈmu MDOS a prost¯edk˘, kterÈ pouûÌv·.
3. Disketa
Disketa je magnetick˝ kotouË, kter˝ je buÔ jednostrann˝ nebo dvoustrann˝, je rozdÏlen na soust¯ednÈ kruûnice, kter˝m se ¯Ìk· stopy. Kaûd· stopa je rozdÏlena na bloky ñ sektory. Form·t MDOSu je
40 (80) stop na jednu stranu, 9 sektor˘ na stopu, 512 byt˘ na sektor. NenÌ to vöak d·no, protoûe si m˘ûete
naform·tovat disketu, jak chcete (42 stop, 8 sektor˘ nebo jinak). Pouze poËet byt˘ na sektor je d·n
pevnÏ ñ ani to vöak b˝t nemusÌ (nap¯. 256 byt˘), ale MDOS takovou disketu neumÌ p¯eËÌst (WD2797 vöak
ano, a kdyû si napÌöete vlastnÌ rutinu na ËtenÌ, m˘ûete p¯eËÌst libovoln˝ form·t diskety). Stopy jsou
ËÌslov·ny od 0, sektory od 1. NynÌ si uk·ûeme, jak to na disketÏ m˘ûe vypadat:
obr·zek naleznete na dalöÌ stranÏ
Komentovan˝ v˝pis MDOSu
11
Na obr·zku 1. je uk·z·no fyzickÈ ËÌslov·nÌ sektor˘ na stopÏ p¯i form·tu 9 sektor˘ na stopu ñ form·t
MDOSu. Na obr·zku Ë. 2 je uk·z·no, jak ËÌsluje sektory MDOS. NeËÌsluje je od 1, ale od 0. Na obr·zku Ë. 3
je uk·z·no fyzickÈ ËÌslov·nÌ sektor˘ p¯i form·tu 10 sektor˘ na stopu. D·le budeme rozliöovat dva druhy
ËÌslov·nÌ sektor˘: fyzickÈ a logickÈ. FyzickÈ je d·no ËÌslem stopy (0ñ79/159) a sektoru ve stopÏ (1ñ9),
logickÈ je d·no pouze ËÌslem sektoru (0ñ719/1439). Na obr·zku Ë. 4 a Ë. 5 je uk·z·n form·t 9 sektor˘ na
stopu. JistÏ jste si vöak vöimli, ûe po¯adÌ sektor˘ je promÌch·no. Tomu se ¯Ìk· INTERLEAVE (sektor
prokl·d·nÌ). Je to poËet ot·Ëek, na kolik se p¯eËte najednou cel· stopa. Klasick˝ MDOS pouûÌv· 1 : 1 (na
jednu ot·Ëku se p¯eËte jedna stopa). Na obr·zku Ë. 4 je 1 : 4 a na obr·zku Ë. 5 je 1 : 2. ÿeknete si, proË
pouûÌvat 1 : 4, kdyû m˘ûu pouûÌvat 1 : 1 a stopa se mi naËte rychleji? Ono to nenÌ zase tak jednoduchÈ.
P¯edstavte si, ûe m·me sektor prokl·d·nÌ 1 : 1 a ûe budete ËÌst sektor po sektoru z jednÈ stopy. Kdyû
naËtete jeden sektor, tak se hlava nach·zÌ nad zaË·tkem dalöÌho sektoru. NynÌ v·m vznikne kr·tka pauza
(nap¯. nÏjak˝ v˝poËet) a potom budete chtÌt ËÌst dalöÌ sektor, kter˝ se nach·zÌ hned za p¯edchozÌm, kter˝
jsme naËetli p¯edtÌm. Jenomûe neû se provedl dan˝ v˝poËet, ujela n·m hlava, takûe se nynÌ nenach·zÌ
nad zaË·tkem tohoto sektoru, ale t¯eba nÏkde uprost¯ed sektoru. Takûe nynÌ musÌme Ëekat celou jednu
ot·Ëku, neû se hlava dostane zpÏt na zaË·tek poûadovanÈho sektoru, a aû nynÌ ho m˘ûeme naËÌst.
Kdyby jste t¯eba pouûÌvali sektor prokl·d·nÌ 1 : 2, tak nemusÌte Ëekat celou jednu ot·Ëku, ale pouze
Ëek·te, aû hlava dojede na konec sektoru a vesele teÔ Ëtete poûadovan˝ sektor. TeÔ si ale zase ¯eknete,
proË pouûÌv· MDOS sektor prokl·d·nÌ 1 : 1, kdyû to vlastnÏ m˘ûe zdrûovat pr·ci? Auto¯i na to mysleli
a zkr·tili pauzu mezi ËtenÌm sektor˘ na minimum, takûe se to vöechno stihne. Pokud by jste t¯eba chtÏli
pouûÌvat systÈm CP/M, tak by bylo vhodnÈ pouûÌt sektor prokl·d·nÌ 1 : 2, protoûe tam v˝poËet mezi
ËtenÌm jednotliv˝ch sektor˘ trv· celkem dost dlouho (DATAPUTER m· 1 : 2). Tento sektor prokl·d·nÌ
nem· vliv na programovou podporu (ûe by se to muselo nÏjak hlÌdat). Je to jenom fyzick· z·leûitost
uspo¯·d·nÌ sektor˘ na disketÏ. Vytv·¯Ì se p¯i form·tov·nÌ diskety. Na obr·zku Ë. 6 je uk·z·no ËÌslov·nÌ
stop p¯i dvoustrannÈm form·tu. VidÌte, ûe na jednÈ stranÏ jsou sudÈ stopy a na stranÈ druhÈ jsou lichÈ
stopy. Na obr·zku Ë. 7 je ËÌslov·nÌ stop p¯i jednostrannÈm form·tu.
Jak uû jsem uvedl v˝öe, je form·t MDOSu 40 (80) stop na jednÈ stranÏ, 9 sektor˘ na stopu, 512 byt˘
na sektor. M˘ûete si vöak form·t zmÏnit. Pokud budete zvÏtöovat poËet sektor˘, tak se jich na jednu
stopu vejde maxmim·lnÏ 10 (vÌce to uû skuteËnÏ nejde) a nejmÈnÏ 1 ñ to vöak nezkouöejte, protoûe
s takovou disketou V·m MDOS nebude urËitÏ pracovat, protoûe p¯edpokl·d·, ûe na jednÈ stopÏ je
alespoÚ 6 sektor˘ (z d˘vod˘ uloûenÌ FAT tabulky). Pokud budete mÏnit poËet stop, tak nejvÌce jich je asi
43 (83) na jednÈ stranÏ. Pokud budete chtÌt vÌce, tak uû nelze ruËit za kvalitu uloûen˝ch dat nehledÏ na to,
ûe si m˘ûete zniËit mechaniku (jako jist˝ MB&DG, kter˝ utrhl hlaviËku). Pokud chcete zmenöit poËet
stop, tak minim·lnÏ to je jedna stopa (to vöak bude taky dÏlat problÈmy MDOSu). MyslÌm, ûe nejlepöÌ
je dodrûovat klasick˝ form·t a tÌm se vyhnete vöem problÈm˘m.
4. Struktura diskety MDOSu
Disketa se dÏlÌ na Ëty¯i oblasti:
ñ BOOT
ñ FAT tabulka
ñ adres·¯
ñ datov· oblast
12
Komentovan˝ v˝pis MDOSu
4.1. BOOT
1. sektor na 0. stopÏ (podle MDOSu 0. sektor na 0. stopÏ), kde jsou uloûeny informace o disketÏ ñ
jmÈno, form·t, parametry diskety a systÈm, pod kter˝m byla naform·tov·na. ProË je na tomto mÌstÏ?
Protoûe na kaûdÈ disketÏ je tento sektor na stejnÈm fyzickÈm a logickÈm mÌstÏ. Jeho struktura je
n·sledujÌcÌ:
+128 48 byt˘
informace o vöech mechanik·ch, kterÈ byly p¯ipojeny v dobÏ form·tov·nÌ
+176 12 byt˘
informace o disketÏ a mechanice
+192 10 byt˘
jmÈno diskety
+202 2 byty
dva n·hodnÈ byty
+204 4 byty
text ÑSDOSì
Informace o vöech p¯ipojen˝ch mechanik·ch v dobÏ form·tov·nÌ nenÌ d˘leûit· (nikde se v MDOSu
nevyuûÌv·). JedinÈ vyuûitÌ vidÌm v tom, ûe pokud dojde k nÏjakÈ chybÏ v sektoru a informace o disketÏ
budou poökozen·, dalo by se to obnovit z tÏchto informacÌ. Ale v·ûnÏ pochybuji o tom, ûe to p˘jde,
protoûe m˘ûe dojÌt k poökozenÌ i tÏchto dat a potom jsou na nic. NevÌm, z jakÈho d˘vodu tam auto¯i
tyto informace vloûili. Informace o disketÏ a mechanice obsahujÌ form·t diskety a dalöÌ informace.
Strukturu tÏchto informacÌ si popÌöeme pozdÏji. D·le je jmÈno diskety, kterÈ m· deset znak˘. A za nÌm
n·sledujÌ dva n·hodnÏ vygenerovanÈ byty (no n·hodnÏ, vezmou se prostÏ z registru R), takûe pokud
budete mÌt dvÏ diskety se stejn˝m jmÈnem, tak jeötÏ p˘jdou rozliöit podle tÏchto dvou byt˘ (pravdÏpodobnost je 1 : 65535). No a poslednÌ informacÌ je znaËka, pod kter˝m systÈmem byla disketa naform·tov·na. MDOS zde m· text ÑSDOSì. Vöechny ostatnÌ byty v BOOTu jsou vyplnÏny hodnotou 0. M˘ûete
si sem uloûit nÏkterÈ svoje informace, ale musÌte d·t pozor, abyste si nÏco nep¯epsali.
4.2. FAT
Je uloûena v sektorech 2, 3, 4, 5, 6 (podle MDOSu 1, 2, 3, 4, 5) nultÈ stopy. FAT (File Alocation Table)
je tabulka umÌstÏnÌ soubor˘ na disketÏ. ZabÌr· pÏt sektor˘ a obsahuje 1705 poloûek. Tabulka je 12-ti
bitov·, takûe kaûd· poloûka zabÌr· 1,5 byte, coû je trochu neobvyklÈ. Kaûd· poloûka je p¯i¯azena
jednomu sektoru. Jak to v˘bec funguje? Soubor je umÌstÏn v sektorech na disketÏ. Sektory jdou v nÏjakÈ
¯adÏ. TÈto ¯adÏ budeme ¯Ìkat stezka. Jak projÌt tuto stezku? Nejd¯Ìve vyzvedneme ËÌslo prvnÌho sektoru
uloûenÌ souboru. Z tÈto hodnoty se vypoËte adresa odpovÌdajÌcÌ poloûky ve FAT. A na tÈto adrese je
uloûeno ËÌslo n·sledujÌcÌho sektoru souboru. Vyzvedneme ËÌslo tohoto sektoru a opakujeme cel˝
cyklus, dokud nenarazÌme na znaËku konce souboru. NynÌ si uk·ûeme, jak jsou uloûeny poloûky ve FAT.
Na obr·zku Ë. 8 vidÌte zp˘sob uloûenÌ poloûek ve FAT. Do 3 byt˘ jsou uloûeny dvÏ poloûky. Do
jednoho sektoru se tedy vejde 341 poloûek FAT a jeötÏ n·m z˘stane p˘l bytu. Tento je vyplnÏn hodnotou
13. Tomuto p˘lbytu se ¯Ìk· zalomenÌ FATky (kdyû to tak pojmenoval GEORGE K., tak to ponechme).
Druh· polovina je norm·lnÏ vyuûita. ZalomenÌ FATky se nach·zÌ na lich˝ch adres·ch. TakÈ si vöimnÏte,
ûe sudÈ poloûky zaËÌnajÌ na sud˝ch adres·ch a lichÈ na lich˝ch adres·ch. Jak se ukl·d· hodnota do
poloûky FAT tabulky? ÿeknÏme, ûe chceme uloûit do 1. poloûky nÏjakou hodnotu. Hodnotu vydÏlÌme
256, v˝sledek si uloûÌme do B, zbytek do A. Na adresu 0 uloûÌme A, do A si vyzvedneme obsah adresy
1, ponech·me jen dolnÌ 4 bity, registr B vyn·sobÌme 16, p¯iËteme k A a uloûÌme na adresu 1. Pokud
chceme uloûit do 2. poloûky nÏjakou hodnotu, tak hodnotu vydÏlÌme 256, v˝sledek si d·me do B,
zbytek do A, na adresu 2 uloûÌme A, do A vyzvedneme obsah adresy 1, ponech·me hornÌ 4 bity, p¯iËteme
B a uloûÌme A na adresu 1. NejvÏtöÌ ËÌslo, kterÈ m˘ûeme uloûit do jednÈ poloûky FAT, je 4095 (to n·s nijak
neomezuje, protoûe m·me pouze 1075 poloûek FAT).
Komentovan˝ v˝pis MDOSu
13
Hodnoty, kterÈ jsou pouûity systÈmem a kterÈ majÌ nÏjak˝ v˝znam:
VyööÌ p˘lbyte
NiûöÌ byte
Celkov· hodnota
%1101 (13)
%11011101
(221)
3549
Tato hodnota znaËÌ, ûe dan˝ sektor je obsazen systÈmem (je v nich uloûen BOOT, FAT, adres·¯)
a sektory, kterÈ uû nejsou dostupnÈ (nap¯. p¯i form·tu 40 stop, 9 sektor˘ to jsou sektory 720ñ1704)
%1101 (13)
%11111111
(255)
3583
Tato hodnota znaËÌ, ûe dan˝ sektor je vadn˝ a nelze ho nijak pouûÌt. Takto se oznaËuje p¯i form·tov·nÌ diskety.
%1100 (12)
%00000000
(0)
3072
Tato hodnota znaËÌ, ûe dÈlka dat v tomto sektoru je nulov· a sektor pat¯Ì souboru s nulovou dÈlkou
nebo souboru, p¯i jehoû ukl·d·nÌ na disk doölo k chybÏ (musel se nÏjak ukonËit).
%0000 (0)
%00000000
(0)
0
Tato hodnota znaËÌ, ûe sektor je nepouûit, takûe do nÏj mohou b˝t zaps·na data.
TeÔ si jeötÏ ¯ekneme, jak se vytv·¯Ì znaËka konce souboru. Vezmeme dÈlku dat v poslednÌm sektoru
(je to vlastnÏ zbytek po dÏlenÌ dÈlky souboru hodnotou 512). K vyööÌmu p˘lbytu p¯iËteme %00001110
(14) ñ to neplatÌ pro pr·zdnÈ soubory ñ a dostaneme tak znaËku konce souboru. Tuto hodnotu uloûÌme
do poslednÌ poloûky souboru ve FAT.
4.3. Adres·¯
Je uloûen v sektorech 7, 8, 9, 10, 11, 12, 13, 14 (podle MDOSu 6, 7, 8, 9, 10, 11, 12, 13). Jsou zde uloûeny
vöechny hlaviËky soubor˘. DÈlka jednÈ hlaviËky je 32 byt˘, do jednoho sektoru se jich vejde 16, takûe
m˘ûete mÌt na disketÏ aû 128 soubor˘.
Stuktura hlaviËky:
0
p¯Ìpona souboru (P, C, N, B, S, Q) nebo hodnota 229, pokud je poloûka pr·zdn·
1ñ10 jmÈno souboru, je-li kratöÌ neû 10 znak˘, je doplnÏno nulami
11ñ12 prvnÌ dva byty dÈlky souboru (0 ñ 65535)
13ñ14 poË·teËnÌ adresa souboru, u BASIC programu to je startovnÌ ¯·dek
15ñ16 u BASIC programu dÈlka programu bez promÏnn˝ch
17ñ18 ËÌslo prvnÌho sektoru souboru
19
nula
20
atributy souboru
21
t¯etÌ byte dÈlky souboru pokud je dÈlka vÏtöÌ neû 65535
22ñ31 bez vyuûtÌ, zaplnÏno hodnotou 229
Pokud srovn·te s p·skovou hlaviËkou, je prvnÌch 17 byt˘ stejn˝ch (aû na prvnÌ byte, kde je jinÈ
kÛdov·nÌ p¯Ìpony). ÇPë odpovÌd· programu v BASICu, ÇCë odpovÌd· znakovÈmu poli, ÇNë odpovÌd·
ËÌselnÈmu poli, ÇBë odpovÌd· bloku byt˘, ÇSë je snapshot a ÇQë je sekvenËnÌ soubor. T¯etÌ byte dÈlky
souboru je pouûit z d˘vodu zavedenÌ sekvencÌ, protoûe mohou b˝t delöÌ neû 65535 byt˘. Pokud je
uloûena v p¯ÌponÏ hodnota 229 (#E5), je poloûka adres·¯e oznaËena jako pr·zdn·.
D·le systÈm MDOS rozliöuje 8 atribut˘ (je 8 bit˘):
7. bit HñHidden ñ p¯Ìkaz CAT nevypisuje
3. bit RñReadable ñ soubor je moûnÈ ËÌst
6. bit SñSystem ñ nenÌ nikde pouûito
2. bit WñWriteable ñ do souboru je moûno zapisovat
5. bit PñProtected ñ nenÌ nikde pouûito
1. bit EñExecuteable ñ soubor je moûnÈ spustit
4. bit AñArchive ñ nenÌ nikde pouûito
0. bit DñDeleteable ñ soubor je moûnÈ smazat
4.4. Datov· oblast
ZaËÌn· od sektoru 15 (podle MDOSu 14) a zde jsou jiû uloûena data. JejÌ dÈlka je:
poËet_stop_na_stranu ◊ poËet_sektor˘_na_stopu ◊ poËet_stran ñ poËet_system_sektor˘ +
ñ poËet_vadn˝ch_sektor˘ sektor˘.
14
Komentovan˝ v˝pis MDOSu
5. Informace o disketÏ a mechanice
Kaûd· mechanika m· v pamÏti SRAM vyhrazeno 12 byt˘ pro uloûenÌ technick˝ch informacÌ o nÌ
a o disketÏ, kter· je v nÌ vloûena.
Pro tyto informace je v pamÏti SRAM vyhrazeno 48 byt˘ (12 byt˘ pro 4 mechaniky). ZaËÌnajÌ na
adrese #3E00 (DRPARZN). Za tÏmito informacemi je vyhrazeno pro kaûdou mechniku mÌsto pro jmÈno
diskety v mechanice (12 byt˘ ñ jmÈno drivu).
Byte
B it
Info rmace
1.
0.
info rmace , je stli je me chanika p øip o je na
1 – me chanika je p øip o je na
1.
info rmace , je stli p øi p o sle d ní o p e raci
s me chaniko u d o šlo k chyb ì ne b o b yly
zastave ny me chaniky
1 – ne d o šlo k chyb ì a me chaniky b ì ží
0 – d o šlo k chyb ì ne b o b yly zastave ny
me chaniky
2.
info rmace , jaká je to me chanika (A ne b o B)
0 – me chanika ne ní p øip o je na
2.
0 – me chanika A
1 – me chanika B
info rmace , ko lika sto p á je me chanika
0 – D80
4.
info rmace , ko lika stranná d iske ta je
v me chanice
0 – je d no stranná
1 – o b o ustranná
5.
jaká je d iske ta v me chanice
0 – 40/80-ti sto p á d iske ta v 40/80-ti
sto p é me chanice
1 – D40
1 – 40-ti sto p á d iske ta v 80-ti sto p é me chanice
Parametry diskety
3.
rychlo st kro ko vání me chaniky
7. b it
6. b it
2 MHz
0
0
3 ms
6 ms
0
1
6 ms
12 ms
1
0
10 ms
20 ms
1
1
15 ms
30 ms
3.
Zd e je ulo že n p o èe t sto p na stranì d iske ty (p o kud je zd e 0, d isk ne ní d e fino ván).
4.
Zd e je ulo že n p o èe t se kto rù na sto p ì d iske ty.
1 MHz
5.
Zd e se uklád á èíslo sto p y, kam b yla nap o sle d y vystave na hlava me chaniky.
6.
Jso u zd e ulo že ny ste jné p arame try jako v 2. b ytu mimo 5. b itu. Te n se týká p o uze me chaniky.
7.
Zd e je ulo že n p o èe t sto p me chaniky.
8.
Zd e je ulo že n p o èe t se kto rù na sto p ì me chaniky.
9.–11. Vyp lnì no nulami.
Par. mechanik
6., 7.
6. Opravy a ˙pravy MDOSu
Protoûe û·dn˝ uËen˝ z nebe nespadl, m· systÈm MDOS i nÏkolik mal˝ch chyb, na kterÈ bylo uû
upozorÚov·no v ZX MagazÌnu (ale jsou i dalöÌ). PrvnÌ verze MDOSu, kter˝ nese datum 17. kvÏtna 1991,
obsahuje vöechny publikovanÈ chyby (i ty nepublikovanÈ). »asem, kdyû se na nÏ p¯iölo (na publikovanÈ,
o nepublikovan˝ch nikdo nevÌ), tak byly nÏkterÈ opraveny (MDOS nese datum 1. z·¯Ì 1992). SamotnÈ
opravy vöak nezp˘sobujÌ nekompatibilitu MDOS˘. Opravy MDOSu jsou v komentovanÈm v˝pisu zv˝raznÏny.
Komentovan˝ v˝pis MDOSu
15
7. Komentovan˝ v˝pis MDOSu
RST #00
Z·kladnÌ vstupnÌ bod do ROM D40. P¯i ËtenÌ instrukce z adresy #0000 je mÌsto ZX ROM p¯istr·nkov·na ROM
D40. Zde se vstupuje p¯i RESETu, tisku chybovÈho hl·öenÌ, ËtenÌ/z·pisu znaku z/do sekvenËnÌho souboru, SNAPu
a n·vratu z rutin ZX ROM zpÏt do ROM D40.
0000 START
0001
NOP
JR
#0068, START1
0003
DB
;takov· nic ne¯ÌkajÌcÌ instrukce
;skoË na testov·nÌ, jak· operace se prov·dÌ
#FF, #FF, #FF, #FF, #FF ;nevyuûito
RST #08
Druh˝ vstupnÌ bod do ROM D40. Sem se sk·Ëe p¯i interpretaci p¯Ìkaz˘ pro pr·ci s disketovou jednotkou. ZX
ROM rozpozn·, ûe nezn· danou syntaxi p¯Ìkazu a zavol· RST #08. P¯i ËtenÌ instrukce z adresy #0008 dojde
k p¯estr·nkov·nÌ a zaËne se kontrolovat syntaxe p¯Ìkazu v ROM D40. Pokud ani ROM D40 nezn· dan˝ p¯Ìkaz,
¯ÌzenÌ se vracÌ zpÏt do ZX ROM a je generov·no chybovÈ hl·öenÌ.
0008 SYNTAX
000B
LD
JP
HL, (#5C5D) CH_ADD ;do HL dej adresu znaku pro dekÛdov·nÌ
#0215, SYNTAX1
;skoË na v˝bÏr a kontrolu p¯Ìkaz˘
000E
DB
#FF, #FF
;nevyuûito
RST #10
Tisk znaku v registru A. M· stejn˝ v˝znam jako RST #10 v ZX ROM. P¯es tento podprogram ale nelze vysÌlat
znaky do sekvenËnÌch soubor˘.
IN:
A kÛd znaku, kter˝ se bude tisknout
OUT: vytiskne znak na otev¯en˝ kan·l
0010 PRINTA
0011
0013
RST #28
DW #0010
RET
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram PRINT-A-1 tisk znaku v A
;vraù se
0014
DB
;nevyuûito
#FF, #FF, #FF, #FF
RST #18
NaËte do registru A obsah mÌsta adresovanÈho systÈmovou promÏnnou CH_ADD. N·vrat, jestli se jedn· o znak
pouûiteln˝ k tisku, jinak je obsah CH_ADD zvÏtöen a vöe se opakuje. M· stejn˝ v˝znam jako RST #18 v ZX ROM.
IN:
ñ
OUT: A obsah mÌsta adresovanÈho sytÈmovou promÏnnou CH_ADD
0018 SET-CHAR
0019
001B
RST #28
DW #0018
RET
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram SET-CHAR naËtenÌ znaku
;vraù se
001C
DB
;nevyuûito
#FF, #FF, #FF, #FF
RST #20
NaËte do A dalöÌ znak p¯i interpretaci BASIC ¯·dku. M· stejn˝ v˝znam jako RST #20 v ZX ROM.
IN:
ñ
OUT: A znak pro dekÛdov·nÌ
16
Komentovan˝ v˝pis MDOSu
0020 NEXT-CHAR
0021
0023
RST #28
DW #0020
RET
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram NEXT-CHAR naËtenÌ dalöÌho znaku
;vraù se
0024
DB
;nevyuûito
#FF, #FF, #FF, #FF
RST #28
Velice d˘leûit· rutina. SlouûÌ k vol·nÌ rutiny v ZX ROM p¯Ìmo z ROM D40. Za p¯Ìkazem RST #28 n·sleduje
adresa rutiny, kter˝ se bude volat v ZX ROM. Po n·vratu z rutiny se zpÏt p¯estr·nkuje do ROM D40 a program
pokraËuje za adresou rutiny v ZX ROM. Vypad· to takto:
RST #28
DW adresa rutiny v ZX ROM
Ö
(tady pokraËuje program po n·vratu z rutiny ZX ROM a je p¯istr·nkov·na ROM D40)
0028 CALLZXROM JP
#003B, CALLZX1
002B
#FF, #FF, #FF, #FF, #FF ;nevyuûito
DB
;skoË na podprogram volajÌcÌ rutiny ze ZX ROM
RST #30
SlouûÌ k testov·nÌ, jestli se prov·dÌ test syntaxe p¯Ìkazu nebo se prov·dÌ p¯Ìkaz, podle 7. bitu promÏnnÈ FLAGS.
IN:
ñ
OUT: NZ vykon·v· se p¯Ìkaz
Z prov·dÌ se kontrola syntaxe p¯Ìkazu
0030 TESTSYN
0034
BIT 7, (IY+#01) FLAGS
RET
;testuj, jestli je kontrola syntaxe nebo provedenÌ p¯Ìkazu
;vraù se
0035
DB
;nevyuûito
#FF, #FF, #FF
RST #38
Podprogram pro obsluhu p¯eruöenÌ od ULA v p¯ÌpadÏ, ûe je p¯estr·nkov·no do ROM D40 a p¯eruöenÌ je
povoleno. PlatÌ pouze pro IM 1. Tam se totiû vol· kaûdou pades·tinu sekundy RST #38. Aby nedoölo k zamrznutÌ
poËÌtaËe, je zde kr·tk˝ progr·mek, kter˝ to oöet¯uje. Pokud tedy budete pouûÌvat rutiny ROM D40 a p¯eruöenÌ IM 1,
nemusÌte po p¯estr·nkov·nÌ zakazovat p¯eruöenÌ.
0038 MASK-INT
JP
#25CE, INTERRUPT
;skoË na obsluhu p¯eruöenÌ
Zde se prov·dÌ vol·nÌ rutin ZX ROM (adresa rutiny se nach·zÌ za vol·nÌm podprogramu).
003B CALLZX1
PUSH AF
;schovej si A a p¯Ìznaky
003C
LD A, (#3EEE) SNAPINF ;vyzvedni informaci o snapu
003F
AND A
;a otestuj, jestli se prov·dÌ snap
Pokud se prov·dÌ snap, nelze volat rutiny ze ZX ROM.
0040
JP
NZ, #034A, SNPRET
;ano → skoË na n·vrat p¯es snap
0043
POP AF
;obnov AF
NynÌ vyzvedneme adresu
0044
EX
0045
LD
0049
LD
004A
INC
004B
LD
volanÈ rutiny.
(SP), HL
(#3E66), DE SAVEDE
E, (HL)
HL
D, (HL)
;nastav HL na uloûenÌ adresy rutiny, kter· se bude volat
;schovej si na chvÌli DE
;vezmi do DE adresu poûadovanÈ rutiny
Komentovan˝ v˝pis MDOSu
17
004C
INC
HL
;v HL je nynÌ n·vratov· adresa do volajÌcÌho programu
NastavÌme si adresy na z·sobnÌk.
004D
EX (SP), HL
004E
004F
0052
0054
PUSH HL
LD HL, #3EF7 SYSFLAG
LD (HL), #4F
LD HL, #0000 START
0057
0058
0059
EX (SP), HL
PUSH DE
LD DE, (#3E66) SAVEDE
A provedeme rutinu s n·vratem do ROM D40.
005D
JP
#1700, STANDROM
0060
DB
;uloû si n·vratovou adresu do volajÌcÌho programu zpÏt
;na z·sobnÌk
;uloû si HL
;do HL adresa uloûenÌ kÛdu Ëinnosti
;nastav Ëinnost Ñvol·nÌ rutiny ZX ROMì
;do HL dej n·vratovou adresu z rutiny ZX ROM do
;ROM D40 (po n·vratu se bude sk·kat na adresu #0000,
;kde se podle obsahu SYSFLAG provede n·vrat do
;volajÌcÌho programu)
;uloû ji na z·sobnÌk a obnov HL
;uloû adresu volanÈ rutiny na z·sobnÌk
;obnov si DE
;skoË na p¯estr·nkov·nÌ do ZX ROM
#FF, #FF, #FF, #FF, #FF, #FF
;nevyuûito
NMI
Tento podprogram se pouûÌv· p¯i p¯enosu dat z/do mechaniky. Je vyvol·n p¯i poûadavku DRQ a INTRQ ¯adiËe,
jsou-li povoleny (6. bit na portu 137). P¯i p¯enosu dat je 512-kr·t (pro kaûd˝ byte) vyvol·v·no hardwarovÈ
p¯eruöenÌ NMI, kterÈ sk·Ëe na tuto adresu. V registru IX je adresa, kam se bude sk·kat.
IN:
IX adresa podprogramu, kam se bude sk·kat
OUT: naËtenÌ/z·pis byte z/na disketu do/z pamÏti
0066 NMI
JP
(IX)
;skoË na adresu v IX
Zde se testuje, jak· operace se prov·dÌ (RESET, n·vrat z vol·nÌ rutiny ZX ROM, SNAP, ËtenÌ/z·pis z/do
sekvenËnÌho souboru, tisk chybovÈho hl·öenÌ). Danou operaci urËuje buÔ kÛd v SYSFLAG nebo n·vratov· adresa
do volajÌcÌho programu.
0068 START1
EX
0069
006A
PUSH BC
PUSH AF
18
(SP), HL
;vezmi n·vratovou adresu do programu, uloû ji do HL
;a uloû si HL na z·sobnÌk
;uloû si BC
;a AF
Komentovan˝ v˝pis MDOSu
UloûÌme si stav p¯eruöenÌ a vektor p¯eruöenÌ.
006B
LD A, I
006D
006E
006F
0070
0074
DI
PUSH AF
POP BC
LD (#3EEC), BC IREG2
PUSH HL
NynÌ zkontrolujeme, jestli
0075
LD
0078
LD
007A CHCOLD
LD
007B
XOR
007C
CP
007D
JR
007F
INC
0080
DJNZ
jsou v po¯·dku kontrolnÌ
HL, #3EEF SYSMRK
B, #08
A, H
L
(HL)
NZ, #00B4, COLD
HL
#007A, CHCOLD
Tabulka je v po¯·dku, otestujeme nynÌ, jak· Ëinnost
0082
LD A, (HL)
0083
LD (HL), #20
0085
CP
#4F
0087
JP
Z, #013A, ROMRET
008A
CP
#45
008C
JP
Z, #0140, ERRCOD
008F
POP
HL
;vezmi hornÌ byte vektoru p¯eruöeni a stav IFF (stav
;p¯eruöenÌ, jestli bylo povoleno nebo zak·z·no)
;zakaû p¯eruöenÌ
;uloû hornÌ byte vektoru p¯eruöenÌ a stav p¯eruöenÌ
;a vyzveni vöe do BC
;a uloû do pamÏti SRAM
;uloû si n·vratovou adresu do programu na z·sobnÌk
byty. Pokud nejsou v po¯·dku, inicializuje se MDOS.
;do HL adresa zaË·tku tabulky kontrolnÌch byt˘
;celkem tvo¯Ì tabulku 8 byt˘
;vytvo¯ obraz bytu
;souhlasÌ s obsahem tabulky?
;ne → skoË na inicializaci MDOSu
;posuÚ se na dalöÌ byte v tabulce
;opakuj B-kr·t
se bude prov·dÏt podle obsahu SYSFLAG.
;vezmi kÛd Ëinnosti ze SYSFLAG
;nastav kÛd Ëinnosti Ñû·dn· Ëinnostì
;je kÛd Ëinnosti Ñn·vrat z rutiny ZX ROMì?
;ano → skoË na n·vrat do volajÌcÌho programu
;je kÛd Ëinnosti Ñv˝pis chybovÈho hl·öenÌì?
;ano → skoË na v˝pis chybovÈho hl·öenÌ MDOSu nebo
;ZX ROM
;obnov do HL n·vratovou adresu do programu
NynÌ je zde nÏco, Ëemu jsem nep¯iöel na kloub. Vypad· to jako poz˘statek ladÌcÌ rutiny. Pokud za skokem na
adresu #0000 n·sledujÌ znaky Ñ*ì a Ñ=ì, je zmÏnÏn border podle 3. bytu, vyps·n obsah registru HL (v dobÏ vol·nÌ
RST #00) do otev¯enÈho kan·lu a ¯ÌzenÌ se vracÌ zpÏt do volajÌcÌho programu za 3. byte.
0090
LD A, (HL)
;vezmi byte za vol·nÌ adresy #0000
0091
CP
Ñ*ì
;je to hvÏzdiËka?
0093
JP
Z, #01B0, SPECCOMM ;ano → skoË na interpretaci speci·lnÌho p¯Ìkazu
NynÌ se provede kontrola n·vratovÈ adresy, odkud byl skok na adresu #0000, podle tabulky, ve kterÈ jsou
uloûeny povolenÈ n·vratovÈ adresy. Pokud nÏkter· z tÏchto adres odpovÌd· n·vratovÈ adrese do volajÌcÌho programu,
neprov·dÌ se RESET, ale urËit˝ typ operace. Jsou to ËtenÌ/z·pis z/do sekvenËnÌho souboru a SNAP.
0096
0097
0098
0099
009C TESTROUT
009D
009E
009F
00A0
00A1
00A2
00A3
PUSH DE
LD B, H
LD C, L
LD HL, #019A IORTAB
LD E, (HL)
INC HL
LD D, (HL)
INC HL
EX DE, HL
LD A, H
OR L
JR
Z, #00B4, COLD
;uloû si DE
;uloû si n·vratovou adresu do BC pro porovn·nÌ
;do HL zaË·tek tabulky povolen˝ch n·vratov˝ch adres
;vezmi n·vratovou adresu z tabulky do DE
;p¯edej do HL a polohu v tabulce dej do DE
;je konec tabulky?
;ano → skoË na inicializaci MDOSu
Komentovan˝ v˝pis MDOSu
19
00A5
00A7
00A8
SBC
EX
LD
HL, BC
DE, HL
E, (HL)
;porovnej HL s n·vratovou adresou do programu
;ukazatel v tabulce dej zpÏt do HL
;vezmi do DE adresu rutiny z tabulky, kter· se bude
;volat, pokud je n·vratov· adresa povolena
00A9
00AA
00AB
00AC
INC
LD
INC
JR
HL
D, (HL)
HL
NZ, #009C, TESTROUT ;adresy nesouhlasÌ → skoË na otestov·nÌ dalöÌ poloûky
;tabulky
Pokud byla n·vratov· adresa nalezena v tabulce, obnovÌme vöechny registry do p˘vodnÌho stavu a provedeme
skok na vybranou rutinu.
00AE
EX DE, HL
;adresu rutiny do HL
ObnovÌme registry do p˘vodnÌho stavu.
00AF
POP DE
00B0
POP AF
00B1
POP BC
00B2
EX (SP), HL
00B3
RET
;obnov DE
;obnov AF
;obnov BC
;adresu rutiny uloû na z·sobnÌk a obnov HL
;skoË do rutiny
InicializaËnÌ rutina. Prov·dÌ se p¯i resetu. Testuje RAM, inicializuje kontrolnÌ byty, testuje p¯ipojenÈ mechaniky
a nastavuje jejich parametry, nastavuje systÈmovÈ promÏnnÈ MDOSu a inicializuje p¯ipojen˝ obvod 8255.
Nejd¯Ìve se otestuje SRAM, jestli nenÌ vadn·.
00B4 COLD
LD HL, #0000
;zaË·tek MDOSu do HL
00B7
LD DE, #3800
;zaË·tek SRAM do DE
00BA
LD BC, #0800
;dÈlka SRAM je 2 KB
00BD
LDIR
;presuÚ do pamÏti SRAM
Porovn·me obsah
00BF
00C2
00C5
00C8 RAMTEST
00C9
00CA
00CC
00CE
MDOS
LD
LD
LD
LD
INC
CPI
JR
JP
ROM a SRAM.
HL, #0000
DE, #3800
BC, #0800
A, (DE)
DE
;zaË·tek MDOSu do HL
;zaË·tek SRAM do DE
;dÈlka SRAM je 2 KB
;vezmi obsah buÚky SRAM do A
;a posuÚ se na adresu dalöÌ buÚky
;porovnej s obsahem MDOS ROM
NZ, #012F, RAMERR ;nesouhlasÌ → skoË na chybu RAM
PE, #00C8, RAMTEST ;opakuj BC kr·t
NynÌ provedeme vymaz·nÌ pamÏti SRAM (dosadÌme nuly do vöech bunÏk).
00D1
LD HL, #3800
;zaË·tek SRAM do HL
00D4
LD D, H
;okopÌruj do DE
00D5
LD E, L
00D6
INC DE
;a posuÚ se na dalöÌ adresu
00D7
LD BC, #0800
;dÈlka je 2 KB (maûe se o 1 byte vÌce, ale tady to nevadÌ)
00DA
LD (HL), #00
;plnÌcÌ hodnota je nula
00DC
LDIR
;vyplÚ vöechny buÚky nulou
Vytvo¯Ìme tabulku kontrolnÌch byt˘.
00DE
LD HL, #3EEF SYSMRK
00E1
LD B, #08
00E3 SETMRK
LD A, H
20
;adresa tabulky kontrolnÌch byt˘ do HL
;celkem 8 byt˘
;vytvo¯ hodnotu
Komentovan˝ v˝pis MDOSu
00E4
00E5
00E6
00E7
XOR
LD
INC
DJNZ
L
(HL), A
HL
#00E3, SETMRK
NastavÌme systÈmovÈ promÏnnÈ MDOSu.
00E9
LD (HL), #20
;a uloû ji do tabulky
;posuÚ se na dalöÌ buÚku
;opakuj B-kr·t
;nastav na SYSFLAG kÛd Ëinnosti Ñû·dn· Ëinnostì
NynÌ se zde nach·zÌ celkem zbyteËn· Ë·st, kterou auto¯i zapomÏli p¯i odladÏnÌ vymazat. Pokud p¯i resetu budete
drûet kl·vesy SPACEñMñB, uloûÌ se do systÈmovÈ promÏnnÈ DEBUG nenulov· hodnota a budou se V·m p¯i
operacÌch vypisovat kontrolnÌ tisky nÏkter˝ch d˘leûit˝ch promÏnn˝ch. Tato Ë·st programu testuje stisknutou trojici
kl·ves.
00EB
00ED
00EF
00F0
00F2
00F3
00F5
00F6
00F8
00F9
00FB
00FC
00FE
LD
IN
RRA
JR
RRA
JR
RRA
JR
RRA
JR
RRA
JR
LD
A, #7F
A, (#FE)
C, #0101, NODEB
NC, #0101, NODEB
C, #0101, NODEB
NC, #0101, NODEB
C, #0101, NODEB
(#3E60), A DEBUG
NynÌ nastavÌme v˝chozÌ parametry disk˘ A: a B:.
0101 NODEB
LD DE, #3E00 DRPARZN
0104
LD HL, #0EF8 ROMDRPAR
0107
LD BC, #18
010A
LDIR
010C
LD A, ÑAì
010E
LD (#3EAA), A ACDRIVE
0111
LD HL, #5800
0114
LD DE, #5801
0117
LD BC, #0300
011A
LD (HL), #12
011C
LDIR
011E
LD A, #02
0120
OUT (#FE), A
0122
LD SP, #4000
0125
CALL #2216, HWINIT
;do A dej hornÌ byte portu
;p¯eËti hodnotu z portu #7FFE
;bylo stisknuto SPACE?
;ne → p¯eskoË testy ostatnÌch kl·ves
;byl stisknut SYMBOL SHIFT?
;ano → p¯eskoË ostatnÌ testy
;bylo stisknuto M?
;ne → p¯eskoË ostatnÌ testy
;bylo stisknuto N?
;ano → p¯eskoË poslednÌ test
;bylo stisknuto B?
;ne → nebyl trojhmat, skoË
;uloû informaci Ñbyl trojhmatì
;do DE zaË·tek tabulek disk˘ v SRAM
;adresa standardnÌch parametr˘ v ROM D40 do HL
;24 byt˘ (2 ◊ 12 byt˘) pro dvÏ mechaniky
;p¯esuÚ do SRAM
;jmÈno aktu·lnÌho drivu bude ÑAì
;uloû do jmÈna aktu·lnÌho drivu
;do HL adresu zaË·tku atribut˘ obrazovky
;do DE adresu zaË·tku atribut˘ obrazovky plus 1
;dÈlka je 768 byt˘ (zase se vyplÚuje o 1 byte vÌce)
;PAPER Ëerven˝, INK Ëerven˝
;a teÔ n·m zËerven· obrazovka
;BORDER bude taky Ëerven˝
;uû je
;z·sobnÌk nastav aû na konec SRAM
;testuj mechaniky a port 8255
Test disketovÈ jednotky probÏhl, takûe se vr·tÌme do ZX ROM, aby se mohlo pokraËovat v inicializaci poËÌtaËe.
N·vrat je proveden zajÌmav˝m zp˘sobem. Z·sobnÌk je nastaven na adresu #1019, kde je uloûena hodnota #0001
v ZX ROM. Tato hodnota je tam vûdy, takûe p¯i n·vratu se sk·Ëe na adresu #0001, kde se pokraËuje v inicializaci.
Nem˘ûeme se vr·tit na adresu #0000, protoûe by doölo k zacyklenÌ.
0128
0129
DI
LD
SP, #1019
;zakaû p¯eruöenÌ pro inicializaci ZX ROM
;n·vratov· adresa do ZX ROM je #0001 (abychom se
;nezacyklili) a ta je na adrese #1019 v ZX ROM
Komentovan˝ v˝pis MDOSu
21
012C
JP
#1700, STANDROM
;skoË na p¯estr·nkov·nÌ do ZX ROM a pokraËov·nÌ
;v inicializaci poËÌtaËe
RAMERR
Zde se sk·Ëe, jestli p¯i testu SRAM dojde k chybÏ (vadn· SRAM, öpatnÏ zapojen˝ kabel, atd.). MÏnÌ se border
a poËÌtaË nÏjakou dobu vrËÌ. Potom se znovu zkusÌ reset.
012F RAMERR
0130 CYCLE
0131
0133
0134
0135
0137
XOR
DEC
OUT
EX
EX
JR
JP
Zde doch·zÌ k n·vratu z
ROM D40.
013A ROMRET
POP
013B
POP
013C
POP
013D
EX
013E
EI
013F
RET
A
A
(#FE), A
(SP), HL
(SP), HL
NZ, #0130, CYCLE
#0000, START
;na zaË·tku je v A nula
;sniû A
;nastav BORDER a repro
;Ëasov· prodleva
;trv· 38 takt˘
;opakuj A-kr·t
;zkus znovu reset
rutin ROM D40 a z vol·nÌ rutin ZX ROM. D˘leûitÈ je, ûe z˘stane p¯istr·nkov·na
HL
AF
BC
(SP), HL
;vezmi n·vratovou adresu do HL
;obnov registry
;uloû n·vratovou adresu na z·sobnÌk a obnov HL
;povol p¯eruöenÌ
;vraù se zpÏt do volajÌcÌho programu
Sem se sk·Ëe, pokud dojde k n·vratu z chybovÈho hl·öenÌ. Pokud p¯i nÏjakÈ operaci dojde k chybÏ, vol· se
chybovÈ hl·öenÌ na #0204 (obdoba RST #08 v BASICu) s kÛdem chyby v A. Tam se p¯epÌöe obsah adresy
v ERR_SP nulou, promÏnn· SYSFLAG je nastavena na Ëinnost Ñtisk chybovÈho hl·öenÌì a provede se n·vrat do ZX
ROM na adresu #000B. Dojde k vyzvednutÌ kÛdu chyby, vyËiötÏnÌ z·sobnÌku a dalöÌch promÏnn˝ch a ¯ÌzenÌ se vracÌ
na adresu, na kterou ukazuje promÏnn· ERR_SP. Protoûe sem MDOS uloûil 0, provede skok na adresu #0000, kde
dojde k p¯estr·nkov·nÌ znovu do ROM D40, kde se podle SYSFLAG provede skok na ERRCOD, kde je ops·n kus
programu ze ZX ROM s mal˝mi zmÏnami (v BASICu se tam vracÌ ¯ÌzenÌ po nalezenÌ chyby), kter˝ vytiskne buÔ
chybovÈ hl·öenÌ MDOSu a provede n·vrat do ZX ROM za tisk chybovÈho hl·öenÌ, nebo provede skok do ZX ROM
p¯ed tisk chybovÈho hl·öenÌ, pokud je to hl·öenÌ BASICu. Potom jiû pokraËuje program v ZX ROM. To vöe se dÏje
za p¯edpokladu, ûe ERR_SP ukazuje na adresu, na nÌû je uloûena hodnota #1303. Pokud tam takov· hodnota nenÌ,
znamen· to, ûe je v pamÏti program na oöet¯enÌ chybov˝ch hl·öenÌ. NenÌ tedy p¯eps·n obsah adresy, na kterou
ukazuje ERR_SP, ale provede se pouze n·vrat na adresu #000B, kde dojde k vyËiötÏnÌ z·sobnÌku, promÏnn˝ch
BASICu, vyzvednutÌ kÛdu chyby a provede se skok do do rutiny oöet¯ujÌcÌ chybovÈ hl·öenÌ (je vynech·n skok na
adresu #0000 a tisk hl·öenÌ).
0140 ERRCOD
0141
0142
0143
0144
POP
POP
POP
EX
EI
HL
AF
BC
(SP), HL
;vezmi n·vratovou adresu do HL
;obnov registry
;uloû n·vratovou adresu na z·sobnÌk a obnov HL
;povol p¯eruöenÌ
NynÌ je ops·n kus programu ze ZX ROM s mal˝mi zmÏnami.
0145
HALT
;Ëekej na p¯eruöenÌ
0146
RES 5, (IY+#01) FLAGS
;nastav sign·l Ñmoûno dalöÌ kl·vesuì
014A
BIT 1, (IY+#30) FLAGS2
;byl pouûit buffer tisk·rny?
014E
JR
Z, #0153, NOCOPYBUF ;ne → p¯eskoË ËiötÏnÌ bufferu
0150
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
0151
DW #0ECD
;podprogram COPY-BUFF vyËiötÏnÌ bufferu tisk·rny
22
Komentovan˝ v˝pis MDOSu
0153 NOCOPYBUF
0156
0157
0158
015B
015E
0161
0164
0165
0168
0169
016B
016F
0170
0172
0176
0179
017A
017C
017E
LD A, (#5C3A) ERR_NR
INC A
PUSH AF
LD HL, #0000
LD (IY+#37), H FLAGX
LD (IY+#26), H X_PTRhi
LD (#5C0B), HL DEFADD
INC HL
LD (#5C16), HL STRMS6
RST #28
DW #16B0
;zajisti, aby proud 0
;ukazoval na kan·l ÑKì
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram SET-MIN vyËiötÏnÌ vöech pracovnÌch
;oblastÌ a kalkul·torov˝ z·sobnÌk
RES 5, (IY+#37) FLAGX
;nastav reûim EDIT
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
DW #0D6E
;podprogram CLS-LOWER smaz·nÌ dolnÌ obrazovky
SET 5, (IY+#02) TVFLAG
;nastav sign·l ÑvyËistit dolnÌ Ë·st obrazovkyì
CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
POP AF
;vyzvedni hodnotu hl·öenÌ
CP
#1C
;byl kÛd chyby < #1C (hl·öenÌ ZX ROM)?
JR
NC, #0185, ERRMDOS ;ne → skoË na v˝pis chyby MDOSu
LD HL, #1335
;do HL n·vratov· adresa do ZX ROM, bude se tisknout
;chybovÈ hl·öenÌ ZX ROM
Prov·dÌ se n·vrat do ZX ROM na adresu v HL.
0181 HLROMRET PUSH HL
0182
JP
#1700, STANDROM
Vytiskneme chybovÈ hl·öenÌ MDOSu.
0185 ERRMDOS
LD B, A
0186
ADD A, #07
0188
RST #28
0189
DW #15EF
018B
LD A, Ñ ì
018D
RST #10
018E
LD A, B
018F
LD DE, #03AF SYSMSG
0192
CALL #01C8, PRTMES
0195
LD HL, #1349
0198
;vezmi ËÌslo chyby do A
;zvyö o 1
;a uloû si tuto hodnotu
;nuluj systÈmovÈ promÏnnÈ
;FLAGX, X_PTRhi, DEFADD
JR
#0181, HLROMRET
;uloû n·vratovou adresu do ZX ROM na z·sobnÌk
;skoË na p¯estr·nkov·nÌ do ZX ROM
;kÛd chyby uloû do B
;uprav na znak
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram OUT-CODE vysl·nÌ znaku v A do kan·lu
;mezera
;tiskni mezeru
;vezmi po¯adÌ poûadovanÈho hl·öenÌ
;do DE zaË·tek systÈmov˝ch hl·öenÌ
;piö poûadovanÈ hl·öenÌ
;n·vratov· adresa do ZX ROM, budeme pokraËovat uû
;v ZX ROM za v˝pisem chybovÈho hl·öenÌ
;uloû ji na z·sobnÌk a p¯estr·nkuj zpÏt do ZX ROM
Tady se nach·zÌ tabulka povolen˝ch n·vratov˝ch adres, odkud se m˘ûe volat RST #00 (nedojde p¯i tom
k inicializaci D40 a resetu) a odpovÌdajÌcÌch rutin. V komentovanÈm v˝pisu ZX ROM sice na tÏchto adres·ch
nenajdete p¯Ìmo p¯Ìkaz RST #00, ale vϯte, ûe tam je. PrvnÌ slovo je n·vratov· adresa do ZX ROM a druhÈ slovo je
adresa rutiny v ROM D40.
019A IORTAB
019C
019E
01A0
01A2
01A4
DW
DW
DW
DW
DW
DW
#22C3
#0DD9
#25AC
#0E23
#27A6
#0DD9
;n·vratov· adr. do ZX ROM p¯i ËtenÌ znaku z kan·lu
;adresa rutiny v ROM D40 pro ËtenÌ znaku z kan·lu
;n·vratov· adr. do ZX ROM pro z·pis znaku do kan·lu
;adresa rutiny v ROM D40 pro z·pis znaku do kan·lu
;n·vratov· adr. do ZX ROM pro ËtenÌ znaku z kan·lu
;adresa rutiny v ROM D40 pro ËtenÌ znaku z kan·lu
Komentovan˝ v˝pis MDOSu
23
01A6
01A8
01AA
01AC
01AE
DW
DW
DW
DW
DW
#27AD
#0E1E
#0067
#02E7
#0000
;n·vratov· adr. do ZX ROM pro z·pis znaku do kan·lu
;adresa rutiny ROM D40 pro z·pis znaku do kan·lu
;n·vratov· adr. do ZX ROM p¯i NMI (snapu)
;adresa rutiny ROM D40 pro uloûenÌ snapu
;konec tabulky
NynÌ n·sleduje tÏlo programu, kterÈ je pokraËov·nÌm onoho z·hadnÈho poz˘statku z ladÏnÌ, kdy se testuje
2. znak Ñ=ì, pokud nenÌ, provede se reset, pokud je, provede se v˝pis obsah registru HL v dobÏ vol·nÌ RST #00,
zmÏnÌ se border a program se regulÈrnÏ vr·tÌ zpÏt
01B0 SPECCOMM
01B1
01B2
01B4
01B7
01B8
01B9
01BA
01BB
01BC
01BD
01BE
01C0
01C1
01C2
01C5
INC HL
LD A, (HL)
CP
Ñ=ì
JP
NZ, #00B4, COLD
INC HL
LD A, (HL)
INC HL
POP BC
POP BC
EX (SP), HL
EI
OUT (#FE), A
LD C, L
LD B, H
CALL #0FA6, BCPRT
JP
#1700, STANDROM
;posuÚ se na 2. byte za RST #00
;vyzvedni obsah adresy do A
;je tam rovnÌtko?
;ne → skoË na inicializaci MDOSu
;posuÚ se na 3. byte za RST #00
;vyzvedni obsah adresy do A
;posuÚ se na dalöÌ byte a tak vytvo¯ n·vratovou adresu
;vyzvedni dvÏ hodnoty ze z·sobnÌku (AF a BC)
;uloû n·vratovou adresu na z·sobnÌk a obnov HL
;povol p¯eruöenÌ
;zmÏÚ border
;dej n·vratovou adresu z HL do BC
;vypiö obsah BC na pr·vÏ otev¯en˝ kan·l
;skoË na p¯estr·nkov·nÌ do ZX ROM
PRTMES
Podprogram pro tisk poloûky z tabulky text˘. Kaûd· poloûka konËÌ znakem, jehoû 7. bit je nastaven na 1.
Samotn· tabulka zaËÌn· invertovan˝m znakem.
IN:
A ËÌslo poloûky (od nuly)
DE zaË·tek tabulky, kter· zaËÌn· invertovan˝m znakem
OUT: v˝pis poloûky na obrazovku
01C8 PRTMES
01C9
01CA
EX
INC
INC
DE, HL
A
A
;dej zaË·tek tabulky do HL
;zvyö A o 2
Budeme hledat poûadovanou poloûku.
01CB SETMESS
DEC A
01CC
JR
Z, #01D5, PMESSAGE
01CE SETNMESS BIT 7, (HL)
01D0
INC HL
01D1
JR
Z, #01CE, SETNMESS
01D3
JR
#01CB, SETMESS
;sniû ËÌslo poloûky
;poloûka nalezena → skoË na v˝pis poloûky
;konec poloûky?
;posuÚ se na dalöÌ znak
;nenÌ konec → hledej konec poloûky
;zkontroluj dalöÌ poloûku textu
NynÌ vytiskneme
01D5 PMESSAGE
01D6
01D7
;vezmi znak z textu do A
;uloû si adresu znaku
;zruö 7. bit
text poloûky na obrazovku.
LD A, (HL)
PUSH HL
RES 7, A
Otestujeme, jestli se v textu nebude vypisovat jmÈno disku nebo souboru. Pokud se v textu vyskytne hodnota
24
Komentovan˝ v˝pis MDOSu
#23, tiskne se jmÈno
01D9
01DB
01DE
01E0
01E2
01E5
01E7
01E8
01E9
01EB
01ED
01EE PNEXTCH
01EF
disku uloûenÈ v DNZONE1, p¯i hodnotÏ #40 se tiskne jmÈno souboru v FNZONE1.
CP
#23
;m· se vloûit jmÈno disku?
LD HL, #3E80 DNZONE1 ;do HL adresa 1. jmÈna disku pro I/O
JR
Z, #01F1, PRNAME
;ano → skoË na tisk jmÈna disku
CP
#40
;m· se vloûit jmÈno souboru?
LD HL, #3E8A FNZONE1 ;do HL adresa 1. jmÈna souboru pro I/O
JR
Z, #01F1, PRNAME
;ano → skoË na tisk jmÈna souboru
POP HL
;vyzvedni adresu uloûenÌ znaku
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
DW #0C3B
;podprogram PO-SAVE tisk znaku v A
BIT 7, (HL)
;je konec poloûky?
RET NZ
;ano → vraù se z v˝pisu
INC HL
;posuÚ se na dalöÌ znak v poloûce
JR
#01D5, PMESSAGE
;pokraËuj ve v˝pisu poloûky
Pokud vznikne poûadavek vytisknout v textu jmÈno disku nebo jmÈno souboru, je proveden skok sem, odkud
se po vytiötÏnÌ vr·tÌme zpÏt do tisku poloûky. V HL je adresa uloûenÌ buÔ jmÈna souboru nebo disku. Je tiötÏno buÔ
10 znak˘ nebo dokud se nenarazÌ na 0 (znak Ñkonec jmÈnaì).
01F1 PRNAME
PUSH BC
;schovej si BC
01F2
LD B, #0A
;dÈlka jmÈna je aû 10 byt˘
01F4 PRNAMEL
LD A, (HL)
;vezmi znak
01F5
AND A
;je konec jmÈna?
01F6
JR
Z, #0200, STOPPRNM ;ano → skoË na konec v˝pisu jmÈna
01F8
INC HL
;posuÚ se na dalöÌ znak ve jmÈnÏ
01F9
PUSH BC
;schovej si poËet znak˘ k tisku
01FA
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
01FB
DW #0C3B
;podprogram PO-SAVE tisk znaku v A
01FD
POP BC
;obnov poËet znak˘ k tisku
01FE
DJNZ #01F4, PRNAMEL
;opakuj B-kr·t
Bylo vytiötÏno celÈ jmÈno.
0200 STOPPRNM
POP BC
0201
POP HL
0202
JR
#01EE, PNEXTCH
;obnov BC a HL
;skoË na pokraËov·nÌ tisku poloûky
ERRR
Zde je vstupnÌ bod, kdyû dojde k nÏjakÈ chybÏ. Je to vlastnÏ obdoba RST #08. Lze volat jak chyby MDOSu, tak
i chyby ZX BASICu.
IN:
A ËÌslo chyby
OUT: je vytiötÏno chybovÈ hl·öenÌ a ¯ÌzenÌ se vracÌ zpÏt do ZX ROM
0204 ERRR
PUSH AF
;uloû si kÛd chyby
Nejd¯Ìve otestujeme, jestli nedoölo k chybÏ p¯i snapu, protoûe potom se nevypisuje û·dnÈ chybovÈ hl·öenÌ, ale
vracÌ se zpÏt p¯es n·vrat ze snapu.
0205
LD A, (#3EEE) SNAPINF ;vyzvedni informaci, jestli nenÌ snap
0208
AND A
;je snap?
0209
JP
NZ, #034A, SNPRET
;ano → skoË na n·vrat do ZX ROM p¯es snap
020C
POP AF
;vyzvedni zpÏt kÛd chyby
020D
LD HL, #5C3A ERR_NR
;adresa uloûenÌ kÛdu chyby do HL
0210
LD (HL), A
;uloû kÛd chyby do ERR_NR
0211
PUSH HL
;uloû si adresu ERR_NR
Komentovan˝ v˝pis MDOSu
25
0212
LD
HL, (#5C5D) CH_ADD ;do HL adresa znaku pro dekÛdov·nÌ
SYNTAX1
Toto je vstupnÌ bod pro dekÛdov·nÌ p¯Ìkazu MDOSu a skok na podprogramy, kterÈ vykon·vajÌ dan˝ p¯Ìkaz
MDOSu.
0215 SYNTAX1
POP
BC
;vyzvedni n·vratovou adresu do ZX ROM do BC
Pokud probÌh· snap, nekontroluje se syntaxe, ale vracÌ se zpÏt p¯es n·vrat ze snapu.
0216
LD A, (#3EEE) SNAPINF ;vyzvedni informace, jestli je snap
0219
AND A
;je snap?
021A
JP
NZ, #034A, SNPRET
;ano → skoË na n·vrat do ZX ROM p¯es snap
021D
LD A, (#3E60) DEBUG
;byl p¯i resetu trojhmat?
0220
AND A
0221
JR
Z, #0266, COMMAND ;ne → p¯eskoË v˝pis ladÌcÌch tisk˘
Zase zapomenut· rutina ladÌcÌch tisk˘. Je vytiötÏna n·vratov· adresa do ZX ROM p¯i vol·nÌ RST #08, adresa tvaru
p¯Ìkazu v tabulce syntaxe a v˝öka z·sobnÌku p¯i vol·nÌ RST #08.
0223
PUSH BC
;uloû si n·vratovou adresu
0224
LD HL, (#5C65) STKEND ;vezmi adresu vrcholu z·sobnÌku kalkul·toru do HL
0227
LD DE, #000A
;posuÚ o 10 byt˘
022A
ADD HL, DE
;vrchol z·sobnÌku kalkul·toru
022B
LD (#5C65), HL STKEND ;uloû nov˝ vrchol
022E
LD A, #02
;kan·l 2 (hornÌ Ë·st obrazovky)
0230
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
0231
DW #1601
;podprogram CHAN-OPEN otev¯enÌ kan·lu
0233
POP BC
;vyzvedni n·vratovou adresu
0234
PUSH BC
;a znovu ji uloû
0235
CALL #0FA6, BCPRT
;piö obsah BC na obrazovku
0238
LD A, Ñ ì
;mezera do A
023A
RST #10
;vytiskni mezeru
023B
LD BC, (#5C74) T_ADDR ;adresa dalöÌ poloûky v tabulce syntaxe do BC
023F
CALL #0FA6, BCPRT
;piö obsah BC na obrazovku
0242
LD A, Ñ ì
;mezera
0244
RST #10
;vytiskni mezeru
0245
LD HL, #0000
;vezmi hodnotu SP do HL
0248
ADD HL, SP
0249
LD DE, (#5C3D) ERR_SP ;adresa poloûky na z·sobnÌku p¯i chybÏ do DE
024D
DEC DE
;sniû o dvÏ
024E
DEC DE
024F
EX DE, HL
;dej do HL
0250
AND A
;nuluj CY p¯ed odËÌt·nÌm
0251
SBC HL, DE
;odeËti, v HL je teÔ v˝öka z·sobnÌku i pro dan˝ p¯Ìkaz je
;to vlastnÏ poËet n·vratov˝ch adres p¯i kontrole syntaxe
;danÈho p¯Ìkazu
0253
LD B, H
;dej ji do BC
0254
LD C, L
0255
CALL #0FA6, BCPRT
;piö obsah BC na obrazovku
0258
LD A, #0D
;nov˝ ¯·dek
025A
RST #10
;posuÚ se na nov˝ ¯·dek
025B
LD HL, (#5C65) STKEND ;vezmi adresu vrcholu z·sobnÌku kalkul·toru
025E
LD BC, #FFF6
;do BC dej ñ10
26
Komentovan˝ v˝pis MDOSu
0261
0262
0265
ADD HL, BC
LD (#5C65), HL STKEND
POP BC
;sniû na p˘vodnÌ hodnotu
;uloû nov˝ vrchol z·sobnÌku kalkul·toru
;vyzvedni n·vratovou adresu
NynÌ urËÌme podle n·vratovÈ adresy, adresy v tabulce syntaxe a v˝öky z·sobnÌku p¯i RST #08, kde doölo k chybÏ
a jak˝ p¯Ìkaz m· b˝t vykon·n. PostupnÏ budeme proch·zet tabulku, ve kterÈ jsou vöechny n·vratovÈ adresy, kam
by se vr·tilo ¯ÌzenÌ po RST #08 p¯i chybÏ v syntaktickÈ anal˝ze danÈho p¯Ìkazu.
0266 COMMAND
026A SETCOMM
026D
0270
0271
0272
0274
0278
027A
027C
027F
0282
0284
0286
0289
028A
028E
028F
0290
0292
0295
0298
029A
LD
LD
LD
LD
OR
JR
LD
IX, #05FF SYNTAB
L, (IX+#00)
H, (IX+#01)
A, H
L
Z, #02A3, NOCOM
DE, (#5C74) T_ADDR
;adresa tabulky chybov˝ch adres do IX
;vezmi adresu p¯Ìkazu v tabulce syntaxe z tabulky do
;HL
;je konec tabulky?
;ano → skoË na v˝pis chyby
;adresa poloûky v tabulce syntaxe do DE, kde doölo
;k nalezenÌ chyby
SBC HL, DE
;porovn·me, jestli jsou shodnÈ
JR
NZ, #029C, NEXTCOM ;ne → skoË na posun na dalöÌ poloûku v tabulce
LD L, (IX+#02)
;vyzvedni n·vratovou adresu z tabulky
LD H, (IX+#03)
SBC HL, BC
;porovn·me, jestli jsou stejnÈ n·vratovÈ adresy
JR
NZ, #029C, NEXTCOM ;ne → skoË na posun na dalöÌ poloûku v tabulce
LD HL, #0000
;vezmi hodnotu SP do HL
ADD HL, SP
LD DE, (#5C3D) ERR_SP ;adresa poloûky na z·sobnÌku p¯i chybÏ do DE
EX DE, HL
;dej ji do HL
AND A
;nuluj CY a odeËti ñ
SBC HL, DE
;dostaneme poËet vno¯enÌ, neû bylo zavol·no RST #08
LD E, (IX+#04)
;vyzvedni v˝öku z·sobnÌku z tabulky do DE
LD D, (IX+#05)
SBC HL, DE
;porovnej je
JR
Z, #02CB, DOCOM
;v˝öka z·sobnÌku stejn· → skoË na provedenÌ p¯Ìkazu
Posuneme se na dalöÌ poloûku v tabulce.
029C NEXTCOM
LD DE, #0008
029F
ADD IX, DE
02A1
JR
#026A, SETCOMM
;kaûd˝ p¯Ìkaz zabÌr· 8 byt˘ v tabulce
;posuÚ se na dalöÌ p¯Ìkaz
;pokraËuj v hled·nÌ p¯Ìkazu v tabulce
Sem se jde, pokud nebyl dan˝ p¯Ìkaz nalezen. MusÌ se vytisknout chybovÈ hl·öenÌ a ¯ÌzenÌ se vracÌ zpÏt do ZX
ROM. Nejd¯Ìve se provedou z·kladnÌ operace v ZX ROM, potom se ¯ÌzenÌ vr·tÌ do ROM D40, kde se tiskne
poûadovanÈ hl·öenÌ MDOSu a ¯ÌzenÌ se vr·tÌ zpÏt do ZX ROM. Pokud se jedn· o chybu ZX ROM, vracÌ se ¯ÌzenÌ zpÏt
do ZX ROM o nÏco d¯Ìve pro tisk chyby ZX ROM.
02A3 NOCOM
PUSH BC
02A4
02A7
LD HL, #000B
PUSH HL
;uloû si adresu uloûenÌ chyby (p¯i chybÏ syntaxe to je
;n·vratov· adresa do ZX ROM, p¯i chybÏ v MDOSu to
;je ERR_NR)
;vracet se budeme na adresu #000B, abychom se
;nezacyklili a uloûÌme ji na z·sobnÌk
NynÌ otestujeme, jestli se p¯i chybÏ vracÌ ¯ÌzenÌ p¯Ìmo do BASICu na adresu #1303 nebo byla tato n·vratov·
adresa p¯eps·na (obsah adresy adresovanÈ promÏnnou ERR_SP). Pokud je adresa #1303 a je chyba MDOSu, tiskne
se hl·öenÌ na obrazovku a ¯ÌzenÌ se vracÌ zpÏt do BASICu. Pokud byla tato adresa p¯eps·na a doölo k chybÏ MDOSu
Komentovan˝ v˝pis MDOSu
27
nebo ZX ROM, vracÌ se ¯ÌzenÌ na tuto adresu bez toho, ûe by se tisklo jakÈkoliv hl·öenÌ. VyuûÌv· se pro ON ERROR
GOTO. Je t¯eba d·t pozor, ûe nedoölo k nulov·nÌ nÏkter˝ch d˘leûit˝ch systÈmov˝ch promÏnn˝ch MDOSu, kterÈ
mohou zp˘sobit dost z·vaûnÈ problÈmy (dokonce i chybn˝ z·pis na disketu).
02A8
02AB
02AC
02AD
02AE
LD
LD
INC
LD
EX
Nejd¯Ìve otestujeme, jestli
hl·öenÌ.
02AF
LD
02B2
AND
02B3
SBC
02B5
JR
02B7
EX
HL, (#5C3D) ERR_SP
E, (HL)
HL
D, (HL)
DE, HL
;adresa poloûky na z·sobnÌku p¯i chybÏ do HL
;do DE adresa, kam se sk·Ëe p¯i chybovÈm hl·öenÌ
;dej ji do HL
nÏkdo nep¯epsal n·vratovou adresu do BASICu, protoûe pouûÌv· oöet¯enÌ chybov˝ch
BC, #1303
A
HL, BC
NZ, #02C2, ERROR
DE, HL
;do BC adresu MAIN-4 v ZX ROM
;nuluj CY
;jsou adresy shodnÈ?
;ne → skoË na n·vrat do ZX ROM bez tisku ch. hl·öenÌ
;do HL dej adresu poloûky na z·sobnÌku p¯i chybÏ
NenÌ p¯eps·na n·vratov· adresa do BASICu, bude se tedy tisknout chybovÈ hl·öenÌ na obrazovku.
02B8
LD (HL), #00
;nuluj obsah adresy
02BA
DEC HL
02BB
LD (HL), #00
;po obslouûenÌ chyby v ZX ROM se ¯ÌzenÌ vracÌ na
;adresu #0000 pro obslouûenÌ chyby v MDOSu
02BD
LD HL, #3EF7 SYSFLAG
;do HL adresa kÛdu Ëinnosti
02C0
LD (HL), #45
;uloû kÛd Ëinnosti Ñv˝pis chybovÈho hl·öenÌì
02C2 ERROR
CALL #2536, DSKSTP
;zastav mechaniky
02C5
LD HL, (#5C5D) CH_ADD ;do HL adresa znaku pro dekÛdov·nÌ ñ nutnÈ pro n·vrat
;do ZX ROM
02C8
JP
#1700, STANDROM
;skoË na p¯estr·nkov·nÌ zpÏt do ZX ROM
Zde se pokraËuje po nalezenÌ p¯Ìkazu v tabulce. Je vyzvednuta adresa rutiny, kter· dan˝ p¯Ìkaz prov·dÌ a je
proveden skok na dan˝ podprogram.
02CB DOCOM
LD SP, (#5C3D) ERR_SP
;adresa poloûky na z·sobnÌku p¯i chybÏ do SP ñ
;vyËistÌme z·sobnÌk
02CF
LD HL, #1B76 STMT-RET ;do HL n·vratov· adresa do ZX ROM p¯i ukonËenÌ
;p¯Ìkazu MDOSu
02D2
PUSH HL
;uloû ji na z·sobnÌk
02D3
LD HL, #02E1 RETURN
;n·vratov· adresa z rutiny vykon·vajÌcÌ p¯Ìkaz MDOSu
02D6
PUSH HL
;uloû ji takÈ na z·sobnÌk
02D7
LD (#5C74), HL T_ADDR ;a zmÏÚ adresu dalöÌ poloûky v tabulce syntaxe
02DA
LD L, (IX+#06)
;vyzvedni adresu podprogramu vykon·vajÌcÌho
02DD
LD H, (IX+#07)
;p¯Ìkaz do HL
02E0
JP
(HL)
;skoË na dan˝ podprogram
RETURN
Tento podprogram zastavÌ mechaniky a p¯estr·nkuje do ZX ROM. VracÌ se zde ¯ÌzenÌ po vykon·nÌ p¯Ìkazu
MDOSu.
02E1 RETURN
02E4
28
CALL #2536, DSKSTP
JP
#1700, STANDROM
;vypni mechaniky
;p¯estr·nkuj zpÏt do ZX ROM
Komentovan˝ v˝pis MDOSu
SNAPR
Tento program slouûÌ k uloûenÌ SNAP souboru na disk. P¯i stisku tlaËÌtka SNAP je hardwarovÏ vnucena na adresu
#0066 instrukce RST #00. P¯i proch·zenÌ tabulky n·vratov˝ch adres se zjistÌ, ûe doölo k SNAPu (n·vratov· adresa
je #67). Snapov·nÌ je uloûenÌ obsahu pamÏti na disk do souboru s p¯Ìponou ÑSì. Velikost souboru je #C080 (49280)
byt˘. PoË·teËnÌ adresa je #3F80 (16256). Obsah pamÏti se nahr·v· i s obsahy vöech registr˘. Velice jednoduöe si
m˘ûete vyrobit sv˘j vlastnÌ snap programovÏ:
LD HL, n·vratov· adresa, kam se program vr·tÌ po provedenÌ snapu
PUSH HL
LD HL, #0067
PUSH HL
JP
#0000
Tento kr·tk˝ progr·mek v·m vytvo¯Ì na disketÏ snap soubor. Ale nynÌ jiû snap v ROM D40.
02E7 SNAPR
02EB
02EE
02EF
02F0
02F1
02F2
02F3
02F4
02F5
02F6
02F7
02F8
02FA
02FC
0300
0301
0303
0305
LD (#3FFE), SP SAVESP
LD SP, #3FFE SAVESP
PUSH AF
PUSH BC
PUSH DE
PUSH HL
EXX
EX AF, AFí
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH IY
LD BC, (#3EEC) IREG2
PUSH BC
IM
1
LD A, #FF
LD (#3EEE), A SNAPINF
;uloû hodnotu SP do SRAM
;nastav SP do oblasti, kam se postupnÏ uloûÌ obsahy
;vöech registr˘
;vËetnÏ druhÈ banky
;vyzvedni vektor p¯eruöenÌ a stav p¯eruöenÌ do BC
;a uloû ho na z·sobnÌk
;nastav reûim p¯eruöenÌ IM 1
;uloû informaci o tom, ûe se provadÌ SNAP
;na SNAPINF tedy uloûme nenulovou hodnotu
NastavÌme jmÈno disku, na kter˝ se bude ukl·dat snap a jmÈno souboru.
0308
LD HL, #3EAA ACDRIVE ;do HL adresa jmÈna drivu, kter˝ je aktu·lnÌ
030B
LD DE, #3E80 DNZONE1 ;do DE adresa 1. jmÈna disku pro I/O
030E
LD BC, #000A
;m· dÈlku 10 znak˘
0311
LDIR
;p¯enes jako jmÈno aktu·lnÌho disku
0313
LD HL, #03A4 SNAPNM
;adresa textu ÑSNAPSHOT00Sì v ROM D40 do HL
0316
LD DE, #3E8A FNZONE1 ;do DE adresa 1. jmÈna souboru pro I/O
0319
LD BC, #000B
;dÈlka je 11 byt˘
031C
LDIR
;p¯enes jako jmÈno pracovnÌho souboru
031E
LD A, (#3E61) SNPCOUNT ;vyzvedni poËÌtadlo snapshot˘ do A
0321
INC A
;zvyö o 1
0322
LD (#3E61), A SNPCOUNT ;uloû novou hodnotu do poËÌtadla
UpravÌme ËÌslo snapu na ASCII vyj·d¯enÌ pro uloûenÌ do jmÈna souboru
0325
DEC A
;uprav zpÏt na aktualnÌ ËÌslo
0326
LD B, #00
;do B d·me poËÌtadlo desÌtek
0328 DECLOP
SUB #0A
;odeËti od ËÌsla snapu 10
032A
JR
C, #032F, DECOK
;je zbytek < 10? ano → skoË
Komentovan˝ v˝pis MDOSu
29
032C
032D
032F DECOK
0331
0334
0335
0337
033A
033B
033E
INC
JR
ADD
LD
LD
ADD
LD
EI
LD
LD
B
#0328, DECLOP
A, #3A
(#3E93), A SNONMB2
A, B
A, #30
(#3E92), A SNONMB1
;zvyö desÌtky
;pokraËuj v p¯evodu
;p¯iËti zpÏt 10 a uprav na ASCII
;uloû do n·zvu souboru jako niûöÌ ËÌslici
;do A dej desÌtky
;a uprav je na ASCII
;uloû do n·zvu souboru jako vyööÌ ËÌslici
;povol p¯eruöenÌ
HL, #3F80
;poË·teËnÌ adresa dat ukl·dan˝ch na disk do HL
(#3E74), HL STARTADR ;a do hlaviËky
Provedeme z·pis souboru.
0341
LD DE, #C080
0344
CALL #1A00, SAVRUN
0347
CALL #2536, DSKSTP
;dÈlka ukl·dan˝ch dat je 49280 byt˘
;uloû soubor na disk
;vypni mechaniky
Provedeme n·vrat ze snapu. NenÌ celkem v po¯·dku, protoûe pokud jste pouûÌvali p¯eruöenÌ IM 1 a zmÏnili jste
hodnotu registru I (tzn. nenÌ #3F), je öpatnÏ nastaveno p¯eruöenÌ (mÌsto IM 1 je nastaveno IM 2) a poËÌtaË se ve vÏtöinÏ
p¯Ìpad˘ zhroutÌ. DalöÌ nedostatek je, ûe se neuchov·v· obsah registru R, takûe pokud je v programu test na jeho
obsah, p¯i nahr·v·nÌ snapu do pamÏti V·m nebude program fungovat. CelkovÈ ¯eöenÌ n·vratu ze snapu takÈ nenÌ
zrovna to pravÈ, protoûe k v˘li jednÈ instrukce mÌt kus programu dvakr·t je dost velk˝ p¯epych, kdyû je k dispozici
pamÏt SRAM. JistÏ by se to dalo ¯eöit elegantnÏji.
034A SNPRET
034D
034E
0351
0352
0355
0356
CALL #2536, DSKSTP
DI
LD SP, #3FE8 SVREG
XOR A
LD (#3EEE), A SNAPINF
POP AF
JP
PE, #0376, SNPRT1
P¯i snapu bylo zak·zanÈ p¯eruöenÌ.
0359
LD I, A
035B
CP
#3F
035D
JR
Z, #0361, NOIM2
035F
IM
2
0361 NOIM2
POP IY
0363
POP IX
0365
POP HL
0366
POP DE
0367
POP BC
0368
POP AF
0369
EX AF, AFí
036A
EXX
036B
POP HL
036C
POP DE
036D
POP BC
036E
POP AF
036F
LD SP, (#3FFE) SAVESP
0373
JP
#1700, STANDROM
30
;vypni mechaniky
;zakaû p¯eruöenÌ
;nastav z·sobnÌk pro obnovenÌ registr˘
;informace o ukonËenÌ snapu
;uloû na SNAPINF
;Ëti stav a mÛd p¯eruöenÌ
;bylo povolenÈ p¯eruöenÌ? ano → skoË
;obnov I registr
;byl nastaven na #3F (p¯eruöenÌ IM 1)?
;ano → p¯eskoË zmÏnu reûimu p¯eruöenÌ
;nastav reûim IM 2
;obnov registry procesoru z druhÈ banky
;a teÔ z prvnÌ banky
;obnov nastavenÌ z·sobnÌku
;skoË na p¯estr·nkov·nÌ zpÏt do ZX ROM a n·vrat do
;p¯eruöenÈho programu
Komentovan˝ v˝pis MDOSu
P¯i snapu bylo povolenÈ p¯eruöenÌ.
0376 SNPTR1
LD I, A
0378
CP
#3F
037A
JR
Z, #037E, NOIM21
037C
IM
2
037E NOIM21
POP IY
0380
POP IX
0382
POP HL
0383
POP DE
0384
POP BC
0385
POP AF
0386
EX AF, AFí
0387
EXX
0388
POP HL
0389
POP DE
038A
POP BC
038B
POP AF
038C
LD SP, (#3FFE) SAVESP
0390
EI
0391
JP
#1700, STANDROM
;obnov I registr
;byl nastaven na #3F (IM 1)?
;ano → p¯eskoË zmÏnu reûimu p¯eruöenÌ
;nastav mÛd IM 2
;obnov registry procesoru z druhÈ banky
;a teÔ z prvnÌ banky
;obnov nastavenÌ z·sobnÌku
;povol p¯eruöenÌ
;skoË na p¯estr·nkov·nÌ zpÏt do ZX ROM a n·vrat do
;p¯eruöenÈho programu
SNPLOA
Tento program n·m nat·hne snap do pamÏti. JmÈno snapu je ve FNZONE1.
IN:
jmÈno snapu ve FNZONE1
OUT: nataûenÌ a spuötÏnÌ snapu
0394 SNPLOA
0397
039B
039E
03A1
LD SP, #3F80
LD IX, #3F80
LD DE, #C080
CALL #19AE, LOABLK
JP
#034A, SNPRET
;nastav zasobnik pod prvnÌ byte snapu
;do IX poË·teËnÌ adresa dat
;dÈlka dat je 49280 bytu
;naËti soubor
;skoË na spuötÏnÌ snapu p¯es n·vrat ze snapu
SNAPNM
Text ÑSNAPSHOT00Sì.
03A4 SNAPNM
53 4E 41 50 53 48 4F 54 30 30 53
;SNAPSHOT00S
SYSMSG
Tabulka text˘ chybov˝ch hl·öenÌ pro MDOS. ZaËÌn· invertovan˝m znakem (#AA) a kaûdÈ hl·öenÌ konËÌ
invertovan˝m znakem. Hl·öenÌ 0-R jsou hl·öenÌ ZX ROM, byty #AA slouûÌ na doplnÏnÌ pro v˝poËet hl·öenÌ
MDOSu.
03AF SYSMSG
03B0
03B8
03C0
03C8
DB #AA
AA AA AA AA AA AA AA AA
AA AA AA AA AA AA AA AA
AA AA AA AA AA AA AA AA
AA AA AA AA
;invertovan˝ znak
03CC REP-S
03DA REP-T
03E5 REP-U
46 69 6C 65 20 6E 6F 74 20 66 6F 75 6E E4
46 69 6C 65 20 65 78 69 73 74 F3
44 69 73 6B 20 66 75 6C EC
;File not found
;File exists
;Disk full
Komentovan˝ v˝pis MDOSu
31
03EE REP-V
03FC REP-W
040C REP-X
041B REP-Y
042F REP-Z
44 69 72 65 63 74 6F 72 79 20 66 75 6C EC
41 64 76 61 6E 63 65 64 20 66 65 61 74 75 72 E5
42 61 64 20 64 65 76 69 63 65 20 74 79 70 E5
44 65 76 69 63 65 20 69 64 65 6E 74 20 6D 69 73
73 69 6E E7
44 65 76 69 63 65 20 75 6E 61 76 61 69 6C 61 62
6C E5
Hodnoty #A0 vyplÚujÌ mezeru mezi ÑZì a Ñaì v kÛdu ASCII.
0441
A0 A0 A0 A0 A0 A0
0447 REP-a
44 65 76 69 63 65 20 49 2F 4F 20 65 72 72 6F F2
0457 REP-b
42 61 64 20 76 6F 6C 75 6D 65 20 6E 61 6D E5
0466 REP-c
42 61 64 20 66 69 6C 65 20 74 79 70 E5
0473 REP-d
56 6F 6C 75 6D 65 20 6E 6F 74 20 66 6F 75 6E E4
0483 REP-e
46 69 6C 65 20 69 73 20 72 65 61 64 20 70 72 6F 74
65 63 74 65 E4
0499 REP-f
46 69 6C 65 20 69 73 20 77 72 69 74 65 20 70 72 6F
74 65 63 74 65 E4
04B0 REP-g
46 69 6C 65 20 69 73 20 6E 6F 74 20 65 78 65 63 75
74 61 62 6C E5
04B6 REP-h
46 69 6C 65 20 69 73 20 64 65 6C 65 74 65 20 70 72
6F 74 65 63 74 65 E4
04DE REP-i
42 61 64 20 72 65 63 6F 72 64 20 6E 75 6D 62 65 F2
04EF REP-j
49 6D 70 6F 73 73 69 62 6C 65 20 74 6F 20 52 45 4E
41 4D C5
0503 REP-k
49 6D 70 6F 73 73 69 62 6C 65 20 74 6F 20 43 4F 50
D9
0515 REP-l
43 6F 72 72 75 70 74 65 64 20 46 41 54 20 73 74 72
75 63 74 75 72 E5
052C REP-m
53 74 72 65 61 6D 20 61 6C 72 65 61 64 79 20 6F 70
65 EE
053F REP-n
44 72 69 76 65 20 69 73 20 6E 6F 74 20 72 65 61 64
F9
0551 REP-o
53 65 65 6B 20 65 72 72 6F F2
055B REP-p
53 65 63 74 6F 72 20 6E 6F 74 20 66 6F 75 6E E4
056B REP-q
43 52 43 20 65 72 72 6F F2
0574 REP-r
44 69 73 6B 20 69 73 20 77 72 69 74 65 20 70 72 6F
74 65 63 74 65 E4
058B REP-s
49 6E 74 65 72 6E 61 6C 20 65 72 72 6F F2
0599 TEXT1
50 6C 65 61 73 65 20 69 6E 73 65 72 74 20 76 6F 6C
75 6D 65 20 23 8D
05B0 TEXT2
45 72 61 73 65 20 61 6C 6C 20 66 69 6C 65 73 20 BF
05B1 TEXT3
52 65 77 72 69 74 65 20 6F 6C 64 20 66 69 6C 65 20
BF
05D3 TEXT4
41 6C 6C 20 64 61 74 61 20 77 69 6C 6C 20 62 65 20
64 69 73 63 61 72 64 65 64 20 21 20 20 A0
05F2 REP-x
46 69 6C 65 20 74 6F 6F 20 6C 6F 6E E7
;Directory full
;Advanced feature
;Bad device type
;Device ident mis
;sing
;Device unavailab
;le
;Device I/O error
;Bad volume name
;Bad file type
;Volume not found
;File is read prot
;ected
;File is write pro
;tected
;File is not execu
;table
;File is delete pr
;otected
;Bad record number
;Impossible to REN
;AME
;Impossible to COP
;Y
;Corrupted FAT stru
;cture
;Stream already op
;en
;Drive is not read
;y
;Seek error
;Sector not found
;CRC error
;Disk is write pro
;tected
;Internal error
;Please insert vol
;ume /zde se vloûÌ jmÈno diskety/
;Erase all files?
;Rewrite old file?
;All data will be
;discarded!
;File too long
SYNTAB
NynÌ n·sleduje tabulka, podle kterÈ se rozliöuje, jak˝ p¯Ìkaz m· b˝t vykon·n. M· n·sledujÌcÌ strukturu:
DW adresa p¯Ìkazu v tabulce syntaxe v ZX ROM
DW n·vratov· adresa, odkud byl vol·n RST #08
32
Komentovan˝ v˝pis MDOSu
DW v˝öka z·sobnÌku p¯i vol·nÌ RST #08
DW adresa programu vykon·vajÌcÌ p¯Ìkaz
P¯Ìkaz CAT
05FF
0603
P¯Ìkaz CAT
0607
060B
P¯Ìkaz ERASE
060F
0613
P¯Ìkaz POKE
0617
061B
P¯Ìkaz MOVE
061F
0623
P¯Ìkaz MOVE
0627
062B
P¯Ìkaz FORMAT
062F
0633
P¯Ìkaz SAVE
0637
063B
P¯Ìkaz LOAD
063F
0643
P¯Ìkaz MERGE
0647
064B
P¯Ìkaz LET
064F
0653
P¯Ìkaz LIST
0657
065B
P¯Ìkaz LLIST
065F
0663
P¯Ìkaz READ
0667
066B
P¯Ìkaz RESTORE
066F
0673
P¯Ìkaz OPEN #
0677
067B
DW
DW
#1B15, #1726
#0002, #11DF
;REPORT O ÑInvalid streamì
DW
DW
#1B15, #1C8B
#0000, #11DF
;REPORT C ÑNonsense in BASICì
DW
DW
#1B12, #1726
#0002, #12D3
;REPORT O ÑInvalid streamì
DW
DW
#1AB2, #1C8B
#000A, #06C1
;REPORT C ÑNonsense in BASICì
DW
DW
#1B0E, #1726
#0002, #1A54
;REPORT O ÑInvalid streamì
DW
DW
#1B0C, #1C8B
#0004, #1306
;REPORT C ÑNonsense in BASICì
DW
DW
#1B08, #1726
#0002, #1320
;REPORT O ÑInvalid streamì
DW
DW
#1A00, #1C8B
#0008, #1701
;REPORT C ÑNonsense in BASICì
DW
DW
#1A01, #1C8B
#0008, #1704
;REPORT C ÑNonsense in BASICì
DW
DW
#1A03, #1C8B
#0008, #1707
;REPORT C ÑNonsense in BASICì
DW
DW
#1A7B, #1C8B
#0006, #06F0
;REPORT C ÑNonsense in BASICì
DW
DW
#1AAF, #1C8B
#0008, #086F
;REPORT C ÑNonsense in BASICì
DW
DW
#1ADD, #1C8B
#0008, #086F
;REPORT C ÑNonsense in BASICì
DW
DW
#1ACA, #1C8B
#0006, #0A50
;REPORT C ÑNonsense in BASICì
DW
DW
#1AD0, #1C8B
#000A, #0A4B
;REPORT C ÑNonsense in BASICì
DW
DW
#1B00, #1766
#0006, #0AC9
;REPORT F ÑInvalid file nameì
Komentovan˝ v˝pis MDOSu
33
P¯Ìkaz OPEN #
067F
0683
P¯Ìkaz OPEN #
0687
068B
P¯Ìkaz OPEN #
068F
0693
P¯Ìkaz CLOSE #
0697
069B
P¯Ìkaz CLOSE #
069F
06A3
P¯Ìkaz RUN
06A7
06AB
P¯Ìkaz PRINT
06AF
06B3
P¯Ìkaz LPRINT
06B7
06BB
06BF
DW
DW
#1B00, #1766
#0008, #0AC9
;REPORT F ÑInvalid file nameì
DW
DW
#1B00, #1C8B
#0000, #0BDB
;REPORT C ÑNonsense in BASICì
DW
DW
#1AFF, #1C8B
#0008, #0B7B
;REPORT C ÑNonsense in BASICì
DW
DW
#1B04, #1766
#0006, #0C14
;REPORT F ÑInvalid file nameì
DW
DW
#1B03, #1C8B
#0008, #0C2D
;REPORT C ÑNonsense in BASICì
DW
DW
#1AAC, #1BB1
#0000, #1139
;REPORT 0 ÑOKì
DW
DW
#1A9D, #1C8B
#000A, #07E5
;REPORT C ÑNonsense in BASICì
DW
DW
DW
#1ADA, #1C8B
#000A, #07E5
#0000
;REPORT C ÑNonsense in BASICì
;konec tabulky
NynÌ jsou podprogramy prov·dÏjÌcÌ p¯Ìkazy MDOSu.
POKE
P¯Ìkaz pro z·pis dat do SRAM. M˘ûe se zapisovat do 512-ti byt˘ od adresy #3E00.
Syntaxe:
POKE # adresa, byte
adresa je v rozsahu 0ñ511, je to relativnÌ hodnota
byte je v rozsahu 0ñ255 a je to hodnota, kter· se na danou adresu zapÌöe.
SlouûÌ k z·pisu hodnoty do pamÏti SRAM. P¯Ìkaz POKE pouûÌvejte jen v p¯Ìpadech, kdy zmÏnÏn· data
nezp˘sobÌ zhroucenÌ MDOSu. N·slednÏ m˘ûe dojÌt i k naruöenÌ dat na disketÏ.
Nejd¯Ìve zkontrolujeme znak Ñ#ì, jestli se nejedn· o chybu v klasickÈm p¯Ìkazu POKE BASICu ZX ROM.
06C1 POKE
06C2
06C4
RST
CP
JR
#18
Ñ#ì
Z, #06CB, HASHOK
;naËti aktu·lnÌ znak
;je to znak Ñ#ì?
;ano → v po¯·dku, skoË na pokraËov·nÌ
NenÌ to p¯Ìkaz POKE #, tiskne se hl·öenÌ a provede se n·vrat do ZX ROM.
06C6 REPORTC
LD A, #0B
;REPORT C ÑNonsense in BASICì
06C8
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
Budeme analyzovat parametry p¯Ìkazu POKE #.
06CB HASHOKRST #20
06CC
RST #28
06CD
DW #1C82
06CF
34
RST
#18
;naËti dalöÌ znak
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-NUM1 ohodnocenÌ ËÌselnÈho
;v˝razu ñ v z·sobnÌku kalkul·toru je teÔ uloûena adresa,
;kam se bude ukl·dat
;naËti aktu·lnÌ znak
Komentovan˝ v˝pis MDOSu
06D0
06D2
06D4
06D5
06D6
CP
JR
RST
RST
DW
Ñ,ì
NZ, #06C6, REPORTC
#20
#28
#1C82
06D8
CALL #1057, ISSYNCONTR
;je to Ë·rka?
;ne → skoË na REPORT C ÑNonsense in BASICì
;naËti dalöÌ znak
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-NUM1 ohodnocenÌ ËÌselnÈho
;v˝razu ñ v z·sobnÌku kalkul·toru je teÔ uloûena
;hodnota, kter· se bude ukl·dat do SRAM
;otestuj, jestli nenÌ kontrola syntaxe
Pokud se neprov·dÌ kontrola syntaxe, provedeme p¯Ìkaz. Nejd¯ive zkontrolujeme adresu, musÌ b˝t menöÌ neû
512. M˘ûeme totiû zapisovat jen do 512-ti byt˘.
06DB
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
06DC
DW #1E85
;podprogram TWO-PARAM vyzvednutÌ dvou hodnot
;ze z·sobnÌku kalkul·toru, BC=adresa, A=data
06DE
PUSH AF
;schovej si data
06DF
LD A, B
;dej B do A
06E0
CP
#02
;je adresa < 512?
06E2
JR
C, #06E9, NOOUT
;ano → v po¯·dku, skoË
Adresa je mimo povolen˝ rozsah.
06E4
LD A, #0A
06E6
JP
#0204, ERRR
;REPORT B ÑInteger out of rangeì
;piö hl·öenÌ a skoË do ZX ROM
VypoËteme adresu
06E9 NOOUT
06EA
06ED
06EE
06EF
;obnov data
;poË·teËnÌ adresa pro ukl·danÌ dat je #3E00 (15872)
;priËti relativnÌ posun (adresu) k HL
;uloû data do SRAM
;vraù se p¯es RETURN do ZX ROM
a uloûÌme data do pamÏti.
POP AF
LD HL, #3E00 DRPARZN
ADD HL, BC
LD (HL), A
RET
LET FN
P¯Ìkaz na zmÏnu jmÈna souboru. ZmÏnÌ p˘vodnÌ jmÈno souboru na novÈ. NemÏnÌ p¯Ìponu. Pokud existuje na
disketÏ soubor, kter˝ m· jmÈno stejnÈ jako je novÈ jmÈno souboru, p¯Ìkaz se neprovede a je hl·öena chyba.
Syntaxe:
LET FN ("StarÈJmÈnoSouboru")="NovÈJmÈnoSouboru"
LET ATTR
P¯Ìkaz na zmÏnu atribut˘ u vybranÈ skupiny soubor˘. ZmÏnÌ u vöech soubor˘, jejichû jmÈno a p¯Ìpona odpovÌd·
vloûenÈ masce, atributy.
Syntaxe:
LET ATTR("MaskaSouboru")="Atributy"
Oba tyto p¯Ìkazy majÌ stejn˝ vstupnÌ bod do programu. »·st programu pro kontrolu syntaxe majÌ spoleËnou.
Podle FN/ATTR se potom urËÌ, co se bude prov·dÏt.
06F0 LETFNATTR
06F1
06F3
06F6
06F8
06FA
06FD
RST
CP
LD
JR
CP
LD
JR
NenÌ to û·dn˝ z nich.
06FF GOREPC
JP
#18
#AB
HL, #0723 LETATTR
Z, #0702, SELLET
#A8
HL, #0778 LETFN
Z, #0702, SELLET
;naËti aktu·lnÌ znak
;je poûadov·no ATTR?
;do HL adresa obsluûnÈ rutiny pro LET ATTR
;ano → skoË
;je poûadov·no FN?
;do HL adresa obsluûnÈ rutiny pro LET FN
;ano → skoË
#06C6, REPORTC
;skoË na REPORT C ÑNonese in BASICì
Komentovan˝ v˝pis MDOSu
35
TeÔ je spoleËn· Ë·st programu pro vyzvednutÌ parametr˘ obou p¯Ìkaz˘.
0702 SELLLET
LD (#3E78), HL VALSYX
;uloû si adresu rutiny obsluhy p¯Ìkazu
0705
RST #20
;naËti dalöÌ znak
0706
CP
Ñ(ì
;je to lev· z·vorka?
0708
JR
NZ, #06FF, GOREPC
;ne → skoË na REPORT C ÑNonsense in BASICì
070A
RST #20
;naËti dalöÌ znak
070B
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
070C
DW #1C8C
;podprogram EXPT-EXP vyhodnocenÌ ¯etÏzce
;je vyzvednuto 1. jmÈno souboru
070E
RST #18
;naËti aktu·lnÌ znak
070F
CP
Ñ)ì
;je to prav· z·vorka?
0711
JR
NZ, #06FF, GOREPC
;ne → skoË na REPORT C ÑNonsense in BASICì
0713
RST #20
;naËti dalöÌ znak
0714
CP
Ñ=ì
;je to rovnÌtko?
0716
JR
NZ, #06FF, GOREPC
;ne → skoË na REPORT C ÑNonsense in BASICì
0718
RST #20
;naËti dalöÌ znak
0719
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
071A
DW #1C8C
;podprogram EXPT-EXP vyhodnocenÌ ¯etÏzce
;je vyzvednuto buÔ jmÈno souboru nebo atributy
071C
CALL #1057, ISSYNCONTR ;otestuj, jestli nenÌ kontrola syntaxe
Pokud se neprov·dÌ kontrola syntaxe, provedem p¯Ìkaz.
071F
LD HL, (#3E78) VALSYX
;adresa obsluûnÈ rutiny p¯Ìkazu do HL
0722
JP
(HL)
;skoË na danou obsluûnou rutinu
LET ATTR
Zde se jiû zajiöùuje provedenÌ p¯Ìkazu LET ATTR. V z·sobnÌku kalkul·toru jsou na vrcholu parametry uloûenÌ
¯etÏzce atribut˘ a pod nimi jsou uloûeny parametry ¯etÏzce jmÈna souboru.
0723 LETATTR
0724
RST
DW
#28
#2BF1
0726
0727
0728
072A
072B
072D
072E
072F
LD
AND
JR
LD
LD
LD
AND
JR
A, B
A
NZ, #0743, REPORTA
B, C
C, #00
A, B
A
Z, #074E, ATRNAME
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram STK-FETCH vyzvednutÌ 5 byt˘ ze
;z·sobnÌku, kterÈ tvo¯Ì parametry ¯etÏzce atribut˘
;dej do A hornÌ byte dÈlky atribut˘
;je ¯etÏzec atribut˘ dlouh˝?
;ano → skoË na REPORT A ÑInvalid argumentì
;do B dej niûöÌ byte dÈlky ¯etÏzce atribut˘
;na zaË·tku nebude û·dn˝ atribut
;dÈlka ¯etÏzce atribut˘ do A
;je nulov·?
;ano → skoË na zpracov·nÌ jmÈna souboru s tÌm,
;ûe nejsou û·dnÈ atributy (v A je 0)
Protoûe byly zad·ny atributy, zjistÌme, kterÈ byly vloûeny a kterÈ z nich jsou definov·ny v tabulce atribut˘. Na
zaË·tku je v C nula, coû znamen·, ûe û·dn˝ atribut nenÌ vloûen.
0731 ANALATR
LD HL, #127B DEFATTR ;do HL adresa tabulky atribut˘ souboru v ROM D40
0734
LD A, (DE)
;vyzvedni prvnÌ atribut z ¯etÏzce
0735
AND #DF
;p¯eveÔ na velk· pÌsmena
0737
INC DE
;posuÚ ukazatel na dalöÌ atribut v ¯etÏzci
0738
PUSH DE
;uloû ukazatel
0739
LD E, #80
;do E d·me %10000000
36
Komentovan˝ v˝pis MDOSu
ProhlÈdneme tabulku definovan˝ch atribut˘ a rotujeme obsahem E, kde bude uloûen v p¯ÌpadÏ nalezenÌ bitovÈ
umÌstÏnÌ danÈho atributu.
073B RFINDATR
CP
(HL)
;je definov·n takov˝ atribut v tabulce?
073C
INC HL
;posuÚ se na dalöÌ v tabulce
073D
JR
Z, #0748, SETATR
;je definov·n → skoË na za¯azenÌ
073F
RRC E
;posuÚ se na dalöÌ bit
0741
JR
NC, #073B, RFINDATR ;nenÌ poslednÌ → opakuj pro dalöÌ
Atribut nenÌ definov·n v tabulce.
0743 REPORTA
LD A, #09
0745
JP
#0204, ERRR
;REPORT A ÑInvalid argumentì
;piö hl·öenÌ a skoË do ZX ROM
Kdyû ho najdeme, p¯id·me ho do C jako bit v E.
0748 SETATR
LD A, C
;do A dej prozatÌmnÌ atributy
0749
OR E
;p¯idej nalezen˝ atribut
074A
LD C, A
;uschovej prozatÌmnÌ atributy do C
074B
POP DE
;obnov ukazatel na ¯etÏzec
074C
DJNZ #0731, ANALATR
;opakuj B-kr·t
NynÌ provedeme anal˝zu ¯etÏzce v z·sobnÌku. V A jsou uloûeny novÈ atributy, kterÈ bude mÌt dan˝ soubor.
074E ATRNAME
EX AF, AFí
;uloû si novÈ atributy do druhÈ banky
074F
CALL #0FCF, DIVSTRING
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
0752
CALL #0F9E, TESTNM
;otestuj, jestli bylo zad·no jmÈno souboru
0755
CALL #107C, ARRANGNM
;uprav jmÈno souboru ve FNZONE1 na masku
Najdeme a rozbÏhneme mechaniku se jmÈnem v DNZONE1.
0758
CALL #1043, SETWDNM
;nastav jmÈno disku v DNZONE1 pro I/O
075B
CALL #1C8F, SETACT
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
075E
CALL #212B, FIRSTMASK
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
0761
JP
NZ, #1FB1, REPORTS ;nenalezena → skoË na REPORT S ÑFile not foundì
0764 WATTR
EX AF, AFí
;vraù zpÏt atributy do A a uloû si ËÌslo poloûky
0765
PUSH HL
;uloû si ukazatel na poloûku v buferu adres·¯e
0766
EX (SP), IX
;dej ukazatel do IX
0768
LD (IX+#14), A
;zapiö atribut na mÌsto pro atributy v hlaviËce
076B
EX (SP), IX
;vraù zpÏt ukazatel
076D
POP HL
;do HL
076E
CALL #1E65, WSCADR
;zapiö sektor adres·¯e v buferu
0771
EX AF, AFí
;uloû si znovu atribut a do A ËÌslo poloûky, od kterÈ se
;bude pokraËovat v hled·nÌ dalöÌho souboru
0772
CALL #212D, NEXTMASK
;naËti dalöÌ poloûku adres·¯e vyhovujÌcÌ masce
;v FNZONE1
0775
RET NZ
;nenalezena → vraù se p¯es RETURN do ZX ROM
0776
JR
#0764, WATTR
;skoË na z·pis atributu a hled·nÌ dalöÌ poloûky
LET FN
Zde se zajiöùuje provedenÌ p¯Ìkazu LET FN. Na vrcholu z·sobnÌku kalkul·toru jsou parametry 2. jmÈna souboru
a pod nimi jsou parametry 1. jmÈna souboru.
0778 LETFN
CALL #07C9, ANSTRING
077B
CALL #1C8F, SETACT
;analyzuj 2. ¯etÏzec a nastav jmÈno disku a souboru do
;FNZONE1 a DNZONE1
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
Komentovan˝ v˝pis MDOSu
37
Nejd¯ive zjistÌme, jestli jiû na disketÏ neexistuje soubor se stejn˝m jmÈnem, jako je novÈ jmÈno souboru.
077E
CALL #212B, FIRSTMASK
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
0781
JR
NZ, #0788, NOEXIST ;nenaöel → skoË
TakovÈ jmÈno souboru, jako je novÈ jmÈno souboru, uû existuje.
0783
LD A, #1C
;REPORT T ÑFile existsì
0785
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
Schov·me si jmÈno disku a novÈ jmÈno souboru.
0788 NOEXIST
LD HL, #3E80 DNZONE1
078B
LD DE, #3E95 DNZONE2
078E
LD BC, #15
0791
LDIR
0793
CALL #07C9, ANSTRING
;do HL adresa 1. jmÈna disku pro I/O
;do DE adresa 2. jmÈna disku pro I/O
;dÈlka 21 byt˘
;uschovej si novÈ jmÈno souboru a jmÈno disku
;analyzuj 1. ¯etÏzec a nastav jmÈno disku a souboru do
;FNZONE1 a DNZONE1
Porovn·me p¯Ìpony, protoûe musÌ z˘stat stejnÈ.
0796
LD HL, #3E94 EXTE1
0799
LD A, (#3EA9) EXTE2
079C
CP
(HL)
079D
JR
Z, #07A4, EXTISSOME
;do HL adresa p¯Ìpony starÈho jmÈna souboru
;vyzvedni p¯Ìponu novÈho jmÈna souboru
;porovnej je se star˝m
;jsou stejnÈ → skoË
Jsou rozdÌlnÈ p¯Ìpony.
079F REPORTj
LD
07A1
JP
;REPORT j ÑImpossible to RENAMEì
;piö hl·öenÌ a skoË do ZX ROM
A, #32
#0204, ERRR
Porovn·me, jestli jsou shodnÈ jmÈna disk˘. MusÌ b˝t
souboru, kter˝ se nach·zÌ na jednÈ disketÏ.
07A4 EXTISSOME LD HL, #3E80 DNZONE1
07A7
LD DE, #3E95 DNZONE2
07AA
LD BC, #000A
07AD
CALL #1F0E, VERIFY
07B0
JR
NZ, #079F, REPORTj
07B2
07B5
07B8
07B9
07BC
07BF
07C0
07C2
07C5
07C8
CALL #212B, FIRSTMASK
JP
NZ, #1FB1, REPORTS
INC HL
LD DE, #3E9F FNZONE2
LD BC, #000A
EX DE, HL
LDIR
CALL #1E65, WSCADR
CALL #217B, ERAVAR
RET
stejn·, protoûe p¯Ìkaz LET FN slouûÌ pouze k p¯ejmenov·nÌ
;do HL adresa jmÈna prvnÌho disku
;do DE adresa jmÈna druhÈho disku
;10 byt˘
;teÔ je porovnej
;rozdÌlnÈ → skoË na REPORT j ÑImpossible to
;RENAMEì
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
;neexistuje → skoË na REPORT S ÑFile not foundì
;posuÚ se na jmÈno souboru v hlaviËe
;do DE adresa novÈho jmÈna souboru
;10 byt˘
;p¯ehoÔ ukazatele
;p¯esuÚ novÈ jmÈno do hlaviËky
;zapiö sektor adres·¯e v buferu
;vymaû pomocnÈ promÏnnÈ MDOSu
;vraù se p¯es RETURN do ZX ROM
ANSTRING
RozdÏlÌ a analyzuje ¯etÏzec na z·sobnÌku, nastavÌ disk se stejn˝m jmÈnem a upravÌ jmÈno souboru na masku.
Potom provede kontrolu p¯Ìpony a jestli nebyla vloûena, hl·sÌ chybu. Chyba se takÈ hl·sÌ, pokud bylo pouûito
wildchars.
IN:
parametry ¯etÏzce na vrcholu z·sobnÌku kalkul·toru
OUT: nastavenÌ disku a masky souboru do DNZONE1 a FNZONE1 a kontrola
p¯Ìpony
38
Komentovan˝ v˝pis MDOSu
07C9 ANSTRING
07CC
07CF
07D2
07D3
07D6
07D9
CALL #0FCF, DIVSTRING
CALL #1043, SETWDNM
CALL #10E2, ANALWDNM
INC A
JP
Z, #2337, REPORTX
CALL #107C, ARRANGNM
JP
C, #1019, REPORTF
07DC
07DF
07E1
LD
CP
JP
07E4
RET
A, (#3E94) EXTE1
Ñ?ì
Z, #1019, REPORTF
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
;nastav jmÈno disku v DNZONE1 pro I/O
;analyzuj jmÈno disku v DNZONE1
;bylo chybnÏ vloûeno jmÈno disku?
;ano → skoË na REPORT X ÑBad device typeì
;uprav jmÈno souboru v FNZONE1 na masku
;bylo pouûito wildchars → skoË na REPORT F ÑInvalid
;file nameì
;vyzvedni p¯Ìponu masky
;je to Ñ?ì?
;ano → skoË na REPORT F ÑInvalid file nameì, protoûe
;p¯Ìpona musÌ b˝t vloûena.
;vraù se
PRINT, LPRINT
P¯Ìkazy pro v˝pis obsahu sekvenËnÌho souboru na obrazovku nebo na tisk·rnu.
Syntaxe:
PRINT *"JmÈnoSouboru"
LPRINT *"JmÈnoSouboru"
UmoûÚuje vypisovat pouze soubory s p¯Ìponou ÑQì. VstupnÌ bod obou p¯Ìkaz˘ je stejn˝, liöÌ se otev¯en˝ kan·l.
07E5 L-PRINT
07E6
07E8
RST
CP
JP
#18
Ñ*ì
NZ, #06C6, REPORTC
Vyzvedneme a analyzujeme parametr p¯Ìkazu.
07EB
RST #20
07EC
RST #28
07ED
DW #1C8C
07EF
CALL #1057, ISSYNCONTR
;naËti aktu·lnÌ znak
;je to hvÏzdiËka?
;ne → skoË na REPORT C ÑNonsense in BASICì
;naËti dalöÌ znak
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-EXP vyhodnocenÌ ¯etÏzce ñ
;vyhodnotÌ vloûenÈ jmÈno disku a souboru
;otestuj, jestli nenÌ kontrola syntaxe
Pokud se neprov·dÌ kontrola syntaxe, provedeme p¯Ìkaz. Jako prvnÌ nastavÌme jmÈno disku a souboru.
07F2
CALL #0FCF, DIVSTRING
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
07F5
CALL #1043, SETWDNM
;nastav jmÈno disku v DNZONE1 pro I/O
07F8
CALL #10E2, ANALWDNM ;analyzuj jmÈno disku v DNZONE1
07FB
INC A
;bylo chybnÏ vloûeno jmÈno disku?
07FC
JP
Z, #2337, REPORTX
;ano → skoË na REPORT X ÑBad device typeì
07FF
CALL #107C, ARRANGNM
;uprav jmÈno souboru v FNZONE1 na masku
0802
JP
C, #1019, REPORTF
;bylo pouûito wildchars → skoË na REPORT F ÑInvalid
;file nameì
0805
JR
Z, #080F , LPSETEXT ;nebyla vloûena p¯Ìpona → skoË
Provedeme test p¯Ìpony na ÑQì.
0807
LD A, (#3E94) EXTE1
080A
CP
ÑQì
080C
JP
NZ, #1019, REPORTF
080F LPSETEXT
LD A, ìQì
0811
LD (#3E94), A EXTE1
0814
CALL #1C8F, SETACT
0817
081A
CALL #212B, FIRSTMASK
JP
NZ, #1FB1, REPORTS
;vyzvedni p¯Ìponu souboru do A
;je to ÑQì?
;ne → skoË na REPORT F ÑInvalid file nameì
;p¯Ìpona bude ÑQì
;uloû p¯Ìponu souboru do masky
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
;neexistuje → skoË na REPORT S ÑFile not foundì
Komentovan˝ v˝pis MDOSu
39
Zkontrolujeme, jestli soubor nenÌ chr·nÏn proti ËtenÌ.
081D
CALL #1283, GETATR
;vyzvedni atributy souboru
0820
BIT 3, A
;je READ PROTECTED?
0822
JP
Z, #1FBD, REPORTe
;ano → skoË na REPORT e ÑFile is read protectedì
0825
LD A, #11
;do A relativnÌ adresa uloûenÌ prvnÌho sektoru
;v hlaviËce souboru
0827
CALL #0FAD, ADDHLA
;p¯iËti k HL
082A
LD E, (HL)
;vyzvedni ËÌslo prvnÌho sektoru, ve kterÈm je uloûen
082B
INC HL
;soubor, do DE
082C
LD D, (HL)
082D
EX DE, HL
;p¯esuÚ ho do HL
NynÌ budeme naËÌtat sektor po sektoru a vypisovat jeho obsah. Toto je hlavnÌ vykon·vacÌ procedura. V registru
HL je ËÌslo prvnÌho sektoru souboru.
082E PRINTSEC
CALL #1CF1, GETWTEST
;naËti obsah poloûky ve FAT a otestuj chybu ve FAT
0831
LD A, D
;vyööÌ byte obsahu do A
0832
CP
#0C
;nulov· dÈlka souboru?
0834
RET Z
;ano → vraù se
0835
LD (#3E78), DE VALSYX
;uloû si obsah DE (ËÌslo dalöÌho sektoru)
0839
CALL #1DF9, LOGFYZ
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
083C
LD DE, #0101
;1 sektor, û·dnÈ opakov·nÌ
083F
LD HL, #3A00 AUXBUF
;do HL adresa bufferu
0842
CALL #22A2, BREADA
;naËti sektor
0845
LD DE, (#3E78) VALSYX
;vyzvedni zpÏt obsah poloûky do DE
0849
LD A, D
;vyööÌ byte do A
084A
CP
#0E
;poslednÌ sektor?
084C
JR
C, #0854, PRINTALL
;ne → skoË
084E
AND #01
;ponech bit pro zjiötÏnÌ poËtu byt˘ v sektoru
0850
LD D, A
;dej zpÏt do D
0851
OR E
;je menöÌ neû 512 byt˘?
0852
JR
NZ, #0857, PRINTBUFF ;ano → skoË
0854 PRINTALL
LD DE, #0200
;tisknu cel˝ sektor ñ dÈlka 512 byt˘
0857 PRINTBUFF LD HL, #3A00 AUXBUF
;poË·teËnÌ adresa bufferu do HL
VypÌöeme ze sektoru DE byt˘.
085A PRNTLOOP PUSH DE
;uloû si poËet tisknut˝ch byt˘
085B
PUSH HL
;uloû si ukazatel v bufferu
085C
LD A, (HL)
;vyzvedni znak
085D
RST #10
;vytiskni ho
085E
POP HL
;obnov ukazatele do bufferu
085F
POP DE
;a ËÌtaË
0860
INC HL
;posuÚ se na dalöÌ znak
0861
DEC DE
;sniû ËÌtaË o jedniËku
0862
LD A, D
;uû jsi vypsal cel˝ buffer?
0863
OR E
0864
JR
NZ, #085A, PRNTLOOP ;ne → opakuj
0866
LD HL, (#3E78) VALSYX
;vyzvedni obsah poslednÏ ËtenÈ poloûky do HL
0869
LD A, H
;dej vyööÌ byte do A
086A
CP
#0E
;byl to poslednÌ sektor?
086C
RET NC
;ano → vraù se p¯es RETURN do ZX ROM
086D
JR
#082E, PRINTSEC
;skoË na tisk dalöÌho sektoru
40
Komentovan˝ v˝pis MDOSu
LIST, LLIST
P¯Ìkazy pro v˝pis informacÌ o poËÌtaËovÈ sestavÏ (verzi operaËnÌho systÈmu MDOS, kolik je p¯ipojeno mechanik,
jmÈna driv˘, kter˝ drive je aktu·lnÌ, kolik je volnÈ pamÏti, dÈlka promÏnn˝ch, dÈlka BASIC programu hodnota
RAMPTOP)
Syntaxe:
LIST *
LLIST *
Vstup tÏchto p¯Ìkaz˘ je stejn˝, liöÌ se pouze otev¯en˝ kan·l.
086F L-LIST
0870
0872
0875
0876
RST #18
CP
Ñ*ì
JP
NZ, #06C6, REPORTC
RST #20
CALL #1057, ISSYNCONTR
;vezmi aktu·lnÌ znak
;je to hvÏzdiËka?
;ne → skoË na REPORT C ÑNonsense in BASICì
;vezmi dalöÌ znak
;otestuj, jestli nenÌ kontrola syntaxe
Pokud nenÌ kontrola syntaxe, provedeme p¯Ìkaz. Toto je hlavnÌ prov·dÏcÌ procedura.
0879
LD A, #0D
;nov˝ ¯·dek
087B
RST #10
;tiskni
087C
XOR A
;poloûka 0 ñ ÑMDOS Release: 1.0 (17-May-91) ©
;Didaktik Skalica 1991ì
087D
LD DE, #0971 INFMES
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
0880
CALL #01C8, PRTMES
;vypiö poloûku textu
0883
LD A, #1
;poloûka 1 ñ ÑDrives defined:ì
0885
LD DE, #0971 INFMES
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
0888
CALL #01C8, PRTMES
;vypiö poloûku textu
088B
LD A, ÑAì
;zaËÌn· se mechanikou A
088D
LD IX, #3E00 DRPARZN
;do IX zaË·tek tabulek parametr˘ mechanik
Vytiskneme vöechny mechaniky, kterÈ lze p¯ipojit.
0891 RINFO2
PUSH IX
0893
PUSH AF
0894
LD A, (IX+#02)
0897
AND A
0898
JR
Z, #08A5, RINFO1
089A
POP AF
089B
PUSH AF
089C
RST #10
089D
LD A, #02
089F
LD DE, #0971 INFMES
08A2
CALL #01C8, PRTMES
08A5 RINFO1
POP AF
08A6
POP IX
08A8
LD DE, #000C
08AB
ADD IX, DE
08AD
INC A
08AE
CP
ÑEì
08B0
JR
C, #0891, RINFO2
08B2
LD A, #03
0894
LD DE, #0971 INFMES
0897
CALL #01C8, PRTMES
089A
LD A, ÑAì
089C
LD IX, #3E00 DRPARZN
;uloû si ukazatel na tabulku parametr˘
;uloû si mechaniku
;je definov·na mechanika?
;ne → skoË
;obnov ASCII kÛd drivu
;a znovu ho uloû
;piö oznaËenÌ mechaniky
;poloûka 2 ñ Ñ :, ì
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
;vypiö poloûku textu
;obnov si ASCII kÛd drivu
;obnov si ukazatel na tabulky parametr˘ mechanik
;posuÚ se na parametry dalöÌ mechaniky
;posuÚ se na dalöÌ mechaniku
;uû byly zkontrolov·ny vöechny Ëty¯i mechaniky?
;ne → opakuj
;poloûka 3 ñ Ñ Drives instaled:ì
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
;vypiö poloûku textu
;zaËÌn· se mechanikou A
;do IX zaË·tek tabulek parametr˘ mechanik
Komentovan˝ v˝pis MDOSu
41
Vytiskneme vöechny p¯ipojenÈ mechaniky.
08C0 RINFO4
PUSH IX
08C2
PUSH AF
08C3
BIT 0, (IX+#00)
08C7
JR
Z, #08D4, RINFO3
08C9
POP AF
08CA
PUSH AF
08CB
RST #10
08CC
LD A, #02
08CE
LD DE, #0971 INFMES
08D1
CALL #01C8, PRTMES
08D4 RINFO3
POP AF
08D5
POP IX
08D7
LD DE, #000C
08DA
ADD IX, DE
08DC
INC A
08DD
CP
ÑEì
08DF
JR
C, #08C0, RINFO4
08E1
LD A, #04
08E3
LD DE, #0971 INFMES
08E6
CALL #01C8, PRTMES
;uloû si ukazatel na tabulky parametr˘
;a ASCII kÛd drivu
;je drive p¯ipojen?
;nenÌ → skoË
;obnov ASCII kÛd drivu
;a zase ho uloû
;tiskni oznaËenÌ mechaniky
;poloûka 2 ñ Ñ :, ì
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
;vypiö poloûku textu
;obnov si ASCII kÛd drivu
;a ukazatel na tabulky parametr˘ mechanik
;posuÚ se na parametry dalöÌ mechaniky
;a posuÚ se na dalöÌ mechaniku
;uû byly zkontrolov·ny vöechny Ëty¯i mechaniky?
;ne → skoË
;poloûka 4 ñ ÑCurrent Device:ì
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
;vypiö poloûku textu
Vytiskneme jmÈno drivu, kter˝ je nastaven jako aktu·lnÌ.
08E9
LD HL, #3EAA ACDRIVE ;do HL adresa jmÈna drivu, kter˝ je aktu·lnÌ
08EC
CALL #128D, PRTSTR
;vytiskni jmÈno
08EF
LD A, #05
;poloûka 5 ñ ÑVolumes available:ì
08F1
LD DE, #0971 INFMES
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
08F4
CALL #01C8, PRTMES
;vypiö poloûku textu
Vytiskneme jmÈna vöech p¯ipojen˝ch driv˘.
08F7
CALL #1F49, INITALLDR
08FA
LD B, #04
08FC
LD HL, #3E30 DRNAMES
08FF RINFO5
PUSH BC
0900
PUSH HL
0901
LD A, (HL)
0902
AND A
0903
JR
Z, #0913, RINFO6
0905
LD A, #20
0907
RST #10
0908
LD A, #20
090A
RST #10
090B
POP HL
090C
PUSH HL
090D
CALL #128D, PRTSTR
0910
LD A, #0D
0912
RST #10
0913 RINFO6
POP HL
0914
POP BC
0915
LD A, #0C
0917
CALL #0FAD, ADDHLA
091A
DJNZ #08FF, RINFO5
42
;naËti a nastav parametry vöech p¯ipojen˝ch driv˘
;maxim·lnÏ 4 disky
;do HL adresa uloûenÌ jmen driv˘
;uloû si poËÌtadlo
;a ukazatel na jmÈna disk˘
;vyzvedni prvnÌ znak jmÈna
;je jmÈno?
;nenÌ → skoË
;mezera
;tiskni
;mezera
;tiskni
;obnov ukazatel na jmÈna driv˘
;a zase ho uloû
;vytiskni jmÈno drivu
;nov˝ ¯·dek
;tiskni
;obnov ukazatel na jmÈna driv˘
;a obnov poËÌtadlo mechanik
;posuÚ ukazatel na dalöÌ jmÈno drivu
;opakuj B-kr·t
Komentovan˝ v˝pis MDOSu
Vytiskneme systÈmovÈ promÏnnÈ BASICu.
091C
LD A, #06
091E
LD DE, #0971 INFMES
0921
CALL #01C8, PRTMES
0924
LD HL, (#5C4B) VARS
0927
PUSH HL
0928
LD DE, (#5C53) PROG
092C
AND A
092D
SBC HL, DE
092F
LD C, L
0930
LD B, H
0931
CALL #0FA6, BCPRT
0934
LD A, #07
0936
LD DE, #0971 INFMES
0939
CALL #01C8, PRTMES
093C
LD HL, (#5C59) E_LINE
093F
POP DE
0940
AND A
0941
SBC HL, DE
0943
LD C, L
0944
LD B, H
0945
CALL #0FA6, BCPRT
0948
LD A, #08
094A
LD DE, #0971 INFMES
094D
CALL #01C8, PRTMES
0950
LD BC, (#5CB2) RAMTOP
0954
CALL #0FA6, BCPRT
0957
LD A, #09
0959
LD DE, #0971 INFMES
095C
CALL #01C8, PRTMES
095F
RST #28
0960
DW #1F1A
0962
LD HL, #FFFF
0965
AND A
0966
SBC HL, BC
0968
LD C, L
0969
LD B, H
096A
CALL #0FA6, BCPRT
096D
LD A, #0D
096F
RST #10
0970
RET
;poloûka 6 ñ ÑLength of Program:ì
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
;vypiö text poloûky
;do HL zaË·tek promÏnn˝ch
;uloû na z·sobnÌk
;do DE zaË·tek programu v BASICu
;nuluj CY
;v HL je dÈlka BASIC programu (VARS-PROG)
;dej ji do BC
;vypiö dÈlku BASIC programu
;poloûka 7 ñ ÑLength of Variables:ì
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
;vypiö text poloûky
;do HL adresa konce promÏnn˝ch
;obnov zaË·tek promÏnn˝ch
;nuluj CY
;do HL dÈlka promÏnn˝ch (E_LINE-VARS)
;dej ji do BC
;vypiö dÈlku promÏnn˝ch
;poloûka 8 ñ ÑTop of RAM:ì
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
;vypiö text poloûky
;do BC adresa poslednÌho byte pro BASIC
;vypiö hodnotu RAMTOPu
;poloûka 9 ñ ÑFree memory:ì
;do DE adresa tabulky text˘ p¯Ìkaz˘ LIST, LLIST
;vypiö text poloûky
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram FREE-MEM zjiötÏnÌ obsazenÈ pamÏti
;do HL 65535
;nuluj CY
;odeËti BC, v HL je velikost volnÈ pamÏti
;dej ji do BC
;piö volnou pamÏt
;nov˝ ¯·dek
;tiskni
;vraù se p¯es RETURN do ZX ROM
INFMES
Tabulka text˘ pro p¯Ìkazy LIST * a LLIST *. ZaËÌn· invertovan˝m znakem.
0971 INFMES
Poloûka 0
0972
DB
#80
;invertovan˝ znak
4D 44 4F 53 20 52 65 6C 65 61 73 65
3A 20 31 2E 30 20 28 31 37 2D 4D
61 79 2D 39 31 29 0D 28 43 29 20 44
69 64 61 6B 74 69 6B 20 53 6B 61 6C
69 63 61 20 31 39 39 31 0D 8D
;MDOS Release
;:1.0 (17-M
;ay-91) (C) D
;idaktik Skal
;ica 1991
Komentovan˝ v˝pis MDOSu
43
V opravenÈ verzi MDOSu 1.0 je zmÏnÏno hl·öenÌ na MDOS Release: 1.0 (01-Sep-92) (C) Didaktik Skalica
1992. Potom to vypad· takto:
0972
Poloûka 1
09AB
Poloûka 2
09BD
Poloûka 3
09C0
Poloûka 4
09D6
Poloûka 5
09EC
Poloûka 6
0A02
Poloûka 7
0A17
Poloûka 8
0A2D
Poloûka 9
0A3C
4D 44 4F 53 20 52 65 6C 65 61 73 65
3A 20 31 2E 30 20 28 30 31 2D 53
65 70 2D 39 32 29 0D 28 43 29 20 44
69 64 61 6B 74 69 6B 20 53 6B 61 6C
69 63 61 20 31 39 39 32 0D 8D
;MDOS Release
;:1.0 (01-S
;ep-92) (C) D
;idaktik Skal
;ica 1992
44 72 69 76 65 73 20 44 65 66 69 6E
65 64 20 20 3A A0
;Drives defin
;ed:
3A 2C A0
;:,
08 08 20 0D 44 72 69 76 65 73 20 49
6E 73 74 61 6C 6C 65 64 3A A0
;Drives I
;nstalled:
08 08 20 0D 43 75 72 72 65 6E 74 20
44 65 76 69 63 65 20 20 3A A0
;Current
;Device:
3A 0D 0D 56 6F 6C 75 6D 65 73 20
41 76 61 69 6C 61 62 6C 65 3A 8D
;: Volumes
;available:
4C 65 6E 67 74 68 20 6F 66 20 50 72
6F 67 72 61 6D 20 20 3A A0
;Lenght of Pr
;ogram:
0D 4C 65 6E 67 74 68 20 6F 66 20 56
61 72 69 61 62 6C 65 73 3A A0
;Lenght of V
;ariables:
0D 0D 54 6F 70 20 6F 66 20 52 41
4D 20 3A A0
;Top of RA
;M:
0D 46 72 65 65 20 6D 65 6D 6F 72 79
3A A0 A0
;Free memory
;:
RESTORE
P¯Ìkaz pro z·pis obsahu pamÏti do specifikovanÈho sektoru.
Syntaxe:
RESTORE *"Za¯ÌzenÌ nebo JmÈnoSouboru", sektor, adresa
ZapÌöe obsah pamÏti od adresy do logickÈho sektoru. Pokud se pouûije ÑZa¯ÌzenÌì, zaËÌn· logick˝ sektor od 1.
logickÈho sektoru na disketÏ a konËÌ poslednÌm p¯Ìstupn˝m sektorem na disketÏ (1. logick˝ sektor je 1. fyzick˝ sektor
na 0. stopÏ, 2. logick˝ sektor je 2. fyzick˝ sektor na 0. stopÏ atd.). Lze tak tedy zapsat na jakÈkoliv mÌsto diskety (pokud
je p¯ÌstupnÈ). Pokud se pouûije jmÈno souboru, zaËÌn· logick˝ sektor od prvnÌho sektoru uloûenÌ souboru na disketÏ
a konËÌ poslednÌm sektorem uloûenÌ souboru. Je to stezka souboru (1. logick˝ sektor je prvnÌ sektor uloûenÌ souboru,
2. logick˝ sektor je druh˝ sektor uloûenÌ souboru atd.).
0A4B RESTORE
0A4E
LD
JR
HL, #2296 BWRITE
#0A53, RRPRG
;adresa rutiny p¯Ìkazu WRITESECTOR
;jdi na spoleËnou Ë·st
READ
P¯Ìkaz pro naËtenÌ specifikovanÈho sektoru do pamÏti.
Syntaxe:
READ * "Za¯ÌzenÌ nebo JmÈnoSouboru", sektor, adresa
44
Komentovan˝ v˝pis MDOSu
NaËte logick˝ sektor z diskety do pamÏti na adresu. »ÌslovanÌ sektor˘ je stejnÈ jako u p¯Ìkazu RESTORE.
0A50 READ
LD
HL, #22A5 BREAD
;adresa rutiny p¯Ìkazu READSECTOR
Protoûe majÌ p¯Ìkazy RESTORE a READ stejnou syntaxi a liöÌ se pouze v tom, ûe p¯Ìkaz RESTORE zapisuje
a p¯Ìkaz READ Ëte, je jejich vykon·vacÌ program spoleËn˝. LiöÌ se pouze ve skoku na prov·dÏnou operaci ËtenÌ/z·pis
sektoru.
0A53 RRPRG
LD (#3E78), HL VALSYX
;uloû si adresu rutiny na dobu kontroly syntaxe
0A56
RST #18
;naËti aktu·lnÌ znak
0A57
CP
Ñ*ì
;je to hvÏzdiËka?
0A59 JMPREPC
JP
NZ, #06C6, REPORTC ;ne → skoË na REPORT C ÑNonsense in BASICì
Provedeme syntaktickou anal˝zu parametr˘ p¯Ìkazu. Jako prvnÌ to je jmÈno za¯ÌzenÌ nebo souboru.
0A5C
RST #20
;naËti dalöÌ znak
0A5D
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
0A5E
DW #1C8C
;podprogram EXPT-EXP vyhodnocenÌ ¯etÏzce ñ
;je vyzvednuto buÔ jmÈno souboru nebo za¯ÌzenÌ
0A60
LD B, #02
;budeme analyzovat dva parametry
Vyzvedneme dva parametry p¯Ìkazu. PrvnÌ je ËÌslo logickÈho sektoru a druhÈ je adresa uloûenÌ sektoru v pamÏti.
0A62 RRPRGPAR
PUSH BC
;uloû si ËÌtaË parametr˘
0A63
RST #18
;naËti aktu·lnÌ znak
0A64
CP
Ñ,ì
;je to Ë·rka?
0A66
JR
NZ, #0A59, JMPREPC ;ne → skoË na REPORT C ÑNonsense in BASICì
0A68
RST #20
;naËti dalöÌ znak
0A69
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
0A6A
DW #1C82
;podprogram EXPT-EXP vyhodnocenÌ ËÌselnÈho v˝razu
0A6C
POP BC
;obnov ËÌtaË parametr˘
0A6D
DJNZ #0A62, RRPRGPAR
;opakuj B-kr·t
0A6F
CALL #1057, ISSYNCONTR ;otestuj, jestli nenÌ kontrola syntaxe
NenÌ kontrola syntaxe, provedeme proto p¯Ìkaz.
0A72
RST #28
0A73
DW #1E99
0A75
0A79
0A7A
LD
RST
DW
(#3E7A), BC VALSYY
#28
#1E99
0A7C
0A7D
0A80
0A83
PUSH BC
CALL #0FCF, DIVSTRING
CALL #1043, SETWDNM
CALL #1C8F, SETACT
0A86
0A89
0A8A
LD A, (#3E8A) FNZONE1
AND A
JR
Z, #0AB4, RRINDISK
Budeme hledat logick˝ sektor souboru.
0A8C
CALL #107C, ARRANGNM
0A8F
JP
C, #1019, REPORTF
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram FIND-INT2 vyzvednutÌ ËÌsla do BC
;vyzvedni 2. parametr ñ adresu uloûenÌ
;uloû si ji do SRAM
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram FIND-INT2 vyzvednutÌ ËÌsla do BC
;vyzvedni 1. parametr ñ ËÌslo logickÈho sektoru
;uloû si ho na z·sobnÌk
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
;nastav jmÈno disku v DNZONE1 pro I/O
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
;p¯eËti prvnÌ znak jmÈna souboru v FNZONE1
;bylo vloûeno jmÈno?
;ne → skoË
;uprav jmÈno souboru v FNZONE1 na masku
;bylo pouûito wildchars → skoË na REPORT F ÑInvalid
;file nameì
Komentovan˝ v˝pis MDOSu
45
0A92
0A95
0A98
0A9A
0A9D
0A9E
0A9F
0AA0
0AA1
CALL #212B, FIRSTMASK
JP
NZ, #1FB1, REPORTS
LD A, #11
CALL #0FAD, ADDHLA
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
POP BC
NynÌ najdeme poûadovanÈ ËÌslo logickÈho sektoru
0AA2 RRFINDSC
LD A, B
0AA3
OR C
0AA4
JR
Z, #0AB5, RRFINDOK
0AA6
DEC BC
0AA7
CALL #1CF1, GETWTEST
0AAA
EX DE, HL
0AAB
BIT 3, H
0AAD
JR
Z, #0AA2, RRFINDSC
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
;neexistuje → skoË na REPORT S ÑFile not foundì
;posuÚ se na adresu uloûenÌ 1. sektoru
;vyzvedni do HL prvnÌ sektor uloûenÌ souboru
;ËÌslo hledanÈho logickÈho sektoru do BC
ve stezce souboru.
;uû byl nalezen?
;ano → skoË
;sniû poËÌtadlo o jedniËku
;naËti poloûku FAT a otestuj chybu ve FAT
;dej obsah do HL
;uû jsi na konci souboru?
;ne → skoË
Soubor nenÌ uloûen v tolika sektorech. Logick˝ sektor je tedy mimo rozsah.
0AAF
LD A, #31
;REPORT i ÑBad record numberì
0AB1
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
Je to logick˝ sektor drivu a ne souboru.
0AB4 RRINDISK
POP HL
;ËÌslo logickÈho sektoru do HL
NynÌ naËteme nebo zapÌöeme dan˝ sektor.
0AB5 RRFINDOK CALL #1DF9, LOGFYZ
0AB8
LD DE, #0100
0ABB
CALL #217B, ERAVAR
0ABE
LD A, (#3E6B) WORKDR
0AC1
LD HL, (#3E78) VALSYX
0AC4
PUSH HL
0AC5
LD HL, (#3E7A) VALSYY
0AC8
RET
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
;1 sektor, 255 opakov·nÌ
;vymaû pomocnÈ promÏnnÈ MDOSu
;do A drive, se kter˝m se pracuje
;dej adresu rutiny pro ËtenÌ nebo z·pis do HL
;a uloû ji na z·sobnÌk
;do HL dej adresu, kam zapisovat/ËÌst
;proveÔ operaci a vraù se p¯es RETURN do ZX ROM
SekvenËnÌ soubory
MDOS n·m poskytuje rozö̯enÌ pr·ce se sekvenËnÌmi soubory. UmoûÚuje p¯ipojit na kan·l soubor pro vstup dat
z nebo do kan·lu. K otev¯enÌ kan·lu slouûÌ p¯Ìkaz OPEN a k uzav¯enÌ p¯Ìkay CLOSE. Pro vstup a v˝stup do/z kan·lu
se pouûÌvajÌ klasickÈ p¯Ìkazy PRINT a INPUT.
P¯Ìkaz OPEN slouûÌ k otev¯enÌ kan·lu.
Syntaxe:
OPEN†#n,["JmÈnoSouboru1[.P¯ÌponaSouboru1]"][,"JmÈnoSouboru2[.P¯ÌponaSouboru2]"]
P¯Ìkaz otev¯e kan·l n. Soubor JmÈnoSouboru1 je p¯ipojen jako vstup do kan·lu a soubor JmÈnoSouboru2 jako
v˝stup z kan·lu. Takûe ze JmÈnoSouboru1 lze ËÌst a do JmÈnoSouboru2 lze zapisovat. Samoz¯ejmÏ si m˘ûeme
otev¯Ìt soubor jenom pro vstup nebo pro v˝stup. P¯i otev¯enÌ souboru pro vstup nebo v˝stup si MDOS vytvo¯Ì pro
kaûd˝ soubor bufer, p¯es kter˝ se dÏje veöker· komunikace. Do nÏj si vûdy buÔ nahr·v· sektor, pokud se jedn·
o vstupnÌ soubor, a Ëte z nÏj data. Aû dojde na konec buferu, naËte si dalöÌ sektor. Pokud se jedn· o v˝stupnÌ soubor,
data do nÏj zapisuje a aû je bufer pln˝, je zaps·n na disk a zapisuje se znovu od zaË·tku buferu. Bufer tedy tvo¯Ì jakousi
vyrovn·vacÌ pamÏt, kter· kdyû se zaplnÌ, je zaps·na na disk, nebo kdyû je pr·zdn·, je zaplnÏna z disku (caching).
Velikost buferu pro kaûd˝ soubor je 544 byt˘. Skl·d· se z hlaviËky (32 byt˘) a z oblasti pro uloûenÌ dat (512 byt˘).
46
Komentovan˝ v˝pis MDOSu
Struktura hlaviËky:
adresa rutiny pro z·pis znaku do kan·lu
2 byty
adresa rutiny pro ËtenÌ znaku z kan·lu
2 byty
kÛd kan·lu
1 byte
ËÌslo drivu, kde je uloûen soubor p¯ipojen˝ na kan·l
1 byte
jmÈno disku, kde je uloûen soubor p¯ipojen˝ na kan·l
12 byt˘
ËÌslo fyz. stopy a sektoru, kde je uloûena hlaviËka souboru v adres·¯i
2 byty
adresa uloûenÌ hlaviËky souboru v buferu adres·¯e
2 byty
dÈlka souboru
3 byty
ËÌslo sektoru, kter˝ se zrovna pouûÌv· jako poslednÌ sektor souboru
2 byty
poËet znak˘ ke ËtenÌ/zapsan˝ch
2 byty
ukazatel na aktu·lnÌ pozici v buferu
2 byty
nevyuûito
1 byte
Bufery se ukl·dajÌ za systÈmovÈ promÏnnÈ BASICu p¯ed zaË·tek BASIC programu. Pokud budete chtÌt otev¯Ìt
soubor se jmÈnem ÑKì, ÑPì nebo ÑSì a bude bez p¯Ìpony, tak to nep˘jde (obejÌt se to d· p¯id·nÌm p¯Ìpony, aby nebyl
n·zev souboru dlouh˝ jeden znak, protoûe jsou tyto kÛdy rezervov·ny). Je taky nebezpeËnÈ p¯ipojovat soubor na
kan·l 0, protoûe p¯i vol·nÌ chybovÈho hl·öenÌ (chyby nebo hl·öenÌ OK) nebo editoru je adresa kan·lu 0 ÑtvrdÏì
p¯eps·na, takûe se ztratÌ ukazatel na bufer a soubor uû bude nep¯Ìstupn˝. D·le nejde p¯esmÏrovat v˝stup p¯Ìkaz˘
MDOSu do kan·lu v d˘sledku struktury MDOSu.
P¯Ìkaz CLOSE slouûÌ k uzav¯enÌ kan·lu.
Syntaxe:
CLOSE #n
P¯Ìkaz uzav¯e kan·l n. Pokud byl na tento kan·l p¯ipojen soubor pro v˝stup, je jeho bufer uloûen na disk jako
poslednÌ sektor souboru.
OPENIN
VstupnÌ bod, pokud chceme p¯ipojit na kan·l soubor pro vstup (ËtenÌ).
0AC9 OPENINPUT
0ACC
0ACF
0AD0
0AD3
0AD4
LD
LD
ADD
LD
RST
DW
HL, (#5C65) STKEND
DE, #000A
HL, DE
(#5C65), HL STKEND
#28
#171E
;vezmi adresu konce z·sobnÌku kalkul·toru
;o 10 byt˘
;posuÚ konec z·sobnÌku kalkul·toru
;uloû nov˝ konec z·sobnÌku kalkul·toru
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram STR-DATA vyzvedni data pro ËÌslo
;proudu, kterÈ je na z·sobnÌku kalkul·toru
ZjistÌme, jestli uû dan˝ kan·l nenÌ otev¯en.
0AD6
LD (#3E78), HL VALSYX
;uloû si adresu kan·lu v oblasti proudov˝ch dat
0AD9
LD A, B
;je kan·l otev¯en?
0ADA
OR C
0ADB
JR
Z, #0AEB, STRNOOPEN;ne → skoË na otev¯enÌ
0ADD
LD A, B
;do A vyööÌ byte posunu
0ADE
AND A
;uû mu byl p¯i¯azen nÏjak˝ soubor?
0ADF
JR
NZ, REPORTm
;ano → skoË na REPORT m ÑStream already openì
0AE1
LD A, C
;do A niûöÌ byte posunu
0AE2
CP
#11
;byl uû mu p¯i¯azen nÏkter˝ z kan·l˘ ÑKì, ÑSì, ÑRì, ÑPì?
0AE4
JR
C, #0AEB, STRNOOPEN;ano → skoË
Na kan·l uû byl p¯ipojen jin˝ soubor.
0AE6 REPORTm
LD A, #35
0AE8
JP
#0204, ERRR
;REPORT m ÑStream already openì
;piö hl·öenÌ a skoË do ZX ROM
Komentovan˝ v˝pis MDOSu
47
Otev¯e soubor pro
0AEB STRNOOPEN
0AEE
0AF0
ËtenÌ
CALL #0D14, ANAOPENM
PUSH IX
CALL #0DB5, SETSTRNM
0AF3
CALL #1C8F, SETACT
0AF6
0AF9
CALL #212B, FIRSTMASK
JP
NZ, #1FB1, REPORTS
Otestujeme, jestli soubor nenÌ chr·nÏn proti ËtenÌ.
0AFC
CALL #1283, GETATR
0AFF
BIT 3, A
0B01
JP
Z, #1FBD, REPORTe
;rozloû ¯etÏzec na z·sobnÌku na jmÈno souboru a disku
;uloû si IX
;nastav jmÈno disku v DNZONE1 a otestuj p¯Ìponu
;souboru na ÑBì a ÑQì a pouûitÌ wildchars
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
;nenaöel → skoË na REPORT S ÑFile not foundì
;vyzvedni atributy souboru
;je READ PROTECTED?
;ano → skoË na REPORT e ÑFile is read protectedì
NynÌ si vytvo¯Ìme bufer v RAM a nastavÌme kan·lovÈ informace otevÌranÈho kan·lu.
0B04
PUSH HL
;uloû si adresu poloûky v buferu adres·¯e
0B05
CALL #0D6F, MAKE544B
;vytvo¯ si volnÈ mÌsto pro bufer danÈho kan·lu
0B08
PUSH HL
;uloû si zaË·tek buferu
0B09
CALL #0D21, SETSTRBUF
;vypoËti offset buferu a uloû ho od tabulky informacÌ
;o kan·lech
0B0C
POP HL
;obnov adresu zaË·tku buferu
0B0D
LD (#3E7A), HL VALSYY
;uloû si zaË·tek buferu
Budeme vytv·¯et hlaviËku buferu. Nejd¯Ìve si uloûÌme adresy rutin pro v˝stup a vstup a kÛd kan·lu.
0B10
LD DE, #15C4
;do DE adresa rutiny pro z·pis znaku
Protoûe je tento soubor otev¯en pouze pro ËtenÌ, je p¯i pokusu o z·pis vyvol·no chybovÈ hl·öenÌ na adrese #15C4
v ZX ROM.
0B13
CALL #0D67, LD(HL)DE
;uloû do hlaviËky buferu
0B16
LD DE, #22C2
;do DE adresa rutiny pro naËtenÌ znaku
Na tÈto adrese je v ZX ROM p¯Ìkaz RST #0, kter˝ vyvol· p¯estr·nkov·nÌ do ROM D40, kde se podle n·vratovÈ
adresy urËÌ, ûe je vol·na rutina pro ËtenÌ znaku z kan·lu.
0B19
CALL #0D67, LD(HL)DE
;uloû do hlaviËky buferu
0B1C
LD A, #EB
;do A kÛd n·zvu kan·lu ñ urËuje, ûe je p¯ipojen soubor
0B1E
CALL #0D6C, LD(HL)A
;uloû do hlaviËky buferu
NynÌ nastavÌme informace o souboru.
0B21 MAKEHBUF LD A, (#3E6B) WORKDR
0B24
CALL #0D6C, LD(HL)A
0B27
EX DE, HL
0B28
PUSH IX
0B2A
POP HL
0B2B
LD A, #30
0B2D
CALL #0FAD, ADDHLA
0B30
LD BC, #000C
0B33
LDIR
0B35
EX DE, HL
0B36
LD DE, (#3E6F) ADRSCTR
48
;do A drive, se kter˝m se pracuje
;uloû ËÌslo drive do hlaviËky buferu
;do DE ukazatel do hlaviËky buferu
;do HL adresu parametr˘ drivu z IX
;posuÚ se na jmÈno disku, se kter˝m se pracuje
;12 byt˘ (jmÈno + dva n·hodnÈ byty)
;p¯esuÚ do hlaviËky buferu
;vraù ukazatel do hlaviËka buferu zpÏt do HL
;vyzvedni ËÌslo stopy a sektoru naposledy naËtenÈho
;do buferu adres·¯e
Komentovan˝ v˝pis MDOSu
0B3A
0B3D
0B3E
0B3F
0B42
0B44
0B47
0B4A
0B4D
0B50
0B53
0B56
0B59
0B5C
0B5F
0B61
0B64
0B67
0B68
0B69
0B6A
0B6B
0B6C
0B6F
0B72
CALL #0D67, LD(HL)DE
POP DE
PUSH DE
CALL #0D67, LD(HL)DE
EX (SP), IX
LD A, (IX+#0B)
CALL #0D6C, LD(HL)A
LD A, (IX+#0C)
CALL #0D6C, LD(HL)A
LD A, (IX+#15)
CALL #0D6C, LD(HL)A
LD E, (IX+#11)
LD D, (IX+#12)
CALL #0D67, LD(HL)DE
POP IX
LD DE, #0000
CALL #0D67, LD(HL)DE
LD E, L
LD D, H
INC DE
INC DE
INC DE
CALL #0D67, LD(HL)DE
CALL #217B, ERAVAR
POP IX
;a uloû si ho do hlaviËky
;obnov si adresu poloûky v buferu adres·¯e
;a znovu ji uloû
;a uloû ji jeötÏ do hlaviËky buferu
;dej adresu poloûky v buferu adres·¯e do IX a uloû si IX
;vyzvedni dÈlku souboru
;a uloû ji do hlaviËky buferu
;vyzvedni ËÌslo prvnÌho sektoru uloûenÌ souboru do DE
;a uloû do hlaviËky buferu
;obnov IX
;poËet znak˘ ke ËtenÌ je na zaË·tku nula
;uloû do hlaviËky buferu
;dej ukazatel do hlaviËky buferu do DE
;a zvyö ji o t¯i
;v DE je zaË·tek uloûenÌ dat v buferu
;a uloû do hlaviËky buferu
;vymaû pomocnÈ promÏnnÈ MDOSu
;obnov IX
NynÌ se vr·tÌme zpÏt do ZX ROM na pokraËov·nÌ prov·dÏnÌ p¯Ìkazu OPEN.
0B74
LD HL, #1B00
;do HL adresa v tabulce parametr˘ p¯Ìkaz˘ v ZX ROM
;pro pokraËov·nÌ p¯Ìkazu OPEN
0B77
LD (#5C74), HL T_ADDR ;uloû ji do adresy jako dalöÌ poloûku v tabulce syntaxe
0B7A
RET
;a vraù se na dalöÌ zpracov·nÌ p¯Ìkazu OPEN
OPENOUT
VstupnÌ bod, pokud se na kan·l p¯ipojuje pouze soubor pro v˝stup (OPEN #n,,ìJmÈnoSouboruì).
0B7B ONLYOUT
0B7C
RST
JR
#30
Z, #0B93, NOOPEN1
;je kontrola syntaxe?
;ano → skoË
Prov·dÌ se p¯Ìkaz, proto otestujeme, jestli uû dan˝ kan·l nenÌ otev¯en.
0B7E
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
0B7F
DW #171E
;podprogram STR-DATA vyzvednutÌ dat pro dan˝ kan·l
0B81
LD (#3E78), HL VALSYX
;uloû si adresu kan·lu v oblasti proudov˝ch dat
0B84
LD A, B
;uû je kan·l otev¯en?
0B85
OR C
0B86
JR
Z, #0B93, NOOPEN1
;ne → skoË
0B88
LD A, B
;do A vyööÌ byte posunu
0B89
AND A
;byl uû mu p¯i¯azen nÏjak˝ soubor?
0B8A
JP
NZ, #0AE6, REPORTm ;ano → skoË na REPORT m ÑStream already openì
0B8D
LD A, C
;do A niûöÌ byte posunu
0B8E
CP
#11
;byl uû mu p¯i¯azen nÏkter˝ z kan·l˘ ÑKì, ÑSì, ÑRì, ÑPì?
0B90
JP
NC, #0AE6, REPORTm ;ne → skoË na REPORT m ÑStream already openì
Komentovan˝ v˝pis MDOSu
49
Provedeme kontrolu parametr˘ p¯Ìkazu
0B93 NOOPEN1
RST #18
0B94
CP
Ñ,ì
0B96
JP
NZ, #06C6, REPORTC
0B99
RST #20
0B9A
RST #28
0B9B
DW #1C8C
0B9D
CALL #1057, ISSYNCONTR
;vezmi aktu·lnÌ znak
;je to Ë·rka?
;ne → skoË na REPORT C ÑNonsense in BASICì
;vezmi dalöÌ znak
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-EXP vyhodnocenÌ ¯etÏzce
;otestuj, jestli nenÌ kontrola syntaxe
Neprov·dÌ se kontrola syntaxe, provedeme p¯Ìkaz.
0BA0
CALL #0FCF, DIVSTRING
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
Otev¯eme soubor pro z·pis se jmÈnem ve FNZONE1
soubor s nulovou dÈlkou.
0BA3 OPENOUTF PUSH IX
0BA5
CALL #0DB5, SETSTRNM
0BA8
CALL #1C8F, SETACT
a jmÈnem disku v DNZONE1. Na zaË·tku je nastaven jako
;uloû si IX
;nastav jmÈno disku a souboru, otestuj p¯Ìponu souboru
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
ZjistÌme, jestli takov˝ soubor jiû neexistuje.
0BAB
CALL #212B, FIRSTMASK
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
0BAE
JR
NZ, #0BBB, OPENNULF;nenalezena → skoË
0BB0
CALL #1283, GETATR
;vyzvedni atributy souboru
0BB3
BIT 2, A
;je WRITE PROTECTED?
0BB5
JP
Z, #1A10, REPORTf
;ano → skoË na REPORT f ÑFile is write protectedì
Vymaûeme existujÌcÌ soubor, nept·me se na p¯eps·nÌ souboru.
0BB8
CALL #1F88, DFILER
;proveÔ smaz·nÌ vyhledanÈho souboru
Vytvo¯Ìme soubor s nulovou dÈlkou.
0BBB OPENNULF CALL #0D31, SETEMPTYF
0BBE
0BBF
0BC2
0BC3
PUSH HL
CALL #0D6F, MAKE544B
PUSH HL
CALL #0D21, SETSTRBUF
0BC6
0BC7
0BCA
POP HL
LD DE, #25AB
CALL #0D67, LD(HL)DE
Na tÈto adrese v
n·vratovÈ adresy do
0BCD
0BD0
;vytvo¯ soubor se jmÈnem v FNZONE1 jako soubor
;s nulovou dÈlkou
;uloû si ukazatel na poloûku adres·¯e v buferu
;vytvo¯ si mÌsto pro bufer o velikosti 544 byt˘
;uloû si adresu zaË·tku buferu
;vypoËti offset buferu a uloû ho do tabulky informacÌ
;o kan·lech
;obnov adresu buferu
;do DE adresa rutiny pro z·pis znaku
;uloû do hlaviËky buferu
ZX ROM je instrukce RST #0, kter· vyvol· p¯estr·nkov·nÌ do ROM D40. Tam se podle
volajÌcÌho programu urËÌ skok na rutinu pro v˝stup znaku do sekvenËnÌho souboru.
LD DE, #15C4
;do DE adresa rutiny pro ËtenÌ znaku
CALL #0D67, LD(HL)DE
;uloû do hlaviËky buferu
Protoûe je tento soubor otev¯en pouze pro z·pis, je na mÌsto adresy rutiny uloûen skok na chybovÈ hl·öenÌ v ZX
ROM.
0BD3
LD A, #EB
;do A kÛd n·zvu kan·lu ñ urËuje, ûe je p¯ipojen soubor
0BD5
CALL #0D6C, LD(HL)A
;uloû do hlaviËky buferu
0BD8
JP
#0B21, MAKEHBUF
;vytvo¯ zbytek hlaviËky a vraù se do ZX ROM
50
Komentovan˝ v˝pis MDOSu
OPENIO
VstupnÌ bod, pokud chceme p¯ipojit na kan·l soubor jako v˝stup z kan·lu, p¯iËemû uû je na nÏj p¯ipojen soubor
pro vstup. (OPEN #n, "JmenoSouboru1", "JmÈnoSouboru2").
0BDB OPENIO
0BDC
0BDE
0BE1
0BE2
0BE3
RST
CP
JP
RST
RST
DW
#18
Ñ,ì
NZ, #06C6, REPORTC
#20
#28
#1C8C
0BE5
CALL #1057, ISSYNCONTR
NenÌ kontola syntaxe, provedeme p¯Ìkaz.
0BE8
CALL #0FCF, DIVSTRING
0BEB
CALL #0BA3, OPENOUTF
0BEE
LD HL, (#3E7A) VALSYY
;vezmi aktu·lnÌ znak
;je to Ë·rka?
;ne → skoË na REPORT C ÑNonsense in BASICì
;vezmi dalöÌ znak
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-EXP vyhodnocenÌ ¯etÏzce
;vyzvedneme JmÈnoSouboru2
;test, jestli nenÌ kontrola syntaxe
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
;otev¯i v˝stupnÌ soubor se jmÈnem ve FNZONE1
;do HL adresu buferu souboru, kter˝ slouûÌ pro vstup
Je t¯eba p¯epsat adresy rutin pro vstup a v˝stup, protoûe jsou otev¯eny soubory jak pro vstup, tak i pro v˝stup.
Tyto adresy se zapisujÌ do hlaviËky buferu souboru pro vstup, protoûe odtud budou vyzved·v·ny systÈmem v ZX
ROM.
0BF1
LD DE, #27AC
;do DE adresu rutiny pro z·pis znaku
0BF4
CALL #0D67, LD(HL)DE
;uloû ji do hlaviËky buferu
0BF7
LD DE, #27A5
;do DE adresu rutiny pro naËtenÌ znaku
0BFA
CALL #0D67, LD(HL)DE
;uloû ji do hlaviËky buferu
0BFD
LD A, #EB
;do A kÛd n·zvu kan·lu ñ urËuje, ûe je p¯ipojen soubor
0BFF
CALL #0D6C, LD(HL)A
;uloû do hlaviËky buferu
Protoûe p¯i otevÌr·nÌ souboru pro v˝stup doölo k p¯eps·nÌ kan·lov˝ch informacÌ u souboru, kter˝ je p¯ipojen na
stejn˝ kan·l a je otev¯en pro vstup, (offset teÔ ukazuje na bufer souboru, kter˝ je otev¯en pro z·pis), musÌme odeËÌst
544 byt˘ (dÈlka buferu), aby offset ukazoval zpÏt na bufer souboru pro vstup. Lze to provÈst, protoûe oba bufery
jsou vûdy za sebou.
0C02
LD HL, (#3E78) VALSYX
;do HL adresu kan·lu v oblasti proudov˝ch dat
0C05
CALL #0DB0, LDDE(HL)
;vyzvedni obsah do DE
0C08
LD BC, #FDE0
;do BC dej ñ544
0C0B
EX DE, HL
;do HL offset buferu
0C0C
ADD HL, BC
;p¯iËti BC (odeËti 544)
0C0D
EX DE, HL
;a dej zpÏt do DE
0C0E
DEC HL
;nastav adresu kan·lu do p˘vodnÌho stavu
0C0F
DEC HL
0C10
CALL #0D67, LD(HL)DE
;a uloû tam nov˝ offset
0C13
RET
;vraù se p¯es RETURN do ZX ROM
CLOSESTR
Tento podprogram zavÌr· proud. V A je ËÌslo kan·lu
IN:
A ËÌslo kan·lu (0ñ15)
OUT: uzav¯e dan˝ kan·l, vypr·zdnÌ bufer souboru na disk
0C14 CLOSESTR
0C17
0C1A
0C1B
LD
LD
ADD
LD
HL, (#5C65) STKEND
DE, #0005
HL, DE
(#5C65), HL STKEND
;vezmi adresu vrcholu z·sobnÌku kalkul·toru do HL
;posuÚ o 5 byt˘
;a uloû nov˝ vrchol z·sobnÌku kalkul·toru
Komentovan˝ v˝pis MDOSu
51
Vyzvedneme parametr a otestujeme ho.
0C1E
RST #28
0C1F
DW #1E94
0C21
0C22
Uzav¯eme soubor
0C24 CLOUTSTRF
0C25
0C28
0C29
0C2A
0C2C
RST
DW
#28
#1721
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram FIND-INT1 vyzvednutÌ ËÌsla do A
;vyzvedneme ËÌslo proudu
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram pro kontrolu rozsahu ËÌsla proudu
;zkontroluj, jestli je ËÌslo v rozsahu 0 aû 15
otev¯en˝ pro z·pis s vypr·zdnÏnÌm buferu a uzav¯eme kan·l.
PUSH HL
;uloû si adresu proudov˝ch dat pro dan˝ kan·l
CALL #0C4B, CLOPENF
;uzav¯i soubory p¯ipojenÈ na kan·l
POP HL
;obnov si adresu
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
DW #16EB
;podprogram zav¯i proud
RET
;vraù se p¯es RETURN do ZX ROM
CLOSEALLSTR
Uzav¯e vöechny kan·ly, na kterÈ je p¯ipojen sekvenËnÌ soubor.
0C2D CLOSEALL
CALL #1057, ISSYNCONTR
NenÌ kontrola syntaxe, provedeme p¯Ìkaz.
0C30
XOR A
Budeme postupnÏ
0C31 CLOSEALL1
0C32
0C33
0C35
0C36
0C39
0C3A
0C3B
0C3C
0C3D
0C3E
0C3F
0C41
0C44
0C45
0C46
0C48
0C4A
;otestuj, jestli nenÌ kontrola syntaxe
;zaËÌn· se kan·lem 0
zavÌrat kan·ly, na kterÈ je p¯ipojen sekvenËnÌ soubor.
PUSH AF
;uloû si ËÌslo zavÌranÈho kan·lu
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
DW #1721
;podprogram vyzvednutÌ dat pro kan·l v A
PUSH HL
;uloû si adresu oblasti proudov˝ch dat pro dan˝ kan·l
LD HL, (#5C4F) CHANS
;do HL adresa, kde jsou uloûeny informace o kan·lech
ADD HL, BC
;posuÚ se na data o kan·lu
INC HL
;posuÚ se na kÛd kan·lu
INC HL
INC HL
LD A, (HL)
;dej kÛd kan·lu do A
POP HL
;obnov adresu oblasti proudov˝ch dat pro dan˝ kan·l
CP
#EB
;je na tento kan·l p¯ipojen soubor?
CALL Z, #0C24, CLOUTSTRF ;ano → uzav¯i soubory p¯ipojenÈ na dan˝ kan·l
POP AF
;obnov ËÌtaË kan·l˘
INC A
;posuÚ se na dalöÌ
CP
#10
;uzav¯eno vöech 16 kan·l˘?
JR
C, #0C31, CLOSEALL1 ;ne → opakuj
RET
;vraù se p¯es RETURN do ZX ROM
CLOPENF
Uzav¯e soubory p¯ipojenÈ na kan·l. V BC je offset buferu.
0C4B CLOPENF
0C4C
0C4D
0C4E
0C51
52
LD
OR
RET
LD
ADD
A, B
C
Z
HL, (#5C4F) CHANS
HL, BC
;je uû proud zav¯en?
;ano → vraù se
;do HL adresa, kde jsou uloûeny informace o kan·lech
;posuÚ se na hlaviËku buferu
Komentovan˝ v˝pis MDOSu
0C52
0C53
0C54
0C55
0C56
0C59
0C5B
0C5D
0C60
0C61
0C63
LD
DEC
LD
EX
LD
D, (HL)
HL
E, (HL)
DE, HL
BC, #25AB
;vyzvedni adresu rutiny pro z·pis znaku
;do DE
;a dej ji do HL
;do BC adresa rutina pro z·pis znaku, kdyû je otev¯en
;pouze soubor pro z·pis
SBC HL, BC
;jsou stejnÈ?
JR
Z, #0C72, CLOSEOUTF ;ano → skoË na uzav¯enÌ souboru otev¯enÈho pro
;z·pis s vypr·zdnÏnÌ buferu
LD BC, #0201
;do BC 513, v HL je buÔ #201, pokud byly otev¯eny
;soubory pro z·pis i pro ËtenÌ nebo #F019, pokud byl
;otev¯en pouze soubor pro ËtenÌ
AND A
;nuluj CY
SBC HL, BC
;odeËti BC od HL
JR
Z, #0C6D, CLOSEOF1 ;byly otev¯eny soubory pro z·pis i pro ËtenÌ → skoË
ZruöÌme dan˝ prostor. V HL je zaË·tek buferu.
0C65 CLOERROOM EX DE, HL
0C66
LD BC, #0220
0C69
CALL #0D80, DESTRBYTE
0C6C
RET
;dej do HL ukazatel na zaË·tek buferu
;544 byt˘
;zruö prostor a uprav adresy kan·l˘
;vraù se
ZruöÌme bufer souboru pro ËtenÌ. V HL je adresa buferu.
0C6D CLOSEOF1
PUSH DE
;uloû ukazatel na zaË·tek buferu
0C6E
CALL #0C65, CLOERROOM ;vymaû nejd¯Ìve bufer, ve kterÈm byl soubor na ËtenÌ
0C71
POP DE
;obnov ukazatel na zaË·tek buferu ñ teÔ ukazuje na
;bufer souboru, kter˝ byl otev¯en pro z·pis
CLOSEOUTF
Uzav¯e soubor, kter˝ byl otev¯en pro z·pis, s uloûenÌm buferu na disk.
0C72 CLOSEOUTF PUSH IX
0C74
EX DE, HL
;uloû si IX
;do HL ukazatel na hlaviËku buferu
Nejd¯ive nastavÌme parametry diskety a souboru.
0C75
INC HL
0C76
INC HL
0C77
INC HL
0C78
INC HL
0C79
INC HL
0C7A
INC HL
0C7B
LD DE, #3E80 DNZONE1
0C7E
LD BC, #000A
0C81
LDIR
0C83
0C84
0C85
INC HL
INC HL
CALL #1C8F, SETACT
0C88
0C8B
0C8C
CALL #0DB0, LDDE(HL)
LD C, E
LD B, D
;posuÚ se na jmÈno disku
;do DE adresa 1. jmÈna disku pro I/O
;10 znak˘
;p¯esuÚ jmÈno disku, na kterÈm je uloûen soubor, kter˝
;byl otev¯en pro z·pis
;posuÚ se na uloûenÌ sektoru a stopy adres·¯e, ve kterÈm
;je uloûena hlaviËka souboru
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
;vyzvedni sektor a stopu adres·¯e do DE
;a zkopÌruj je do BC
Komentovan˝ v˝pis MDOSu
53
0C8D
LD
(#3E6F), DE ADRSCTR ;uloû jako ËÌslo sektoru a stopy adres·¯e, kter˝ byl
;naposledy naËten z disku
0C91
LD A, (#3E6B) WORKDR ;do A drive, se kter˝m se pracuje
0C94
LD (#3E71), A ADRDR
;uloû jako drive, ze kterÈho se naposledy Ëetl adres·¯
0C97
LD DE, #0101
;jeden sektor, û·dnÈ opakov·nÌ
0C9A
PUSH HL
;uloû si ukazatel na hlaviËku buferu
0C9B
LD HL, #3800 DIRBUF
;do HL adresa uloûenÌ buferu adres·¯e
0C9E
CALL #22A2, BREADA
;naËti sektor
0CA1
POP HL
;obnov si ukazatel na hlaviËku buferu
0CA2
CALL #0DB0, LDDE(HL)
;vyzvedni adresu poloûky v buferu adres·¯e do DE
0CA5
PUSH DE
;a uloû si ji
0CA6
POP IX
;do IX
VypoËteme dÈlku souboru.
0CA8
CALL #0DB0, LDDE(HL)
;vyzvedni prvnÌ dva byty dÈlky souboru z buferu do DE
0CAB
PUSH DE
;a uloû si je
0CAC
LD C, (HL)
;vyzvedni t¯etÌ byte dÈlky souboru z buferu do C
0CAD
INC HL
;posuÚ se na dalöÌ byte hlaviËky buferu
0CAE
CALL #0DB0, LDDE(HL)
;vyzvedni ËÌslo naposledy zapisovanÈho sektoru do DE
0CB1
EX DE, HL
;a dej ho do HL
0CB2
EX (SP), HL
;uloû si ho na z·sobnÌk a vyzvedni prvnÌ dva byty dÈlky
;souboru ze z·sobnÌku
0CB3
PUSH HL
;a znovu je uloû
0CB4
EX DE, HL
;do HL vraù zpÏt ukazatel na hlaviËku buferu
0CB5
CALL #0DB0, LDDE(HL)
;vyzvedni poËet zapsan˝ch znak˘ v buferu do DE
0CB8
LD (IX+#0B), E
;uloû do prvnÌho bytu dÈlky souboru niûöÌ byte poËtu
;zapsan˝ch znak˘
0CBB
POP AF
;vyzvedni druh˝ byte dÈlky souboru, prvnÌ je vûdy nula
0CBC
ADD A, D
;p¯iËti vyööÌ byte poËtu zapsan˝ch znak˘
0CBD
LD (IX+#0C), A;a uloû jako druh˝ byte dÈlky souboru
0CC0
LD A, C
;do A dej t¯etÌ byte dÈlky souboru
0CC1
ADC A, #00
;a p¯iËti p¯Ìznak p¯eteËenÌ
0CC3
LD (IX+#15), A
;uloû jako t¯etÌ byte dÈlky souboru
ZapÌöeme hlaviËku souboru na disk.
0CC6
CALL #1E65, WSCADR
0CC9
CALL #21A1, DRVSYS
;zapiö sektor adres·¯e
;zjisti adresu parametr˘ drivu, se kter˝m se pracuje
NynÌ provedeme z·pis poslednÌho sektoru. MusÌme rozliöit dvÏ moûnosti. Jestli uû byl do souboru zaps·n nÏjak˝
sektor (stezka obsahuje koncovou znaËku) nebo nebyl zaps·n jeötÏ û·dn˝ sektor (soubor je nastaven jako soubor
s nulovou dÈlkou).
0CCC
LD A, D
;byl zaps·n nÏjak˝ znak do buferu?
0CCD
OR E
0CCE
EX (SP), HL
;vyzvedni ËÌslo naposledy zapisovanÈho sektoru buferu
;a uloû si ukazatel na hlaviËku
0CCF
JR
Z, #0D03, CLOSEEND ;ne → skoË na zruöenÌ prostoru, protoûe se nic nezapisuje
0CD1
PUSH DE
;uloû si poËet zapsan˝ch znak˘ v buferu
0CD2
CALL #1CF1, GETWTEST
;naËti poloûku FAT a otestuj chybu ve FAT
0CD5
LD A, D
;do A vyööÌ byte obsahu
0CD6
CP
#0C
;byl v˘bec zaps·n nÏjak˝ sektor souboru?
0CD8
JR
Z, #0CE7, CLEMPTYF ;ne → skoË na vytvo¯enÌ koncovÈ znaËky
Do souboru byl zaps·n sektor, m· tedy koncovou znaËku. Najdeme dalöÌ sektor, kter˝ vloûÌme do stezky souboru.
54
Komentovan˝ v˝pis MDOSu
0CDA
0CDB
0CDE
0CE1
0CE2
0CE3
0CE6
PUSH HL
CALL #20F6, FIEMPTYFAT
JP
NZ, #20BC, RETREP
POP DE
EX DE, HL
CALL #1D1E, WRTOFAT
EX DE, HL
;uloû si ËÌslo sektoru
;najdi prvnÌ pr·zdnou poloûku FAT od HL
;nenalezena → skoË na REPORT U ÑDisk fullì
;obnov ËÌslo naposledy zapisovanÈho sektoru
;a p¯ehoÔ sektory
;zapiö do poloûky FAT obsah DE
;a znovu je p¯ehoÔ
Vytvo¯Ìme koncovou znaËku. V HL je ËÌslo poslednÌho sektoru, do kterÈho se zapÌöe obsah buferu.
0CE7 CLEMPTYF POP DE
;obnov si poËet zapsan˝ch znak˘ v buferu
0CE8
LD A, D
;do A vyööÌ byte
0CE9
OR #0E
;vytvo¯ znaËku konec souboru
0CEB
LD D, A
;dej ji zpÏt do D
0CEC
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT obsah DE
0CEF
CALL #1D9D, WFATIFCH
;zapiö FAT, pokud byla zmÏnÏna
0CF2
CALL #1DF9, LOGFYZ
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
0CF5
POP HL
;obnov ukazatel na bufer
0CF6
PUSH HL
;a znovu ho uloû
0CF7
INC HL
;posuÚ se na zaË·tek dat
0CF8
INC HL
0CF9
INC HL
UloûÌme obsah buferu do poslednÌho sektoru souboru.
0CFA
LD DE, #0100
;jeden sektor, 255 opakov·nÌ
0CFD
LD A, (#3E6B) WORKDR ;do A drive, se kter˝m se pracuje
0D00
CALL #2296, BWRITE
;zapiö sektor
ZruöÌme prostor pro bufer souboru otev¯enÈho pro
0D03 CLOSEEND POP HL
0D04
LD DE, #FFE3
0D07
ADD HL, DE
0D08
LD BC, #0220
0D0B
CALL #0D80, DESTRBYTE
0D0E
CALL #217B, ERAVAR
0D11
POP IX
0D13
RET
z·pis.
;obnov ukazatel do hlaviËky buferu
;do DE ñ29
;odeËti od HL ñ v HL je adresa zaË·tku hlaviËky buferu
;dÈlka je 544 byt˘
;zruö prostor a uprav adresy kan·l˘
;vymaû pomocnÈ promÏnnÈ MDOSu
;obnov IX
;vraù se p¯es RETRUN do ZX ROM
ANALOPENNM
Vyzvedne ¯etÏzec ze z·sobnÌku, zkontroluje, jestli jeho dÈlka nenÌ nulov· a rozdÏlÌ ho na jmÈno disku a souboru
IN:
na z·sobnÌku kalkul·toru je ¯etÏzec
OUT: NZ ñ v DNZONE1 je jmÈno disku a v FNZONE1 je jmÈno souboru
0D14 ANAOPENM
0D15
0D17
0D18
0D19
0D1C
0D1F
0D20
RST #28
DW #2BF1
LD A, B
OR C
JP
Z, #1019, REPORTF
CALL #, 0FB2, ANALSTE
AND A
RET
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram STK-FETCH vyzvednutÌ parametr˘ ¯etÏzce
;je pr·zdn˝?
;ano → skoË na REPORT F ÑInvalid file nameì
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno souboru a disku
;nastav NZ
;vraù se
Komentovan˝ v˝pis MDOSu
55
SETSTRBUF
VypoËte relativnÌ adresu buferu pro otevÌran˝ kan·l a a uloûÌ ho do informacÌ o otevÌranÈm kan·le.
IN:
HL zaË·tek buferu
na VALSYX je uloûena adresa, kde jsou uloûeny informace o otevÌranÈm
kan·lu
OUT: DE relativnÌ adresa buferu
offset je uloûen do informacÌch o kan·le
0D21
0D25
0D26
LD DE, (#5C4F) CHANS
AND A
SBC HL, DE
0D28
0D29
0D2A
0D2D
0D2E
0D2F
0D30
INC
EX
LD
LD
INC
LD
RET
HL
DE, HL
HL, (#3E78) VALSYX
(HL), E
HL
(HL), D
;do DE adresa, kde jsou uloûeny informace o kan·lech
;nuluj CY
;odeËti adresu zaË·tku kan·lov˝ch dat od adresy
;zaËatku prostoru
;zvyö o jedniËku
;a uloû rozdÌl do DE
;do HL adresa kan·lu proudov˝ch dat pro otev¯en˝ kan·l
;uloû si sem relativnÌ posun na zaË·tek buferu pro dan˝
;kan·l
;vraù se
SETEMPTYFIL
Vytvo¯Ì soubor s nulovou dÈlkou
IN:
ve FNZONE1 je jmÈno souboru
IX adresa parametr˘ drivu
OUT: je vytvo¯en soubor se jmÈnem ve FNZONE1 s nulovou dÈlkou
0D31 SETEMPTYF CALL #202C, FINDANDFILL ;najdi prvnÌ nepr·zdnou poloûku adres·¯e a dej do nÌ
;jmÈno souboru z FNZONE1
Vynulujeme informace o dÈlce a poË·teËnÌ adrese souboru
0D34
LD B, #06
;6 byt˘
0D36 CLSHEADINF LD (HL), #00
;nastav dÈlku souboru, poË·teËnÌ adresu a dÈlku
;promÏnn˝ch na nulu
0D38
INC HL
;posuÚ se na dalöÌ byte poloûky adres·¯e
0D39
DJNZ #0D36, CLSHEADINF ;opakuj B-kr·t
Najdeme prvnÌ sektor a oznaËÌme ho jako sektor souboru s nulovou dÈlkou.
0D3B
PUSH HL
;uloû si ukazatel do poloûky adres·¯e v buferu
0D3C
LD HL, #0000
;budeme prohled·vat FAT od zaË·tku
0D3F
CALL #20F6, FIEMPTYFAT ;najdi prvnÌ pr·zdnou poloûku FAT od HL
0D42
JP
NZ, #20BC, RETREP
;nenalezena → skoË na REPORT U ÑDisk fullì
0D45
EX DE, HL
;dej ËÌslo volnÈho sektoru do DE
0D46
POP HL
;obnov ukazatel do poloûky adres·¯e do HL
0D47
LD (HL), E
;a uloû nalezen˝ sektor jako ËÌslo prvnÌho sektoru
;souboru
0D48
INC HL
0D49
LD (HL), D
0D4A
INC HL
0D4B
PUSH HL
;uloû si ukazatel do poloûku adres·¯e v buferu
0D4C
EX DE, HL
;do HL ËÌslo prvnÌho sektoru
0D4D
LD DE, #0C00
;do DE p¯Ìznak dÈlka souboru nulov·
56
Komentovan˝ v˝pis MDOSu
0D50
0D53
0D54
0D56
0D57
0D59
0D5A
0D5C
0D5F
0D60
0D63
0D66
CALL #1D1E, WRTOFAT
POP HL
LD (HL), #00
INC HL
LD (HL), #0F
INC HL
LD (HL), #00
LD DE, #FFEB
ADD HL, DE
CALL #1E65, WSCADR
CALL #1D9D, WFATIFCH
RET
;zapiö do poloûky FAT v HL obsah DE
;obnov ukazatel do poloûky adres·¯e do HL
;uloû si do hlaviËky nulu
;a posuÚ se na dalöÌ byte
;uloû atributy RWED
;posuÚ se na dalöÌ byte
;uloû do informace o dÈlce souboru nulu
;do DE dej ñ21
;odeËti od HL
;zapiö sektor adres·¯e v buferu
;zapiö FAT, pokud byla zmÏnÏna
;vraù se
LD(HL)DE
UloûÌ na (HL) registr E a (HL+1) registr D.
IN:
DE ukl·dan· hodnota
HL adresa, kam se bude ukl·dat
OUT: obsah DE se uloûÌ na (HL) a (HL+1) a obsah HL je zvÏtöen o 2
0D67 LD(HL)DE
0D68
0D69
0D6A
0D6B
LD
INC
LD
INC
RET
(HL), E
HL
(HL), D
HL
;uloû E
;posuÚ se na dalöÌ adresu
;uloû D
;posuÚ se na dalöÌ adresu
;vraù se
LD(HL)A
UloûÌ na (HL) registr A.
IN:
A ukl·dan· hodnota
HL adresa, kam se bude ukl·dat
OUT: obsah A se uloûÌ na (HL) a obsah HL je zvÏtöen o 1
0D6C LD(HL)A
0D6D
0D6E
LD (HL), A
INC HL
RET
;uloû A
;posuÚ se na dalöÌ adresu
;vraù se
MAKE544B
Vytvo¯Ì prostor 544 byt˘ za systÈmov˝mi promÏnn˝mi BASICu p¯ed BASIC programem.
IN:
ñ
OUT: vytvo¯eno 544 byt˘ volnÈho mÌsta
HL adresa zaË·tku volnÈho mÌsta
0D6F MAKE544B
0D72
LD
JR
BC, #0220
#0D77, MAKEROOM
;prostor 544 byt˘
;skoË na vytvo¯enÌ prostoru
MAKE1088B
Vytvo¯Ì prostor 1088 byt˘ za systÈmov˝mi promÏnn˝mi BASICu p¯ed BASIC programem.
IN:
ñ
OUT: vytvo¯eno 1088 byt˘ volnÈho mÌsta
HL adresa zaË·tku volnÈho mÌsta
0D74 MAKE1044B LD
BC, #0440
;prostor 1088 byt˘
Komentovan˝ v˝pis MDOSu
57
Vytvo¯Ìme prostor. V registru BC je poËet voln˝ch
0D77 MAKEROOM LD HL, (#5C53) PROG
0D7A
DEC HL
0D7B
RST #28
0D7C
DW #1655
0D7E
INC HL
0D7F
RET
byt˘.
;do HL zaË·tek programu v BASICu
;sniû o jedniËku
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram MAKE-ROOM vytvo¯enÌ prostoru BC byt˘
;posuÚ se na prvnÌ byte prostoru
;vraù se
DESTRBYTE
ZruöÌ prostor BC byt˘ a nastavÌ kan·lovÈ informace. PouûÌv· se nap¯. p¯i ruöenÌ buferu souboru p¯ipojenÈho na
kan·l. Pokud je takov˝ bufer ruöen, musÌ se zmÏnit relativnÌ adresy vöech bufer˘, kterÈ jsou uloûeny za ruöen˝m
buferem (relativnÌ adresa se zmenöÌ o 544 byt˘). Je to d˘leûitÈ, protoûe pokud by se nezmÏnily, ukazatele na tyto
bufery v kan·lov˝ch informacÌch by byly neplatnÈ (ukazovaly by jinam).
IN:
HL adresa zaË·tku ruöenÈho prostoru
BC dÈlka ruöenÈho prostoru
OUT: zruöÌ dan˝ prostor a nastavÌ kan·lovÈ informace
0D80 DESTRBYTE
0D81
0D82
0D83
0D85
0D86
0D87
0D8B
0D8C
0D8E
0D8F
0D90
0D93
PUSH HL
PUSH BC
RST #28
DW #19E8
POP BC
POP HL
LD DE, (#5C4F) CHANS
AND A
SBC HL, DE
INC HL
PUSH HL
LD HL, #5C10 STRMS
LD A, #13
;uloû si ukazatel na zaË·tek prostoru
;uloû si poËet byt˘
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram RECLAIM-2 zruöenÌ prostoru BC byt˘
;obnov poËet byt˘
;a ukazatel na zaË·tek prostoru
;do DE adresa, kde jsou uloûeny informace o kan·lech
;nuluj CY
;odeËti ñ v HL je relativnÌ adresa zruöenÈho prostoru
;zvyö o 1
;uloû si relativnÌ adresu
;do HL adresy kan·l˘
;19 kan·l˘
Posuneme vöechny relativnÌ adresy bufer˘, kterÈ byly uloûeny za zruöen˝m prostorem (doölo ke smaz·nÌ
prostoru).
0D95 CRECTADR CALL #0DB0, LDDE(HL)
;vyzvedni relat. adresu buferu do DE
0D98
EX (SP), HL
;do HL relat. adresu zaË·tku prostoru
0D99
SBC HL, DE
;odeËti dÈlku buferu
0D9B
ADD HL, DE
;a znovu ho p¯iËti
0D9C
JR
NC, #0DAA, NOCRECT ;je menöÌ → skoË na dalöÌ kan·l
0D9E
EX DE, HL
;dej relat. adresu prostoru do DE a relat. adr. buferu do HL
Protoûe dan˝ kan·l ukazuje na bufer, kter˝ se nach·zÌ za ruöen˝m prostorem, musÌme snÌûit relativnÌ adresu
buferu.
0D9F
AND A
;nuluj CY
0DA0
SBC HL, BC
;odeËti dÈlku prostoru
0DA2
EX DE, HL
;vraù zpÏt adresy
0DA3
EX (SP), HL
;do HL zpÏt adresu kan·l˘ a uloû relat. adresu prostoru
0DA4
DEC HL
;dej do p˘vodnÌho stavu
0DA5
DEC HL
0DA6
CALL #0D67, LD(HL)DE
;a uloû novou relativnÌ adresu buferu
0DA9
EX (SP), HL
;do HL dej relativnÌ adresu prostoru a uloû adresu kan·l˘
0DAA NOCRECT
EX (SP), HL
;do HL adresu kan·l˘
58
Komentovan˝ v˝pis MDOSu
0DAB
ODAC
0DAE
0DAF
DEC A
;uû byly zkontrolov·ny vöechny kan·ly?
JR
NZ, #0D95, CRECTADR ;ne → opakuj
POP HL
;obnov si ukazatel na zaË·tek prostoru
RET
;vraù se
LDDE(HL)
Vyzvedne DE z (HL) a (HL+1).
IN:
HL adresa, odkud se bude vyzved·vat
OUT: DE v E je obsah z (HL) a v D obsah z (HL+1)
HL obsah HL je zvÏtöen o 2
0DB0 LDDE(HL)
0DB1
0DB2
0DB3
0DB4
LD
INC
LD
INC
RET
E, (HL)
HL
D, (HL)
HL
;vem obsah adresy do E
;posuÚ se na dalöÌ adresu
;vem obsah adresy do D
;posuÚ se na dalöÌ adresu
;vraù se
SETSTRNM
Analyzuje jmÈno souboru a disku pro otev¯enÌ sekvenËnÌho souboru a otestuje p¯Ìponu pro sekvenËnÌ soubor.
Prov·dÌ se takÈ test na wildchars a pokud byly pouûity, hl·sÌ se chyba.
IN:
jmÈno disku v DNZONE1 a jmÈno souboru ve FNZONE1
OUT: nastavenÈ jmÈno disku a jmÈno souboru na masku, kontrola na p¯Ìpony
ÑBì a ÑQì
0DB5 SETSTRNM
0DB8
0DBB
0DBC
0DBF
0DC2
CALL #1043, SETWDNM
CALL #10E2, ANALWDNM
INC A
JP
Z, #2337, REPORTX
CALL #107C, ARRANGNM
JP
C, #1019, REPORTF
0DC5
0DC8
0DCA
0DCB
0DCD
0DCE
0DD0
LD
CP
RET
CP
RET
CP
JP
A, (#3E94) EXTE1
ÑBì
Z
ÑQì
Z
Ñ?ì
NZ, #1019, REPORTF
P¯Ìpona nebyla urËena, nastavÌme ji tedy na ÑQì.
0DD3
LD A, ÑQì
0DD5
LD (#3E94), A EXTE1
0DD8
RET
;nastav jmÈno disku v DNZONE1 pro I/O
;analyzuj jmÈno disku v DNZONE1
;bylo vloûeno chybnÈ jmÈno disku?
;ano → skoË na REPORT X ÑBad device typeì
;uprav jmÈno souboru v FNZONE1 na masku
;bylo pouûito wildchars → skoË na REPORT F ÑInvalid
;file nameì
;vyzvedni p¯Ìponu souboru
;je to ÑBì?
;ano → vraù se
;je to ÑQì?
;ano → vraù se
;je to Ñ?ì (p¯Ìpona nebyla zad·na)?
;ne → skoË na REPORT F ÑInvalid file nameì
;p¯Ìpona bude ÑQì
;uloû p¯Ìponu souboru
;vraù se
READFROMSTR
Rutina pro naËtenÌ znaku ze sekvenËnÌho souboru do A. Je vol·na z adres #22C2 a #27A5.
IN:
DE adresa zaË·tku hlaviËky buferu
OUT: A znak ze sekvenËnÌho souboru, kter˝ je p¯ipojen na aktu·lnÌ kan·l
0DD9 RDFROMSTR EI
0DDA
RES
3, (IY+#02) TVFLAG
;povol p¯eruöenÌ
;zruö reûim edit
Komentovan˝ v˝pis MDOSu
59
Do registru BC vyzvedneme adresu, kam se vracÌ program po provedenÌ podprogramu WAIT-KEY (naËtenÌ
znaku z aktu·lnÌho kan·lu). Je to proto, aby po naËtenÌ znaku z p¯ipojenÈho souboru nedoölo k pÌpnutÌ jako po
stisknutÌ kl·vesy, pokud se WAIT-KEY vol· z procedury EDITOR, obsluhujÌcÌ p¯Ìkaz INPUT.
0DDE
LD HL, (#5C3D) ERR_SP ;do HL adresa poloûky na z·sobnÌku p¯i chybÏ
0DE1
DEC HL
;sniû ji
0DE2
LD B, (HL)
;vyzvedni hornÌ byte do B
0DE3
DEC HL
;sniû ji
0DE4
PUSH HL
;a uloû na z·sobnÌk
0DE5
LD C, (HL)
;vyzvedni dolnÌ byte do C ñ v BC je n·vratov· adresa,
;kam se vr·tÌ ¯ÌzenÌ z podprogramu WAIT-KEY
0DE6
LD HL, #0F3B
;n·vratov· adresa po naËtenÌ znaku do podprogramu
;EDITOR
0DE9
AND A
;nuluj CY
0DEA
SBC HL, BC
;porovnej s adresou na z·sobnÌku
0DEC
POP HL
;obnov ukazatel na adresu v z·sobnÌku
0DED
JR
NZ, #0DF1, NOINPUT ;nebyly stejnÈ → skoË
0DEF
LD (HL), #48
;zmÏÚ n·vratovou adresu do podprogramu EDITOR
;(p¯eskoË pÌpnutÌ kl·vesnice)
NynÌ provedeme naËtenÌ znaku ze souboru.
0DF1 NOINPUT
LD HL, #0018
0DF4
ADD HL, DE
0DF5
0DF6
0DF7
0DF8
0DF9
0DFA
0DFB
0DFC
0DFD
0DFE
LD
INC
LD
INC
LD
INC
LD
LD
OR
JR
;do HL 24
;p¯iËti k ukazateli na hlaviËku, v HL je teÔ ukazatel na
;poËet znak˘ v buferu, kolik jich lze jeötÏ ËÌst
;vyzvedni do DE poËet znak˘ ke ËtenÌ
E, (HL)
HL
D, (HL)
HL
C, (HL)
;a do BC aktu·lnÌ pozici v buferu
HL
B, (HL)
A, D
;je jeötÏ nÏjak˝ znak ke ËtenÌ?
E
NZ, #0E10, NOEMPTBF ;ano → skoË
Protoûe byl bufer p¯eËten, musÌme naËÌst dalöÌ sektor souboru.
0E00
PUSH HL
;uloû si ukazatel na hlaviËku
0E01
CALL #0E42, STRRDNSEC
;naËti dalöÌ sektor souboru do buferu
0E04
POP HL
;obnov ukazatel na hlaviËku
0E05
JR
C, #0E0C, STRNEXT
;nenÌ konec souboru → skoË
0E07
OR #FF
;nastav NC, NZ ñ REPORT 8 ÑEnd of fileì
0E09
JP
#1700, STANDROM
;skoË na p¯estr·nkov·nÌ a n·vrat do ZX ROM
NastavÌme aktu·lnÌ pozici
0E0C STRNEXT
LD
0E0D
LD
0E0E
INC
0E0F
INC
v buferu na zaË·tek buferu.
C, L
;zkopÌruj ukazatel na hlaviËku do BC
B, H
BC
;a posuÚ ho v BC na zaË·tek dat
BC
SnÌûÌme poËet byt˘ a naËteme znak.
0E10 NOEMPTBF DEC DE
0E11
LD A, (BC)
60
;sniû poËet znak˘ ke ËtenÌ
;vyzvedni znak z buferu
Komentovan˝ v˝pis MDOSu
UloûÌme ukazatele do hlaviËky buferu a provedeme
0E12 INCPOINTERS INC BC
0E13
LD (HL), B
0E14
DEC HL
0E15
LD (HL), C
0E16
DEC HL
0E17
LD (HL), D
0E18
DEC HL
0E19
LD (HL), E
0E1A
SCF
0E1B
JP
#1700, STANDROM
n·vrat do ZX ROM.
;posuÚ ukazatel na dalöÌ znak
;a uloû si ho do hlaviËky
;taky si uloû poËet znak˘ ke ËtenÌ
;nastav C
;skoË na p¯estr·nkov·nÌ do ZX ROM
WRITETOSTR
Rutina pro z·pis znaku do kan·lu. Zde se vstupuje, pokud je na kan·l p¯ipojen soubor pro ËtenÌ i pro z·pis. Je
vol·na z adresy #27AC.
IN:
DE adresa zaË·tku hlaviËky buferu
A zapisovan˝ znak
0E1E WRTOSTR2
0E21
LD
JR
HL, #023A
#0E26, WRTOSTR
;nastav posun na druh˝ bufer
;skoË do spoleËnÈ Ë·sti
StejnÈ jako u WRTOSTR2, ale s tÌm rozdÌlem, ûe na kan·l je p¯ipojen pouze soubor pro z·pis. Je vol·na z adresy
#25AB.
0E23 WRTOSTR1 LD HL, #001A
;nastav se na prvnÌ bufer (druh˝ nenÌ)
Toto je spoleËn· Ë·st z·pisu znaku do sekvenËnÌho souboru.
0E26 WRTOSTR
EI
;povol pre¯uöenÌ
0E27
ADD HL, DE
;nastav ukazatel do hlaviËky pat¯iËnÈho buferu
0E28
LD E, (HL)
;vyzvedni poËet zapsan˝ch znak˘ do DE
0E29
INC HL
0E2A
LD D, (HL)
0E2B
INC HL
0E2C
LD C, (HL)
;a aktu·lnÌ pozici v buferu do BC
0E2D
INC HL
0E2E
LD B, (HL)
0E2F
LD (BC), A
;uloû A do buferu na (BC)
0E30
INC DE
;zvyö poËÌtadlo zapsan˝ch znak˘
0E31
BIT 1, D
;uû bylo zaps·no 512 znak˘?
0E33
JR
Z, #0E12, NOFULLBUF ;ne → skoË
Protoûe je bufer pln˝, musÌme ho zapsat na disk.
0E35
PUSH HL
0E36
CALL #0E9B, WFLSTRSC
0E39
POP HL
0E3A
LD C, L
0E3B
LD B, H
0E3C
INC BC
znak˘
0E3D
LD DE, #0000
0E40
JR
#0E12, INCPOINTERS
;uloû si ukazatel do hlaviËky buferu
;zapiö vyplnÏn˝ bufer na disk a najdi dalöÌ voln˝ sektor
;obnov si ukazatel do hlaviËky
;zkopÌruj ho do BC
;posuÚ se na adresu, kde je uloûen poËet zapsan˝ch
;do DE uloû nulu (û·dn˝ znak zaps·n v buferu)
;skoË na nastavenÌ ukazatel˘ a jejich uloûenÌ
Komentovan˝ v˝pis MDOSu
61
STRRDNSEC
NaËte dalöÌ sektor souboru do buferu. VracÌ C, pokud jeötÏ takov˝ je.
IN:
HL adresa uloûenÌ 2. byte aktu·lnÌ pozice v buferu v hlaviËce
OUT: C jeötÏ nenÌ konec souboru
DE dÈlka dat v naËtenÈm sektoru
do buferu je naËten dalöÌ sektor souboru
0E42 STRRDNSEC
0E44
0E45
0E46
0E47
PUSH IX
INC HL
INC HL
PUSH HL
CALL #0E86, STRDRNMSC
0E4A
PUSH HL
0E4B
0E4C
0E4E
EX
BIT
JR
DE, HL
3, H
NZ, #0E80, ISLAST
NaËteme dalöÌ sektor souboru.
0E50
CALL #1C8F, SETACT
0E53
0E56
0E59
0E5C
0E5D
0E60
0E61
0E63
0E65
0E67
0E69
0E6A
0E6C
CALL #1CF1, GETWTEST
CALL #217B, ERAVAR
CALL #1DF9, LOGFYZ
POP HL
CALL #0D67, LD(HL)DE
LD A, D
CP
#0C
JR
Z, #0E81, ISEMPTY
BIT 3, D
JR
Z, #0E70, IS512B
LD A, D
AND #01
LD D, A
0E6D
OE6E
OR
JR
E
NZ, #0E73, NO512B
DÈlka dat v sektoru je 512 byt˘.
0E70 IS512B
LD DE, #0200
;uloû si zaË·tek dat v buferu
;nastav z hlaviËky jmÈno disku a vyzvedni ËÌslo
;naposledy ËtenÈho sektoru
;uloû si ukazatel na hlaviËku buferu ñ ukazuje na ËÌslo
;naposledy ËtenÈho sektoru
;dej do HL ËÌslo naposledy ËtenÈho sektoru
;poslednÌ sektor?
;ano → skoË
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
;naËti poloûku FAT a otestuj chybu
;vymaû pomocnÈ promÏnnÈ MDOSu
;p¯eveÔ logicky sektor na fyzick˝ sektor a stopu
;obnov ukazatel na hlaviËku buferu
;uloû ËÌslo novÈho naËtenÈho sektoru v buferu
;do A vyööÌ ËÌslo sektoru
;je to sektor souboru s nulovou dÈlkou?
;ano → skoË
;je to poslednÌ sektor souboru?
;ne → skoË
;do A znovu vyööÌ ËÌslo sektoru
;ponech 0. bit
;a vraù zpÏt do D ñ v DE je teÔ dÈlka dat v poslednÌm
;sektoru
;je 512 byt˘?
;ne → skoË
;dÈlka naËten˝ch dat v sektoru je 512 byt˘
Provedeme naËtenÌ sektoru do buferu.
0E73 NO512B
POP HL
0E74
PUSH DE
0E75
LD DE, #0100
0E78
CALL #22A2, BREADA
0E7B
POP DE
0E7C
POP IX
0E7E
SCF
0E7F
RET
62
;uloû si IX
;posuÚ se na zaË·tek dat v buferu
;obnov ukazatel na zaË·tek dat v buferu
;uloû si dÈlku dat
;jeden sektor, 255 opakov·nÌ
;naËti sektor
;obnov registry
;nastav C
;vraù se
Komentovan˝ v˝pis MDOSu
Uû nenÌ û·dn˝ sektor ke ËtenÌ.
0E80 ISLAST
POP HL
;obnov ukazatel do hlaviËky buferu
N·vrat s tÌm, ûe byl p¯ekroËen konec souboru.
0E81 ISEMPTY
POP HL
0E82
POP IX
0E84
AND A
0E85
RET
;obnov registry
;nastav NC
;vraù se
STRDRNMSC
NastavÌ jmÈno disku, na kterÈm se nach·zÌ soubor p¯ipojen˝ ke kan·lu a vracÌ v DE ËÌslo naposledy ËtenÈho nebo
zapsanÈho sektoru pro z·pis do buferu.
IN:
HL adresa poË·tku uloûenÌ dat v buferu
OUT: v DNZONE1 je jmÈno disku, na kterÈm je uloûen dan˝ soubor
DE ËÌslo naposledy ËtenÈho nebo zapsanÈho sektoru
HL adr. uloûenÌ naposledy ËtenÈho nebo zapsanÈho sektoru v hlaviËce
buferu
0E86 STRDRNMSC
0E89
0E8A
0E8D
0E90
LD
ADD
LD
LD
LDIR
DE, #FFE6
HL, DE
DE, #3E80 DNZONE1
BC, #000A
0E92
0E95
0E96
0E97
0E98
0E99
0E9A
LD
ADD
LD
INC
LD
DEC
RET
DE, #0009
HL, DE
E, (HL)
HL
D, (HL)
HL
;do DE dej ñ26
;odeËti od HL ñ v HL je adresa uloûenÌ jmÈna disku
;do DE adresa 1.jmÈna disku pro I/O
;10 znak˘
;p¯esuÚ jmÈno disku, na kterÈm je uloûen soubor
;p¯ipojen˝ ke kan·lu
;do DE 9
;p¯iËti zpÏt k HL
;do DE vyzvedni ËÌslo sektoru, kter˝ byl naposledy
;naËten do buferu nebo zaps·n na disketu
;v HL je ukazatel na ËÌslo sektoru v hlaviËce buferu
;vraù se
WFULLSTRSC
ZapÌöe vyplnÏn˝ bufer do sektoru na disk a najde dalöÌ pr·zdn˝ sektor.
IN:
HL adresa uloûenÌ 2. bytu aktu·lnÌ pozice v buferu
OUT: zapÌöe bufer na disk do souboru a najde dalöÌ voln˝ sektor
0E9B WFLSTRSC
0E9D
0E9E
0E9F
0EA0
PUSH IX
INC HL
INC HL
PUSH HL
CALL #0E86, STRDRNMSC
0EA3
LD
0EA6
0EA7
PUSH DE
CALL #1C8F, SETACT
0EAA
POP
(#3E78), HL VALSYX
HL
;uloû si IX
;posuÚ se na zaË·tek dat v buferu
;a uloû si ukazatel na zaË·tek dat
;nastav jmÈno disku a vyzvedni ËÌslo naposledy
;zapsanÈho sektoru
;uloû si ukazatel na hlaviËku buferu (je v nÌ adresa
;uloûenÌ naposledy zapsanÈho sektoru)
;uloû si ËÌslo naposledy zapsanÈho sektoru
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
;do HL vyzvedni ËÌslo naposledy zapsanÈho sektoru
NynÌ otestujeme, jestli uû byl zapisov·n nÏjak˝ sektor do souboru nebo je to soubor s nulovou dÈlkou.
0EAB
CALL #1CF1, GETWTEST
;naËti poloûku FAT a otestuj chybu
Komentovan˝ v˝pis MDOSu
63
0EAE
0EAF
0EB1
LD
CP
JR
A, D
;do A dej vyööÌ byte obsahu poloûky
#0C
;byl uû zaps·n nÏjak˝ sektor?
Z, #0EC6, NULENGTH ;ne → skoË
Najdeme tedy nov˝ voln˝ sektor, kter˝ p¯id·me
a uloûÌme ho jako poslednÌ zapsan˝ sektor.
0EB3
PUSH HL
0EB4
CALL #20F6, FIEMPTYFAT
0EB7
JP
NZ, #20BC, RETREP
0EBA
POP DE
na konec stezky souboru, zapÌöeme do nÏj obsah buferu
;uloû si ËÌslo naposledy zapsanÈho sektoru
;najdi pr·zdnou poloûku FAT od HL
;nenalezena → skoË na REPORT U ÑDisk fullì
;do DE ËÌslo naposledy zapsanÈho sektoru
VloûÌme nalezen˝ nov˝ sektor do stezky souboru.
0EBB
EX DE, HL
;do HL dej ËÌslo naposledy zapsanÈho sektoru a do DE
;ËÌslo nalezenÈho sektoru
0EBC
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT obsah DE
0EBF
LD HL, (#3E78) VALSYX
;vyzvedni ukazatel do hlaviËky buferu
0EC2
CALL #0D67, LD(HL)DE
;uloû si novÈ ËÌslo naposledy zapsanÈho sektoru
0EC5
EX DE, HL
;dej do HL ËÌslo novÈho sektoru
Vytvo¯Ìme koncovou znaËku souboru.
0EC6 NULENGTH LD DE, #0E00
0EC9
CALL #1D1E, WRTOFAT
0ECC
CALL #1DF9, LOGFYZ
;do DE znaËka konec souboru
;zapiö do poloûky FAT obsah DE
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
ZapÌöeme bufer do sektoru a stopy v BC.
0ECF
POP HL
0ED0
PUSH HL
0ED1
LD DE, #0100
0ED4
LD A, (#3E6B) WORKDR
0ED7
CALL #2296, BWRITE
0EDA
POP HL
;obnov ukazatel na zaË·tek dat
;a znovu si ho uloû
;jeden sektor, 255 opakov·nÌ
;do A drive, se kter˝m se pracuje
;zapiö sektor
;obnov ukazatel na zaË·tek dat
ZvÏtöÌme dÈlku souboru o 512 byt˘.
0EDB
LD DE, #FFF7
0EDE
ADD HL, DE
0EDF
0EE0
0EE2
0EE3
0EE5
0EE6
0EE7
;do DE dej ñ9
;odeËti od HL ñ v HL je adresa uloûenÌ 2. byte dÈlky
;souboru
LD A, (HL)
;vyzvedni druh˝ byte
ADD A, #02
;p¯iËti k nÏmu 2 (512 byt˘)
LD (HL), A
;a uloû ho zpÏt
JR
NC, #0EEB, STRWOK ;pokud nedoölo k posunu → skoË
INC HL
;posuÚ se na dalöÌ byte
INC (HL)
;a zvyö obsah o 1
JR
NZ, #0EEB, STRWOK ;nedoölo k posunu → skoË
A nynÌ je chyba, kter· se vöak nikdy neprojevÌ. NedovolÌ n·m to kapacita diskety. Jde tady o zv˝öenÌ 4. bytu dÈlky
souboru, kter˝ vöak nenÌ k dispozici (tam uû je uloûeno ËÌslo naposledy zapsanÈho sektoru). To by vöak ölo pouze
za p¯edpokladu, ûe na disketÏ je vÌce neû 32768 sektor˘ a pokud by jsme vytvo¯ili soubor, kter˝ by zabÌral vÌce neû
onÏch 32768 sektor˘. To vöak nejde.
0EE9
INC HL
;posuÚ se na Ëtvrt˝ byte
0EEA
INC (HL)
;a zvyö jeho obsah o 1
64
Komentovan˝ v˝pis MDOSu
ZapÌöeme zmÏny FAT, inicialicujeme promÏnnÈ MDOSu a provedeme n·vrat.
0EEB STRWOK
CALL #1D9D, WFATIFCH
;zapiö FAT, pokud byla zmÏnÏna
0EEE
CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
0EF1
POP IX
;obnov IX
0EF3
RET
;vraù se
CLOSEZEROSTR
Uzav¯e kan·l 0. Tento podprogram nenÌ odnikud vol·n, takûe ho m˘ûete pouûÌvat jen jako rutinu MDOSu.
0EF4 CLOSE0STR
0EF5
XOR A
JP
#0C24, CLOUTSTRF
;kan·l 0
;uzav¯i kan·l
ROMDRPAR
Tabulka z·kladnÌch parametr˘ disk˘ A: a B: (24 byt˘) p¯esunovan· do SRAM na DRPARZN.
Disk A:
0EF8 ROMDRPAR DB 00 00 00 00 00
;parametry diskety v A: jsou p¯i inicializaci pr·zdnÈ
0EFD
DB #18
;%00011000 ñ parametry mechaniky (6. byte)
0EFE
DB #28
;40-ti stop· mechanika
0EFF
DB #09
;9 sektor˘ na stopu
0F00
DB 00 00 00 00
;zb˝vajicÌ byty, nevyuûitÈ
Disk B:
0F04
DB 00 00 00 00 00
;parametry diskety v B: jsou p¯i inicializaci pr·zdnÈ
0F09
DB #14
;%00010100 ñ parametry mechaniky (6. byte)
0F0A
DB #50
;80-ti stop· mechanika
0F0B
DB #09
;9 sektor˘ na stopu
0F0C
DB 00 00 00 00
;zb˝vajÌcÌ byty, nevyuûitÈ
TXTSDOS
Text SDOS.
0F10 TXTSDOS
DB
53 44 4F 53
;SDOS
NUM24B
P¯evede 24 bitovÈ ËÌslo na ¯etÏzec a vytiskne ho na obrazovku.
IN:
IX adresa uloûenÌ ËÌsla (3 byty) a pomocnÈ promÏnnÈ (dalöÌ 3 byty)
(v MDOSu to je SV24NM)
OUT: ËÌslo je vytiötÏno na otev¯en˝ kan·l
v ASCIINM je uloûeno ASCII vyj·d¯enÌ ËÌsla (8 znak˘)
0F14 NUM24B
0F16
LD
LD
C, #08
HL, #3EDA ASCIINM
Nejd¯Ìve si vypoËteme ¯·dy.
0F19 CALCDIV
PUSH HL
;bude osm znak˘
;do HL adresa uloûenÌ ASCII vyj·d¯enÌ ËÌsla v SRAM
;uloû si ukazatel na ASCII vyj·d¯enÌ
Inicializujeme pomocnÈ promÏnnÈ.
0F1A
LD (IX+#03), #01
0F1E
LD (IX+#04), #00
0F22
LD (IX+#05), #00
0F26
LD A, C
0F27
DEC A
0F28
JR
Z, #0F53, SETNUM
;budeme zaËÌnat od jednotek
;tedy #000001
;do A poËet znak˘
;sniû o 1
;poslednÌ znak? ano → skoË
Komentovan˝ v˝pis MDOSu
65
0F2A
0F2B
0F2E
0F31
LD
LD
LD
LD
B, A
A, (IX+#03)
L, (IX+#04)
H, (IX+#05)
;uloû si poËet znak˘ do A
;vyzvedni si do Ñregistru HLAì ¯·dy
Vyn·sobÌme registr HLA deseti B-kr·t → dostaneme ¯·d.
0F34 MULT10
ADD A, A
0F35
ADC HL, HL
0F37
ADD A, A
0F38
ADC HL, HL
0F3A
ADD A, (IX+#03)
0F3D
LD E, (IX+#04)
0F40
LD D, (IX+#05)
0F43
ADC HL, DE
0F45
ADD A, A
0F46
ADC HL, HL
0F48
LD (IX+#03), A
;a uloû si obsah Ñregistru HLAì do pomocnÈ
0F4B
LD (IX+#04), L
;promÏnnÈ
0F4E
LD (IX+#05), H
0F51
DJNZ #0F34, MULT10
;opakuj B-kr·t
NynÌ budeme od vypisovanÈho ËÌslo odeËÌtat ¯·dy a zÌsk·me tak ËÌslici ¯·du.
0F53 SETNUM
POP HL
;obnov si ukazatel na ASCII vyj·d¯enÌ
0F54
LD (HL), #30
;uloûÌme si tam znak Ñ0ì
0F56
PUSH HL
;uloûÌme si ukazatel na ASCII vyj·d¯enÌ
0F57 SUBNUM
LD A, (IX+#00)
;do Ñregistru HLAì si vyzvedneme vypisovanÈ ËÌslo
0F5A
LD L, (IX+#01)
0F5D
LD H, (IX+#02)
0F60
SUB (IX+#03)
;a odeËteme ¯·dy
0F63
LD E, (IX+#04)
0F66
LD D, (IX+#05)
0F69
SBC HL, DE
0F6B
JR
C, #0F7B, ISLOW
;je v˝sledek z·porn˝? ano → skoË
0F6D
LD (IX+#00), A
;uloû si v˝sledek jako novÈ ËÌslo
0F70
LD (IX+#01), L
0F73
LD (IX+#02), H
0F76
POP HL
;obnov ukazatel na ASCII vyj·d¯enÌ ËÌsla
0F77
INC (HL)
;zvyö kÛd znaku
0F78
PUSH HL
;a uloû si ukazatel na ASCII vyj·d¯enÌ
0F79
JR
#0F57, SUBNUM
;skoË na dalöÌ odeËtenÌ ¯·du
ZÌskali jsme ËÌslici ¯·du, posuneme se tady na dalöÌ
0F7B ISLOW
POP HL
0F7C
INC HL
0F7D
DEC C
0F7E
JR
NZ, #0F19, CALCDIV
0F80
LD HL, #3EDA ASCIINM
0F83
LD B, #07
pozici v ASCII vyj·d¯enÌ, snÌûÌme ¯·d a opakujeme.
;obnov ukazatel na ASCII
;posuÚ se na dalöÌ znak
;sniû poËet znak˘ a ¯·d
;jeötÏ nejsou vöechny → skoË
;do HL adresa zaË·tku ASCII vyj·d¯enÌ ËÌsla v SRAM
;budeme kontrolovat 7 znak˘
OdstranÌme nev˝znamnÈ nuly na zaË·tku ËÌsla a nahradÌme je mezerami.
0F85 CLSNUL
LD A, (HL)
;vyzvedni znak
0F86
CP
#30
;je to nula?
66
Komentovan˝ v˝pis MDOSu
0F88
0F8A
0F8C
0F8D
JR
LD
INC
DJNZ
NZ, #0F8F, PRNUM
(HL), #20
HL
#0F85, CLSNUL
A vytiskneme ËÌslo na obrazovku.
0F8F PRNUM
LD HL, #3EDA ASCIINM
0F92
LD B, #08
0F94 PRNUM1
LD A, (HL)
0F95
PUSH HL
0F96
PUSH BC
0F97
RST #10
0F98
POP BC
0F99
POP HL
0F9A
INC HL
0F9B
DJNZ #0F94, PRNUM1
0F9D
RET
;ne → skoË
;uloû mÌsto nuly mezeru
;posuÚ se na dalöÌ znak
;opakuj B-kr·t
;do HL adresa ASCII vyj·d¯enÌ ËÌsla
;tiskni 8 znak˘
;vyzvedni znak
;uloû si ukazatel
;a ËÌtaË
;piö znak
;obnov ËÌtaË
;a ukazatel
;posuÚ se na dalöÌ znak
;opakuj B-kr·t
;vraù se
TESTNM
ZjistÌ, jestli je ve FNZONE1 vloûeno jmÈno souboru.
IN:
ve FNZONE1 jmÈno souboru
OUT: Z ñ je vloûeno jmÈno souboru ve FNZONE1
0F9E TESTNM
0FA1
0FA2
0FA5
LD A, (#3E8A) FNZONE1
AND A
JP
Z, #1019, REPORTF
RET
;vyzvedni prvnÌ znak jmÈna souboru
;je pr·zdnÈ?
;ano → skoË na REPORT F ÑInvalid file nameì
;vraù se
BCPRT
Rutina pro v˝pis obsahu registru BC do otev¯enÈho kan·lu.
IN:
BC ËÌslo 0 ñ 65535
OUT: vystup ËÌsla BC do otev¯enÈho kan·lu
0FA6 BCPRT
0FA7
RST #28
DW #2D2B
0FA9
0FAA
RST
DW
0FAC
RET
#28
#2DE3
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram STACK-BC uloûenÌ registru BC do
;z·sobnÌku kalkul·toru
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram PRINT-FP v˝pis ËÌsla ze z·sobnÌku
;kalkul·toru
;vraù se
ADDHLA
P¯iËte k registru HL obsah registru A.
IN:
HL 1. ËÌslo
A 2. ËÌslo
OUT: HL=HL+A
0FAD ADDHLA
0FAE
0FAF
0FB0
0FB1
ADD
LD
RET
INC
RET
A, L
L, A
NC
H
;p¯iËti L k A
;dej A do L
;jestli nedoölo k p¯eteËenÌ, vraù se
;p¯iËti k H jedniËku
;vraù se
Komentovan˝ v˝pis MDOSu
67
ANALSTE
Vymaûe oblast pro uloûenÌ jmÈna disku a souboru a pokraËuje ve rozdÏlenÌ ¯etÏzce, jehoû parametry jsou v BC
a DE, na jmÈno souboru a disku.
IN:
DE adresa uloûenÌ ¯etÏzce
BC dÈlka ¯etÏzce
OUT: v DNZONE1 je jmÈno disku, v FNZONE1 jmÈno souboru
0FB2
0FB5
0FB6
0FB7
0FB9
0FBC
0FBD
0FBE
LD HL, #3E80 DNZONE1
PUSH BC
PUSH DE
LD B, #15
CALL #104B, BNULHL
POP DE
POP BC
JR
#0FDA, DIVSTRING1
;do HL adresa 1. jmÈna disku pro I/O
;uloû si parametry ¯etÏzce
;21 byt˘ (jmÈno disku + jmÈno souboru)
;vymaû oblast
;obnov parametry ¯etÏzce
;pokraËuj v rozdÏlenÌ ¯etÏzce na jmÈno souboru a disku
DIVSTRINGCAT
Otestuje, jestli byly nÏjakÈ parametry, pokud ano, zpracuje je (rozdÏlÌ ¯etÏzec na z·sobnÌku na jmÈno souboru
a disku, uloûÌ je do pracovnÌch oblastÌ FNZONE1 a DNZONE1), pokud ne, nastavÌ jmÈno aktu·lnÌho disku do
DNZONE1 a FNZONE1 vyplnÌ znakem Ñ?ì.
0FC0 DIVSTRCAT
0FC1
0FC3
0FC5
0FC7
0FC9
0FCA
RST
CP
JR
CP
JR
RST
DW
#18
#0D
Z, #1027, NOPARCAT
Ñ:ì
Z, #1027, NOPARCAT
#28
#1C8C
0FCC
CALL #1051, TESTSYN1
;vezmi aktu·lnÌ znak
;konec ¯·dku?
;ano → skoË na vyplnÏnÌ znakem Ñ?ì
;dalöÌ p¯Ìkaz?
;ano → skoË na vyplnÏnÌ znakem Ñ?ì
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-EXP vyhodnocenÌ ¯etÏzce
;vyzvedne parametr p¯Ìkazu
;otestuj, jestli nenÌ kontrola syntaxe
DIVSTRING
Tento podprogram vyzvedne parametry ¯etÏzce ze z·sobnÌku, rozdÏlÌ ho na jmÈno disku a jmÈno souboru, kterÈ
uloûÌ do DNZONE1 a FNZONE1.
IN:
parametry ¯etÏzce na z·sobnÌku kalkul·toru
OUT: v DNZONE1 je jmÈno disku, v FNZONE1 jmÈno souboru
0FCF DIVSTRING
0FD2
0FD4
0FD7
0FD8
LD HL, #3E80 DNZONE1
LD B, #15
CALL #104B, BNULHL
RST #28
DW #2BF1
;do HL adresa 1. jmÈna disku pro I/O
;jmÈno disku a jmÈno souboru je celkem 21 byt˘
;vymaûeme tuto oblast
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram STK-FETCH vyhodnocenÌ ¯etÏzce
;ze z·sobnÌku je vyzvednut ¯etÏzec, v BC je dÈlka, v DE
;je adresa uloûenÌ
VyhodnotÌme ¯etÏzec, v DE je adresa uloûenÌ, v BC je dÈlka ¯etÏzce, jmÈno disku se uloûÌ do DNZONE1 a jmÈno
souboru do FNZONE1.
0FDA DIVSTRING1 EX DE, HL
;dej do HL zaË·tek ¯etÏzce
0FDB
INC B
;zvyö hornÌ byte dÈlky o 1
0FDC
DEC B
;je ¯etÏzec dlouh˝?
0FDD
JP
NZ, #1019, REPORTF ;ano → skoË na REPORT F ÑInvalid file nameì
0FE0
LD B, C
;do B dej dÈlku ¯etÏzce
68
Komentovan˝ v˝pis MDOSu
0FE1
0FE2 DIVLOOP
0FE3
0FE4
0FE7
INC B
DEC B
RET Z
LD DE, #3E80 DNZONE1
CALL #1064, GETNAME
;zvyö o jedniËku
;je konec ¯etÏzce?
;ano → vraù se
;do DE adresa 1. jmÈna disku pro I/O
;vyzvedni prvnÌ jmÈno po znaky Ñ : ì, Ñ . ì nebo do
;konce ¯etÏzce
NynÌ zjistÌme, co bylo vybr·no jako prvnÌ (jmÈno disku nebo souboru).
0FEA
JR
NZ, #0FF6, MOVENAME
;je konec ¯etÏzce → skoË
0FEC
JR
NC, #100A, NEXTANAL
;bylo prvnÌ jmÈno disku → skoË
Bylo vybr·no jmÈno souboru.
0FEE
LD A, (HL)
0FEF
LD (#3E94), A EXTE1
0FF2
DEC B
0FF3
DEC B
0FF4
JR
NZ, #1019, REPORTF
;vyzvedni p¯Ìponu souboru
;a uloû ji do jmÈna souboru ve FNZONE1
;sniû B o 2 (teËka a p¯Ìpona)
;jestli nenÌ konec ¯etezce → skoË na REPORT F ÑInvalid
;file nameì, protoûe za jmÈnem souboru jsou jeötÏ znaky
Protoûe nebylo vloûeno jmÈno disku a jako prvnÌ bylo vybr·no jmÈno souboru, kterÈ je uloûeno ve DNZONE1,
je t¯eba ho p¯esunout do FNZONE1.
0FF6 MOVENAME LD HL, #3E80 DNZONE1 ;do HL adresa uloûenÌ analyzovanÈho jmÈna
0FF9
LD DE, #3E8A FNZONE1 ;do DE adresa 1. jmÈna souboru pro I/O
0FFC
LD BC, #000A
;dÈlka je 10 znak˘
0FFF
LDIR
;p¯esuÚ jmÈno souboru na spr·vnÈ mÌsto
1001
LD HL, #3E80 DNZONE1 ;do HL adresa 1. jmÈna disku pro I/O
1004
LD B, #0A
;10 znak˘
1006
CALL #104B, BNULHL
;vymaû jmÈno disku, protoûe nebylo vloûeno
1009
RET
;vraù se
Jako prvnÌ bylo vloûeno jmÈno disku, proto budeme pokraËovat.
100A
LD A, C
;do A dÈlka zpracovanÈho ¯etÏzce
100B
AND A
;je dÈlka nulov·
100C
JR
Z, #0FE2, DIVLOOP
;ano → skoË na pokraËov·nÌ ve v˝bÏru
100E
DEC B
;sniû dÈlku zpracovanÈho ¯etÏzce o jedniËku (:)
100F
RET Z
;byl uû zpracovan˝ cel˝ ¯etezec → vraù se
Vybereme zb˝vajÌcÌ Ë·st ¯etÏzce.
1010
LD DE, #3E8A FNZONE1
1013
CALL #1064, GETNAME
1016
1018
JR
C, #101E, ANALFNM
RET NZ
JmÈno souboru bylo dlouhÈ.
1019 REPORTF
LD A, #0E
101B
JP
#0204, ERRR
101E ANALFNM
LD A, (HL)
101F
LD (#3E94), A EXTE1
1022
DEC B
1023
DEC B
1024
RET Z
1025
JR
#1019, REPORTF
;do DE adresa 1. jmÈna souboru pro I/O
;vyzvedni jmÈno po znaky Ñ : ì, Ñ . ì nebo do konce
;¯etÏzce
;byl to jmÈno souboru → skoË
;byl konec ¯etÏzce → vraù se
;REPORT F ÑInvalid file nameì
;piö hl·öenÌ a skoË do ZX ROM
;vyzvedni p¯Ìponu z ¯etÏzce
;a uloû ji do jmÈna souboru v FNZONE1
;sniû B o 2 (teËku a p¯Ìponu)
;vöechny znaky zpracov·ny → vraù se
;skoË na REPORT F ÑInvalid file nameì
Komentovan˝ v˝pis MDOSu
69
NOPARCAT
VyplnÌ FNZONE1 znakem Ñ?ì a nastavÌ jmÈno aktu·lnÌho disku do DNZONE1.
IN:
ñ
OUT: FNZONE1 je vyplnÏn znakem Ñ?ì a v DNZONE1 je jmÈno aktu·lnÌho disku
1027 NOPARCAT
CALL #1051, TESTSYN1
;otestuj, jestli nenÌ kontrola syntaxe
Neprov·dÌ se kontrola syntaxe, provedeme operaci.
102A
LD HL, #3E8A FNZONE1
102D
LD DE, #3E8B
1030
LD (HL), Ñ?ì
1032
LD BC, #000A
1035
LDIR
;do HL adresa 1. jmÈna souboru pro I/O
;do DE adresa dalöÌho znaku v FNZONE1
;vyplnÌme FNZONE1 i s p¯Ìponou znakem Ñ?ì
;11 znak˘
;vyplÚ
VyplnÌ DNZONE1 jmÈnem aktu·lnÌho disku.
1037 MOVEWDNM LD HL, #3EAA ACDRIVE
103A
LD DE, #3E80 DNZONE1
103D
LD BC, #000A
1040
LDIR
1042
RET
;do HL adresa jmÈna aktu·lnÌho drivu
;do DE adresa 1. jmÈna disku pro I/O
;dÈlka 10 znak˘
;p¯esuÚ
;vraù se
SETWDNM
Zkontroluje, jestli je jmÈno disku pro I/O v DNZONE1. Pokud ne, je zde vloûeno jmÈno aktu·lnÌho drivu.
IN:
jmÈno disku pro I/O v DNZONE1
OUT: jmÈno disku pro I/O v DNZONE1
1043 SETWDNM
1046
1047
1048
1049
LD
LD
AND
RET
JR
HL, #3E80 DNZONE1
A, (HL)
A
NZ
#1037, MOVEWDNM
;do HL adresa 1. jmÈna disku pro I/0
;vezmi prvnÌ znak ze jmÈna
;je jmÈno pr·zdnÈ?
;ne → vraù se
;skoË na vyplnÏnÌ jmÈnem aktu·lnÌho disku
BNULHL
UloûÌ B nul od adresy v HL.
IN:
HL adresa uloûenÌ
B poËet nulovan˝ch byt˘
OUT: vynuluje B byt˘ od adresy v HL
104B BNULHL
104D
104E
1050
LD (HL), #00
INC HL
DJNZ #104B, BNULHL
RET
;uloû na adresu v HL nulu
;posuÚ se na dalöÌ adresu
;opakuj B-kr·t
;vraù se
TESTSYN1
Testuje, jestli nejde o kontrolu syntaxe. Pokud ano, vyzvedne se jednu n·vratovou adresu vÌce (kontrola je vol·na
z procedur vyuûÌvan˝ch programy) a jde se zpÏt do ZX ROM.
1051 TESTSYN1
1052
1053
1054
1055
70
RST
RET
POP
NOP
JR
#30
NZ
BC
#1059, SYNCRET
;testuj bit
;jestli se prov·dÌ p¯Ìkaz, vraù se zpÏt
;vyzvedni n·vratovou adresu z procedury
;tady si odpoËiÚ
;pokraËuj v n·vratu do ZX ROM
Komentovan˝ v˝pis MDOSu
ISSYNCONTR
Testuje, jestli nejde o kontrolu syntaxe. Pokud ano, vyzvedne n·vratovÈ adresy a vr·tÌ se zpÏt do ZX ROM. Tento
test se vol· p¯Ìmo z program˘, kterÈ prov·dÏjÌ p¯Ìkazy.
1057 ISSYNCONTR
1058
1059 SYNCRET
105A
105B
105C
RST #30
RET NZ
POP BC
POP BC
POP BC
PUSH HL
105D
1060
1063
LD
EX
JP
;testuj bit
;jestli se provadÌ p¯Ìkaz, vraù se
;vyzvedni ze z·sobnÌku n·vratovÈ adresy
;tyto dvÏ instrukce tady v˘bec nemusely b˝t. PrvnÌ
;vyzved·v· n·vratovou adresu a druh· ukl·d· na
;z·sobnÌk nÏjakou hodnotu
HL, #1BF4 STMT-NEXT ;n·vratov· adresa do ZX ROM
(SP), HL
;uloû ji na z·sobnÌk
#1700, STANDROM
;skoË na p¯estr·nkov·ni do ZX ROM
GETNAME
Tento podprogram vyzvedne jmÈno souboru nebo disku z ¯etÏzce buÔ po znaky Ñ . ì a Ñ : ì nebo aû je do konce
¯etÏzce, pokud nenÌ jmÈno delöÌ neû 10 znak˘.
IN:
HL zaË·tek ¯etÏzce
DE adresa, kam se bude ukl·dat jmÈno disku nebo souboru
B
dÈlka ¯etÏzce
OUT: Z, NC bylo vybr·no jmÈno disku
Z, C
bylo vybr·no jmÈno souboru
NZ, NC byl konec ¯etÏzce
B
zb˝vajÌcÌ znaky ¯etÏzce
C
dÈlka vybranÈho ¯etÏzce
1064 GETNAME
1066 MAKENAME
1067
1068
106A
106B
106D
106E
106F
1070
1071
1072
1073
1075
1078
107A
107B
LD
LD
INC
CP
RET
CP
SCF
RET
LD
INC
INC
LD
CP
JP
DJNZ
AND
RET
C, #00
A, (HL)
HL
Ñ:ì
Z
Ñ.ì
Z
(DE), A
DE
C
A, C
#0B
NC, #1019, REPORTF
#1066, MAKENAME
A
;nastav na zaË·tku poËÌtadlo znak˘ na 0
;vyzvedni znak z ¯etÏzce
;posuÚ se na dalöÌ znak v ¯etÏzci
;je to Ñ : ì?
;ano → vraù se s p¯Ìznaky Z, NC
;je to Ñ . ì?
;nastav CY
;ano → vraù se s p¯Ìznaky Z, C
;uloû znak do jmÈna
;posuÚ se na dalöÌ znak ve jmÈnu
;zvyö dÈlku jmÈna
;dej dÈlku do A
;je jmÈno delöÌ neû 10 znak˘?
;ano → skoË na REPORT F ÑInvalid file nameì
;sniû v B dÈlku ¯etÏzce a vezmi dalöÌ znak
;nastav NC, NZ
;vraù se
ARRANGNM
Tento podprogram upravÌ jmÈno souboru ve FNZONE1 na masku. P¯evede Ñ*ì na otaznÌky do konce jmÈna.
IN:
ve FNZONE1 jmÈno souboru
OUT: ve FNZONE1 jmÈno souboru upravenÈ na masku
C bylo pouûito wildchars
NZ byla vloûena p¯Ìpona
Z nebyla vloûena p¯Ìpona
Komentovan˝ v˝pis MDOSu
71
107C ARRANGNM LD
HL, #3E8A FNZONE1
;do HL adresa jmÈna souboru
Nejd¯Ìve otestujeme, jestli bylo v˘bec vloûeno jmÈno souboru. Pokud ne, upravÌme ho na Ñ*ì.
107F
LD A, (HL)
;vyzvedni prvnÌ znak ze jmÈna
1080
AND A
;bylo vloûeno jmÈno?
1081
JR
NZ, #1085, ARNGNM1 ;ano → skoË
1083
LD (HL), Ñ*ì
;dej jako prvnÌ znak Ñ*ì ñ wildchars,
1085 ARNGNM1
LD B, #0A
;budeme analyzovat deset znak˘
1087
LD C, #00
;poËÌtadlo znaku je na zaË·tku 0
1089 ARRLOPPLD A, (HL)
;vyzvedni znak jmÈna
108A
AND A
;je konec?
108B
JR
Z, #109A, ARRANGEXT;ano → skoË na ˙pravu p¯Ìpony
108D
CP
Ñ*ì
;je to hvÏzdiËka?
108F
JR
Z, #10A1, FILLMARK ;ano → skoË na vyplnÏnÌ otaznÌky
1091
CP
Ñ?ì
;je to otaznÌk?
1093
JR
NZ, #1097, NOWILD ;ne → skoË
1095
SET 0, C
;nastav p¯Ìznak Ñpouûito wildcharsì
1097 NOWILD
INC HL
;posuÚ se na dalöÌ znak jmÈna
1098
DJNZ #1089, ARRLOPP
;opakuj B-kr·t
109A ARRANGEXT CALL #10B3, SETEXT
;nastav p¯Ìponu
109D
AND A
;nastav NC
109E
RR
C
;nastav C, jestli bylo pouûito wildchars a Z, jestli nebyla
10A0
RET
;vloûena p¯Ìpona a vraù se
DoplnÌme jmÈno souboru znakem Ñ?ì mÌsto Ñ*ì.
10A1 FILLMARK LD (HL), Ñ?ì
10A3
INC HL
10A4
DEC B
10A5 FILLMARK1 LD A, (HL)
10A6
LD (HL), Ñ?ì
10A8
INC HL
10A9
AND A
10AA
JP
NZ, #1019, REPORTF
10AD
DJNZ #10A5, FILLMARK1
10AF
SET 0, C
10B1
JR
#109A, ARRANGEXT
SETEXT
NastavÌ p¯Ìponu v EXTE1.
IN:
#3E94 (EXTE1)
OUT: #3E94 (EXTE1)
1. bit reg. C=1
1. bit reg. C=0
10B3 SETEXT
10B5
10B8
10BB
10BD
10BF
10C0
10C2
72
;nahraÔ znak Ñ*ì znakem Ñ?ì
;posuÚ se na dalöÌ znak
;sniû poËÌtadlo
;vyzvedni znak ze jmÈna
;uloû mÌsto nÏj Ñ?ì
;posuÚ se na dalöÌ znak
;bylo nÏco za Ñ*ì vloûeno?
;ano → skoË na REPORT F ÑInvalid file nameì
;opakuj B-kr·t
;nastav p¯Ìznak Ñpouûito wildcharsì
;pokraËuj v ˙pravÏ p¯Ìpony souboru
p¯Ìpona souboru
upraven· p¯Ìpona (Ñ*ì a Ñ?ì)
byla vloûena p¯Ìpona
nebyla vloûena p¯Ìpona
SET 1, C
LD A, (#3E94) EXTE1
CALL #1118, UPPER
CP
Ñ*ì
JR
Z, #10C4 , SETMARK
AND A
JR
NZ, #10C6, EXTIS
RES 1, C
;nastav sign·l Ñp¯Ìpona pouûitaì
;vyzvedni p¯Ìponu souboru do A
;p¯eveÔ ji na velkÈ pÌsmeno
;je to hvÏzdiËka?
;ano → skoË
;p¯Ìpona nebyla zad·na?
;ne → skoË
;nastav sign·l ÑnenÌ p¯Ìponaì
Komentovan˝ v˝pis MDOSu
10C4 SETMARK
LD
A, Ñ?ì
;jako p¯Ìponu uloûÌme Ñ?ì
ProhlÈdneme tabulku povolen˝ch p¯Ìpon a zjistÌme,
10C6 EXTIS
LD (#3E94), A EXTE1
10C9
PUSH HL
10CA
PUSH BC
10CB
LD HL, #10DB EXTTAB
10CE
LD BC, #0007
10D1
CPIR
10D3
POP BC
10D4
POP HL
10D5
RET Z
10D6
LD A, #2B
10D8
JP
#0204, ERRR
jestli je vloûen· p¯Ìpona povolena.
;uloû p¯Ìponu souboru
;uloû HL
;uloû BC
;do HL tabulka povolen˝ch p¯Ìpon
;7 moûn˝ch p¯Ìpon
;porovnej vloûenou p¯Ìponu s tabulkou
;obnov HL
;obnov BC
;p¯Ìpona existuje → vraù se zpÏt
;REPORT c ÑBad file typeì
;piö hl·öenÌ a skoË do ZX ROM
EXTTAB
ProgramovÈ p¯Ìpony pouûÌvanÈ MDOSem.
10DB EXTTAB
DB
50 4E 43 42 51 53 3F
;P N C B Q S ?
ANALWDNM
Tento podprogram analyzuje jmÈno disku v DNZONE1 pro I/O.
IN:
jmÈno disku v DNZONE1
OUT: Z, C
nenÌ jmÈno v DNZONE1
NZ, C v DNZONE1 je norm·lnÌ jmÈno disku
NZ, NC v DNZONE1 je jmÈno disku uvedeno jako mechanika (A, B, C, D)
v A je ËÌslo mechaniky (0, 1, 2, 3)
pokud reg. A=255, bylo öpatnÏ vloûeno jmÈno disku
10E2 ANALWDNM LD
10E5 ANALWNM LD
Nejd¯ive zjistÌme,
10E7 ANALWDCH
10E8
10E9
10EB
10EE
10F0
10F1
HL, #3E80 DNZONE1
B, #0A
;do HL adresa 1. jmÈna disku pro I/O
;dÈlka jmÈna je 10 byt˘
jestli jmÈno disku v DNZONE1 neobsahuje nÏjak˝ öpatn˝ znak.
LD A, (HL)
;vezmi znak ze jmÈna do A
AND A
;konec jmÈna?
JR
Z, #10F3, ANALWDEN ;ano → skoË
CALL #111F, ISALFNUM
;je to alfanumerick˝ znak?
JR
NC, #1113, REPORTb, ;ne → skoË na REPORT b ÑBad volume nameì
INC HL
;posuÚ se na dalöÌ znak jmÈna
DJNZ #10E7, ANALWDCH
;opakuj B-kr·t
NynÌ otestujeme, jakÈ jmÈno disku bylo vloûeno.
10F3 ANALWDEN LD HL, #3E80 DNZONE1
10F6
LD A, (HL)
10F7
AND A
10F8
RET Z
Otestujeme, jestli je dÈlka
10F9
INC
10FA
LD
10FB ANALWDNM1 AND
10FC
SCF
;do HL adresa 1. jmÈna disku pro I/O
;vezmi prvnÌ znak ze jmÈna do A
;bylo v˘bec vloûeno?
;ne → vraù se s Z, NC
jmÈna 1 nebo vÌce znak˘.
HL
;posuÚ se na dalöÌ znak
A, (HL)
;vezmi druh˝ znak ze jmÈna do A
A
;je konec jmÈna?
;nastav C
Komentovan˝ v˝pis MDOSu
73
10FD
;ne → vraù se NZ, C
RET NZ
JmÈno disku tvo¯Ì jeden znak. ZjistÌme, jestli to nenÌ urËenÌ mechaniky (A, B, C, D). Je zde vöak mal˝ nedostatek,
protoûe tato kontrola neumoûnÌ pouûÌvat disketu se jmÈnem ÑEì.
10FE
DEC HL
;jdi o jeden znak zpÏt
10FF
LD A, (HL)
;vyzvedni prvnÌ znak jmÈna
1100
CALL #1118, UPPER
;p¯eveÔ na velkÈ pÌsmeno
1103
SUB ÑAì
;odeËti 65
1105
RET C
;bylo menöÌ neû ÑAì → vraù se s NZ, C
1106
CP
#05
;nastav Z pro urËenÌ kombinace
1108
JR
Z, #10FB, ANALWDNM1;nenÌ urËenÌ mechaniky → skoË na n·vrat s NZ, C
110A
CCF
;neguj CY
110B
RET C
;nenÌ urËenÌ mechaniky → vraù se s NZ, C
110C
CP
#04
;je to znak ÑAìñìDì?
110E
CCF
;neguj CY
110F
RET NZ
;je → vraù se s NZ, NC, v A je ËÌslo mechaniky
Byla vloûena öpatn· mechanika.
1110
OR #FF
1112
RET
1113 REPORTb
LD A, #2A
1115
JP
#0204, ERRR
;nastav NZ, NC, A=255
;vraù se
;REPORT b ÑBad volume nameì
;piö hl·öenÌ a skoË do ZX ROM
UPPER
Pokud je znak v A alfabetick˝, p¯evede ho na velkÈ pÌsmeno.
IN:
A znak
OUT: A pokud je alfabetick˝, je zde p¯eveden na velkÈ pÌsmeno
1118 UPPER
111B
111C
111E
ISALFNUM
Testuje, je-li znak
IN:
A
OUT: C
NC
111F ISALFNUM
1122
1123
CALL #1124, ISALFABET
RET NC
AND #DF
RET
;testuj, jestli to je alfabetick˝ znak
;nenÌ → vraù se
;p¯eveÔ na velkÈ pÌsmeno
;vraù se
v A alfanumerick˝.
znak
je alfanumerick˝
nenÌ alfanumerick˝
CALL #1132, ISNUM
CCF
RET C
;je to ËÌslice?
;neguj C
;ano → vraù se s C
ISALFABET
Testuje, je-li znak v A alfabetick˝.
IN:
A znak
OUT: C je alfabetick˝
NC nenÌ alfabetick˝
1124 ISALFABET
1126
1127
74
CP
ÑAì
CCF
RET NC
;je menöÌ neû znak ÑAì?
;neguj C
;ano → vraù se s NC
Komentovan˝ v˝pis MDOSu
1128
112A
112B
112D
112E
112F
1131
CP
RET
CP
CCF
RET
CP
RET
ÑZì+1
C
Ñaì
;je mezi znaky ÑAìñÑZì?
;ano → vraù se s C
;je menöÌ neû znak Ñaì a vÏtöÌ neû znak ÑZì?
;neguj C
;ano → vraù se s NC
;je mezi znaky ÑaìñÑzì?
;vraù se s p¯Ìznakem C
NC
Ñzì+1
ISNUM
Testuje, je-li znak v A ËÌslice.
IN:
A znak
OUT: NC je ËÌslice
C nenÌ ËÌslice
1132 ISNUM
1134
1135
1137
1138
CP
Ñ0ì
RET C
CP
Ñ9ì+1
CCF
RET
;je menöÌ neû znak Ñ0ì?
;ano → vraù se s C
;je vÏtöÌ neû znak Ñ9ì?
;neguj p¯Ìznak C
;vraù se
RUN
P¯Ìkaz pro nahr·nÌ BASIC souboru se jmÈnem Ñrunì do pamÏti. Pokud byl uloûen s parametrem LINE, je takÈ
spuötÏn.
Syntaxe:
RUN
P¯Ìkaz prohled· adres·¯ aû najde soubor se jmÈnem Ñrun.pì nebo Ñrun.sì a nat·hne ho do pamÏti. V pamÏti nesmÌ
b˝t û·dn˝ jin˝ BASIC program, protoûe by ho p¯Ìkaz RUN spustil, mÌsto aby hledal soubor.
Vytvo¯Ìme si prostor v pamÏti pro uloûenÌ jmÈna souboru.
1139 RUN
LD BC, #0005
;velikost prostoru je 5 byt˘
113C
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
113D
DW #0030
;podprogram BC-SPACES vytvo¯ prostor BC byt˘
;vytvo¯Ìme prostor pro jmÈno souboru
P¯esuneme jmÈno do pamÏti.
113F
LD HL, #1157 TXTRUN
1142
LD BC, #0003
1145
PUSH DE
1146
LDIR
1148
LD BC, #0003
114B
POP DE
;adresa n·zvu Ñrunì v ROM D40
;dÈlka je 3 byty
;uloû si zaË·tek jmÈna souboru v RAM
;p¯esuÚ jmÈno do vytvo¯enÈho prostoru
;dÈlka stringu je 3
;obnov adresu zaË·tku jmÈna souboru
UloûÌme parametry jmÈna souboru na z·sobnÌk kalkul·toru.
114C
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
114D
DW #2AB2
;podprogram STK-ST-0 uloûenÌ registry do z·sobnÌku
;kalkul·toru ñ uloûÌme poË·teËnÌ adresu jmÈna a dÈlku
;jmÈna na z·sobnÌk kalkul·toru
A provedeme p¯Ìkaz LOAD.
114F
LD A, #01
1151
LD (#5C74), A T_ADDR
1154
JP
#1716, SMLSTART
;do A p¯Ìznak ÑLOADì souboru
;uloû si p¯Ìznak operace
;skoË na LOAD souboru
Komentovan˝ v˝pis MDOSu
75
TXTRUN
Text Ñrunì.
1157 TXTRUN
DB
72 75 6E
;run
CATNOINF
Tento podprogram zajiöùuje prov·dÏnÌ p¯Ìkazu CAT, pokud byl pouûit znak Ñ-ì. Vypisuje katalog bez informacÌ
o souborech.
115A CATNOINF
RST
#20
;vezmi dalöÌ znak
NastavÌme jmÈno drivu a masku soubor˘.
115B
CALL #0FC0, DIVSTRCAT
115E
CALL #1043, SETWDNM
1161
CALL #107C, ARRANGNM
1164
CALL #1C8F, SETACT
1167
1169
116A
LD
RST
DW
A, #02
#28
#1601
Vytiskneme hlaviËku a jmÈno diskety v drivu.
116C
XOR A
116D
LD DE, #12AD TXTCAT2
1170
CALL #01C8, PRTMES
1173
CALL #2199, NAMEDISK
1176
CALL #128D, PRTSTR
1179
LD A, #0D
117B
RST #10
117C
LD A, #0D
117E
RST #10
;vyzvedni parametry p¯Ìkazu a zpracuj je
;nastav jmÈno disku v DNZONE1 pro I/O
;uprav jmÈno souboru v FNZONE1 na masku
;roztoË mechaniku, kter· m· stejnÈ jmÈno, jako
;v DNZONE1
;kan·l 2 (hornÌ Ë·st obrazovky)
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram CHAN-OPEN otev¯enÌ kan·lu
;poloûka 0 ñ ÑCatalogue of ì
;tabulka text˘ p¯Ìkazu CAT
;piö poloûku textu
;do HL adresa jmÈna drivu, na jehoû parametry ukazuje IX
;vytiskni jmÈno diskety
;nov˝ ¯·dek
;tiskni
;nov˝ ¯·dek
;tiskni
NynÌ postupnÏ vytiskneme vöechny nepr·zdnÈ poloûky adres·¯e.
117F
LD A, #FF
;zaËneme od prvnÌ poloûky adres·¯e
1181
LD C, #00
;v C bude ËÌtaË poËtu obsazen˝ch poloûek adres·¯e
1183 CATNOLOOP CALL #212D, NEXTMASK
;naËti nepr·zdnou poloûku adres·¯e od A vyhovujÌcÌ
;masce v FNZONE1
1186
JR
NZ, #11A2, PRINTINF ;uû û·dn· nenÌ → skoË
1188
INC C
;zvyö poËet soubor˘ na disketÏ
1189
PUSH BC
;uloû si ËÌtaË
118A
PUSH AF
;a ËÌslo poloûky v adres·¯i
Otestujeme, jestli nem· nastaven atribut HIDDEN.
118B
CALL #1283, GETATR
;vyzvedni atributy souboru
118E
BIT 7, A
;je HIDDEN?
1190
JR
NZ, #119E, ISHIDEEN ;ano → nevypisuje se ñ skoË
Vytiskneme p¯Ìponu a jmÈno.
1192
LD A, (HL)
1193
INC HL
1194
RST #10
1195
LD A, #20
76
;vyzvedni p¯Ìponu souboru
;posuÚ se na prvnÌ znak jmÈna souboru
;tisknim p¯Ìponu
;mezera
Komentovan˝ v˝pis MDOSu
1197
1198
119B
119D
119E ISHIDDEN
119F
11A0
RST #10
CALL #128D, PRTSTR
LD A, #06
RST #10
POP AF
POP BC
JR
#1183, CATNOLOOP
;tiskni
;vytiskni jmÈno souboru
;posun na dalöÌ tabelaËnÌ pozici
;tiskni
;obnov registry
;opakuj pro dalöÌ poloûku
PRINTINF
Vytiskne poËet soubor˘ na disketÏ a volnou kapacitu diskety.
IN:
C poËet soubor˘ na disketÏ
OUT: vytiskne poËet soubor˘ a volnou kapacitu
11A2 PRINTINF
11A3
11A5
11A6
11A8
11A9
11AA
11AC
11AF
11B2
11B4
11B7
11BA
11BC
11C0
11C2
11C4
11C8
11CB
11CE
11D1
11D3
11D5
11D8
11DB
11DE
PUSH BC
LD A, #0D
RST #10
LD A, #0D
RST #10
POP BC
LD B, #00
CALL #0FA6, BCPRT
LD DE, #12AD TXTCAT2
LD A, #01
CALL #01C8, PRTMES
CALL #1DC2, FREECOUNT
PUSH IX
LD IX, #3ED4 SV24NM
SLA C
RL
B
LD (IX+#00), #00
LD (IX+#01), C
LD (IX+#02), B
CALL #0F14, NUM24B
POP IX
LD A, #02
LD DE, #12AD TXTCAT2
CALL #01C8, PRTMES
CALL #217B, ERAVAR
RET
;uloû si poËet soubor˘ na disku
;nov˝ ¯·dek
;tiskni
;nov˝ ¯·dek
;tiskni
;obnov poËet soubor˘ na disku
;do B dej 0
;piö poËet soubor˘ na disketÏ na obrazovku
;tabulka text˘ p¯Ìkazu CAT
;poloûka 1 ñ ÑFile(s), ì
;piö text poloûky
;spoËÌtej poËet voln˝ch sektor˘ na disketÏ
;uloû si IX
;do IX adresu mÌsta pro v˝poËet kapacity disku
;BC vyn·sob dvÏma (n·sobenÌ 512-ti)
;prvnÌ byte je nula
;druh˝ byte je C
;t¯etÌ byte je B
;p¯eveÔ a tiskni kapacitu diskety
;obnov si IX
;poloûka 2 ñ ÑBytes free.ì
;tabulka text˘ p¯Ìkazu CAT
;piö text poloûky
;vymaû pomocnÈ promÏnnÈ MDOSu
;vraù se p¯es RETURN do ZX ROM
CAT
P¯Ìkaz pro v˝pis soubor˘ uloûen˝ch na disketÏ.
Syntaxe:
CAT [-] ["[Za¯ÌzenÌ:][MaskaSouboru]"]
P¯Ìkaz vypÌöe soubory uloûenÈ na disketÏ. Znak Ñ-ì znamen·, ûe se nebudou vypisovat podrobnÏjöÌ informace
o souborech (atributy a dÈlka souboru). ÑZa¯ÌzenÌì urËuje drive, pro kter˝ se p¯Ìkaz provede (ÑA:ì, Ñdisk:ì atd.).
ÑMaskaSouboruì urËuje, kterÈ soubory se budou vypisovat. Pokud nenÌ vloûeno, vypisujÌ se vöechny (ekvivalentnÌ
pouûitÌ Ñ*.*ì). P¯Ìklad: Ñ*.Pì, ÑDOP*.Bì, ÑDAT?.*ì atd. M˘ûe se tedy pouûÌvat wildchars (hvÏzdiËkov· konvence).
V˝sledek p¯Ìkazu nelze p¯esmÏrovat do sekvenËnÌho souboru.
Nejd¯Ìve otestujeme znak Ñ-ì.
11DF CATFN
RST #18
11E0
CP
Ñ-ì
;vezmi aktu·lnÌ znak
;je to mÌnus?
Komentovan˝ v˝pis MDOSu
77
11E2
JP
Z, #115A, CATNOINF
Budeme tedy vypisovat vöechno.
11E5
CALL #0FC0, DIVSTRCAT
11E8
CALL #1043, SETWDNM
11EB
CALL #107C, ARRANGNM
11EE
CALL #1C8F, SETACT
11F1
11F3
11F4
LD
RST
DW
A, #02
#28
#1601
Vytiskneme hlaviËku a jmÈno diskety.
11F6
XOR A
11F7
LD DE, #129E TXTCAT1
11FA
CALL #01C8, PRTMES
11FD
CALL #2199, NAMEDISK
1200
CALL #128D, PRTSTR
1203
LD A, #0D
1205
RST #10
1206
LD A, #0D
1208
RST #10
;ano → skoË na v˝pis adres·¯e soubor˘ bez informacÌ
;vyzvedni parametry p¯Ìkazu a zpracuj je
;nastav jmÈno disku v DNZONE1 pro I/O
;uprav jmÈno souboru na masku v FNZONE1
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
;kan·l 2 (hornÌ Ë·st obrazovky)
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram CHAN-OPEN otev¯enÌ kan·lu
;poloûka 0 ñ ÑDirectory of ì
;tabulka text˘ p¯Ìkazu CAT
;piö text poloûky
;do HL adresa jmÈna drivu, na jehoû parametry ukazuje IX
;vytiskni jmÈno diskety
;nov˝ ¯·dek
;tiskni
;nov˝ ¯·dek
;tiskni
NynÌ postupnÏ vytiskneme vöechny nepr·zdnÈ poloûky adres·¯e.
1209
LD A, #FF
;zaËneme od 1. poloûky adres·¯e
120B
LD C, #00
;v C bude poËÌtadlo soubor˘ na disketÏ
120D CATFNLOOP CALL #212D, NEXTMASK
;naËti nepr·zdnou poloûku adres·¯e od A vyhovujÌcÌ
;masce v FNZONE1
1210
JR
NZ, #11A2, PRINTINF ;û·dn· nenÌ → skoË na v˝pis zb˝vajÌcÌch informacÌ
1212
INC C
;zvyö poËÌtadlo soubor˘
1213
PUSH AF
;uloû si ËÌslo poloûky
ZjistÌme, jestli nenÌ HIDDEN.
1214
CALL #1283, GETATR
1217
BIT 7, A
1219
LD B, A
121A
PUSH BC
121B
JR
NZ, #1276, FNISHID
121D
PUSH HL
121E
LD A, (HL)
121F
INC HL
1220
RST #10
1221
LD A, #20
1223
RST #10
1224
CALL #128D, PRTSTR
1227
POP HL
1228
LD A, #0B
122A
CALL #0FAD, ADDHLA
;vyzvedni atributy souboru
;je HIDDEN?
;uloû atributy do B
;a uloû je na z·sobnÌk
;ano → nevypisuje se ñ skoË
;uloû si ukazatel na poloûku adres·¯e v buferu
;vyzvedni p¯Ìponu souboru
;posuÚ se na prvnÌ znak jmÈna souboru
;tiskni p¯Ìponu
;mezera
;tiskni
;vytiskni jmÈno souboru
;obnov ukazatel na poloûku adres·¯e
;1. byte velikosti souboru je v hlaviËce na +11
;posuÚ se tam
Vytiskneme velikost souboru.
122D
PUSH IX
;uloû si IX
78
Komentovan˝ v˝pis MDOSu
122F
1233
1234
1237
1238
1239
123C
123E
1241
1242
1245
1247
1248
124A
124B
124C
124D
1250
1252
1254
1255
1257
1258
1259
125A
125B
125C
125F
LD IX, #3ED4 SV24NM
LD A, (HL)
LD (IX+#00), A
INC HL
LD A, (HL)
LD (IX+#01), A
LD A, #09
CALL #0FAD, ADDHLA
LD A, (HL)
LD (IX+#02), A
LD A, #17
RST #10
LD A, #0E
RST #10
XOR A
RST #10
CALL #0F14, NUM24B
POP IX
LD A, #17
RST #10
LD A, #17
RST #10
XOR A
RST #10
POP BC
PUSH BC
LD HL, #127B DEFATTR
LD E, #08
PostupnÏ projdeme atributy a pokud je nastaven, je
1261 CATFNATT
RL
B
1263
LD A, (HL)
1264
INC HL
1265
JR
C, #1269, CATFNAPR
1267
LD A, Ñ - ì
Vytiskneme atribut.
1269 CATFNAPR
PUSH HL
126A
PUSH DE
126B
PUSH BC
126C
RST #10
126D
POP BC
126E
POP DE
126F
POP HL
1270
DEC E
1271
JR
NZ, #1261, CATFNATT
1273
LD A, #0D
1275
RST #10
1276 FNISHID
POP BC
1277
POP AF
1278
JP
#120D, CATFNLOOP
;do IX adresa pro v˝poËet velikosti souboru
;vyzvedni 1. byte velikosti souboru
;uloû ho
;posuÚ na 2. byte velikosti souboru
;vyzvedni ho
;a uloû ho
;3. byte velikosti souboru je v hlaviËce na +9
;posuÚ tam ukazatel
;vyzvedni 3. byte velikosti souboru
;uloû ji na 3. byte
;tabel·tor
;tiskni
;na Ëtrn·ctou pozici
;nastav kurzor
;do A nulu
;poöli jako 2. parametr p¯Ìkazu TAB
;tiskni velikost souboru
;obnov IX
;tabel·tor
;tiskni
;na 23. pozici
;nastav kurzor
;do A nulu
;poöli jako 2. parametr p¯Ìkazu TAB
;obnov atribut souboru
;a znovu uloû
;do HL adresa tabulky znak˘ pro atributy souboru
;8 r˘zn˝ch atribut˘
vyps·n jeho kÛd, jinak se tiskne pomlËka.
;zarotuj atribut do C
;vezmi znak atributu
;posuÚ se na dalöÌ znak
;atribut nastaven → skoË
;atribut nenastaven ñ vypiö pomlËku
;uloû si registry
;piö znak pro atribut
;obnov registry
;vöechny atributy?
;ne → testuj a piö dalöÌ
;nov˝ ¯·dek
;tiskni
;obnov registry
;skoË na pokraËov·nÌ pro dalöÌ poloûku
Komentovan˝ v˝pis MDOSu
79
DEFATTR
Tabulka znak˘ pro atributy souboru.
H hidden (skryt˝)
P program (programov˝)
R readable (ËtenÌ povoleno)
E executable (provediteln˝)
127B DEFATTR
DB
S system (systÈmov˝)
A archive (archivnÌ)
W writeable (z·pis povolen)
D deleteable (smazateln˝)
48 53 50 41 52 57 45 44
;H S P A R W E D
GETATR
Vyzvedne atributy souboru.
IN:
HL adresa poloûky v buferu adres·¯e
OUT: A atributy souboru
1283 GETATR
1284
1286
1289
128B
128C
PUSH HL
EX (SP), IX
LD A, (IX+#14)
EX (SP), IX
POP HL
RET
;uloû ukazatel na poloûku v adres·¯i
;nynÌ ho dej do IX
;vyzvedni atribut do A
;a vraù ukazatel zpÏt do HL
;vraù se
PRTSTR
Vytiskne ¯etÏzec deseti znak˘ od HL na obrazovku. PouûÌv· se k tisku jmÈna diskety nebo souboru.
IN:
HL adresa uloûenÌ jmÈna
OUT: jmÈno je vytiötÏno (buÔ 10 znak˘ nebo do znaku CHR$ 0)
128D PRTSRT
128E
1290 PRTSTRLOOP
1291
1292
1294
1295
1296
1297
1298
1299
129A
129C ENDPRTSTR
129D
PUSH BC
LD B, #0A
LD A, (HL)
AND A
JR
Z, #129C, ENDPRTSTR
PUSH HL
PUSH BC
RST #10
POP BC
POP HL
INC HL
DJNZ #1290, PRTSTRLOOP
POP BC
RET
;uloû si BC
;tiskni aû 10 znak˘
;vyzvedni znak do A
;konec textu?
;ano → skoË
;uloû si ukazatel
;a ËÌtaË
;vytiskni znak
;obnov ËÌtaË
;a ukazatel
;posuÚ se na dalöÌ znak
;opakuj B-kr·t
;obnov BC
;vraù se
TXTCAT
Tabulka text˘ p¯Ìkazu CAT.
129E TXTCAT1
DB #FF
;invertovan˝ znak
Poloûka 0 ñ pouûÌv· se, pokud je tiötÏn v˝pis s informacemi o souboru
129F
0D 44 69 72 65 63 74 6F 72 79 20 6F 66 A0
;Directory of
12AD TXTCAT2
DB #FF
;invertovan˝ znak
Poloûka 0 ñ pouûÌv· se, pokud je tiötÏn v˝pis bez bliûöÌch informacÌ o souboru
12AE
0D 43 61 74 61 6C 6F 67 75 65 20 6F 66 A0
;Catalogue of
Poloûka 1 ñ zb˝vajÌcÌ texty jsou pro obÏ varianty stejnÈ
12BC
20 46 69 6C 65 28 73 29 2C A0
;File(s),
80
Komentovan˝ v˝pis MDOSu
Poloûka 2
12C6
20 42 79 74 65 73 20 66 72 65 65 2E 8D
;Bytes free.
ERASE
P¯Ìkaz pro vymaz·nÌ soubor˘ z disku.
Syntaxe:
ERASE "[Za¯ÌzenÌ:]MaskaSouboru"
P¯Ìkaz slouûÌ ke smaz·nÌ jednoho nebo vÌce soubor˘ z disku. ÑZa¯ÌzenÌì urËuje disk a ÑMaskaSouboruì urËuje,
kterÈ soubory z disku vymazat. Lze pouûÌvat wildchars (hvÏzdiËkovou konvenci) pro sm·z·nÌ skupiny soubor˘. Je
moûno mazat pouze ty soubory, kterÈ majÌ nastaven atribut D. Pokud budete chtÌt smazat vöechny soubory z disku
(pouûijete Ñ*.*ì), systÈm se V·s zept·: Erase all files? (Proceed = P). Pokud stisknete kl·vesu P (nebo R), p¯Ìkaz
se provede. Jestli stisknete jinou kl·vesu, neprovede se.
12D3 ERASE
12D6
12D9
12DC
12DF
12E2
12E5
CALL #0FCF, DIVSTRING
CALL #0F9E, TESTNM
CALL #1043, SETWDNM
CALL #107C, ARRANGNM
JP
Z, #1019, REPORTF
LD HL, #3E8A FNZONE1
LD B, #0A
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
;otestuj, jestli bylo zad·no jmÈno souboru
;nastav jmÈno disku v DNZONE1 pro I/O
;uprav jmÈno souboru v FNZONE1 na masku
;chybnÈ → skoË na REPORT F ÑInvalid file nameì
;do HL adresa 1. jmÈna souboru pro I/O
;10 byt˘
ZjistÌme, jestli nebylo pouûito jako masky souboru Ñ*.*ì.
12E7 ERASEALL
LD A, (HL)
;vyzvedni prvnÌ znak ze jmÈna souboru
12E8
INC HL
;posuÚ ukazatel na dalöÌ znak
12E9
CP
Ñ?ì
;je to Ñ?ì (jestli se nemaûou vöechny soubory)
12EB
JR
NZ, #12F8, ERANOALL ;nenÌ → skoË
12ED
DJNZ #12E7, ERASEALL
;opakuj B-kr·t
Protoûe jde o maz·nÌ vöech soubor˘, zept·me se uûivatele, jestli je chce vöechny skuteËnÏ smazat.
12EF
LD A, #BD
;do A ËÌslo hl·öenÌ ÑErase all files?ì
;a dotaz Ñ(Proceed = P)ì
12F1
LD DE, #03AF SYSMSG
;do DE tabulka systÈmov˝ch hl·öenÌ
12F4
CALL #21BF, KEYMSG
;tiskni a Ëekej na kl·vesu
12F7
RET NC
;nebylo stisknuto P nebo R → vraù se
Provedeme maz·nÌ.
12F8 ERANOALL CALL #1F66, DELALLFIL
12FB
PUSH AF
12FC
CALL #217B, ERAVAR
12FF
POP AF
1300
RET Z
;smaû vöechny soubory, vyhovujÌcÌ masce v FNZONE1
;uloû p¯Ìznak
;vymaû pomocnÈ promÏnnÈ MDOSu
;obnov p¯Ìznak
;vöe v po¯·dku. → vraù se p¯es RETURN do ZX ROM
Na disketÏ poûadovan˝ soubor nenÌ.
1301
LD A, #1B
1303
JP
#0204, ERRR
;REPORT S ÑFile not foundì
;piö hl·öenÌ a skoË do ZX ROM
MOVE
PrvnÌ varianta p¯Ìkazu MOVE, nastavuje implicitnÌ za¯ÌzenÌ.
Syntaxe:
MOVE "Za¯ÌzenÌ:"
P¯Ìkaz slouûÌ k nastavenÌ aktu·lnÌho disku. S tÌmto diskem se potom budou vykon·vat vöechny operace,
u kter˝ch nenÌ p¯Ìmo zad·n disk. Jako ÑZa¯ÌzenÌì lze pouûÌt buÔ jmÈno drivu nebo urËenÌ A:, B:.
1306 MOVEACT
CALL #1057, ISSYNCONTR
;otestuj, jestli nenÌ kontrola syntaxe
Komentovan˝ v˝pis MDOSu
81
Neprov·dÌ se kontrola syntaxe, provedeme zmÏnu
1309
CALL #0FCF, DIVSTRING
130C
CALL #10E2, ANALWDNM
130F
LD HL, #3E80 DNZONE1
1312
LD A, (HL)
1313
AND A
1314
JP
Z, #1113, REPORTb
1317
LD DE, #3EAA ACDRIVE
131A
LD BC, #000A
131D
LDIR
131F
RET
implicitnÌho za¯ÌzenÌ.
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
;analyzuj jmÈno disku v DNZONE1
;do HL adresa 1. jmÈna disku pro I/O
;vyzvedni prvnÌ znak ze jmÈna disku
;nebylo zad·no jmÈno disku?
;ano → skoË na REPORT b ÑBad volume nameì
;do DE adresa jmÈna aktu·lnÌho disku
;dÈlka jmÈna je 10 byt˘
;p¯esuÚ novÈ jmÈno
;vraù se p¯es RETURN do ZX ROM
FORMAT
P¯Ìkaz pro form·tov·nÌ disket.
Syntaxe:
FORMAT "Za¯ÌzenÌ:JmÈnoDisku[.S]"
P¯Ìkaz naform·tuje disketu vloûenou v ÑZa¯ÌzenÌì. ÑZa¯ÌzenÌì je typu A: nebo B:. Potom n·sleduje jmÈno disku,
kterÈ bude mÌt naform·tovan· disketa. Vhodn˝mi pouky m˘ûete libovolnÏ mÏnit form·t diskety. Pokud pouûijete
Ñ.Sì, bude disketa naform·tov·na jako jednostrann·. Klasick· form·t je 512 byt˘ na sektor, 9 sektor˘ na stopu,
40/80 stop na stranu. Po vykon·nÌ p¯Ìkazu jsou na obrazovku vytiötÈny informace o disketÏ (poËet dobr˝ch
a öpatn˝ch sektor˘, kapacita diskety). P¯ed zaË·tkem form·tov·nÌ se systÈm zept· ot·zkou: All data will be discarded!
Pokud stisknete P nebo R, bude se prov·dÏt form·tov·nÌ. Po form·tov·nÌ jsou vöechny data na disketÏ ztracena
a nelze je jiû nijak obnovit.
1320 FORMAT
1323
1326
1328
132A REPORTY
132C
132F FORDROK
1330
1332
1334
1337 FORDISK
1338
133B
133E
1340
1342
CALL #0FCF, DIVSTRING
CALL #10E2, ANALWDNM
JR
Z, #132A, REPORTY
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
;analyzuj jmÈno disku v DNZONE1
;nebylo vloûeno jmÈno mechaniky.→ skoË na
;REPORTY ÑDevice ident missingì
JR
NC, #132F, FORDROK ;bylo vloûeno urËenÌ mechaniky → skoË
LD A, #21
;REPORT Y ÑDevice ident missingì
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
INC A
;bylo urËenÌ mechaniky spr·vnÈ?
JR
NZ, #1337, FORDISK ;ano → skoË
LD A, #20
;REPORT X ÑBad device typeì
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
DEC A
;vraù zpÏt ËÌslo mechaniky
LD (#3E6B), A WORKDR ;uloû jako drive, se kter˝m se pracuje
CALL #21AC, DRVCMP
;zjisti adresu parametr˘ mechaniky v A
JR
NZ, #1345, FORMAT1 ;je p¯ipojena → skoË
LD A, #22
;REPORT Z ÑDevice unavailableì
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
Nast·vÌme v˝chozÌ parametry diskety z parametr˘
oboustrann˝).
1345 FORMAT1
CALL #107C, ARRANGNM
1348
LD HL, #3E8A FNZONE1
134B
CALL #10E5, ANALWNM
134E
JP
C, #1113, REPORTb
1351
LD A, (IX+#05)
1354
LD (IX+#01), A
1357
LD A, (IX+#06)
135A
LD (IX+#02), A
135D
LD A, (IX+#07)
82
mechaniky a nastavÌme form·t diskety (jednostrann˝ nebo
;uprav jmÈno diskety v FNZONE1
;do HL adresa uloûenÌ jmÈna diskety
;analyzuj jmÈno diskety na neû·doucÌ znaky
;chybnÈ → skoË na REPORT b ÑBad volume nameì
;okopÌruj informace z parametr˘ mechaniky
;do informacÌ o disketÏ
;okopÌruj poËet stop na stranÏ z parametr˘ mechaniky
;do parametr˘ diskety
;okopÌruj poËet sektor˘ na stopu z informacÌ o mechanice
Komentovan˝ v˝pis MDOSu
1360
1363
1366
1368
136A
LD
LD
CP
JR
RES
(IX+#03), A
A, (#3E94) EXTE1
ÑSì
NZ, #136E, RFO401
4, (IX+#01)
Tiskneme dotaz a Ëek·me na odpovÏÔ.
136E RFO41
CALL #217B, ERAVAR
1371
PUSH HL
1372
PUSH DE
1373
LD DE, #03AF SYSMSG
1376
LD A, #BF
1378
137B
137C
137D
137E
1381
1384
CALL #21BF, KEYMSG
POP DE
POP HL
RET NC
LD A, (#3E6B) WORKDR
CALL #254B, DRVSEL
CALL #234B, HOME
;do parametr˘ diskety
;vyzvedni poËet stran, kolik se m· form·tovat
;jednostrann˝ form·t?
;ne → skoË
;nastav p¯Ìznak jednostrann˝ form·t
;vymaû pomocnÈ promÏnnÈ MDOSu
;uloû si registry
;do DE adresa tabulky systÈmov˝ch hl·öenÌ
;do A ËÌslo hl·öenÌ ÑAll data will be discarded!ì
;a dotaz Ñ(Proceed = P)ì
;tiskni a Ëekej na kl·vesu
;obnov registry
;nebylo stisknuto P nebo R → vraù se
;do A ËÌslo drivu, se kter˝m se pracuje
;roztoË mechaniku a nastav stopu podle (IX+#04)
;vystav hlavu na 0-tou stopu
NastavÌme poËet form·tovan˝ch stop. Pokud je oboustrann˝ form·t, musÌ se poËet zdvojn·sobit.
1387
LD C, (IX+#02)
;do C poËet stop na stranu
138A
BIT 4, (IX+#01)
;jednostrann˝ form·t?
138E
JR
Z, #1392, RFORM5
;ano → skoË
1390
RLC C
;zdvojn·sob poËet stop
1392 RFORM5
LD B, #00
;v B bude poËÌtadlo stop
Naform·tujeme stopu.
1394 RFORM6
PUSH BC
1395
LD DE, #0100
1398
LD A, (#3E6B) WORKDR
139B
CALL #229C, BFORMA
139E
POP BC
139F
INC B
13A0
LD A, B
13A1
CP
C
13A2
JR
NZ, #1394, RFORM6
13A4
DEC B
;uloû si poËÌtadlo a poËet stop
;jeden z·pis, 255 opakov·nÌ
;do A drive, se kter˝m se pracuje
;form·tuj stopu
;obnov ËÌtaË a poËet stop
;zvyö poËet zform·tovan˝ch stop
;dej do A poËet zform·tovan˝ch stop
;uû byly naform·tov·ny vöechny?
;ne → opakuj
;uprav poËet stop na rozsah 0ñ39/79/159
NynÌ otestujeme vöechny sektory, jestli jsou v po¯·dku. Prov·dÌme to tak, ûe do z·sobnÌku si d·me koncovou
znaËku a postupnÏ kontrolujeme sektory. Pokud je vadn˝, uloûÌme si jeho ËÌslo na z·sobnÌk. Postupujeme od
poslednÌho k prvnÌmu sektoru. Je t¯eba tedy d·t pozor, ûe pokud budeme mÌt nÌzko z·sobnÌk a budeme form·tovat
disketu, kter· bude mÌt hodnÏ vadn˝ch sektor˘, m˘ûe n·m z·sobnÌk p¯etÈct a systÈm se zhroutÌ.
13A5 FORMTEST
13A8
13A9 FORMTEST1
13AB FORMTST2
13AC
13AF
13B2
LD HL, #FFFF
PUSH HL
LD C, #00
PUSH BC
LD HL, #4900
LD DE, #0001
LD A, C
;do HL koncov· znaËka öpatn˝ch sektor˘
;uloû ji na z·sobnÌk
;nastav nult˝ sektor
;uloû si ËÌtaË sektor˘ a stop
;do HL adresa, kam budeme zapisovat sektor
;jeden sektor, û·dnÈ opakov·nÌ
;podle sektoru zmÏnÌme border
Komentovan˝ v˝pis MDOSu
83
13B3
13B5
13B8
13BB
13BD
13BE
OUT (#FE), A
;teÔ
LD A, (#3E6B) WORKDR ;do A drive, se kter˝m se pracuje
CALL #236A, DREAD
;naËti sektor
LD A, #02
;do A p¯Ìznak Ñtestov·nÌ chybov˝ch bit˘ p¯i ËtenÌì
CP
B
;bylo provedeno ËtenÌ?
JR
Z, #13C5, FORMNTEST ;ano→skoË
Doölo k chybÏ p¯i
13C0
13C2
13C5 FORMNTEST
13C7
13C8
hled·nÌ stopy.
LD A, #29
JP
#0204, ERRR
LD A, #85
AND C
JR
Z, #13CF , FNOTECH
;REPORT a ÑDevice I/O errorì
;piö hl·öenÌ a skoË do ZX ROM
;do A bity technick˝ch chyb
;byla technick· chyba?
;ne → skoË
Doölo k chybÏ v komunikaci s ¯adiËem.
13CA
LD A, #3B
13CC
JP
#0204, ERRR
;REPORT s ÑInternal errorì
;piö hl·öenÌ a skoË do ZX ROM
NynÌ zkontrolujeme, jestli
13CF FNOTECH
LD
13D1
AND
13D2
POP
13D3
JR
sektoru.
;do A bity chyb p¯i ËtenÌ sektoru
;byla chyba p¯i ËtenÌ?
;obnov Ëislo stopy a sektoru
;ne → skoË
nedoölo k chybÏ p¯i ËtenÌ
A, #18
C
BC
Z, #13DB, FORMSOK
Sektor je öpatn˝, proto ho p¯evedeme na logick˝ a uloûÌme do z·sobnÌku.
13D5
PUSH BC
;uloû si ËÌslo sektoru a stopy
13D6
CALL #1DE9, FYZLOG
;p¯eveÔ fyzick˝ sektor a stopu na logick˝ sektor
13D9
POP BC
;obnov ËÌslo stopy a sektoru
13DA
PUSH HL
;uloû öpatn˝ sektor do z·sobnÌku
Provedeme posun
13DB FORMSOK
13DC
13DF
13E0
13E2
na dalöÌ sektor.
INC C
;posuÚ se na dalöÌ sektor
LD A, (IX+#03)
;do A poËet sektor˘ na stopu
CP
C
;byly vöechny sektory na stopÏ testov·ny?
JR
NZ, #13AB, FORMTST2 ;ne → skoË na test dalöÌho
DJNZ #13A9, FORMTEST1 ;opakuj B-kr·t
NynÌ vytvo¯Ìme v SRAM BOOT diskety a uloûÌme
0. stopy pro WD)
13E4
LD HL, #3C00 FATBUF
13E7
LD E, L
13E8
LD D, H
13E9
INC DE
13EA
LD (HL), #00
13EC
LD BC, #01FF
13EF
LDIR
13F1
LD DE, #3C80
13F4
13F7
13FA
13FC
84
LD HL, #3E00 DRPARZN
LD BC, #0030
LDIR
PUSH IX
ho na disketu do 0. sektoru 0. stopy pro MDOS (1. sektoru
;do HL adresa buferu pro vytvo¯enÌ BOOTu
;dej ji i do DE
;ale posuÚ ji v DE o jednu d·le
;vyplnÌme bufer hodnotou 0
;511 byte
;vyplÚ bufer
;do DE mÌsto v BOOTu pro informace o vöech
;p¯ipojen˝ch mechanik·ch
;do HL zaË·tek tabulek parametr˘ disk˘
;48 byt˘
;p¯esuÚ do BOOTu
;uloû ukazatel na parametry disku, se kter˝m se pracuje
Komentovan˝ v˝pis MDOSu
13FE
13FF
1402
1404
1407
140A
140D
140F
1411
1412
1413
1414
1416
1417
1418
141B
141E
1420
1423
1426
1429
142C
142F
1432
1433
1436
1438
143B
143D
143E
POP HL
LD BC, #000C
LDIR
LD DE, #3CC0
LD HL, #3E8A FNZONE1
LD BC, #000A
LDIR
LD A, R
LD (DE), A
INC DE
HALT
LD A, R
LD (DE), A
INC DE
LD HL, #0F10 TXTSDOS
LD BC, #0004
LDIR
LD DE, #0101
LD HL, #3C00 FATBUF
LD BC, #0000
LD A, (#3E6B) WORKDR
CALL #2296, BWRITE
LD HL, #3C00 FATBUF
PUSH HL
LD DE, #3C01
LD (HL), #DD
LD BC, #01FF
LDIR
POP HL
LD C, #01
;a dej ho do HL
;12 byt˘ informacÌ o disketÏ
;p¯esÚ do BOOTu
;do DE adresa uloûenÌ jmÈna diskety v BOOTu
;do HL adresa uloûenÌ jmÈna diskety v pamÏti
;dÈlka 10 znak˘
;p¯esuÚ do BOOTu
;uloû dva n·hodnÈ byty
;do BOOTu
;Ëekej na p¯eruöenÌ mezi jednotliv˝mi byty
;do HL adresa uloûeni textu ÑSDOSì v ROM
;4 byty
;p¯esÚ do BOOTu
;1 sektor, û·dnÈ opakov·nÌ
;do HL adresa uloûenÌ BOOTu v SRAM
;nult˝ sektor, nult· stopa
;do A ËÌslo drivu, se kter˝m se pracuje
;zapiö BOOT
;do HL adresa buferu pro FAT v SRAM
;uloû si ji na z·sobnÌk
;do DE adresa buferu +1
;vyplÚ hodnotou #DD
;511 byt˘
;vyplÚ
;obnov adresu na bufer
;do C ËÌslo prvnÌho sektoru FAT
VyplnÌme vöechny poloûky FAT tabulky hodnotou #0DDD (3549) (systÈmov˝ sektor nebo nedostupn˝)
a zapÌöeme na disketu.
1440 WEMPFAT
PUSH HL
;uloû si adresu buferu
1441
LD DE, #0101
;1 sektor, û·dnÈ opakov·nÌ
1444
LD B, #00
;stopa 0
1446
PUSH BC
;uloû si ËÌslo sektoru a stopy
1447
LD A, (#3E6B) WORKDR ;do A ËÌslo drivu, se kter˝m se pracuje
144A
CALL #2296, BWRITE
;zapiö sektor
144D
POP BC
;obnov ËÌslo sektoru a stopy
144E
POP HL
;obnov adresu buferu
144F
INC C
;posuÚ se na dalöÌ sektor
1450
LD A, #06
;do A poËet sektor˘ FAT +1
1452
CP
C
;byly uû zaps·ny vöechny sektory?
1453
JR
NZ, #1440, WEMPFAT ;ne → opakuj
1455
CALL #1DDC, SECPERDISK ;vypoËti poËet sektor˘ na disketÏ
1458
AND A
;nuluj CY
1459
LD DE, #000EH
;do DE 14 sektor˘ pro systÈm
145C
SBC HL, DE
;odeËti od celkovÈho poËtu
145E
EX DE, HL
;a dej celkov˝ poËet do DE a do HL ËÌslo prvnÌho
;sektoru, kter˝ se bude testovat.
145F
PUSH DE
;uloû si poËÌtadlo sektor˘
Komentovan˝ v˝pis MDOSu
85
NynÌ budeme postupnÏ zapisovat do vöech p¯Ìstupn˝ch poloûek FAT pro uloûenÌ dat hodnoty 0 (voln˝ sektor)
a zapÌöeme je na disk.
1460 WTESTFAT
PUSH DE
;uloû si poËÌtadlo sektor˘
1461
LD DE, #0000
;do DE hodnota Ñsektor voln˝ì
1464
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT v HL obsah DE
1467
POP DE
;obnov poËÌtadlo sektor˘
1468
INC HL
;posuÚ se na dalöÌ sektor
1469
DEC DE
;a sniû poËÌtadlo sektor˘
146A
LD A, D
;uû byly zaps·ny vöechny?
146B
OR E
146C
JR
NZ, #1460, WTESTFAT ;ne → skoË
146E
POP BC
;obnov si poËet sektor˘
146F
LD DE, #0000
;do DE poËÌtadlo vadn˝ch sektor˘
NynÌ budeme vyzved·vat ze z·sobnÌku ËÌsla sektor˘,
umÌstÏnÌ ve FAT zapisovat informaci, ûe jsou vadnÈ.
1472 WFAILSEC
POP HL
1473
LD A, H
1474
AND L
1475
INC A
1476
JR
Z, #1484, WFATEND
1478
PUSH DE
1479
LD DE, #DFF
147C
CALL #1D1E, WRTOFAT
147F
POP DE
1480
INC DE
1481
DEC BC
1482
JR
#1472, WFAILSEC
1484 WFATEND
CALL #1D9D, WFATIFCH
kterÈ jsou vadnÈ, aû do koncovÈ znaËky a budeme do jejÌch
;vyzvedni ËÌslo vadnÈho sektoru ze z·sobnÌku
;je to koncov· znaËka?
;ano → skoË
;uloû si poËet vadn˝ch sektor˘
;do DE hodnotu Ñvadn˝ sektorì
;zapiö do poloûky FAT v HL obsah DE
;obnov si poËet vadn˝ch sektor˘
;zvyö poËet vadn˝ch sektor˘
;sniû poËet dobr˝ch sektor˘
;skoË na testov·nÌ dalöÌho
;zapiö FAT, pokud byla zmÏnÏna
NynÌ vypÌöeme informace o dobr˝ch a öpatn˝ch sektorech a volnou kapacitu disku.
1487
PUSH DE
;uloû si poËet vadn˝ch sektor˘
1488
PUSH BC
;uloû si poËet dobr˝ch sektor˘
1489
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
148A
DW #0D6B
;podprogram CLS smaz·nÌ obrazovky
148C
LD A, #FE
;kan·l ñ 2 (hornÌ Ë·st obrazovky)
148E
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
148F
DW #1601
;podprogram CHAN-OPEN otev¯enÌ kan·lu
1491
XOR A
;poloûka 0 ñ ÑFormat complete. Formatted ì
1492
LD DE, #14E1 TXTFORM ;tabulka text˘ p¯Ìkazu FORMAT
1495
CALL #01C8, PRTMES
;piö text poloûky
1498
POP BC
;obnov poËet dobr˝ch sektor˘
1499
PUSH BC
;a zase ho uloû
149A
CALL #0FA6, BCPRT
;a vytiskni ho na obrazovku
149D
LD A, #01
;poloûka 1 ñ Ñ good blocks and ì
149F
LD DE, #14E1 TXTFORM ;tabulka text˘ p¯Ìkazu FORMAT
14A2
CALL #01C8, PRTMES
;piö text poloûky
14A5
POP BC
;obnov poËet dobr˝ch sektor˘
14A6
POP DE
;a poËet vadn˝ch sektor˘
14A7
PUSH BC
;uloû si poËet dobr˝ch sektor˘
14A8
LD B, D
;dej poËet vadn˝ch sektor˘ do BC
86
Komentovan˝ v˝pis MDOSu
14A9
14AA
14AD
14AF
14B2
14B5
14B6
14B8
14BA
14BE
14C2
14C5
14C8
14CB
14CD
14D0
14D3
14D6
14D9
14DA
14DB
14DC
14DE
14E0
LD C, E
CALL #0FA6, BCPRT
LD A, #02
LD DE, #14E1 TXTFORM
CALL #01C8, PRTMES
POP BC
SLA C
RL
B
LD IX, #3ED4 SV24NM
LD (IX+#00), #00
LD (IX+#01), C
LD (IX+#02), B
CALL #0F14, NUM24B
LD A, #03
LD DE, #14E1 TXTFORM
CALL #01C8, PRTMES
CALL #217B, ERAVAR
LD A, (#5C8D) ATTR_P
RRCA
RRCA
RRCA
OR #F8
OUT (#FE), A
RET
;piö poËet vadn˝ch sektor˘ na obrazovku
;poloûka 2 ñ Ñ bad blocks. Total capacity is ì
;tabulka text˘ p¯Ìkazu FORMAT
;piö text poloûky
;obnov poËet dobr˝ch sektor˘
;vyn·sob dvÏma (n·sobenÌ 512-ti)
;do IX adresa pro v˝poËet kapacity disku
;prvnÌ byte bude 0
;druh˝ byte je C
;t¯etÌ byte je B
;tiskni kapacitu disku
;poloûka 3 ñ Ñ Bytes.ì
;tabulka text˘ p¯Ìkazu FORMAT
;piö text poloûky
;vymaû pomocnÈ promÏnnÈ MDOSu
;do A nastavenÈ barvy BASICu
;zarotuj
;ponech barvy pro border
;a nastav zpÏt BORDER
;vraù se
TXTFORM
Tabulka text˘ p¯Ìkazu FORMAT
14E1 TXTFORM
Poloûka 0
14E2
14F3
Poloûka 1
14FD
Poloûka 2
150E
151B
Poloûka 3
152C
DB
#FF
;invertovan˝ znak
46 6F 72 6D 61 74 20 63 6F 6D 70 6C 65 74 65 2E 0D ;Format complete.
46 6F 72 6D 61 74 74 65 64 A0
;Formatted
20 67 6F 6F 64 20 62 6C 6F 63 6B 73 0D 61 6E 64 A0 ;good blocks and
20 62 61 64 20 62 6C 6F 63 6B 73 2E 0D
;bad blocks
54 6F 74 61 6C 20 63 61 70 61 63 69 74 79 20 69 F3 ;Total capacity is
20 42 79 74 65 73 2E 8D
;Bytes.
NOTUSED
1534
DS
#01CC
;oblast dÈlky 460 byt˘ vyplnÏn· hodnotou 0. Nevyuûit·.
STANDROM
Tato rutina na prvnÌ pohled nevykon· nic, ale m· velik˝ v˝znam. Pokud je p¯istr·nkov·na ROM D40, dojde p¯i
skoku na tento podprogram k p¯estr·nkov·nÌ do ZX ROM. Je to tedy vstupnÌ br·na z ROM D40 do ZX ROM. V ZX
ROM je takÈ na adrese #1700 instrukce RET.
1700 STANDROM
RET
;p¯estr·nkuj do ZX ROM
Komentovan˝ v˝pis MDOSu
87
RSAVE
P¯Ìkaz pro uloûenÌ bloku dat na disketu.
Syntaxe:
SAVE * "[Za¯ÌzenÌ:] JmÈnoSouboru [.P¯ÌponaSouboru]" [LINE n] [CODE adresa, dÈlka] [DATA
pole] [SCREEN$]
SlouûÌ k uchov·nÌ dat na disketÏ. M· stejnou syntaxi jako pro ukl·d·nÌ dat na p·sku, ale musÌ obsahovat znak Ñ*ì.
Nelze ukl·dat bezhlaviËkovÈ soubory. Kaûd˝ soubor m· jmÈno. NesmÌ obsahovat wildchars. Na disketÏ nelze mÌt
dva soubory se stejn˝m jmÈnem.
1701 RSAVE
LD
A, #00
;do A p¯Ìznak SAVE
NynÌ je to velice zajÌmavÈ. TÌm, ûe je zde byte #33, jsou dalöÌ vstupnÌ body zmÏnÏny na neökodnÈ instrukce LD
HL, hodnota.
1703
DB #33
MÌsto vstupnÌch bod˘ p¯Ìkaz˘ LOAD a MERGE je toto:
1703
LD HL, #013E
1706
LD HL, #033E
RLOAD
P¯Ìkaz pro nahr·nÌ bloku dat ze souboru do pamÏti.
Syntaxe:
LOAD * "[Za¯ÌzenÌ:] JmÈnoSouboru [.P¯ÌponaSouboru]" [DATA pole] [SCREEN$] [CODE [adresa]
[, dÈlka]]
SlouûÌ k nahr·nÌ dat do pamÏti. MusÌ b˝t vloûeno jmÈno souboru. NesmÌ obsahovat wildchars.
1704 RLOAD
LD
A, #01
;do A p¯Ìznak LOAD
NynÌ je pouûito nÏco podobnÈho jako u vstupnÌho bodu p¯Ìkazu SAVE.
1706
DB #33
Takûe mÌsto vstupnÌho bodu pro MERGE je zde
1706
LD HL, #033E
RMERGE
P¯Ìkaz pro p¯ihr·nÌ dat do pamÏti.
Syntaxe:
MERGE * "[Za¯ÌzenÌ:] JmÈnoSouboru [.P¯ÌponaSouboru]"
SlouûÌ k prihr·nÌ BASIC programu, k uû k existujÌcÌmu programu v pamÏti, se jmÈnem JmÈnoSouboru. Nelze
pouûÌt wildchars.
1707 RMERGE
LD
A, #03
;do A p¯Ìznak MERGE
SpoleËn· Ë·st pro rutiny SAVE, LOAD, MERGE. kontroluje se syntaxe a povolenÈ kombinace. Vych·zÌ se z ZX
ROM.
1709 SLMSYNTAX LD (#5C74), A T_ADDR
;uloû si kÛd operace
170C
RST #18
;vezmi aktu·lnÌ znak
170D
CP
Ñ*ì
;je to hvÏzdiËka?
170F
JP
NZ, #06C6, REPORTC ;ne → skoË na REPORT C ÑNonsense in BASICì
1712
RST #20
;vezmi dalöÌ znak
1713
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
1714
DW #1C8C
;podprogram EXPT-EXP vyhodnocenÌ ¯etÏzce
Zkontrolujeme povolenÈ kombinace.
1716 SLMSTART
RST #30
88
;otestuj, jestli je kontrola syntaxe
Komentovan˝ v˝pis MDOSu
;ano → skoË
;prostor 17 byt˘ pro hlaviËku operace SAVE
;do A typ operace
;je SAVE?
;ano → skoË
;prostor 34 bytu pro hlaviËku operacÌ LOAD, MERGE
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram BC-SPACE vytvo¯enÌ BC prostoru pro
;hlaviËku v pracovnÌ oblasti
1727
PUSH DE
;uloû si ukazatel na zaË·tek vytvo¯enÈho prostoru
1728
POP IX
;a dej ho do IX
172A
LD B, #0B
;dÈlka n·zvu souboru je 11 byt˘
172C
LD A, #20
;vyplÚ mezerami
172E SAVEBLANK LD (DE), A
;uloû mezeru
172F
INC DE
;posuÚ se na dalöÌ byte
1730
DJNZ #172E, SAVESPACE
;opakuj B-kr·t
1732
LD (IX+#01), #FF
;jako prvnÌ znak jmÈna si uloû 255
1736
CALL #1A3D, SLMASTR
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
1739 SAVEDATA
RST #18
;vezmi aktu·lnÌ znak
173A
CP
#E4
;DATA?
173C
JR
NZ, #1788, SAVESCRN ;ne → testuj dalöÌ moûnosti
173E
LD A, (#5C74) T_ADDR
;do A kÛd operace
1741
CP
#03
;je MERGE?
1743
JP
Z, #06C6, REPORTC
;ano → skoË na REPORT C ÑNonsense in BASICì
;MERGE DATA je nep¯Ìpustn· kombinace
1746
RST #20
;vezmi dalöÌ znak
1747
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
1748
DW #28B2
;podprogram LOOK-VARS hledej promÏnnou podle
;CH_ADD ñ najdeme adresu uloûenÌ pole v pamÏti
174A
SET 7, C
;nastav 7. bit v n·zvu pole
174C
JR
NC, #175C, SAVEOLD ;existuje uû takov· promÏnn· → skoË
174E
LD HL, #0000
;do HL sign·l ñ ÑuûitÌ novÈho poleì
1751
LD A, (#5C74) T_ADDR
;do A kÛd operace
1754
DEC A
;je LOAD?
1755
JR
Z, #176D, SAVENEW ;ano → skoË
1717
1719
171C
171F
1720
1722
1724 SAVESPACE
1725
JR
LD
LD
AND
JR
LD
RST
DW
Z, #1739, SAVEDATA
BC, #0011
A, (#5C74) T_ADDR
A
Z, #1724, SAVESPACE
C, #22
#28
#0030
Pokud jede o SAVE neexistujÌcÌho pole, tiskne se chybovÈ hl·öenÌ.
1757
LD A, #01
;REPORT 2 ÑVariable not foundì
1759
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
PokraËujeme v pr·ci s existujÌcÌm polem.
175C SAVEOLD
JP
NZ, #06C6, REPORTC
175F
1760
1762
1763
1764
1767
1768
1769
176C
RST
JR
INC
LD
LD
INC
LD
LD
INC
;nenÌ to pole nebo ¯etÏzec → skoË na REPORT C
;ÑNonsense in BASICì
#30
;otestuj, jestli je kontrola syntaxe
Z, #177A, SAVEDATA1 ;ano → skoË
HL
;niûöÌ byte dÈlky pole
A, (HL)
;d·me do A
(IX+#0B), A;a uloûÌme do hlaviËky jako dÈlku souboru
HL
;nynÌ vyööÌ byte dÈlky promÏnnÈ
A, (HL)
;d·me do A
(IX+#0C), A
;a uloûÌme do hlaviËky jako dÈlku souboru
HL
Komentovan˝ v˝pis MDOSu
89
DalöÌ Ë·st je stejn·
176D SAVENEW
1770
1772
1774
1776
1777 SAVETYPE
pro Ñnov·ì i Ñstar·ì pole.
LD (IX+#0E), C
LD A, #01
BIT 6, C
JR
Z, #1777, SAVETYPE
INC A
LD (IX+#00), A
;kopie jmÈna pole do hlaviËky
;do A typ pole ñ ÑËÌselnÈ poleì
;bylo pole ËÌselnÈ?
;ano → skoË
;do A typ pole ñ ÑznakovÈ poleì
;uloû typ pole do hlaviËky na prvnÌ adresu
Test poslednÌ Ë·sti
177A SAVEDATA1
177B
177C
177E
1780
1781
1784
1785
p¯Ìkazu.
EX DE, HL
RST #20
CP
Ñ)ì
JR
NZ, #175C, SAVEOLD
RST #20
CALL #1057, ISSYNCONTR
EX DE, HL
JP
#1842, SAVEALL
;uloû ukazatele do DE
;vezmi dalöÌ znak
;je to prav· z·vorka?
;ne → skoË na REPORT C ÑNonsense in BASICì
;vezmi dalöÌ znak
;otestuj, jestli nenÌ kontrola syntaxe
;zaË·tek uloûenÌ dat zpÏt do HL
;skoË na v˝bÏr operace
Test na SCREEN$.
1788 SAVESCRN
CP
178A
JR
178C
LD
178F
CP
1791
JP
1794
1795
1798
179C
17A0
17A3
17A6
17A9
#AA
;SCREEN$?
NZ, #17AB, SAVECODE;ne → skoË na dalöÌ moûnosti
A, (#5C74) T_ADDR
;do A kÛd operace
#03
;je MERGE?
Z, #06C6, REPORTC
;ano → skoË na REPORT C ÑNonsense in BASICì
;MERGE SCREEN$ je nep¯Ìpustn· kombinace
RST #20
;vezmi dalöÌ znak
CALL #1057, ISSYNCONTR ;otestuj, jestli nenÌ kontrola syntaxe
LD (IX+#0B), #00
;do hlaviËky uloû dÈlku dat 6912 byt˘
LD (IX+#0C), #1B
LD HL, #4000
;do HL poË·teËnÌ adresa 16384
LD (IX+#0D), L
;uloû do hlaviËky jako poË·tek dat
LD (IX+#0E), H
JR
#17F8, SAVETYPE3
;skoË na nastavenÌ typu dat a v˝bÏr operace
Test na CODE.
17AB SAVECODE
17AD
17AF
17B2
17B4
CP
JR
LD
CP
JP
17B7
17B8
17B9
17BB
RST
RST
DW
JR
#AF
NZ, #17FE, SAVELINE
A, (#5C74) T_ADDR
#03
Z, #06C6, REPORTC
;CODE?
;ne → skoË na dalöÌ moûnosti
;do A kÛd operace
;je MERGE?
;ano → skoË na REPORT C ÑNonsense in BASICì
;MERGE CODE je nep¯Ìpustn· kombinace
#20
;vezmi dalöÌ znak
#28
;volej podprogram pro vol·nÌ rutiny ZX ROM
#2048
;podprogram PR-ST-END test konce p¯Ìkazu
NZ, #17C9, SAVECODE1;nenÌ konec → skoË
P¯Ìkaz nem· parametry.
17BD
LD A, (#5C74) T_ADDR
17C0
AND A
17C1
JP
Z, #06C6, REPORTC
17C4
90
RST
#28
;do A kÛd operace
;je SAVE?
;ano → skoË na REPORT C ÑNonsense in BASICì
;p¯i SAVE musÌ b˝t parametry
;volej podprogram pro vol·nÌ rutiny ZX ROM
Komentovan˝ v˝pis MDOSu
17C5
DW
#1CE6
17C7
JR
#17D8, SAVECODE2
;podprogram USE-ZERO uloûenÌ 0 na z·sobnÌk pro
;startovacÌ adresu
;skoË na zpracov·nÌ poËtu byt˘
Hled·nÌ startovacÌ adresy.
17C9 SAVECODE1 RST #28
17CA
DW #1C82
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-1NUM vyhodnocenÌ ËÌselnÈho
;v˝razu
17CC
RST #18
;vezmi aktu·lnÌ znak
17CD
CP
Ñ,ì
;Ë·rka?
17CF
JR
Z, #17DD, SAVECODE3 ;ano → skoË
17D1
LD A, (#5C74) T_ADDR
;do A kÛd operace
17D4
AND A
;je SAVE?
17D5
JP
Z, #06C6, REPORTC
;ano → skoË na REPORT C ÑNonsense in BASICì
;p¯i SAVE musÌ b˝t uvedena dÈlka souboru
17D8 SAVECODE2 RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
17D9
DW #1CE6
;podprogram USE-ZERO uloûenÌ nuly na z·sobnÌk jako
;poËet byt˘
17DB
JR
#17E1, SAVECODE4
;skoË na zpracov·v·nÌ dÈlky dat
ZjiötÏnÌ poËtu byt˘.
17DD SAVECODE3 RST
17DE
RST
17DF
DW
#20
#28
#1C82
17E1 SAVECODE4 CALL #1057, ISSYNCONTR
17E4
RST #28
17E5
DW #1E99
17E7
17EA
17ED
17EE
LD
LD
RST
DW
(IX+#0B), C
(IX+#0C), B
#28
#1E99
17F0
17F3
17F6
17F7
LD
LD
LD
LD
(IX+#0D), C
(IX+#0E), B
H, B
L, C
SCREEN a CODE jsou stejnÈho typu.
17F8 SAVETYPE3 LD (IX+#00), #03
17FC
JR
#1842, SAVEALL
;vezmi dalöÌ znak
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-1NUM vyhodnocenÌ ËÌselnÈho
;v˝razu
;otestuj, jestli nenÌ kontrola syntaxe
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram FIND-INT2 vyzvednutÌ ËÌsla do BC
;v BC je dÈlka dat
;uloû dÈlku dat do hlaviËky
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram FIND-INT2 vyzvednutÌ ËÌsla do BC
;v BC je poË·teËnÌ adresa dat
;uloû poË·teËnÌ adresu do hlaviËky
;zkopÌruj do HL poË·teËnÌ adresu
;uloû typ dat ñ ÑkÛdì
;skoË na v˝bÏr operace
ZjiötÏnÌ p¯Ìtomnosti LINE a dalöÌch moûn˝ch parametr˘.
17FE SAVELINE
CP
#CA
;LINE?
1800
JR
Z, #180B, SAVELINE1 ;ano → skoË
1802
CALL #1057, ISSYNCONTR ;otestuj, jestli nenÌ kontrola syntaxe
1805
LD (IX+#0E), #80
;uloû Ñnejsou dalöÌ parametryì
1809
JR
#1822, SAVETYPE0
;skoË na nastavenÌ BASIC parametr˘
ZjistÌme ËÌslo, kterÈ musÌ n·sledovat po LINE.
180B SALINE1
LD A, (#5C74) T_ADDR
;do A kÛd operace
Komentovan˝ v˝pis MDOSu
91
180E
180F
AND A
JP
NZ, #06C6, REPORTC
1812
1813
1814
RST
RST
DW
1816
1819
181A
181C
181F
CALL #1057, ISSYNCONTR
RST #28
DW #1E99
LD (IX+#0D), C
LD (IX+#0E), B
#20
#28
#1C82
LINE a û·dn˝ parametr jsou typu 0.
1822 SAVETYPE0 LD (IX+#00), #00
;je SAVE?
;ne → skoË na REPORT C ÑNonsense in BASICì
;LOAD LINE nebo MERGE LINE jsou nep¯ÌpustnÈ
;vezmi dalöÌ znak
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram EXPT-1NUM vyhodnocenÌ ËÌselnÈho
;v˝razu ñ ËÌslo startovnÌho ¯·dku
;otestuj, jestli nenÌ kontrola syntaxe
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram FIND-INT2 vyzvednutÌ ËÌsla do BC
;uloû ËÌslo startovnÌho ¯·dku do hlaviËky
;uloû typ dat typ dat BASIC program
Vyzvedneme parametry urËujÌcÌ BASIC program a uloûÌme je do hlaviËky
1826
LD HL, (#5C59) E-LINE
;do HL adresa konce oblasti promÏnn˝ch
1829
LD DE, (#5C53) PROG
;do DE adresa zaË·tku BASIC programu
182D
SCF
;nastav CY
182E
SBC HL, DE
;vypoËti dÈlku BASIC programu (BASIC+promÏnnÈ)
1830
LD (IX+#0B), L
;uloû do hlaviËky jako dÈlku dat
1833
LD (IX+#0C), H
1836
LD HL, (#5C4B) VARS
;do HL adresa zaË·tek promÏnn˝ch
1839
SBC HL, DE
;vypoËti dÈlku BASIC programu bez promÏnn˝ch
183B
LD (IX+#0F), L
;uloû do hlaviËky
183E
LD (IX+#10), H
1841
EX DE, HL
;p¯esuÚ ukazatel do HL
Byly vytvo¯eny hlaviËkovÈ informace.
Tvar hlaviËky:
IX+#00 ñ typ dat
IX+#01 ñ 10 ñ jmÈno souboru
IX+#0B ñ 12 ñ poËet byt˘
IX+#0D ñ 16 ñ r˘znÈ parametry, kterÈ z·leûÌ na typu dat
NynÌ se separuje jedna z operacÌ
1842 SAVEALL
1845
1846
V p¯ÌpadÏ dalöÌch
uvedeno v˝öe.
1849
184A
184D
184F
1851
1854
1856
LD A, (#5C74) T_ADDR
;do A kÛd operace
AND A
;je SAVE?
JP
Z, #19FA, SAVECONTR ;ano → skoË
operacÌ je prvnÌch 17 byt˘ hlaviËkovÈ Ë·sti pracovnÌ oblasti vybaveno informacemi, jak bylo
PUSH HL
LD BC, #0011
ADD IX, BC
PUSH IX
CALL #196B, LOAR01
POP
POP
IX
HL
;uloû ukazatel na zaË·tek dat
;formov·nÌ 1. adresy
;do IX adresa 2. hlaviËkovÈ oblasti
;uloû si ukazatel na 2. hlaviËkovou oblast
;zjisti, jestli je soubor na disketÏ, naËti jeho hlaviËku do
;2. hlaviËkovÈ oblasti
;obnov ukazatel na 2. hlaviËku
;obnov ukazatel na zaË·tek dat
V IX je ukazatel na 2. hlaviËku, v HL je 0, jestli se jedn· o novÈ pole nebo zaË·tek BASIC programu.
92
Komentovan˝ v˝pis MDOSu
1857
185A
185C
185E
1861
1862
1865
1867
LD
CP
JR
LD
DEC
JP
CP
JP
A, (IX+#00)
;vyzvedni typ dat
#03
;je to CODE?
Z, #186A, VERIFYCONT;ano → skoË
A, (#5C74) T_ADDR
;do A kÛd p¯Ìkazu
A
;je LOAD?
Z, #189E, LOADCONT ;ano → skoË
#02
;je MERGE?
Z, #1949, MERGECONT;ano → skoË
Proces verifikace.
186A VERIFYCONT
186B
186E
1871
1874
1877
1878
1879
187B
187D
PUSH HL
LD L, (IXñ#06)
LD H, (IXñ#05)
LD E, (IX+#0B)
LD D, (IX+#0C)
LD A, H
OR L
JR
Z, #1888, VERCONT1
SBC HL, DE
JR
C, #1899, REPORTx
187F
1881
1884
1886
1888 VERCONT1
1889
188A
188B
188D
1890
JR
LD
CP
JR
POP
LD
OR
JR
LD
LD
;a vyzvedni poËet byt˘ z novÈ hlaviËky do DE
;je dÈlka neurËena?
;ano → skoË d·le
;porovnej dÈlky
;je vÏtöÌ neû je poûadov·no → skoË na REPORT x ÑFile
;too longì
;jsou shodnÈ → skoË
;chyba se bude takÈ tisknout, jestli budeme nahr·vat
;blok s nestejnou dÈlkou
;ne → skoË na REPORT x ÑFile too longì
;obnov ukazatel na zaË·tek dat
;je roven nule?
Z, #1888, VERCONT1
A, (IX+#00)
#03
NZ, #1899, REPORTx
HL
A, H
L
NZ, #1893, VERCONT2 ;ne → skoË
L, (IX+#0D)
;vyzvedni nov˝ zaË·tek dat z hlaviËky
H, (IX+#0E)
Nahrajeme blok dat.
1893 VERCONT2
PUSH HL
1894
POP IX
1896
JP
#19AE, LOADBLOCK
1899 REPORTx
LD A, #40
189B
JP
#0204, ERRR
Tento podprogram
189E LOADCONT
18A1
18A4
18A5
18A6
18A7
18A9
18AA
18AB
18AC
18AD
;uloû si ukazatel na zaË·tek dat
;vyzvedni poËet byt˘ ze starÈ hlaviËky do HL
;p¯esuÚ ukazatel na zaË·tek dat
;do IX
;skoË na nahr·nÌ souboru do pamÏti
;REPORT x ÑFile too longì
;piö hl·öenÌ a skoË do ZX ROM
¯ÌdÌ ËtenÌ basicovskÈho programu vËetnÏ promÏnn˝ch
LD E, (IX+#0B)
;vyvedni do DE dÈlku bloku z novÈ hlaviËky
LD D, (IX+#0C)
PUSH HL
;uloû si ukazatel na zaË·tek dat
LD A, H
;je Ëteno jiû deklarovanÈ pole?
OR L
JR
NZ, #18AF, LOADCNT1 ;ano → skoË
INC DE
;p¯idej 3 byty pro novou promÏnnou
INC DE
;mÌsto pro jmÈno a dÈlku promÏnnÈ
INC DE
EX DE, HL
;dej dÈlku bloku do HL, do DE zaË·tek dat
JR
#18BB, LOADCONT2 ;skoË na test volnÈho mÌsta
Komentovan˝ v˝pis MDOSu
93
NynÌ je v pamÏti dost mÌsta pro blok dat.
18AF LOADCNT1 LD L, (IXñ#06)
18B2
LD H, (IXñ#05)
18B5
EX DE, HL
18B6
SCF
18B7
SBC HL, DE
18B9
JR
C, #18C4, LOADDATA
Otestuje volnÈ mÌsto.
18BB LOADCONT2 LD
18BE
ADD
18BF
LD
18C0
LD
18C1
RST
18C2
DW
18C4 LOADDATA POP
18C5
LD
18C8
AND
18C9
JR
18CB
LD
18CC
OR
18CD
JR
18CF
DEC
18D0
LD
18D1
DEC
18D2
LD
18D3
DEC
18D4
INC
18D5
INC
18D6
INC
18D7
LD
18DB
RST
18DC
DW
18DE
LD
NynÌ je vyhrazeno
18E2 LOADDATA1
18E5
18E6
18E9
18EC
18ED
18EE
18EF
18F0
18F3
18F4
18F5
18F7
94
;do HL vezmi dÈlku existujÌcÌho BASIC programu
;v pamÏti vËetnÏ promÏnn˝ch
;a dej ji do DE
;nastav CY
;je vyûadov·na pamÏù navÌc?
;ne → skoË
DE, #0005
;5 byt˘ navÌc
HL, DE
;p¯iËti k poËtu byt˘, kterÈ jsou navÌc
B, H
;v˝sledek dej do BC
C, L
#28
;volej podprogram pro vol·nÌ rutiny ZX ROM
#1F05
;podprogram TEST-ROOM test, jestli je dost prostoru
HL
;obnov ukazatel na zaË·tek dat
A, (IX+#00)
;do A typ souboru
A
;Ëte se BASIC program?
Z, #1909, LOADPRG
;ano → skoË
A, H
;Ëte se novÈ pole?
L
Z, #18E2, LOADDATA1 ;ano → skoË
HL
;vezmi do BC dÈlku existujÌcÌho pole
B, (HL)
HL
C, (HL)
HL
;ukazatel posuÚ na jmÈno
BC
;p¯iËti 3 byty pro dÈlku a jmÈno
BC
BC
(#5C5F), IX X-PTR
;uloû si IX po dobu ruöenÌ starÈ promÏnnÈ
#28
;volej podprogram pro vol·nÌ rutiny ZX ROM
#19E8
;podprogram RECLAIM-2 zruöenÌ prostoru ñ promÏnnÈ
IX, (#5C5F) X_PTR
;obnov si IX
mÌsto pro novou promÏnnou ñ na konci platnÈ oblasti pro data.
LD HL, (#5C59) E-LINE
;do HL konec oblasti promÏnn˝ch
DEC HL
;kter˝ je oznaËen bytem #80
LD C, (IX+#0B)
;do BC uloû dÈlku novÈho pole
LD B, (IX+#0C)
PUSH BC
;uloû si dÈlku
INC BC
;nynÌ p¯iËti 3 byty pro jmÈno a dÈlku
INC BC
INC BC
LD A, (IXñ#03)
;zjisti n·zev pole
PUSH AF
;a uschovej ho
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
DW #1655
;podprogram MAKE-ROOM vytvo¯ prostor pro
;promÏnnou ñ bude zabÌrat BC byt˘
INC HL
;HL nynÌ ukazuje na 1. byte pole, kam bude uloûeno
;jmÈno pole
Komentovan˝ v˝pis MDOSu
18F8
18F9
18FA
18FB
18FC
18FD
18FE
18FF
1900
1901
1903
1904
1906
POP AF
LD (HL), A
POP DE
INC HL
LD (HL), E
INC HL
LD (HL), D
INC HL
PUSH HL
POP IX
SCF
LD A, #FF
JP
#19AE, LOADBLOCK
;vyzvedni jmÈno pole
;a uloû ho
;vyzvedni dÈlku pole
;posuÚ ukazatel na adresu uloûenÌ dÈlky pole
;uloû dÈlku pole
;HL ukazuje na adresu, kam se uû bude ukl·dat obsah
;pole, p¯esuÚ ho do IX
;sign·l LOAD
;sign·l blok dat
;pokraËuj nahr·nÌm souboru do pamÏti
LOAD BASICovskÈho programu a jeho promÏnn˝ch.
1909 LOADPROG EX DE, HL
;uschovej si 1. adresu zaË·tku programu do DE
190A
LD HL, (#5C59) E-LINE
;do HL adresa konce oblasti promÏnn˝ch
190D
DEC HL
;kter˝ je oznaËen bytem #80
190E
LD (#5C5F), IX X_PTR
;uloû si IX
1912
LD C, (IX+#0B)
;do BC vyzvedni dÈlku programu
1915
LD B, (IX+#0C)
1918
PUSH BC
;uloû si dÈlku programu
1919
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
191A
DW #19E5
;podprogram RECLAIM-1 zruöenÌ prostoru zruöÌ star˝
;BASIC program
191C
POP BC
;obnov dÈlku dat
191D
PUSH HL
;uloû ukazatel programovÈ oblasti a dÈlku programu
191E
PUSH BC
191F
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
1920
DW #1655
;podprogram MAKE-ROOM vytvo¯enÌ prostoru
;pro BASIC program a jeho promÏnnÈ
1922
LD IX, (#5C5F) X_PTR
;obnov IX
1926
INC HL
1927
LD C, (IX+#0F)
;vyzvedni dÈlku BASIC programu bez promÏnn˝ch
192A
LD B, (IX+#10)
;do BC
192D
ADD HL, BC
;p¯iËti k zaË·tku uloûenÌ BASIC programu
192E
LD (#5C4B), HL VARS
;nastav novou adresu zaË·tku promÏnn˝ch
1931
LD H, (IX+#0E)
;otestuj, jestli
1934
LD A, H
;byl p¯Ìtomen p¯Ìkaz LINE?
1935
AND #C0
1937
JR
NZ, #1943, LOADPRG1 ;ne → skoË
NastavÌme ËÌslo ¯adku a
1939
LD
193C
LD
193F
LD
spustÌme program.
L, (IX+#0D)
(#5C42), HL NEWPPC
(IY+#0A), #00 NSPPC
NynÌ m˘ûeme naËÌst blok
1943 LOADPRG1
POP
1944
POP
1946
JP
;vyzvedni do HL ËÌslo ¯·dky, odkud se bude startovat
;a uloû ho systÈmov˝ch promÏnn˝ch
;nastav po¯adov· ËÌslo p¯Ìkazu v ¯·dce na prvnÌ p¯Ìkaz
dat.
DE
;obnov dÈlku souboru
IX
;obnov ukazatel na prvnÌ byte uloûenÌ souboru
#19AE, LOADBLOCK ;pokraËuj nahr·nÌm souboru do pamÏti
Komentovan˝ v˝pis MDOSu
95
Nahraje soubor do WORKSPACE a vr·tÌ ¯ÌzenÌ do ZX ROM pro provedenÌ ostatnÌch krok˘ p¯Ìkazu MERGE.
1949 MERGECONT LD C, (IX+#0B)
;vyzvedni dÈlku novÈho bloku do BC
194C
LD B, (IX+#0C)
194F
PUSH BC
;uloû ji
1950
INC BC
;vytvo¯ prostor dÈlka+1
1951
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
1952
DW #0030
;podprogram BC-SPACES vytvo¯enÌ BC prostoru
1954
LD (HL), #80
;do bytu ÑnavÌcì uloû #80 (koncov˝ znak)
1956
EX DE, HL
;p¯esuÚ zaË·tek volnÈho mÌsta do HL
1957
POP DE
;obnov dÈlku souboru
1958
PUSH HL
;uloû si zaË·tek volnÈho mÌsta
1959
PUSH HL
;a jeötÏ jednou
195A
POP IX
;a dej ho do IX
195C
CALL #19AE, LOADBLOCK ;nahraj soubor do pamÏti
195F
CALL #2536, DSKSTP
;zastav mechaniky
1962
POP HL
;vyzvedni adresu zaË·tku uloûen˝ch dat
1963
PUSH HL
;a znovu hu uloû
1964
LD HL, #08CE
;n·vratov· adresa do poËÌtaËe, kde se d·le zpracuje
;nahran˝ soubor
1967
EX (SP), HL
;dej ji na z·sobnÌk a obnov do HL zaË·tek uloûen˝ch dat
1968
JP
#1700, STANDROM
;skoË na p¯estr·nkov·nÌ do ZX ROM
LOAR01
ZjistÌ, jestli je soubor na disketÏ.
IN:
IX adresa hlaviËky hledanÈho souboru +17. HlaviËka je p·skov·
BC musÌ obsahovat hodnotu 17
ve DNZONE1 je jmÈno disku, ve FNZONE1 je jmÈno hledanÈho souboru
OUT: prohled· adres·¯ a hled· soubor, pokud existuje, nat·hne od adresy v IX
hlaviËku (prvnÌch 17 byte z diskovÈ hlaviËky)
#3E72 (SVADRA) adresa poloûky adres·¯e v buferu
196B LOAR01
196C
196E
1971
1974
1977
PUSH HL
PUSH IX
LD A, (IX-#11)
LD (IX+#00), A
CALL #19D0, FINTYP
CALL #1C8F, SETACT
197A
197D
197F
1982
1984
1986
1987
1989
198C
198F
1990
1993
1994
CALL #212B, FIRSTMASK
JR
NZ, #1995, TSTSNP
LD (#3E72), HL SVADRA
POP IX
PUSH IX
POP DE
LDIR
LD L, (IX-#11)
LD (IX+#00), L
XOR A
LD (#3E6A), A VARIA3
POP HL
RET
96
;uloû si HL
;a ukazatel na hlaviËku
;do A p¯eËti p·skov˝ typ souboru z 1. hlaviËky
;uloû ji pro p¯evod do 2. hlaviËky
;p¯eveÔ p·skovou p¯Ìponu na diskovou p¯Ìponu
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
;naËti poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
;neexistuje → skoË
;uloû adresu poloûky adres·¯e v buferu do SRAM
;obnov ukazatel na hlaviËku
;a znovu ho uloû
;a vyzvedni do DE
;p¯enes 17 byt˘ poloûky do 2. hlaviËky
;p¯Ìponu p·skovÈ hlaviËky z 1. hlaviËky
;uloû do 2. hlaviËky
;do A nulu
;uloû, nenÌ ale nijak pouûito
;obnov HL
;vraù se
Komentovan˝ v˝pis MDOSu
Soubor nebyl nalezen. Jestli byl hled·n program v BASICu, zkusÌme jeöte hledat soubor s p¯Ìponou ÑSì.
1995 TESTSNP
LD A, (#3E94) EXTE1
;vyzvedni p¯Ìponu souboru z diskovÈ hlaviËky
1998
CP
ÑPì
;je to ÑPì (hlaviËka programu v BASICu)?
199A
JP
NZ, #1FB1, REPORTS ;ne → skoË na REPORT S ÑFile not foundì
199D
LD A, ÑSì
;zkus to se snapem
199F
LD (#3E94), A EXTE1
;uloû novou p¯Ìponu souboru do diskovÈ hlaviËky
19A2
CALL #212B, FIRSTMASK
;naËti poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
19A5
JP
NZ, #1FB1, REPORTS ;neexistuje → skoË na REPORT S ÑFile not foundì
19A8
LD (#3E72), HL SVADRA ;uloû adresu poloûky adres·¯e v buferu do SRAM
19AB
JP
#0394, SNPLOA
;skoË na LOAD snapu
LOADBLOCK
Nahraje soubor do pamÏti. V IX je adresa zaË·tku dat, v DE je dÈlka dat, na adrese #3E72 je adresa uloûenÌ
poloûky adres·¯e v buferu.
IN:
IX adresa zaË·tku uloûenÌ dat
DE dÈlka dat
#3E72 (SVADRA) adresa poloûky adres·¯e v buferu
v DNZONE1 je jmÈno disku
OUT: nahraje blok do pamÏti
19AE LOADBLOCK LD (#3E74), IX STARTADR ;uloû si poË·teËnÌ adresu uloûenÌ dat
19B2
LD (#3E76), DE LENDAT ;uloû si dÈlku dat
19B6
CALL #1C8F, SETACT
;roztoË mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
19B9
LD HL, (#3E74) STARTADR ;do HL poË·teËnÌ adresu dat
19BC
LD DE, (#3E76) LENDAT ;do DE dÈlku dat
19C0
CALL #1FA5, LOAFND
;nahrej data ze souboru
Zv˝öÌme adresu uloûenÌ dat o dÈlku dat.
19C3 LOADBEND LD IX, (#3E74) STARTADR
19C7
LD DE, (#3E76) LENDAT
19CB
ADD IX, DE
19CD
XOR A
19CE
SCF
19CF
RET
;do IX poË·teËnÌ adresa uloûenÌ dat
;do DE dÈlka dat
;p¯iËti dÈlku k poË·teËnÌ adrese
;nastav NZ a A=0
;nastav C
;vraù se
FINTYP
P¯evede p·skovou p¯Ìponu na diskovou.
IN:
IX adresa p·skovÈ hlaviËky souboru
OUT: A diskov· p¯Ìpona
EXTE1 zde je takÈ uloûena diskov· p¯Ìpona
19D0 FINTYP
19D3
19D6
19D9
19DA
19DD
LD A, (IX+#00)
LD HL, #10DB EXTTAB
CALL #0FAD, ADDHLA
LD A, (HL)
LD (#3E94), A EXTE1
RET
;do A dej typ dat z p·skovÈ hlaviËky
;do HL adresu p¯Ìpon v ROM
;posuÚ se na znak p¯Ìpony
;vyzvedni znak p¯Ìpony
;uloû p¯Ìponu souboru
;vraù se
SAVESETPAR
NastavÌ p¯Ìponu souboru a vyzvedne parametry bloku dat.
Komentovan˝ v˝pis MDOSu
97
IN:
IX adresa p·skovÈ hlaviËky souboru
OUT: DE dÈlka dat
#3E78 (VALSYX) poË·teËnÌ adresa
#3E7A (VALSYY) dÈlka BASIC programu
19DE SAVESETPAR
19E1
19E4
19E7
19EA
19ED
19F0
19F3
19F6
19F9
CALL #19D0, FINTYP
LD L, (IX+#0D)
LD H, (IX+#0E)
LD (#3E78), HL VALSYX
LD L, (IX+#0F)
LD H, (IX+#10)
LD (#3E7A), HL VALSYY
LD E, (IX+#0B)
LD D, (IX+#0C)
RET
;p¯eveÔ typ na diskovou p¯Ìponu
;do HL vyzvedni poË·teËnÌ adresu uloûenÌ dat
;a uloû ji do SRAM
;do HL vyzvedni dÈlku BASIC programu
;a uloû ji do SRAM
;do DE vyzvedni dÈlku souboru
;vraù se
SAVECONTR
Podprogram pro uloûenÌ bloku dat na disk.
IN:
IX adresa p·skovÈ hlaviËky souboru
HL adresa zaË·tku ukl·dan˝ch dat
v DNZONE1 je jmÈno disku a v FNZONE1 je jmÈno souboru
OUT: data jsou uloûena do souboru, na jehoû p·skovou hlaviËku ukazuje IX
Vyzvedneme z·kladnÌ parametry z hlaviËky.
19FA SAVECONTR LD (#3E74), HL STARTADR ;uloû si zaË·tek dat
19FD
CALL #19DE, SAVESETPAR ;nastav p¯Ìponu jmÈna souboru a parametry bloku
1A00 SAVRUN
PUSH DE
;uloû si dÈlku dat
1A01
CALL #1C8F, SETACT
;roztoË mechaniku, kter· m· jmÈno jako v DNZONE1
1A04
CALL #212B, FIRSTMASK
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
1A07
JR
NZ, #1A33, SAVNODEL;nenalezena → skoË
Protoûe uû existuje
1A09
1A0C
1A0E
1A10 REPORTf
1A12
soubor se stejn˝m jmÈnem, otestujeme, jestli se do nÏj m˘ûe zapisovat.
CALL #1283, GETATR
;vyzvedni atributy souboru
BIT 2, A
;je WRITE PROTECTED?
JR
NZ, #1A15, SAVRUN1 ;ne → skoË
LD A, #2E
;REPORT f ÑFile is write protectedì
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
NynÌ otestujeme, jestli se tiskne dotaz na p¯eps·nÌ souboru. Pokud ne, je p¯Ìmo p¯eps·n, jinak se systÈm zept·.
1A15 SAVRUN1
LD A, (#3EEE) SNAPINF ;vyzvedni informaci, jestli jde o uloûenÌ snapu
1A18
AND A
;je to uloûenÌ snapu?
1A19
JR
NZ, #1A30, SAVNOASK;ano → skoË p¯Ìmo na p¯eps·nÌ bez dotazu
1A1B
LD A, (#3E62) AIFASK
;vyzvedni informaci, jestli se pt·t na p¯eps·nÌ souboru
1A1E
AND A
;pt·t se?
1A1F
JR
NZ, #1A30, SAVNOASK;ne → skoË
Provedeme dotaz na p¯eps·nÌ souboru.
1A21
PUSH HL
1A22
PUSH DE
1A23
LD DE, #03AF SYSMSG
1A26
LD A, #BE
98
;uloû si parametry
;do DE adresa systÈmov˝ch hl·öenÌ
;do A ËÌslo poloûky ÑRewrite old file?ì
;a dotaz Ñ(Proceed = P)ì
Komentovan˝ v˝pis MDOSu
1A28
1A2B
1A2C
1A2D
1A30 SAVNOASK
CALL #21BF, KEYMSG
POP DE
POP HL
JP
NC, #1019, REPORTF
CALL #1F88, DFILER
UloûÌme soubor na disketu.
1A33 SAVNODEL POP DE
1A34
LD HL, (#3E74) STARTADR
1A37
CALL #2046, SAVEFILE
1A3A
JP
#19C3, LOADBEND
;tiskni a Ëekej na kl·vesu
;obnov parametry
;nep¯epsat → skoË na REPORT F ÑInvalid file nameì
;smaû star˝ soubor z diskety
;obnov si dÈlku dat
;do HL adresa zaË·tku uloûenÌ dat
;uloû soubor
;skoË na ukonËenÌ rutiny a nastavenÌ registr˘
SLMANALSTR
RozdÏlÌ ¯etÏzec na z·sobnÌku na jmÈno disku a souboru a analyzuje je pro p¯Ìkazy SAVE, LOAD, MERGE.
1A3D SLMASTR
1A40
1A43
1A46
1A48
CALL #0FCF, DIVSTRING
CALL #1043, SETWDNM
CALL #10E2, ANALWDNM
JR
Z, #1A49, SLMNODR
INC A
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
;nastav jmÈno disku v DNZONE1 pro I/O
;analyzuj jmÈno disku v DNZONE1
;nebylo vloûeno jmÈno disku → skoË
;nynÌ mÏl asi b˝t test na spr·vnost mechaniky, ale nenÌ
Tady mÏlo b˝t
1A49 SLMNODR
1A4A
1A4D
1A50
1A53
JP
Z, #2337, REPORTX.
EX AF, AFí
CALL #107C, ARRANGNM
JP
NZ, #1019, REPORTF
JP
C, #1019, REPORTF
RET
;nic neznamenjÌcÌ instrukce, ani autor s·m nevÌ
;uprav jmÈno souboru v FNZONE1 na masku
;nebylo vloûeno → skoË na REPORT F ÑInvalid file nameì
;pouûity wildchars → skoË na REPORT F ÑInvalid file
;nameì, vraù se
MOVE
Druh· varianta p¯Ìkazu MOVE, kopÌruje soubory.
Syntaxe:
MOVE "JmÈnoDisku1:MaskaSouboru1","JmÈnoDisku2:[JmÈnoSouboru2]"
P¯Ìkaz slouûÌ ke kopÌrov·nÌ soubor˘ z diskety na disketu. ÑJmÈnoDisku1ì je jmÈno zdrojovÈho disku, JmÈnoDisku2
je jmÈno cÌlovÈho disku. Jsou zkopÌrov·ny vöechny soubory, kterÈ vyhovujÌ prvnÌ masce. Pokud nenÌ
ÑJmÈnoSouboru2ì zad·no, je soubor uloûen pod stejn˝m jmÈnem na cÌlovÈm disku. V ÑMasceSouboruì lze pouûÌt
wildchars (hvÏzdiËkovou konvenci).
1A54 COPYF
1A57
1A58
1A5B
1A5E
1A61
1A63
1A66
1A67
1A6A
1A6D
1A70
1A73
CALL #1C6B, SETCOPYNM
PUSH AF
LD HL, #3E80 DNZONE1
LD DE, #3E95 DNZONE2
LD BC, #15
LDIR
CALL #1C6B, SETCOPYNM
PUSH AF
LD HL, #3E80 DNZONE1
LD DE, #3E95 DNZONE2
LD BC, #0A
CALL #1F0E, VERIFY
JR
NZ, #1A9A, COPYF2
;analyzuj druh˝ ¯etÏzec
;uloû si p¯Ìznaky zpracov·nÌ cÌlovÈ masky souboru
;do HL adresa 1. jmÈna disku pro I/O
;do DE adresa 2. jmÈna disku pro I/O
;jmÈno disku a maska m· 21 byt˘
;p¯enes jmÈno cÌlovÈho disku a novÈ jmÈno souboru
;zpracuj prvnÌ ¯etÏzec
;uloû si p¯Ìznaky zpracov·nÌ zdrojovÈ masky souboru
;do HL adresa jmÈna zdrojovÈho disku
;do DE adresa jmÈna cÌlovÈho disku
;dÈlka jmÈna disku je 10 byt˘
;porovnej je
;rozdÌlnÈ → skoË
KopÌruje se na jednÈ disketÏ. Zkontrolujeme pouûitÌ wildchars, protoûe p¯i kopÌrov·nÌ na jednÈ disketÏ se nesmÌ
pouûÌvat.
Komentovan˝ v˝pis MDOSu
99
1A75
1A76
POP
JP
AF
C, #1019, REPORTF
1A79
1A7A
POP
JP
AF
C, #1019, REPORTF
;obnov p¯Ìznaky zpracov·nÌ 1. masky
;byly pouûity wildchars →skoË na REPORT F ÑInvalid
;file nameì
;obnov p¯Ìznaky zpracov·nÌ 2. masky
;byly pouûity wildchars → skoË na REPORT F ÑInvalid
;file nameì
NynÌ porovn·me jmÈna soubor˘, protoûe p¯i kopÌrov·nÌ na jednÈ disketÏ nesmÌ b˝t stejnÈ.
1A7D
LD HL, #3E8A FNZONE1 ;do HL adresa prvnÌ masky
1A80
LD DE, #3E9F FNZONE2 ;do DE adresa druhÈ masky
1A83
LD BC, #0A
;dÈlka jmÈna je 10 znak˘
1A86
CALL #1F0E, VERIFY
;porovnej je
1A89
JP
Z, #1019, REPORTF
;stejnÈ → skoË na REPORT F ÑInvalid file nameì
NynÌ porovn·me p¯Ìpony, protoûe ty musÌ z˘stat taky stejnÈ.
1A8C
LD A, (#3E94) EXTE1
;vyzvedni p¯Ìponu prvnÌ masky
1A8F
LD HL, #3EA9 EXTE2
;do HL adresa p¯Ìpony druhÈ masky
1A92
CP
(HL)
;porovnej je
1A93
JP
NZ, #1019, REPORTF ;r˘znÈ → skoË na REPORT F ÑInvalid file nameì
1A96
LD B, #FF
;do B p¯Ìznak kopÌrov·nÌ jednoho souboru
1A98
JR
#1AA9, COPYF4
;pokraËuj v prov·dÏnÌ p¯Ìkazu
KopÌruje se z diskety na
1A9A COPYF2
POP
1A9B
LD
1A9D
JR
1A9F
POP
1AA0
JR
1AA2
DEC
1AA3
JR
1AA5 COPYF3
POP
1AA6
JP
disketu. NastavÌme poËet kopÌrovan˝ch soubor˘.
AF
;obnov p¯Ìznaky zpracov·nÌ 1. masky
B, #00
;do B p¯Ìznak kopÌrov·nÌ vÌce soubor˘
C, #1AA5, COPYF3
;byly pouûity wildchars? ano → skoË
AF
;obnov p¯Ìznaky zpracov·nÌ 2. masky
C, #1AA9, COPYF4
;byly pouûity wildchars? ano → skoË
B
;do B p¯Ìznak kopÌrov·nÌ jednoho souboru
#1AA9, COPYF4
;pokraËuj v prov·dÏnÌ
AF
;obnov p¯Ìznaky zpracov·nÌ 2. masky
NC, #1019, REPORTF ;nejsou wildchars → skoË na REPORT F ÑInvalid file
;nameì
NynÌ zkopÌrujeme soubory. V B je buÔ #FF pro kopÌrov·nÌ jednoho souboru, nebo #00 pro kopÌrov·nÌ vÌce
soubor˘.
1AA9 COPYF4
LD C, #00
;nuluj poËÌtadlo zkopÌrovan˝ch soubor˘
1AAB
LD (#C000H), BC
;toto je jedna z nejhoröÌch chyb v MDOSu. S·m autor
;by snad musel b˝t v nedefinovanÈm stavu, aby zde
;tohle vloûil. JakÈ n·sledky toto m·, to si vydedukujte
;sami (jsou vöak hroznÈ)
V opravenÈ verzi MDOSu 1.0 je tato instrukce opravena. Vypad· to takto:
1AAB
1AAC
1AAD
1AAE
NOP
NOP
NOP
NOP
NynÌ zjistÌme velikost volnÈ pamÏti, kterou m˘ûeme vyuûÌvat p¯i kopÌrov·nÌ.
1AAF
PUSH BC
;uloû si poËÌtadlo kopÌrovan˝ch soubor˘
1AB0
LD DE, (#5C65) STKEND ;do DE zaË·tek volnÈ pamÏti
100
Komentovan˝ v˝pis MDOSu
1AB4
1AB7
1AB8
1ABA
1ABC REPROT4
1ABE
LD
DEC
SBC
JR
LD
JP
Otestujeme, jestli se n·m
1AC1 COPYF5
LD
1AC2
SRL
1AC4
JR
1AC6
LD
1AC9
LD
1ACD
LD
1ACF
LD
HL, (#5CB2) RAMTOP
H
HL, DE
NC, #1AC1, COPYF5
A, #03
#0204, ERRR
;do HL adresa poslednÌho byte pro BASIC
;sniû HL o 256
;odeËti zaË·tek volnÈ pamÏti
;je nÏjak· voln· pamÏù? ano → skoË
;REPORT 4 ÑOut of memoryì
;piö hl·öenÌ a skoË do ZX ROM
tam vejde alespoÚ jeden sektor.
A, H
;dej H do
A
;vydÏl dvÏma ñ je to alespoÚ 512 byt˘?
Z, #1ABC, REPORT4
;ne → skoË na REPORT 4 ÑOut of memoryì
(#3E78), A VALSYXlo
;uloû si poËet sektor˘, kolik jich jde naËÌst do pamÏti
(#3E7A), DE VALSYY
;a uloû si zaË·tek buferu pro kopÌrov·nÌ
A, #FF
;prohled·vej od prvnÌ poloûky adres·¯e
(#3E79), A VALSYXhi
;uloû si do SRAM
Najdeme soubor, kter˝ vyhovuje 1. masce.
1AD2 COPYLOOP CALL #1C8F, SETACT
1AD5
1AD8
1ADB
1ADE
1AE1
1AE4
1AE6
;roztoË zdrojovou mechaniku, kter· m· stejnÈ jmÈno
;jako v DNZONE1
LD A, (#3E79) VALSYXhi ;do A ËÌslo poloûky, od kterÈ budeme prohled·vat
;zdrojov˝ disk
CALL #212D, NEXTMASK
;naËti poloûku adres·¯e od A vyhovujÌcÌ 1. masce
LD (#3E79), A VALSYXhi
;uloû si ËÌslo nalezenÈ poloûky
JP
NZ, #1C06, ENDCOPY ;nenalezena → skoË
CALL #1283, GETATR
;vyzvedni atributy souboru
BIT 3, A
;je READ PROTECTED?
JP
Z, #1FBD, REPORTe
;ano → skoË na REPORT e ÑFile is read protectedì
UloûÌme si hlaviËku nalezenÈho souboru z buferu do SRAM.
1AE9
LD DE, #3EB4 SVHEAD
;do DE adresa pro schov·nÌ hlaviËky poloûky v SRAM
1AEC
LD BC, #0020
;dÈlka jednÈ poloûky je 32 byt˘
1AEF
LDIR
;zkopÌruj ji do SRAM
1AF1
LD HL, #3EC5 SVFSC
;do HL adresa prvnÌho sektoru souboru souboru
1AF4
LD E, (HL)
;vyzvedni ho do DE
1AF5
INC HL
1AF6
LD D, (HL)
1AF7
LD (#3E74), DE STARTADR ;a uloû ho do SRAM
1AFB
CALL #1C56, CHNGDRNM ;zamÏÚ jmÈna zdrojovÈho a cÌlovÈho disku a masky
1AFE
POP BC
;obnov si poËÌtadlo kopÌrovan˝ch soubor˘ a p¯Ìznak
1AFF
PUSH BC
;a zase ho uloû
1B00
INC B
;kopÌruje se jenom jeden soubor?
1B01
JR
Z, #1B13, COPYF6
;ano → skoË
1B03
LD HL, #3EB4 SVHEAD
;do HL adresa uloûenÌ hlaviËky poloûky v SRAM
1B06
LD A, (HL)
;vyzvedni p¯Ìponu do A
1B07
LD (#3E94), A EXTE1
;a uloû p¯Ìponu souboru do masky cÌlovÈho disku
1B0A
INC HL
;posuÚ se na jmÈno souboru
1B0B
LD DE, #3E8A FNZONE1 ;do DE adresa masky souboru cÌlovÈho disku
1B0E
LD BC, #000A
;10 znak˘
1B11
LDIR
;zkopÌruj jmÈno
1B13 COPYF6
CALL #1C8F, SETACT
;roztoË cÌlovou mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
1B16
CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
Komentovan˝ v˝pis MDOSu
101
1B19
1B1C
1B1F
1B22
1B23
1B24
1B25
1B26
1B27
CALL #1F66, DELALLFIL
CALL #215C, FIRSTEMPTY
JP
NZ, #2031, REPORTV
POP BC
PUSH BC
PUSH HL
EX DE, HL
INC B
JR
Z, #1B33, COPYFONE
P¯esuneme uchovanou hlaviËku do volnÈ poloûky
1B29
LD HL, #3EB4 SVHEAD
1B2C
LD BC, #0020
1B2F
LDIR
1B31
JR
#1B48, COPYFILE
;smaû soubor odpovÌdajÌcÌ 2. masce na cÌlovÈm disku
;najdi 1. volnou poloûku adres·¯e od zaË·tku
;nenÌ → skoË na REPORT V ÑDirectory fullì
;obnov si poËÌtadlo zkopÌrovan˝ch soubor˘ a p¯Ìznak
;a zase ho uloû
;uloû si ukazatel na volnou poloûku adres·¯e v buferu
;a dej ji do DE
;kopÌruje se jeden soubor?
;ano → skoË
adres·¯e.
;do HL adresa uloûenÌ hlaviËky poloûky v SRAM
;dÈlka poloûky je 32 byt˘
;p¯esuÚ ji do volnÈ poloûky adres·¯e
;skoË na p¯esun souboru
P¯esuneme do volnÈ poloûky adres·¯e novou hlaviËku, jako jmÈno a p¯Ìponu vöak.pouûijeme cÌlovou masku.
1B33 COPYFONE LD A, (#3E94) EXTE1
;vyzvedni p¯Ìponu cÌlovÈ masky
1B36
LD (DE), A
;a uloû ji do p¯Ìpony v adres·¯i v buferu
1B37
INC DE
;posuÚ se na jmÈno souboru v adresa¯i v buferu
1B38
LD HL, #3E8A FNZONE1 ;do HL adresa uloûenÌ cÌlovÈho jmÈna souboru
1B3B
LD BC, #000A
;kopÌrujeme jenom 10 znak˘
1B3E
LDIR
;zkopÌruj jmÈno
1B40
LD HL, #3EBF SVINF
;do HL adresa informacÌ o naËtenÈ poloûce v SRAM
1B43
LD BC, #0015
;dÈlka zb˝vajÌcÌch informacÌ je 21 byt˘
1B46
LDIR
;p¯esuÚ je do volnÈ poloûky adres·¯e
Najdeme prvnÌ voln˝ sektor ve FAT a vytvo¯Ìme si
1B48 COPYFILE
LD HL, #0000
1B4B
CALL #20F6, FIEMPTYFAT
1B4E
JP
NZ, #20BC, RETREP
1B51
LD (#3E76), HL LENDAT
1B54
LD DE, #0C00
1B57
CALL #1D1E, WRTOFAT
1B5A
EX DE, HL
1B5B
POP HL
1B5C
LD A, #11
1B5E
CALL #0FAD, ADDHLA
1B61
LD (HL), E
1B62
INC HL
1B63
LD (HL), D
1B64
CALL #1E65, WSCADR
1B67
CALL #1D9D, WFATIFCH
1B6A COPYRD
CALL #1C56, CHNGDRNM
1B6D
CALL #1C8F, SETACT
1B70
1B73
1B77
1B7A
102
cÌlov˝ soubor jako soubor s nulovou dÈlkou.
;FAT tabulku budeme prohled·vat od zaË·tku
;najdi pr·zdnou poloûku FAT od HL na cÌlovÈm disku
;neexistuje → skoË na REPORT U ÑDisk fullì
;uloû si ËÌslo prvnÌho sektoru na cÌlovÈm disku do SRAM
;do DE p¯Ìznak Ñsoubor s nulovou dÈlkouì
;zapiö do poloûky FAT obsah DE na cÌlovÈm disku
;dej do DE ËÌslo prvnÌho sektoru
;obnov ukazatel na poloûku adres·¯e v buferu, kterou
;vyplÚujeme a posuÚ se na adr. uloûenÌ prvnÌho sektoru
;uloûÌ si ËÌslo prvnÌho sektoru
;do poloûky adres·¯e
;zapiö sektor adres·¯e na cÌlovÈm disku
;zapiö FAT na cÌlovÈm disku, pokud byla zmÏnÏna
;zamÏÚ jmÈna zdrojovÈho a cÌlovÈho disku a masky
;roztoË zdrojovou mechaniku, kter· m· stejnÈ jmÈno
;jako v DNZONE1
CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
LD DE, (#3E7A) VALSYY
;do DE adresa buferu v pamÏti
LD HL, (#3E74) STARTADR ;do HL ËÌslo prvnÌho sektoru uloûenÌ souboru na
;zdrojovÈm disku
LD A, (#3E78) VALSYXlo ;do A poËet sektor˘, kolik jich jde naËÌst do pamÏti
Komentovan˝ v˝pis MDOSu
NaplnÌme bufer ze zdrojovÈho disku.
1B7D COPYRDSC PUSH AF
;uloû si poËet sektor˘
1B7E
PUSH HL
;a ËÌslo sektoru
1B7F
CALL #1DF9, LOGFYZ
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
1B82
EX DE, HL
;dej do HL adresu pro uloûenÌ sektoru
1B83
LD DE, #0100
;jeden sektor, 255 opakov·nÌ
1B86
CALL #22A2, BREADA
;naËti sektor
1B89
EX (SP), HL
;vyzvdeni ËÌslo sektoru a uloû si adresu uloûenÌ dat
1B8A
CALL #1CF1, GETWTEST
;naËti poloûku FAT a otestuj chybu
1B8D
BIT 3, D
;poslednÌ sektor?
1B8F
JR
NZ, #1B9C, CPYRDLST ;ano → skoË
1B91
EX DE, HL
;dej do HL ËÌslo dalöÌho sektoru
1B92
POP DE
;obnov adresu uloûenÌ
1B93
POP AF
;a poËÌtadlo sektor˘
1B94
DEC A
;sniû poËÌtadlo
1B95
JR
NZ, #1B7D, COPYRDSC;jeötÏ nenÌ pln˝ bufer → skoË na naËtenÌ dalöÌho sektoru
1B97
LD (#3E74), HL STARTADR ;uloû si ËÌslo dalöÌho sektoru, kter˝ se bude ËÌst ze
;zdrojovÈho disku
1B9A
JR
#1BB2, CPYFULB
;skoË na uloûenÌ buferu na cÌlov˝ disk
Byl naËten poslednÌ sektor souboru, nastavÌme parametry pro ukonËenÌ souboru.
1B9C CPYRDLST
PUSH DE
;uloû si obsah poslednÌ poloûky
1B9D
CALL #1C56, CHNGDRNM ;zamÏÚ jmÈna zdrojovÈho a cÌlovÈho disku a masky
1BA0
CALL #1C8F, SETACT
;roztoË cÌlovou mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
1BA3
CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
1BA6
POP DE
;obnov si obsah poslednÌ poloûky
1BA7
POP AF
;vyzvedni hodnotu ze z·sobnÌku
1BA8
POP AF
;vyzvedni poËÌtadlo sektor˘
1BA9
PUSH DE
;uloû si obsah poslednÌ poloûky
1BAA
LD B, A
;dej poËÌtadlo sektor˘ do B
1BAB
LD A, (#3E78) VALSYXlo ;a vyzvedni poËet sektor˘, kterÈ se vejdou do buferu
1BAE
SUB B
;odeËti poËÌtadlo ñ v A je poËet naËten˝ch sektor˘
1BAF
INC A
;zvyö o jedniËku
1BB0
JR
#1BC2, COPYBUF
;skoË na vypr·zdnÏnÌ buferu na disk
Je pln˝ bufer, nastavÌme parametry pro vypr·zdnÏnÌ na cÌlov˝ disk.
1BB2 CPYFULB
CALL #1C56, CHNGDRNM ;zamÏÚ jmÈna zdrojovÈho a cÌlovÈho disku a masky
1BB5
CALL #1C8F, SETACT
;roztoË cÌlovou mechaniku, kter· m· stejnÈ jmÈno jako
;v DNZONE1
1BB8
CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
1BBB
LD HL, #8C00
;do HL p¯Ìznak Ñnebyl konec souboruì
1BBE
PUSH HL
;a uloû na z·sobnÌk
1BBF
LD A, (#3E78) VALSYXlo ;do A poËet sektor˘, kterÈ jdou naËÌst do buferu (nynÌ je
;bufer pln˝)
UloûÌme bufer na disk.
1BC2 COPYBUF
LD
1BC6
LD
1BC9
DE, (#3E7A) VALSYY
HL, (#3E76) LENDAT
PUSH AF
;vyzvedni adresu zaË·tku buferu
;a ËÌslo prvnÌho sektoru, kter˝ se bude zapisovat na
;cÌlov˝ disk
;uloû si poËÌtadlo soubor˘
Komentovan˝ v˝pis MDOSu
103
Budeme postupnÏ
1BCA COPYWSC
1BCB
1BCE
1BCF
1BD2
1BD5
1BD8
1BD9
1BDA
1BDB
1BDD
1BDE
zapisovat sektory z buferu.
PUSH HL
CALL #1DF9, LOGFYZ
EX DE, HL
LD DE, #0100
LD A, (#3E6B) WORKDR
CALL #2296, BWRITE
POP DE
POP AF
DEC A
JR
Z, #1BEF, COPYIFALL
PUSH AF
EX DE, HL
;uloû ËÌslo sektoru
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
;dej do HL adresu v buferu
;jeden sektor, 255 opakov·nÌ
;do A drive, se kter˝m se pracuje
;zapiö sektor
;do DE ËÌslo sektoru
;obnov poËÌtadlo sektor˘
;sniû o jeden
;byl zaps·n poslednÌ sektor → skoË
;uloû si poËÌtadlo
;dej do DE adresu v buferu a do HL ËÌslo sektoru
Najdeme dalöÌ volnou poloûku ve FAT a p¯ipojÌme ji do stezky souboru.
1BDF
PUSH DE
;uloû si adresu v buferu
1BE0
PUSH HL
;a ËÌslo naposledy zapisovanÈho sektoru
1BE1
CALL #20F6, FIEMPTYFAT ;najdi pr·zdnou poloûku FAT od HL
1BE4
JR
NZ, #1C1C, COPYNOEM;neexistuje → skoË
1BE6
POP DE
;obnov ËÌslo naposledy zapisovanÈho sektoru
1BE7
EX DE, HL
;zamÏÚ ËÌsla sektor˘
1BE8
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT obsah DE
1BEB
EX DE, HL
;do HL dej ËÌslo sektoru, kter˝ se bude teÔ zapisovat
1BEC
POP DE
;obnov si adresu v buferu
1BED
JR
#1BCA, COPYWSC
;skoË na zaps·nÌ dalöÌho sektoru
Byl zaps·n cel˝ bufer.
1BEF COPYIFALL EX
1BF0
POP
1BF1
BIT
1BF3
RES
1BF5
JR
DE, HL
;do HL adresu v buferu
DE
;vyzvedni obsah poslednÌ poloûky
7, D
;byl konec souboru?
7, D
;zruö 7. bit
NZ, #1C29, CPYNOEND;ne → skoË
P¯i naplÚov·nÌ buferu se narazilo na konec souboru. MusÌme tedy zapsat koncovou znaËku souboru.
1BF7
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT obsah DE
1BFA
CALL #1D9D, WFATIFCH
;zapiö FAT, pokud byla zmÏnÏna
1BFD
CALL #1C56, CHNGDRNM ;zamÏÚ jmÈna zdrojovÈho a cÌlovÈho disku a masky
1C00
POP BC
;obnov ËÌtaË zkopÌrovan˝ch soubor˘ a p¯Ìznak
1C01
INC C
;zvyö poËet zkopÌrovan˝ch soubor˘
1C02
PUSH BC
;a uloû na z·sobnÌk
1C03
JP
#1AD2, COPYLOOP
;a skoË na kopÌrov·nÌ dalöÌho souboru
Konec kopÌrov·nÌ,
1C06 ENDCOPY
1C08
1C09
1C0B
1C0D
1C0E
1C0F
1C11
1C14
104
v˝pis koneËn˝ch informacÌ.
LD A, #FE
RST #28
DW 1601
LD A, #0D
RST #10
POP BC
LD B, #00
CALL #0FA6, BCPRT
XOR A
;kan·l ñ2 (hornÌ Ë·st obrazovky)
;volej podprogram pro vol·nÌ rutiny ZX ROM
;podprogram CHAN-OPEN otev¯enÌ kan·lu
;nov˝ ¯·dek
;tiskni
;vyzvedni poËÌtadlo kopÌrovan˝ch soubory
;do B nula
;piö BC na obrazovku
;poloûka 0 ñ ÑFile(s) copied.ì
Komentovan˝ v˝pis MDOSu
1C15
1C18
1C1B
LD DE, #1C44 TXTMOVE
CALL #01C8, PRTMES
RET
Pokud dojde k chybÏ p¯i z·pisu, je stezka souboru
poslednÌho sektoru se zapÌöe #0C00.
1C1C COPYNOEM POP HL
1C1D
LD DE, #0C00
1C20
CALL #1D1E, WRTOFAT
1C23
CALL #1D9D, WFATIFCH
1C26
JP
#20BC, RETREP
;do DE adresa tabulky p¯Ìkazu MOVE
;piö text poloûky
;vraù se p¯es RETURN do ZX ROM
regulÈrnÏ ukonËena (aby na disketÏ nevznikl zmatek) ñ do
;vyzvedni ËÌslo poslednÌho sektoru
;do DE p¯Ìznak soubor s nulovou dÈlkou
;zapiö do poloûky FAT obsah DE
;zapiö FAT, pokud byla zmÏnÏna
;skoË na REPORT U ÑDisk fullì
Byl zaps·n cel˝ bufer, ale jeötÏ nebyl zkopÌrov·n cel˝ soubor. UkonËÌme prozatÌm stezku souboru (aby p¯i nÏjakÈ
chybÏ p¯i ËtenÌ nevznikl na cÌlovÈ disketÈ zmatek) a pokraËujeme na naplnÏnÌ buferu.
1C29 CPYNOEND PUSH HL
;uloû si ËÌslo naposledy zapsanÈho sektoru
Najdeme voln˝ sektor na cÌlovÈ disketÏ.
1C2A
CALL #20F6, FIEMPTYFAT ;najdi pr·zdnou poloûku FAT od HL
1C2D
JR
NZ, #1C1C, COPYNOEM;nenÌ → skoË
1C2F
POP DE
;do DE ËÌslo naposledy zapsanÈho sektoru
1C30
EX DE, HL
;zamÏÚ ËÌsla sektor˘
1C31
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT obsah DE
1C34
EX DE, HL
;zamÏÚ ËÌsla zpÏt
UkonËÌme stezku souboru pro bezpeËnost.
1C35
LD DE, #0C00
1C38
CALL #1D1E, WRTOFAT
1C3B
LD (#3E76), HL LENDAT
1C3E
CALL #1D9D, WFATIFCH
1C41
JP
#1B6A, COPYRD
;do DE p¯Ìznak soubor s nulovou dÈlkou
;zapiö do poloûky FAT obsah DE
;uloû do SRAM jako sektor, do kterÈho se bude zapisovat
;zapiö FAT, pokud byla zmÏnÏna
;skoË na naËtenÌ dalöÌch sektor˘ do buferu
TXTMOVE
Tabulka text˘ p¯Ìkazu MOVE.
1C44 TXTMOVE
Poloûka 0
1C45
DB
#FF
;invertovan˝ znak
20 46 69 6C 65 28 73 29 20 63 6F 70 69 65 64 2E 8D ;File(s) copied.
CHANGEDRNM
ZamÏnÌ jmÈna zdrojovÈho a cÌlovÈho disku i s maskami.
IN:
jm. disku v DNZONE1 a DNZONE2, masky soubor˘ v FNZONE1 a FNZONE2
OUT: jm. disku a masky jsou zamÏnÏny
1C56 CHNGDRNM
1C59
1C5C
1C5F
LD HL, #3E80 DNZONE1
LD DE, #3E95 DNZONE2
LD BC, #0015
PUSH AF
Provedeme p¯esun.
1C60 CHANGDR1 LD A, (DE)
1C61
LDI
1C63
DEC HL
;do HL adresa jmÈna zdrojovÈho disku
;do DE adresa jmÈna cÌlovÈho disku
;21 znak˘
;uloû si A
;vyzvedni znak jmÈna disku a masky z DNZONE2
;p¯esuÚ znak z DNZONE1 do DNZONE2
;posuÚ ukazatel o jeden zpÏt v DNZONE1
Komentovan˝ v˝pis MDOSu
105
1C64
1C65
1C66
1C69
1C6A
LD
INC
JP
POP
RET
(HL), A
;a uloû znak z DNZONE2 do DNZONE1
HL
;dalöÌ znak ve jmÈnu disku a souboru v DNZONE1
PE, #1C60, CHANGDR1 ;opakuj BC-kr·t
AF
;obnov AF
;vraù se
SETCOPYNM
RozdÏlÌ ¯etÏzec na z·sobnÌku na jmÈno souboru a disku do FNZONE1 a DNZONE1, analyzuje jmÈno disku
a souboru pro p¯Ìkaz MOVE.
1C6B SETCOPYNM
1C6E
1C71
1C74
1C76
1C78
1C7B SETCOPYN1
1C7C
CALL #0FCF, DIVSTRING
CALL #1043, SETWDNM
CALL #10E2, ANALWDNM
JR
C, #1C7B, SETCOPYN1
LD A, #2A
JP
#0204, ERRR
INC A
JP
Z, #2337, REPORTX
;rozdÏl ¯etÏzec na z·sobnÌku na jmÈno disku a souboru
;nastav jmÈno disku v DNZONE1 pro I/O
;analyzuj jmÈno disku v DNZONE1
;bylo vloûeno jmÈno disku → skoË
;REPORT b ÑBad volume nameì
;piö hl·öenÌ a skoË do ZX ROM
;chybn· identifikace disku?
;ano → skoË na report
NastavÌme a zkontrolujeme jmÈno souboru a pouûitÌ wildchars v p¯ÌponÏ.
1C7F
CALL #107C, ARRANGNM
;uprav jmÈno souboru v FNZONE1 na masku
1C82
PUSH AF
;uloû si p¯Ìznaky ˙prav
1C83
LD A, (#3E94) EXTE1
;vyzvedni p¯Ìponu masky
1C86
CP
Ñ?ì
;je to otaznÌk?
1C88
JR
NZ, #1C8D, SETCPYN2 ;ne → skoË
1C8A
POP AF
;obnov p¯Ìznaky ˙prav
1C8B
SCF
;nastav p¯Ìznak Ñpouûito wildcharsì
1C8C
RET
;vraù se
1C8D SETCPYN2
POP AF
;obnov p¯Ìznaky
1C8E
RET
;vraù se
SETACT
Tento podprogram nastavÌ drive podle jmÈna v DNZONE1 jako drive, se kter˝m se bude pracovat. Prohled·
vöechny jmÈna driv˘ a pokud nenajde hledanÈ, naËte parametry vöech p¯ipojen˝ch driv˘ z disket a zkusÌ to znovu.
IN:
DNZONE1
jmÈno hledanÈho drivu
OUT: Z
takov˝ drive byl nalezen
NZ
drive s takov˝m jmÈnem nenÌ
1C8F SETACT
1C90
1C91
1C92
1C93
1C94
1C97
1C9A
1C9B
1C9E
1CA1
PUSH BC
;uloû si registry
PUSH DE
PUSH HL
PUSH AF
XOR A
;nynÌ je nulov·nÌ systÈmov˝ch promÏnn˝ch, kterÈ ale
LD (#3E68), A VARIA1
;nejsou nijak systÈmem pouûity. Asi je to poz˘statek
LD (#3E69), A VARIA2
;z ladÌcÌch rutin.
DEC A
;do A dej 255
LD (#3E6A), A VARIA3
;taky bez v˝znamu
CALL #10E2, ANALWDNM ;analyzuj jmÈno disku v DNZONE1
JR
NZ, #1CA8, OKANALW ;je v po¯·dku → skoË
V DNZONE1 nenÌ jmÈno disku.
1CA3
LD A, #3B
106
;REPORT s ÑInternal errorì
Komentovan˝ v˝pis MDOSu
1CA5
1CA8 OKANALW
1CAA
1CAB
1CAD
1CAF
JP
JR
INC
JR
LD
JP
#0204, ERRR
C, #1CB9, SETNAME
A
NZ, #1CB2, SETDRIVE
A, #20
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
;nebylo vloûeno urËenÌ mechanika AñD → skoË
;otestuj, jestli byla vloûena spr·vn· mechanika
;ano → skoË na zmÏnu mechaniky
;REPORT X ÑBad device typeì
;piö hl·öenÌ a skoË do ZX ROM
Protoûe jako jmÈno mechaniky bylo pouûito urËenÌ mechaniky AñD, je t¯eba udÏlat zmÏnu mechaniky, se kterou
se pracuje.
1CB2 SETDRIVE
DEC A
;uprav ËÌslo mechaniky na rozsah 0ñ3
1CB3
LD (#3E6B), A WORKDR ;nastav jako disk, se kter˝m se bude pracovat
1CB6
JP
#1EA5, GETPAR1
;naËti BOOT a nastav parametry disku
NynÌ se musÌme nastavit disk, se kter˝m se bude pracovat, podle jmÈna disku.
1CB9 SETNAME
CALL #1F16, SETDRV
;hledej drive se stejn˝m jmÈnem jako v DNZONE1
1CBC
JR
Z, #1CEB, SETRET
;naöel drive → skoË na n·vrat
1CBE
CALL #1F49, INITALLDR
;nastav parametry vöech p¯ipojen˝ch disk˘ z BOOT˘
1CC1
CALL #1F16, SETDRV
;hledej drive se stejn˝m jmÈnem jako v DNZONE1
1CC4
JR
Z, #1CEB, SETRET
;naöel → skoË
1CC6
LD DE, #03AF SYSMSG
;do DE tabulka chybov˝ch hl·öenÌ
1CC9
LD A, #3C
;REPORT ÑPlease insert volumeì a dotaz Ñ(Retry = R)ì
1CCB
CALL #21BF, KEYMSG
;tiskni hl·öenÌ a Ëekej na kl·vesu P nebo R
1CCE
JR
C, #1CB9, SETNAME ;stisknuto P, R → skoË na opakov·nÌ
1CD0
LD A, #2C
;REPORT d ÑVolume not foundì
1CD2
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
CMPDSK
NaËte BOOT z diskety a porovn· jmÈno diskety se jmÈnem disku v SRAM. Pokud jsou rozdÌlnÈ, nastavÌ ho jako
novÈ jmÈno disku a nastvÌ novÈ parametry z BOOTu.
IN:
ñ
OUT: Z jmÈno diskety v drivu a jmÈno drivu je stejnÈ
NZ jmÈno diskety bylo jinÈ, musely se nastavit parametry z BOOTu
1CD5 CMPDSK
1CD6
1CD7
1CD8
1CD9
1CDC
1CDF
1CE2
1CE5
1CE8
1CEB SETRET
1CEC
1CED
1CEE
1CEF
1CF0
PUSH BC
;uloû si registry
PUSH DE
PUSH HL
PUSH AF
CALL #1E7E, RDBOOT
;naËti BOOT z diskety drivu, se kter˝m se pracuje
CALL #2199, NAMEDISK
;do HL adresa jmÈna drivu v SRAM
LD DE, #3AC0
;do DE adresa jmÈna diskety v BOOTu
LD BC, #000C
;porovn·me 12 byte (jmÈno + dva n·hodnÈ byty)
CALL #1F0E, VERIFY
;porovnej je
JP
NZ, #1EAB, SETPARAM;jsou rozdÌlnÈ → skoË na nastavenÌ parametr˘ z BOOTu
POP AF
;obnov registry
POP HL
POP DE
POP BC
CP
A
;nastav Z ñ jmÈno diskety v drivu je stejnÈ jako jmÈno
RET
;drivu v SRAM vraù se
GETWITHTEST
NaËte obsah poloûky v HL ve FAT a zjistÌ, jestli nenÌ poökozen· FAT.
Komentovan˝ v˝pis MDOSu
107
IN:
HL ËÌslo poloûky FAT tabulky
OUT: DE obsah poloûky HL ve FAT tabulce
HL ËÌslo poloûky FAT tabulky
1CF1 GETWTEST
CALL #1D04, GETFAT
;vyzvedni obsah poloûky v HL do DE
NynÌ otestujeme, jestli to nenÌ vadn˝, systÈmov˝ nebo pr·zdn˝ sektor.
1CF4
PUSH AF
;schovej si AF
1CF5
LD A, D
;do A vyööÌ byte obsahu poloûky
1CF6
CP
#0D
;systÈmov˝ nebo vadn˝ sektor?
1CF8
JR
Z, #1CFF, REPORTl
;ano → skoË na REPORT l ÑCorrupted FAT structureì
1CFA
OR E
;voln˝ sektor?
1CFB
JR
Z, #1CFF, REPORTl
;ano → skoË na REPORT l ÑCorrupted FAT structureì
1CFD
POP AF
;obnov AF
1CFE
RET
;vraù se
1CFF REPORTl
LD A, #34
;REPORT l ÑCorrupted FAT structureì
1D01
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
GETFAT
Vyzved·v· obsah poloûky v HL z tabulky FAT bez testu chyby ve FAT.
IN:
HL ËÌslo poloûky FAT
OUT: DE obsah poloûky HL ve FAT tabulce
HL ËÌslo poloûky FAT
1D04 GETFAT
1D05
PUSH HL
CALL #1D46, READFATSC
1D08
JR
C, #1D16, IFODD
;schovej si ËÌslo poloûky
;naËti sektor FAT tabulky, kde se nach·zÌ dan· poloûka
;a vypoËti adresu uloûenÌ poloûky
;lich· adresa → skoË
Obsah poloûky zaËÌn· na sudÈ adrese.
1D0A
LD E, (HL)
1D0B
INC HL
1D0C
LD A, (HL)
1D0D
AND #F0
1D0F
RRCA
1D10
RRCA
1D11
RRCA
1D12
RRCA
1D13
LD D, A
1D14
POP HL
1D15
RET
;p¯edej do D, v DE je obsah poloûky
;obnov HL
;vraù se
Obsah poloûky zaËÌn· na
1D16 IFODD
LD
1D17
AND
1D19
LD
1D1A
INC
1D1B
LD
1D1C
POP
1D1D
RET
;vyööÌ byte obsahu poloûky do A
;vyber dolnÌ 4 bity
;p¯edej do D
;posuÚ se na niûöÌ
;niûöÌ byte obsahu poloûky do E, v DE je obsah poloûky
;obnov HL
;vraù se
108
lichÈ adrese.
A, (HL)
#0F
D, A
HL
E, (HL)
HL
;niûöÌ byte obsahu poloûky do E
;posuÚ se na byte
;vyööÌ byte poloûky do A
;vyber hornÌ 4 bity
;posuÚ je dol˘
Komentovan˝ v˝pis MDOSu
WRTOFAT
ZapÌöe do FAT obsah DE do poloûky v HL.
IN:
HL ËÌslo logickÈho sektoru, do nÏhoû se bude zapisovat ve FAT
DE hodnota, kter· se do FAT zapÌöe
OUT: zapÌöe DE do poloûky FAT v HL
1D1E WRTOFAT
1D1F
1D20
1D23
1D25
1D28
1D29
1D2A
PUSH HL
PUSH DE
CALL #1D46, READFATSC
LD A, #FF
LD (#3E6C), A CHNGFLAG
POP DE
PUSH DE
JR
C, #1D3C, WISODD
;uloû registry
;naËti sektor FAT tabulky, kde je uloûen sektor v HL
;do A p¯Ìznak ÑFAT tabulka zmÏnÏnaì
;uloû
;obnov obsah DE
;a zase ho uloû
;lich· poloûka → skoË
»Ìslo sektoru v HL je sudÈ, zapisuje se do vyööÌch byt˘.
1D2C
LD (HL), E
;uloû niûöÌ Ë·st
1D2D
INC HL
;posuÚ se na vyööÌ Ë·st
1D2E
LD A, D
;dej ji do A
1D2F
RRCA
;posuÚ ji nahoru
1D30
RRCA
1D31
RRCA
1D32
RRCA
1D33
LD D, A
;dej ji do D
1D34
LD A, (HL)
;vyzvedni do A informace z vedlejöÌ poloûky
1D35
AND #0F
;ponech jen spodnÌ bity
1D37
OR D
;p¯idej vyööÌ Ë·st
1D38
LD (HL), A
;uloû ji zpÏt do FAT
1D39
POP DE
;obnov registry
1D3A
POP HL
1D3B
RET
;vraù se
»Ìslo sektoru v HL je lichÈ, zapisuje se do niûöÌch bit˘.
1D3C WIFODD
LD A, (HL)
;vyzvedni informace z vedlejöÌ poloûky
1D3D
AND #F0
;ponech hornÌ bity
1D3F
OR D
;p¯idej niûöÌ Ë·st
1D40
LD (HL), A
;uloû ji do FAT
1D41
INC HL
;posuÚ se na vyööÌ Ë·st
1D42
LD (HL), E
;uloû vyööÌ Ë·st
1D43
POP DE
;obnov registry
1D44
POP HL
1D45
RET
;vraù se
READFATSC
NaËte sektor FAT, ve kterÈm je uloûen dan· poloûka v HL, do buferu.
IN:
HL ËÌslo poloûky ve FAT
OUT: sektor FAT, ve kterÈm se nach·zÌ dan· poloûka, je naËten do FATBUF
HL adresa uloûenÌ poloûky v FATBUF
NC sud·
C lich·
Komentovan˝ v˝pis MDOSu
109
Nejd¯Ìve otestujeme, jestli v˘bec existuje takov· poloûka FAT.
1D46 READFATSC PUSH BC
;uloû si BC
1D47
LD BC, #06A9
;do BC 1705 ñ poËet poloûek FAT tabulky
1D4A
AND A
;nuluj CY
1D4B
SBC HL, BC
;odeËti BC od HL
1D4D
JR
C, #1D54, NOHIGHER ;je ËÌslo poloûky vÏtöi neû je maximum? ne → skoË
Takov· poloûka neexistuje.
1D4F
LD A, #3B
1D51
JP
#0204, ERRR
;REPORT s ÑInternal errorì
;piö hl·öenÌ a skoË do ZX ROM
Najdeme poûadovan˝ sektor.
1D54 NOHIGHER ADD HL, BC
;p¯iËti BC zpÏt k HL
1D55
LD C, #00
;v C bude poËÌtadlo sektor˘ ñ na zaË·tku nula
1D57
LD DE, #0155
;do DE 341-poËet poloûek v jednom sektoru FAT
1D5A
AND A
;nuluj p¯Ìznak CY
1D5B CALCSCFAT INC C
;zvÏtöi ËÌslo sektoru
1D5C
SBC HL, DE
;odeËti od HL poËet poloûek jednoho sektoru
1D5E
JR
NC, #1D5B, CALCSCFAT;jeötÏ to nenÌ ten sektor → skoË
1D60
ADD HL, DE
;p¯iËti zpÏt
VypoËteme relativnÌ adresu uloûenÌ poloûky v buferu.
1D61
LD D, H
;dej relativnÌ poloûku do DE
1D62
LD E, L
1D63
ADD HL, HL
;vyn·sob HL t¯emi
1D64
ADD HL, DE
1D65
SRL H
;a vydÏl dvÏma
1D67
RR
L
;v HL je nynÌ adresa poloûky v pamÏti
NynÌ zkontrolujeme, jestli jiû takov˝ sektor nenÌ v buferu.
1D69
PUSH AF
;uloû si p¯Ìznak sud·/lich·
1D6A
LD A, (#3E6E) FATDR
;do A ËÌslo drivu pro poslednÌ pr·ci s FAT
1D6D
LD B, A
;uloû do B
1D6E
LD A, (#3E6B) WORKDR ;do A ËÌslo drivu, se kter˝m se pracuje
1D71
CP
B
;jsou stejnÈ?
1D72
JR
NZ, #1D7A, MUSTREAD;ne → skoË na naËtenÌ sektoru
1D74
LD A, (#3E6D) FATSC
;do A ËÌslo naposledy ËtenÈho sektoru FAT
1D77
CP
C
;porovnej s vypoËÌtan˝m
1D78
JR
Z, #1D96, RDFATPOL ;stejnÈ → skoË
MusÌme naËÌst sektor FAT do buferu.
1D7A MUSTREAD PUSH HL
1D7B
PUSH BC
1D7C
CALL #1D9D, WFATIFCH
1D7F
POP BC
1D80
LD A, C
1D81
LD (#3E6D), A FATSC
1D84
LD B, #00
1D86
LD DE, #0101
1D89
LD HL, #3C00 FATBUF
1D8C
CALL #22A2, BREADA
110
;uloû registry
;zapiö FAT, pokud byla zmÏnÏna
;obnov ËÌslo sektoru
;dej ËÌslo sektoru do A
;uloû ËÌslo sektoru FAT jako naposledy Ëten˝
;ËÌslo stopy 0
;jeden sektor, û·dnÈ opakov·nÌ
;do HL adresa pro uloûenÌ
;naËti sektor FAT
Komentovan˝ v˝pis MDOSu
1D8F
1D90
1D93
POP
LD
LD
HL
A, (#3E6B) WORKDR
(#3E6E), A FATDR
;obnov relativnÌ adresu poloûky
;do A drive, se kter˝m se pracuje
;uloû ho jako drive pro pr·ci s FAT
VypoËteme absolutnÌ adresu uloûenÌ poloûky v pamÏti.
1D96 RDFATPOL
LD DE, #3C00 FATBUF
;do DE adresa uloûenÌ FAT sektoru
1D99
ADD HL, DE
;p¯ipoËti k relativnÌ adrese, v HL je teÔ adresa uloûenÌ
;poloûky
1D9A
POP AF
;obnov p¯Ìznak sud·/lich·
1D9B
POP BC
;obnov BC
1D9C
RET
;vraù se
WFATIFCH
ZapÌöe sektor FAT, pokud byly informace v buferu zmÏnÏny.
IN:
ñ
OUT: zapÌöe bufer FAT na disketu, pokud od jeho poslednÌho naËtenÌ bylo do nÏj
zapisov·no
1D9D WFATIFCH
1D9E
1D9F
1DA0
PUSH BC
PUSH DE
PUSH HL
PUSH AF
;uloû si registry
Zkontrolujeme, jestli byl od poslednÌho z·pisu nebo naËtenÌ sektoru FAT do buferu, zapisov·no do buferu.
1DA1
LD A, (#3E6C) CHNGFLAG ;vyzvedni informaci, jestli bylo zapisov·no do buferu FAT
1DA4
AND A
;bylo zapisov·no do buferu FAT?
1DA5
JR
Z, #1DBD, NOWFAT
;ne → skoË
MusÌme zapsat zmÏny na disk.
1DA7
LD A, (#3E6D) FATSC
1DAA
LD C, A
1DAB
LD A, (#3E6E) FATDR
1DAE
LD DE, #0101
1DB1
LD HL, #3C00 FATBUF
1DB4
LD B, #00
1DB6
CALL #2296, BWRITE
1DB9
XOR A
1DBA
LD (#3E6C), A CHNGFLAG
1DBD NOWFAT
POP AF
1DBE
POP HL
1DBF
POP DE
1DC0
POP BC
1DC1
RET
;vyzvedni ËÌslo sektoru FAT, kter˝ byl naposledy naËten
;a dej ho C
;vyzvedni ËÌslo drivu, ze kterÈho byla naposledy Ëtena FAT
;1 sektor, û·dnÈ opakov·nÌ
;do HL adresa zaËatku uloûenÌ buferu
;stopa 0
;zapiö sektor na disk
;p¯Ìznak Ñnebyly zmÏny v buferu FATì
;uloû ho CHNGFLAG
;obnov registry
;vraù se
FREECOUNT
SpoËÌt· vöechny volnÈ sektory na disketÏ.
IN:
ñ
OUT: BC poËet voln˝ch sektor˘
1DC2 FREECOUNT LD
1DC5
LD
BC, #0000
HL, #000E
;poËet voln˝ch sektor˘ je na zaË·tku nula
;zaËni od sektoru Ë.14
Komentovan˝ v˝pis MDOSu
111
PostupnÏ projdeme vöechny sektory od prvnÌho sektoru datovÈ oblasti aû po prvnÌ nevyuûit˝ sektor na konci
diskety.
1DC8 FRCOUNT1 CALL #1D04, GETFAT
;vyzvedni obsah poloûky do DE
1DCB
INC HL
;a posuÚ se na dalöÌ sektor
1DCC
LD A, D
;do A vyööÌ Ë·st obsahu
1DCD
CP
#0D
;systÈmov˝ nebo vadn˝ sektor?
1DCF
JR
NZ, #1DD6, NOSYS
;ne → skoË
1DD1
LD A, E
;do A niûöÌ Ë·st obsahu
1DD2
CP
#DD
;systÈmov˝ sektor na konci diskety?
1DD4
RET Z
;ano → konec prohled·v·nÌ ñ vraù se
1DD5
OR D
;voln˝ sektor?
1DD6 NOSYS
OR E
;voln˝ sektor?
1DD7
JR
NZ, #1DC8, FRCOUNT1 ;ne → skoË
1DD9
INC BC
;zvyö poËet voln˝ch sektor˘
1DDA
JR
#1DC8, FRCOUNT1
;skoË na testov·nÌ dalöÌho sektoru
SECPERDSK
VypoËte, kolik sektor˘ je na disketÏ.
IN:
IX adresa parametr˘ disku
OUT: HL poËet sektor˘ na disketÏ
1DDC SECPERDSK
1DDF
1DE3
1DE5
1DE7 SECPD1
LD
BIT
JR
RLC
LD
B, (IX+#02)
4, (IX+#01)
Z, #1DE7, SECPD1
B
C, #00
;do B poËet stop na disketÏ
;jednostrann˝ form·t?
;ano → skoË
;vyn·sob poËet stop dvÏma
;nastav poËet sektor˘ na nulu
FYZLOG
P¯evede fyzick˝ sektor a stopu na logick˝ sektor.
IN:
B ËÌslo stopy
C ËÌslo sektoru
IX adresa parametr˘ disku
OUT: HL logick˝ sektor
1DE9 FYZLOG
1DEA
1DED
1DEF
1DF0
1DF1
1DF2
Budeme postupnÏ
1DF4 CALCLOG
1DF5 CALCLOG1
1DF7
1DF8
PUSH DE
LD E, (IX+#03)
LD D, #00
LD H, D
LD L, C
INC B
JR
#1DF5, CALCLOG1
p¯iËÌtat poËet sektor˘ na stopu.
ADD HL, DE
DJNZ #1DF4, CALCLOG
POP DE
RET
;uloû si DE
;do E poËet sektor˘ na stopu z parametr˘ diskety
;do D nula
;do H taky nula
;do L ËÌslo sektoru
;zvyö ËÌslo stopy
;skoË na v˝poËet
;p¯iËti poËet sektor˘ na stopu
;opakuj B-kr·t
;obnov DE
;vraù se
LOGFYZ
P¯epoËte logick˝ sektor na fyzick˝ sektor a stopu.
IN:
HL logick˝ sektor
IX adresa parametr˘ disku
112
Komentovan˝ v˝pis MDOSu
OUT: B
C
1DF9 LOGFYZ
1DFA
1DFD
1DFF
1E01
ËÌslo stopy
ËÌslo sektoru ve stopÏ
PUSH DE
LD E, (IX+#03)
LD D, #00
LD B, #FF
AND A
;uloû si DE
;do E poËet sektor˘ na stopu z parametr˘ diskety
;do D dej nulu
;v B bude poËÌtadlo stop, zaËnem od ñ1 (stopy se
;totiû ËÌslujÌ od 0), nuluj CY
NynÌ budeme odËÌtat poËet sektor˘ na stopu od logickÈho sektoru a posunovat poËÌtadlo stop, dokud nebude
v˝sledek z·porn˝.
1E02 CALCLF
INC B
;zvyö poËÌtadlo stop o 1
1E03
SBC HL, DE
;odeËti poËet sektor˘ na stopu
1E05
JR
NC, #1E02, CALCLF
;jeötÏ m·lo → skoË
UpravÌme zpÏt na sektory.
1E07
ADD HL, DE
1E08
LD C, L
1E09
POP DE
1E0A
RET
;p¯iËti zpÏt
;do C dej ËÌslo sektoru
;obnov DE
;vraù se
READADR
NaËte sektor adres·¯e, ve kterÈm se nach·zÌ poloûka adres·¯e do buferu a vr·tÌ adresu uloûenÌ poloûky v buferu.
IN:
A ËÌslo poloûkyñ1
IX adresa parametr˘ drivu
OUT: HL adresa uloûenÌ poloûky v buferu adres·¯e
Z takov· poloûka existuje
A ËÌslo danÈ poloûky
1E0B READADR
INC A
;zvyö ËÌslo poloûky o 1
1E0C
BIT 7, A
;je vÌce neû 128 poloûek? (0 ñ 127)
1E0E
RET NZ
;ano → vraù se
1E0F
PUSH AF
;uloû registry
1E10
PUSH BC
1E11
PUSH DE
1E12
LD B, A
;uschovej si ËÌslo poloûky do B
1E13
AND #0F
;nech zbytek po dÏlenÌ 16 (poËet poloûek v jednom sek.)
1E15
LD C, A
;uloû ho do C
1E16
PUSH BC
;uloû BC
1E17
LD A, B
;dej do A zpÏt ËÌslo poloûky
1E18
AND #70
;A vydÏlÌme 16
1E1A
RLCA
;vyn·sob A dvÏma
1E1B
RLA
;znovu vyn·sob A dvÏma a 8. bit dej do p¯Ìznaku C
1E1C
PUSH AF
;uloû p¯Ìznak C
1E1D
RLCA
;vyn·sob A dvÏma
1E1E
RLCA
;a jeötÏ jednou dvÏma
1E1F
LD B, A
;uloû si A do B
1E20
POP AF
;obnov si p¯Ìznak C
1E21
LD A, B
;dej B zpÏt do A
1E22
RLA
;a zarotuj
A jsem vyn·sobili 32-mi a p¯iËetli nulu nebo jedniËku podle toho, jestli se poloûka nach·zÌ v lichÈm nebo sudÈm
sektoru), v A je teÔ relativnÌ adresa sektoru, ve kterÈm se nach·zÌ dan· poloûka
Komentovan˝ v˝pis MDOSu
113
1E23
1E26
1E29
LD HL, #0006
CALL #0FAD, ADDHLA
CALL #1DF9, LOGFYZ
;adres·¯ je od 6. sektoru
;p¯iËti A k HL, v HL je teÔ logick˝ sektor
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
NynÌ porovn·me, jestli nenÌ dan˝ sektor adres·¯e v
1E2C
LD A, (#3E6B) WORKDR
1E2F
LD H, A
1E30
LD A, (#3E71) ADRDR
1E33
CP
H
1E34
JR
NZ, #1E3D, RDSFDR
1E36
LD HL, (#3E6F) ADRSCTR
1E39
1E3B
SBC
JR
buferu adres·¯e.
;do A drive, se kter˝m se pracuje
;uloû do H
;vyzvedni drive, z kterÈho byl naposledy p¯eËten adres·¯
;porovnej, jestli jsou stejnÈ
;rozdÌlnÈ → skoË na naËtenÌ sektoru adres·¯e
;vyzvedni ËÌslo stopy a sektoru adres·¯e, kter˝ byl
;naposledy naËten
HL, BC
;porovnej s vypoËten˝mi hodnotami
Z, #1E50 , RDADRCALC;stejnÈ → skoË
MusÌme naËÌst sektor adres·¯e.
1E3D RDSFDR
LD A, (#3E6B) WORKDR
1E40
LD (#3E71), A ADRDR
1E43
1E47
1E4A
1E4D
;do A, se kter˝m se pracuje
;uloû si ho jako drive, z kterÈho byl naposledy p¯eËten
;adres·¯
LD (#3E6F), BC ADRSCTR ;uloû si ËÌslo sektoru a stopy adres·¯e, kter˝ se naËte
;jako poslednÌ z disku
LD HL, #3800 DIRBUF
;do HL adresa, kam se bude ukl·dat sektor adres·¯e
LD DE, #0101
;jeden sektor, û·dnÈ opakov·nÌ
CALL #22A2, BREADA
;naËteme sektor
Sektor m·me v pamÏti. VypoËteme nynÌ adresu poloûky.
1E50 RDADRCALC POP BC
;obnov BC
1E51
LD A, C
;dej do A zbytek po dÏlenÌ 16
1E52
RLCA
;vyn·sobÌme 16-ti
1E53
RLCA
1E54
RLCA
1E55
RLCA
1E56
LD D, #00
;do D dej 0
1E58
RLA
;vyn·sob dvÏma a p¯Ìznak p¯eteËeni do CY
1E59
LD E, A
;do E dej tedy niûöÌ adresu
1E5A
RL
D
;posuÚ CY do D ñ v DE je relativnÌ adresa poloûky
1E5C
LD HL, #3800 DIRBUF
;do HL zaË·tek dat adres·¯e
1E5F
ADD HL, DE
;p¯iËti relativnÌ adresu k HL
1E60
POP DE
;obnov registry
1E61
POP BC
1E62
POP AF
1E63
CP
A
;nastav Z ñ poloûka nalezena
1E64
RET
;vraù se
WSCADR
ZapÌöe sektor adres·¯e.
IN:
ADRDR ËÌslo drivu, kam se bude zapisovat
ADRSCTR ËÌslo stopy a sektoru, kter˝ se bude zapisovat
OUT: zapÌöe se dan˝ sektor na disk
1E65 WSCADR
1E66
114
PUSH AF
PUSH BC
;uloû si registry
Komentovan˝ v˝pis MDOSu
1E67
1E68
1E69
1E6C
1E70
1E73
1E76
1E79
1E7A
1E7B
1E7C
1E7D
PUSH DE
PUSH HL
LD A, (#3E71) ADRDR
LD BC, (#3E6F) ADRSCTR
LD DE, #0101
LD HL, #3800 DIRBUF
CALL #2296, BWRITE
POP HL
POP DE
POP BC
POP AF
RET
;vyzvedni drive, na kter˝ se bude zapisovat sektor adres·¯e
;vyzvedni ËÌslo sektoru a stopy do BC
;1 sektor, û·dnÈ opakov·nÌ
;do HL adresa, kde je uloûen zaË·tek sektoru adres·¯e
;zapiö sektor
;obnov registry
;vraù se
RDBOOT
NaËte BOOT z drivu, se kter˝m se pracuje do AUXBUF a porovn·, jestli disketa v drivu je MDOSovsk·.
IN:
ñ
OUT: naËten˝ BOOT v AUXBUF
1E7E RDBOOT
1E81
1E84
1E87
1E8A
1E8D
1E90
1E93
1E96
LD HL, #3A00 AUXBUF
LD DE, #0101
LD BC, #0000
CALL #22A2, BREADA
LD HL, #3ACC
LD DE, #0F10 TXTSDOS
LD BC, #0004
CALL #1F0E, VERIFY
RET Z
Disketa v drivu nenÌ MDOSovsk·.
1E97
LD A, #FF
1E99
LD (#3E6E), A FATDR
1E9C
LD A, #20
1E9E
JP
#0204, ERRR
;do HL adresa, kam nahr·t BOOT v SRAM
;1 sektor, û·dnÈ opakov·nÌ
;0. sektor, 0. stopa
;naËti sektor
;do HL adresa, kde je uloûen text ÑSDOSì v BOOTu
;do DE adresa, kde je uloûen text ÑSDOSì v pamÏti
;dÈlka je 4 byty
;porovnej je
;jsou stejnÈ → vraù se
;do A dej 255
;zruö ËÌslo drivu, ze kterÈho byla naposledy Ëtena FAT
;REPORT X ÑBad device typeì
;piö hl·öenÌ a skoË do ZX ROM
GETPAR
P¯eËte BOOT, nastavÌ parametry, z BOOTu, uloûÌ jmÈno drivu do SRAM pro disk, se kter˝m se pracuje.
IN:
#3E6B (WORKDR) ËÌslo drivu, odkud ËÌst BOOT a nastavovat parametry
OUT: NZ
nastavenÈ parametry a jmÈno drivu
1EA1 GETPAR
1EA2
1EA3
1EA4
1EA5 GETPAR1
1EA8
PUSH BC
PUSH DE
PUSH HL
PUSH AF
CALL #21A1, DRVSYS
CALL #1E7E, RDBOOT
;uloû si registry
;zjisti adresu parametr˘ disku, se kter˝ se pracuje
;naËti BOOT do pamÏti a porovnej znaËku ÑSDOSì
NastavÌme parametry a jmÈno diskety z BOOTu, kter˝ je naËten v BOOTBUF, jako parametry drivu, na jehoû
parametry ukazuje IX.
1EAB SETPARAM LD A, (IX+#05)
;vyzvedni informace o mechanice
1EAE
LD (IX+#01), A
;uloû do informacÌ o disketÏ
1EB1
BIT 4, (IX+#05)
;jak˝ je form·t mechaniky? (jednostranny/oboustrann˝)
Komentovan˝ v˝pis MDOSu
115
1EB5
1EB7
1EBA
1EBC
1EBE DSIDE
1EC1
1EC4
1EC6
JR
LD
BIT
JR
LD
CP
JR
JR
NZ, #1EBE, DSIDE
A, (#3AB1)
4, A
NZ, #1F09, REPORTX
A, (#3AB2)
(IX+#06)
Z, #1ED2, TRACKOK
C, #1ED2, TRACKLOW
ZjistÌme, jestli nenÌ 80-ti stop· disketa v 40-ti stopÈ
1EC8
SUB (IX+#06)
1ECB
CP
#08
1ECD
JR
NC, #1F09, REPORTX
1ECF
LD A, (#3AB2)
1ED2 TRACKOK
LD (IX+#02), A
;oboustrann˝ → skoË
;vyzvedni informace z BOOTu
;je disketa jednostrann·?
;ne → skoË na REPORT X ÑBad device typeì
;do A poËet stop z BOOTu
;porovnej s poËtem stop mechaniky
;stejnÈ → skoË
;disketa m· mÈnÏ stop → skoË
mechanice.
;odeËti poËet stop mechaniky
;je rozdÌl vÏtöÌ neû 8 (nejvÌce m˘ûe b˝t 8 stop navÌc)
;ano → skoË na REPORT X ÑBad device typeì
;vyzvedni poËet stop z BOOTu
;uloû poËet stop z BOOTU do parametr˘ diskety
NynÌ otestujeme, jestli nenÌ v 40-ti stop· disketa v 80-ti stopÈ mechanice. Tento test vöak vyluËuje moûnost, kdy
je disketa naform·tov·na na poloviËnÌ poËet stop.
1ED5
ADD A, A
;vyn·sob poËet stop na disketÏ dvÏma
1ED6
CP
(IX+#06)
;porovnej s poËtem stop mechaniky
1ED9
JR
NZ, #1EDF, NOLINH ;r˘znÈ → skoË
1EDB
SET 5, (IX+#01)
;nastav bit v 80-ti stopÈ mechanice je 40-ti stop· disketa
1EDF NOLINH
LD A, (#3AB1)
;do A informace o disketÏ z BOOTu
1EE2
AND #13
;%00010011 (ponech pouze pot¯ebnÈ bity pro disketu)
1EE4
LD B, A
;dej do B
1EE5
LD A, (IX+#01)
;vyzvedni informace o disketÏ z SRAM
1EE8
AND #EC
;%11101100 (ponech pouze pot¯ebnÈ bity pro mechaniku)
1EEA
OR B
;p¯idej informace o disketÏ
1EEB
LD (IX+#01), A
;uloû novÈ informace pro disketu
1EEE
LD A, (#3AB3)
;poËet sektor˘ z BOOTu do A
1EF1
LD (IX+#03), A
;uloû do SRAM
NynÌ p¯esuneme jmÈno diskety do jmÈna drivu.
1EF4
CALL #2199, NAMEDISK
1EF7
EX DE, HL
1EF8
LD HL, #3AC0
1EFB
LD BC, #000C
1EFE
LDIR
1F00
POP AF
1F01
LD L, A
1F02
OR #FF
1F04
LD A, L
1F05
POP HL
1F06
POP DE
1F07
POP BC
1F08
RET
1F09 REPORTX
LD A, #20
1F0B
JP
#0204, ERRR
;vypoËti adresu jmÈna drivu v SRAM podle IX
;dej ji do DE
;do HL adresa jmÈna diskety v BOOTu
;12 byt˘ (jmÈno + n·hodnÈ byty)
;p¯esuÚ novÈ jmÈno drivu
;obnov A
;uschovej A do L
;nastav NZ
;obnov A z L
;obnov registry
;vraù se
;REPORT X ÑBad device typeì
;piö hl·öenÌ a skoË do ZX ROM
VERIFY
Porovn·v· 2 bloky o dÈlce BC byt˘.
116
Komentovan˝ v˝pis MDOSu
IN:
BC
HL
DE
OUT: Z
NZ
1F0E VERIFY
1F0F
1F10
1F12
1F13
1F14
poËet porovn·van˝ch byt˘
adresa 1. bloku
adresa 2. bloku
bloky jsou stejnÈ
bloky nejsou stejnÈ
LD
INC
CPI
RET
RET
JR
A, (DE)
DE
NZ
PO
#1F0E, VERIFY
;vyzvedni obsah do A z (DE)
;posuÚ na se na dalöÌ
;porovnej A s obsahem (HL)
;r˘znÈ obsahy → vraù se s NZ
;je B=0 → vraù se s Z
;pokraËuj pro dalöÌ byte
SETDRV
NastavÌ drive, se kter˝m se bude pracovat, podle jmÈna drivu v DNZONE1.
IN:
jmÈno disku v DNZONE1
OUT: Z disk s takov˝m jmÈnem byl nalezen
NZ disk s takov˝m jmÈnem nebyl nalezen
na #3E6B (WORKDR) je uloûeno ËÌslo drivu
1F16 SETDRV
1F17 FINDNMDR
1F18
1F1B
1F1E
1F20
1F23
1F26
1F29
1F2C
XOR A
PUSH AF
LD (#3E6B), A WORKDR
CALL #21AC, DRVCMP
JR
Z, #1F3B, NEXTNM
CALL #2199, NAMEDISK
LD DE, #3E80 DNZONE1
LD BC, #000A
CALL #1F0E, VERIFY
JR
NZ, #1F3B, NEXTNM
;budeme prohled·vat od mechaniky A:
;uschovej si ËÌslo disku
;nastav ho jako disk, se kter˝m se bude pracovat
;zjisti adresu parametr˘ drivu
;mechanika nenÌ p¯ipojena → skoË
;do HL adresa jmÈna drivu
;do DE adresa 1. jmÈna disku pro I/O
;dÈlka jmen je 10 byt˘
;porovn·me je
;rozdÌlnÈ → skoË
Naöel drive se stejn˝m jmÈnem.
1F2E
LD A, (#3E6B) WORKDR
1F31
CALL #256D, TESTDR
1F34
JR
Z, #1F3B, NEXTNM
1F36
CALL #1CD5, CMPDSK
;do A ËÌslo nalezenÈho drivu
;je drive p¯ipraven?
;nenÌ → skoË
;porovnej jmÈno diskety s jmÈnem disku, pokud je r˘znÈ
;naËti BOOT a nastav parametry a jmÈno diskety z BOOTu
Z, #1F43, FINDNMOK ;byly shodnÈ → skoË
1F39
JR
JmÈno nesouhlasÌ,
1F3B NEXTNM
1F3C
1F3D
1F3F
1F41
1F42
zkusÌme tedy otestovat dalöÌ jmÈno disku.
POP AF
;obnov ËÌslo disku
INC A
;posuÚ se na dalöÌ disk
CP
#04
;uû byly 4 disky?
JR
C, #1F17, FINDNMDR ;ne → opakuj
OR A
;nastav NZ
RET
;vraù se
1F43 FINDNMOK
1F44
1F47
1F48
POP AF
LD (#3E6B), A WORKDR
CP
A
RET
;obnov ËÌslo disku
;nastav ho jako drive, se kter˝m se bude pracovat
;nastav Z
;vraù se
Komentovan˝ v˝pis MDOSu
117
INITALLDR
NastavÌ parametry vöech p¯ipojen˝ch driv˘ z BOOT˘ disket
IN:
ñ
OUT: nastavenÈ parametry vöech driv˘ z BOOT˘
1F49 INITALLDR
1F4A INITDR
1F4B
1F4E
1F50
1F51
1F52
1F55
1F57
1F58
1F59
1F5C
1F5F NOINITDR
1F60
1F61
1F63
1F65
XOR A
PUSH AF
CALL #21AC, DRVCMP
JR
Z, #1F5F, NOINITDR
POP AF
PUSH AF
CALL #256D, TESTDR
JR
Z, #1F5F, NOINITDR
POP AF
PUSH AF
LD (#3E6B), A WORKDR
CALL #1EA1, GETPAR
POP AF
INC A
CP
#04
JR
C, #1F4A, INITDR
RET
;zaËÌn· se od mechaniky A
;uschovej si ËÌslo drivu
;zjisti adresu parametr˘ drivu v A
;nenÌ p¯ipojen → skoË
;vyzvedni si ËÌslo drivu
;jeötÏ si ho uschovej
;je drive p¯ipraven?
;nenÌ → skoË
;vyzvedni ËÌslo drivu
;a znovu ho uloû
;nastav ho jako drive, se kter˝m se pracuje
;naËti BOOT a nastav parametry
;vyzvedni ËÌslo drivu
;posuÚ se na dalöÌ
;uû byly Ëty¯i
;ne → opakuj
;vraù se
DELALLFIL
Smaûe vöechny soubory vyhovujÌcÌ masce z disku.
IN:
ve FNZONE1 je maska souboru
v DNZONE1 je jmÈno disku
OUT: Z byl nalezen nÏjak˝ soubor
NZ na disketÏ nebyl û·dn˝ soubor se jmÈnem, kterÈ by vyhovovalo masce
1F66 DELALLFIL
1F69
1F6C
CALL #1C8F, SETACT
CALL #212B, FIRSTMASK
RET NZ
PostupnÏ vymaûeme vöechny soubory.
1F6D DELFIND
PUSH AF
1F6E
CALL #1283, GETATR
1F71
BIT 0, A
1F73
JR
NZ, #1F7A, NODELPR
1F75
LD A, #30
1F77
JP
#0204, ERRR
1F7A NODELPR
CALL #1F88, DFILER
1F7D
POP AF
1F7E
CALL #212D, NEXTMASK
1F81
1F83
1F86
1F87
JR
Z, #1F6D, DELFIND
CALL #1D9D, WFATIFCH
XOR A
RET
;roztoË mechaniku, kter· m· jmÈno jako v DNZONE1
;naËti 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
;nenÌ takov· → vraù se
;uloû si ËÌslo poloûky
;vyzvedni atributy souboru
;je chr·nÏn proti smaz·nÌ?
;ne → skoË
;REPORT h ÑFile is delete protectedì
;piö hl·öenÌ a skoË do ZX ROM
;proveÔ vymaz·nÌ vyhledanÈho souboru v adres·¯i i FAT
;obnov ËÌslo poloûky
;naËti dalöÌ poloûku adres·¯e (od A) vyhovujÌcÌ masce
;v FNZONE1
;naöel → skoË
;zapiö FAT, pokud byla zmÏnÏna
;nastav Z
;vraù se
DFILER
Provede smaz·nÌ vyhledanÈ poloûky adres·¯e.
118
Komentovan˝ v˝pis MDOSu
IN:
HL adresa poloûky adres·¯e v buferu
OUT: soubor je smaz·n z diskety
Nejd¯Ìve vymaûeme soubor z adres·¯e.
1F88 DFILER
LD (HL), #E5
1F8A
CALL #1E65, WSCADR
1F8D
LD DE, #0011
1F90
ADD HL, DE
1F91
LD A, (HL)
1F92
INC HL
1F93
LD H, (HL)
1F94
LD L, A
;uloû do hlaviËky p¯Ìznak Ñpr·zdn· poloûkaì
;zapiö sektor adres·¯e
;do DE relativnÌ adresa uloûenÌ prvnÌho sektoru v hlaviËce
;posuÚ ukazatel na hlaviËku
;do HL dej ËÌslo prvnÌho sektoru souboru
NynÌ vymaûeme soubr z FAT. V HL je ËÌslo prvnÌho sektoru.
1F95 DFILER1
CALL #1CF1, GETWTEST
;naËti poloûku z FAT a otestuj chybu ve FAT
1F98
PUSH DE
;uloû si obsah poloûky
1F99
LD DE, #0000
;do DE nulu ñ Ñpr·zdn˝ sektorì
1F9C
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT v HL obsah DE
1F9F
POP HL
;vyzvedni si obsah poloûky
1FA0
BIT 3, H
;poslednÌ sektor?
1FA2
RET NZ
;ano → vraù se
1FA3
JR
#1F95, DFILER1
;opakuj pro dalöÌ sektor
LOAFND
Nahraje data ze souboru.
IN:
HL poË·teËnÌ adresa uloûenÌ dat v pamÏti
DE dÈlka dat
IX adresa parametr˘ disku, ze kterÈho se budou naËÌtat data
#3E72 (SVADRA) adresa uloûenÌ poloûky adres·¯e v buferu
v buferu je naËten sektor adres·¯e, ve kterÈm jsou informace o souboru
OUT: nahraje data ze souboru do pamÏti
1FA5 LOAFND
1FA6
1FA9
PUSH HL
LD HL, (#3E72) SVADRA
JR
#1FB6, LOAFND1
;uloû si poË·teËnÌ adresu dat
;do HL adresa poloûky adres·¯e v buferu
;pokraËuj v nahr·v·nÌ
LOAWITHF
Vyhled· soubor se jmÈnem ve FNZONE1 a nahraje data ze souboru.
IN:
HL poË·teËnÌ adresa uloûenÌ dat v pamÏti
DE dÈlka dat
IX adresa parametr˘ drivu
ve FNZONE1 je jmÈno souboru
OUT: vyhled· dan˝ soubor na disketÏ a nahraje ho do pamÏti
1FAB LOAWITHF
1FAC
1FAF
1FB1 REPORTS
1FB3
PUSH HL
CALL #212B, FIRSTMASK
JR
Z, #1FB6, LOAFND1
LD A, #1B
JP
#0204, ERRR
;uloû si poË·teËnÌ adresu dat
;najdi 1. poloûku adres·¯e vyhovujÌcÌ masce v FNZONE1
;naöel → skoË
;REPORT S ÑFile not foundì
;piö hl·öenÌ a skoË do ZX ROM
VstupnÌ bod pro nahr·v·nÌ souboru. Na z·sobnÌku je uloûena poË·teËnÌ adresa uloûenÌ dat, v DE je dÈlka dat, v HL
je adresa poloûky adres·¯e v buferu a v IX je ukazatel na parametry disku, ze kterÈho se budou naËÌtat data.
Komentovan˝ v˝pis MDOSu
119
1FB6 LOAFND1
1FB9
1FBB
1FBD REPORTe
1FBF
1FC2 LOAFND2
1FC4
1FC7
1FC8
1FC9
1FCA
CALL #1283, GETATR
BIT 3, A
JR
NZ, #1FC2, LOAFND2
LD A, #2D
JP
#0204, ERRR
LD A, #11
CALL #0FAD, ADDHLA
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
;naËti atributy souboru
;je READ PROTECTED?
;ne → skoË
;REPORT e ÑFile is read protectedì
;piö hl·öenÌ a skoË do ZX ROM
;do A posun na ËÌslo prvnÌho sektoru
;posuÚ ukazatel na ËÌslo prvnÌho sektoru
;vyzvedni ËÌslo prvnÌho sektoru do HL
NynÌ budeme postupnÏ naËÌtat sektory nebo skupiny sektor˘, pokud n·sledujÌ za sebou.
1FCB LOAFNDLP PUSH HL
;uloû si ËÌslo prvnÌho sektoru
1FCC
CALL #1DF9, LOGFYZ
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
1FCF
POP HL
;obnov logickÈ ËÌslo prvnÌho sektoru
1FD0
PUSH BC
;a uloû si fyzickÈ ËÌslo sektoru a stopy
1FD1
CALL #20C4, COUNTCSEC ;spoËÌtej poËet sektor˘ souboru n·sledujÌcÌ za sebou
1FD4
EX DE, HL
;uloû si ËÌslo prvnÌho sektoru mimo posloupnost do HL
1FD5
BIT 3, H
;testuj, jestli je to poslednÌ sektor souboru
1FD7
LD D, B
;do D poËet sektor˘ jdoucÌch za sebou
1FD8
LD E, #00
;do E 255 opakov·nÌ
1FDA
POP BC
;obnov fyzickÈ ËÌslo stopy a sektoru
1FDB
JR
NZ, #1FE4, LOAFND4 ;je to poslednÌ sektor souboru → skoË
1FDD
EX (SP), HL
;vyzvedni si adresu uloûenÌ dat a uloû si ËÌslo prvnÌho
;sektoru mimo posloupnost
1FDE
CALL #22A2, BREADA
;naËti sektor
1FE1
EX (SP), HL
;uloû si adresu uloûenÌ dat a obnov ËÌslo sektoru
1FE2
JR
#1FCB, LOAFNDLP
;skoË na hledn·nÌ dalöÌ posloupnosti
DoËteme zbytek posloupnosti a naËteme poslednÌ sektor souboru.
1FE4 LOAFND4
BIT 1, H
;je to sektor souboru s nulovou dÈlkou?
1FE6
JR
Z, #201B, LFNDNULL ;ano → skoË
1FE8
LD A, H
;do A vrchnÌ byte dÈlky dat v sektoru
1FE9
AND #01
;ponech jen 0. bit
1FEB
LD H, A
;a vraù zpÏt do H ñ v HL je teÔ dÈlka dat v poslednÌm
1FEC
LD A, H
;sektoru ñ je rovna 512?
1FED
OR L
1FEE
JR
NZ, #1FF8, LOAFND3 ;ne → skoË
NaËteme zbytek posloupnosti a vöech 512 byt˘ z poslednÌho sektoru.
1FF0
POP HL
;vyzvedni si adresu uloûenÌ dat
1FF1
CALL #22A2, BREADA
;naËti zb˝vajÌcÌ sektory i s poslednÌm
1FF4
CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ
1FF7
RET
;vraù se
V poslednÌm sektoru je mÈnÏ neû 512 byt˘.
1FF8 LOAFND3
DEC D
;sniû poËet sektor˘ v posloupnosti o 1
1FF9
JR
Z, #2000, LOAFNDLS ;byl jenom jeden → skoË
MusÌme dohr·t posloupnost zb˝vajÌcÌch sektor˘ bez poslednÌho.
1FFB
EX (SP), HL
;vyzvedni adresu uloûenÌ dat
120
Komentovan˝ v˝pis MDOSu
1FFC
1FFF
CALL #22A2, BREADA
EX (SP), HL
;naËti zb˝vajÌcÌ sektory bez poslednÌho
;uloû zpÏt adresu uloûenÌ dat
NynÌ naËteme poslednÌ sektor do buferu a p¯eneseme jen pot¯ebnou Ë·st.
2000 LOAFNDLS
PUSH HL
;uloû si dÈlku dat v poslednÌm sektoru
2001
LD HL, (#3E7E) SVFRSC ;vezmi do HL ËÌslo poslednÌho sektoru souboru
2004
CALL #1DF9, LOGFYZ
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
2007
LD HL, #3A00 AUXBUF
;do HL adr. buferu v SRAM pro uloûenÌ poslednÌho sek.
200A
LD DE, #0101
;jeden sektor, û·dnÈ opakov·nÌ
200D
CALL #22A2, BREADA
;naËti sektor
2010
POP BC
;do BC dÈlka dat v poslednÌm sektoru
2011
POP DE
;do DE adresa uloûenÌ dat
2012
LD HL, #3A00 AUXBUF
;od zaË·tku buferu
2015
LDIR
;p¯esuÚ do pamÏti jen pot¯ebnÈ byty
2017 LOAFNDEND CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
201A
RET
;vraù se
N·vrat, pokud je poslednÌ sektor bez dat (soubor s nulovou dÈlkou).
201B LFNDNULL POP HL
;vyzvedni adreu uloûenÌ dat
201C
JR
#2017, LOAFNDEND ;skoË na dohr·nÌ posloupnosti sektor˘
TRANSTOSEC
VypoËte, kolik sektor˘ zabere soubor na disku.
IN:
DE dÈlka souboru
OUT: B poËet sektor˘
DE dÈlka dat v poslednÌm sektoru
201E TRANSTOSEC LD A, D
201F
AND #FE
2021
RRCA
2022
2023
2024
2026
LD
LD
AND
LD
B, A
A, D
#01
D, A
2027
2028
2029
202A
202B
LD
OR
RET
INC
RET
A, D
E
Z
B
;dej do A vrchnÌ byte dÈlky dat
;zruö 0. bit
;a vydÏl A dvÏma ñ v A je nynÌ poËet sektor˘, kterÈ zabere
;soubor na disku a kterÈ jsou zcela vypnÏny
;dej poËet sektor˘ z A do B
;dej do A vrchnÌ byte dÈlky dat
;ponech pouze 0. bit
;dej zpÏt do D ñ v DE je nynÌ zbytek po dÏlenÌ 512
;je to vlastnÏ poËet byt˘ v poslednÌm sektoru
;je dÈlka dat v poslednÌm sektoru nulova?
;ano → vraù se
;zvyö poËet sektor˘ o poslednÌ sektor
;vraù se
FINDANDFILL
Najde prvnÌ pr·zdnou poloûku adres·¯e a p¯esune do poloûky adres·¯e v buferu jmÈno souboru z FNZONE1.
IN:
jmÈno ve FNZONE1
IX adresa parametr˘ drivu
OUT: HL ukazatel za jmÈno souboru v poloûce v buferu adres·¯e
202C FINDANDFILLCALL #215C, FIRSTEMPTY
202F
JR
Z, #2036, IFFIND
2031 REPORTV
LD A, #1E
2033
JP
#0204, ERRR
;najdi 1. pr·zdnou poloûku adres·¯e od zaË·tku
;nalezena → skoË
;REPORT V ÑDirectory fullì
;piö hl·öenÌ a skoË do ZX ROM
Komentovan˝ v˝pis MDOSu
121
P¯esuneme jmÈno a p¯Ìponu z FNZONE1 do nalezenÈ pr·zdnÈ hlaviËky.
2036 IFFIND
LD A, (#3E94) EXTE1
;vyzvedni p¯Ìponu souboru
2039
LD (HL), A
;uloûi ji na prvnÌ mÌsto v poloûce adres·¯e
203A
INC HL
;posuÚ se na dalöÌ znak
203B
LD DE, #3E8A FNZONE1 ;do DE adresa 1. jmÈna souboru pro I/O
203E
LD BC, #000A
;10 znak˘
2041
EX DE, HL
;zamÏÚ ukazatele
2042
LDIR
;p¯esuÚ jmÈno do poloûky
2044
EX DE, HL
;a vraù zpÏt ukazatele
2045
RET
;vraù se
SAVEFILE
UloûÌ soubor na disk.
IN:
HL adresa zaË·tku dat
DE dÈlka dat
IX adresa parametr˘ drivu
#3E78 (VALSYX) poË·teËnÌ adresa uloûenÌ dat
#3E7A (VALSYY) dÈlka BASICu pez promÏnn˝ch
ve FNZONE1 je jmÈno souboru
OUT: data jsou z pamÏti uloûena do souboru se jmÈnem ve FNZONE1
Vytvo¯Ìme diskovou hlaviËku souboru.
2046 SAVEFILE
PUSH HL
;uloû si adresu uloûenÌ dat
2047
PUSH DE
;a dÈlku dat
2048
CALL #202C, FINDANDFILL ;najdi prvnÌ nepr·zdnou poloûku adres·¯e a dej do nÌ
;jmÈno souboru z FNZONE1
204B
POP DE
;obnov dÈlku dat
204C
LD (HL), E
;a uloû ji do hlaviËky poloûky adres·¯e
204D
INC HL
204E
LD (HL), D
204F
INC HL
2050
LD BC, (#3E78) VALSYX
;vyzvedni poË·teËnÌ adresu
2054
LD (HL), C
;a uloû ji do hlaviËky poloûky adres·¯e
2055
INC HL
2056
LD (HL), B
2057
INC HL
2058
LD BC, (#3E7A) VALSYY
;vyzvedni dÈlku BASIC programu bez promÏnn˝ch
205C
LD (HL), C
;a uloû do hlaviËky poloûky adres·¯e
205D
INC HL
205E
LD (HL), B
205F
INC HL
2060
PUSH HL
;uloû si ukazatel do hlaviËky poloûky adres·¯e
2061
INC HL
;posuÚ se 2 byte poloûky adres·¯e
2062
INC HL
2063
LD A, (#3E7C) HEAD20
;vyzvedni hodnotu do A (je zde 0)
2066
LD (HL), A
;a uloû ji do poloûky adres·¯e
2067
INC HL
;posuÚ se na atributy
2068
LD (HL), #0F
;uloû atributy ÑRWEDì
206A
INC HL
;posuÚ se na t¯etÌ byte dÈlky souboru
206B
LD (HL), #00
;uloû tam nulu
206D
CALL #201E, TRANSTOSEC ;vypoËti poËet sektor˘, kterÈ zabere soubor, a poËet
;byt˘ v poslednÌm sektoru
122
Komentovan˝ v˝pis MDOSu
2070
2071
2072
OR
LD
JR
B
;zapisuje se nÏjak˝ sektor?
A, D
;do A vyööÌ byte poËtu byt˘ v poslednÌm sektoru
NZ, #2079, SAVEFILE1 ;zapisuje → skoË
Je to soubor s nulovou dÈlkou.
2074
LD A, #0C
2076
INC B
2077
JR
#207B, SAVEFILE2
V poslednÌm sektoru budou data.
2079 SAVEFILE1
OR #0E
207B SAVEFILE2 LD D, A
207C
CALL #210A, FINDBESEC
207F
JR
Z, #2089, SAVEFILE3
;do A p¯Ìznak soubor s nulovou dÈlkou
;bude se zapisovat 1 sektor
;skoË na z·pis souboru
;p¯idej znaËku poslednÌ sektor souboru
;dej do D obsah A ñ DE obsahuje hodnotu, kter· se
;zapÌöe do poslednÌho sektoru stezky souboru
;zjisti, jestli na disketÏ existuje blok voln˝ch sektor˘
;jdoucÌch za sebou o dÈlce B
;ano → skoË
Protoûe nenÌ takov˝ dlouh˝ blok, musÌme soubor rozh·zet do vÌce blok˘.
2081
LD HL, #0000
;budeme prohled·vat FAT od prvnÌ poloûky FAT
2084
CALL #20F6, FIEMPTYFAT ;najdi pr·zdnou poloûku FAT od HL
2087
JR
NZ, #20BC, RETREP
;nenalezena → skoË na REPORT U ÑDisk fullì
ZapÌöeme ËÌslo prvnÌho sektoru do hlaviËky souboru.
2089 SAVEFILE3
EX DE, HL
;dej ËÌslo prvnÌho nalezenÈho sektoru do DE
208A
EX (SP), HL
;do HL adresa hlaviËky poloûky adres·¯e
208B
LD (HL), E
;uloû do nÌ ËÌslo prvnÌho sektoru
208C
INC HL
208D
LD (HL), D
208E
CALL #1E65, WSCADR
;zapiö sektor adres·¯e na disk
2091
EX DE, HL
;vraù do HL ËÌslo prvnÌho sektoru
NynÌ zapÌöeme stezku souboru do FAT.
2092
POP DE
2093
PUSH HL
2094
CALL #20DB, SAVETOFAT
2097
INC B
2098
DEC B
2099
JR
NZ, #20BC, RETREP
209B
POP HL
;do DE dÈlku dat v poslednÌm sektoru
;uloû si ËÌslo prvnÌho sektoru
;uloû stezku souboru do FAT
;byly zaps·ny vöechny sektory do FAT?
;ne → skoË na REPORT U ÑDisk fullì
;obnov ËÌslo prvnÌho sektoru
NynÌ uloûÌme soubor na disketu do vytvo¯enÈ stezky. Budeme postupnÏ zapisovat soubor do vytvo¯en˝ch blok˘.
209C SAVEFILE4 PUSH HL
;uloû si ËÌslo sektoru
209D
CALL #1DF9, LOGFYZ
;p¯eveÔ logick˝ sektor na fyzick˝ sektor a stopu
20A0
POP HL
;obnov si ËÌslo logickÈho sektoru
20A1
PUSH BC
;uloû si fyzickou stopu a sektor
20A2
CALL #20C4, COUNTCSEC ;spoËti sektory n·sledujÌcÌ za sebou ve stezce souboru
20A5
PUSH DE
;uloû si ËÌslo poslednÌho sektoru
20A6
LD D, B
;do D poËet sektor˘ za sebou
20A7
LD E, #00
;do E 255 opakov·nÌ
20A9
POP HL
;obnov si poËet byt˘ v poslednÌm sektoru
20AA
POP BC
;obnov si fyzickou stopu a sektor
20AB
EX (SP), HL
;uloû obsah HL a vyzvedni adresu dat
Komentovan˝ v˝pis MDOSu
123
20AC
20AF
20B2
20B3
20B5
20B7
20B8
20BB
20BC RETREP
20BF
20C1
LD A, (#3E6B) WORKDR
CALL #2296, BWRITE
EX (SP), HL
;do A drive, se kter˝m se pracuje
;zapiö sektory
;uloû si adresu uloûenÌ dat a vyzvedni ËÌslo poslednÌho
;sektoru bloku
BIT 3, H
;je to poslednÌ sektor souboru?
JR
Z, #209C, SAVEFILE4 ;ne → skoË
POP HL
;obnov ËÌslo sektoru
CALL #217B, ERAVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
RET
;vraù se
CALL #217B, ERVAR
;vymaû pomocnÈ promÏnnÈ MDOSu
LD A, #1D
;REPORT U ÑDisk fullì
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
COUNTCSEC
VypoËte poËet sektor˘ ve stezce souboru, kterÈ jdou souvisle za sebou (22, 23, 24, 25, Ö).
IN:
HL ËÌslo sektoru, od kterÈho se bude zaËÌnat
OUT: HL ËÌslo prvnÌho sektoru v posloupnosti
DE ËÌslo prvnÌho sektoru mimo posloupnost nebo obsah poslednÌho sek.
B poËet sektor˘ ve stezce jdoucÌ za sebou
#3E7E (SVFRSC) ËÌslo poslednÌho sektoru
20C4 COUNTCSEC LD B, #00
20C6
PUSH HL
;v B bude poËÌtadlo sektor˘
;uloû si ËÌslo logickÈho sektoru
Budeme hledat prvnÌ sektor, kter˝ jiû nen·sleduje tÏsnÏ po p¯edchozÌm.
20C7 COUNTSEC1 LD (#3E7E), HL SVFRSC ;uloû si ËÌslo sektoru do SRAM
20CA
CALL #1CF1, GETWTEST
;naËti poloûku FAT a otestuj chybu
20CD
DEC DE
;sniû ËÌso n·sledujÌciho sektoru ve stezce o 1
20CE
AND A
;nuluj CY
20CF
SBC HL, DE
;odeËti od aktu·lnÌho sektoru snÌûen˝ n·sledujÌcÌ sektor
20D1
ADD HL, DE
;a p¯iËti zpÏt
20D2
INC DE
;vraù do p˘vodnÌho stavu n·sledujÌcÌ sektor
20D3
INC HL
;a posuÚ ËÌslo sektoru
20D4
PUSH AF
;uloû si p¯Ìznak
20D5
INC B
;zvyö poËÌtadlo sektor˘
20D6
POP AF
;obnov p¯Ìznak
20D7
JR
Z, #20C7, COUNTSEC1 ;sektory jdou za sebou → skoË na opakov·nÌ
20D9
POP HL
;obnov ËÌslo
20DA
RET
;vraù se
SAVETOFAT
ZapÌöe cestu souboru do FAT.
IN:
HL ËÌslo poË·teËnÌho sektoru
DE obsah poslednÌho sektoru FAT
B poËet sektor˘
OUT: zapÌöe stezku souboru do FAT, poË·teËnÌ sektor je v HL
B poËet nezapsan˝ch sektor˘
20DB SAVETOFAT PUSH DE
;uloû si obsah poloûky poslednÌho sektoru
Budeme postupnÏ zapisovat vöechny sektory do FAT.
20DC SAVE2FLP
PUSH HL
;uloû si ËÌslo sektoru
124
Komentovan˝ v˝pis MDOSu
20DD
20DE
20E0
20E3
20E5
20E6
20E7
20EA
20EB
20ED SAVETOF1
20EE
20EF
20F2
20F5
DEC B
;sniû poËÌtadlo sektor˘
JR
Z, #20ED, SAVETOF1 ;zaps·ny vöechny → skoË
CALL #20F6, FIEMPTYFAT ;najdi pr·zdnou poloûku FAT od HL
JR
NZ, #20ED, SAVETOF1 ;nenalezena → skoË
EX DE, HL
;dej ËÌslo novÈho sektoru do DE
POP HL
;obnov ËÌslo starÈho sektoru
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT obsah DE
EX DE, HL
;zamÏÚ ËÌsla sektor˘
JR
#20DC, SAVE2FLP
;opakuj z·pis do FAT tabulky
POP HL
;obnov ËÌslo poslednÌho sektoru
POP DE
;obnov obsah poloûky poslednÌho sektoru
CALL #1D1E, WRTOFAT
;zapiö do poloûky FAT obsah DE
CALL #1D9D, WFATIFCH
;zapiö FAT, pokud byla zmÏnÏna
RET
;vraù se
FINDEMPTYFAT
Najde pr·zdnou poloûku FAT tabulky od HL.
IN:
HL logick˝ sektor, od kterÈho se bude prohled·vat FAT
OUT: HL logick˝ sektor, kter˝ je pr·zdn˝
Z takov· poloûka existuje
NZ takov· poloûka neexistuje
20F6 FIEMPTYFAT PUSH DE
PostupnÏ budeme
20F7 FINDEFAT1
20F8
20FB
20FC
20FD
20FF
2102
2104
2105
2107 IFFATEMPTY
2108
2109
;uloû si DE
naËÌtat obsahy poloûek od HL, dokud nenarazÌme na pr·zdnou.
INC HL
;zvyö ËÌslo logickÈho sektoru
CALL #1D04, GETFAT
;vyzvedni obsah poloûky
LD A, D
;je pr·zdn·?
OR E
JR
Z, #2107;IFFATEMPTY ;ano → skoË
LD DE, #06A8
;do DE poËet poloûek FAT
SBC HL, DE
;uû byla prohlÈdnuta poslednÌ poloûka?
ADD HL, DE
;p¯iËti zpÏt
JR
C, #20F7, FINDEFAT1 ;ne → skoË
AND A
;nastav Z podle v˝sledku
POP DE
;obnov DE
RET
;vraù se
FINDBESEC
Hled· ve FAT, jestli v nÌ nenÌ B voln˝ch sektor˘ nep¯etrûitÏ za sebou.
IN:
B poËet hledan˝ch sektor˘.
OUT: HL ËÌslo prvnÌho sektoru v posloupnosti
Z takov· posloupnost existuje
210A FINDBESEC
210B
210C
PUSH DE
PUSH BC
LD HL, #0000
;uloû si registry
;budeme prohled·vat FAT od zaË·tku
Hled·me posloupnost.
210F FINDBE1
CALL #20F6, FIEMPTYFAT ;najdi pr·zdnou poloûku FAT od HL
2112
JR
NZ, #2123, FINDBEERR;nenalezena → skoË
2114
PUSH HL
;uloû si ËÌslo poloûky ve FAT
Komentovan˝ v˝pis MDOSu
125
2115 FINDBE2
2116
2118
2119
211C
211D
211E
2120
DEC B
JR
Z, #2122, FINDBEOK
INC HL
CALL #1D04, GETFAT
LD A, D
OR E
JR
Z, #2115, FINDBE2
JR
#2126, FINDBNBL
Naöel takovou posloupnost.
2122 FINDBEOK
POP HL
2123 FINDBERR
POP BC
2124
POP DE
2125
RET
;sniû ËÌtaË poËtu sektor˘
;uû jsi naöel takov˝ blok → skoË
;zvyö ËÌslo poloûky ve FAT
;vyzvedni obsah poloûky
;je n·sledujÌcÌ poloûka FAT pr·zdn·?
;ano → skoË na test dalöÌ poloûky
;nenaöel B voln˝ch→ skoË
;vyzvedni do HL ËÌslo prvnÌ volnÈ poloûky
;obnov registry
;vraù se
Pokud blok nenÌ dlouh˝ B sektor˘, nastavÌme poËÌtadlo na p˘vodnÌ stav a zkusÌme hledat dalöÌ blok.
2126 FINDBNBL
POP BC
;vyzvedni hodnotu ze z·sobnÌku
2127
POP BC
;vyzvedni poËet hledan˝ch sektor˘ v bloku
2128
PUSH BC
;a znovu ho uloû
2129
JR
#210F, FINDBE1
;a zkus hledat znovu
FIRSTMASK
NaËte prvnÌ poloûku adres·¯e, kter· vyhovuje masce souboru v FNZONE1.
IN:
maska ve FNZONE1
IX adresa parametr˘ drivu
OUT: HL adresa uloûenÌ poloûky v buferu adres·¯e
Z byla nalezena
NZ takov· poloûka nenÌ
A ËÌslo danÈ poloûky
212B FIRSTMASK
LD
A, #FF
;zaËÌn·me od prvnÌ poloûky
NEXTMASK
NaËte dalöÌ poloûku od A vyhovujÌcÌ masce v FNZONE1.
IN:
maska ve FNZONE1
A ËÌslo poloûky-1, od kterÈ se bude prohled·vat
IX adresa parametr˘ drivu
OUT: HL adresa uloûenÌ poloûky v buferu adres·¯e
Z byla nalezena
NZ takov· poloûka nenÌ
A ËÌslo danÈ poloûky
PostupnÏ budeme
212D NEXTMASK
2130
2131
2134
2136
proch·zet vöechny nepr·zdnÈ poloûky a testovat je na masku.
CALL #216C, RDNOEMPTY ;naËti 1. nepr·zdnou poloûku adres·¯e od A
RET NZ
;nenÌ → vraù se
CALL #2137, TESTMSK
;vyhovuje jmÈno souboru masce v FNZONE1?
JR
NZ, #212D, NEXTMASK;ne → skoË na opakov·nÌ hled·nÌ
RET
;vraù se
TESTMSK
ZjistÌ, jestli jmÈno souboru adresovanÈho HL odpovÌd· masce v FNZONE1.
126
Komentovan˝ v˝pis MDOSu
IN:
maska v FNZONE1
HL adresa jmÈna souboru
OUT: Z vyhovuje masce
2137 TESTMSK
2138
2139
PUSH HL
PUSH BC
PUSH DE
;uloû si registry
Nejd¯Ìve porovn·me p¯Ìponu.
213A
LD C, A
213B
LD A, (#3E94) EXTE1
213E
CP
Ñ?ì
2140
JR
Z, #2145 , TESTNM
2142
CP
(HL)
2143
JR
NZ, #2157, NONAME
NynÌ porovn·me jmÈno.
2145 TESTNM
INC
2146
LD
2148
LD
214B TSTNMLOOP LD
214C
CP
214E
JR
2150
CP
2151
JR
2153 NEXTTEST
INC
2154
INC
2155
DJNZ
2157 NONAME
LD
2158
POP
2159
POP
215A
POP
215B
RET
HL
B, #0A
DE, #3E8A FNZONE1
A, (DE)
Ñ?ì
Z, #2153 , NEXTTEST
(HL)
NZ, #2157, NONAME
DE
HL
#214B, TSTNMLOOP
A, C
DE
BC
HL
;uloû si ËÌslo poloûky do C
;vyzvedni p¯Ìponu masky
;je to otaznÌk?
;ano → skoË (p¯eskoËÌme test p¯Ìpony)
;porovnej s p¯Ìponou ve jmÈnÏ souboru
;r˘znÈ → skoË
;posuÚ se na prvnÌ znak ve jmÈnÏ
;porovn·me deset znak˘
;do DE adresa masky
;vyzvedneme znak z masky
;otaznÌk?
;ano → skoË
;porovnej se znakem ve jmÈnÏ souboru
;r˘znÈ → skoË
;posuÚ se na dalöÌ znak v masce
;posuÚ se na dalöÌ znak ve jmÈnÏ souboru
;opakuj B-kr·t
;obnov si ËÌslo poloûky
;obnov si registry
;vraù se
FIRSTEMPTY
Najde prvnÌ volnou poloûku v adres·¯i od zaË·tku adres·¯e.
IN:
IX adresa parametr˘ drivu
OUT: A ËÌslo poloûky, kter· je prvnÌ
HL adresa poloûky v buferu adres·¯e
Z poloûka byla nalezena
NZ poloûka nebyla nalezena
215C FIRSTEMPTY LD
A, #FF
;zaËÌn·me od prvnÌ poloûky adres·¯e
NEXTEMPTY
Najde dalöÌ volnou poloûku v adres·¯i od poloûky v A.
IN:
A ËÌslo poloûky ñ1, od kterÈ se bude prohled·vat adres·¯
IX adresa parametr˘ drivu
OUT: A ËÌslo nalezenÈ poloûky v adres·¯i
HL adresa poloûky v buferu adres·¯e
Z poloûka byla nalezena
NZ poloûka nebyla nalezena
Komentovan˝ v˝pis MDOSu
127
Budeme postupnÏ
215E NXTEMPT
2161
2162
2163
2164
2165
2167
2168
2169
216B
proch·zet vöechny poloûky adres·¯e, dokud nenarazÌme na pr·zdnou.
CALL #1E0B, READADR
;naËti poloûku adres·¯e v A
RET NZ
;neexistuje → vraù se
PUSH BC
;uloû si BC
LD B, A
;uloû si ËÌslo poloûky do B
LD A, (HL)
;vyzvedni p¯Ìponu
CP
#E5
;je to pr·zdn· poloûka?
LD A, B
;obnov ËÌslo poloûky
POP BC
;a BC
JR
NZ, #215E, NXTEMPT ;ne → skoË na hled·nÌ dalöÌ poloûky
RET
;vraù se
RDNOEMPTY
P¯eËte od A prvnÌ nepr·zdnou poloûku adres·¯e.
IN:
A ËÌslo poloûky ñ1, od kterÈ se bude prohled·vat
IX adresa parametr˘ drivu
OUT: HL adresa poloûky v buferu adres·¯e
Z byla nalezena
NZ nebyla nalezena
A ËÌslo poloûky
216C RDNOEMPTY
216F
2170
2171
2172
2173
2175
2176
2177
2179
217A
CALL #1E0B, READADR
;naËti danou poloûku v A adres·¯e z disku
RET NZ
;neexistuje → vraù se
PUSH BC
;uloû BC
LD B, A
;uloû si ËÌslo poloûky do B
LD A, (HL)
;vyzvedni prvnÌ znak z n·zvu
CP
#E5
;pr·zdn· poloûka adres·¯e?
LD A, B
;vraù ËÌslo poloûky zpÏt do A
POP BC
;obnov BC
JR
Z, #216C, RDNOEMPTY;je pr·zdn· → skoË na hled·nÌ dalöÌ
CP
A
;nastav Z
RET
;vraù se
ERAVAR
Vymaûe pomocnÈ promÏnnÈ MDOSu pro pr·ci s adres·¯em a FAT.
IN:
ñ
OUT: vymazanÌ vöech promÏnn˝ch MDOSu
217B
217C
217F
2182
2185
2188
218B
218E
218F
2192
2195
2198
128
XOR
LD
LD
LD
LD
LD
LD
DEC
LD
LD
LD
RET
A
(#3E6D), A FATSC
(#3E6C), A CHNGFLAG
(#3E6F), A ADRSCTRhi
(#3E70), A ADRSCTRlo
(#3E68), A VARIA1
(#3E69), A VARIA2
A
(#3E6A), A VARIA3
(#3E6E), A FATDR
(#3E71), A ADRDR
;nastav do A nulu
;nuluj ËÌslo poslednÏ ËtenÈho sektoru FAT
;nastav p¯Ìznak Ñû·dnÈ zmÏny ve FATì
;nuluj sektor, odkud byl naposledy Ëten adres·¯
;nuluj stopu, odkud byl naposledy Ëten adres·¯
;bez v˝znamu
;bez v˝znamu
;do A dej 255
;bez v˝znamu
;nuluj ËÌslo drivu, ze kterÈho byla naposledy Ëtena FAT
;vymaû ËÌslo disku, odkud byl naposledy Ëten adres·¯
Komentovan˝ v˝pis MDOSu
NAMEDISK
Do HL vypoËte adresu jmÈna diskety v drivu, na jehoû parametry ukazuje IX.
IN:
IX adresa parametr˘ drivu
OUT: HL adresa uloûenÌ jeho jmÈna
2199 NAMEDISK
219B
219C
219F
21A0
PUSH IX
POP HL
LD DE, #0030
ADD HL, DE
RET
;p¯enes ukazatel na parametry drivu do HL
;do DE dej 48 (dÈlka parametr˘ driv˘)
;p¯iËti k HL
;vraù se
DRVSYS
VypoËte adresu tabulky parametr˘ disku, se kter˝m se pracuje.
IN:
WORKDR ËÌslo drivu, se kter˝m se pracuje
OUT: IX adresa parametr˘ disku
21A1 DRVSYS
21A2
21A3
21A6
21A9
21AA
21AB
PUSH BC
PUSH AF
LD A, (#3E6B) WORKDR
CALL #21AC, DRVCMP
POP AF
POP BC
RET
;uloû si registry
;do A drive, se kter˝m se pracuje
;zjisti adresu parametr˘ drivu v A
;obnov registry
;vraù se
DRVCMP
VypoËte adresu tabulky parametr˘ disku.
IN:
A ËÌslo drivu
OUT: IX adresa tabulky parametr˘ drivu
Z drive nenÌ p¯ipojen
NZ drive je p¯ipojen
21AC DRVCMP
21AD
21AE
21AF
21B0
21B1
21B2
21B4
21B8
21BA
21BE
RLCA
RLCA
LD C, A
RLCA
ADD A, C
LD C, A
LD B, #00
LD IX, #3E00 DRPARZN
ADD IX, BC
BIT 0, (IX+#00)
RET
;dÈlka parametr˘ jednoho disku je 12 byt˘
;vyn·sobÌme tedy ËÌslo drivu dvan·cti
;zÌsk·me tak relativnÌ adresu zaË·tku parametr˘
;drivu v A
;d·me ji do BC
;do IX zaË·tek tabulek parametr˘ disk˘
;p¯iËti relativnÌ adresu
;testuj, jestli je mechanika p¯ipojena
;vraù se
KEYMSG
Tiskne hl·öenÌ a dotaz v A a Ëek· na stisk kl·vesy R nebo P.
IN:
A 0. aû 6. bit urËujÌ ËÌslo hl·öenÌ v systÈmov˝ch hl·öenÌch a 7. bit urËuje
typ dotazu
DE tabulka systÈmov˝ch hl·öenÌ
OUT: vytiskne hl·öenÌ s dotazem na obrazovku a Ëek· na stisk kl·vesy
C bylo stisknuto P nebo R
NC nebylo stisknuto ani P ani R
Komentovan˝ v˝pis MDOSu
129
21BF KEYMSG
21C0
PUSH HL
PUSH BC
;uloû si registry
UloûÌme si aktu·lnÌ kan·l pro vstup a v˝stup, aby ho bylo moûno vr·tit do p˘vodnÌho stavu.
21C1
LD HL, (#5C51) CURCHL ;vyzvedni adresu kan·lu, kter˝ je pouûÌvan pro vstup
21C4
PUSH HL
;a v˝stup ñ uloû si ji
21C5
PUSH AF
;a jeötÏ dalöÌ registry
21C6
PUSH DE
21C7
LD A, #FD
;kan·l ñ3 (dolnÌ Ë·st obrazovky)
21C9
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
21CA
DW #1601
;podprogram CHAN-OPEN otev¯enÌ kan·lu
Nejd¯Ìve vytiskneme hl·öenÌ.
21CC
POP DE
21CD
POP AF
21CE
PUSH AF
21CF
AND #7F
21D1
INC A
21D2
CALL #01C8, PRTMES
;obnov si ukazatel na tabulku hl·öenÌ
;a ËÌslo hl·öenÌ
;znovu si uloû ËÌslo hl·öenÌ
;zruö 7. bit
;a zvyö o 1
;tiskni hl·öenÌ na obrazovku
NynÌ vytiskneme dotaz.
21D5
POP AF
21D6
AND #80
21D8
RLCA
21D9
LD DE, #21FB TXTQUE
21DC
CALL #01C8, PRTMES
21DF
SET 5, (IY+#02) TVFLAG
;vyzvedni ËÌslo hl·öenÌ
;ponechej pouze 7. bit
;a posuÚ 7. bit do 0. bitu ñ dostaneme tak ËÌslo dotazu
;do DE adresa dotaz˘
;piö text dotazu
;nastav sign·l, ûe spodnÌ Ë·st obrazvky bude pot¯eba vyËistit
NynÌ Ëek·me na stisk kl·vesy. To nenÌ celkem dob¯e vy¯eöeno, protoûe pokud v dobÏ vol·nÌ byl kurzor nastaven
v jinÈm mÛdu, neû L nebo C, jsou öpatnÏ interpretov·ny kÛdy (UDG kÛdy nebo kÛdy klÌËov˝ch slov).
21E3
RST #28
;volej podprogram pro vol·nÌ rutiny ZX ROM
21E4
DW #15D4
;podprogram WAIT_KEY Ëek·nÌ na stisk kl·vesy
21E6
POP HL
;obnov do HL adresu kan·lu pro vstup a v˝stup
21E7
LD (#5C51), HL CURCHL ;uloû ji zpÏt (vr·tÌme vöe do p˘vodnÌho stavu)
21EA
POP BC
;obnov ostatnÌ registry
21EB
POP HL
21EC
LD A, (#5C08) LAST_K
;do A kÛd naposledy stisknutÈ kl·vesy
21EF
AND #DF
;p¯eveÔ na velkÈ pÌsmeno
21F1
CP
ÑRì
;bylo stisknuto ÑRì?
21F3
SCF
;nastav CY
21F4
RET Z
;ano → vraù se
21F5
CP
ÑPì
;bylo stisknuto ÑPì?
21F7
SCF
;nastav CY
21F8
RET Z
;ano → vraù se
21F9
AND A
;nuluj CY ñ nastav sign·l Ñneplatn· kl·vesaì
21FA
RET
;vraù se
TXTQUE
Tabulka text˘ dotaz˘.
21FB TXTQUE
130
DB
#80
;invertovan˝ znak
Komentovan˝ v˝pis MDOSu
Dotaz 0
21FC
Dotaz 1
2208
20 28 52 65 74 72 79 20 3D 20 52 A9
;(Retry-R)
20 28 50 72 6F 63 65 65 64 20 3D 20 50 A9
;(Proceed-P)
HWINIT
Test disketov˝ch mechanik, zjiötÏnÌ poËtu stop, inicializace obvodu 8255.
IN:
ñ
OUT: nastavenÌ parametr˘ mechanik a inicializace obvodu 8255
Nejd¯Ìve inicializujeme ¯adiË.
2216 HWINIT
LD A, #D0
2218
OUT (#81), A
221A
XOR A
;p¯Ìkaz p¯eruöenÌ Ëinnosti ¯adiËe
;vyöli p¯Ìkaz ¯adiËi
;bude se testovat od mechaniky A
NynÌ budeme postupnÏ testovat jednotlivÈ mechaniky a zapisovat jejich parametry do SRAM.
221B HWINI0
PUSH AF
;schovej si ËÌslo mechaniky
221C
CALL #21AC, DRVCMP
;vypoËti adresu parametr˘ mechaniky v A
221F
PUSH IX
;p¯edej ji do HL
2221
POP HL
2222
INC HL
;zvyö ji o 1, ukazuje teÔ na parametry diskety
2223
LD E, L
;a dej ji do DE
2224
LD D, H
2225
INC HL
;zvyö ji o 4, ukazuje teÔ na parametry mechaniky
2226
INC HL
2227
INC HL
2228
INC HL
2229
LD BC, #0003
;zkopÌruj 3 parametry z 5. na 1.
222C
LDIR
222E
RES 0, (IX+#00)
;nastav sign·l drive nep¯ipojen
2232
RES 7, (IX+#00)
;nastav p¯Ìznak neporovn·vat ËÌslo stopy s registrem
;¯adiËe (tady to je z d˘vod˘ inicializace mechanik)
2236
LD A, (IX+#02)
;vyzvedni poËet stop do A
2239
AND A
;je drive definov·n?
223A
JR
Z, #2271, HWINI1
;ne → skoË
223C
POP AF
;obnov si ËÌslo mechaniky
223D
PUSH AF
;a znovu si ho schovej
223E
CALL #254B, DRVSEL
;roztoË mechaniku
2241
CALL #234B, HOME
;poöli hlavu na stopu 0
2244
OUT (#87), A
;vyöli zÌskan˝ status jako ËÌslo stopy do registru ¯adiËe
2246
AND #04
;je disk p¯ipojen? (test sign·l˘ BUSY a TRACK 00)
2248
JR
Z, #2271, HWINI1
;ne → skok na test dalöÌho disku
224A
SET 0, (IX+#00)
;nastav sign·l disk p¯ipojen
224E
LD (IX+#04), #00
;uloû informaci, ûe hlava je na stopÏ nula
NynÌ probÌha zajÌmave zjiöùov·nÌ, o jakou mechaniku se vlastnÏ jedn·. Jestli o 40-ti nebo 80-ti stopou mechaniku.
ProbÌh· to asi tak, ûe se nejd¯Ìve vystavÌ hlava na 54 stopu a potom hned na 2 stopu. Pokud je mechanika 40-ti stop·,
hl·sÌ ve statusu, ûe je na stopÏ 0. To, co slyöÌte p¯i resetu poËÌtaËe (hrk, hrk, hrk, vrrrrrrrÖ) je vystavov·nÌ hlavy pr·vÏ
na stopu 54. Tam uû totiû û·dn· 40-ti stop· mechanika nedos·hne. A to se potom m˘ûe zbl·znit.
2252
LD A, #36
;do A stopa 54
2254
LD D, #10
;do D p¯Ìkaz SEEK (nastav na stopu)
Komentovan˝ v˝pis MDOSu
131
2256
2259
225B
225D
2260
2262
2264
2266
2268 TRK40
226B
226E
CALL #2340, SEEK
LD A, #02
LD D, #10
CALL #2340, SEEK
AND #04
LD A, #28
JR
NZ, #2268, TRK40
LD A, #50
LD (IX+#06), A
LD (IX+#03), A
CALL #234B, HOME
2271 HWINI1
2272
2273
2275
2277
POP AF
INC A
CP
#02
JR
C, #221B, HWINI0
CALL #2536, DSKSTP
;proveÔ vystavenÌ na stopu 54
;stopa 2
;do D p¯Ìkaz SEEK (nastav na stopu)
;proveÔ vystavenÌ na stopu 2
;byla vystavenÌ hlavy v po¯·dku?
;do A si d·me 40 stop
;ne → skoË na disk 40 stop
;disk m· 80 stop
;uloû informaci o poËtu stop do parametr˘ drivu
;a takÈ do parametr˘ diskety
;proveÔ vystavenÌ hlavy na stopu 0, aù se 40-ti stopÈ
;mechaniky dajÌ dohromady
;obnov ËÌslo mechaniky
;posuÚ na dalöÌ mechaniku
;uû byly otestov·ny dva disky?
;ne → testuj dalöÌ
;vypni mechaniky
NynÌ otestujeme, jestli nenÌ p¯ipojen nÏjak˝ jin˝ obvod 8255. Pokud ano, je obvod v mechanice zablokov·n.
Tento test je ale chybn˝, protoûe aù je nebo nenÌ p¯ipojen jin˝ obvod 8255, dojde vûdy k zablokov·nÌ obvodu
v disketovÈ jednotce.
227A
LD A, #88
;inicializaËnÌ hodnota interface v D40
;A0, PA=v˝stupnÌ, PCH=vstupnÌ, B0, PB=v˝stupnÌ,
;PCL=v˝stupnÌ. Toto vöak nenÌ nejlepöÌ. SpÌöe by mÏlo
;b˝t LD A, #80
227C
OUT (#7F), A
;inicializuj obvod 8255
227E
LD A, #0F
;nastav PC7=1
2280
OUT (#7F), A
2282
LD A, #0B
;nastav PC5=1
2284
OUT (#7F), A
2286
IN
A, (#5F)
;Ëti PC
2288
AND #F0
;ponech PC4 ñ PC7
228A
CP
#A0
;byl zjiötÏn jin˝ 8255?
228C
LD A, #9B
;vöechny porty jako vstupnÌ
228E
OUT (#7F), A
2290
RET Z
;ano → vraù se p¯i jinÈm 8255
2291
LD A, #20
;povol Ëinnost portu
2293
OUT (#91), A
2295
RET
;vraù se
V opravenÈ verzi MDOSu 1.0
227A
LD
227C
LD
227F
RET
2280
DB
2285
DB
228A
DB
2290
DB
2295
RET
je test obvodu 8255 zruöen. Vypad· to takto:
A, #C7
;v˝znam tÏchto instrukcÌ mi nenÌ zn·m
(#0066), A
;toto je skuteËnÏ nÏjak·Ö
;ale tady uû to d·v· smysl, je to n·vrat zpÏt
#FF, #FF, #FF, #FF, #FF
#FF, #FF, #FF, #FF, #FF
#FF, #FF, #FF, #FF, #FF
#FF, #FF, #FF, #FF, #FF
Komentovan˝ v˝pis MDOSu ñ skvÏl˝ zdroj informacÌ
132
Komentovan˝ v˝pis MDOSu
BWRITE
ZapÌöe sektor nebo ¯adu sektor˘ na disk.
IN:
HL adresa, odkud zapisovat
B ËÌslo stopy
C ËÌslo sektoru
D kolik sektor˘ se m· zapisovat
E poËet opakov·nÌ p¯i chybÏ CRC
A ËÌslo drivu, na kter˝ se bude zapisovat
2296 BWRITE
2297
229A
PUSH HL
LD HL, #23BE DWRITE
JR
#22A9, BRWR0
;uloû si datov˝ ukazatel
;do HL adresa rutiny pro naËtenÌ sektoru
;skoË na spoleËnou Ë·st
BFORMA
Form·tuje stopu, parametry jsou shodnÈ jako u BWRITE (mimo poËet sektor˘ a ËÌsla sektoru).
229C BFORMA
229D
22A0
PUSH HL
LD HL, #23D8 DFORMA
JR
#22A9BRWR0
;uloû si datov˝ ukazatel
;do HL adresa rutiny pro form·tov·nÌ stopy
;skoË na spoleËnou Ë·st
BREADA
NaËte sektor nebo ¯adu sektor˘ z disku. Parametry jsou shodnÈ jako u BWRITE aû na registr A.
22A2 BREADA
LD
A, (#3E6B) WORKDR
;do A drive, se kter˝m se pracuje
BREAD
M· stejnou funkci jako BREADA, ale v registru A je ËÌslo drivu, ze kterÈho se bude ËÌst.
22A5 BREAD
22A6
PUSH HL
LD HL, #236A DREAD
;uloû si datov˝ ukazatel
;do HL adresa rutiny pro ËtenÌ sektoru
Vytvo¯Ìme si v SRAM skok na poûadovanou rutinu.
22A9 BRWR0
LD (#3E64), HL MODJPA2 ;nastav skok na rutinu p¯es SRAM
22AC
LD HL, #3E63 MODJP1
;na adresu #3E63
22AF
LD (HL), #C3
;uloû kÛd instrukce JP
22B1
POP HL
;obnov datov˝ ukazatel
Provedeme operaci pro jeden sektor.
22B2 BRWL0
PUSH BC
22B3
PUSH AF
22B4
PUSH DE
22B5
PUSH HL
22B6
CALL #3E63, MODJP1
22B9
INC C
22BA
DEC C
22BB
JR
Z, #22E7, BREAD1
22BD
DEC B
22BE
JR
NZ, #2300, BREAD2
22C0
BIT 7, C
22C2
JR
Z, #22D3, BREAD3
;uloû si registry
;zavolej rutinu ËtenÌ/z·pis/formatov·nÌ
;byla nÏjak· chyba??
;ne → skoË
;budeme testovat z·kladnÌ chyby?
;ne → skoË
;byla vloûena diskety v mechanice?
;ano → skoË
Komentovan˝ v˝pis MDOSu
133
V mechanice nebyla disketa.
22C4 BREA71
LD A, #36
22C6 BREA72
LD DE, #03AF SYSMSG
22C9 BREAD6
CALL #21BF, KEYMSG
22CC
JR
C, #22E1, BREAD4
22CE
LD A, #29
22D0
JP
#0204, ERRR
;REPORT n ÑDrive is not readyì a dotaz Ñ(Retry = R)ì
;do DE adresa systÈmov˝ch hl·öenÌ
;tiskni hl·öenÌ a Ëekej na stisk kl·vesy
;bylo stisknuto P nebo R → skoË na opakov·nÌ operace
;REPORT a ÑDevice I/O errorì
;piö hl·öenÌ a skoË do ZX ROM
Otestujeme chyby
22D3 BREAD3
22D4
22D6
;dej v˝sledek operace do A
;nastaven sign·l SEEK error, CRC error nebo RNF?
;ano → skoË
p¯i operaci.
LD A, C
AND #18
JR
NZ, #22DD, BREA31
Technick· chyba ¯adiËe nebo mechaniky.
22D8 ERR45
LD A, #3B
22DA
JP
#0204, ERRR
;REPORT s ÑInternal errorì
;piö hl·öenÌ a skoË do ZX ROM
Tiskni chybu p¯i hled·nÌ stopy nebo sektoru a Ëekej na stisk kl·vesy pro opakov·nÌ operace.
22DD BREA31
LD A, #37
;REPORT o ÑSeek errorì
22DF
JR
#22C6, BREA72
;skoË na tisk hl·öenÌ s volbou
Bylo stisknuto R nebo P,
22E1 BREAD4
POP
22E2
POP
22E3
POP
22E4
POP
22E5
JR
proto obnovÌme registry a opakujeme operaci.
HL
;obnov si registry
DE
AF
BC
#22B2, BRWL0
;zkus to znovu
Tudy se jde, pokud byla operace v po¯·dku.
22E7 BREAD1
POP HL
22E8
POP DE
22E9
POP AF
22EA
LD BC, #0200
22ED
ADD HL, BC
22EE
POP BC
22EF
PUSH AF
22F0
INC C
22F1
LD A, (IX+#03)
22F4
CP
C
22F5
JR
NZ, #22FA, BREA11
22F7
LD C, #00
22F9
INC B
22FA BREA11
POP AF
22FB
DEC D
22FC
JP
NZ, #22B2, BRWL0
22FF
RET
2300 BREAD2
DEC B
2301
JR
NZ, #231C, BREAD7
Budeme testovat chyby p¯i ËtenÌ sektoru.
2303
LD A, C
134
;obnov si registry
;zvyö adresu dat o 512
;a p¯itom staËilo jen INC H, INC H
;obnov ËÌslo stopy a sektoru
;schovej si ËÌslo drivu
;posuÚ se na dalöÌ sektor
;do A poËet sektor˘ na stopu
;jsi na konci stopy?
;ne → skoË
;do C dej nult˝ sektor
;a posuÚ se na dalöÌ stopu
;obnov ËÌslo drivu
;naËteny vöechny sektory?
;ne → opakuj
;vraù se
;testov·nÌ chyb p¯Ìkazu READ SECTOR?
;ne → skoË d·l
;dej v˝sledek operace do A
Komentovan˝ v˝pis MDOSu
2304
2306
2308 BREA81
230A
230C
230E
2310
2312
2314 BREAD8
2316
2318
231A
231C BREAD7
231D
AND
JR
BIT
JR
BIT
JR
LD
JR
BIT
JR
LD
JR
DEC
JR
#9D
Z, #22E7, BREAD1
7, C
NZ, #22C4, BREA71
4, C
Z, #2314, BREAD8
A, #38
#22C6, BREA72
3, C
Z, #22D8, ERR45
A, #39
#22C6, BREA72
B
NZ, #232A, BREAD9
Budeme testovat chyby p¯i z·pisu sektoru.
231F
LD A, C
2320
AND #DD
Tady chybÌ
2322
2324
JR
BIT
JR
;byla nÏjak· chyba p¯i operaci READ SECTOR?
;ne → skoË
;testuj, jestli byla vloûena disketa
;ano → skoË
;byl nalezen sektor?
;ano → skoË
;REPORT p ÑSector not foundì
;skoË na tisk hl·öenÌ s volbou
;byl CRC error?
;ne → skoË
;REPORT q ÑCRC errorì
;skoË na tisk hl·öenÌ s volbou
;testov·nÌ chyb p¯i p¯Ìkazu WRITE SECTOR?
;ne → skoË d·l
;dej v˝sledek operace do A
;byla nÏjak· chyba p¯i operaci WRITE SECTOR?
Z, BREAD1. Nem· to vöak û·dn˝ vliv na pr·ci.
6, C
;byla disketa chr·nÏna proti z·pisu?
Z, #2308, BREA81
;ne → skoË
A toto je asi nejz·ke¯nÏjöi chyba, kter· se zde vyskytuje (je snad jeötÏ horöÌ, neû v p¯Ìkazu MOVE). Pokud totiû
m·te v mechanice disketu, kter· je chr·nÏn· proti z·pisu, a budete si chtÌt nÏco uloûit, systÈm v·m hl·sÌ, ûe
v mechanice je disketa chr·nÏn· proti z·pisu, a Ëek· na stisk kl·vesy R nebo P. Pokud nynÌ disketu vymÏnÌte
a stisknete kl·vesu R nebo P, stane se nÏco velice nep¯ÌjemnÈho. Dojde totiû k p¯eps·nÌ sektoru adres·¯e. V buferu je
totiû uloûen cel˝ sektor a kdyû vy vymÏnÌte disketu, zapÌöe se tento sektor. Takûe mÌsto soubor˘, kterÈ byly na novÈ
disketÏ, se v·m p¯i v˝pisu objevÌ soubory ze zalepenÈ diskety. NabÌdka volby s n·vratem je zde proto, aby byla
moûnost disketu zbavit ochrany. Uûivatel si to musÌ pamatovat.
2326
LD A, #3A
;REPORT r ÑDisk is write protectedì
2328
JR
#22C6, BREA72
;skoË na tisk hl·öenÌ s volbou
Spr·vnÏ mÏlo b˝t
JP #0204, ERRR.
Tady se testujÌ chyby, ke kter˝m doölo p¯i FIND TRACK a jsou zp˘sobeny hardwarovou chybou p¯i komunikaci
mezi ¯adiËem a mechanikou.
232A BREAD9
BIT 0, C
;nedoölo k chybÏ v komunikaci s mechanikou?
232C
JR
Z, #2333, BREA91
;ne → skoË
232E
LD A, #22
;REPORT Z ÑDevice unavailableì
2330
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
2333 BREA91
BIT 1, C
;je disketa v˘bec form·tov·na pod MDOSem (512 byt˘
;na sektor)?
2335
JR
Z, #22D8, ERR45
;ano → skoË
2337 BADTYP
LD A, #20
;REPORT X ÑBad device typeì
2339
JP
#0204, ERRR
;piö hl·öenÌ a skoË do ZX ROM
Toto je zapomenut˝ kÛd.
233C
OR #01
233E
EI
233F
RET
Komentovan˝ v˝pis MDOSu
135
SEEK
NastavÌ hlavu na stopu.
IN:
A ËÌslo stopy
D p¯Ìkaz SEEK
IX adresa parametr˘ drivu
OUT: nastavÌ hlavu na poûadovanou stopu
A v˝sledek operace
2340 SEEK
2342
2343
2345
2348
2349
OUT (#87), A
AND A
JR
Z, #234B, HOME
CALL #25C7, DELAY
LD A, D
JR
#234D, TRACKSEEK
;poöli ËÌslo stopy do registru ¯adiËe
;je to stopa 0?
;ano → skoË na povel RESTORE
;Ëasov· prodleva
;vezmi p¯Ìkaz pro ¯adiË z D
;proveÔ p¯Ìkaz
HOME
Poöle hlavu disku na stopu 0.
IN:
IX adresa parametr˘ drivu
OUT: hlava je vystavena na stopu 0
A v˝sledek operace
234B HOME
LD
A, #08
;do A p¯Ìkaz RESTORE (vystav hlavu na stopu 0)
Provedme vystavenÌ hlavy.
234D TRACKSEEK LD B, A
234E
LD A, (IX+#01)
2351
AND #C0
2353
RLCA
2354
RLCA
2355
OR B
2356
OUT (#81), A
2358
CALL #25C7, DELAY
;dej p¯Ìkaz do B
;vezmi parametr diskety
;ponech rychlost krokov·nÌ
;a posuÚ je do 0. a 1. bitu
;p¯idej p¯Ìkaz pro ¯adiË
;vyöli p¯Ìkaz do ¯adiËe
;Ëasov· prodleva
NynÌ budeme Ëekat na ukonËenÌ operace.
235B WAITBUSY
IN
A, (#81)
;Ëti status
235D
BIT 0, A
;je konec operace?
235F
JR
NZ, #235B, WAITBUSY ;ne → Ëekej
A jeötÏ chvilku poËk·me.
2361
LD
2364 WAITHOME DJNZ
2366
DEC
2367
JR
2369
RET
BC, #000F
;Ëasov· prodleva po skonËenÌ BUSY
#2364, WAITHOME
;opakuj B-kr·t
C
;sniû C
NZ, #2364, WAITHOME;a jeötÏ C-kr·t
;vraù se
DREAD
NaËte jeden sektor z diskety.
IN:
B ËÌslo stopy
C ËÌslo sektoru
E poËet opakov·nÌ p¯i chybÏ
HL adresa uloûenÌ dat
OUT: C v˝sledek operace
136
Komentovan˝ v˝pis MDOSu
B hodnota 2
naËte sektor do pamÏti
236A DREAD
236D
236F
2371
CALL #2493, FINDTRACK
JR
NC, #23BA, DOOPRET
LD A, #88
LD B, #02
2373
LD
IX, #25EA, REANMI
;najdi stopu
;nenalezena → skoË
;do A p¯Ìkaz READ SECTOR
;do B p¯Ìznak pro testov·nÌ v˝sledn˝ch bit˘ p¯Ìkazu
;READ SECTOR
;do IX adresa programu pro ËtenÌ dat
DOWDCOM
Rutina pro vykon·nÌ povelu ¯adiËe WD2797.
IN:
A povel pro WD2797
B 02 ñ READ SECTOR
03 ñ WRITE SECTOR
E poËet opakov·nÌ p¯i chybÏ
HL adresa uloûenÌ dat
IX pouûit· rutina
#25EA INI+RET
#25ED OUTI+RET
Nejd¯Ìve nastavÌme podmÌnky p¯enosu a stranu diskety.
2377 DOWDCOM PUSH AF
;uloû si povel
2378
LD A, (#3EE9) SELSTA1
;do A bity v˝bÏru a rozbÏhnutÌ mechaniky
237B
SET 6, A
;povol NMI
237D
CALL #25BC, OUTTODR
;nastav podmÌnky NMI
2380
POP AF
;vyzvedni p¯Ìkaz pro ¯adiË
2381
PUSH HL
;schovej adresu buferu dat
2382
LD HL, #3EEB SVSIDE
;do HL adr. uloûenÌ informace o pouûÌvanÈ stranÏ diskety
2385
OR (HL)
;vloû tuto informaci do povelu
2386
POP HL
;vyzvedni adresu buferu dat
Provedeme p¯Ìkaz.
2387 DOWDCREP PUSH AF
2388
PUSH HL
2389
PUSH DE
238A
PUSH BC
238B
LD C, #87
238D
LD D, #01
238F
LD B, C
2390
OUT (#81), A
;nastav C na datov˝ registr ¯adiËe
;do D maska pro sign·l BUSY
;dej do B nenulovou hodnotu
;vyöli povel do ¯adiËe
NynÌ budeme Ëekat na zah·jenÌ operace.
2392 DOWDL1
IN
A, (#81)
2394
LD B, C
2395
AND D
2396
JR
Z, #2392, DOWDL1
;Ëti status operace
;dej do B nenulovou hodnotu
;zaËala probÌhat operace?
;ne → Ëekej na zah·jenÌ operace
;uloû si registry
NynÌ je zah·jen provoz smyËky, kter· Ëek· na konec operace. BÏhem jejÌho provozu doch·zÌ k poûadavku DRQ,
kter˝ vyvol· NMI a samotn· operace p¯Ìstupu na disk je provedena na adrese (IX). Po ukonËenÌ operace se ¯ÌzenÌ
vr·tÌ opÏt sem.
2398 DOWDL2
IN
A, (#81)
;Ëti status operace
239A
LD B, C
;dej do B nenulovou hodnotu
Komentovan˝ v˝pis MDOSu
137
239B
239C
AND D
JR
NZ, #2398, DOWDL2
;probÌh· operace?
;ano → Ëekej na konec operace
Operace je u konce, zruöÌme poûadavek NMI a otestujeme chybu CRC.
239E
LD A, (#3EE9) SELSTA1
;do A stav NMI a mechanik
23A1
RES 6, A
;nuluj poûadavek NMI
23A3
CALL #25BC, OUTTODR
;a odeöli ho ¯adiËi, mechaniky se nezastavÌ
23A6
IN
A, (#81)
;Ëti v˝sledek operace
23A8
POP BC
;obnov registry
23A9
POP DE
23AA
POP HL
23AB
LD D, A
;uloû v˝sledek do A
23AC
IN
A, (#85)
;naËti ËÌslo sektoru z registu ¯adiËe do A
23AE
DEC A
;sniû o jeden (posuneme se zpÏt na dan˝ sektor)
23AF
OUT (#85), A
;a odeöli ho zpÏt do registru ¯adiËe
23B1
POP AF
;obnov AF
23B2
BIT 3, D
;byla chyba CRC?
23B4
JR
Z, #23B9, DONOCRC ;ne → skoË
23B6
DEC E
;sniû poËet opakov·nÌ
23B7
JR
NZ, #2387, DOWDCREP;dalöÌ pokus? ano → skoË
Operace je u konce.
23B9 DONOCRC
LD C, D
23BA DOOPRET
CALL #2520, DISKRET
23BD
RET
;p¯edej status do C
;uveÔ do p˘vodnÌho stavu NMI a IX
;vraù se
DWRITE
ZapÌöe jeden sektor na disketu.
IN:
B ËÌslo stopy
C ËÌslo sektoru
E poËet opakov·nÌ p¯i chybÏ
HL adresa uloûenÌ dat
OUT: C v˝sledek operace
B hodnota 3
zapÌöe sektor na disketu
23BE DWRITE
23C1
23C3
23C7
CALL #2493, FINDTRACK
JR
NC, #23B9, DONOCRC
BIT 5, (IX+#01)
JR
Z, #23CE, DWRITE1
Nelze tedy zapsat na takovouto disketu.
23C9 ERR40IN80
LD BC, #0402
23CC
23CE DWRITE1
23D2
23D4
23D6
JR
LD
LD
LD
JR
#23BA, DOOPRET
IX, #25ED, WRINMI
A, #A8
B, #03
#2377, DOWDCOM
;nastav hlavu na stopu v B
;nenalezena → skoË
;otestuj, jestli je 40-ti stop· disketa v 80-ti stopÈ mechanice
;ne → skoË
;do B chyba p¯i FINDTRACK a do C p¯Ìznak chyby
;ÑInternal errorì
;skoË na nastavenÌ NMI, IX a vraù se zpÏt
;do IX adresa programu pro z·pis dat
;do A p¯Ìkaz WRITE SECTOR
;budou se testovat v˝slednÈ bity p¯Ìkazu WRITE SECTOR
;skoË na vykon·nÌ p¯Ìkazu
DFORMA
Vytvo¯Ì obraz stopy ve VIDEORAM a form·tuje stopu disku.
138
Komentovan˝ v˝pis MDOSu
IN:
B ËÌslo stopy
E poËet opakov·nÌ p¯i chybÏ
OUT: C v˝sledek operace
B hodnota 3
naform·tuje stopu
23D8 DFORMA
CALL #2518, FORFINDTR
23DB
JR
NC, #23BA, DOOPRET
23DD
BIT 5, (IX+#01)
23E1
JR
NZ, #23C9, ERR40IN80
Nelze tedy ani form·tovat takovouto disketu.
NastavÌme stejnou
23E3
23E4
23E7
23EA
23EC
23ED
23EE
23EF
23F0
23F1
23F4 FSECOLOR
23F5
23F6
23F8
23F9
barvu podkladu a inkoustu v atributech.
PUSH BC
;uloû si ËÌslo stopy
LD HL, #5800
;do HL adresa zaË·tku atribut˘ obrazovky
LD A, (#5C8D) ATTR_P
;vezmi platn˝ atribut do A
AND #38
;vyber PAPER
LD B, A
;schovej si ho do B
RRCA
;posuÚ na INK
RRCA
RRCA
OR B
;a p¯idej PAPER ñ PAPER=INK
LD BC, #0003
;cel· obrazovka
LD (HL), A
;zmÏÚ atribut
INC HL
;posuÚ se na dalöÌ
DJNZ #23F4, FSECOLOR
;opakuj B-kr·t
DEC C
;snÌû poËÌtadlo t¯etin
JR
NZ, #23F4, FSECOLOR ;nebyly vöechny → skoË
NynÌ ve VIDEORAM vytvo¯Ìme obraz stopy.
23FB
LD HL, #4000
23FE
2400
;nastav hlavu na stopu v B
;nenalezena → skoË
;otestuj, jestli je 40-ti stop· disketa v 80-ti stopÈ mechanice
;ano → skoË
IN
A, (#83)
OUT (#FE), A
;do HL adresa buferu pro vytvo¯enÌ obrazu stopy
;je pouûit bufer obrazovky
;naËti do A ËÌslo stopy z registru ¯adiËe
;nastav BORDER podle ËÌsla stopy
sudÈ stopy majÌ fyzickÈ po¯adÌ sektor˘ 1-2-3-4-5-6-7-8-9
lichÈ stopy majÌ fyzickÈ po¯adÌ sektor˘ 5-6-7-8-9-1-2-3-4
2402
AND #01
;vyber 1. bit ËÌsla stopy
2404
RLCA
;vyn·sob pÏti
2405
RLCA
;A◊4
2406
INC A
2407
LD E, A
;poË·teËnÌ ËÌslo sektoru do E
2408
LD D, #00
;nuluj ËÌtaË sektor˘ na stopÏ
P¯Ìprava dat pro form·tov·nÌ stopy.
240A MKFDATA
LD A, #4E
240C
LD B, #0A
;˙vodnÌ mezera na stopÏ
;deset byt˘
⁄vodnÌ mezera p¯ed prvnÌm sektorem je dost mal·,
240E
CALL #248E, FILLCONST
2411
LD A, #00
2413
LD B, #0C
takûe m˘ûe dojÌt k tomu, ûe nenaËtete prvnÌ sektor na stopÏ.
;uloû do dat
;volnÈ mÌsto
;12 byt˘
Komentovan˝ v˝pis MDOSu
139
2415
2418
241A
241C
241F
2421
2422
2423
2425
2426
CALL #248E, FILLCONST
LD A, #F5
LD B, #03
CALL #248E, FILLCONST
LD A, #FE
LD (HL), A
INC HL
IN
A, (#83)
LD (HL), A
INC HL
;uloû do dat
;p¯Ìznak ñ zapisuje 0A1
;t¯i byty
;uloû do dat
;adresov· znaËka ID pole
;uloû do dat
;a posuÚ se na dalöÌ
;naËti do A ËÌslo stopy z registru ¯adiËe
;uloû do dat
;a posuÚ se na dalöÌ
NynÌ se do ID pole zapisuje ËÌslo strany. Na prvnÌ phled se to zd· v po¯·dku (MDOS pracuje norm·lnÏ). Ale
pokud budete chtÌt takto naform·tovanou disketu ËÌst na poËÌtaËi PC (Personal Computer), tak to nep˘jde. Abych to
up¯esnil, tak nep˘jde p¯eËÌst 2. strana diskety. U 1. strany to nenÌ problÈm, protoûe se zde ukl·d· 0, ale pro 2. stranu
se zde ukl·d· 2. MDOSu to nevadÌ, protoûe neprov·dÌ kontrolu strany, ale MS-DOS ji prov·dÌ a pro nÏj je tato
hodnota nep¯Ìpustn· (spr·vnÏ by tam mÏla b˝t 1). Takûe pokud budete chtÌt diskety D40 pouûÌvat na PC, musÌte si
napsat vlastnÌ form·tovacÌ rutinu, kter· uû bude upraven·.
2427
LD A, (#3EEB) SVSIDE
;vyzvedni ËÌslo strany
242A
LD (HL), A
;uloû do dat
242B
INC HL
;a posuÚ se na dalöÌ
242C
LD A, E
;do A ËÌslo sektoru
242D
LD (HL), A
;uloû do dat
242E
INC HL
;a posuÚ se na dalöÌ
242F
LD A, #02
;˙daj dÈlky sektoru (512 byt˘)
2431
LD (HL), A
;uloû do dat
2432
INC HL
;a posuÚ se na dalöÌ
2433
LD A, #F7
;p¯Ìznak pro vyvol·nÌ uloûenÌ CRC pro ID pole
2435
LD (HL), A
;uloû do dat
2436
INC HL
;a posuÚ se na dalöÌ
2437
LD A, #4E
;byty oddÏlujÌcÌ hlaviËku sektoru od dat
2439
LD B, #16
;22 byt˘
243B
CALL #248E, FILLCONST
;uloû do dat
243E
LD A, #00
;volnÈ mÌsto
2440
LD B, #0C
;12 byt˘
2442
CALL #248E, FILLCONST
;uloû do dat
2445
LD A, #F5
;p¯Ìznak zapisov·nÌ 0A1
2447
LD B, #03
;t¯i byty
2449
CALL #248E, FILLCONST
;uloû do dat
244C
LD A, #FB
;adresov· znaËka pole dat
244E
LD (HL), A
;uloû do dat
244F
INC HL
;a posuÚ se na dalöÌ
2450
LD A, #E5
;mÌsto pro uloûenÌ dat
2452
LD B, #00
;512 byt˘
2454
CALL #248E, FILLCONST
;uloû 256 do dat
2457
CALL #248E, FILLCONST
;uloû 256 do dat
245A
LD A, #F7
;vyvol· uloûenÌ CRC pro data
245C
LD (HL), A
;uloû do dat
245D
INC HL
;a posuÚ se na dalöÌ
245E
LD A, #4E
;mezera mezi sektory
2460
LD B, #28
;40 byt˘
2462
CALL #248E, FILLCONST
;uloû do dat
2465
LD A, E
;dej ËÌslo sektoru do A
140
Komentovan˝ v˝pis MDOSu
2466
2467
246A
246C
246E MAKENEXT
246F
2470
2473
2475
2477
2479
247C
247F
2480
2483
2487
2489
INC E
CP
(IX+#03)
JR
C, #246E, MAKENEXT
LD E, #01
INC D
LD A, D
CP
(IX+#03)
JR
NZ, #240A, MKFDATA
LD A, #4E
LD B, #00
CALL #248E, FILLCONST
CALL #248E, FILLCONST
POP BC
LD HL, #4000
LD IX, #25ED, WRINMI
LD A, #F0
LD B, #03
248B
JP
#2377, DOWDCOM
;zvyö ËÌslo sektoru
;je vÏtöÌ, neû poËet sektor˘ na stopu?
;ne → skoË
;nastav ËÌslo sektoru na 1
;zvyö ËÌtaË sektor˘
;dej ËÌtaË do A
;uû byly vytvo¯eny ID pole pro vöechny sektory?
;ne → p¯iprav ID pro dalöÌ sektor
;do konce stopy vyplnÌme hodnotou
;celkem 512 byt˘
;uloû 256 byt˘
;uloû 256 byt˘
;obnov ËÌslo stopy a sektoru
;do HL adresa zaË·tku dat pro form·tov·nÌ
;do IX adresa programu pro z·pis dat
;do A p¯Ìkaz WRITE TRACK
;budou se testovat v˝slednÈ bity p¯Ìkazu WRITE
;SECTOR ñ pokud si ¯Ìk·te, ze spÌöe WRITE TRACK,
;tak je to jedno, protoûe majÌ vcelku stejnÈ p¯Ìznaky
;(WRITE TRACK m· o dva mÌÚ, ale ty jsou vûdy
;nastaveny na nulu)
;skoË na vykon·nÌ p¯Ìkazu
FILLCONST
Rutina pro naplnÏni ˙seku pamÏti od HL dlouhÈho B byt˘ konstantou v A.
IN:
HL adresa, odkud se bude vyplÚovat
B poËet byt˘
A hodnota, kterou se bude vyplÚovat
OUT: B byt˘ je od HL vyplnÏno hodnotou v A
248E FILLCONST
248F
2490
2492
LD (HL), A
INC HL
DJNZ #248E, FILLCONST
RET
;uloû A na adresu v HL
;posuÚ se na dalöÌ byte
;opakuj B-kr·t
;vraù se
FINDTRACK
Najede hlavou na stopu a nastavÌ do registru ¯adiËe ËÌslo sektoru.
IN:
B ËÌslo stopy
C ËÌslo sektoru
OUT: BC v˝sledek operace
C stopa nalezena
NC stopa nenalezena
2493 FINDTRACK
2494
2495
2496
2498 FINDTRACK1
249B
249E
24A2
PUSH HL
PUSH DE
PUSH BC
LD D, #1C
LD A, (#3E6B) WORKDR
CALL #254B, DRVSEL
BIT 0, (IX+#00)
LD BC, #0401
;uloû si registry
;p¯Ìkaz SEEK s testem ËÌsla stopy a s p¯iloûenou hlavou
;do A dej drive, se kter˝m se pracuje
;spusù mechaniku a nastav hlavu na stopu podle (IX+#04)
;otestuj, jestli je drive p¯ipojen
;do B chyba p¯i FINDTRACK a do C chyba ÑDevice
;unavailableì
Komentovan˝ v˝pis MDOSu
141
24A5
24A7
24AA
24AD
24B0
24B2
JR
Z, #24B5, FINDTRRET
LD HL, #0000
LD A, (#3E6B) WORKDR
CALL #256D, TESTDR
JR
NZ, #24B9, FINDTRRD
LD BC, #0180
Tady chybÌ
24B5 FINDTRRET
24B6
24B7
24B8
LD (#3EE7), IX.
POP HL
POP HL
POP HL
RET
NastavÌme hlavu na stopu.
24B9 FINDTRRD
POP BC
24BA
INC C
24BB
LD A, C
24BC
OUT (#85), A
24BE
XOR A
24BF
BIT 4, (IX+#01)
24C3
JR
Z, #24C9 , FINDTRSVS
24C5
RR
B
24C7
RLA
24C8
RLCA
24C9 FINDTRSVS LD (#3EEB), A SVSIDE
;nenÌ → skoË na n·vrat s chybou
;do HL dej nulu
;do A drive, se kter˝m se pracuje
;otestuj p¯ipravenost drivu
;je p¯ipraven? ano → skoË
;do B p¯iznak pro z·kladnÌ test a do C chyba ÑDrive is
;not readyì
;vyzvedni hodnoty ze z·sobnÌku
;vraù se
;obnov ËÌslo stopy a sektoru
;zvyö ËÌslo sektoru (ËÌslujÌ se od 1)
;dej ËÌslo sektoru do A
;a poöli je registru ¯adiËi
;nuluj A
;je disketa jednostrann·?
;ano → skoË
;vydÏl B dvÏma a vem poslednÌ bit z B (lichÈ sektory
;jsou na 2 stranÏ, sudÈ na 1 stranÏ) a dej ho do A
;na 1. bit
;uloû si, se kterou stranou se bude pracovat (0=1. strana,
;2=2. strana)
Protoûe v 80-ti stopÈ mechanice je 80-ti stop· diskety (nebo ve 40-ti stopÈ mechanice je 40-ti stop· disketa),
nastavÌme zpÏt ËÌslo stopy v registru na p˘vodnÌ stav, potoûe nedojde k û·dn˝m komplikacÌm p¯i vystavov·nÌ hlavy na
stopu (nemusÌ se dÏlat dvojn·sobn˝ posun hlavy), a takÈ se prov·dÌ testov·nÌ vyhledanÈ stopy. Pokud by byla 40-ti
stop· disketa v 80-ti stopÈ mechanice, musÌ se zvolit dvojn·sobn˝ posun hlavy (hlava se posune o dvojn·sobnou
vzd·lenost, protoûe to je 40-ti stop· disketa a ne 80-ti stop·) a neprov·dÌ se test vyhledanÈ stopy.
24CC
BIT 5, (IX+#01)
;testuj, jestli je 40-ti stop· disketa v 80-ti stopÈ mechanice
24D0
JR
Z, #24DB, NOD40IN80 ;ne → skoË
MusÌme upravit obsah registru stopy a p¯Ìkaz pro ¯adiË.
24D2
LD D, #18
;do D p¯Ìkaz SEEK s p¯iloûenou hlavou bez testu stopy
24D4
SLA B
;vraù do p˘vodnÌho stavu ËÌslo stopy, protoûe se bude
;prov·dÏt dvojn·sobn˝ posun hlavy
24D6
IN
A, (#83)
;naËti ËÌslo stopy, na kterÈ se nach·zÌ hlava
24D8
ADD A, A
;vyn·sob dvÏma, aby to bylo v p˘vodnÌm stavu
24D9
OUT (#83), A
;a poöli ËÌslo stopy zpÏt do registru ¯adiËe
NynÌ otestujeme, jestli p¯i poslednÌ operaci nedoölo k chybÏ nebo nebyly zastaveny mechaniky.
24DB NOD40IN80 BIT 7, (IX+#00)
;otestuj, jestli byla p¯i poslednÌ operaci chyba nebo byly
;zastaveny mechaniky
24DF
JR
Z, #24E6, FNDTRNOC ;ano → skoË
Pokud nebyla chyba nebo zastaveny mechaniky, porovn·me, jestli hlava nenÌ uû na poûadovanÈ stopÏ.
24E1
IN
A, (#83)
;p¯eËti ËÌslo stopy z registru ¯adiËe
24E3
CP
B
;jsou shodnÈ se stopu, kam chci vystavit hlavu?
142
Komentovan˝ v˝pis MDOSu
24E4
JR
Z, #2504, FINDTROK
MusÌme vystavit hlavu.
24E6 FNDTRNOC LD A, B
24E7
LD E, A
24E8
CALL #2340, SEEK
24EB
AND #98
24ED
JR
Z, #2504, FINDTROK
24EF
CALL #234B, HOME
24F2
LD A, E
24F3
CALL #2340, SEEK
24F6
LD C, A
24F7
AND #98
24F9
JR
Z, #2504, FINDTROK
24FB
RES 7, (IX+#00)
Tady chybÌ
24FF
2500
2501
2503
2504 FINDTROK
LD
POP
POP
LD
RET
BIT
2508
JR
(#3EE7), IX.
DE
HL
B, #01
;ano → skoË
;do A ËÌslo stopy, kam chci vystavit hlavu
;uloû si do E ËÌslo stopy
;nastav hlavu na stopu
;byla chyba p¯i vystavov·nÌ hlavy?
;ne → skoË
;poöli hlavu na nultou stopu
;do A obnov ËÌslo stopy
;zkus znovu nastavit hlavu stopu
;dej p¯Ìznaky chyb do C
;byla chyba p¯i vystavov·nÌ hlavy?
;ne → skoË
;nastav p¯Ìznak neporovn·vat ËÌslo stopy s registrem
;¯adiËe (p¯i operaci doölo k chybÏ)
;obnov registry
;do B p¯Ìznak pro z·kladnÌ testov·nÌ chyb
;vraù se
5, (IX+#01)
;otestuj, jestli nenÌ 40-ti stop· disketa v 80-ti stopÈ
;mechanice
Z, #250F, NOD40IN801 ;ne → skoË
VydÏlÌme obsah registru ¯adiËe dvÏma, aby p¯i dalöÌm vystavov·nÌ hlavy nedoölo k öpatnÈmu vystavenÌ.
250A
IN
A, (#83)
;naËti ËÌslo stopy z registru ¯adiËe
250C
RRCA
;vydÏl ËÌslo stopy dvÏma
250D
OUT (#83), A
;a vyöli ho zpÏt do registru ¯adiËe
250F NOD40IN801 DI
;zakaû p¯eruöenÌ
2510
LD (#3EE7), IX DOSIX2
;uloû si adresu parametr˘ disku do SRAM
2514
POP DE
;obnov registry
2515
POP HL
2516
SCF
;nastav C
2517
RET
;vraù se
FORFINDTR
Tento vstupnÌ bod na nastavenÌ hlavy na stopu v registru B se pouûÌv· p¯i form·tov·nÌ, protoûe se v˘bec netestuje
stopa (ani to nejde, protoûe u novÈ diskety ûadnÈ stopy jeötÏ nejsou).
IN:
B ËÌslo stopy
OUT: BC v˝sledek operace
C stopa nalezena
NC stopa nenalezena
2518 FORFINDTR
2519
251A
251B
251D
PUSH HL
PUSH DE
PUSH BC
LD D, #18
JP
#2498, FINDTRACK1
;uloû si registry
;do D p¯Ìkaz SEEK s p¯iloûenou hlavou bez testu stopy
;pokraËuj v hled·nÌ stopy
DISKRET
N·vrat z operacÌ READ, WRITE SECTOR a FORMAT TRACK.
Komentovan˝ v˝pis MDOSu
143
2520 DISKRET
2524
2526
2529
252A
252D
252E
252F
2530
2531
2535
LD
IN
LD
XOR
LD
EI
LD
AND
RET
RES
RET
IX, (#3EE7) DOSIX2
A, (#83)
(IX+#04), A
A
(#3EE2), A INTCNT
A, C
A
Z
7, (IX+#00)
;vyzvedni si adresu parametr˘ disku
;naËti ËÌslo stopy z registru ¯adiËe
;uloû na (IX+#04) jako ËÌslo stopy, kde se nach·zÌ hlava
;nuluj poËet pr˘chod˘ p¯i NMI
;povol p¯eruöenÌ
;do A status
;byla chyba?
;ne → vraù se zpÏt
;nastav p¯Ìznak neporovn·vat ËÌslo stopy s registrem
;¯adiËe (p¯i operaci doölo k chybÏ) a vraù se
DSKSTP
Vypne vöechny mechaniky.
IN:
ñ
OUT: zastavÌ vöechny mechaniky
2536 DSKSTP
2537
253A
253D
XOR A
CALL #25BC, OUTTODR
CALL #21AC, DRVCMP
RES 7, (IX+#00)
2541
2543
2546
254A
LD A, #01
CALL #21AC, DRVCMP
RES 7, (IX+#00)
RET
;do A nula pro zastavenÌ mechanik
;vypni mechaniky
;zjisti adresu parametr˘ disku A
;nastav p¯Ìznak neporovn·vat ËÌslo stopy s registrem
;¯adiËe (mechaniky jsou zastaveny)
;nynÌ mechanika B:
;zjisti adresu parametr˘ disku B
;nastav p¯Ìznak neporovn·vat ËÌslo stopy s registrem
;¯adiËem (mechaniky jsou zastaveny) a vraù se
DRVSEL
RozbÏhne mechaniku a nastavÌ stopu podle (IX+#04).
IN:
A ËÌslo mechaniky
OUT: roztoËÌ mechaniku a nastavÌ registr ¯adiËe na stopu, kde byla naposledy
vystavena hlava
IX adresa parametr˘ drivu
254B DRVSEL
254C
254D
254E
2551
2555
2557
2559
255A DRVSELOUT
255B
255E
2560
2561
2564
2567
2569
256A
256B
144
PUSH AF
;uloû registry
PUSH BC
PUSH HL
CALL #21AC, DRVCMP
;zjisti adresu systÈmov˝ch parametr˘ drivu v A
BIT 2, (IX+#01)
;test mechaniky (Añ0, Bñ1)
LD A, #05
;DSñ0, MOñ0 je mechanika A:
JR
Z, #255A, DRVSELOUT ;je to A? ano → skoË
RLCA
;posuÚ pro mechaniku B: DSñ1, MOñ1
LD C, A
;uschovej si A do C
LD A, (#3EE9) SELSTA1
;do A stav NMI a bity v˝bÏru mechaniky
AND #FC
;ponech bity
OR C
;p¯idej nov˝ v˝bÏr mechaniky
CALL #25BC, OUTTODR
;zapni vybranou mechaniku
LD A, (IX+#04)
;do A ËÌslo stopy, na kterÈ se teÔ nach·zÌ hlava
OUT (#83), A
;poöli ËÌslo stopy do registru ¯adiËe
POP HL
;obnov registry
POP BC
POP AF
Komentovan˝ v˝pis MDOSu
256C
RET
;vraù se
TESTDR
Otestuje, jestli je mechaniky p¯ipravena.
IN:
IX adresa parametr˘ drivu
OUT: Z nenÌ p¯ipravena
NZ je p¯ipravena
256D TESTDR
256E
2572
2573
2574
2575
EI
BIT 7, (IX+#00)
RET NZ
PUSH BC
PUSH HL
CALL #254B, DRVSEL
;musÌme povolit p¯eruöenÌ
;testuj, jestli byla p¯i poslednÌ operaci chyba nebo byly
;mechaniky vypnutÈ, ne → vraù se
;uloû registry
;rozbÏhni mechaniku a nastav stopu podle (IX+#04)
Tady se na chvÌli zastavÌme. Auto¯i vymysleli zajÌmav˝ zp˘sob testov·nÌ p¯ipravenosti drivu. Protoûe nenÌ zapojen
sign·l READY, musÌ se p¯ipravenost testovat programovÏ. ProbÌh· to asi tak, ûe se ¯adiËi vyöle p¯Ìkaz n·silnÈho p¯euöenÌ
operace. Potom se Ëek· na odezvu z ¯adiËe. Doba Ëek·nÌ je 100 cykl˘ p¯eruöenÌ (tedy 2 sekundy). Pokud do tÈ doby
nep¯ijde odezva z ¯adiËe a ËÌtaË pr˘chod˘ p¯eruöenÌm je 0, neukonËÌ se p¯eruöenÌ norm·lnÏ, ale je Ñn·silnÏì ukonËeno
a ¯ÌzenÌ se nevracÌ do ËekacÌ smycky, ale zpÏt do programu s nastaven˝mi p¯Ìznaky.
2578
LD HL, #25B6 INVALRET ;do HL adresu, kam se bude sk·kat, pokud dojde
;k p¯eteËenÌ p¯eruöenÌ p¯i testu drivu
257B
LD (#3EE3), HL TERADR2 ;uloû ji do SRAM
257E
LD A, #64
;poËet p¯eruöenÌ je 100 (2 sekundy)
2580
LD (#3EE2), A INTCNT
;uloû ji do SRAM
2583
CALL #2599, TESTRDR
;testuj p¯ipravenost drive
2586
SET 7, (IX+#00)
;nastav p¯Ìznak porovn·vat ËÌslo stopy s registrem
;¯adiËe (mechanika bÏûÌ a je p¯ipravena)
258A
JR
NZ, #2596, TESTDRRET;pokud je drive p¯ipraven → skoË
258C
CALL #25BC, OUTTODR
;zastav drive
258F
LD (IX+#30), A
;uloû do prvnÌho znaku jmÈna drivu nulu
2592
RES 7, (IX+#00)
;nastav p¯Ìznak neporovn·vat ËÌslo stopy s registrem
;¯adiËe (p¯i poslednÌ operaci s drivem doölo k chybÏ)
2596 TESTDRRET POP HL
;obnov registry
2597
POP BC
2598
RET
;vraù se
»ekacÌ smyËka p¯i
2599 TESTRDR
259B
259D
25A1
25A3 LOOPISDRQ
25A6
25A8 LPNOTDRQ
25AB
25AD
25AF
25B0
25B3
25B4
25B5
testov·nÌ drivu.
LD A, #D0
;do A p¯Ìkaz p¯eruöenÌ Ëinnosti ¯adiËe
OUT (#81), A
;vyöli p¯Ìkaz ¯adiËi
LD (#3EE5), SP HERRSP2 ;uloû si SP pro p¯Ìpadnou obnovu p¯i p¯eteËenÌ p¯eruöenÌ
LD B, #02
;probÏhnou celkem dvÏ smyËky Ëek·ni na odezvy z ¯adiËe
CALL #25C2, TESTDRQ
;testuj DRQ
JR
NZ, #25A3, LOOPISDRQ;je → Ëekej na ukonËenÌ DRQ
CALL #25C2, TESTDRQ
;testuj DRQ
JR
Z, #25A8, LPNOTDRQ ;nenÌ → Ëekej na DRQ
DJNZ #25A3, LOOPISDRQ
;opakuj B-kr·t
XOR A
;do A 0
LD (#3EE2), A INTCNT
;nuluj poËÌtadlo pr˘chod˘ p¯eruöenÌm
DEC A
;nastav sign·l drive je p¯ipraven (NZ)
CCF
;nastav NC
RET
;vraù se
Komentovan˝ v˝pis MDOSu
145
Sem se sk·Ëe, pokud dojde k p¯eteËenÌ p¯eruöenÌ
25B6 INVALRET
LD SP, (#3EE5) HERRSP2 ;obnov SP z SRAM
25BA
XOR A
;nastav sign·l drive nenÌ p¯ipraven (Z)
25BB
RET
;vraù se
OUTTODR
Vyöle v˝bÏr mechaniky a podmÌnky pro NMI.
IN:
A bity v˝bÏru mechaniky a NMI
OUT: je vybr·na mechanika a podmÌnky NMI
25BC OUTTODR
25BE
25C1
OUT (#89), A
LD (#3EE9), A SELSTA1
RET
;vyber mechaniku a nastav podmÌnky NMI
;uloû si aktu·lnÌ stav
;vraù se
TESTDRQ
NaËte hodnotu z ¯adiËe a ponech· pouze informaci o DRQ.
IN:
ñ
OUT: Z nenÌ DRQ
NZ je DRQ
25C2 TESTDRQ
25C4
25C6
IN
A, (#81)
AND #02
RET
;Ëti status
;vyber pouze DRQ
;vraù se
DELAY
SpoûÔovacÌ smyËka pro aktivaci BUSY. SlouûÌ pro
25C7 DELAY
PUSH BC
25C8
LD B, #0A
25CA DELAYLOOP DJNZ #25CA, DELAYLOOP
25CC
POP BC
25CD
RET
Ëek·nÌ mezi jednotliv˝mi p¯Ìkazy a testy.
;uschovej si BC
;Ëek·me 10 smyËek (celkem 163 takt˘)
;opakuj B-kr·t
;obnov BC
;vraù se
Tady se prov·dÌ obsluha p¯eruöenÌ od ULA. Celkem se tady nedÏje nic v·ûnÈho. SlouûÌ k tomu, aby p¯i
povolenÈm p¯eruöenÌ nezamrzl poËÌtaË. D·le se vyuûÌv· p¯i testov·nÌ p¯ipravenosti drivu. Pokud je obsah adresy
NMICNT r˘zn˝ od hodnoty 0, je postupnÏ snÌûen. Pokud je po snÌûenÌ 0 (tzn. ûe doölo k p¯eteËenÌ p¯eruöenÌ),
provede se n·vrat p¯es INVALRET. TÌm se zamezÌ tomu, aby se p¯i testov·nÌ p¯ipravenosti drivu p¯i Ëek·nÌ na
odezvu z ¯adiËe zablokoval systÈm.
25CE INTERRUPT PUSH AF
;uloû si AF
25CF
LD A, (#3EE2) INTCNT
;vyzvedni poËet pr˘chod˘ p¯i NMI
25D2
AND A
;je nula? (neprov·dÌ se testov·nÌ p¯ipravenosti drivu)
25D3
JR
Z, #25E2, OKINTERR ;ano → skoË na nen·siln˝ n·vrat z p¯eruöenÌ
25D5
DEC A
;sniû o 1
25D6
LD (#3EE2), A INTCNT
;a uloû zpÏt
25D9
JR
NZ, #25E2, OKINTERR ;nenÌ teÔ nula → skoË na nen·siln˝ n·vrat z p¯eruöenÌ
NynÌ doölo k p¯eteËenÌ p¯eruöenÌ a tak se sk·Ëe na adresu, kter· je uloûena na #3EE3 (TERADR2).
25DB
LD HL, (#3EE3) TERADR2 ;adresa rutiny pro n·silnÈ p¯eruöenÌ testov·nÌ drivu
25DE
LD A, H
;je tam #0000?
25DF
OR L
25E0
JR
NZ, #25E6, GOINTERR ;ne → proveÔ rutinu
25E2 OKINTERR
POP AF
;obnov AF
146
Komentovan˝ v˝pis MDOSu
Provedeme n·vrat z p¯eruöenÌ.
25E3 ENDINTERR EI
25E4
RETI
Provedeme n·siln˝
25E6 GOINTERR
25E7
25E8
n·vrat
POP
EX
JR
;povol p¯eruöenÌ
;vraù se z p¯eruöenÌ
z p¯euöenÌ. V HL je adresa, kam se bude sk·kat.
AF
;obnov AF
(SP), HL
;adresa rutiny na zasobnÌk a n·vratov· do HL
#25E3, ENDINTERR
;proveÔ rutinu n·silnÈho ukonËenÌ p¯eruöenÌ
REANMI
P¯enos dat z ¯adiËe. Sem se sk·Ëe 512◊ p¯i ËtenÌ dat z diskety.
25EA REANMI
25EC
INI
RET
;naËtenÌ dat z ¯adiËe
;vraù se
WRINMI
P¯enos dat do ¯adiËe. Sem se sk·Ëe 512◊ p¯i z·pisu dat na disketu.
25ED WRINMI
25EF
OUTI
RET
;vysl·nÌ dat do ¯adiËe
;vraù se
Kdo se nezbavÌ PeCe vËas,
ZEMÿE!
©1997 Dron of K3L Team
Uû i klony ZX Spectra
lepöÌ jsou neû Opel Vectra
©1997 someone on IRC
Komentovan˝ v˝pis MDOSu
147
8. SystÈmovÈ promÏnnÈ MDOSu a popis SRAM.
Adr.
3800
3A00
3C00
3E00
3E30
3E60
3E61
3E62
DÈl.
512
512
512
48
48
1
1
1
JmÈno
DIRBUF
AUXBUF
FATBUF
DRPARZN
DRNAMES
DEBUG
SNPCOUNT
AIFASK
3E63
3E64
3E66
3E68
3E69
3E6A
3E6B
3E6C
3E6D
3E6E
3E6F
3E71
3E72
3E74
3E76
3E78
3E7A
3E7C
3E7D
3E7E
1
2
2
1
1
1
1
1
1
1
2
1
2
2
2
2
2
1
1
2
MODJP1
MODJPA2
SAVEDE
VARIA1
VARIA2
VARIA3
WORKDR
CHNGFLAG
FATSC
FATDR
ADRSCTR
ADRDR
SVADRA
STARTADR
LENDAT
VALSYX
VALSYY
HEAD20
NONE1
SVFRSC
3E80 1 0
3E8A 1 0
3E92 ñ
3E93 ñ
3E94 1
3E95 1 0
3E9F 1 0
3EA9 1
3EAA 1 0
3EB4 3 2
3EBF ñ
3EC5 ñ
3ED4 3
3ED7 3
3EDA 8
3EE2 1
3EE3 2
3EE5 2
3EE7 2
148
DNZONE1
FNZONE1
SNONMB1
SNONMB2
EXTE1
DNZONE2
FNZONE2
EXTE2
ACDRIVE
SVHEAD
SVINF
SVFSC
SV24NM
POM24NM
ASCIINM
INTCNT
TERADR2
HERRSP2
DOSIX2
Popis
ñ prostor pro pr·ci s adres·¯em
ñ prostor pro nahr·nÌ poslednÌho sektoru souboru a pro pr·ci s BOOTem
ñ prostor pro pr·ci s FATkou a pro tvorbu BOOTu p¯i form·tov·nÌ
ñ prostor pro uloûenÌ parametr˘ mechanik (12 byt˘ pro 1 mechaniku)
ñ prostor pro uloûenÌ jmen p¯ipojen˝ch driv˘ (10 byt˘ jmÈno + 2 byty n·hodnÈ byty)
ñ pokud je zde uloûena jin· hodnota neû 0, vypisuje MDOS ladÌcÌ tisky
ñ poËÌtadlo snap˘
ñ pokud je zde nenulov· hodnota, tak se MDOS p¯i p¯episov·nÌ starÈho souboru
nebude pt·t na p¯eps·nÌ starÈho
ñ zde se ukl·d· kÛd instrukce JP p¯i operacÌch ËtenÌ/z·pis sektoru a form·tov·nÌ stopy
ñ zde se ukl·d· adresa rutiny
ñ mÌsto pro doËasnÈ uloûenÌ registru DE p¯i vol·nÌ rutiny v ZX ROM
ñ systÈm ji p¯episuje, ale nijak je nevyuûÌv·
ñ systÈm ji p¯episuje, ale nijak je nevyuûÌv·
ñ systÈm ji p¯episuje, ale nijak je nevyuûÌv·
ñ ËÌslo drivu, se kter˝m se pracuje
ñ nula znamen·, ûe sektor FAT ve FATBUF nenÌ t¯eba zapisovat
ñ ËÌslo naËtenÈho sektoru FAT ve FATBUF (0 ñ û·dn˝)
ñ ËÌslo drivu, ze kterÈho byla naposledy Ëtena FAT
ñ uloûenÌ ËÌsla a stopy, odkud byl naposledy Ëten adres·¯ do DIRBUF
ñ ËÌslo drivu, odkud byl naposledy Ëten adres·¯ do DIRBUF
ñ adresa nalezenÈ poloûky adres·¯e v DIRBUF
ñ mÌsto pro adresu zaË·tku bloku dat p¯i LOAD, SAVE bloku dat
ñ mÌsto pro uloûenÌ dÈlky bloku p¯i LOAD, SAVE
ñ pomocn· promÏnn· MDOSu
ñ pomocn· promÏnn· MDOSu
ñ obsah tÈto promÏnnÈ se ukl·d· do hlaviËky souboru na 20. byte
ñ nevyuûito
ñ p¯i LOAD souboru se zde ukl·d· ËÌslo poslednÌho sektoru bloku sektor˘ a po
ukonËenÌ operace je zde ËÌslo poslednÌho sektoru ve stezce souboru
ñ uloûenÌ 1. jmÈna disku pro I/O
ñ uloûenÌ 1. jmÈna souboru, se kter˝m se pracuje
ñ uloûenÌ vyööÌ ËÌslice snapu ve jmÈnu (desÌtky)
ñ uloûenÌ niûöÌ ËÌslice snapu ve jmÈnu (jednotky)
ñ p¯Ìpona souboru ve FNZONE1
ñ uloûenÌ 2. jmÈna disku pro I/O (nap¯. p¯i kopÌrov·nÌ, p¯ejmenov·nÌ)
ñ uloûenÌ 2. jmÈna souboru, se kter˝m se pracuje
ñ p¯Ìpona souboru ve FNZONE2
ñ jmÈno aktu·lnÌho drivu (nastaven˝ p¯Ìkazem MOVE)
ñ prostor pro uloûenÌ hlaviËky p¯i kopÌrov·nÌ
ñ zaË·tek uloûenÌ informacÌ v uchovanÈ hlaviËce p¯i kopÌrov·nÌ
ñ uloûenÌ prvnÌho ËÌsla sektoru v uchovanÈ hlaviËce p¯i kopÌrov·nÌ
ñ mÌsto pro uloûenÌ 24-bitovÈho ËÌsla
ñ pomocn· promÏnn· pro p¯evod 24-bitovÈho ËÌsla na ASCII vyj·d¯enÌ
ñ mÌsto pro uloûenÌ ASCII kÛdovÈ vyj·d¯enÌ 24-bitovÈho ËÌsla
ñ poËÌtadlo pr˘chod˘ p¯eruöenÌ IM 1 p¯i testov·nÌ p¯ipravenosti drivu
ñ adresa n·vratu p¯i Ñn·silnÈmì n·vratu z p¯eruöenÌ
ñ mÌsto pro uloûenÌ registru SP p¯i testov·nÌ p¯ipravenosti drivu
ñ mÌsto pro uschov·nÌ registru IX p¯i operacÌch ËtenÌ/z·pis/form·tov·nÌ
Komentovan˝ v˝pis MDOSu
3EE9 1
3EEA 1
3EEB 1
3EEC 2
3EEE 1
3EEF 8
SELSTA1
NONE2
SVSIDE
IREG2
SNAPINF
SYSMRK
ñ
ñ
ñ
ñ
ñ
ñ
mÌsto pro uloûenÌ bit˘ v˝bÏr˘ mechanik a stavu NMI
nevyuûito
mÌsto pro uloûenÌ strany, se kterou se pracuje
mÌsto pro uloûenÌ I registru a stavu p¯eruöenÌ p¯i p¯estr·nkov·nÌ ROMek
pokud je zde nenulov· hodnota, prov·dÌ se snap
mÌsto pro kontrolnÌ tabulku, kter· se vytvo¯Ì p¯i inicializaci MDOSu, pokud je
naruöen·, prov·dÌ se reset
3EF7 1
SYSFLAG
ñ mÌsto pro uloûenÌ d˘vodu p¯estr·nkov·nÌ do ROM D40 (tisk chybovÈho hl·öenÌ,
n·vrat z rutiny ZX ROM)
3EF8 240 NONE3ñ240 ñ nevyuûito
3FE8 2 2 SVREG
ñ mÌsto pro uloûenÌ registr˘ p¯i snapu
Sled instrukcÌ PUSH a POP
PUSH AF
PUSH BC
PUSH DE
PUSH HL
EXX
EX AF, AFí
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH IY
LD BC, (#3EEC) IREG2
;do BC hodnota vektoru p¯eruöenÌ a stav p¯eruöenÌ
PUSH BC
Ö zde je program pro uloûenÌ snapu, kter˝ takÈ p¯i n·vratu vyzved·v· hodnotu vektoru p¯eruöenÌ
a stav p¯euöenÌ, podle obsahu potom provede n·vrat zpÏt do programu
POP IY
POP IX
POP HL
POP DE
POP BC
POP AF
EX AF, AFí
EXX
POP HL
POP DE
POP BC
POP AF
3FFE 2
SAVESP
ñ mÌsto pro uloûenÌ registru SP p¯i snapu
9. Jak pouûÌvat rutiny MDOSu
PrvnÌ ot·zka, kter· se program·torovi naskytne, je, jak pouûÌvat rutiny MDOSu. Klasicky se ovl·d·
D40 z BASICu. Jak na to ale ve strojovÈm kÛdu? Varianty jsou dvÏ. BuÔ budu pouûÌvat pouze p¯Ìkazy
BASICu a to tak, ûe si nÏkde v pamÏti nasimuluji BASIC ¯·dek a skoËÌm na provedenÌ p¯Ìkazu. Toto n·s
vöak omezuje pouze pouûÌv·nÌ p¯Ìkaz˘ BASICu. Pokud vöak budeme chtÌt vyuûÌvat pouze urËitÈ podprogramy a nÏkterÈ kroky budeme chtÌt vynechat, musÌme pouûit variantu druhou a to p¯istr·nkov·nÌ
ROM D40 mÌsto ZX ROM a volat danÈ podprogramy. Jak tedy str·nkovat ZX ROM? Po prostudov·nÌ
struktury MDOSu zjistÌte, ûe pokud se v promÏnnÈ SYSFLAG nach·zÌ hodnota #4F, provede se n·vrat
z ROM D40 bez skoku na adresu #1700 (str·nkov·nÌ ZX ROM). Z˘stane tedy p¯istr·nkov·na ROM D40.
Komentovan˝ v˝pis MDOSu
149
SamotnÈ ¯eöenÌ problÈmu str·nkov·nÌ jiû bylo publikov·no nÏkolik. PrvnÌ dvÏ varianty vyöly v ZX
MagazÌnu. PrvnÌ vyuûÌvala BASIC p¯Ìkazu POKE #247,79, kterÈ zp˘sobÌ, ûe po provedenÌ p¯Ìkazu a po
zavol·nÌ RST #00 z˘stane p¯istr·nkov·na ROM D40. Vyûaduje vöak nutnost zachov·nÌ systÈmov˝ch
promÏnn˝ch Spectra. Druh· varianta vyuûÌva p¯eruöenÌ IM 2, kdy se poËÌt· Ëas od jednoho p¯eruöenÌ
k druhÈmu. PotÈ se tento Ëas pouûije k Ëek·nÌ a tÏsnÏ p¯ed p¯eruöenÌm se provede RST #08 a program
se ÑodchytÌì uû v ROM D40. Ani tato varianta nenÌ nejlepöÌ (vyuûÌv· se p¯eruöenÌ). DalöÌ varianta vyöla
o†nÏco pozdÏji, ale zato je geni·lnÏjöÌ.
TAB
DW #00
DW #3EF7
START
LD A, #4F
;do A a DE pot¯ebnÈ parametry
LD DE, TABñ#001A
CALL #25AB
;skoË na z·pis znaku
LD HL, #00
;nastav p˘vodnÌ hodnoty v TAB
LD (TAB), HL
LD HL, #3EF7
LD (TAB+#02), HL
RST #00
;proveÔ p¯estr·nkov·nÌ a vraù se s ROM D40
RET
Jak tato kr·tk· rutina funguje? Z·klad tvo¯Ì p¯Ìkaz CALL #25AB, kde v ZX ROM je instrukce RST #00.
ROM D40 podle n·vratovÈ adresy zjistÌ, ûe se vol· rutiny pro z·pis znaku do kan·lu (otev¯enÈho
sekvenËnÌho souboru). Registr DE ukazuje na zaË·tek hlaviËky buferu +1 a v A je zapisovan˝ znak. Do
registru HL se vypoËte umÌstÏnÌ parametr˘ v hlaviËce (na 28. a 29. bytu hlaviËky je uloûen poËet
zapsan˝ch znak˘, na 30. a 31. bytu je mÌsto uloûenÌ znaku do buferu), do DE se vyzvedne poËet
zapsan˝ch znak˘ a do BC se vyzvedne adresa, kam se bude znak v A ukl·dat. Dojde k uloûenÌ znaku v A
(#4F ñ n·vrat z rutiny ZX ROM) na adresu v BC (#3EF7 ñ SYSFLAG), otestuje se, jestli nenÌ uû nenÌ zaplnÏn
cel˝ bufer (v DE je 0, takûe se nic nedÏje) a pokud ne, vr·tÌ se zpÏt s p¯istr·nkovanou ZX ROM (je to jak·si
obdoba p¯ikazu POKE #247,79). NynÌ vöak je na SYSFLAG uloûena hodnota #4F, kter· n·m po zavol·nÌ
RST #00 zaruËÌ n·vrat s p¯istr·nkovanou ROM D40 (viz. v˝pis ROM D40). Je ale t¯eba d·t pozor na to,
ûe se data v TAB zmÏnÌ, takûe je t¯eba je nastavit p¯ed kaûd˝m str·nkov·nÌm na spr·vnÈ hodnoty. Jinak
uveden· rutina nepot¯ebuje ani systÈmovÈ promÈnnÈ BASICu, ani p¯eruöenÌ. Nem· taky û·dn˝ vedlejöÌ
vliv (kromÏ zmÏny obsahu TAB). Jedinnou nev˝hodou tÈto rutiny je to, ûe nerozpozn·, jestli je p¯ipojena
disketov· jednotka D40/80. Pokud nenÌ, provede reset (prvnÌ dvÏ varianty lze upravit tak, ûe pokud nenÌ
p¯ipojena D40, m˘ûe vr·tit chybovÈ hl·öenÌ a aplikace m˘ûe nabÌzet pouze operace s kazetov˝m
magnetofonem).
10. A co na z·vÏr?
No co jinÈho neû hodnocenÌ. Samotn· disketov· jednotka je celkem kvalitnÌ v˝robek, kter˝ vlastnÏ
do tÈ doby u n·s chybÏl nebo byl pouze pro ty schopnÏjöÌ, kte¯Ì si ho dok·zali vyrobit sami. Tak se
vlastnÏ stala disketov· jednotka volnÏ p¯Ìstupn· vöem, byl na nÌ servis, tvo¯ily se pro ni programy.
NÏkterÈ konstrukËnÌ vÏci byly sice ¯eöeny narychlo: moûnost p¯ipojenÌ pouze 2 mechanik mÌsto 3,
nevyuûÌtÌ celÈ pamÏti EPROM ñ co by se asi veölo do 4 KB (t¯eba DevastAce ñ pozn. Tritol&Pvl), ale j·
jsem s nÌ celkovÏ spokojen a zatÌm jsem s nÌ nemÏl velkÈ problÈmy. DoporuËuji ji vöem, kte¯Ì se
rozhodujÌ nad koupÌ vhodnÈ disketovÈ jednotky ke svÈmu Speccy nedo Didaktiku.
Mnoho ˙spÏch˘ p¯i tvorbÏ software
V·m p¯eje
jeötÏ jednou
KVAKSOFT
150
Komentovan˝ v˝pis MDOSu
Obsah
1. Jako obvykle zaËneme ˙vodem ................................................................................... 2
1.1. Disketov· jednotka D40/80 .................................................................................... 2
1.2. OperaËnÌ systÈm MDOS .......................................................................................... 2
2. TechnickÈ ˙daje o disketovÈ jednotce ...................................................................... 3
2.1. ÿÌdÌcÌ jednotka ........................................................................................................ 3
2.2. ÿadiË WD2797 ......................................................................................................... 3
2.2.1. Popis v˝vod˘ .......................................................................................................... 3
2.2.2. Organizace ¯adiËe ................................................................................................. 5
2.2.3. RozhranÌ procesoru .............................................................................................. 5
2.2.4. Popis p¯Ìkaz˘ ¯adiËe ............................................................................................. 5
2.2.4.1. P¯Ìkazy typu I ...................................................................................................... 6
2.2.4.2. P¯Ìkazy typu II .................................................................................................... 7
2.2.4.3. P¯Ìkazy typu III ................................................................................................... 7
2.2.4.4. P¯Ìkaz typu IV ..................................................................................................... 8
2.2.5. Stavov˝ registr ........................................................................................................ 8
2.3. WD2797 v D40 ......................................................................................................... 9
2.4. PamÏt EPROM a SRAM ........................................................................................... 9
2.5. TlaËÌtko SNAP ....................................................................................................... 10
2.6. Obvod 8255 ............................................................................................................ 10
2.7. Mechaniky .............................................................................................................. 11
3. Disketa ...................................................................................................................... 11
4. Struktura diskety MDOSu ........................................................................................ 12
4.1. BOOT .................................................................................................................... 13
4.2. FAT ......................................................................................................................... 13
4.3. Adres·¯ .................................................................................................................. 14
4.4. Datov· oblast .......................................................................................................... 14
5. Informace o disketÏ a mechanice ............................................................................ 15
6. Opravy a ˙pravy MDOSu .......................................................................................... 15
7. Komentovan˝ v˝pis MDOSu ..................................................................................... 16
#0000
#0008
#0010
#0018
#0020
#0028
#0030
#0038
#0066
#012F
#01C8
VstupnÌ body, inicializace a systÈmovÈ rutiny
RST #00 ñ z·kladnÌ vstupnÌ bod do ROM D40 ............................................... 16
RST #08 ñ interpretace p¯Ìkaz˘ pro pr·ci s D40 ............................................... 16
RST #10 ñ tisk znaku v reg. A ...................................................................... 16
RST #18 ñ naËte do reg. A obsah mÌsta adresovanÈho syst. prom. CH_ADD ........... 16
RST #20 ñ naËte do reg. A dalöÌ znak p¯i interpretaci BASIC ¯·dku ..................... 16
RST #28 ñ slouûÌ k vol·nÌ rutiny v ZX ROM p¯Ìmo z ROM D40 .......................... 17
RST #30 ñ test jestli se prov·dÌ p¯Ìkaz nebo kontrola syntaxe ................................ 17
RST #38 ñ podprogram pro obsluhu p¯eruöenÌ od ULA ........................................ 17
NMI ñ podprogram pro p¯enos dat z/do mechaniky ............................................ 18
RAMERR ñ sem se sk·Ëe, dojde-li p¯i testu SRAM k chybÏ .................................... 22
PRTMES ñ podprogram pro tisk poloûky z tabulky text˘ ...................................... 24
Komentovan˝ v˝pis MDOSu
151
#0204 ERRR ñ vstupnÌ bod dojde-li k nÏjakÈ chybÏ ...................................................... 25
#0215 SYNTAX1 ñ dekÛdov·nÌ p¯Ìkazu MDOSu a skok na danÈ podprogramy ............... 26
#02E1 RETURN ñ zastavenÌ mechanik a p¯estr·nkov·nÌ do ZX ROM .......................... 28
Obsluha SNAP˘
#02E7 SNAPR ñ uloûenÌ SNAPu na disk .................................................................. 29
#0394 SNPLOA ñ nataûenÌ SNAPu do pamÏti .......................................................... 31
#03A4 SNAPNM ñ text ÑSNAPSHOT00Sì ............................................................... 31
Tabulky MDOSu
#03AF SYSMSG ñ tabulka text˘ chybov˝ch hl·öenÌ pro MDOS ...................................... 31
#05FF SYNTAB ñ tabulka p¯Ìkaz˘ MDOSu ............................................................. 32
#06C1
#06F0
#06F0
#0723
#0778
#07C9
#07E5
#086F
#0971
#0A4B
#0A50
P¯Ìkazy MDOSu
POKE ñ p¯Ìkaz pro z·pis dat do SRAM .......................................................... 34
LET FN ñ p¯Ìkaz na zmÏnu jmÈna souboru (kontrola syntaxe) .............................. 35
LET ATTR ñ p¯Ìkaz na zmÏnu atribut˘ souboru (kontrola syntaxe) ...................... 35
LET ATTR ñ provedenÌ p¯Ìkazu LET ATTR .................................................... 36
LET FN ñ provedenÌ p¯Ìkazu LET FN ............................................................ 37
ANSTRING ñ anal˝za ¯etÏzce na z·sobnÌku ................................................... 38
PRINT, LPRINT ñ p¯Ìkazy pro v˝pis obsahu sekvenËnÌho souboru ....................... 39
LIST, LLIST ñ p¯Ìkazy pro v˝pis informacÌ o poËÌtaËovÈ sestavÏ ........................... 41
INFMES ñ tabulka pro p¯Ìkazy LIST* a LLIST* .............................................. 43
RESTORE ñ p¯Ìkaz pro z·pis obsahu pamÏti do specifikovanÈho sektoru ............... 44
READ ñ p¯Ìkaz pro naËtenÌ specifikovanÈho sektoru do pamÏti ............................. 44
SekvenËnÌ soubory
Obecn˝ popis ........................................................................................................... 46
#0AC9 OPENIN ñ p¯ipojenÌ souboru pro ËtenÌ na kan·l ............................................... 47
#0B7B OPENOUT ñ p¯ipojenÌ souboru pro z·pis na kan·l .......................................... 49
#0BDB OPENIO ñ p¯ipojenÌ souboru pro z·pis na kan·l (je-li jiû p¯ipojen soubor pro ËtenÌ) .. 51
#0C14 CLOSESTR ñ podprogram pro uzav¯enÌ kan·lu .............................................. 51
#0C2D CLOSEALLSTR ñ uzav¯e vöechny kan·ly ...................................................... 52
#0C4B CLOPENF ñ uzav¯e soubory p¯ipojenÈ na kan·l ............................................... 52
#0C72 CLOSEOUTF ñ uzav¯e soubor otev¯en˝ pro z·pis .............................................. 53
#0D14 ANALOPENNM ñ rozdÏlÌ ¯etÏzec na z·sobnÌku na jmÈno disku a souboru ............. 55
#0D21 SETSTRBUF ñ vypoËte relativnÌ adresu buferu pro otevÌran˝ kan·l ..................... 56
#0D31 SETEMPTYFIL ñ vytvo¯Ì soubor s nulovou dÈlkou ............................................ 56
#0D67 LD(HL)DE ñ uloûÌ na (HL) reg. E a na (HL+1) reg. D .................................... 57
#0D6C LD(HL)A ñ uloûÌ na (HL) reg. A .................................................................. 57
#0D6F MAKE544B ñ vytvo¯Ì prostor 544 byt˘ ........................................................... 57
#0D74 MAKE1088B ñ vytvo¯Ì prostor 1088 byt˘ ........................................................ 57
#0D80 DESTRBYTE ñ zruöÌ prostor BC byt˘ ............................................................. 58
#0DB0 LDDE(HL) ñ vyzvende DE z (HL) a (HL+1) .................................................. 59
#0DB5 SETSTRNM ñ analyzuje jmÈno souboru a disku pro otev¯enÌ sekvenËnÌho souboru .... 59
152
Komentovan˝ v˝pis MDOSu
#0DD9
#0E1E
#0E42
#0E86
#0E9B
#0EF4
READFROMSTR ñ rutina pro naËtenÌ znaku ze sekvenËnÌho souboru ................. 59
WRITETOSTR ñ rutina pro z·pis znaku do kan·lu ....................................... 61
STRRDNSEC ñ naËte dalöÌ sektor souboru do buferu ......................................... 62
STRDRNMSC ñ nastavÌ jmÈno disku, na kterÈm se nach·zÌ soubor ..................... 63
WFULLSTRSC ñ zpÌöe vyplnÏn˝ bufer na disk ................................................. 63
CLOSEZEROSTR ñ uzav¯e kan·l 0 ............................................................ 65
#0EF8
#0F10
#0F14
#0F9E
#0FA6
#0FAD
#0FB2
#0FC0
#0FCF
#1027
#1043
#104B
#1051
#1057
#1064
#107C
#10B3
#10DB
#10E2
#1118
#111F
#1124
#1132
Podp˘rnÈ podprogramy
ROMDRPAR ñ tabulka z·kladnÌch parametr˘ disk˘ ....................................... 65
TXTSDOS ñ text ÑSDOSì ........................................................................... 65
NUM24B ñ p¯evede 24bitovÈ ËÌslo na ¯etÏzec a vytiskne ho ................................... 65
TESTNM ñ zjistÌ, je-li vloûeno jmÈno souboru .................................................... 67
BCPRT ñ rutina pro v˝pis obsahu reg. BC ....................................................... 67
ADDHLA ñ p¯iËte k reg. HL obsah reg. A ....................................................... 67
ANALSTE ñ vymaûe oblast pro uloûenÌ jmÈna disku a souboru ............................. 68
DIVSTRINGCAT ñ zpracuje p¯ÌpadnÈ parametry ............................................ 68
DIVSTRING ñ vyzvedne parametry ¯etÏzce, rozdÏlÌ ho na jmÈno disku a souboru ..... 68
NOPARCAT ñ vyplnÌ FNZONE1 znakem Ñ?ì .................................................. 70
SETWDNM ñ zkontroluje je-li zad·no jmÈno disku ........................................... 70
BNULHL ñ uloûÌ B nul od adresy HL ............................................................ 70
TESTSYN1 ñ testuje, nejde-li o kontrolu syntaxe ............................................... 70
ISSYNCONTR ñ testuje, nejde-li o kontrolu syntaxe (vol·n p¯Ìmo z podprogram˘) .. 71
GETNAME ñ vyzvedne jmÈno souboru nebo disku z ¯etÏzce ................................... 71
ARRANGNM ñ upravÌ jmÈno souboru na masku.............................................. 71
SETEXT ñ nastavÌ p¯Ìponu ......................................................................... 72
EXTTAB ñ tabulka programov˝ch p¯Ìpon ....................................................... 73
ANALWDNM ñ analyzuje jmÈno disku .......................................................... 73
UPPER ñ p¯evede znak na velkÈ pÌsmeno ......................................................... 74
ISALFNUM ñ testuje, je-li znak alfanumerick˝ ................................................. 74
ISALFABET ñ testuje, je-li znak alfabetick˝ ..................................................... 74
ISNUM ñ testuje, je-li znak ËÌslice .................................................................. 75
#1139
#1157
#115A
#11A2
#11DF
#127B
#1283
#128D
#129E
#12D3
#1306
DalöÌ p¯Ìkazy MDOSu
RUN ñ p¯Ìkaz pro nahr·nÌ souboru se jmÈnem Ñrunì do pamÏti ............................. 75
TXTRUN ñ text Ñrunì ................................................................................ 76
CATNOINF ñ zajiöùuje prov·dÏnÌ p¯Ìkazu CAT ñ ............................................ 76
PRINTINF ñ vytiskne poËet soubor˘ na disketÏ a volnou kapacitu diskety ............. 77
CAT ñ p¯Ìkaz pro v˝pis obsahu diskety ............................................................. 77
DEFATTR ñ tabulka znak˘ pro atributy souboru .............................................. 80
GETATR ñ vyzvedne atributy souboru ............................................................. 80
PRTSTR ñ vytiskne ¯etÏzec deseti znak˘ od HL ................................................ 80
TXTCAT ñ tabulka text˘ p¯Ìkazu CAT .......................................................... 80
ERASE ñ p¯Ìkaz pro vymaz·nÌ soubor˘ z disku ................................................. 81
MOVE ñ prvnÌ varianta p¯Ìkazu (nastavenÌ implicitnÌho za¯ÌzenÌ) ..................... 81
Komentovan˝ v˝pis MDOSu
153
#1320
#14E1
#1534
#1700
#1701
#1704
#1707
#196B
#19AE
#19D0
#19DE
#19FA
#1A3D
#1A54
#1C44
#1C56
#1C6B
FORMAT ñ p¯Ìkaz pro form·tov·nÌ disket ...................................................... 82
TXTFORM ñ tabulka text˘ p¯Ìkazu FORMAT ................................................ 87
NOTUSED ñ nevyuûit· oblast ...................................................................... 87
STANDROM ñ p¯i skoku na tuto adresu dojde k p¯estr·nkov·nÌ do ZX ROM ........ 87
RSAVE ñ p¯Ìkaz pro uloûenÌ bloku dat na disketu .............................................. 88
RLOAD ñ p¯Ìkaz pro naËtenÌ bloku dat do pamÏti ............................................ 88
RMERGE ñ p¯Ìkaz pro p¯ihr·nÌ dat do pamÏti................................................. 88
LOAR01 ñ zjistÌ, jestli je soubor na disketÏ ....................................................... 96
LOADBLOCK ñ nahraje soubor do pamÏti ..................................................... 97
FINTYP ñ p¯evede p·skovou hlaviËku na diskovou ........................................... 97
SAVESETPAR ñ nastavÌ p¯Ìponu souboru a vyzvedne parametry bloku dat ............ 97
SAVECONTR ñ podprogram pro uloûenÌ bloku dat na disk ................................ 98
SLMANALSTR ñ rozdÏlÌ ¯etÏzec na jmÈno disku a souboru (pro LOAD, SAVE) ....... 99
MOVE ñ druh· varianta p¯Ìkazu (kopÌrov·nÌ soubor˘) ..................................... 99
TXTMOVE ñ tabulka text˘ p¯Ìkazu MOVE ................................................. 105
CHANGEDRNM ñ zamÏnÌ jmÈna zdrojovÈho a cÌlovÈho disku ......................... 105
SETCOPYNM ñ rozdÏlÌ ¯etÏzec na jmÈno souboru a disku (pro MOVE) ................ 106
DalöÌ podp˘rnÈ podprogramy
#1C8F SETACT ñ nastavÌ drive podle jmÈna jako drive, se kter˝m se bude pracovat ......... 106
#1CD5 CMPDSK ñ naËte BOOT a porovn· jmÈno diskety se jmÈnem disku ..................... 107
#1CF1 GETWITHTEST ñ naËte obsah poloûky ve FAT a zkontroluje ho ....................... 107
#1D04 GETFAT ñ vyzvedne obsah poloûky ve FAT bez testu .......................................... 108
#1D1E WRTOFATñ zapÌöe do FAT ........................................................................ 109
#1D46 READFATSC ñ naËte sektor FAT do buferu .................................................... 109
#1D9D WFATIFCH ñ zapÌöe sektor FAT z buferu ....................................................... 111
#1DC2 FREECOUNT ñ spoËÌt· vöechny volnÈ sektory na disketÏ ................................. 111
#1DDC SECPERDSK ñ vypoËte, kolik sektor˘ je na disketÏ .......................................... 112
#1DE9 FYZLOG ñ p¯evede fyzick˝ sektor a stopu na logick˝ sektor ................................ 112
#1DF9 LOGFYZ ñ p¯epoËte logick˝ sektor na fyzick˝ sektor a stopu ................................ 112
#1E0B READADR ñ naËte sektor adres·¯e a vr·tÌ adresu prvnÌ poloûky v buferu ............ 113
#1E65 WSCADR ñ zapÌöe sektor adres·¯e ................................................................ 114
#1E7E RDBOOT ñ naËte BOOT z drivu a porovn·, je-li disketa MDOSov· ................. 115
#1EA1 GETPAR ñ p¯eËte BOOT a nastavÌ parametry ............................................... 115
#1F0F VERIFY ñ porovn· dva bloky ...................................................................... 116
#1F16 SETDRV ñ nastavÌ drive, se kter˝m se bude pracovat ....................................... 117
#1F49 INITALLDR ñ nastavÌ parametry vöech p¯ipojen˝ch driv˘ .............................. 118
#1F66 DELALLFIL ñ smaûe vöechny soubory vyhovujÌcÌ masce z disku ......................... 118
#1F88 DFILER ñ provede smaz·nÌ vyhledanÈ poloûky z adres·¯e .................................. 118
#1FA5 LOAFND ñ nahraje data ze souboru ............................................................ 119
#1FAB LOAWITHF ñ vyhled· soubor a nahraje z nÏj data ........................................ 119
#201E TRANSTOSEC ñ vypoËte, kolik sektor˘ zabere soubor na disku ......................... 121
#202C FINDANDFILL ñ najde prvnÌ pr·zdnou poloûku adres·¯e ............................... 121
#2046 SAVEFILE ñ uloûÌ soubor na disk ................................................................ 122
154
Komentovan˝ v˝pis MDOSu
#20C4
#20DB
#20F6
#210A
#212B
#212D
#2137
#215C
#215E
#216F
#217B
#2199
#21A1
#21AC
#21BF
#21FB
#2216
COUNTCSEC ñ vypoËte poËet sektor˘, kterÈ jdou souvisle za sebou ..................... 124
SAVETOFAT ñ zapÌöe cestu souboru do FAT ................................................... 124
FINDEMPTYFAT ñ najde pr·zdnou poloûku FAT .......................................... 125
FINDBESEC ñ hled· ve FAT sektory jdoucÌ nep¯etrûitÏ za sebou ......................... 125
FIRSTMASK ñ naËte prvnÌ poloûku adres·¯e ................................................. 126
NEXTMASK ñ naËte dalöÌ poloûku adres·¯e .................................................. 126
TESTMSK ñ zjistÌ, jestli jmÈno souboru odpovÌd· masce ................................... 126
FIRSTEMPTY ñ najde prvnÌ volnou poloûku v adres·¯i .................................. 127
NEXTEMPTY ñ najde dalöÌ volnou poloûku v adres·¯i ................................... 127
RDNOEMPTY ñ p¯eËte prvnÌ nepr·zdnou poloûku adres·¯e ............................. 128
ERAVAR ñ vymaûe pomocnÈ promÏnnÈ MDOSu ............................................... 128
NAMEDISK ñ vypoËte adresu jmÈna diskety v drivu ........................................ 129
DRVSYS ñ vypoËte adresu tabulky parametr˘ aktivnÌho disku .......................... 129
DRVCMP ñ vypoËte adresu tabulky parametr˘ disku ....................................... 129
KEYMSG ñ tiskne hl·öenÌ s dotazem a Ëek· na stisk kl·vesy .............................. 129
TXTQUE ñ tabulka text˘ dotaz˘ ............................................................... 130
HWINIT ñ test mechanik, zjiötÏnÌ poËtu stop, inicializace 8255 ....................... 131
Podprogramy pro pr·ci s ¯adiËem
#2296 BWRITE ñ zapÌöe sektor nebo ¯adu sektor˘ na disk .......................................... 133
#229C BFORMA ñ form·tuje stopu ....................................................................... 133
#22A2 BREADA ñ naËte sektor nebo ¯adu sektor˘ z disku ........................................... 133
#22A5 BREAD ñ m· podobnou funkci jako BREADA ............................................... 133
#2340 SEEK ñ nastavÌ hlavu na stopu .................................................................. 136
#234B HOME ñ poöle hlavu na stopu 0 .................................................................. 136
#236A DREAD ñ naËte jeden sektor z diskety ........................................................... 136
#2377 DOWDCOM ñ rutina pro vykon·nÌ povelu ¯adiËe ......................................... 137
#23BE DWRITE ñ zapÌöe jeden sektor na disketu ...................................................... 138
#23D8 DFORMA ñ form·tuje stopu diskety ............................................................. 138
#248E FILLCONST ñ vyplnÌ ˙sek pamÏti konstantou .............................................. 141
#2493 FINDTRACK ñ najede hlavou na stopu ....................................................... 141
#2518 FORFINDTR ñ najede hlavou na stopu (bez ovϯenÌ ËtenÌm) ............................. 143
#2520 DISKRET ñ n·vrat z operacÌ READ, WRITE, FORMAT ................................. 143
#2536 DSKSTP ñ vypne vöechny mechaniky ........................................................... 144
#254B DRVSEL ñ rozbÏhne mechaniky a nastavÌ stopu ............................................. 144
#256D TESTDR ñ otestuje, je-li mechanika p¯ipojena ................................................ 145
#25BC OUTTODR ñ vyöle v˝bÏr mechaniky a podmÌnky NMI .................................... 146
#25C2 TESTDRQ ñ naËte hodnotu z ¯adiËe a ponech· pouze informaci o DRQ ............. 146
#25C7 DELAY ñ spoûÔovacÌ smyËka ....................................................................... 146
#25EA REANMI ñ p¯enos dat z ¯adiËe .................................................................... 147
#25ED WRINMI ñ p¯enos dat do ¯adiËe .................................................................. 147
8. SystÈmovÈ promÏnnÈ MDOSu a popis SRAM. ...................................................... 148
9. Jak pouûÌvat rutiny MDOSu .................................................................................... 149
10. A co na z·vÏr? ........................................................................................................ 150
Komentovan˝ v˝pis MDOSu
155
Komentovan˝ v˝pis MDOSu verze 1.0 a jeho opravy
autor
© 1995 Kvaksoft
sazba
© 1997ñ98 Tritolsoft

Podobné dokumenty

MDOS3 – popis služeb pro programátory Využití: Volání služeb

MDOS3 – popis služeb pro programátory Využití: Volání služeb BCDE = LBA sektor, HL = data, 4.bit registru B nastavuje zařízení master/slave BC = číslo chyby HL, BC, DE, IX Zapíše sektor. Je automaticky přepočítán na adresu CHS podle geometrie disku. Master/s...

Více

5 - Skalná

5 - Skalná Dnes bychom se v novali významu p íjmení Cizler – Cízler. Toto p íjmení se adí do skupiny p íjmení tvo ených ze slov cizího p vodu. Tato se vyskytují v ude tam, kde se stýkají r zné národní jazyky....

Více

Mic PIC1

Mic PIC1 J·drem monolitickÈho mikropoËÌtaËe je procesorov· jedcelkem, tzn. ËÌst nebo zapisovat vöech osm bit˘ nebo pracovat notka (obr. 3), kter· obsahuje ¯adiË, aritmeticko logickou jeds jednotliv˝mi bity ...

Více

ZXM 3/04 - ZX Magazín

ZXM 3/04 - ZX Magazín grafiku, zvuk, atd. To je sice pravda, ale přece jen hrám na PeCi chybějí dvě nejdůležitější věci, a to smysl a zábava. Mnohdy u simulátorů na PeCi nepoznáte rozdíl mezi stíhačkou a létající sekačk...

Více

ZXM 2/04 - ZX Magazín

ZXM 2/04 - ZX Magazín uûivatele poËÌtaˢ poËÌtaˢ ZX ZX Spectrum Spectrum aa kompatibilnÌch kompatibilnÌch ËÌslo: cena: ËÌslo: 2/04

Více