home *** CD-ROM | disk | FTP | other *** search
/ Syzygy Magazine 6 / Syzygy_Magazine_6_1999___pl_Disk_2_of_3_Side_B.atr / sparta1.arc / SPARTA12.DOC < prev    next >
Text File  |  1999-02-20  |  15KB  |  1 lines

  1.       Opisz❎ teraz procedury zajmuj⇧ce si❎ przetwarzaniem nazw na posta⇨¢  przyst❎pn⇧ dla sterownikw SDX. To znaczy przetwarzaj⇧cych ci⇧g danych¢  tekstowych na odpowiednie warto③ci w rejestrach SDX.¢¢      Pierwsze dwie procedury s uə⇧ do ustawienia pl 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 sk adni nazwy¢  funkcja zg asza b ⇧d poprzez U_FAIL.¢      Procedura  ⇧czy si❎ z U_GEFINA ktra 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 wywo uje 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 znakw 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 dzia ania¢           sta nexflg      czyli flag❎ rozszerzenia nazwy¢           ldx #$00        oraz flag❎ znakw specjalnych.¢           stx gcharflg¢¢  eA878    iny             Teraz procedura pobiera nast❎pny znak z buforu¢           jsr ggchar¢           bcs eA888¢¢           sec             i gdy jest to znak prawid owy 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 #'?'        wype nia ple nazwy pytajnikiem.¢           jsr snchar¢           bcc eA88F¢           bcs eA878       Gdy wype ni ca e pole pobiera nast❎pny znak.¢¢  eA898    cmp #'.'        Gdy wyst⇧pi kropka¢           bne eA8C7¢           inc gcharflg    zwi❎kszany jest flaga dobrych znakw,¢  eA89F    lda #' '        a pole wype nia si❎ do koca 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⇧pi a raz po¢           cmp #$02        razie kropka.¢           bne eA8C0¢¢           iny             i gdy tak jest procedura pobiera nast❎pny znak.¢           jsr ggchar¢           cmp #'>'        Porwnuje go do znaku przej③cia katalogu¢           beq eA8BB¢¢           dey             i gdy jest on rəny zmniejsza indeks.¢¢  eA8BB    lda #'<'        Gdy rwny ustawia w A znak katalogu,¢           cmp #'<'        a w F z=1.¢           rts¢¢  eA8C0    jsr ggchar      Gdy nazwa rəna od dwch kropek procedura¢           cpy nchoff      pobiera ostatni znak nazwy (np.EOL) i porwnuje¢           rts             bieə⇧cy indeks z podanym.¢¢  eA8C7    sec             Gdy w nazwie wyst⇧pi  niedozwolony znak procedura¢           ror nexflg      wype nia spacjami ca e 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 ktrych 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 porwnuje 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 znakw procedura¢           iny             wpisuje znak do buforu i¢           bne eA73B       p❎tla si❎ zamyka.¢¢  eA75B    txa             Gdy wyst⇧pi  znak zapytania procedura odk ada na¢           pha             stas bieə⇧c⇧ warto③⇨ indeksu NAME i¢  eA75D    cpx #$08¢           beq eA773       porwnuje j⇧ z kocem pola nazwy jak i¢           cpx #$0B¢           beq eA773       rozszerzenia.¢           lda name,x      Gdy nie nast⇧pi  koniec pobierazny jest znak i¢           inx¢           cmp #'?'        porwnywany z pytajnikiem aə do koca 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 koca 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 wpisa a 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 koczy 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 rwny 8 procedura¢           bpl eA8DB       sprawdza czy chodzi o rozszerzenie¢           cpx #$0B        i gdy tak jest porwnuje indeks z maksymaln⇧¢           bcc eA8DC       dla niego warto③ci⇧.¢  eA8DB    rts             W przeciwnym wypadku si❎ koczy.¢¢  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 prawid owym, a indeks nie¢           bne eA792       przekroczy  5 (najd uəsza nazwa urz⇧dzenia) poszu-¢           beq eA80F       kiwanie jest kontynu owane.¢¢  eA7A4    lda device      Gdy procedura odnalez a dwukropek typ urz⇧dzenia¢           and #$0F        jest kasowany.¢           sta device      Pozostawiany jest numer urz⇧dzenia.¢           cpy #$02¢           bne eA7BE¢¢           ldy #$00        Gdy indeks dwukropka rwny dwa (deklaracja typu D1:)¢           lda (bufadr),y¢           jsr TOUPPER     pobierany jest pierwszy znak nazwy¢           cmp #'D'        i porwnywany z D¢           bne eA7DC       gdy jest on rəny od tego znaku wywo ywany 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 d ugiej (car:,dsk:,itp.).¢  eA7C6    lda (bufadr),y  Znaki s⇧ pobierane w odwrotnej kolejno③ci,¢           jsr TOUPPER¢           dex¢           cmp devnmtab-1,x i porwnywane z nazw⇧ z tablicy.¢           bne eA7D6¢           dey             Gdy porwnanie prawid owe zmniejszany jest indeks.¢           bpl eA7C6¢           bmi eA7E1       Gdy porwnano wszystkie bajty nazwa prawid owa.¢¢  eA7D6    txa             Gdy wyst⇧pi a niezgodno③⇨ nazw ustalany jest indeks¢           and #$1C        nowej poprzez wyzerowanie dwch najm odszych bitw.¢           tax             Gdy indeks rwny zero, czyli procedura porwna a¢           bne eA7C4       wszystkie nazwy z tabeli, to koczy si❎ b ❎dem.¢¢  eA7DC    lda #$82        Gdy z a 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 porwnywany 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      bitw.¢           sta device¢¢           iny             Indeks zwi❎kszany o jeden dla znaku dwukropka.¢           dta b($2C) bit¢¢  eA80F    ldy #$00        Dla nazw nieprawid owych d ugo③⇨ jest zerowana.¢¢           org $A811   ADD Y to BufAdr.¢¢  addyba   tya             W ostatnim etapie do wska♪nika dodana zostaje¢           clc             d ugo③⇨ 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 ca o③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 koca znak ③cieəki.¢           bcc eA850¢           beq eA850¢  eA85F    iny¢  eA860    lda #$00        Na kocu procedura umieszcza znak EOL.¢           sta path,y¢           jmp addyba      Dodaje do wska♪nika d ugo③⇨ ③cieəki.¢¢      Procedura pobiera znak z buforu i porwnuje go z przedzia ami.¢  Daje wynik c=0 dla znaku z <0;9> lub <?;Z> lub _ dla innych znakw¢  daje       z=1 dla znaku . lub * w rejestrze F. Ponadto zamienia znak \ na¢  rwnawaə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 kocu dla znakw . i * ustawiany jest z=1.¢           beq eA908¢           cmp #'.'¢  eA908    sec             Funkcja koczy si❎ wynikiem c=1.¢           rts¢¢      Procedura porwnuj⇧ca znak nazwy z dopuszczlnym zakresem znakw.¢  To znaczy bez znakw semigraficznych, bez znakw w negatywie, bez spacji,¢  ③rednika i przecinka. Z y znak niesie w F z=1.¢¢           org $A90A   COMpare With Good char.¢¢  tempchar equ $CBF¢¢  cmpwg    cmp #'Ç'        Procedura porwnuje 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.¢