¢ Budowa plikw Sparta DOS X¢ --------------------------¢¢ Plik sam w sobie jest tylko niewiele¢ wartym zbiorem bajtw. Mnstwo liczb,¢ ktre mog⇧ oznacza⇨ wszystko, a zara-¢ zem nic, je③li nie wiadomo jak je zin-¢ terpretowa⇨. Wi❎kszo③⇨ plikw wyposaəa¢ si❎ z tego powodu w rənorodne nagw-¢ ki, w ktrych pami❎tane s⇧ informacje¢ o tym co plik zawiera, ew. jak go po-¢ tem traktowa⇨ przy odczycie. Do takich¢ naleə⇧ rwnieə pliki wykonywalne, bi-¢ narne, czy po prostu: przeznaczone do¢ zaadowania z poziomu DOSu. Wszak DOS¢ to teə program i jak kaədy inny ma¢ prawo oczekiwa⇨ danych o okre③lonej,¢ znanej mu strukturze.¢¢ Tradycyjne pliki binarne, rozpoznawane¢ przez wszystkie DOSy dla komputerw¢ Atari XL/XE, maj⇧ budow❎ blokow⇧,¢ gdzie kaədy blok posiada swj nagwek¢ Istniej⇧ dwa rodzaje nagwkw:¢¢ 1. dta a($ffff),a(str_adr),a(end_adr)¢¢ 2. dta a(str_adr),a(end_adr)¢¢ gdzie:¢ str_adr - adres, pod ktry zostanie¢ zaadowany pierwszy bajt da-¢ nych,¢ end_adr - adres, pod ktry zostanie¢ zaadowany ostatni bajt.¢¢ Pierwszy blok w pliku musi mie⇨ nag-¢ wek typu $ffff, pozostae bloki dowol-¢ nie. Za nagwkiem oczywi③cie powinny¢ znale♪⇨ si❎ dane w ilo③ci:¢ (end_adr-str_adr)+1¢¢ Tyle tytuem przypomnienia. Twrcy sy-¢ stemu Sparta DOS X zachowali powyəszy¢ standard, dodaj⇧c jednocze③nie kilka¢ nowych typw nagwkw. Ci⇧gle wi❎c¢ mamy do czynienia z plikiem podzielo-¢ nym na bloki, z tym əe rodzajw blokw¢ jest teraz duəo wi❎cej. Oto one:¢¢¢ 1. Blok nierelokowalny (adowany pod¢ stay adres w pami❎ci):¢¢¢ dta a($fffa),a(str_adr),a(end_adr)¢¢¢ Jest to to samo co blok $ffff - nie¢ ma znaczenia, ktry zostanie uəyty.¢ $fffa b❎dzie jednak wyra♪nie wska-¢ zywa⇨, əe program jest przeznaczony¢ dla SDX - inny DOS takiego pliku¢ nie odczyta.¢¢¢¢ 2. Blok relokowalny (adowany pod MEM-¢ LO we wskazany rodzaj pami❎ci):¢¢¢ dta a($fffe),b(blk_num),b(blk_id)¢ dta a(blk_off),a(blk_len)¢¢ blk_num - numer bloku w pliku. Kaə-¢ dy blok relokowalny powinien po-¢ siada⇨ swj wasny numer. Ponie-¢ waə adresy adowania blokw nie¢ s⇧ znane, bloki identyfikowane¢ s⇧ wa③nie poprzez swoje numery.¢ Mog⇧ one przyjmowa⇨ warto③ci z¢ zakresu 0-7, z tym əe w praktyce¢ stosuje si❎ zwykle numeracj❎ od¢ 1 w gr❎.¢ blk_id - bity 1-5 stanowi⇧ indeks¢ pami❎ci, do ktrej blok ma zos-¢ ta⇨ zaadowany. Spotkaem si❎ z¢ dwoma warto③ciami: $00 - pami❎⇨¢ podstawowa, $02 - pami❎⇨ rozsze-¢ rzona. Ustawienie dodatkowo bitu¢ 7 oznacza brak bloku danych. SDX¢ nic wtedy nie aduje, ale rezer-¢ wuje pami❎⇨.¢ blk_off - tzw. przesuni❎cie adresw¢ w bloku, czyli po prostu adres,¢ pod ktry by assemblowany kod.¢ Jest to potrzebne przy uaktual-¢ nianiu adresw odwouj⇧cych si❎¢ do zawarto③ci bloku.¢ blk_len - dugo③⇨ bloku. Tyle da-¢ nych powinno by⇨ za nagwkiem¢ chyba, əe jest to blok rezerwu-¢ j⇧cy pami❎⇨ wtedy danych nie ma.¢¢ Pisz⇧c kod relokowalny trzeba mie⇨¢ na uwadze kilka ogranicze jakie¢ narzuca idea "przemiaszczalnego"¢ kodu. Wszystkie adresy odwouj⇧ce¢ si❎ do obszaru takiego programu mu-¢ sz⇧ zosta⇨ uaktualnione podczas a-¢ dowania, w zwi⇧zku z tym nie moəna¢ uəywa⇨ sekwencji takich jak np.:¢ lda <co③¢ ldx >co③¢ ...¢ co③ equ *¢ ...¢ Zamiast tego, pozostaje np.:¢ lda _co③¢ ldx _co③+1¢ ...¢ _co③ dta a(co③)¢ ...¢ co③ equ *¢¢ 3. Blok aktualizacji adresw odnosz⇧-¢ cych si❎ do bloku relokowalnego:¢¢ dta a($fffd),b(blk_num),a(blk_len)¢¢ blk_num - numer bloku, do ktrego¢ odnosz⇧ si❎ uaktualniane adresy.¢ blk_len - dugo③⇨ bloku aktualiza-¢ cji (bez nagwka). Jest ona¢ ignorowana.¢¢ Adresy s⇧ uaktualniane poprzez do-¢ danie do adresu istniej⇧cego rəni-¢ cy pomi❎dzy adresem, pod ktry zos-¢ ta zaadowany wskazany blok relo-¢ kowalny, a warto③ci⇧ blk_off (adre-¢ sem asemblacji) tego bloku. Moəna¢ to przedstawi⇨ wzorem:¢ ADR=ADR+(blk_adr-blk_off)¢¢ "Ciao" bloku aktualizacji stanowi⇧¢ wska♪niki do poprawianych adresw¢ oraz rozkazy specjalne. Wska♪nik¢ jest liczb⇧ z zakresu $00-$fb i¢¢ oznacza przesuni❎cie wzgl❎dem miej-¢ sca poprzedniej aktualizacji. Miej-¢ sce to jest pami❎tane przez program¢ aduj⇧cy jako bezpo③redni adres -¢ nazwijmy go licznikiem aktualiza-¢ cji. Licznik ten moəna zainicjowa⇨¢ za pomoc⇧ funkcji specjalnych, kt-¢ rymi s⇧ liczby wi❎ksze od $fb:¢ $fc - oznacza koniec bloku aktu-¢ alizacji,¢ $fd,a(ADDR) - nast❎puje aktuali-¢ zacja adresu wskazanego bez-¢ po③rednio przez ADDR. Tym¢ samym warto③⇨ ADDR jest wpi-¢ sywana do licznika aktuali-¢ zacji i od niej b❎d⇧ liczone¢ kolejne przesuni❎cia,¢ $fe,b(blk_num) - do licznika ak-¢ tualizacji wstawiany jest¢ adres bloku wskazanego przez¢ blk_num, czyli kolejne aktu-¢ alizacje b❎d⇧ si❎ odnosiy¢ do kodu zawartego w tym blo-¢ ku,¢ $ff - licznik aktualizacji zwi❎-¢ kszany jest o $fa (bez aktu-¢ alizacji adresu).¢¢¢ 4. Blok aktualizacji adresw procedur¢ zdefiniowanych symbolami:¢¢ dta a($fffb),c'SMB_NAME',a(blk_len)¢¢ Gdzie:¢ SMB_NAME - symboliczna nazwa proce-¢ dury (lub tablicy, rejestru sys-¢ temowego itp.) Osiem znakw w¢ kodzie ATASCII,¢ blk_len - jak w bloku $fffd.¢¢ Po nagwku wyst❎puje ci⇧g wska♪ni-¢ kw okre③laj⇧cych pooəenie adresw¢ do zaktualizowania - identycznie¢ jak w bloku $fffd. Adresy s⇧ zmie-¢ niane poprzez dodanie do istniej⇧-¢ cego adresu, adresu procedury okre-¢ ③lonej symbolem. Pozwala to na wy-¢ korzystywanie w programach proce-¢ dur, ktrych adresw nie znamy, np.¢ procedur dodawanych przez inne pro-¢ gramy uruchamiane w ③rodowisku SDX.¢ Takəe procedury systemowe powinny¢ by⇨ wykorzystywane w ten sposb,¢ przecieə mog⇧ one mie⇨ rəne adresy¢ w rənych wersjach Sparty.¢¢¢ 5. Blok definicji nowych symboli:¢¢ dta a($fffc),b(blk_num),a(smb_off)¢ dta c'SMB_NAME'¢¢ blk_num - numer bloku, w ktrym¢ znajduje si❎ definiowana proce-¢ dura. Wynika z tego, əe procedu-¢ ra musi by⇨ zaadowana jako blok¢ relokowalny.¢ smb_off - przesuni❎cie adresu pro-¢ cedury w bloku, czyli offset¢ procedury wzgl❎dem pocz⇧tku blo-¢ ku (pierwszy bajt ma numer 0)¢ powi❎kszony o warto③⇨ blk_off¢ tego bloku. Inaczej: jest to¢¢ adres pod jaki procedura zostaa¢ zassemblowana,¢ SMB_NAME - symboliczna nazwa defi-¢ niowanej procedury.¢¢¢ Bloki typu $fffb, $fffc, $fffd nie s⇧¢ na stae zatrzymywane w pami❎ci. Sys-¢ tem wykorzystuje je tylko podczas a-¢ dowania programu.¢¢¢ Wygl⇧da to by⇨ moəe na troch❎ zagmat-¢ wane, lecz w rzeczywisto③ci jest bar-¢ dzo proste. Proponuj❎ dla lepszego¢ zrozumienia przejrze⇨ budow❎ kilku¢ plikw napisanych specjalnie dla SDX.¢ W archiwum ze stuffem powinien znajdo-¢ wa⇨ si❎ tekst ♪rdowy (wraz z nagw-¢ kami) programu בכנבי«צךצ z carta SDX.¢ Jest to do③⇨ ciekawy przypadek, ponie-¢ waə zawiera wszystkie typy blokw i to¢ w rənych wariantach - polecam, z pew-¢ no③ci⇧ uatwi przyswojenie tematu.¢¢¢ Przy pisaniu tego artykuu korzystaem¢ ze ♪rde Sparta DOS X opracowanych¢ przez Marka M.M. Goderskiego oraz z¢ wasnych obserwacji i do③wiadcze. Mam¢ nadziej❎, iə art ten zaoszcz❎dzi zain-¢ teresowanym czasu i nerww, oraz əe¢ przyczyni si❎ do lepszego wykorzysta-¢ nia moəliwo③ci jakie drzemi⇧ w SDX.¢¢ ⑧ycz❎ sukcesw w walce z systemem ;)¢¢¢ Qcyk/Dial¢¢