Speccy-Dos
Referencia Adatok Gépi Kódú Felhasználói Programokhoz
1985 - dr. Horváth Ferenc
Tartalom
Bevezetés
Ez a kézikönyv azon SFECCY-DOS felhasználók szárára készült, akik saját file-kezelő programokat kívánnak készíteni, kihasználva a SFECCY-DOS belső szubrutinkészletét. A kézikönyv az összes olyan információt tartalmazza, amely a fenti feladat megoldásához szükséges lehet. A kézikönyv legcélszerűbb használati módja az, hogy először gondosan végigolvassuk az elejétől a végéig, a későbbiekben, a programok írása során pedig szubrutin-katalógusként használjuk. A kézikönyv írása során fettételeztünk bizonyos előismereteket, így feltételeztük, hogy az olvasó elsősorban alaposon ismeri a SPECTRUM-ot, másodsorban megfelelően járatos a SPECCY-DOS BASIC-ből való kezelésében, végül feltételeztük, hogy az olvasó járatos a Z-80 assembly nyelvű programozásában. A SPECCY-DOS-ra vonathozó alapismeretek a "SPECCY-DOS Felhasználói Kézikönyv" c. irodalomból szerezhetők meg.
Bizonyos szubrutinok használatához (pld.: TYPONE),illetve bizonyos fajta feladatok megoldásához a fentieken kívül a SFECCY-DOS-ban alkalmazott floppy diszk kontroller (továbbiakban: FDC), azaz a WD1770 részletes ismerete is szükséges.
A kézikönyv fő részét képező VII. fejezet a szubrutinok interface-ivel foglalkozik, míg az egyéb fejezetek a memória felépítéséét, a DOS rendszerváltozóit, a szubrutinok hívási módját és a diszk felépítését ismertetik. A SPECCY szubrutinok használatához sok sikert kívánunk!
1. Memóriafelosztás
A SPECCY-DOS 8 Kbyte ROM és 1 Kbyte RAM memóriát tartalmaz. Ezeket árnyék ROM-nak, ill. árnyék RAM-nak nevezzük, mivel a SPECTRUM-ban lévő memóriával azonos címeken helyezkednek el. Az 1-1 ábra a SPECCY-vel felszerelt 48 k-s SPECTRUM cím szerinti memóriakiosztását mutatja. A BASIC, ill. a DOS ROM közül egyidejűleg csak az egyik lehet kiválasztva.
A DOS RAM csak akkor férhető hozzá, ha nem a BASIC ROM van kiválasztva, míg a közös RAM mindkét ROM-ban futó programból hozzáférhető. A ROM-ok közötti választás módjáról a későbbiekben lesz szó.
1-1 ábra
2. A SPECCY-DOS I/O Rendszere
A DOS hardware és software közötti kapcsolat megvalósítására a SPECCY-DOS-ban un. memóriaként kezelt I/O rendszer működik. Ez azt jelenti, hogy a szükséges input/output műveleteket a processzor nem IN/OUT hanem memória olvasó, ill. író műveleteken keresztül valósítja meg. A szükséges I/O műveleteket két csoportba sorolhatjuk, miszerint
1. a DOS hardware vezérlőjeleit kezelő output műveletek, és
2. az FDC különböző regisztereinek olvasására, ill. írására szolgáló I/O műveletek.
2.1. Hardware vezérlőjelek kezelése
Ebbe a csoportba kizárólag output műveletek tartoznak, amelyekkel a DOS hardware különböző vezérlőjeleit kezelhetjük.
Ha a 3B41h (15169d) címre memória műveletet hajtunk végre, akkor a processzor adatbusza különböző hardware elemekkel kerül kapcsolatba, ezáltal különböző hardware folyamatokat vezérel. Az egyes adatbiten és az említett hardware jelek egymáshoz rendelését mutatja a 2-1. ábra.
2-1. ábra
1. Drive kiválasztás: B0, B1
Diszkműveleteket megelőzően ezen bitek segítségével kell kijelölnünk, hogy a művelet melyik drive-on hajtódjék végre. A kijelölést követően minden művelet a kijelölt drive-on fog végrehajtódni, egészen addig, amíg más drive-ot nem jelöltünk ki. A 2-1. táblázat a B0, B1 biten kódolását mutatja.
B1
(DS1) B0
(DS0) A kiválasztott drive 0 0drive-0 0 1drive-1 1 0drive-2 1 1drive-3 2. Lemezoldal kiválasztás: B2
Kétoldalas drive esetén B2=0-val, a lemez 0 jelű, míg B2=1-el, a lemez 1jelű oldalát választhatjuk ki. Ez a kiválasztás a következő lemezoldal kiválasztásig érvényben marad.3. DOS / BASIC választás: B3
Ha DOS engedélyezve van, és B3=1, akkor a BASIC ROM letiltódik, és soron következő memóriaműveletek esetén a DOS ROM ill. a DOS RAM lesz kiválasztva, a konkrét címtől függően. Ha a DOS engedélyezve van (LSB B6) és B3=0, akkor a DOS ROM, ill. DOS RAM letiltódik, és a BASIC ROM lesz az érvényes memória a saját címtartományában.4. DOS engedélyezés / tiltás: B6
Ha B6=0, akkor a DOS engedélyezve van, azaz B3 bittel választhatunk a DOS, ill. a BASIC ROM között, és a gép elfogadja és végrehajtja, a BASIC programokban elhelyezett DOS-os parancsokat. Ha B6=1, akkor a DOS le van tiltva, más szóval ki van kapcsolva. Ez azt jelenti, hogy annak ellenére, hogy a SPECCY rá van csatlakoztatva a SPECTRUM-ra, nem fogad el és nem hajt végre DOS parancsokat, és a B3 bittel nem lehet kiválasztani a DOS ROM-ot.
Ez a képesség lehetőséget ad olyan SPECTRUM perifériákkal való kompatibilitás megvalósítására, amelyekkel a SPECCY-DOS egyébként nem volna kompatibilis. E bit ciklikus váltogatásával pld. olyan másolóprogramot készíthetünk, amelyik az INTERFACE-I-hez kapcsolt Microdrive és SPECCY-hez kapcsolt drive-ok közötti kétirányú file másolásra képes.5. Írássűrűség kiválasztás: B7
Ezzel a bittel határozhatjuk meg, hogy az FDC milyen írássűrűségre számítva végezze el a diszk olvasását, illetve milyen írássűrűséggel hajtsa végre a diszk írását.B7 = 0: Dupla írássűrűség
B7 = 1: Szimpla írássűrűségA kiválasztott írássűrűség mindaddig érvényben marad, amíg újabb írássűrűség kiválasztást nem végzünk.
Egyéb tudnivalók a 3B4lH címmel kapcsolatban
Mint már hangsúlyoztuk, a 3B41H címre csak memória írási műveletnek van értelme. Az erről a címről beolvasott adat a DOS szempontjából nem értelmezhető, és semmiféle kapcsolatban nincs az e címre kiírt adattal. Mivel ugyanazzal a memória írási művelettel 5 különböző funkciót vezérlünk, a software-nek mindig tudnia kell az e címre legutoljára kiadott kódszót. Ez sokféleképpen megoldható, legcélszerűbb azonban a felhasználói programokban is azt a módszert követni, amelyet a DOS írásakor alkalmaztunk. Ennek lényege, hogy a 3B41H címre legutoljára kiadott kódszót egy rendszerváltozóban tároljuk és valahányszor új kódszót írunk ki a 3B41H-re, mindig beírjuk az új kódszót e rendszerváltozóba.
E rendszerváltozó neve a DOS-ban DFLAG-1, címe 2000H.
2.2. Az FDC regisztereinek kezelése
Az FDC regiszterei software-ből akkor hozzáférhetőek, ha a DOS van kiválasztva, azaz a 3B41H címre legutoljára kiadott kódszóban B3=1. Ez esetben az FDC regiszterei memória olvasással, ill. írással férhetők hozzá. A 2.2. táblázat az FDC egyes regisztereihez rendelt memóriacímeket tartalmazza.
Memória cím | Olvasás | Írás |
3290H 3291H 3292H 3293H |
státusz regiszter track regiszter szektor regiszter adat regiszter |
parancs regiszter track regiszter szektor regiszter adat regiszter |
Megjegyezzük, hogy az FDC regisztereinek kezelésére a gépi kódú programot készítő felhasználónak nem lesz szüksége fettéve, hogy az e kézikönyvben közölt szubrutinok és belépési pontok segítségével használja a DOS szolgáltatásait. Az itt között információkra a felhasználónak csak akkor van szüksége, ha a DOS fizikai szintű rutinjainak megkerülésével ő maga kívánja vezérelni a DOS hardware-t. Ehhez azonban az FDC alapos ismerete is szükséges. Az e kézikönyvben közölt adatok birtokában elvileg nem kizárt, hogy valaki saját diszk operációs rendszert készítsen a SPECCY hardware kihasználásával, de a SPECCY software megkerülésével.
3. A SPECCY diszk felépítése
A diszk szervezése, felépítése alapvetően meghatározza egy adott DOS minőségi jellemzőit. A SPECCYDOS diszkjeinek szervezése olyan, hogy lehetőséget nyújt a legkülönbözőbb feladatokhoz való alkalmazásra, mint például soros, ill. véletlen hozzáférésű file-ok kezelése, adatbázis kezelők készítése, stb.
3.1. A SPECCY diszk fizikai felépítése
A SPECCY diszk egy vagy kétoldalas lehet, az egy oldalon tévő track-ek száma 35, 40, 45, ill. 80 lehet. Az egy track-en tévő szektorok száma 35,40, ill. 80 track esetén 10/16, 45 track esetén 7/13. (A kisebb szám szimpla, a nagyobb dupla írássűrűség esetén érvényes.) 1 szektor hossza 256 byte. A SPECCY-DOS által kezelt konfigurációkat a 3-1 táblázat mutatja.
Oldalak száma | Track-ek száma | |||
35 | 40 | 45 | 80 | |
1 oldalas diszk | igen | igen | igen | igen |
2 oldalas diszk | - | igen | - | igen |
Minden kezelt konfiguráció esetén lehetőség van egyszeres, ill. kétszeres írássűrűségű rögzítésre.
A track-ek számozása 0-tól, a szektorok számozósa 1-től kezdődik. A 0-dik track (T00) a diszk legnagyobb sugara track-je, az első szektor az index lyukat követi (S01).
A szektorok számozásánál alkalmazott un. interleave tényező értéke 2, azaz két logikailag egymást követő szektor között két másik szektor található.
3.2. A SPECCY diszk logikai felépítése
Logikailag a SPECCY diszk három, részre osztható:
A directory terület egyrészt a diszk egészére vonatkozó információkat, másrészt a file-okra, mint egészekre vonatkozó információkat tartalmaz. A directory terület minden esetben a diszk első oldalán (side 0), a T0 első 7 szektorát (S1,..S7) foglalja le.
A térkép terület az adatterület "térképét" tartalmazza. Ennek a térképnek a segítségével válik lehetségessé, hogy az egyes file-ok szektorai az adatterületen szükség esetén teljesen összevissza, más file-okhoz tartozó szektorokkal összekeveredve helyezkedhessenek el, biztosítva ezzel az adatterület tökéletes kihasználását. Ugyancsak a térkép ad lehetőséget a file-on belüli véletlen szektorhozzáférésre, azaz arra, hogy egy file N-edik szektorát az azt logikailag megelőző N-l szektor végigolvasása nélkül beolvashassuk vagy írhassuk. Ugyancsak a térkép ad lehetőséget file-on belüli előre, ill. hátrafelé való keresésre. A térkép mindig a diszk első oldalán (side 0) van. Az adatterület foglalja le a diszk legnagyobb részét.
Az adatterület a file-ok adattartalmát foglalja magában. Az adatterület tartalmazhat hibás, nem használt szektorokat is (max 128), míg a directory és a térkép terület csak hibátlan szektorokból állhat.
A 3-2 táblázat a térkép terület track és szektorfoglalását mutatja. (SS = egyoldalas, DS = kétoldalas diszk, SD = szimpla, DD = dupla sűrűség). Az adat terület a térkép utáni track-en kezdődik.
Konfiguráció | Térképterület SD |
Térképterület DD |
35T-SS 40T-SS 45T-SS 80T-SS 40T-DS 80T-DS |
T1: s1...s7 T1: s1...s8 T1: s1...s6 T1: s1-s9, T2.: s1-s7 T1: s1-s9, T2.: s1-s7 T1,2,3: S1-s9, T4. s1-s4 |
T1: s1...s11 T1: s1...s12 T1:s1...s11 T1:s1-s15, T2:s1-s10 T1:s1-s15, T2:s1-s10 T1,2,3: s1-s15, T4:s1-s4 |
3.2.1. A Directory terület felépítése
A directory terület tartalom szerint két részre osztható:
T0S1 a diszkre, mint egészre vonathozó információkat, valamint az un. directory térképet tartalmazza, míg
T0/S2...S7 az egyes file-okra vonatkozó információkat tartalmazza.
T0/S1 felépítése
Rendszerazonosító byte-ok
A diszk neve
Ez a 8 byte a diszk nevét tartalmazza, szükség szerint space-ekkel 8 karakterre kiegészítve.
A diszk leíró byte-ja (0DH)
A leíróbyte bitenként van értelmezve:
A diszkre vonatkozó egyéb információk
0EH B0...B6: A diszk egy oldalán levő track-ek száma
B7: 0: ha egyoldalas, 1, ha hétoldalas diszk.0FH Az egy track-en levő szektorok száma (7/10/13/16) 12H, 13H A diszk összes szektorainak száma, nem levonva a hibás szektorokat, de levonva a directory, valamint a térkép terület szektorait és a nem használt ép szektorokat. (Azaz: az adatterület szektorainak száma.) 14H A file-ok maximális száma. 15H Az inicializáláskor felismert sérült szektorok száma. 16H, 17H A létező file-ok által lefoglalt szektorok száma az adatterületen. Az autoboot file-ra vonatkozó információk
A soron következő 25 byte (18H....30H) a létező autoboot file 25 byte hosszú file-directory-jának másolata. Ennek belső felépítését lásd később.
27 byte hosszú kihasználatlan terület (31H...4BH)
Kódolt filenevek területe (4CH...87H)
Ezen a 60 byte hosszú területen minden lehetséges file-hez tartozik egy byte, mégpedig az első byte a file-directory-ban első file-hoz tartozik, a második byte a második file-hoz, stb. Ha az adott file létező file, akkor a neki megfelelő byte-ra a file nevéből képzett 1 byte-os kód kerül. A kódot, úgy képezzük, hogy a 8 karakterre kiegészített file-név karakterkódjainak MOD 256-os összegét vesszük. Ezek a kódok a file-név szerinti keresést gyorsítják meg.
A directory térkép
A T0/S1 utolsó 120 byte-ját a directory térkép foglalja le. Ez a térkép nem más, mint egy táblázat, amely az egyes 25 byte hossza file directory-k lokalizálását szolgálja a T0 track s2....s7 szektorain belül. A 120 byte-os terület 60 db 2 byte széles, un. directory pointer-t foglal magába. Az első pointer (88H,89H) a file directory-n belül az első file-helyhez tartozik, a második pointer (8AH,8BH) a másodikhoz, stb. Az említett 25 byte-os file-helyeket, amelyek a T0 track s2....s7 szektorait foglalják le file directory-knak nevezzük, és részletes felépítésükről a következő pontban lesz szó. A 2 byte-os directory pointer a 3-5. ábrán látható, bitenkénti bontásban.
1 byte:
3-5. ábra
2 byte: Az illető file directory legelső byte-jának relatív címe az adott szektoron belül. Ez a byte a következő értékeltet veheti fel: 00H, 19H, 32H, 4BH, 64H, 7DH, 96H, AFH, C8H, ill. E1H
T0 S2...S7 felépítése
Ezek a szektorok tartalmazzák az un, file directory-kat. Minden lehetséges file-hoz tartozik egy-egy 25 byte hosszú terület, a file directory-ja, amely ha a file létezik, az adott file-re vonatkozó adatokat tartalmazza. Egy-egy szektor 10 file directory-t tartalmaz, a szektor legutolsó 6 byte-ja kihasználatlan. A file directory felépítése a következő. (Az egyes byte-okat a file directory legelső byte-jától kezdve 00H-tól 18H-ig számozzuk).
00H
- FFH, ha a file directory nem tartalmaz létező file-t,
- A file típuskódja, ha a file directory létező file-t tartalmaz. A file típuskódja:
0: BASIC program a változóival
1: Számtömb
2: Karaktertömb
3: CODE vagy SCREEN$ file01H...08H A file neve szükség szerint space-ekkel 8 karakterre kiegészítve. 09H, 0AH Kihasználatlan (Tartalma 20H, 20H vagy 00H, 00H) 0BH, 0CH A file hossza (0BH - LO, 0CH - HI) 0DH, 0EH, 0FH, 10H Ezen byte-ok tartalma a file típusától függ (A nem specifikált értékek definiálatlanok.) Típuskód = 0
(BASIC)0EH: 80H, ha a file LINE megadása nélkül lett SAVE-elve.
0DH, 0EH: A LINE után megadott sorszám, egyébként. (0DH - LO)
0FH10 10H: A program hossza változók nélkül (0FH - LO)
Megjegyzés: 0FH,10H=(vars)-(prog), 0BH,0CH=(E-LINE)-(PROG)+1Típuskód = 1 vagy 2
(tömb)0EH tartalma:
(3-6. ábra)
Megjegyzés: A tömb betűjelének kódja nem más, mint a tömb betűjelének kisbetűs megfelelőjének ASCII kódja mínusz 60H.Típuskód = 3
(CODE)0DH, 0EH: Az a memória kezdőcím, ahonnan a file mentése történt. (0DH - LO)
0FH, 10H: 00, 00, ha a file rögzítésekor nem specifikáltak futtatási kezdőcímet. Ha igen, akkor a lezdőcím.11H A file attributumbyte-ja, amelynek felépítését a 3-7. ábra mutatja:
3-7. ábra12H A file egyszeri rögzítéséhez szükséges szektorok száma mínusz 1. 13H, 14H A file (ill. kétszeresen rögzített file esetén a fő file) első szektorpointerének címe a térkép területén belül. E két byte telepítését a 3-8. ábra mutatja.
3-8. ábra15H A file utolsó byte-jánek sorszáma (0..255) a file utolsó szektorában. 16H, 17H Kétszeresen rögzített file esetén a mellék-file első szektorpointerének címe a térpép területén belül. Lásd: 3-8. ábra. 18H Az adott file-directory sorszáma. (0...59D)
3.2.2. A térkép felépítése
A térkép-terület az adatterület struktúráját írja le. Az egyes file-ok szektorainak a diszken való elhelyezkedése a térkép alapján követhető nyomon. A térpép-területen az adat-terület minden egyes szektorához tartozik egy 40 bit széles, un. szektorpointer. Ha a diszken egy több szektorból álló file-t hozunk létre, akkor ezekből a szektorpointerekből egy ún. Lánc keletkezik, amely annyi szektorpointert tartalmaz, ahány szektorból áll a file. Kétszeresen rögzített file esetén mind a fő, mind a mellék-file-hoz külön tánc tartozik. A lánc (illetve láncok) első elemének a térképterületen belüli címét a file directory 13H, 14H, (ill. 16H, 17H) byte-jai tartalmazzák. A szektorpointer 5 féle információt tartalmaz:
1. Jó, vagy hibás-e a szektor,
2. tartozik-e file-hoz, vagy nem,
3. a szektor adatterületen belüli címe,
4. 5. és a megelőző és a következő szektorpointer címe.
A szektorpointer felépítését a 3-9. ábra mutatja.
4. A SPECCY-DOS szubrutinok áttekintése
Idáig haladva az olvasásban az olvasó már eleget tud a SPECCY-DOS-ról ahhoz, hogy a következő pontokat, amelyet a SPECCY-DOS szubrutinjait ismertetik, maradéktalanul megértse. E pontban, röviden áttekintjük az ismertetésre kerülő szubrutinokat, amelyeket két csoportra oszthatunk, miszerint
1. változó című szubrutinok és
2. kötött című szubrutinok.
A változó című: szubrutinokra jellemző, hogy belépési címeik a SPECCY-DOS egyes verzióiban eltérőek lehetnek. Arról, hogy hogyan lehet e szubrutinokat verziótól függetlenül hívni, a következő fejezet ad felvilágosítást.
A kötött című szubrutinok körébe elsősorban restart területen futó szubrutinokat sorolunk, másrészt olyan belépési pontokat, amelyeknek címe egyéb okokból verziótól függetlenül kötött. A 4-1. táblázat a változó cirom szubrutinok, a 4-2. táblázat a kötött című szubrutinok és belépési pontok funkcióit tartalmazza. (Az alkalmazott elnevezések természetesen nem kötelező jellegűek, a felhasználó módosíthatja őket).
Változó című szubrutinok |
||
Nr. | Név | Funkció |
1 | SAVE | Ugyanaz, mint a SAVE#... DOS-BASIC parancs funkciója. |
2 | LOAD | Ugyanaz, mint a LOAD#... DOS-BASIC parancs funkciója. |
3 | DELETE | File törlése a diszkről. |
4 | COPY | Ugyanaz, mint a COPY#... DOS-BASIC parancs funkciója. |
5 | RENAME | File átnevezése a diszken. |
6 | SRFILE | Adott file filenév alapján való megkeresése a diszken. |
7 | CREFIL | Adott méretű, típusú és nevű üres file létrehozása a diszken. |
8 | COLECT | Adott file-hoz tartozó adatterület-beli szektorcímek kigyűjtése a memóriába. |
9 | FLREAD | Megnyitott file N-edik szektorának leolvasása. |
10 | FLWRITE | Megnyitott file N-edik szektorának írása. |
11 | RDFILE | Megnyitott file összes szektorának leolvasása. |
12 | WRFILE | Megnyitott file összes szektorának felírása. |
13 | SECTRD | Adott diszk-szektor leolvasása fizikai címe alapján. |
14 | SCWRIT | Adott diszk-szektor felírása fizikai címe alapján. |
15 | RDYCON | Drive működésre kész állapotának ellenőrzése. |
16 | TYPONE | 1-es típusú FDC parancsok kiadása. |
17 | HEXDC1 | 8 bites hexadecimális decimális konverter. |
18 | HEXDC2 | 16 bites hexadecimális decimális konverter. |
19 | ERASE | Képernyő és attributum-terület törlése. |
4-1. táblázat
Kötött című szubrutinok |
|||
Nr. | Név | Cím | Funkció |
20 | ERROR | 0010H | Program futásának megszakítása hibajelzéssel. (Nem valódi szubrutin, nem tér vissza a hívás helyére.) |
21 | DSTRAM | 0018H | Szöveg kiírása a képernyőre, vagy ZX printerre. |
22 | BASRUT | 0028H | BASIC ROM-ban lévő szubrutinok hívása, ha a DOS van kiválasztva. |
23 | IDENTS | 0030H | Diszk azonosítása. |
24 | ROMXCG | 0046H | Visszaváltás a DOS ROM-ról BASIC ROM-ra. (Nem valódi szubrutin, nem tér vissza a hívás helyére.) |
4-2. táblázat
5. A SPECCY-DOS szubrutinjainak hívása más programok által
Ebben a fejezetben azokat a tudnivalókat ismertetjük, amelyen a SPECCY-DOS szubrutinjainak felhasználói programból való hívására általánosan, azaz a hívott szubrutin egyedi tulajdonságaitól függetlenül érvényesek.
5.1. ROM váltások
Általános esetben a BASIC RAM -ban futó felhasználói program mind a BASIC-ROM, mind a SPECCY-ROM szubrutinkészletét használhatja. Ehhez természetesen az szükséges, hogy az adott szubrutin meg hívása előtt a megfelelő ROM legyen kiválasztva. Mindaddig, amíg a DOS van kiválasztva, az interrupt-oknak letiltva kell lenniük. A felhasználói program sematikus folyamatábráját a fentiek alapján az 5-1. ábrán láthatjuk.
5-1. ábra
1. Kiindulás BASIC-ből. 2,6,; saját műveletek végzése a BASIC RAM-ban, miközben mindegy, hogy a BASIC ROM (2), vagy a SPECCY-ROM (6) van kiválasztva.
3. A BASIC ROM szubrutinjainak hívása. 4./ Átváltás SPECCY ROM-ra.
5. A SPECCY ROM szubrutinjainak hívása. 7./ Visszaváltás BASIC ROM-ra.
8. Visszatérés BASIC-be, azaz a program vége.
5.2. A változó című SPECCY szubrutinok hívása
A 4-1. táblázatban közölt SPECCY-DOS szubrutinok ROM-beli címe az idő haladtával kibocsátott mind nagyobb tudású verziókban eltérő lehet jóllehet, az eltérések kicsik, első közelítésben, ez mégis lehetetlenné tenné olyan felhasználói programok készítését, amelyek módosítás nélkül minden verzióval kompatibilisek. Az ennek a problémának a megoldására a SPECCY-DOS-ban alkalmazott eljárás lényege, hogy az aktuális hívási címek az adott ROM! verzió és egy un. referencia táblázat birtokában egvszerű számítással software úton meghatározhatók, azaz a szubrutinok verzió függetlenül hívhatók. A referencia táblázat az egyes szubrutinokhoz tartozó un. -referencia címeket tartalmazza. Az egyes ROM verziókban, a verziótól független rögzített címeken az egyes szubrutinok referencia címeinek és aktuális címeinek különbsége találkató meg, 8 biten ábrázolva.
Ennek az un. offset byte-nak a felépítése az 5-2. ábrán látható.
5-2. ábra
Az OFFSET definíciója: OFFSET = (aktuális cím) - (Referencia cím)
S-0: Az OFFSET előjele:
0, ha OFFSET >=0
1 egyébként
ABS-OFFSET: az OFFSET abszolút értéke 0.127
Az egyes SPECCY szubrutinok referencia címeit és a hozzájuk tartozó OFFSET byte-ok SPECCY-ROM-beli címeit az 5-1 táblázat mutatja. Ezen információk birtokában a felhasználónak megvan a lehetősége, a kívánt szubrutinok verzió-független hívására. Mi a következőkben két kidolgozott módszert ismertetünk, az un. Általános hívást és az egyedi hívást.
CODE | Szubrutin neve |
Referencia cím |
OFFSET byte címe |
Bemeneti regiszterhasználat |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
SAVE LOAD DELETE COPY RENAME SRFILE CREFIL COLECT FLREAD FLWRITE RDFILE WRFILE SECTRD SCWRIT RDYCON TYPONE HEXDC1 HEXDC2 ERASE |
0E29H 0E45H 106FH 1184H 111FH 0669H 073BH 0A93H 0BF6H 0C4FH 0D06H 0D61H 01A4H 0211H 012AH 1D14H 00ABH 00BEH 13AFH |
1FFFH 1FFEH 1FFDH 1FFCH 1FFBH 1FFAH 1FF9H 1FF8H 1FF7H 1FF6H 1FF5H 1FF4H 1FF3H 1FF2H 1FF1H 1FF0H 1FEFH 1FEEH 1FEDH |
IX, HL IX, HL H, L D, E, H, L D, E, H, L A, H, L A, H, L A A, B, H, L A, B, H, L A, H, L A, H, L D, E, H, L D, E, H, L - - E D, E - |
CODE: Az általános hívásnál használt szubrutinkód.
5.2.1. Általános hívás
A változó című SPECCY-DOS szubrutinok általános hívásának lényege, hogy az egyes szubrutinok egyedi hívása helyett mindig ugyanazt a szubrutint hívjuk, és egy 1 byte-os kóddal tudatjuk ezzel a szubrutinnal, hogy melyik szubrutint kívántuk meghívni. Ha ezt a közös szubrutint SPECCY szubrutinnak nevezzük, akkor az általános hívás a következőképpen néz ki:
CALL SPECCY
DB SRCODE
ahol SRCODE a meghívandó szubrutin kódja (1...19). Az egyes szubrutinokhoz tartozó kód az 5-l. táblázat első oszlopában található meg. A SPECCY szubrutin, amely a felhasználói program része, a szubrutinkód és a referenciatáblázat ismeretében kiszámítja az adott szubrutin aktuális címét, anélkül, hogy a regiszterek tartalmát módosítaná, majd a vezérlést a kívánt szubrutinnak adja át úgy, hogy az lefutása után az eredeti hívási helyre tér vissza. Az általános hívás egyetlen hátránya, hogy a SPECCY szubrutin, a referenciatáblázattal együtt 79 byte programterületet igényel. A SPECCY szubrutint Z80 gépi kódban az 5-3 ábra mutatja.
5-3. ábra
Az ábra első része a SPECCY szubrutin, második része pedig a referenciatáblázat, amelyet az 5-1. táblázatból képeztünk. A szubrutin és a táblázat egymástól függetlenül a programterület bármely részén elhelyezhető, azonban a SPECCY szubrutinnak, ismernie kell a referenciatáblázat kezdőcímét. Ha például a referenciatáblázat kezdőcíme 8000H, akkor HH és XL értéket a következőképpen számítjuk ki:
XH = 8000H - 2H = 7FFEH
XL = 7FH és XL = FEH
Az általános hívást akkor célszerű hasznáni, ha viszonylag sok SPECCY-DOS szubrutint használunk egy programban és / vagy ha elegendő terület áll rendelkezésre.
5.2.2. Egyedi hívás
Az egyedi kivés lényege, kegy a felhasználói programban minden egyes hívandó változó című szubrutinhoz tartozik egy kis, néhány byte-os szubrutin, ami az adott szubrutin címhelyes hívásáról gondoskodik. Szükség van még egy, ugyancsak rövid, az egyedi szubrutinok által közösen használt szubrutinra, amit itt "COMCAL"-nak neveztünk el. Az egyedi szubrutinoknak célszerűen a SPECCY-DOS-ban is használt neveket adhatjuk. Így pl. a SAVE nevű SPECCY-DOS szubrutin hívása a felhasználói programban CALL SAVE lesz. Az egyedi szubrutinok felépítése a következő:
PUSH HL PUSH AF LD HL,REFADDR LD A,(OFFS-ADDR) CALL COMCAL POP AF EX (SP),HL RET |
; REFADDR: a meghívandó SPECCY-DOS ; szubrutin referenciacíme ; OFFS-ADDR: ameghívandó SPECCY-DOS ; szubrutin offset byte-jának címe ; Ezek konkrét értékeit az 5-1. táblázatból ; vehetjük. |
Az alábbi két példa a SAVE és az ERASE nevű SPECCY-DOS szubrutinhoz tartozó egyedi szubrutinokat mutatja, a szubrutinok eredeti neveit megtartva.
SAVE: | PUSH HL PUSH AF LD HL,0E29H LD A,(1FFFH) CALL COMCAL POP AF EX (SP),HL RET |
ERASE: | PUSH HL PUSH AF LD HL,13AFH LD A,(1FEDH) CALL COMCAL POP AF EX (SP),HL RET |
Az egyedi szubrutinok által közösen hívott, itt "COMCAL"-nak nevezett szubrutin a következő:
COMCAL: ADDR-DONE: |
BIT 7,A PUSH DE PUSH AF AND 7FH LD E,A LD D,0 SBC HL,DE POP AF JR NZ,ADDR-DONE ADD HL,DE ADD HL,DE POP DE RET |
; A COMCAL szubrutin a hívandó ; SPECCY-DOS szubrutin aktuális címét ; (output-HL) számítja ki a ; referenciacím ; (input-HL) és az offsetbyte ; (input-A) ; alapján. |
Megjegyezzük, hogy az egyedi szubrutinok hossza esetenként tovább csökkenthető, ha kihasználjuk, hogy nem minden regiszter tartalmának kell változatlanul maradnia az egyedi szubrutin belépési pontjától a SPECCY-DOS szubrutin belépési pontjáig. Ez a hívott szubrutin bemeneti interface-étől , az általa módosított regiszterektől és magától a felhasználói programtól függ. Ezért tüntettük fel az 5-1. táblázatban a bemeneti regiszterhasználatot is. Pékdául a fenti ERASE szubrutin hossza 10 byte-ra csökken, ha A és HL módosítható:
ERASE: | LD HL,13AFH LD A,(1FEDH) CALL COMCAL JP (HL) |
6. A SPECCY-DOS RAM-területe
A SPECCY-DOS RAM-területe a 2000H-23FFH címeket foglalja le. Ennek az 1 byte-nyi területnek a rendszer csak egy részét használja. A 2320H-23FFH közötti 224 byte hosszú terület szabad, ezt a felhasználói programok minden megkötés nélkül használhatják, A falhasználó saját felelőségére a 2000H-231FH közötti területet is használhatja, ez esetben azonban fennáll annak a lehetősége, hogy a SPECCY-DOS szubrutinok hívásakor ennek a területnek egyes részei felülíródnak. Adott esetben próbálkozással dönthetjük el, hogy a használni kívánt terület egy konkrét felhasználói programban használható-e, vagy nem. Ezt azonban csak akkor tegyük, ha a 2320H - 23FFH közti terület nem elegendő. Megadunk azonban olyan címeket, amelyeknél biztos, hogy nem íródnak felül feltéve, hogy az e kézikönyvben közölt SPECCY-DOS szubrutinokat használjuk. Ezek a következők:
2001H ... 200DH; 20A4H ... 20CBH; 22CDH ... 2317H
Ez további 128Byte-ot jelent a felhasználói programok változóinak számára.
A rendszer által használt RAM terület egyrészt bufferekre, másrészt memóriaregiszterekre oszlik. A DOS által használt bufferterületek a következők:
DUSBUF: | 20CCH ... 21CBH | A rendszer 256 byte-os fő buffere |
PRTBUF: | 21CCH ... 22CBH | 256 byte-os buffer, főként az aktuális file szektorcímeinek tárolására. |
UNIBUF: | 2064H ... 2083H | 32 byte-os, változó célokra használt buffer |
DIRBF0: | 2024H ... 203CH | 2 db 25 byte-os buffer, az aktuális file(ok) file directory-jának tárolására. |
DIRBF1: | 203DH ... 2055H |
Azoknak a memóriarekeszeknek a címét és felhasználási módját, amelyeknek ismerete a felhasználó számára fontos lehet, a velük kapcsolatos szubrutinoknál ismertetjük. Végül emlékeztetünk arra, hogy a DOS-RAM csak akkor hozzáférhető, ha a DOS van kiválasztva.
7. A SPECCY-DOS szubrutinjainak ismertetése
E fejezetben az egyes SPECCY-DOS szubrutinok konkrét software interface-eit ismertetjük. A CCPY szubrutin kivételével minden itt ismertetett szubrutinra vonatkozik, hogy az adott diszk művelet azon a drive-on történik, amelyik a szubrutin meghívásakor ki van jelölve. Ezt a 3841H címre legutoljára kiadott kódszó határozza meg, és ugyanezt a kódszót kell tartalmaznia a DFLAG1 nevű, 2000H című memóriarekesznek is (lásd 2.1. pont). Hasonlóképpen, az ismertetett szubrutinok gondoskodnak arról, hogy kilépéskor DFLAG1-ben a 3B41H-ra legutoljára kiadott kódszó található.
SAVE | Ugyanaz a funkciója mint a SAVE#... DOS-BASIC parancsé. |
Input: |
|
Output: |
- |
Modified: |
A, F, B, C, D, E, H, L |
A 18 byte hosszú terület felépítése és HL tartalma.
A terület byte-jait 00H-tól 11H-ig számozzuk. Az itt nem definiált értékek nullák.00H: A létrehozandó file típuskódja:
00: BSIC program a változóival
01: Számtömb file
02: Karaktertömb file
03: CODE vagy SCREEN$ file01H.08H: A file neve (ASCII) szükség szerint space-ekkel (20H) 8 karakterre kiegészítve, hasznos karakterek balra helyezve. Megjegyzés: "filenév" alatt a továbbiakban mindig ezt kell érteni!
09H, 0AH: Tartalék byte-ok. Tartalmuk: 00H, 00H.
0BH, 0CH: A létrehozandó file hossza, azaz byte-jainak száma. Megjegyzés: itt, és a továbbiakban is, a két byte széles értékek első byte-ja az alacsonyabb, a második a magasabb helyértékű.
0BH, 0CH értéke a különböző file típusok esetén. (Lásd még SPECTRUM leírás).
típuskód (004) (0BH, 0CH) = A file hossza. 00H (BASIC) (E-LINE) - (PROG) +1 01H, 02H (tömb) A tömb hosszleírója által meghatározott érték. 03H (CODE) A diszkre mentendő byte-ok 0DH, 0EH, 0FH, 10H: Ezen byte-ok értelmezése a file típusától függ:
típuskód = 00H (BASIC)
- 0EH: 80H-át tartalmaz, ha a programot LINE megadása nélkül kívánjuk SAVE-elni.
- DH, 0EH: az autorun sorszámot tartalmazza, egyébként.
- FH, 10H: a program változók nélkül vett hosszát tartalmazza.
típuskód = 01H vagy 02H
- 0EH tartalmát a 3-6. ábra mutatja (3.2.1 fejezet)
Megjegyzés: A tömb betűjelének kódja nem más, mint a tömb betűjelének kisbetűs megfelelőjének ASCII kódja mínusz 60H.
típuskód = 03H
- 0DH, 0EH a diszkre mentendő memóriaterület kezdőcímét tartalmazza.
- 0FH, 10H a futási kezdőcímet tartalmazza, ha ez a 0DH, 0EH tartalmától eltérő, egyébként nulla.
11H: A létrehozandó file attributumait tartalmazza. Felépítése a 3-7. ábrán látható (3.2.1 fejezet), azzal a kiegészítéssel, hogy jelen esetben B7 (MSB)=0.
Az input HL tartalma a különböző file-típusok esetén (lásd még a SPECTRUM leírás 24 fejezetét):
típuskód (00H) input HL 00H (BASIC)
01H, 02H (tömb)
03H (CODE)
(PROG)
A tömb hosszleíróját követő byte címe
A diskre mentendő terület kezdőcíme
(azonos 0DH, 0EH-vel)
LOAD | Ugyanaz a funkciója mint a LOAD#... DOS-BASIC parancsé. Az egyetlen kivétel az, hogy olyan BASIC file-ok betöltésekor, amelyeket LINE megadásával rögzítettek, a betöltött BASIC program nem kezd azonnal futni, mint a LOAD#-nál. |
Input: |
|
Output: |
- |
Modified: |
A, F, B, C, D, E, H, L |
A 18 byte hosszú terület felépítése és HL tartalma.
A terület első 11 byte-jának tartalma teljesen megegyezik a SAVE szubrutinnál tárgyalt 18 byte-os leíróterület első 11 byte-jának tartalmával. A többi byte tartalma a file típusától függ. Az itt nem definiált byte-ok 00H-t tartalmaznak.Típuskód = 00H:
0BH, 0CH a SPECTRUM-ban pillanatnyilag tartózkodó BASIC program és változóinak együttes hosszát tartalmazza.
0FH, 10H: a program önmagában vett hosszát tartalmazza, azaz 0FH.
10H = (VARS) - (PROG)
input HL = (PROG)Típuskód = 01H vagy 02H (tömb):
0BH, 0CH a betöltendővel azonos nevű tömb hosszát tartalmazza, ha van ilyen a SPECTRUM-ban.
Input HL: a betöltendővel azonos nevű tömb hosszleíróját követő byte címét tartalmazza, ha van ilyen. HL=0, ha nincs ilyen tömb.
Típuskód = 03H (CODE):
0BH, 0CH a betöltendő program megengedhető maximális hosszát tartalmazza, ha specifikáljuk. 0BH, 0CH = 00, 00, ha nem.
Input HL: a betöltési kezdőcím, ha specifikáljuk. HL=0000 egyébként.
DELETE | File törlése a diszkről (Lásd: ERASE# parancs) |
Input: |
|
Output: |
- |
Modified: |
A, F, B, C, D, E, H, L |
COPY | File másolása (Lásd a COPY# DOS-BASIC parancs) | ||||||
Input: |
|
||||||
Output: |
- | ||||||
Modified: |
A, F, B, C, D, E, H, L |
Egy drive-on belüli másolás esetén a rendszer mindig lehetőséget ad arra, hogy a forrás és az output-diszk különböző legyen, ha a másolást BASIC-ből végezzük. Ehhez azonban szükséges, hogy a fordulók között valaki leüsse az ENTER gombot. A COPYFG által való választási lehetőség az egy drive-on belüli, egy diszken való automatikus (ENTER nélküli) másolást teszi lehetővé.
RENAME | File átnevezése |
Input: |
|
Output: |
- |
Modified: |
A, F, B, C, D, E, H, L |
SRFILE | Adott nevű file megkeresése a diszken. Ha a file létezik, akkor a szubrutin a file directory-ját bemásolja a kívánt bufferbe. |
Input: |
|
Output: |
|
Modified: |
A, F, B, C, D, E, H, L |
CREFIL | Formálisan teljesen kész, de még "üres" kitöltetlen file létrehozsa a diszken, azaz a szükséges adatterület lefoglalása és a file bejegyzése a diszk directory-ba. A kialakult file directory bemásolása a DIRBF0 / DIRBF1-be. |
Input: |
|
Output: |
DIRBF0-ban, ill. DIRBF1-ben a file kialakított directory-ja. |
Modified: |
A, F, B, C, D, E, H, L |
A szubrutin által létrehozott file csak abban tér el egy kész file-tól, hogy az adatterülete nem tartalmaz hasznos adatot.
COLECT | A COLECT szubrutin adott file szektorcímeinek írás, vagy olvasás céljából való összegyűjtésére szolgál. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A bufferméretek korlátozott volta miatt egy fille-hoz tartozó szektorcím nem mindig gyűjthető egyszerre össze. Ezért a COLECT szubrutin ciklikus hívásra készült. A szektorcímek kigyűjtése a PRTBUF bufferbe történik. A szubrutin vagy a teljes PRTBUF-ot, vagy csak egyik felét tölti le, attól függően, hogy egyidejűleg csak egy, vagy pedig két file szektorcímeire van szükségünk. Ha a file kétszeres rögzítésű, akkor a szubrutin a PRTBUF-nak, (illetve valamelyik felének) az alsó felét a fő file, a felső felét a mellék-file azonos adattartalmú részeinek szektorcímeivel tölti fel. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Input: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Output: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Modified: |
A, F, B, C, D, E, H, L |
FLREAD | Olvasásra előkészített file N-edik szektorának kiolvasása tetszőleges memóriacímre. |
Input: |
|
Output: |
A DRBPTB regiszter input-ban meghatározott B6 vagy B7 bitjén a bemeneti érték, ha nem történt olvasási hiba, illetve a bemeneti érték inverze, ha olvasási hiba történt, de a file kétszeres rögzítésű, és a párhuzamos "másik" file azonos sorszámú szektorának olvasása sikeres volt. (Ekkor vált át a file olvasása a fő-file-ról a mellék-file-ra, ill. fordítva.) |
Modified: |
A, F, B, C, D, E, H, L |
A file olvasásra előkészített, ha a fenti input specifikációk teljesülnek.
A szubrutin ciklikus hívásra készült, de másként is használható.
N-nek teljesíteni kell a következő feltételt: FSNRMIN <= N <= FSNRMAX. Ellenkező esetben ERROR 53 keletkezik.
FLWRITE | Írásra előkészített file N-edik szektorának írása tetszőleges memóriacímről. |
Input: |
|
Output: |
- |
Modified: |
A, F, B, C, D, E, H, L |
A szubrutinra az FLREAD szubrutinnal közös megjegyzések vonatkoznak. (Lásd FLREAD)
RDFILE | Olvasásra előkészített file összes szektorának beolvasása adott memóriacímtől kezdve. |
Input: |
|
Output: |
- |
Modified: |
A, F, B, C, D, E, H, L |
A file olvasásra előkészített, ha a fenti input specifikációk teljesülnek.
WRFILE | Írásra előkészített file összes szektorának felírása adott memóriacímtől kezdve. |
Input: |
|
Output: |
- |
Modified: |
A, F, B, C, D, E, H, L |
A file írásra előkészített, ha a fenti input specifikációk teljesülnek.
SECTRD | A diszk tetszőleges szektorának beolvasása. | ||||||||||||
SCWRIT | A diszk tetszőleges szektorának írása. | ||||||||||||
Input: |
|
||||||||||||
Output: |
A-ban 0, ha a művelet sikeres volt, hibakód, ha a művelet sikertelen volt. Hibakódok: Ha B2=1, akkor "LOST DATA" hiba keletkezett, azaz a software nem volt képes elég gyorsan kiszolgálni az FDC-t.
Megjegyzendő, hogy a software semmilyen esetben nem ír felül 256 byte-bál többet az FDC felé. |
||||||||||||
Modified: |
A, F, B, D, E |
A szubrutin az írás ill. olvasás előtt a keresett szektor lokalizálását is elvégzi, azaz a szubrutin meghívásakor nincs követelmény az író-olvasó fej helyzetére nézve.
Sikertelen lokalizálási kísérlet után a szubrutin a szektor lokalizálását még négyszer megkísérli, és csak ezután adja vissza a vezérlést A-ban hibakóddal. Ha a keresett track-et nem sikerül lokalizálni, akkor az egyes kísérletek között a szubrutin az író-olvasó helyzetét újrakalibrálja (RESTORE művelet). Ez a fejnek a T0 fölé vitelét jelenti.
Ha a keresett szektort maximum 5 kísérletből sikerül lokalizálni, akkor a szubrutin megkísérli az olvasást ill. az írást, és ha az első kísérlet sikertelen, akkor még maximum 5-ször megkísérli az olvasást. (Írás esetén csak lokalizálási hiba észlelhető a szektor teljes visszaolvasása nélkül, ami azonban több mint felére csökkentené a sebességet.) A szubrutin tehát max. 5 lokalizálási, ezután max. 6 olvasási kísérletet végez.
Meghíváskor a diszknek már névleges fordulatszámon kell lennie.
Írásvédő szalaggal írásvédett diszkre kiadott írási parancsot az SCWRIT szubrutin fatális hibának vesz, és hibajelzés (ERROR5) kíséretében a rendszerbe tér vissza. Az FDC státuszregiszterének olvasásával (lásd: 2.2 fejezet) a felhasználói program a hardware írásvédelmet érzékelheti.
RDYCON | A szubrutin a kiválasztott drive READY státuszának megvizsgálására szolgál. A szubrutin 1-es típusú FDC parancsok kiadására (lásd: TYPONE) után hívandó meg abban az esetben, ha nem akarjuk, hogy esetleges NOT READY státusz esetén a program futása hibajelzéssel megszakadjon. |
Input: |
- |
Output: |
CY = 0, ha a drive READY, CY = 1 egyébként. |
Modified: |
A, F |
Ha az RDYCON szubrutint akarjuk használni, akkor előtte a TYPONE szubrutin hívásakor a CONTRL-byte-ban B7=0-t kell specifikálnunk. (Lásd még TYPONE szubrutint).
Assembly példa vizsgálatára, ha esetleges "NOT READY" státusz esetén a vezérlést a programban kívánjuk tartani:
READY |
CALL SPECCY DB 16 D DB 0 CALL SPECCY DB 15 D JP C,NOT READY EQU $ |
; A TYPONE szubrutin ; általános hívása ; CONTRL / B7 = 0 ; Az RDYCON szubrutin ; általános hívása ; Elágazás, ha "NOT READY" ; Drive Ready |
TYPONE | A szubrutin az FDC ún. 1-es típusú (fejmozgató) parancsainak kiadására szolgál. E szubrutin eredményes használatához az FDC ismerete is szükséges. A szubrutin opcionálisan a drive "READY" státuszának vizsgálatára is alkalmas a megfelelő fejmozgató parancs kiadása után. |
Input: |
A szubrutin belépési pontján a stack tetején lévő cím által kijelölt memóriarekesz tartalma, amelyet a továbbiakban CONTRL byte-nak nevezünk. E byte bitenkénti értelmezését mutatja a 7-6. ábra: |
Output: |
- |
Modified: |
A, F |
A szubrutin hívásának javasolt módja a következő:
Álltalános
CALL SPECCY
DB 16D
DB CONTRLEgyedi:
CALL TYPONE
DB CNTRL
A szubrutin által kibocsátott FDC parancsok kódjait a 7-7 táblázat mutatja:
A végrehajtott parancs angol neve |
Fej léptetési idő (msec) |
|||
6 |
12 |
20 (2) |
30 (3) |
|
RESTORE | 0CH |
0DH |
0EH |
0FH |
SEEK WITH VERIFY | 1CH |
1DH |
1EH |
1FH |
SEEK WITHOUT VERIFY | 18H |
19H |
1AH |
1BH |
STEP IN | 58H |
59H |
5AH |
5BH |
Ha az input CONTRL byte-ban "READY" vizsgálatot is előírtunk, akkor "NOT READY" státusz esetén a szubrutin nem tér vissza a hívás helyére, hanem hibajelzéssel a rendszerbe tér vissza. Ha ez nem kívánatos, akkor a "READY" vizsgálatot az RDYCON szubrutinnal végeztessük el.
A szubrutin a STEP és a STEP OUT nevű fejmozgató FDC parancsok kiadására nem alkalmas.
HEXDC1 | 1 byte-os hexadecimális szám konvertálására 3 byte-os ASCII-ben ábrázolt decimális számmá. |
Input: |
E-ben a konvertálandó szám |
Output: |
A COUTBF nevű, 205CH kezdőcímű 3 byte hosszú területen az eredmény. A vezető nullák space-ekkel vannak helyettesítve. A COUTBF+2 címen MSB=1, mint text delimiter. |
Modified: |
A, F, D, E, H, L |
A szubrutin csak pozitív egész számok konvertálására alkalmas.
HEXDC2 | 2 byte-os hexadecimális szám konvertálására 5 byte-os ASCII-ben ábrázolt decimális számmá. |
Input: |
DE-ben a konvertálandó szám (D - HI, E - LO) |
Output: |
|
Modified: |
A, F, D, E, H, L |
ERASE | A képernyő teljes törlése, a képernyő attribútumok alapállapotba álltása és a képernyő pointernek a bal felső sarokba állítása. |
Input: |
- |
Output: |
Az SCRPOS nevű, 2057H című két byte széles rendszerváltozóban 0, azaz 0-ik oszlop, 0-ik sor. E rendszerváltozóról lásd bővebben a DSTRAM szubrutinnál. |
Modified: |
- |
ERROR (cím: 10H) |
Az ERROR belépési ponton hibajelzés kíséretében térhetünk vissza DOS-ból. BASIC parancsmódba. |
Input: |
A stack tetején lévő cím. Ha e cím által kijelölt memóriarekesz tartalma nem nulla, akkor ez az érték a kijelzendő hibakód, ha pedig nulla, akkor a hibakód az A regiszterben van. |
Ha a hibakód az FDC-től származik, és az A regiszterben van, akkor a hibakód konverzió történik, amelynek eredményeképpen előálló végleges hibakód 1, 2 vagy 3 lehet aszerint, hogy az FDC 7-5. ábrán látható státuszbitjei közül B2, B3, vagy B4 a legmagasabb helyértékű 1-es bit.
Ha a hibakód < 17, akkor a hibakód kiíratását az ismert szöveges hibajelzés kíséri. Egyéb esetben szöveges hibajelzés nem lehetséges.
A felhasználói programok járulékos hibajelzéseinek számozására fenntartott hibakód tartomány: 100.199.
1. példa: Hibajelzés szektorolvasási hiba esetén:
CALL SPECCY DB 13H AND A JP Z,READ_OK RST ERROR DB 0 |
; SECTRD szubrutin ; általános hívása ; (Hibakód A-ban) ; Hibavizsgálat, és eéugrás, ; ha nem volt olvasási hiba. ; Hiba esetén visszatérés BASIC-be. ; Hibakód az A regiszterben. |
2. példa: Hibajelzés felhasználói program olyan részén, ahol a DOS van kiválasztva, 152-es hibakóddal.
RST ERROR DB 152D |
; Visszatérés BASIC-be ; A kezelendő hibakód |
DSTRAM (cím: 18H) |
A DSTRAM szubrutin szövegeknek a képernyőre, vagy ZX printerre való kiíratására szolgál. A kiírandó szövegnek a memóriában kell lennie ASCII karakterek formájában. A szöveg delimitere a legutolsó kiküldendő byte 1-beállított B7 (MSB) bitje. Ha a kiíratás a képernyőre történik és a szubrutin eléri a képernyő jobb alsó kiírási pozícióját, a kiírás átmenetileg megáll és SCROLL? Kérdés jelenik meg. Ez esetben 'n' vagy 'N' beütésére a szubrutin működése megszakad, 'y', 'Y' vagy ENTER leütésére a képernyő beállítható számú sorral feljebb tolódik, így, vagy a felső sorok elvesznek. |
Input: |
|
Output: |
|
Modified: |
F, ha SCROLL? Kérdésre 'n', vagy 'N' volt a válasz, egyéb esetben minden regiszter módosítatlan marad. |
Ha a hívó programban elágazás van, aszerint, hogy SCROLL? Kérdésre mi a válasz, biztosítani kell, hogy a szubrutin hívásakor CY=0 legyen.
(Lásd még ERASE szubrutin.)
BASRUT (cím: 28H) |
A BASIC ROM-ban lévő szubrutinok meghívása a DOS kiválasztott állapotában. |
Input: |
|
Output: |
Azonos a meghívott szubrutin outputjával. |
Modified: |
Csak a meghívott szubrutin módosítja a regisztereket. |
Hívás módja:
RST BASRUT DW BAS-ADDR |
; BAS-ADDR a meghívott ; BASIC szubrutin címe |
A szubrutin nem alkalmazható olyan BASIC szubrutinok hívására, amelyek módosítják az FFE0H címen kezdődő, 26 byte hosszú terület tartalmát.
IDENTS (cím: 30H) |
A diszk formátumának azonosítása. A szubrutin a következő paramétereket azonosítja:
|
Input: |
- |
Output: |
|
Modified: |
A, F, B, C, D, E, H, L |
Ha az írássűrűség nem felismerhető, a program furása megszakad és ERROR 15 hibaüzenet keletkezik. Ha a diszket nem SPECCY-DOS formálta, a program futása megszakad és ERROR 16 hibaüzenet keletkezik. Ha a drive nem "READY", a program futása ERROR 4 hibaüzenettel megszakad.
Bármely diszkhez való első hozzáfordulást az INDENTS szubrutin meghívásával ajánlatos kezdeni. Ezenkívül a felhasználói program futása során minden olyan programállapot után célszerű a szubrutin meghívása, ahol lehetőség volt az egyszer már azonosított diszk kicserélésére, még akkor is, ha ez bizonyos mértékben lassítja a felhasználói program futását.
ROMXCG (cím: 46H) |
A ROMXCG belépési pont a DOS kiválasztott állapotából a BASIC kiválasztott állapotába való végleges visszatérést valósítja meg a BASIC RAM tartalmának módosítása nélkül. |
Input: |
|
Modified: |
A, F, H, L Ezek a regiszterek módosulnak, mielőtt a vezérlés az input-ban megadott címre kerül. |
Ez a belépési pont használható, ha a visszaváltás a BASIC RAM-ban futó programmal bármely okból nem valósítható meg.
7.1 Nem verziófüggetlenül hívható szubrutinok
Az alábbiakban azoknak a rezidens SPECCY-DOS szubrutinoknak a software interface-eit ismertetjük, amelyek nem hívhatók verziófüggetlenül, azaz csak az adott SPECCY-DOS verzión belüli konkrét belépési cím ismeretében hívhatók. A szubrutinoknál a V4.0-ban érvényes belépési címet közöljük. Esetleges későbbi verziók megjelenése esetén ezek a belépési címek változhatnak.
INIT (V4.0: cím: 02C5H) |
Diszk formattálása és inicializálása. A szubrutin a FORMAT DOS-BASIC parancsot hajtja végre. |
Input: |
|
Output: |
- |
Modified: |
A, B, C, D, E, H, L, FLAG |
LIST, LLIST (V4.0: cím: 152AH) |
A LIST, ill. az LLIST DOS-BASIC parancs végrehajtása. |
Input: |
|
Output: |
- |
Modified: |
A, B, C, D, E, H, L, FLAG |
MERGE (V4.0: cím: 0F5FH) |
A MERGE DOS-BASIC parancs végrehajtása. |
Input: |
|
Output: |
- |
Modified: |
A, B, C, D, E, H, L, FLAG |
RNAMDS (V4.0: cím: 1186H) |
Diszk átnevezése , azaz a DEF FN DOS-BASIC parancs végrehajtása. |
Input: |
|
Output: |
- |
Modified: |
A, B, C, D, E, H, L, FLAG |
RUNCOD (V4.0: cím: 1480H) |
CODE típusú file betöltése és futtatása, azaz a RUN ... CODE DOS-BASIC parancs végrehajtása. |
Input: |
|
Output: |
|
Modified: |
A, B, C, D, E, H, L, FLAG |
A vezérlés átadásának pillanatában az interruptok engedélyezve vannak.
BOTSET (V4.0: cím: 13FEH) |
Az USR DOS-BASIC parancs végrehajtása. |
Input: |
|
Output: |
- |
Modified: |
A, B, C, D, E, H, L, FLAG |
BACKUP (V4.0: cím: 0F9AH) |
A MOVE DOS-BASIC parancs végrehajtása. |
Input: |
|
Output: |
- |
Modified: |
A, B, C, D, E, H, L, FLAG |
8. SPECCY-DOS rendszerváltozók
0000H - 1FFFH | DOS ROM |
2000H - 23FFH | DOS RAM |
2000H | DFLAG-1 (3B41H PSW) |
2001H - 200DH | Szabad RAM |
200EH | AREG (LIST+) |
2017H - 201BH | DRBPTB (FSNR kezdőcím) |
201CH | LSTMS0 kezdőcím |
2020H | LSTMS1 kezdőcím |
2024H - 203CH | DIRBF0 file directory puffer |
203DH - 2055H | DIRBF1 file directory puffer |
2056H | SECMAX max. sector / track |
2057H - 2058H | SCRPOS oszlop-sor |
205CH | COUTBF kezdőcím |
2062H | |
2064H - 2083H | UNIBUF változó célokra |
209FH - 20A2H | STRATE D0-D3 kijelölés |
20A4H - 20CBH | Szabad RAM |
20BBH | Target drive code (COPY) |
20C6H | Source |
20CCH - 21CBH | DOSBUF Rendszer fő puffer |
20E3H | NROLLS (Görgetés LIST) |
21CCH - 22CBH | PRTBUF Sectorcímek kigyűjtésére |
22CCH | COPY-FG (Másolás 1 drive-os rendszerben) |
22CDH - 2317H | Szabad RAM |
2320H - 23FFH | USER RAM |
3290H | FDC Status / Command reg. (Read / Write) |
3291H | FDC Track reg. |
3292H | FDC Sector reg. |
3293H | FDC Data reg, |
3B41H | HW - vezérlés |