Brányi László
Enterprise 128-as
ROM visszafejtése
0. szegmens
NOVOTRADE RT.
1989
Lektorálta: Lukács János
Szerkesztette: Stankovics János
SCAN&OCR: gafz, 2006
A kiadásért felel RÉNYI GÁBOR,
a Novotrade Rt. vezérigazgatója
Budapest, 1989
ISBN 963 585 037 9
Copyright @ Brányi László, 1989
1. Start, a rendszer inicializálása
2. EXOS rutinok
3. Blokkolvasó rutinok
4. Blokkíró rutinok
5. VIDEO eszközkezelő rutinok
6. SOUND eszközkezelő rutinok
7. KEYBOARD eszközkezelő rutinok
8. EDITOR eszközkezelő rutinok
9. Keresztreferencia táblázatok
9.1 A programban lévő címek keresztreferencia táblázata
9.2 IN/OUT címek
9.3 EXOS rutinok keresztreferencia táblázata
9.4 Indexregiszterekkel címzett memóriacímek
keresztreferencia táblázata
10. Karakterkészlet
11. Billentyűzet mátrix
12. Sorparaméter-blokk (line parameter blokk)
Ez a könyv az ENTERPRISE 128 számítógép ROM-jainak leírásával foglalkozik. Ebben a kötetben található az EXOS leírása, valamint a képet előállító VIDEO, a hangot előállító SOUND, a billentyűzetet kezelő KEYBOARD és a szöveget kezel& EDITOR leírása is. Ezek a 0. szegmensen levő ROM-ban (ROM 0) találhatók. A további kötetekbe kerül az EXOS folytatása, a szövegszerkesztő, a BASIC segédrutinok, az angol és a német BASIC interpreter.
A mikroprocesszor
Az ENTERPRISE 128 számítógép Z80A mikroprocesszorral működik, amely az egyik legelterjedtebb és legtöbb utasítást tartalmazó 8 bites processzor napjainkban. órajele maximum 4 MHz. Ez a processzor a 16 bites címzésével egyszerre csak 64 Kbyte memóriát tud kezelni, de az ENTERPRISE-ban a lapozásos módszerrel 256*16Kb=4Mb memória kezelésére is képessé tették.
A memória
A Z80A processzor egyszerre 64 Kbyte memóriát tud kezelni, amit felosztottak 16 Kbyte-os lapokra (PAGE 0,...,PAGE 3 - ezek a könyvben P0,...,P3-mal vannak jelölve). A kiosztás a következő:
lapszám memóriacím portcím
P0 0.lap 0000h-3FFFh B0h = 176
P1 1.lap 4000h-7FFFh B1h = 177
P2 2.lap 8000h-BFFFh B2h = 178
P3 3.lap C000h-FFFFh B3h = 179
A 16 Kbyte-os lapokra tehető 16 Kbyte-nyi cserélhető memória, amit szegmensnek nevezünk. A gépben 256 db szegmens van, ami 4 Mbyte nagyságú memóriát biztosít. Bármelyik szegmens belapozható a 4 lap bármelyikére vagy ugyanaz mind a 4 lapra egyszerre. Minden laphoz tartozik egy 8 bites I/O lapregiszter, a Z80-as egy I/O portján, amelynek értéke meghatározza az adott lapon elérhető szegmenst.
A B0h portcímre kiküldött érték határozza meg, hogy melyik szegmens kerüljön a 0. lapra. A B1h port az 1.lap, a B2h port a 2.lap, a B3h port a 3. lap értékét határozza meg. A gépen található szegmenseknek állandó azonosító számaik vannak, ezek:
00h ROM 0
01h ROM 1
02h Rendszernek fenntartva (a 02h a 0., 03h az 1. szeg-
03h menssel egyezik meg jelenleg)
04h-07h Cartridge-ban található 64 Kbyte memória, általában
04h-ra angol BASIC, 05h-ra német BASIC kerül
20h-21h Általában itt található a diszkkezelő program
F8h-FFh RAM, FFh-t (melyet rendszerszegmensnek nevezünk) álta-
lában a 2. lapra lapozza be az operációs rendszer. Itt
találhatók olyan lényeges dolgok, mint a rendszervál-
tozók, rendszerveremtár, RAM és ROM szegmenslisták,
stb.
FCh-FFh-ig terjedő szegmenseket a NICK chip is használja a kép előállítására, így ezek VIDEO RAM feladatot is ellátnak.
A DAVE chip
A DAVE chip a következő funkciókat látja el:
1. Hang generálása (3 hang + 1 zajcsatorna} sztereóban
2. Memórialapozások vezérlése
3. Megszakítások vezérlése (2 belső és 2 külső megszakítás)
4. Reset áramkör vezérlése
5. Be/kimeneti kapujelek
6. 1 MHz-es órajel generálása
7. Várakozási ciklusok generálása
A NICK chip
A NICK chip a kép előállítására szolgál. Egy képen belül többféle módot enged meg. Ez a chip az ENTERPRISE 128-as FCh, FDh, FEh, FFh szegmensen lévő memóriáját képes címezni, de a többit már nem. A NICK chip ezt a 64 K-t közvetlenül címzi anélkül, hogy a DAVE chip lapregisztereit használná.
RESET
Z80A A processzort alaphelyzetbe a RESET input jele állítja.
Ekkor a következő alaphelyzet áll elő:
PC = 00000h
I = 0
R = 0
Megszakítási mód = 0 (IM0)
Megszakítási maszk = Minden IT tiltott
DAVE Mind a 22 belső regiszter törlődik.
Következmény: mivel B0h,B1h,B2h és B3h portokra 0 kerül,
így a 0.,1.,2. és 3.lapra a ROM0 kerül.
EXOS a csatornaalapú operációs rendszer
Az EXOS (Extendable Operating System) az Enterprise számítógép bővíthető operációs rendszere. Illesztési lehetőséget biztosít az alkalmazói program és a gép hardvere között, valamint ellátja a tárkezelés feladatát is.
Az EXOS fő jellemzője a csatornaalapú I/O (In/Out=Be/Ki) rendszer, amely a perifériakezelők készletéből áll - ami azt jelenti, hogy egy adott perifériával folytatott információcseréhez először egy csatornát kell megnyitni.
Az EXOS lehetővé teszi, hogy egyidejűleg több csatornát nyissunk meg egyetlen perifériához, bár ezt bizonyos eszközök nem engedik meg.
A csatorna megnyitásához meg kell adni az EXOS számára a kért periféria nevét, az egy byte-os csatornaszámot, néhány esetben pedig be kell állítani az eszköz EXOS változóit is. Ez a perifériához egy kommunikációs utat (csatornát) létesít, amelyen át karaktereket küldhetünk mindkét irányba, akár egyenként, akár pedig általunk meghatározott méretű blokkokban, továbbá speciális parancsokat adhatunk a berendezésnek.
A csatornák mindaddig nyitva maradnak, ameddig a felhasználó le nem zárja ezeket vagy resetet nem hajt végre.
A be- és kiviteli rendszer perifériatípustól független kommunikációt tesz lehetővé számos beépített eszközzel, továbbá a felhasználói kiegészítő, pótlólagos perifériakezelőkkel is. A perifériakezelő (eszközkezelő) olyan gépi kódú program, amely tartalmazza az általa kiszolgált eszköz vezérléséhez szükséges összes rutint (alprogramot), mely szabványos illesztési lehetőséget (interface-t) nyújt az EXOS felé.
Jelen leírás az EXOS 2.1-es változatát tartalmazza.
A visszafejtésről
Bekapcsoláskor, illetve RESET esetén .a gép a ROM0-t mind a négy lapra (P0,...,P3) belapozza. Ilyenkor a Z80-as processzor a 0000h címen indul, azaz eloször a 0. lap 1. utasítását hajtja végre:
0000 F3 DI
Van, amikor a processzor a ROM0-t az 1. lapon látja (pl.: az eszközlánc elkészítésekor), van amikor a 2. lapon, de legtöbb esetben a 3. lapon.
Ezért a ROM visszafejtés úgy készült, mintha a ROM0 állandóan a 3. lapon lenne. Ahol ez nem így van ott ezt jeleztem.
Keresztreferencia
A könyv végén található egy keresztreferencia (hivatkozási) táblázat, amelyből megtudhatjuk, hogy az egyes rutinokat, változókat hol és hányszor használja a program. E táblázat segítséget nyújt a programok, valamint a ROM rutinok megértésében és követésében.
Jelölések
A könyvben található számok, ha nem áll mögöttük betű, tízes, ha 'h' betű áll mögöttük, akkor tizenhatos (hexadecimális), ha 'b' betű, akkor kettes (bináris) számrendszerben vannak. (Kivétel a visszafejtésben a cím és a byte-ok tartalma, mivel itt nincs 'h' betű a tizenhatos számrendszerbeli szám után.)
'*'-gal Jelöltem a beugrási pontokat és a táblázat címeit, amelyek a programban találhatók.
'+' jellel azokat a beugrási pontokat Jelöltem, amelyek a program áthelyezése után válnak értelmessé.
b0, b1, ... kifejezések az adott szám kettes számrendszerbeli alakjában az 1., 2., ... helyi értékén álló számot jelölik.
Végül szeretnék köszönetet mondani mindazoknak, akik munkámat segítették: Dr Sz. Lukács Jánosnak, a kötet lektorának hasznos tanácsaiért, Tarr Kálmánnénak és Erdősi Zoltánnénak, a NOVOTRADE kiadó munkatársainak, hogy lehetővé tették könyvem megjelenését, valamint feleségemnek, Brányiné Mokos Anikónak, aki áldozatos munkával megfelelő körülményeket teremtett számomra, és aki a kötet gépelésében, megírásában is segítségemre volt.
Brányi László
1. START, A RENDSZER INICIALIZÁLÁSA
Amikor a számítógépet feszültség alá helyezzük, akkor hidegindítást hajt végre. Ilyenkor a rendszer alapállapotba kerül. Az inicializáló program ellenőrzi a gépben lévő RAM-okat és ROM-okat, létrehozza a rendszerváltozók területét, rendszerprogramokat másol a RAM-ba. Inicializálja az eszközöket, meghívja a ROM-okat a 8-as inicializálási akciókóddal. Ezt követően lefut a bejelentkező program, a legvégén pedig meghívja a ROM-okat az 1-es hidegindítási akciókóddal.
A gép akkor is hidegindítást hajt végre, ha megnyomjuk a RESET gombot és az RST_ADDR változóban 0 van. Ugyanez játszódik le, ha az RST_ADDR változóban 0-tól különböző érték található, de a rendszerszegmens B217h címén és a ROM C3AAh címén lévő 59 byte különböző.
Ugyanígy hidegindítást hajt végre, ha a RESET jelzőben be van állítva a hidegindítást jelző bit és meghívjuk az RST 30h/00h (EXOS 0) rutint.
Ha megnyomjuk a RESET gombot és az RST_ADDR változóban 0-tól különböző érték található, valamint a RAM B217h címén lévő 59 byte megegyezik a ROM-ban lévő mintával, akkor melegindítást hajt végre a számítógép. Ilyenkor nem végzi el a RAM-ok vizsgálatát és a ROM-ok keresését. A felhasználónak kiutalt összes memória és az eszközkezelők is megmaradnak. Ezzel szemben lezárja az összes csatornát, felszabadítja a csatorna RAM területét és újra inicializálja az eszközöket. Ezek után a program az RST_ADDR változóban megadott címen folytatódik.
Bekapcsoláskor, amikor hidegindítás történik, vagy na megnyomjuk a RESET gombot a Z80-as processzor a 00000h címen található programot hajtja végre. Ebben az esetben a ROM0 a P0,P1,P2 és a P3-as lapon is megtalálható.
Szintén a ROM0 elején lévő rutint hajtja végre az RST 30h/00h (EXOS 0) hidegindítási kód esetén. Ilyenkor a P3-ra lapozza be a ROM0-t és a 0C000h címen indítja azt.
A program először letiltja a megszakításokat majd beállítja az 1-es megszakítási üzemmódot. Ennek hatására minden megszakításkor (ha engedélyezett) a 38h címen lévő rutint hajtja végre. Ezt követi a hardver jellemzők beállításához tartozó érték A-ba töltése.
* C000 F3 DI Megszakítások letiltása
4001 ED56 IM 1 1-es megszakítási üzemmód
beállítása
C003 3E04 LD A,004h 0000 0100b
b0 -> 64k beépített RAM
b1 -> 8 MHz-es óra
b2-b3 -> várakozás M1-nél
kivéve a video
RAM-ot
Az inicializálást a P3-un is megtalálható ROM0-ban folytatja.
C005 C32EC0 JP 0C02Eh Ugrás a P3-ra
Az eszközlánc kezdőcíme (első a VIDEO XX_SIZE címe, ilyenkor a
ROM0 P1-en van).
C008 8057 DEFW 05780h (P3-on a 0D780h-nak felel
meg)
RST 030h/17-34 végrehajtó rutinjainak belépési pontja
* C00A 82C6 DEFW 0C682h EXOS 17 Csatorna átirá-
nyítása másikra
olvasáskor
C00C 81C6 DEFW 0C681h EXOS 18 Csatorna átirá-
nyítása másikra
íráskor
C00E E5C7 DEFW 0C7E5h EXOS 19 Alapértelmezés-
ként használt
eszköz nevének
beállítása
C010 08C8 DEFW 0C808h EXOS 20 Rendszerállapot
lekérdezése
C012 98C6 DEFW 0C698h EXOS 21 Eszköz beláncolá-
sa
C014 F2C6 DEFW 0C6F2h EXOS 22 EXOS határvonal
kiolvasása
C016 FCC6 DEFW 0C6FCh EXOS 23 Felhasználói ha-
tárvonal beállí-
tása
C018 0EC7 DEFW 0C70Eh EXOS 24 Szegmens igénylé-
se
C01A 8EC7 DEFW 0C78Eh EXOS 25 Szegmens felsza-
badítása
C01C 18C8 DEFW 0C818h EXOS 26 Rendszerbővítések
végigkérdezése
C01E 5ECD DEFW 0CD5Eh EXOS 27 Csatornapuffer
(RAM) igénylése
C020 3AC9 DEFW 0C93Ah EXOS 28 Hibakód értelme-
zése
C022 5FC9 DEFW 0C95Fh EXOS 29 Modul betöltése
C024 2CCB DEFW 0CB2Ch EXOS 30 Áthelyezhető mo-
dul betöltése
( A-ban 0-nak-kell lenni )
C026 3FCB DEFW 0CB3Fh EXOS 31 óra beállítása
C028 40CB DEFW 0CB40h EXOS 32 óra lekérdezése
C02A 3DCB DEFW 0CB3Dh EXOS 33 Dátum beállítása
C02C 3ECB DEFW 0CB3Eh EXOS 34 Dátum lekérdezése
Inicializáló rutin folytatása, de már a P3-on lévő ROM0-ban.
Először azt vizsgálja, hogy a 4. szegmensen 'TEST _ROM' szöveggel kezdődő ROM van-e, mert ha igen, akkor abbahagyja az inicializálást és a bővítő ROM 00008h-as címére ugrik. Ez lehetővé teszi, hogy egy teljesen új operációs rendszerrel működjön a számítógép, vagy tesztelje a gépet.
* C02E D3BF OUT (0BFh),A RAM/frekvencia/várakozás
beállítása
C030 3E04 LD A,004h 4. szegmens
(bővítőkártya)
C032 D3B0 OUT (0B0h),A P0-ra belapozása
C034 210000 LD HL,00000h Kezdőcím
C037 11F6C1 LD DE,0C1F6h "TEST-ROM" szöveg címe
C03A 0608 LD B,008h Szöveg hossza 8 byte
* C03C 1A LD A,(DE) Szöveg ellenőrzése
C03D BE CP (HL)
C03E 23 INC HL Mutatók növelése
C03F 13 INC DE
C040 2003 JR NZ,0C045h Ha eltérés van, akkor
folytatódik az iniciali-
zálás
C042 10F8 DJNZ 0C03Ch Ellenőrzés folytatása
C044 E9 JP (HL) Ugrás a bővítő 00008h cí-
mére
Inicializálás folytatása. Megvizsgálja a felhasználói meleg indítási rutin címet az RST_ADDR változóban. Ha itt 0 található, akkor hidegindítás történik.
* C045 3EFF LD A,0FFh 255: rendszerszegmens
C047 D3B2 OUT (0B2h),A P2-re és
C049 D3B1 OUT (0B1h),A P1-re belapozása
C04B 2AF8BF LD HL,(0BFF8h) RST_ADDR felhasználói
C04E 7C LD A,H melegindítási rutin
címének vizsgálata.
C04F B5 OR L Ha 0 => nincs rutin
C050 2117B2 LD HL,0B217h Verem címének
C053 F9 LD SP,HL beállítása
C054 2810 JR Z,0C066h Ugrás, ha RST_ADDR=0
Ha az RST_ADDR változóban 0-tól különböző cím van, akkor két
eset lehetséges. Vagy hidegindítást, vagy melegindítást hajt
végre a gép. Ez attól függ, hogy a P2-re belapozott rendszer-
szegmens B217h címén és a P3-ra belapozott ROM0 C3AAh címén
lévő 59 byte (rutin és a készítők neve) megegyezik-e. Ez az
ellenőrzés azért fontos, mert bekapcsoláskor is lehet, hogy
nem 0 cím kerül az RST_ADDR változóba, mivel ilyenkor vélet-
lenszerűen töltődik fel a memória.
C056 11AAC3 LD DE,0C3AAh Rutinnak és a készítők
nevének címe
C059 063B LD B,03Bh Ellenőrizendő byte-ok
száma 59
* C05B 1A LD A,(DE) Ellenőrzés
C05C BE CP (HL)
C05D 2007 JR NZ,0C066h Ha van eltérés => hideg-
indítás
C05F 23 INC HL Mutatók
C060 13 INC DE növelése
C061 10F8 DJNZ 0C05Bh Ellenőrzés folytatása
Ha a terület hibátlan, akkor végrehajtja a melegindítást.
Ebben az esetben a resetjelző 10h állásával (csatornák lezá-
rása és eszközök újraláncolása) meghívja az RST 30h/00h
(EXOS 0) rutint. Az, hogy ezt a rutint kell meghívni a Z=1
jelző állása jelzi.
C063 C339c1 JP 0C139h Ugrás a melegindítást
végrehajtó részre
Elsőnek a 255-ös szegmenst (rendszerszegmenst) ellenőrzi, mely a P1-re van belapozva. Az ellenőrzés alatt szükséges verem a még ellenőrizetlen 254. szeqmensen van, melyet a P2-re lapoz be. Az ellenőrzés nem látszik, mivel a VIDEO eszköz nincs még inicializálva.
* C066 3EFE LD A,0FEh 254. szegmens
C068 D3B2 OUT (0B2h),A P2-re belapozása
C06A AF XOR A A=0 Szín kódja (fekete)
C06B D381 OUT (081h),A Keretszín (BORDER) beál-
lítása feketére
C06D CDFEC1 CALL 0C1FEh P1-en lévo RAM ellenőrzé-
se és 0-val feltöltése
C070 203D JR NZ,0C0AFh Ha hibás a RAM => keret-
szín villogtatása
A hibátlan rendszerszegmenst belapozza P2-re, beállítja a
veremhatár értékét ás inicializálja a VIDEO eszközt. A STATUS
sor bal margóját 11-re, jobb marqóját 51-re állítja.
C072 3D DEC A 255: rendszerszegmens
C073 D3B2 OUT (0B2h),A P2-re belapozása
C075 213BAC LD HL,0AC3Bh Alapértékre állítja a
C078 22FABF LD (0BFFAh),HL STACK_LIMIT (verem-
határ) változót
C07B CD60D2 CALL 0D260h Video inicializálása
C07E 210B73 LD HL,0730Bh 01 110011 00 001011b
33h 0Bh
C081 2202B9 LD (0B902h},HL STATUS sor
bal margó = 11
jobb margó = 51-re
állítása
Ezután összeadja a ROM0 és ROM1 byte-jait. Ha az ellenőrző
összeg nem 0, akkor a STATUS sorba kiírja az 'INTERNAL CHECK-
SUM ERROR' szöveget, és a keret villogtatásával a rendszer
leáll.
C084 AF XOR A A=0 Regiszterek
C085 67 LD H,A H=0 törlése
C086 6F LD L,A L=0
C087 47 LD B,A B=0
C088 4F LD C,A C=0
C089 D3B0 OUT (0B0h},A 0. szegmens (ROM0) P0-ra
lapozása
C08B 3C INC A A=1
C08C D3B1 OUT (0B1h),A 1. szegmens (ROMI) P1-re
lapozása
* C08E 0A LD A,(BC) ROM byte-jainak
C08F 03 INC BC ellenőrző összege
C090 5F LD E,A
C091 0A LD A,(BC) DE=(BC/BC+1)
C092 03 INC BC
C093 57 LD D,A
C094 19 ADD HL,DE HL=HL+DE
C095 CB78 BIT 7,B Cím vizsgálata
C097 28F5 JR Z,0C08Eh Ha van még => ugrás visz-
sza
C099 7C LD A,H összeg vizsgálata
C09A B5 OR L
C09B 219CC1 LD HL,0C19Ch "INTERNAL CHECKSUM ERROR"
szöveg címe
C09E 011700 LD BC,00017h Hibaüzenet hossza 23 byte
C0A1 2005 JR NZ,0C0A8h Ha az összeg nem 0, akkor
ugrás a hibaüzenetet ki-
író rutinba
Ha az ellenőrző összeg 0, akkor a STATUS sorba kiírja az
'EXOS 2.1 TESTING ERROR' szöveget, bár az 'ER-
ROR' betűi nem látszanak, mivel azok háttérszínűek.
C0A3 217AC1 LD HL,0C17Ah "EXOS 2.1 TESTING
ERROR" szöveg címe
C0A6 0E22 LD C,022h Szöveg hossza 34 byte
* C0A8 11BCBE LD DE,0BEBCh Szöveg STATUS sorba
C0AB EDB0 LDIR másolása
C0AD 2805 JR Z,0C0B4h Ugrás, ha nincs hiba
* C0AF 3D DEC A Hiba esetén keretszín
C0B0 D381 OUT (081h},A villogtatása
C0B2 18FB JR 0C0AFh
Most következik a hibátlan RAM szegmensek táblázatának elkészítése. Első a 255-ös rendszerszegmens, melyet már ellenőrzött.
C0B4 AF XOR A =0 Fekete szín kódja A-ba
C0B5 320BB9 LD (0B90Bh),A STATUS sor COL3 byte-ba
fekete szín kódja kerül,
így az 'ERROR' szöveg
háttérszínű lesz
C0B8 3EFF LD A,0FFh A=255: rendszerszegmens
száma
C0BA 21D0AB LD HL,0ABD0h Hibátlan RAM szegmensek
táblázatának kezdőcíme
C0BD 77 LD (HL),A Első a 255-ös rendszer-
szegmens
C0BE 229ABF LD (0BF9Ah),HL Táblázat végcímének vál-
tozóba történő letárolása
C0C1 D9 EXX Vesszős regiszterek
C0C2 110100 LD DE,00001h Ellenőrzés kezdőértékének
beállítása
E=1 egy szegmens hibátlan
(rendszerszegmens)
D=0 nem működő szegmensek
száma
RAM-ok ellenőrzése. Első a 254-es számú, utolsó a 8-as, melyet ellenőrzéskor a P1-re ( 04000h-07FFFh ) lapoz be. Ha a RAM hibátlan, akkor felveszi a táblázatba.
* C0C5 3D DEC A Szegmensszám csökkentése
C0C6 D3B1 OUT (0B1h),A Ellenőrizendő szegmens
P1-re belapozása
C0C8 F5 PUSH AF Szegmensszám elmentése
C0C9 210040 LD HL,04000h Ellenőrzés kezdőcíme
C0CC 7E LD A,(HL) A-ba RAM tartalma
C0CD 2F CPL Komplemens A-ba
C0CE 77 LD (HL),A és RAM-ba
C0CF BE CP (HL) összehasonlítás A-val
C0D0 2014 JR NZ,0C0E6h Ugrás, ha nem egyezik
(ROM vagy hibás RAM)
C0D2 CDFEC1 CALL 0C1FEh P1-en lévő RAM ellenőrzé-
se és 0-val feltöltése
C0D5 2807 JR Z,0C0DEh Ugrás, ha hibátlan a RAM
C0D7 3E49 LD A,049h Színkód = 73 (RED)
C0D9 320BB9 LD (0B90Bh),A STATUS sor COL3 byte-ba
'ERROR' felirat láthatóvá
tétele
C0DC 1808 JR 0C0E6h Tárolás átugrása
* C0DE 15 DEC D Nem működő szegmensek
számát csökkenti
C0DF 1C INC E Hibátlan szegmensek szá-
mának növelése
C0E0 D9 EXX Vessző nélküli reg.-ek
C0E1 2B DEC HL Táblázat címének csökken-
tése
C0E2 DBB1 IN A,(0B1h) P1-en lévő szegmens
száma A-ba, majd
C0E4 77 LD (HL),A letárolása a táblázatba
(használható a RAM)
C0E5 D9 EXX Vesszős regiszterek
* C0E6 F1 POP AF Szegmensszám visszatölté-
se a veremből A-ba
C0E7 FE08 CP 008h Szegmensszám vizsgálata
C0E9 20DA JR NZ,0C0C5h Ugrás vissza, ha 8-nál
nagyobb
A rendszer csak akkor indul el, ha van legalább 2 hibátlan
szegmens. A legkisebb sorszámút a P0-ra lapozza be. Ez lesz
az USR_P0 (nullás lapszegmens).
C0EB ED53A3BF LD (0BFA3h),DE Működő és nem működő RAM
szegmensek számának letá-
rolása
C0EF 1D DEC E Hibátlan szegmensek szá-
mának csökkentése
C0F0 28BD JR Z,0C0AFh Ha csak 1 szegmens jó,
akkor keret villogtatása
(rendszer nem indul el)
C0F2 1D DEC E Hibátlan szegmensek szá-
mának csökkentése
C0F3 219FBF LD HL,0BF9Fh 0-ás lap és rendszer-
C0F6 73 LD (HL),E szegmensen kívül hasz-
nálható szegmensszám
letárolása
C0F7 2EA2 LD L,0A2h [HL=BFA2h] rendszer
C0F9 34 INC (HL) részére kijelölt
szegmensek számának
növelése
C0FA D9 EXX Vessző nélküli regiszte-
rek
C0FB 7E LD A,(HL) Legkisebb sorszámú
C0FC 32FCBF LD (0BFFCh),A szegmens lesz az USR_P0
Most következik a ROM-ok táblázatának elkészítése. Ehhez a
ROM első 8 byte-jában az 'EXOS_ROM' feliratnak kell szerepel-
nie. A 256 szegmens közül azonban csak az 0F0h,0E0h,...,020h,
010h és a 7,6,5,4-es sorszámút ellenőrzi. (Ezért található
általában a BASIC_UK a 4-es és BASIC_BRD az 5-ös, a lemez-
kezelő EXDOS_UK a 020h és EXDOS_BRD a 21h szegmenseken).
C0FF 229CBF LD (0BF9Ch),HL EXOS_ROM-ok táblázatának
vége=RAM-ok táblázatának
kezdőcíme, letárolása
C102 AF XOR A A=0 Vége jel
Z=1 Ha a ROM kisebb szeg-
mensszámon is megtalálha-
tó, akkor nem veszi fel a
táblázatba
C103 CDE8C1 CALL 0C1E8h (HL)=A és HL=HL-4
Szegmensszám letárolása
és a paraméterek helyének
átlépése
C106 3EF0 LD A,0F0h Első ellenőrizendő szeg-
mens száma A-ba
* C108 CDB3C1 CALL 0C1B3h 'EXOS_ROM' szöveg elle-
nőrzése az A-ban megadott
szegmensen. Ha ROM, akkor
a táblázatba beírja a
szegmens számát
C10B D610 SUB 010h A=A-16 Következő szeg-
mensszám beállítása
(F0h,E0h,..,10h)
C10D 20F9 JR NZ,0C108h Ha még nem 0, akkor ugrás
vissza
C10F 3E08 LD A,008h A=8 Első ellenőrizendő
szegmens száma+1 A-ba
* C111 3D DEC A A=A-1 Következő szegmens-
szám beállítása (7,6,5,4)
C112 BF CP A Z=1 Ha a ROM kisebb szeg-
mensszámon is megtalálha-
tó, akkor nem veszi fel a
táblázatba
C113 CDB3C1 CALL 0C1B3h 'EXOS_ROM' szöveg elle-
nőrzése az A-ban megadott
szegmensen. Ha új ROM,
akkor táblázatba való
felvétele
C116 FE04 CP 004h Szegmensszám ellenőrzése
C118 20F7 JR NZ,0C111h Ugrás, ha még 4-nél na-
gyobb
C11A 3E01 LD A,001h A=1 Utolsó a ROM1
C11C CDE8C1 CALL 0C1E8h (HL)=A és HL=HL-4
Szegmensszám letárolása
és a paraméterek helyének
átlépése
C11F 2297BF LD (0BF97h),HL A táblázat kezdőcíme=
C122 2295BF LD (0BF95h),HL az eszközterület végé-
nek címe
A most következő rész 4 rendszerváltozót hoz létre és állít
alapállapotba.
C125 3E02 LD A,002h A=2 Alapérték
C127 32E8BF LD (0BFE8h),A (LV_TAPE)=2 40mV
C12A EEA5 XOR 0A5h 10100101b maszk
C12C 327EBF LD (0BF7Eh),A (BF7Eh)=A7h
C12F EEA8 XOR 0A8h 10101000b maszk
C131 32D5BF LD (0BFD5h),A (BAUD_SER)=0Fh Alapérték
Átviteli sebesség
9600 bit/sec
C134 AF XOR A A=0
C135 3D DEC A Z=0 'ROM1-es reset rutin
kell' jelzése
A=255 Alapérték
C136 32E7BF LD (0BFE7h),A (PROTECT)=255 Védett
* C139 0E10 LD C,010h Resetjelző beállítás.
(Eszközök újraláncolása,
a felhasználó eszközei
megmaradnak)
Az USR_P0 változóban megadott szegmens P0-ra lapozása után a rutinokat és a készítők nevét RAM-ba másolja, majd verembe tölti az RST_ADDR változóban megadott értéket visszatérési címnek.
Ha a Z jelző értéke 1, akkor az RST 30h/00h (EXOS 0) rutint hívja a C-ben megadott resetjelzővel. Z=0 esetén a ROM1-en lévő inicializáló rutint hajtja végre.
* C13B D9 EXX Vesszős regiszterek
C13C 3AFCBF LD A,(0BFFCh) USR_P0 változóban meg-
adott adott szegmens
C13F D3B0 OUT (0B0h},A P0-ra belapozása
A kilapozott szegmensen lévő rutint hívó szubrutint, és a
készítők nevét RAM-ba másolja.
C141 21AAC3 LD HL,0C3AAh Átmásolandó terület kez-
dőcíme
C144 1117B2 LD DE,0B217h Célcím 0B217h
C147 013B00 LD BC,0003Bh Byte-ok száma 59
C14A EDB0 LDIR RAM-ba másolás
RST és visszatérési rutinok RAM-ba másolása
C14C 113000 LD DE,00030h Célcím 30h
C14F 0E2B LD C,02Bh Byte-ok száma 43
C151 EDB0 LDIR RAM-ba másolás
Visszatérési cím a RST_ADDR változóban megadott érték.
C153 2AF8BF LD HL,(0BFF8h) RST_ADDR változóban
megadott érték
C156 E5 PUSH HL verembe töltése
visszatérési címnek
C157 ED43F8BF LD (0BFF8h),BC RST_ADDR=0 (cím törlése)
C15B 3E80 LD A,080h A=128 'Át kell térni a
rendszerveremtárra' jel-
zése
C15D 3279BF LD (0BF79h),A Jelző letárolása
Ha Z=0, akkor a ROM1-ben lévő inicializáló rutint hívja. Ez
írja ki az 'ENTERPRISE' feliratot, ha nem törölt a kiírást
engedélyező változó. Sorra meghívja a ROM-okat az 1-es hideg-
indítás akciókóddal, amíg valamelyik át nem veszi a vezér-
lést. Ha egyik sem vette át a vezérlést, akkor elindítja a
beépített szövegszerkesztő (WP) programot.
Ha Z=1, akkor az RST 30h/00 (EXOS 0) rutint hívja a C-ben
megadott resetjelzővel.
C160 3E06 LD A,006h ROM1-es műveleti kód
(6-os => RESET)
C162 C240CB JP NZ,0CB40h Ha Z jelző 0, akkor ugrás
a ROM1-et hívó rutinra
C165 D9 EXX Vessző nélküli regiszte-
rek
Cl66 AF XOR A A=0 műveleti kód (rend-
szer újraindítása)
Cy=0 'EXOS x rutin végre-
hajtása' - jelzés
C167 C34200 JP 00042h Ugrás az EXOS x rutinba
Az A regiszterben lévő szám felső 4 bitjének hexadecimális karakterré átalakítása és letárolása a HL-ben megadott címre.
* C16A 07 RLCA Az alsó 4 bit felső
C16B 07 RLCA 4 bitbe léptetése és
C16C 07 RLCA a felső 4 bit alsó
C16D 07 RLCA 4 bitbe léptetése
C16E F5 PUSH AF A elmentése a verembe
C16F E60F AND 00Fh Alsó 4 bit marad
( felsők türlése )
ASCII kóddá átalakítás és letárolás
C171 C690 ADD A,090h A=A+90h
C173 27 DAA Decimális korrekció
C174 CE40 ADC A,040h A=A+40h
C176 27 DAA Decimális korrekció
C177 77 LD (HL),A (HL)=A letárolás
C178 F1 POP AF A visszatöltése a verem-
ből
C179 C9 RET
RAM teszt alatt kiírandó szöveg (ERROR betűk legfelső bitje beállított (b7=1), így a karakterek a COL0 és COL1 helyett a COL2 és COL3-ban megadott színekkel lesznek megjelenítve).
* C17A 45584F53 20322E31 20202020 'EXOS 2.1 '
0186 20202020 54455354 494E4720 ' TESTING '
C192 20202020 20C5D2D2 CFD2 ' ERROR'
Hibaüzenet szövege
* C19C C9CED4C5 D2CEC1CC A0C3C8C5 'INTERNAL CHE'
C1A8 C3CBD3D5 CDA0C5D2 D2CFD2 'CKSUM ERROR'
Szegmens elején lévő 'EXOS_ROM' szöveg ellen&rzése
Be: A-ban az ellenőrizendő szegmens száma
Z=1 esetén megnézi, hogy kisebb szegmens-
számon is megtalálható-e a ROM. Ha igen,
akkor nem írja be a táblázatba.
* C1B3 D3B1 OUT (0B1h),A Ellenőrizendő szegmens
P1-re belapozása
C1B5 F5 PUSH AF Szegmensszám és Z jelző
verembe mentése
C1B6 D9 EXX Vesszős regiszterek
C1B7 210040 LD HL,04000h Kezdőcím
C1BA 11EEC1 LD DE,0C1EEh 'EXOS_ROM' szöveg címe
C1BD 0608 LD B,008h Szöveg hossza 8 byte
* C1BF 1A LD A,(DE) Szöveg ellenőrzése
C1C0 BE CP (HL)
C1C1 23 INC HL Mutatók növelése
C1C2 13 INC DE
C1C3 201E JR NZ,0C1E3h Visszatérés, ha van elté-
rés
C1C5 10F8 DJNZ 0C1BFh
C1C7 F1 POP AF Szegmensszám és Z jelző
visszatöltése
C1C8 201D JR NZ,0C1E7h Ha Z=0, ugrás letárolásra
C1CA F5 PUSH AF Szegmensszám elmentése
C1CB 08 EX AF,AF'
* C1CC 08 EX AF,AF' Szegmens száma A-ba
C1CD 3D DEC A Szegmensszám csökkentése
C1CE FE04 CP 004h Szegmensszám vizsgálata
C1D0 3814 JR C,0C1E6h Ugrás, ha 4-nél kisebb
(letárolás)
Első 64 byte-ot hasonlítja össze
C1D2 D3B0 OUT (0B0h),A Belapozás P0-ra
C1D4 ED62 SBC HL,HL HL=0
C1D6 110040 LD DE,04000h DE=16384
C1D9 42 LD B,D B=40h=64 Ellenőrizendő
byte-ok száma
C1DA 08 EX AF,AF' Szegmens számának elmen-
tése
* C1DB 1A LD A,(DE) P0 és P1 összehasonlí-
C1DC BE CP (HL) tása
C1DD 20ED JR NZ,0C1CCh Ugrás, ha nem ugyanaz
(következő szegmens elle-
nőrzése)
C1DF 23 INC HL Címek
C1E0 13 INC DE növelése
C1E1 10F8 DJNZ 0C1DBh Ugrás vissza, összehason-
lítás folytatása
* C1E3 F1 POP AF Szegmensszám visszatölté-
se A-ba
C1E4 D9 EXX Eredeti regiszterek
C1E5 C9 RET
* C1E6 F1 POP AF Szegmensszám visszatölté-
se A-ba
* C1E7 D9 EXX Eredeti regiszterek
C1E8 77 LD (HL),A Szegmensszám letárolása
C1E9 2B DEC HL HL=HL-4
C1EA 2B DEC HL Táblázat következő
C1EB 2B DEC HL elemének címe HL-be
C1EC 2B DEC HL
C1ED C9 RET
ROM-ok azonosításához ellenőrző szövegek
* C1EE 45584F53 5F524F4D 'EXOS_ROM'
* C1F6 54455354 5F524F4D 'TEST ROM'
P1-en lévő RAM ellenőrzése és 0-val feltöltése.
Eredmény: Z=1 lesz, ha hibátlan.
* C1FE 14 INC D Nem működő szegmensek
számának növelése
C1FF DBB1 IN A,(0B1h) P1-en lévő szegmens száma
A-ba
C201 21D5BE LD HL,0BED5h A vizsgálandó szegmens
C204 CD6AC1 CALL 0C16Ah számának kiírása a kép-
C207 23 INC HL ernyő státuszsorába
C208 CD6AC1 CALL 0C16Ah hexadecimális alakban
C20B 3209B9 LD (0B909h),A Szegmens száma, mint
színkód a STATUS sor COL1
byte-jába
C20E 210040 LD HL,04000h Vizsgált szegmens P1-es
kezdőcíme
C211 0100C0 LD BC,0C000h ROM0 P3-as kezdőcíme
* C214 0A LD A,(BC} Átmásolás P3-ról P1-re
C215 77 LD (HL),A
C216 BE CP (HL) Ellenőrzés
C217 C0 RET NZ Hiba esetén (pl. ROM)
visszatérés
C218 2F CPL Komplemens
C219 77 LD (HL),A Letárolás
C21A 23 INC HL Címek növelése
C21B 03 INC BC
C21C CB78 BIT 7,B Cím vizsgálata
C21E 20F4 JR NZ,0C214h Ugrás vissza, ha még
nincs vége a lapnak
Visszafelé haladva 0-val tölti fel a RAM-ot és újra ellenőrzi byte-okat.
* C220 0B DEC BC Címek csökkentése
C221 2B DEC HL
C222 CB74 BIT 6,H Ellenőrzött byte-ok szá-
mának vizsgálata
C224 C8 RET Z Visszatérés, ha a teljes
szegmens használható RAM-
nak
C225 0A LD A,(BC)
C226 86 ADD A,(HL)
C227 3C INC A
C228 77 LD (HL),A 0-val feltöltés
C229 C0 RET NZ Hibás RAM esetén vissza-
térés
C22A 18F4 JR 0C220h Feltöltés folytatása
BFxxh rendszerváltozók táblázata törléshez
xx változó
* C22C F2 DEFB 0F2h BFF2h FLAG_SOFT_IRQ
C22D E9 DEFB 0E9h BFE9h REM1
C22E EA DEFB 0EAh BFEAh REM2
C22F DF DEFB 0DFh BFDFh ST_FLAG
C230 D8 DEFB 0D8h BFD8h NET_IRQ
C231 D2 DEFB 0D2h BFD2h WAIT_SND
C232 CD DEFB 0CDh BFCDh STOP_IRQ
C233 CA DEFB 0CAh BFCAh TIMER
C234 C9 DEFB 0C9h BFC9h DEF_CHAN
C235 C8 DEFB 0C8h BFC8h DEF_TYPE
C236 89 DEFB 089h BF89h Pufferigénylés
jelző.
C237 A5 DEFB 0A5h BFA5h Csatornaszám + 1
C238 BC DEFB 0BCh BFBCh Csatornalánc első
elemét tartalmazó
szegmens száma
C239 00 DEFB 000h Végejelző
Resetjelző b4=1 vagy b5=1 beállítás esetén itt lép be.
b4=1 felszabadítja az összes csatorna RAM-ot és inicializálja
az összes eszközt.
b5=1 hatása ugyanaz, mint a b4-es, de újraszerkeszti az összes
beépített és bővítő eszközt és ROM-ot. Az eszközszegmen-
sek kijelölt állapota nem szűnik meg.
* C23A F5 PUSH AF Resetjelző elmentése
* C23B CD55C7 CALL 0C755h Felszabadítja a kiutalt
RAM szegmens-t
C23E 20FB JR NZ,0C23Bh Ugrás vissza, ha még nem
végejel
C240 212CC2 LD HL,0C22Ch Rendszerváltozók tábláza-
tának kezdőcíme
C243 AF XOR A A-ba 0 töltése törléshez
C244 11F3BF LD DE,0BFF3h Első a PORTB5-ös változó
* C247 12 LD (DE),A Lenullázás
C248 5E LD E,(HL) Változó címe_low
C249 23 INC HL Mutató növelése
C24A BB CP E Cím vizsgálata
C24B 20FA JR NZ,0C247h Ugrás vissza, ha nem vég-
jel
C24D D3B5 OUT (0B5h),A 0 kiküldése
C24F D3B6 OUT (0B6h),A
C251 3D DEC A A=255
C252 32CEBF LD (0BFCEh),A (KEY_IRQ)=255
C255 32DABF LD (0BFDAh),A (MATCH_NET)=255
C258 32D9BF LD (0BFD9h),A (CHAN_NET}=255
C25B 2178BF LD HL,0BF78h Változó címe
C25E 7E LD A,(HL) Jelző A-ba
C25F B7 OR A Vizsgálata
C260 CCE2C2 CALL Z,0C2E2h Ha 0, akkor ROM-ok RAM
igényeinek teljesítése
C263 F1 POP AF Resetjelző visszatöltése
A-ba
C264 F281C2 JP P,0C281h Ugrás, ha a resetjelzőben
b5=0 volt
b5=1 esetén elkészíti az eszközláncot. Először a ROM0-ban lé-
vő eszközöket láncolja be, majd az EXOS_ROM-ok táblázatában
található ROM-okban szereplő eszközök következnek.
C267 2A95BF LD HL,(0BF95h) Eszközterület végcím
C26A 2293BF LD (0BF93h),HL kezd&címként való
letárolása
C26D AF XOR A A=0
C26E 32BFBF LD (0BFBFh),A =0 Eszközlánc törlése
C271 2A97BF LD HL,(0BF97h) ROM-ok táblázatának kez-
dőcíme
* C274 E5 PUSH HL Verembe
C275 CDA5C5 CALL 0C5A5h A-ban megadott szegmens-
számú ROM-ban lévő esz-
közlánc kezdőcímének
vizsgálata, ha nem 0,
akkor beláncolás
C278 El POP HL Táblázat címének vissza-
töltése HL-be
C279 23 INC HL HL=HL+4
C27A 23 INC HL Táblázat következő
C27B 23 INC HL elemének címe HL-be
C27C 23 INC HL
C27D 7E LD A,(HL) ROM szegmensszámának
C27E B7 OR A vizsgálata
C27F 20F3 JR NZ,0C274h Ugrás vissza, ha van még
ROM
* C281 ED5B93BF LD DE,(0BF93h) Csatornaterület végének
címe DE-be
C285 21BDBF LD HL,0BFBDh Csatornalánc mutató bá-
ziscíme
C288 AF XOR A CY=0
C289 ED52 SBC HL,DE
C28B 22B4BF LD (0BFB4h),HL Eredmény letárolása
C28E 19 ADD HL,DE Cím visszaállítása
C28F CBF2 SET 6,D Cím átalakítása
C291 ED538DBF LD (0BF8Dh),DE Lánccím letárolása
C295 CBBA RES 7,1 DE-ben lévő cím P1-es
címmé alakítása
C297 3D DEC A =255: Rendszerszegmens
C298 D3B1 OUT (0B1h),A P1-re belapozása
C29A CD36C6 CALL 0C636h DE-ben lévő lánccím HL
általi címre letárolása
új kezdőcímnek
C29D EB EX DE,HL HL áttöltése DE-be
C29E 1B DEC DE -1 Cím csökkentése
C29F 21DCC2 LD HL,0C2DCh Táblázat végének címe
C2A2 010800 LD BC,00008h Hossza 8 byte
C2A5 EDB8 LDDR Átmásolás
C2A7 EB EX DE,HL DE-ben lévő cím áttöltése
HL-be
C2A8 CBB4 RES 6,H
C2AA 2291BF LD (0BF91h),HL EXOS-határvonal címének
letárolása
C2AD 11DDC2 LD DE,0C2DDh '[4]TAPE' szöveg címe
C2B0 CDE8C7 CALL 0C7E8h Alapeszköz nevének beál-
lítása
C2B3 3E14 LD A,014h 00010100b alapérték
C2B5 32C5BF LD (0BFC5h),A IRQ_ENABLE_STATE B4h port
értéke - a megszakítások
engedélyezése/tiltása
C2B8 D3B4 OUT (0B4h),A b4=1 video megszakítás
b2=1 1Hz engedélyezése
C2BA 21C0BF LD HL,0BFC0h Eszközlánc címmutató
báziscíme HL-be
* C2BD CD47C6 CALL 0C647h Láncolási cím HL-be,
szegmens száma A-ba. Ha A
nem 0, akkor P1-re bela-
pozza
C2C0 E5 PUSH HL Beolvasott cím elmentése
C2C1 F5 PUSH AF Szegmens számának elmen-
tése
C2C2 3E0C LD A,00Ch Eszközkezelő alprogram
sorszáma (inicializálás)
C2C4 C43EC5 CALL NZ,0C53Eh Ha nincs vége a láncnak,
akkor alprogram hívása
C2C7 F1 POP AF Szegmens számának vissza-
töltése A-ba
C2C8 El POP HL Cím visszatöltése HL-be
C2C9 D3B1 OUT (0B1h),A Szegmens P1-re belapozása
C2CB 20F0 JR NZ,0C2BDh Ugrás vissza, ha nincs
még vége az eszközláncnak
C2CD 0E08 LD C,008h 'inicializálás' akciókód
C2CF CDABC8 CALL 0C8ABh Rendszerbővítők hívása
.NOFN 'AZ ESZKÖZ NEM IGÉNYLI A HÍVÁST' - hibaüzenet
VIDEO Csatornaállapot beállítása
SOUND Karakter olvasása
Blokk olvasása
Csatornaállapot olvasása
Csatornaállapot beállítása
KEYBOARD Karakter írása
Blokk írása
Csatornaállapot beállítása
EDITOR Csatornaállapot beállítása
* C2D2 3EE7 LD A,0E7h Hibaüzenet kódja
C2D4 C9 RET
Alapértelmezésként használt 'TAPE' eszköz csatorna leírója
C2D5 00 DEFB 000h
C2D6 00 DEFB 000h
C2D7 0C DEFB 00Ch
C2D8 00 DEFB 000h
C2D9 0C DEFB 00Ch
C2DA 00 DEFB 000h
C2DB 00 DEFB 000h
* C2DC 01 DEFB 001h
* C2DD 04 DEFB 004h Szöveg hossza
C2DE 54415045 'TAPE'
ROM-ok RAM igényeinek teljesítése.
* C2E2 34 INC (HL) Jelző értékének növelése
C2E3 2A9CBF LD HL,(0BF9Ch) ROM-ok táblázatának vége
C2E6 E5 PUSH HL Táblázat címe verembe
* C2E7 E1 POP HL Táblázat címe veremből
* C2E8 2B DEC HL
C2E9 2B DEC HL HL=HL-3
C2EA 2B DEC HL Paraméterek átlépése
* C2EB 2B DEC HL HL=HL-1
C2EC 7E LD A,(HL) ROM szegmens száma A-ba
C2ED B7 OR A Szegmensszám vizsgálata
C2EE C8 RET Z Ha 0, akkor táblázat vé-
ge, visszatérés
C2EF E5 PUSH HL Táblázat aktuális címének
elmentése
C2F0 0E07 LD C,007h 'RAM kijelölés' akciókód-
ja C-be
C2F2 210AC0 LD HL,0C00Ah ROM-ok belépési pontja
C2F5 CD17B2 CALL 0B217h Rutin hívása
C2F8 79 LD A,C Visszaküldött érték
C2F9 B7 OR A vizsgálata
C2FA 20EB JR NZ,0C2E7h Ugrás, ha nem kell RAM
C2FC 78 LD A,B RAM típusjelz& A-ba
C2FD 42 LD B,D Szükséges byte-ok
C2FE 4B LD C,E száma
C2FF 0F RRCA b1 Cy-be
C300 F5 PUSH AF RAM típusjelző elmentése
C301 3019 JR NC,0C310h
P2-es lapon lévő RAM-ra van szükség. Ilyenkor a rendszerszeg-
mensen van a szabad terület.
C303 2A95BF LD HL,(0BF95h) ROM-ok RAM területének
kezdőcíme HL-be
C306 B7 OR A Cy=0
C307 ED42 SBC HL,BC Szükséges byte-ok számá-
nak levonása
C309 3811 JR C,0C31Ch Ugrás, ha betelt a szeg-
mens
C30B 11E883 LD DE,083E8h Rendszer számára
C30E ED52 SBC HL,DE szükséges hely (03E8h)
levonása
C310 380A JR C,0C31Ch Ugrás, ha betelt a szeg-
mens
C312 19 ADD HL,DE Eredeti cím visszaállítá-
sa
C313 2295BF LD (0BF95h),HL RAM terület új kezdőcímé-
nek letárolása
C316 F1 POP AF RAM típusjelző visszatöl-
tése
C317 0F RRCA b1 Cy-be
C318 3EFF LD A,0FFh A=255: Rendszerszegmens
C31A 1817 JR 0C333h
* C31C F1 POP AF RAM típusjelző visszatöl-
tése
C31D 0F RRCA b1 Cy-be
C31E F5 PUSH AF RAM típusjelző elmentése
C31F 3022 JR NC,0C343h
P1-es lapon lévő RAM-ra van szükség.
C321 CD49C3 CALL 0C349h BC-ben megadott RAM igény
vizsgálata és lefoglalá-
sa, ha lehet
C324 201D JR NZ,0C343h Ugrás, ha nincs elég hely
C326 220340 LD (04003h),HL RAM szegmensen lévő sza-
bad terület új végcíme
C329 EB EX DE,HL DE=HL
C32A 210540 LD HL,04005h Jelzőbyte címe
C32D CBC6 SET 0,(HL) Jelzőbyte beállítása
C32F DBB1 IN A,(0B1h) P1-en lévő szegmens száma
A-ba
C331 EB EX DE,HL HL=DE
C332 F1 POP AF RAM típusjelző visszatöl-
tése
* C333 3004 JR NC,0C339h
C335 CBBC RES 7,H HL-ben lévő cím P1-es
C337 CBF4 SET 6,H címmé alakítása
* C339 EB EX DE,HL DE-be terület címe
C33A E1 POP HL Táblázat címének HL-be
visszatöltése
C33B 2B DEC HL Cím csökkentése
C33C 77 LD (HL),A Szegmensszám letárolása
C33D 2B DEC HL Cím csökkentése
C33E 72 LD (HL),D Terület címének
C33F 2B DEC HL letárolása
C340 73 LD (HL),E
C341 18A8 JR 0C2EBh Következő ROM RAM igényé-
nek vizsgálata
* C343 F1 POP AF Regiszterek
C344 E1 POP HL visszatöltése
C345 36FF LD (HL),0FFh Rendszerszegmens
C347 18917 JR 0C2E8h Következő ROM RAM igényé-
nek teljesítése
BC regiszterben megadott (egy szegmensen lévő) RAM igény lefoglalása, ha lehet.
Eredmény: Z=0 lesz, ha kevés a memória
* C349 B7 OR A A vizsgálata
C34A F5 PUSH AF A és a beállított jelzők
elmentése
C34B 2106C0 LD HL,0C006h. 6 byte kell a szegmen-
C34E 09 ADD HL,BC sen a rendszer részére
C34F 3854 JR C,0C3A5h Verem ürítése és .NORAM
'KEVÉS A MEMóRIA' - hiba-
üzenet
C351 2199BF LD HL,0BF99h Szegmensszám mutató
C354 DD210040 LD IX,04000h Utasítás átlépése
* C355 210040 LD HL,04000h Szegmensszám mutató
C358 7E LD A,(HL) Szegmens száma A-ba
C359 B7 OR A Szegmensszám vizsgálata
C35A 281C JR Z,0C378h Ugrás, ha 0 (vége jel)
C35C D3B1 OUT (0B1h),A P1-re belapozás
C35E 2A0340 LD HL,(04003h) Szabad terület vége
C361 ED5B0140 LD DE,(04001h) Szabad terület kezdete
C365 ED52 SBC HL,DE Szabad terület nagyságának
kiszámítása
C367 ED42 SBC HL,BC Szükséges hely levonása
C369 38EA JR C,0C355h Ha nincs elég hely a
szegmensen, akkor a kö-
vetkező szegmens vizsgá-
lata
C36B F1 POP AF Jelzők visszatöltése
C36C F5 PUSH AF A és a jelzők elmentése
C36D 202A JR NZ,0C399h Ugrás, ha A-ban nem 0
volt
C36F 3A0540 LD A,(04005h) Jelzőbyte
C372 CB4F BIT 1,A vizsgálata
C374 20DF JR NZ,0C355h Következő szegmensen lévő
terület vizsgálata
C376 1821 JR 0C399h Szabad terület kezdőcímét
HL-be tölti
* C378 3C INC A Z=0 Eszköz részére - jel-
zése
C379 08 EX AF,AF' Jelzők cseréje
C37A E5 PUSH HL Regiszterek
C37B C5 PUSH BC elmentése
C37C CD0EC7 CALL 0C70Eh EXOS 24 szegmens igény-
lése (Z' típusjelző)
C37F 59 LD E,C Szabad szegmens száma
E-be
C380 C1 POP BC Regiszterek
C381 E1 POP HL visszatöltése
C382 B7 OR A Állapotjelző vizsgálata
C383 2020 JR NZ,0C3A5h Verem ürítése és .NORAM
'KEVÉS A MEMÓRIA' - hiba-
üzenet
C385 73 LD (HL),E Szabad szegmens száma a
betelt RAM első byte-ba
C386 7B LD A,E Szabad szegmensszám A-ba
C387 D3B1 OUT (0B1h),A Belapozása P1-re
C389 AF XOR A A=0
C38A 62 LD H,D EXOS határvonal címének
felső byte-ja H-ba
C38B 6F LD L,A L=0 Cím alsó byte-jába 0
C38C 77 LD (HL),A =0 Szegmensszám
C38D 23 INC HL törlése
C38E 3607 LD (HL),007h =7 Szabad terület
C390 23 INC HL kezdőcímének
C391 74 LD (HL),H letárolása
C392 23 INC HL (xx07h)
C393 77 LD (HL),A =0 Szabad terület
C394 23 INC HL végcímének
C395 3680 LD (HL),080h =80h letárolása
C397 23 INC HL (8000h)
C398 77 LD (HL),A =0 Jelző törlése
Z jelző értékétől függően HL-be tölti a szabad terület kezdőcímét.
* C399 F1 POP AF Jelző visszatöltése
C39A 2A0140 LD HL,(04001h) RAM szegmensen lévő sza-
badterület kezdőcíme
C39D C8 RET Z Visszatérés, ha Z=1
C39E 2A0340 LD H,(04003h) RAM szegmensen lévő sza-
bad terület végének címe
HL-be
C3A1 ED42 SBC HL,BC Szükséges terület nagysá-
gának levonása
C3A3 AF XOR A A=0 'Nincs hiba' és
Z=1 'van szabad memória'
jelzése
C3A4 C9 RET
Visszatérési cím törlése után NORAM hibaüzenet
* C3A5 E1 POP HL Verem ürítése
.NORAM 'KEVÉS A MEMóRIA' hibaüzenet
C3A6 3EF7 LD A,0F7h Hibaüzenet kódja
C3A8 B7 OR A Z=0
C3A9 C9 RET
B217h-ra kerülő 59 byte. Rutin + a készítők neve.
Kilapozott szegmensen lévő rutint hívó szubrutin.
Be: A-ban szegmens száma, ami P3-ra kerül
HL-ben rutin belépési címe
A többi regiszterben paraméter lehet
Visszatéréskor a ROM0-t P3-ra lapozza.
A-ha az eredményt teszi
* C3AA D3B3 OUT (0B3h),A [B217h] Kívánt lap P3-ra
lapozása
C3AC 08 EX AF,AF' [B219h] A-ba paraméter
értéke
C3AD CD25B2 CALL 0B225h [B21Ah] JP (HL) ugrás a
rutinba
C3B0 08 EX AF,AF' [B21Dh] A'-be paraméter
C3B1 AF XOR A [B21Eh] ROM0 szegmens
C3B2 D3B3 OUT (0B3h),A [B21Fh] Belapozása P3-ra
C3B4 08 EX AF,AF' [B221h] A-ba paraméter
C3B5 C9 RET [B222h] Visszatérés
A regiszterben megadott szegmens belapozása P3-ra, majd ugrás a HL-ben megadott címre.
* C3B6 D3B3 OUT (0B3h),A [B223h] P3-ra belapozás
C3B8 E9 JP (HL) [B225h] Ugrás a rutinba
Be: L-be P2-re lapozandó szegmens száma
H-ba P3-ra lapozandó szegmens száma
* C3B9 7C LD A,H [B226h] Szegmensszám A-ba
C3BA D3B3 OUT (0B3h),A [B227h] P3-ra belapozás
C3BC 7D LD A,L [B229h] P2-re kerülő
szegmens száma A-ba
C3BD 2A7CBF LD HL,(0BF7Ch) [B22Ah] HL visszatöltése
az ideiglenes tárolóból
C3C0 C35100 JP 00051h [B22Dh]
Készítők neve (A P2-re lapozott rendszerszegmens B230h-as címére kerül)
C3C3 57726974 74656E20 62793AA0 'Written by: '
C3CF CDF2ECA0 C2D4A0CE CDD6A0C7 'Mrl BT NMV G'
C3DB CEC8A0C3 C7C5A0C1 C5CC 'NH CGE AEL'
30h-ra kerülő 43 byte
RST 30h/x (EXOS x) hívás rutinja
C3E5 F3 DI [0030h] Megszakítások le-
tiltása
C3E6 325A00 LD (0005Ah),A [0031h] A regiszter ere-
deti értékének elmentése
C3E9 B7 OR A [0034h] Cy=0 nem megsza-
kítás kezelés - jelzése
C3EA E3 EX (SP),HL [0035h] Visszatérési cím
HL-be, HL eredeti értéke
verembe
C3EB 1807 JR 0C3F4h [0036h] (JR 3Fh)
38h-ra kerül az IM1 megszakítás rutinja
+ C3ED F5 PUSH AF [0038h] A elmentése ve-
rembe
C3EE 37 SCF [0039h] Cy=1 IM1 megsza-
kítás lekezelésének jel-
zése
C3EF 1809 JR 0C3FAh [003Ah] (JR 45h)
3Ch-ra kerül a felhasználói szoftver megszakítást kezelő rutinba való ugrás (0 esetén nincs felhasználói rutin)
+ C3F1 C30000 JP 00000h
3Fh-ra kerül az RST 30h/x (EXOS x) rutin folytatása
Műveleti kód A-ba töltése, visszatérési cím módosítása.
* C3F4 7E LD A,(HL) [003Fh] Műveleti kód A-ba
C3F5 23 INC HL [0040h] Visszatérési cím
növelése
C3F6 E3 EX (SP),HL [0041h] Új visszatérési
cím verembe, HL eredeti
értékének visszatöltése
42h-ra kerül az RST 30h/x (EXOS x) folytatása. Kód letárolása.
Be: A-ban műveleti kód.
Veremben visszatérési cím
+ C3F7 325900 LD (00059h),A [0042h] Műveleti kód le-
tárolása
45h-ra kerül CY=0 esetén EXOS x végrehajtása
CY=1 esetén IM1 megszakítás lekezelése
* C3FA DBB3 IN A,(0B3h) [0045h] P3-on lévő szeg-
mens száma A-ba
C3FC 325500 LD (00055h),A [0047h] Letárolás
C3FF 3E00 LD A,000h [004Ah] ROM0
C401 D3B3 OUT (0B3h),A [004Ch] P3-ra belapozása
C403 C310C4 JP 0C410h [004Eh] Ugrás a végrehaj-
tó rutinra
51h-ra kerül visszatérés a hívó rutintól függően.
Be: A-ban P2-re lapozandó szegmens száma
+ C406 D3B2 OUT (0B2h),A [51h] A-ban megadott
szegmens P2-re belapozása
C408 3E00 LD A,000h [53h] 0054h a hiba kódját
vagy P2-n lévő szegmens
számát tartalmazza
+ C40A 00 NOP [55h]
+ C40B 00 NOP [56h]
C40C C9 RET [57h]
Következő byte - relatív ugrás esetén - az ugrás nagysága.
('JR 3Ch' ugrás a felhasználói szoftver megszakítást kezelő rutinba)
C40D E3 DEFB 0E3h [58h]
RST 30h műveleti kódjának tárolója
+ C40E 00 DEFB 000h [59h]
A regiszter értékének ideiglenes tárolója
+ C40F 00 DEFB 000h [5Ah]
Cy=0 esetén RST 30h végrehajtó rutin
Be: 55h címen az eredetileg P3-on lévő szegmens
száma
59h címen a műveleti kód
5Ah címen eredetileg A-ban lévő érték
(csatorna száma)
veremben az új visszatérési cím
Cy=1 esetén IM1 megszakítást lekezelő rutin
Be: verem tetején AF regiszterpár értéke
alatta visszatérési cím
* C410 DBB2 IN A,(0B2h) P2-n lévő szegmens száma
A-ba
C412 325400 LD (00054h),A Letárolása visszalapozás-
hoz
C415 3EFF LD A,0FFh 255: Rendszerszegmens
C417 D3B2 OUT (0B2h),A P2-re belapozása
C419 227CBF LD (0BF7Ch),HL HL regiszter értékének
elmentése
C41C 2179BF LD HL,0BF79h Hívásjelzőt tartalmazó
változó címe
C41F 7E LD A,(HL) Értéke A-ba
C420 CB7F BIT 7,A Legfelső bit vizsgálata
C422 CBFE SET 7,(HL) b7=1 'Rendszerveremtárra
át kell térni' - jelzése
C424 2007 JR NZ,0C42Dh Ugrás, ha nem kell áttér-
ni a rendszerveremtárra
C426 ED737ABF LD (0BF7Ah),SP Veremmutató aktuális ér-
tékének elmentése
C42A 3117B2 LD SP,0B217h Új ideiglenes rendszerve-
remcím beállítása
* C42D F5 PUSH AF Hívásjelz& értéke verembe C42E 17 Mi b7 törlése, jelzbk C42F B7 OR A beállítása C430 1F RRA Cy=0 EXOS x hívás Cy=1 IMI megszakítás ! lekezelése ! ~ Z=0 Eszközhívás C431 08 EX AF'AF' A' verembe T
C432 F5 PUSH AF ~ töltése C433 2AFEBF LD HL°(0BFFEh) USR P2 és P3 változó T - C436 E5 PUSH HL ~ értéke verembe C437 2A5400 LD HL,(00054h) Eredetileg P2-n lév6 C43A 22FEBF LD (0BFFEh),HL ! szegmens siáma ! ~ USR_P2 változóba C43D 21FDBF LD HL,0BFFDh USR_P1 változó címe C440 7E LD A,(HL) ' értéke A-ba ~ , C441 F5 PUSH AF ~ majd verembe C442 DBB1 IN A, (0B1h) Jelenleg P1-en lév~. ~ szegmens száma C444 77 LD (HL),A J USR_P1 változóba C445 2A7CBF LD HL,(0BF7Ch) HL regiszter eredeti értékének visszatöltése C448 E5 PUSH HL Majd verembe mentése C449 FDE5 PUSH IY T Indexregiszterek C44B DDE5 PUSH IX J verembe C44D 3EC9 LD A,0C9h 'RET' kódja C44F 325700 LD (00057h),A Letárolás C452 67 LD H,) H-ba utasításkód áttölté se C453 08 EX AF,AF' Hívásjelz~k A-ba C414 385C JR . C,0C4B2h Ha Cy=1, ugrás az IM1 megszakítást kezelU' ru tinra C456 3A5A00 LD A' 0005Ah Eredetileg A-ban lév~. ! érték (csatornaszám) C459 08 EX AF,AF' l A'-be töltése 2 8
C45A 3A5900 LD A,(00059h) Múveleti kód A-ba C45D FE10 CP 010h Kód vizsgálata C45F CAF9C8 JP Z,0C8F9h EXOS 16 - EXOS változó olvasása(0), írása(1), átállítása(2) C462 37 SCF Cy=1 C463 CD5600 CALL 00056h Megszakítást kezelA-fel használói rutin hívása, ha van C466 CD80C5 CALL 0C580h EXOS hívások szétválasz tása Ide térnek vissza az RST 30h/x (EXOS x) rutinok. Szegmensek visszaállítása, megszakítások lekezelése. * C469 F3 DI Megszakítások letiltása C46A 26B7 LD H,0B7h 'OR A' utasítás kódja a hibakód vizsgálatához * C46C 6F LD L,A Hibaüzenet kódja L-be Ide tér vissza az IM1 megszakítást kezel~ program. (Ilyenkor H-ban a 'POP AF' kódja található.) * C46D 225400 LD (00054h},HL Hibakód és utasításkód letárolása C470 DDE1 POP IX T Indexregiszterek C472 IDEI POP IY ~ visszatöltése C474 El POP HL HL verembe mentett ér tékének visszatöltése, i majd ideiglenes táro C475 227CBF LD (0BF7Ch>,HL ~ lóba letárolása C478 21FDBF LD HL,0BFFDh USR_P1 változó címe C47B 7E LD A (HL) Szegmensszám A-ba és ' T C47C D3B1 OUT (0B1h),A ~ P1-re belapozása C47E F1 POP AF USR_P1 változó értéke ve rembM A-ba C47F 77 LD (HL),A Szegmensszám letárolása C480 2AFEBF LD HL,(0BFFEh) USR_P2 és P3 változó ` értéke HL-be, majd ^ C483 E3 EX (SP)' ! HL / verembe' elmentett ~ érték HL-be C484 22FEBF LD (0BFFEh),HL HL letárolása USR_P2 és P3 változóba C487 E1 POP HL USR P2 és P3 változó el _ mentett értéke HL-be C488 F1 POP AF Eredetileg A-ban lév~} C489 08 EX AF,AF^ ~ érték (csatornaszám) ] A'-be töltése C48A F1 POP AF Hívásje= A-ba C48B 2022 JR NZ,0C4AFh Eszközhívás esetén visz - szatér és
A következ~- rész biztosítja, hogy szoftver megszakítás esetén (FLAG_SOFT_IRQ változóban lévU' kód, és SOFT_ISR változóban lév~> cím nem 0) visszatérés el~}tt végrehajtsa a felhasználó szoftver meqszakítást kezel~ rutinját.
C48D 3279BF LD (0BF79h),A Hívásjelz~ letárolása C490 3AF2BF LD A,(0BFF2h) h-1-H3_SOFT_IRQ Szoftver | ' megszakítás kódjának C493 B7 OR A J vizsgálata C494 2815 JR Z,0C4ABh Ugrás, ha A=0 <nincs meg szakítás} C496 32C7BF LD (0BFC7h},A CODE_SOFT_IRQ-ba kód le tárolása C499 AF XOR A A=0 C49A 32F2BF LD (0BFF2h),A =0 FLAG_SOFT_IRQ törlése C49D E5 FIAM HL P2-re és P3-ra lapozandó szegmens számának elmen tése verembe C49E 2A3D00 LD HL,(0003Dh) SOFT_ISR Felhasználói szoftver megszakítást C4A1 7C LD A,H ! kezel& rutin címének C4A2 B5 OR L ] vizsgálata C4A3 E1 POP HL Szegmensszámok visszatöl tése belapozáshoz C4A4 2805 JR Z,0C4ABh Ugrás, ha (SOFT_ISR}=0, ekkor nincs felhasználói megszakítást kezel~- rutin C4A6 3E18 LD A,018h `JR' kódjának letáro C4A8 325700 LD (00057h),A lása, így QR 3Ch'-val ~ ugrik a felhasználói J rutinba ugró utasításra • C4AB ED7B7ABF LD SP,(0BF7Ah) Veremmutató eredeti érté kének visszaállítása
Visszatérés - P2-re és P3-ra a HL-ben megadott sorszámú szegmensek belapozása, felhasználói szoftver megszakítást kezelU' rutin végrehajtása, ha van.
• C4AF C326B2 JP 0B226h
!Ml megszakítást lekezelv rutin Be: veremben AF, BF79h változó értéke (hívápjelW) és F, átalakított hívásjelz& és F, USR_P2 és P3 értéke, USR_P1 értéke és F, HL,IY,IX regiszterek értéke,, • C4B2 C5 PUS!f BC T BC és DE regiszterek C4B3 D5 PUSH DE ~ elmentése a verembe C4B4 D9 EXX . Vessz 's. regiszterek C4B5 C5 PUSH BC BC', DE`, HL' elC4B6 D5 PUSH DE ' mentése a verembe C ! ~n~ ~~ p//~~ m HL J 4B7 E5 PUSH
30
Készült a Somogy Megyei Nyomdaipari
Vállalat kaposvári üzemében -- 191688
Megjelent 54 (A/5) ív terjedelemben
Felelős vezető: Mike Ferenc Igazgató