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

  1.            Pierwszym sterownikiem SDX zainstalowanym zaraz po starcie jest¢  program obs ugi urz⇧dzenia CAR:. Wydaje si❎ by⇨ to logiczne ze wzgl❎du na to¢  əe sterowniki systemowe (np. SPARTA.SYS) mog⇧, albo musz⇧ by⇨ wczytane¢  w a③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 modu u ROM,¢           jsr jcar_sw¢           jsr CARmain     wywoluje odpowiedni⇧ procedur❎,¢           jmp jcar_old    i przywraca poprzedni stan modu u.¢¢¢  G wna procedura obs ugi 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 wywo ania tycz⇧¢           beq cgetcwd     sie funkcji GETCWD i GETFREE i gdy tak jest s⇧¢           cpy #$13        one natychmiastowo wywo ywane.¢           beq cgetdfre¢¢           lda siocbidx¢  eBBAC    cmp cariocb     Wszystkie inne wymagaj⇧ jednego kana u dla operacji¢           bne eBBD0       (zamkni❎tego lub otwartego) co sprawdzane jest przez¢           cpy #$06        zgodno③⇨ stanw numeru iocb systemowego i numeru dla¢           beq cfnext      CAR. Gdy tak nie jest procedura si❎ koczy z b ❎dem.¢           cpy #$0A¢           beq cffirst     Teraz odpowiednio dla numeru funkcji wywo ywana 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 zakoczenie b ❎du kana  CAR: jest zamykany.¢           stx cariocb¢           rts¢¢  A to procedury dla poszczeglnych 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 rejestrw procedury obs ugi.¢           lda faux1+1¢           sta cfptr+1¢¢           org $BBE7   Car File TELL¢¢  cftell   lda cfptr       Procedura przepisuje aktualne ustawienie z¢           sta faux1       rejestrw.¢           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 dyskw wczytaywany jest fragment¢           dex             pierwszego sektora.¢           bpl eBBF8¢           lda #$01        Na kocu 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 sektorw¢           dta a($00)      fresec liczba sektorw 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 znakw wyznaczaj⇧cy¢           sta path        ③cieək❎ dost❎pu, to znaczy katalog g wny.¢           lda #$01        Na koniec ustawia poprawny wynik.¢           rts¢¢  Procedura odnajduj⇧ca pierwszy wpis spe niaj⇧cy warunki nazwy i atrybutw¢  pliku w katalogu bierz⇧cym, oraz procedura odnajduj⇧ca nast❎pny wpis spe nia-¢  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❎ koczy.¢           bmi eBC20¢¢           org $BC16   Car Find Next file.¢¢  cfnext   jsr ccmpname    Teraz wczytywany jest nast❎pny wpis katalogu i¢           bmi eBC1E       porwnywany z stawianymi warunkami. Gdy procedura¢           lda #$01        koczy 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 omwiona zostanie dok adnie 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     kana u i koczy 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      w asnego 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 modu u 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 porwnywanie¢                           ich ustalon⇧, gdy procedura si❎ koczy 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 d ugo③⇨ 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 koczy 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 koczy si❎ wynikem poprawnym.¢           rts¢¢     A oto procedury wywo ywane 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 d ugo③⇨ zbioru na 256¢           sta cflen+1     bajtw.¢           jsr sdirbuf     Teraz procedura czyta pierwszy wpis w katalogu i¢           jmp scfln       na koniec ustawia rzeczywist⇧ d ugo③⇨ 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 koczy¢           bmi eBCD3       si❎.¢¢           lda dirfatr     W innym przypadku porwnuje zgodno③⇨ atrybutw 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       Porwnanie dla jokerw jest pomijane.¢           cmp dirfname-1,x¢           bne ccmpname    Gdy wykryta jest niezgodno③⇨, pobierany jest inny¢  eBCD0    dex             wpis.¢           bne eBCC4¢  eBCD3    rts             Gdy porwnanie prawid owe procedura si❎ koczy.¢¢¢           Nast❎pne procedura ma dwa wej③cia, dzi❎ki czemu moəe ustawia⇨ dwa¢  parametry, start i d ugo③⇨ pliku, lub jeden d ugo③⇨ pliku.¢¢           org $BCD4   Set Car File STart and LeN.¢¢  dir1sec  equ $78A¢  cfstart  equ $BD1¢¢  scfstln  ldx #$00        Procedura ustawia indeks dla dwch 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 d ugo③⇨ 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. Wywo ywana 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 d ugo③ci pliku odejmowana jest jego aktualna¢           sbc cfptr,x     pozycja w celu uzyskania ilo③ci bajtw dla¢           sta cftop,x     operacji.¢           inx¢           dey¢           bne eBD04¢¢           lda cftop       Teraz sprawdzane jest czy ilo③⇨ bajtw do¢           cmp faux4       za adowania nie przekracza ilo③ci rzeczywistej.¢           lda cftop+1¢           sbc faux4+1¢           bcs eBD35¢¢           lda cftop       Gdy tak jest ustawiana jest nowa d ugo③⇨ 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 modu u.¢           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 modu u ($A000) i ustawiany jest wska♪nik.¢           pla¢           lsr @           Teraz na podstawie od③wierzonego starszego bajtu¢           lsr @           adresu wyznaczany jest numer banku modu u 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③⇨ bajtw 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❎ koczy.¢¢      Ostatnia procedura s uəy do przepisywania blokw pami❎ci. Jest ona¢  umieszczona w j⇧drze systemu jako əe moəe przepisywa⇨ blok z modu u 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 modu u.¢           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, niepe na¢  e0BB5    tya             strona pami❎ci.¢           beq e0BC0¢           dey¢           lda (zbufa),y¢           sta (zdrva),y¢           clc¢           bcc e0BB5¢¢  e0BC0    sta cbank_1     Na kocu procedura uaktywnia bank 1 modu u i¢           rts             koczy si❎.¢¢           end of file¢