Opisz❎ teraz procedury zajmuj⇧ce si❎ przetwarzaniem nazw na posta⇨¢ przyst❎pn⇧ dla sterownikw SDX. To znaczy przetwarzaj⇧cych ci⇧g danych¢ tekstowych na odpowiednie warto③ci w rejestrach SDX.¢¢ Pierwsze dwie procedury suə⇧ do ustawienia pl systemowych DEVICE, PATH¢ i NAME.¢¢ Procedura U_GETPATH ustawia DEVICE i PATH. W rejestrze PATH zawarta¢ b❎dzie ③cieəka i nazwa pliku. Wska♪nik do nazwy ustawiony jest w FILE_P,¢ a domy③lne urz⇧dzenie lub numer w CURDEV. W razie niepoprawnej skadni nazwy¢ funkcja zgasza b⇧d poprzez U_FAIL.¢ Procedura ⇧czy si❎ z U_GEFINA ktra rəni si❎ tym əe ustawia w PATH¢ ③cieək❎, a w NAME nazw❎ pliku.¢¢ org $A719 User GEt device and PATH.¢¢ bufadr equ $15¢ FILE_P equ $C5A¢¢ setdev equ $A78A¢ cphanme equ $A83C¢ PRO_NAME equ $A868¢¢ U_GEPATH lda #$FF Procedura ustawia parametr dla funkcji podrz❎dnej.¢ dta b($2C) bit¢¢ org $A71C User GEt device and path and FIleNAme.¢¢ U_GEFINA lda #$00 Procedura ustawia parametr dla funkcji podrz❎dnej.¢¢ eA71E pha Nast❎pnie zapami❎tuje ten parametr.¢ lda FILE_P Teraz ustawia wska♪nik do nazwy.¢ sta bufadr¢ lda FILE_P+1¢ sta bufadr+1¢¢ jsr setdev Ustawia nazw❎ urz⇧dzenia.¢ pla Od③wierza parametr dla funkcji¢ jsr cphanme ustawiaj⇧cej PATH.¢ ldy #$FF¢ jmp PRO_NAME Na koniec wywouje procedur❎ kopiuj⇧c⇧ nazw❎.¢¢ Procedura kopjuje nazw❎ pliku wskazywan⇧ BUFADR i przesuni❎ciem Y-1 z¢ pami❎ci w pole NAME. Rozwija teə jokery w ci⇧g znakw zapytania.¢ Sprawdza teə czy nazwa nie jest przypadkiem nazw⇧ katalogu.¢ Gdy nazwa jest poprawna w F z=0, w A znajduje si❎ znak EOL.¢ Gdy nazwa jest nazw⇧ katalogu w F z=1, w A='<' lub A='>'.¢¢ org $A868 PRO NAME.¢¢ nexflg equ $CC0¢ gcflg equ $CC1¢ nchoff equ $CC2¢¢ snchar equ $A8CE¢ ggchar equ $A8E1¢¢ PRO_NAME sty nchoff Procedura ustawia¢ inc nchoff i zwi❎ksza indeks nazwy pliku.¢¢ lda #$06 Teraz ustawia flagi dziaania¢ sta nexflg czyli flag❎ rozszerzenia nazwy¢ ldx #$00 oraz flag❎ znakw specjalnych.¢ stx gcharflg¢¢ eA878 iny Teraz procedura pobiera nast❎pny znak z buforu¢ jsr ggchar¢ bcs eA888¢¢ sec i gdy jest to znak prawidowy ustawia najstarszy bit¢ ror gcharflg flagi,¢ jsr snchar wstawia znak w nazw❎¢ jmp eA878 i zamyka p❎tl❎.¢¢ eA888 cmp #'*' Gdy wyst⇧pi znak specjalny¢ bne eA898¢ ror gcharflg ustawia najstarszy bit flagi i¢ eA88F lda #'?' wypenia ple nazwy pytajnikiem.¢ jsr snchar¢ bcc eA88F¢ bcs eA878 Gdy wypeni cae pole pobiera nast❎pny znak.¢¢ eA898 cmp #'.' Gdy wyst⇧pi kropka¢ bne eA8C7¢ inc gcharflg zwi❎kszany jest flaga dobrych znakw,¢ eA89F lda #' ' a pole wypenia si❎ do koca znakami spacji.¢ jsr snchar¢ bcc eA89F¢ ror nexflg Teraz procedura sprawdza ustawienie flagi¢ bcc eA878 rozszerzenia i gdy trzeba pobiera je.¢¢ lda gcharflg W przeciwnym razie sprawdza czy wyst⇧pia raz po¢ cmp #$02 razie kropka.¢ bne eA8C0¢¢ iny i gdy tak jest procedura pobiera nast❎pny znak.¢ jsr ggchar¢ cmp #'>' Porwnuje go do znaku przej③cia katalogu¢ beq eA8BB¢¢ dey i gdy jest on rəny zmniejsza indeks.¢¢ eA8BB lda #'<' Gdy rwny ustawia w A znak katalogu,¢ cmp #'<' a w F z=1.¢ rts¢¢ eA8C0 jsr ggchar Gdy nazwa rəna od dwch kropek procedura¢ cpy nchoff pobiera ostatni znak nazwy (np.EOL) i porwnuje¢ rts bieə⇧cy indeks z podanym.¢¢ eA8C7 sec Gdy w nazwie wyst⇧pi niedozwolony znak procedura¢ ror nexflg wypenia spacjami cae pole (nazwy i rozszerzenia).¢ jmp eA89F¢¢¢ Procedur⇧ odwrotn⇧ do opisanych powyəej jest U_EXPAND. Zamienia ona dane¢ zawarte w tablicy NAME na posta⇨ nazwy pliku urzywan⇧ przez programy.¢ Parametrami funkcji jest adres buforu danych niesiony w AX¢ do ktrych wpisywana b❎dzie nazwa pliku.¢¢ org $A735 User EXPAND.¢¢ bufor equ $15¢ name equ $762¢¢ U_EXPAND sta bufadr Na pocz⇧tku procedura ustawia wska♪nik do buforu.¢ stx bufadr+1¢¢ ldx #$00 Teraz ustawiany jest indeks nazwy pliku.¢¢ eA73B cpx #$08¢ bne eA746¢¢ eA73F lda #'.' Gdy jest to ostatni znak procedura wstawia kropk❎ w¢ sta (bufadr),y nazw❎¢ iny i zwi❎ksza indeks buforu poczym¢¢ ldx #$08 procedura ustawia indeks nazwy na pocz⇧tek¢ rozszerzenia.¢¢ eA746 lda name,x Teraz procedura pobiera nast❎pny znak z NAME i¢ cpx #$0B¢ beq eA779 sprawdza czy chodzi o ostatni znak.¢¢ inx Gdy tak nie jest procedura zwi❎ksza indeks¢ cmp #' ' i porwnuje pobrany znak ze spacj⇧,¢ beq eA779¢¢ cmp #'?' a nast❎pnie z pytajnikiem.¢ beq eA75B¢¢ eA756 sta (bufadr),y Gdy nie jest to əeden z tych znakw procedura¢ iny wpisuje znak do buforu i¢ bne eA73B p❎tla si❎ zamyka.¢¢ eA75B txa Gdy wyst⇧pi znak zapytania procedura odkada na¢ pha stas bieə⇧c⇧ warto③⇨ indeksu NAME i¢ eA75D cpx #$08¢ beq eA773 porwnuje j⇧ z kocem pola nazwy jak i¢ cpx #$0B¢ beq eA773 rozszerzenia.¢ lda name,x Gdy nie nast⇧pi koniec pobierazny jest znak i¢ inx¢ cmp #'?' porwnywany z pytajnikiem aə do koca pola.¢ beq eA75D¢ pla Gdy nast❎pny znak nie jest pytajnikiem od③wierzany¢ tax jest poprzedni indeks NAME i¢ lda #'?'¢ bne eA756 procedura ustawia ten znak do wpisu do buforu.¢¢ eA773 pla Gdy do koca pola znaki zapytania procedura wstawia¢ lda #'*' w to miejsce joker¢ sta (bufadr),y¢ iny i zwi❎ksza indeks buforu.¢¢ eA779 cpx #$09 Teraz procedura sprawdza czy wpisaa juə warto③ci w¢ bcc eA73F pole rozszerzenia.¢¢ dey Gdy tak sprawdza czy ostatni znak jest kropk⇧.¢ lda (bufadr),y¢ cmp #'.'¢ beq eA785¢ iny Gdy tak nie jest zwi❎ksza indeks buforu i¢ eA785 lda #$9B¢ sta (bufadr),y w jego ostatnie pole wpisuje znak EOL.¢ rts¢¢ Procedura wstawia znak w ple nazwy. Gdy znak nie mie③ci si❎ w polu nazwy¢ lub rozszerzenia koczy sie z ustawionym w F c=1.¢¢ org $A8CE Set Name CHAR.¢¢ nexflg equ $CC0¢ name equ $762¢¢ snchar cpx #$08¢ bcc eA8DC¢ bit nexflg Gdy indeks dla NAME wi❎kszy rwny 8 procedura¢ bpl eA8DB sprawdza czy chodzi o rozszerzenie¢ cpx #$0B i gdy tak jest porwnuje indeks z maksymaln⇧¢ bcc eA8DC dla niego warto③ci⇧.¢ eA8DB rts W przeciwnym wypadku si❎ koczy.¢¢ eA8DC sta name,x Inaczjej wpisuje znak w ple nazwy.¢ inx i zwi❎ksza indeks dla nast❎pnego wpisu.¢ rts¢¢ Procedura okre③la i ustawia typ i numer urz⇧dzenia w DEVICE na podstawie¢ podanej nazwy. Gdy nazwa nie okre③la urz⇧dzenia ustawia urz⇧dzenie domy③lne z¢ FLAG.¢¢ org $A78A SET DEVice.¢¢ bufadr equ $15¢ device equ $761¢ CURDEV equ $C5D¢ devnmtab equ $A81C¢¢ U_FAIL equ $A6BE¢ ggchar equ $A8E1¢ cmpwg equ $A90A¢ TOUPPER equ $B442¢¢ setdev lda CURDEV Na pocz⇧tku procedura kopiuje urz⇧dzenie domy③lne¢ sta device niesione w CURDEV do rejestru urz⇧dzenia.¢¢ ldy #$00¢ eA792 lda (bufadr),y Teraz nast❎puje czytanie nazwy i szukanie znaku¢ cmp #':' dwukropka.¢ beq eA7A4¢ jsr cmpwg Gdy nie jest nim pobrany znak sprawdzana jest jego¢ beq eA80F poprawno③⇨.¢ iny¢ cpy #$05 Gdy jest on znakiem prawidowym, a indeks nie¢ bne eA792 przekroczy 5 (najduəsza nazwa urz⇧dzenia) poszu-¢ beq eA80F kiwanie jest kontynuowane.¢¢ eA7A4 lda device Gdy procedura odnaleza dwukropek typ urz⇧dzenia¢ and #$0F jest kasowany.¢ sta device Pozostawiany jest numer urz⇧dzenia.¢ cpy #$02¢ bne eA7BE¢¢ ldy #$00 Gdy indeks dwukropka rwny dwa (deklaracja typu D1:)¢ lda (bufadr),y¢ jsr TOUPPER pobierany jest pierwszy znak nazwy¢ cmp #'D' i porwnywany z D¢ bne eA7DC gdy jest on rəny od tego znaku wywoywany jest b⇧d¢ iny w przeciwnym razie indeks numeru zwi❎kszany jest o¢ bne eA7EC jeden i procedura pobiera ten numer.¢¢ eA7BE ldy #$00 Gdy indeks dwukropka mniejszy niə dwa podano tylko¢ bcc eA7EC numer urz⇧dzenia st⇧d indeks numeru przyjmuje¢ warto③⇨ dwa.¢¢ ldx #$20 Gdy indeks dla dwukropka wi❎kszy niə 2 procedura¢ eA7C4 ldy #$02 poszukuje nazwy dugiej (car:,dsk:,itp.).¢ eA7C6 lda (bufadr),y Znaki s⇧ pobierane w odwrotnej kolejno③ci,¢ jsr TOUPPER¢ dex¢ cmp devnmtab-1,x i porwnywane z nazw⇧ z tablicy.¢ bne eA7D6¢ dey Gdy porwnanie prawidowe zmniejszany jest indeks.¢ bpl eA7C6¢ bmi eA7E1 Gdy porwnano wszystkie bajty nazwa prawidowa.¢¢ eA7D6 txa Gdy wyst⇧pia niezgodno③⇨ nazw ustalany jest indeks¢ and #$1C nowej poprzez wyzerowanie dwch najmodszych bitw.¢ tax Gdy indeks rwny zero, czyli procedura porwnaa¢ bne eA7C4 wszystkie nazwy z tabeli, to koczy si❎ b❎dem.¢¢ eA7DC lda #$82 Gdy za nazwa urz⇧dzenia lub niedozwolony numer¢ jmp U_FAIL procedura sygnalizuje b⇧d.¢¢ eA7E1 txa Gdy znaleziono nazw❎ w tabeli jej indeks zostaje¢ asl @ zmieniony na typ urz⇧dzenia z numerem jeden.¢ sec¢ rol @¢ and #$71 Nieznacz⇧ce bity s⇧ kasowane i tak ustalona warto③⇨¢ sta device zostaje wpisana w DEVICE,¢ ldy #$03 a indeks numeru urz⇧dzenia ustalony zostaje na trzy.¢¢ eA7EC jsr ggchar Teraz pobierany jest znak nazwy,¢ iny indeks zwi❎kszany jest o jeden dla pobranego znaku.¢ cmp #'J'¢ bcs eA7DC Teraz znak porwnywany jest z dozwolonym numerem¢ cmp #'A' urz⇧dzenia <A;I> lub <1;9>¢ bcs eA802¢ cmp #':'¢ beq addyba Gdy zamiast numeru wyst⇧pi dwukropek procedura¢ bcs eA7DC przyjmuje domy③lny numer urz⇧dzenia.¢ cmp #'1'¢ bcc eA7DC¢ eA802 eor device Nast❎pnie dla okre③lonego numeru tanəe numer jest¢ and #$0F wstawiany do DEVICE z pomini❎ciem nieznacz⇧cych¢ eor device bitw.¢ sta device¢¢ iny Indeks zwi❎kszany o jeden dla znaku dwukropka.¢ dta b($2C) bit¢¢ eA80F ldy #$00 Dla nazw nieprawidowych dugo③⇨ jest zerowana.¢¢ org $A811 ADD Y to BufAdr.¢¢ addyba tya W ostatnim etapie do wska♪nika dodana zostaje¢ clc dugo③⇨ nazwy urz⇧dzenia.¢ adc bufadr¢ sta bufadr¢ bcc eA81B¢ inc bufadr+1¢ eA81B rts¢¢ org $A81C DEVice NaMe TABle.¢¢ devnmtab dta c'DSK '¢ dta c'CLK '¢ dta c'CAR '¢ dta c'CON '¢ dta c'PRN '¢ dta c'COM '¢ dta c' '¢ dta c' '¢¢ Procedura pomocnicza kopiuje zawarto③⇨ buforu nazwy do PATH¢ w cao③ci (③cieək❎ i nazw❎) lub tylko ③cieək❎. Parametr niesiony w A.¢¢ org $A83C Copy PATH And NaME.¢¢ bufadr equ $15¢ path equ $7A0¢ ldtmp1 equ $CBE¢¢ addyba equ $A811¢ ggchar equ $A8E1¢ cmpwg equ $A90A¢¢ cphanme sta ldtmp1 Na pocz⇧tku funkcja zapami❎tuje parametr.¢¢ ldy #$00¢ eA841 lda (bufadr),y Teraz do PATH kopiuje wszystkie zanki z buforu.¢ sta path,y¢ jsr cmpwg¢ beq eA850¢ iny¢ cpy #$3F¢ bne eA841¢¢ eA850 bit ldtmp1 Gdy naptokany zosta EOL.¢ bmi eA860¢ dey i nazwa ma by⇨ oddzielona od ③cieəki¢ bmi eA85F¢ jsr ggchar poszukiwany jest pierwszy od koca znak ③cieəki.¢ bcc eA850¢ beq eA850¢ eA85F iny¢ eA860 lda #$00 Na kocu procedura umieszcza znak EOL.¢ sta path,y¢ jmp addyba Dodaje do wska♪nika dugo③⇨ ③cieəki.¢¢ Procedura pobiera znak z buforu i porwnuje go z przedziaami.¢ Daje wynik c=0 dla znaku z <0;9> lub <?;Z> lub _ dla innych znakw¢ daje z=1 dla znaku . lub * w rejestrze F. Ponadto zamienia znak \ na¢ rwnawaəny mu >.¢¢ org $A8E1 Get Good CHAR.¢¢ bufadr equ $15¢¢ TOUPPER equ $B442¢¢ ggchar lda (bufadr),y Na pocz⇧tku funkcja pobiera znak z buforu.¢ jsr TOUPPER Teraz litery zostaj⇧ zamienione na znaki duəe.¢ cmp #'0'¢ bcc eA8FC Teraz sprawdzany jest przedzia <0;9>.¢ cmp #':'¢ bcc eA8FA¢ cmp #'?'¢ bcc eA8FC Teraz przedzia <?;Z>¢ cmp #'['¢ bcc eA8FA¢ cmp #'_' a teraz znak _¢ bne eA8FC¢ eA8FA clc Gdy znak mie③ci si❎ w przedziale c=0.¢ rts¢¢ eA8FC cmp #'\' Teraz zamieniany jest znak \ na >.¢ bne eA902¢ lda #'>'¢ eA902 cmp #'*' Na kocu dla znakw . i * ustawiany jest z=1.¢ beq eA908¢ cmp #'.'¢ eA908 sec Funkcja koczy si❎ wynikiem c=1.¢ rts¢¢ Procedura porwnuj⇧ca znak nazwy z dopuszczlnym zakresem znakw.¢ To znaczy bez znakw semigraficznych, bez znakw w negatywie, bez spacji,¢ ③rednika i przecinka. Zy znak niesie w F z=1.¢¢ org $A90A COMpare With Good char.¢¢ tempchar equ $CBF¢¢ cmpwg cmp #'Ç' Procedura porwnuje znak warto③ci⇧ pierwszego znaku¢ bcs eA919 negatywie.¢ cmp #'!' Pierwszego dopuszczlnego.¢ bcc eA919¢ cmp #';' Z ③rednikiem i¢ beq eA918¢ cmp #',' przecinkiem.¢ eA918 rts¢¢ eA919 sta tempchar Gdy znak z poza zakresu procedura ustawia z=1.¢ cmp tempchar¢ rts¢¢ end of doc.¢