Pierwszym sterownikiem SDX zainstalowanym zaraz po starcie jest¢ program obsugi urz⇧dzenia CAR:. Wydaje si❎ by⇨ to logiczne ze wzgl❎du na to¢ əe sterowniki systemowe (np. SPARTA.SYS) mog⇧, albo musz⇧ by⇨ wczytane¢ wa③nie z tego urz⇧dzenia. Procedura wskazywana wektorem w HANDTAB dla¢ programu KERNEL ma posta⇨:¢¢ org $BC4 CARtridge HANDler.¢¢ jcar_sw equ $7FA¢ jcar_old equ $7FD¢ carmain equ $¢¢ carhand lda #$FF Procedura w⇧cza bank 1 moduu ROM,¢ jsr jcar_sw¢ jsr CARmain wywoluje odpowiedni⇧ procedur❎,¢ jmp jcar_old i przywraca poprzedni stan moduu.¢¢¢ Gwna procedura obsugi urz⇧dzenia CAR: ma posta⇨:¢¢ cbank 1¢ org $BBA1 CARtridge MAIN procedure.¢¢ siocbidx equ $760¢ cariocb equ $BE4¢ cfread equ $BBD8¢ cfseek equ $BBDB¢ cftell equ $BBE7¢ cgetdfre equ $BBF6¢ cgetcwd equ $BC04¢ cffirst equ $BC08¢ cfnext equ $BC16¢ cfclose equ $BC21¢ cfopen equ $BC29¢¢ CARmain cpy #$11 Na pocz⇧tku procedura sprawdza czy wywoania tycz⇧¢ beq cgetcwd sie funkcji GETCWD i GETFREE i gdy tak jest s⇧¢ cpy #$13 one natychmiastowo wywoywane.¢ beq cgetdfre¢¢ lda siocbidx¢ eBBAC cmp cariocb Wszystkie inne wymagaj⇧ jednego kanau dla operacji¢ bne eBBD0 (zamkni❎tego lub otwartego) co sprawdzane jest przez¢ cpy #$06 zgodno③⇨ stanw numeru iocb systemowego i numeru dla¢ beq cfnext CAR. Gdy tak nie jest procedura si❎ koczy z b❎dem.¢ cpy #$0A¢ beq cffirst Teraz odpowiednio dla numeru funkcji wywoywana jest¢ cpy #$00 potrzebna procedura.¢ beq cfread¢ cpy #$02¢ beq cfseek¢ cpy #$03¢ beq cftell¢ cpy #$07¢ beq cfclose¢ cpy #$09¢ beq cfopen¢¢ lda #$92 Gdy takiej funkcji nie ma wynik b❎du:¢ dta b($2C) No function in device handler.¢ eBBD0 lda #$A1 Too many chanels open.¢ eBBD2 ldx #$FF Na zakoczenie b❎du kana CAR: jest zamykany.¢ stx cariocb¢ rts¢¢ A to procedury dla poszczeglnych funkcji:¢ Pierwsze dwie funkcje ⇧cz⇧ si❎ w par❎ dla zaoszcz❎dzenia jednego bajtu¢ rozkazu RTS.¢¢ org $BBDB Car File SEEK¢¢ faux1 equ $782¢ cfptr equ $BCF¢¢ cfseek lda faux1 Procedura przepisuje nowe ustawienie w pliku¢ sta cfptr do rejestrw procedury obsugi.¢ lda faux1+1¢ sta cfptr+1¢¢ org $BBE7 Car File TELL¢¢ cftell lda cfptr Procedura przepisuje aktualne ustawienie z¢ sta faux1 rejestrw.¢ lda cfptr+1¢ sta faux1+1¢ lda #$01¢ rts¢¢ Procedura pobieraj⇧ca dane dysku.¢¢ org $BBF6 Car GET Disk FREe spece.¢¢ path equ $7A0¢ car1sec equ $BD77¢¢ cgetdfre ldx #$0F Procedura przepisuje informacje zawarte w tablicy¢ eBBF8 lda car1sec,x CAR1SEC do bufora ③cieəki czyli tam gdzie z¢ sta path,x prawdziwych dyskw wczytaywany jest fragment¢ dex pierwszego sektora.¢ bpl eBBF8¢ lda #$01 Na kocu ustawiany jest pozytywny wynik operacji.¢ rts¢¢ O to tablica przepisywana do PATH.¢¢ org $BD77¢¢ car1sec dta b($40) dskver wersja dysku¢ dta b($00) sectpe wielko③⇨ sektora¢ dta a($100) allsec liczba sektorw¢ dta a($00) fresec liczba sektorw wolnych¢ dta c'Cart 4.0' dsknme nazwa dysku¢ dta b(0) addnum numer sekwencyjny¢ dta b(0) rndnum numer losowy¢¢ Procedura pobieraj⇧ca bierz⇧cy katalog.¢¢ org $BC04 Car GET Current Working Directory¢¢ path equ $7A0¢¢ cgetcwd lda #$00 Procedura ustawia zerowy ci⇧g znakw wyznaczaj⇧cy¢ sta path ③cieək❎ dost❎pu, to znaczy katalog gwny.¢ lda #$01 Na koniec ustawia poprawny wynik.¢ rts¢¢ Procedura odnajduj⇧ca pierwszy wpis speniaj⇧cy warunki nazwy i atrybutw¢ pliku w katalogu bierz⇧cym, oraz procedura odnajduj⇧ca nast❎pny wpis spenia-¢ j⇧cy te warunki. Procedury te si❎ ⇧cz⇧.¢¢ org $BC0C Car Find First file.¢¢ opmode equ $778¢ ccmpname equ $BCA2¢ cfopen equ $BC29¢¢ cffirst lda #$14 Procedura ustawia tryb otwarcia dla katologu do¢ sta opmode odczytu i otwiera katalog.¢ jsr cfopen W wypadku b❎dy si❎ koczy.¢ bmi eBC20¢¢ org $BC16 Car Find Next file.¢¢ cfnext jsr ccmpname Teraz wczytywany jest nast❎pny wpis katalogu i¢ bmi eBC1E porwnywany z stawianymi warunkami. Gdy procedura¢ lda #$01 koczy si❎ poprawnie utawiana jest warto③⇨ 1 i¢ rts nast❎puje koniec funkcji.¢ eBC1E lda #$88 W przeciwnym razie ustawiany jest b⇧d: End of file.¢ eBC20 rts¢¢¢ Procedura CCMPNAME omwiona zostanie dokadnie przy opisie COPEN.¢¢ Procedura zamykaj⇧ca kana CAR:.¢¢ org $BC21¢¢ cariocb equ $BE4¢¢ cfclose lda #$FF Procedura kasuje nmer uəywanego przez sterownik¢ sta cariocb kanau i koczy si❎ wynikiem poprawnym.¢ lda #$01¢ rts¢¢ Procedura otwieraj⇧ca kana dla CAR:¢¢ org $BC29¢¢ devtab equ $740¢ siocbidx equ $760¢ name equ $762¢ opmode equ $778¢ fart1 equ $779¢ date equ $77B¢ dirfdate equ $79A¢ cfstart equ $BD1¢ cfname equ $BD5¢ cfatr1 equ $BE0¢ cariocb equ $BE4¢ prdir equ $BC8B¢ zcfptr equ $BC99¢ ccmpname equ $BCA2¢ scfstln equ $BCD4¢¢ cfopen ldx #$0A Na pocz⇧tku procedura przepisuje nazw❎ pliku do¢ eBC2B lda name,x wasnego buforu nazwy.¢ sta cfname,x¢ dex¢ bpl eBC2B¢ lda fatr1 Nast❎pnie to samo robi z atrybutem pliku do¢ sta cfatr1 otwarcia.¢¢ lda #$00 Teraz ustawia ona wska♪nik fizycznego adresu pliku¢ sta cfstart w pami❎ci moduu na $4000.¢ lda #$40¢ sta cfstart+1¢¢ jsr prdir Teraz nast❎puje przygotowanie do czytania z katalogu¢ nazw.¢¢ lda opmode I sprawdzany jest tryb otwarcia.¢ and #$10 Gdy chodzi o katalog wykonywana jest ostatnia¢ bne eBC6B cz❎③⇨ procedury,¢¢ lda opmode w przeciwnym razie sprawdzane jest jeszcze czy jest¢ and #$09 to otwarcie pliku do odczytu.¢ bne eBC7D Gdy tak nie jest wynikiem jest b⇧d.¢¢ jsr ccmpname Gdy otwarcie jest dla pliku do odczytu nast❎puje¢ bmi eBC7A czytanie kolejnych nazw z katalogu i porwnywanie¢ ich ustalon⇧, gdy procedura si❎ koczy b❎dem¢ ustawiony zostaje jego numer na $88.¢¢ ldx #$05 Teraz gdy plik zosta znaleziony ustawiane s⇧¢ eBC5C lda dirfdate,x jego data i czas.¢ sta date,x¢ dex¢ bpl eBC5C¢¢ jsr scfstln Nast❎pnie ustawiane s⇧ adres i dugo③⇨ pliku,¢ jsr zcfptr i zerowany jest jego wska♪nik.¢¢ eBC6B ldy #$00 Teraz poszukiwany jest wolny kana SDX¢ eBC6D lda devtab,y¢ bmi eBC82 i gdy jest on znaleziony procedura przechodzi¢ iny do ostatniego etapu.¢ cpy #$10¢ bne eBC6D¢ W innym przypadku procedura koczy si❎ b❎dem:¢ lda #$A1 Too meny...¢ dta b($2C) bit¢ eBC7A lda #$AA File not found.¢ dta b($2C) bit¢ eBC7D lda #$87 IOCB not open to input.¢ eBC7F jmp eBBD2¢¢ eBC82 sty siocbidx W ostatnim etapie ustawiany jest kana dla operacji¢ sty cariocb¢ lda #$01 i procedura koczy si❎ wynikem poprawnym.¢ rts¢¢ A oto procedury wywoywane z COPEN:¢¢¢ org $BC8B Prepare to Read DIR.¢¢ cflen equ $BD3¢ zcfptr equ $BC99¢ sdirbuf equ $BCE5¢ scfln equ $BCD7¢¢ prdir jsr zcfptr Na pocz⇧tku procedura kasuje wska♪nik pozycji w¢ lda #$01 pliku, nast❎pnie ustawia dugo③⇨ zbioru na 256¢ sta cflen+1 bajtw.¢ jsr sdirbuf Teraz procedura czyta pierwszy wpis w katalogu i¢ jmp scfln na koniec ustawia rzeczywist⇧ dugo③⇨ katalogu.¢¢ org $BC99 Zero CFPTR.¢¢ cfptr equ $BCF¢¢ zcfptr lda #$00 Procedura kasuje wska♪nik pliku.¢ sta cfptr¢ sta cfptr+1¢ rts¢¢ org $BCA2 CAR CoMPare NAMEs.¢¢ dirfatr equ $789¢ dirfname equ $78F¢ cfname equ $BD5¢ cfatr1 equ $BE0¢ sdirbuf equ $BCE5¢¢¢ ccmpname jsr sdirbuf Procedura czyta wpis katalogowy, gdy go brak koczy¢ bmi eBCD3 si❎.¢¢ lda dirfatr W innym przypadku porwnuje zgodno③⇨ atrybutw pliku¢ and cfatr1 z oczekiwaniami.¢ eor cfatr1 Najpierw procedura sprawdza czy atrybuty AHP s⇧¢ and #$07 ustawione i¢ bne ccmpname gdy tak nie jest pobierana jest nast❎pna nazwa.¢ lda cfatr1 Nast❎pnie procedura sprawdza czy odpowiednie¢ lsr @ atrybuty s⇧ zgaszone.¢ lsr @¢ lsr @¢ lsr @¢ and dirfatr¢ and #$07¢ bne ccmpname I gdy tak nie jest pobierany jest nast❎pny wpis.¢¢ ldx #$0B W ostatniej cz❎③ci sprawdzana jest zgodno③⇨ nazwy w¢ eBCC4 lda cfname-1,x katalogu z nazw⇧ poszukiwan⇧.¢ cmp #'?'¢ beq eBCD0 Porwnanie dla jokerw jest pomijane.¢ cmp dirfname-1,x¢ bne ccmpname Gdy wykryta jest niezgodno③⇨, pobierany jest inny¢ eBCD0 dex wpis.¢ bne eBCC4¢ eBCD3 rts Gdy porwnanie prawidowe procedura si❎ koczy.¢¢¢ Nast❎pne procedura ma dwa wej③cia, dzi❎ki czemu moəe ustawia⇨ dwa¢ parametry, start i dugo③⇨ pliku, lub jeden dugo③⇨ pliku.¢¢ org $BCD4 Set Car File STart and LeN.¢¢ dir1sec equ $78A¢ cfstart equ $BD1¢¢ scfstln ldx #$00 Procedura ustawia indeks dla dwch danych.¢ dta b($2C) bit¢¢ org $BCD7 Set Car File LeN.¢¢ scfln ldx #$02 Indeks dla jednej danej.¢ eBCD9 lda dirf1sec,x Teraz przepisywane s⇧ dane z buforu dyskowego do¢ sta cfstart,x odpowiednich zmiennych sterownika.¢ inx¢ cpx #$04¢ bne eBCD9¢ rts¢¢ org $BCE5 Set DIR BUFor.¢¢ faux4 equ $785¢ dirbuf equ $789¢ cfreadc equ $BCFC¢¢ sdirbuf lda #$17 Procedura ustawia dugo③⇨ jednego wpisu katalogowego¢ sta faux4¢ lda #$00¢ sta faux4+1¢¢ lda <dirbuf Nast❎pnie ustawia adres buforu wpisu.¢ sta faux1¢ lda >dirbuf¢ sta faux1+1¢¢ jmp cfreadc Na koniec czyta porcj❎ danych.¢¢¢ Ostatnia z procedur to czytaj⇧ca plik. Wywoywana jest ona po③rednio¢ poprzez skok.¢¢ org $BBD8 Car File Read.¢¢ cfread jmp cfreadc ($BBD8)¢¢ Oto ona:¢¢ org $BCFC Car File Read Continue procedure.¢¢¢ zbufa equ $43¢ zdrva equ $45¢ faux1 equ $782¢ faux4 equ $785¢ syscall equ $787¢ cfptr equ $BCF¢ cfstart equ $BD1¢ cflen equ $BD3¢ cftop equ $BE1¢ cstatus equ $BE3¢ cfnbnk equ $BE5¢ jext_on equ $7F1¢ jext_off equ $7F4¢ cmemmove equ $B97¢¢¢ cfreadc ldx #$00 Procedura na pocz⇧tku kasuje status operacji.¢ stx cstatus¢¢ sec Teraz ustawia adres adowania pliku i¢ ldy #$02¢ eBD04 lda faux1,x¢ sta zdrva,x¢ lda cflen,x od dugo③ci pliku odejmowana jest jego aktualna¢ sbc cfptr,x pozycja w celu uzyskania ilo③ci bajtw dla¢ sta cftop,x operacji.¢ inx¢ dey¢ bne eBD04¢¢ lda cftop Teraz sprawdzane jest czy ilo③⇨ bajtw do¢ cmp faux4 zaadowania nie przekracza ilo③ci rzeczywistej.¢ lda cftop+1¢ sbc faux4+1¢ bcs eBD35¢¢ lda cftop Gdy tak jest ustawiana jest nowa dugo③⇨ dla¢ sta faux4 operacji i ustawiany jest status na $88-EOF.¢ lda cftop+1¢ sta faux4+1¢ ldx #$88¢ stx cstatus¢¢ eBD35 clc Teraz obliczony zostaje fizyczny pocz⇧tek programu¢ lda cfptr w pami❎ci moduu.¢ adc cfstart¢ sta zbufa¢ lda cfptr+1¢ adc cfstart+1¢ pha Jego starszy bajt zostaje zapami❎tany,¢ and #$1F i ustawiana jest jego adres nie wi❎ksza niə $1FFF¢ ora #$A0 (bo $BFFF-$A000) sumowana jest on z¢ sta zbufa+1 adresem moduu ($A000) i ustawiany jest wska♪nik.¢ pla¢ lsr @ Teraz na podstawie od③wierzonego starszego bajtu¢ lsr @ adresu wyznaczany jest numer banku moduu SDX,¢ lsr @ s⇧ to trzy najstarsze bity tego adresu.¢ lsr @¢ lsr @¢ sta cfnbnk Tak ustawiony numer jest zapami❎tywany.¢ clc Teraz uaktualniona zostaje pozycja w pliku o¢ lda cfptr ilo③⇨ bajtw maj⇧c⇧ by⇨ odczytan⇧.¢ adc faux4¢ sta cfptr¢ lda cfptr+1¢ adc faux4+1¢ sta cfptr+1¢¢ lda syscall Teraz uaktywniana jest odpowiednia pami❎⇨.¢ jsr jext_on¢ jsr cmemmove Nast❎puje przepisanie bloku pami❎ci.¢ jsr jext_off Ustawiana jest stara pami❎⇨.¢ lda cstatus I odczytywany jest status operacji na czym procedura¢ rts si❎ koczy.¢¢ Ostatnia procedura suəy do przepisywania blokw pami❎ci. Jest ona¢ umieszczona w j⇧drze systemu jako əe moəe przepisywa⇨ blok z moduu do¢ pami❎ci RAM bezpo③rednio pod te same adresy.¢¢¢ org $0B97 Car MEMory Move.¢¢ zbufa equ $43¢ zdrva equ $45¢ faux4 equ $785¢ cfbank equ $BE5¢ cbank_0 equ $D5E0¢ cbank_1 equ $D5E1¢¢ cmemmove ldx cfbank Na pocz⇧tku uaktywniany jest odpowiedni bank moduu.¢ sta cbank_0,x¢ ldx faux4+1 Nast❎pnie sprawdzana jest liczba stron do¢ beq e0BB2 przepisania,¢¢ ldy #$00¢ e0BA4 lda (zbufa),y Gdy jest rəna od zera przepisywane s⇧ wszystkie¢ sta (zdrva),y strony.¢ iny¢ bne e0BA4¢ inc zbufa+1¢ inc zdrva+1¢ dex¢ bne e0BA4¢¢ e0BB2 ldy faux4 Teraz przepisywana jest ostatnia, niepena¢ e0BB5 tya strona pami❎ci.¢ beq e0BC0¢ dey¢ lda (zbufa),y¢ sta (zdrva),y¢ clc¢ bcc e0BB5¢¢ e0BC0 sta cbank_1 Na kocu procedura uaktywnia bank 1 moduu i¢ rts koczy si❎.¢¢ end of file¢