Bibloteka procedur SDX mie③ci si❎ w bankach 1 i 0 moduu SDX.¢ S⇧ to procedury uatwiaj⇧ce pisanie programw, a takəe powoduj⇧ce ich¢ skrcenie. Opejmuj⇧ one procedury systemu (wej③cie do systemu, inicjacja),¢ procedury zarz⇧dzania pami❎ci⇧, procedury zmiennych ③rodowiskowych, oraz¢ najbardziej rozbudowany blok procedur wej③cia/wyj③cia.¢¢ W pierwszej kolejno③ci opisz❎ procedury inicjowania i wej③cia do systemu.¢ Nast❎pnie adowania i uwalniania pami❎ci plikw, zarz⇧dzania pami❎ci⇧ oraz¢ symbolami i zmiennymi systemowymi. S⇧ to procedury systemowe. Wszystkie one¢ mieszcz⇧ si❎ w banku 1 moduu.¢¢ org $A02F INITiation Zero.¢¢ iniflg equ $47¢ finit equ $2E2¢ cartck equ $3EB¢ slvtab equ $720¢ devtab equ $740¢ siocbidx equ $760¢ device equ $761¢ opmode equ $778¢ calext_i equ $A41¢ extidx equ $A42¢ magic4 equ $A51¢ conch_i equ $A5E¢ conswflg equ $A60¢ FILE_P equ $C5A¢ FLAG equ $C5C¢ erridx equ $C85¢ arstal_t equ $CB0¢ arstah_t equ $CB5¢ arstidx equ $CBA¢ jkernel equ $703¢ jfinit equ $9D3¢ conname equ $A0DA¢ shatabs equ $A0DF¢ FOPEN equ $AC56¢ FCLEVEL equ $AD42¢ clralbf equ $AF2B¢ newmemlo equ $AFCB¢ cart equ $BFF0¢¢ _INITZ ldx #$00 Na wst❎pie procedura oblicza sum❎ kontroln⇧ moduu i¢ txa ustawia zmienn⇧ systemu ATARI, zapobiega to zawieszeniu¢ clc si❎ komputera podczas obsugi przerwania RESET.¢ eA033 adc cart,x¢ inx¢ bne eA033¢ sta cartck¢¢ ldx #$0F¢ lda #$FF¢ sta conswflg Nast❎pnie ustawiana jest flaga syganlizuj⇧ca brak¢ sta conswflg+1 kierowania con io.¢ sta magic4¢¢ eA049 sta devtab,x W dalszej cz❎③ci zamykane s⇧ wszystkie kanay SDX¢ sta slvtab,x IO.¢ dex¢ bpl eA049¢¢ lda #$00 Teraz kasowane s⇧ rejestry¢ sta calext_i indeks wywoa pami❎ci ext,¢ sta extidx indeks aktywnej pami❎ci,¢ sta erridx indeks zaoəonych puapek.¢¢ jsr clralbf Teraz procedura procedura kasuje wszystkie¢ mikrobufory operacji IO.¢¢ lda #'D' W nast❎pnym etapie procedura odszukuje sterownik¢ jsr shatabs urz⇧dzenia 'D' i ustawia adres tabeli adresowej¢ lda <dhatab sterownika.¢ sta hatabs+1,y¢ lda >dhatab¢ sta hatabs+2,y¢¢ ldy #$FF Teraz nast❎puje ustawienie flagi inicjacji DOSu i¢ sty iniflg inicjowane s⇧ rozszerzenia systemu.¢¢ eA073 iny Ich ilo③⇨ pami❎tana jest rejsterem ARSTIDX.¢ cpy arstidx Gdy atualny numer rwny najwi❎kszemu inicjowanie¢ beq eA091 si❎ koczy.¢¢ eA079 sty FLAG W innym przypadku numer pami❎tany jest w FLAG.¢ lda arstal_t,y Procedura pobiera adresy z odpowiednich tabel¢ sta finit¢ lda arstah_t,y¢ sta finit+1¢ jsr jfinit i inicjuje rozszerzenie,¢ ldy FLAG¢ jmp eA073 poczym inicjuje nast❎pne.¢¢ eA091 lda #$01 Flaga inicjacji jest kasowana.¢ sta iniflg¢¢ jsr newmemlo Teraz ustawiany jest wska♪nik memlo ATARI OS.¢¢ lda #$00¢ eA09A sta device W tym etapie nast❎puje inicjaca wszystkich urz⇧dze¢ ldy #$08 SDX.¢ jsr jkernel¢ lda device¢ clc¢ adc #$10¢ bpl eA09A¢¢ lda <conname Ostatni etap inicjowania SDX to otwarcie urz⇧dzenia¢ sta FILE_P CON: do odczytu i zapisu.¢ lda >conname Najpierw procedura ustawia wska♪nik do nazwy urz⇧-¢ sta FILE_P+1 dzenia,¢ lda #$08¢ sta opmode ustawia tryb otwarcia do zapisu,¢ jsr FOPEN otwiera kana,¢ lda siocbidx ustawia odpowiedni¢ sta conch_i numer kanau do indeksu kanau kierowania CON IO.¢ lda #$FF Po czym ustawia poziom systemu dla tego kanau na¢ jsr FCLEVEL dowolny.¢¢ lda #$04 Teraz otwiera kana dla odczytu,¢ sta opmode¢ jsr FOPEN otwiera kana,¢ lda siocbidx i wpisuje jego indeks w¢ sta conch_i+1 rejestr indeksu kanau kierowania CON IO.¢ lda #$FF Ponownie ustawia poziom systemu dla tego kanau na¢ jmp FCLEVEL dowolny.¢¢ org $A0DA CON NAME.¢¢ conname dta c'CON:',b(0)¢¢ Procedura poszukuje danego w A urz⇧dzenia w tabeli sterownikw ATARI OS.¢¢ org $A0DF Sreach in Handler Adress TABle.¢¢ hatabs equ $31A¢¢ shatabs ldy #$00 Na pocz⇧tku procedura ustawia indeks poszukiwa na¢ eA0E1 cmp hatabs,y zero, nast❎pnie porwnuje dany wpis z wpisem w¢ beq eA0F0 tabeli¢ ldx hatabs,y i gdy s⇧ one rəne sprawdza czy jest to ostatni wpis¢ beq eA0F0¢ iny gdy tak nie jest pobiera nast❎pny wpis.¢ iny¢ iny¢ bne eA0E1¢ eA0F0 sta hatabs,y Gdy znaleziono wpis lub wolne miejsce zostaje on¢ rts ustawiony i procedura si❎ koczy.¢¢¢ Nast❎pna procedura uəywana jest do wykonywania skokw pod adres inicjacji¢ programu. Poniewaə adres ten moəe znajdowa⇨ si❎ w przestrzeni bibloteki pro-¢ cedur ($A000-$BFFF) wi❎c wykoəystywany jest przez program aduj⇧cy ten fra-¢ gment kodu znajduj⇧cy si❎ w obszarze j⇧dra systemu.¢¢ org $9D3 Jump File INIT adres.¢¢ finit equ $2E2¢ jcar_old equ $7FD¢ jcar_of equ $858¢¢ jfinit jsr jcar_of Procedura wy⇧cza modu,¢ jsr finitc inicjuje program i¢ jmp jcar_old na zakoczenie w⇧cza modu.¢ jfinitc jmp (finit)¢¢ Procedury CLRALBF i NEWMEMLO omwione b❎d⇧ przy opisie innych procedur¢ biblotecznych, to znaczy FGET/FPUT i MALLOC. Procedury FOPEN i FCLEVEL¢ omwione b❎d⇧ w cz❎③ci opisuj⇧cej wej③cie/wyj③cie.¢¢ Nast❎pn⇧ waən⇧ procedur⇧ jest podstawowa obsuga b❎dw SDX.¢ Jest ona wskazywana wektorem ERRSVECT ($CAE). {⇧czy si❎ ona bezpo③rednio z¢ procedur⇧ wej③cia od DOSu.¢¢ org $A10E SDX main TRAP.¢¢ mdosvect equ $A000¢ _INITZ equ $A02F¢ U_ERROR equ $B46D¢¢ sdxtrap pha Na pocz⇧tku procedura zapami❎tuje numer b❎du.¢ jsr mdosvect Teraz od③wierza najwaəniejsze wektory DOSu,¢ jsr _INITZ i inicjuje sam DOS.¢ pla Teraz z numerem b❎du wywouje procedur❎ wy③wietlaj⇧c⇧¢ jsr U_ERROR numer lub nazw❎ b❎du, po czym przechodzi do DOSu.¢¢ org $A119 DOS.¢¢ appmhi equ $15¢ SYSLEVEL equ $C5E¢ erridx equ $C85¢ ldccom equ $A13C¢ clsalsys equ $A1B5¢ U_UNLOAD equ $A1C7¢ FCLoSEAL equ $AD0E¢¢ _DOS ldx #$FF Na pocz⇧tku procedura ustwia wska♪nik stosu na pierwsz⇧¢ txs pozycj❎,¢ inx nast❎pnie zeruje¢ stx erridx indeks puapek i¢ stx appmhi wektor appmhi.¢ stx appmhi+1¢ inx¢ stx SYSLEVEL Teraz ustawia poziom systemu na poziom nakadek¢ jsr U_UNLOAD i je zwalnia.¢ dec SYSLEVEL Nastepnie ustawia poziom systemu,¢ jsr clsalsys zamyka wszystkie kanay ATARI OS,¢ jsr FCLOSEAL i wszystkie kanay SDX.¢¢ eA134 lda #$00 Teraz w p❎tli bez koca aduje COMMAND.COM,¢ jsr ldccom¢ jmp eA134¢¢ Nast❎pna procedura odpowiedzialna jest za zaadowanie powoki DOSu.¢ Moəna j⇧ wykorzystywa⇨ we w⇧snych programach (opcja DOS SHELL) poprzez¢ wektor $FFD2.¢¢ org $A13C LoaD Command.COM¢¢ buf580 equ $580¢ FILE_P equ $C5A¢ FLAG equ $C5C¢ dftcspc equ $A196¢ envcspc equ $A1AD¢ U_UNLOAD equ $A1C7¢ U_LOAD equ $A204¢ U_FAIL equ $A6BE¢ U_XFAIL equ $A70E¢ GETENV equ $BA93¢¢ ldccom sta FLAG Na pocz⇧tku procedura ustawia rejestr FLAG. Dla¢ lda <envcspc procedury U_LOAD ma on istotne znaczenie.¢ ldx >envcspc Nast❎pnie pobierana jest zmienna ③rodowiskowa¢ jsr GETENV wskazywana przez ENVCSPC.¢ bmi eA14E¢¢ lda <buf580 Gdy jest ona zdeklarowana w systemie podawany jest¢ ldx >buf580 adres jej zwrconej przez GETENV warto③ci.¢ bne eA152¢¢ eA14E lda <dftcspc W przeciwnym razie adresem tym jest wska♪nik do¢ ldx >dftcspc nazwy COMMAND.COM.¢¢ eA152 sta FILE_P Teraz ten wska♪nik jest ustwiany.¢ stx FILE_P+1¢ jsr slcsfail Ustawiana jest puapka i¢ jsr U_LOAD plik jest ⇧dowany.¢ cmp #$01 Teraz procedura si❎ rozdziela w¢ bcc eA170 zaleəno③ci od wyniku zwrconego przez powok❎ DOSu.¢ beq eA16D¢ cmp #$03¢ bcc eA178¢ beq eA17E Dla warto③ci innych niə 0,1,2,3 sygnalizowany jest¢ jmp U_FAIL odpowiedni b⇧d.¢¢ eA16D lda #$FF Dla warto③ci 1 ladowany jest plik z zatrzymaniem¢ dta b($2C) bit w pami❎ci.¢¢ eA170 lda #$00 Dla warto③ci 0 plik adowany jest normalnie.¢ eA172 sta FLAG Jest to rozrəniane przez U_LOAD na podstawie¢ jsr U_LOAD rejestru FLAG.¢¢ eA178 jsr FCLOSEAL Teraz po powrocie z danego programu lub dla warto③ci¢ jmp U_XFAIL 2 zwracanej przez powok❎ zamykane s⇧ wszystkie¢ kanay i zdejmowana jest puapka systemowa.¢¢ eA17E jsr U_UNLOAD Dla warto③ci 3 zwalniana jest pami❎⇨ zajmowana przez¢ jmp eA178 pliki w niej zatrzymane.¢¢ Puapka zakadana przez program aduj⇧cy powok❎ DOSu.¢¢ org $A184 Load Command.com trap.¢¢ gcharflg equ $CC1¢ slcsfail equ $A196¢ U_XFAIL equ $A70E¢ FCLOSEAL equ $AD0E¢ U_ERROR equ $B46D¢¢ lctarp sta gcharflg Najpierw zapami❎tuje ona numer b❎du,¢ jsr slcsfail nast❎pnie ponownie ustawia puapk❎,¢ jsr FCLOSEAL zamyka wszystkie kanay SDX,¢ lda gcharflg pobiera i wy③wietla numer b❎du.¢ jsr U_ERROR¢ jmp U_XFAIL Na koniec zdejmuje puapk❎ i koczy dziaanie.¢¢ Procedura zakadaj⇧ca puapk❎ dla LDCCOM.¢¢ org $A196 Set Load Command.com u_SFAIL.¢¢ lctrap equ $A184¢ U_SFAIL equ $A6F3¢¢ slcsfail lda <lctarp Procedura ustawia wska♪nik procedury puapki,¢ ldx >lctarp¢ jmp U_SFAIL i j⇧ ustawia.¢¢ Domy③lna nazwa powoki systemu.¢¢ org $A19D DeFaulT ComSPeC.¢¢ dftcspc dta c'CAR:COMMAND.COM',b($9B)¢¢ Nazwa zmiennej ③rodowiskowej wywoywanej przez LDCCOM.¢¢ org $A1AD ENVironment ComSPeC.¢¢ envcspc dta c'COMSPEC',b($9B)¢¢ Procedura zamykaj⇧ca kanay ATARI OS.¢¢ org $A1B5 CLoSe ALl atari SYStem chanel.¢¢ iccmd equ $342¢ jciomain equ $E456¢¢ clsalsys lda #$10 Procedura ustawia numer kanau na $10 co oznacza 1¢ eA1B7 tax kana. Nast❎pnie ustawiaj⇧c kolejno dla kaədego¢ lda #$0C kanau kod operacji CLOSE i wywouj⇧c gwna proce-¢ sta iccmd,x dur❎ CIOMAIN ATARI OS zamyka wszystkie kanay prcz¢ jsr jciomain 0 standardowo otwartego dla edytora 'E:'.¢ txa¢ clc¢ adc #$10¢ bpl eA1B7¢ rts¢¢ Systemowa procedura umieszczj⇧ca rozszerzenia systemu wymagaj⇧ce¢ kaədorazowego inicjowania w czasie przerwania reset do specjalnej kolejki¢ inicjacji systemu. Adres procedury inicjuj⇧cej naleəy umie③ci⇨ w AX¢ i wywoa⇨ procedur❎. Uwaga, kolejka jest ograniczona do pi❎ci miejsc, nie¢ naleəy wi❎c naduəywa⇨ tej procedury.¢¢ org $A0F4 System ADD Initiation Zero.¢¢ dosini equ $C¢ dosinip equ $92F¢ arstal_t equ $CB0¢ arstah_t equ $CB5¢ arstidx equ $CBA¢¢ S_ADDIZ ldy arstidx Na pocz⇧tku procedura sprawdza czy jest jeszcze¢ cpy #$05 miejsce w kolejce,¢ beq eA105¢ sta arstal_t,y gdy jest wpisuje ona adres procedury do specjalnych¢ txa tablic.¢ sta arstah_t,y¢ inc arstidx¢¢ eA105 lda <dosinip Na kocu od③wierza adres prcoedury inicjacji DOSu.¢ sta dosini¢ lda >dosinip¢ sta dosini+1¢ rts¢¢ end of doc¢