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

  1.       Inn⇧ grup❎ procedur stanowi⇧ typowe funkcje IO dla plikw. Wywo uj⇧ one¢  w sposb zwykle bezpo③redni funkcje serca systemu.¢¢      Pierwsze dwie funkcj❎  ⇧cz⇧ si❎ w jedn⇧ procedur❎.¢  Funkcja FREAD czyta, a funkcja FWRITE zapisuje blok danych. Wymagaj⇧ one¢  ustawionych rejestrw FAUX1-adres bufora danych, FAUX4-d ugo③⇨ bufora.¢  D ugo③⇨ bufora zawsze wi❎ksza niə zero !¢  Funkcje zwracaj⇧ X=0 i w F N=0 gdy operacja bezb ❎dna,¢  warto③ci X=$FF i w F N=1 gdy nast⇧pi  b ⇧d EOF,¢  w przypadku innego b ❎du jest on sygnalizowany przez U_FAIL.¢¢           org $AC14 File READ.¢¢  jkernel  equ $703¢  icax6zs  equ $C3B¢  U_FAIL   equ $A6BE¢  bfout    equ $AE4F¢¢  FREAD    lda #$00¢           dta b($2C) bit¢¢           org $AC17 File WRITE.¢¢  FWRITE   lda #$01        Na pocz⇧tku procedura ustawia w A kod operacji.¢  eAC19    pha             Ten kod jest teraz zapami❎tywany.¢           jsr bfout       Wywo ywana jest funkcja kasuj⇧ca bufor dla kana u.¢           pla             Kod operacji przenoszony jest do Y i¢           tay¢¢           org $AC1F¢¢  jkrlaet  jsr jkernel     Wywo ywane jest serce systemu.¢¢           org $AC22¢¢  rkrlaet  cmp #$00        Teraz porwnywany jest wynik operacji.¢           bpl eAC33¢           cmp #$88¢           beq eAC2D¢           jmp U_FAIL      Gdy wyst⇧pi  b ⇧d rəny od EOF.¢¢  eAC2D    lda icax6zs     Gdy wyst⇧pi  b ⇧d EOF sygnalizowany jest¢           ldx #$FF        w F przez N=1 i w X.¢           rts¢¢  eAC33    lda icax6zs     Gdy nie wyst⇧pi  b ⇧d X=0, a w¢           ldx #$00        A niesiony icax6zs (dla uproszczenia operacji¢           rts             FPUTC i FGETC).¢¢      Nast❎pna grupa procedur wymaga ustawienia wska⇩nika specyfikacji pliku w¢  FILE_P, a urz⇧dzenia domy③lnego w CURDEV. Procedury b ⇧d zg aszaj⇧ przez¢  U_FAIL.¢¢  REMOVE   - kasowanie pliku.¢  MKDIR    - tworzenie katalogu.¢  RMDIR    - kasowanie katalogu.¢  CHMOD    - zmiana atrybutw pliku.¢           Procedura wymaga nowych atrybutw w fatr2.¢  GETDFREE - pobiera nag wek dyskowy do PATH.¢  SETBOOT  - ustawia plik startowy dysku.¢  FFIRST   - znajduje pierwszy plik spe niaj⇧cy warunki nazwy i atrybutw i¢           ustawia jego wpis katalogowy w DIRBUF ($789).¢¢           org $AC39 REMOVE file.¢¢  U_GEFINA equ $A71C¢  jkrlaet  equ $AC1F¢¢  REMOVE   lda #$0C        Procedury ustalaj⇧ swj kod wewn❎trzny.¢           dta b($2C) bit¢¢           org $AC3C MaKe subDIRectory.¢¢  MKDIR    lda #$0E¢           dta b($2C) bit¢¢           org $AC3F ReMove subDIRectory.¢¢  RMDIR    lda #$0F¢           dta b($2C) bit¢¢           org $AC42 CHange file MODe.¢¢  CHMOD    lda #$0D¢           dta b($2C) bit¢¢           org $AC45 GET Disk FRee bytes.¢¢  GETDFREE lda #$13¢           dta b($2C) bit¢¢           org $AC48 SET BOOT file.¢¢  SETBOOT  lda #$12¢           dta b($2C) bit¢¢           org $AC4B File FIRST.¢¢  FFIRST   lda #$0A¢¢           pha             Teraz jest on zapami❎tywany i wyw ywana jest¢           jsr U_GEFINA    procedura dekoduj⇧ca specyfikacj❎.¢           pla¢           tay             Na koniec w Y ustawiany jest kod operacji i¢           jmp jkrlaet     wywo ywana jest procedura wykonuj⇧ca i testuj⇧ca¢                           wynik.¢¢      Teraz ciekawa funkcja otwierania zbioru.¢  Wymaga ona wska⇩nika specyfikacji pliku w FILE_P, domy③lne urz⇧dzenie w¢  CURDEV trybu otwarcia w OPMODE.¢  B ⇧d sygnalizowany jest przez U_FAIL.¢  Poprawno③⇨ operacji zg aszana w F Z=1.¢¢           org $AC56 File OPEN.¢¢  bufadr   equ $15¢  buf580   equ $580¢  opmode   equ $778¢  device   equ $761¢  path     equ $7A0¢¢  jkernel  equ $703¢  U_GEFINA equ $A71C¢  setdev   equ $A78A¢  cphanme  equ $A83C¢  jkrlaet  equ $AE4F¢  GETENV   equ $BA93¢¢  FOPEN    jsr U_GEFINA    Na pocz⇧tku procedura pobiera specyfikacj❎ pliku.¢¢           lda opmode¢           tax¢           and #$DF        Procedura najpierw kasuje bit szlaku.¢           sta opmode¢           txa¢           and #$2C        Nast❎pnie bada czy chodzi o otwarcie do odczytu¢           cmp #$24        z przeszukiwaniem szlaku.¢           bne eACB5¢¢           lda path        Gdy tak jest bada d ugo③⇨ ③cieəki (dla otwarcia ze¢           bne eACB5       szlakiem nie podaje si❎ ③cieəki).¢¢           lda device      Gdy nie ma ③cieəki zapami❎tywane jest uəywane¢           pha             urz⇧dzenie.¢¢           lda <pathtxt    Teraz procedura pobiera zmienn⇧ ③rodowiskow⇧ PATH¢           ldx >pathtxt    okre③laj⇧c⇧ szlak poszukiwa.¢           jsr GETENV¢           bmi eACAC¢¢           lda <buf580     Procedura ustala wska♪nik do bufora wynikowego¢           sta bufadr      procedury GETENV.¢           lda >buf580¢           sta bufadr+1¢¢  eAC83    ldy #$00        Teraz zaczyna si❎ p❎tla poszukiwa.¢           lda (bufadr),y  Najpierw procedura bada czy nie nast⇧pi  koniec¢           beq eACAC       zmiennej ③rodowiskowej.¢           cmp #$9B¢           beq eACAC¢¢           jsr setdev      Gdy tak nie jest ustawia DEVICE,¢           lda #$FF¢           jsr cphanme     i PATH wed ug danych ③cieəki.¢¢           ldy #$09¢           jsr jkernel     Teraz nast❎puje prba otwarcia zbioru.¢           bpl eACBA¢¢           ldy #$00        A gdy si❎ nie powiod a procedura ponownie¢           lda (bufadr),y  sprawdza czy nast⇧pi  koniec szlaku i¢           cmp #$9B¢           beq eACAC¢¢           inc bufadr      gdy tak nie jest zwi❎ksza wska♪nik do bufora¢           bne eAC83       w celu przeskoczenia ③rednika.¢           inc bufadr+1¢           bne eAC83¢¢  eACAC    pla             Gdy nast⇧pi  koniec szlaku ustawiane jest stare¢           sta device      urz⇧dzenie, ③cieəka jest kasowana.¢           lda #$00¢           sta path¢¢  eACB5    ldy #$09        Teraz nast❎puje otwarcie ostatnie otwarcie pliku i¢           jmp jkrlaet     testowanie wyniku.¢¢  eACBA    pla             Gdy procedura znalaz a plik wed ug szlaku¢           lda #$00        zdejmuje warto③⇨ starego urz⇧dzenia z stosu i¢           rts             powraca z wynikiem A=0 i w F Z=1.¢¢  pathtxt  dta c'PATH',b($9B) Nazwa zmiennej ③rodowiskowej.¢¢      Nast❎pna grupa procedur odwo uje si❎ do plikw juə otwartych.¢  Funkcja FSEEK wymaga ustawionych AUX1-3, a funkcje FTELL i FILELENG ustawiaj⇧¢  te rejestry. B ⇧d sygnalizowany jest przez U_FAIL.¢¢  FCLOSE   - zamyka plik.¢  FNEXT    - znajduje kolejny plik w katalogu spe niaj⇧cy warunki nazwy i¢           atrybutw i wstawia jego wpis w pole DIRBUF ($789).¢  FTELL    - odczytuje ustawienie wska♪nika pliku i ustawia je w AUX1-3.¢  FSEEk    - ustawia wska♪nik na pozycj❎ podan⇧ w AUX1-3.¢  FILELENG - podaje d ugo③⇨ pliku w AUX1-3.¢¢           org $ACC3 File CLOSE.¢¢  jkrlaet  equ $AC1F¢  bfout    equ $AE4F¢¢  FCLOSE   lda #$07        Procedury ustalaj⇧ swj kod.¢           dta b($2C) bit¢¢           org $ACC6 File NEXT.¢¢  FNEXT    lda #$06¢           dta b($2C) bit¢¢           org $ACC9 File TELL.¢¢  FTELL    lda #$03¢           dta b($2C) bit¢¢           org $ACCC File SEEK.¢¢  FSEEK    lda #$02¢           dta b($2C) bit¢¢           org $ACCF FILE LENGht.¢¢  FILELENG lda #$04¢¢           pha¢           jsr bfout       Teraz kasuj⇧ operacje buforowe.¢           pla¢           tay¢           jmp jkrlaet     I wywo uj⇧ serce z kontrol⇧ b ❎dw.¢¢¢      Nast❎pna procedura wymaga jako parametru specyfikacji pliku i po¢  przecinku lub spacji drugiej nazwy pliku. Procedura wymaga wska♪nika do¢  nazwy w FILE_P i urz⇧dzenia domy③lnego w CURDEV. B ⇧d zwracany przez U_FAIL.¢  Zamienia ona nazwy plikw.¢¢           org $ACDA RENAME file.¢¢  U_FAIL   equ $A6BE¢  U_GEFINA equ $A71C¢  PRO_NAME equ $A868¢  jkrlaet  equ $AC1F¢¢  name     equ $762¢  names    equ $76D¢¢  RENAME   jsr U_GEFINA    Na pocz⇧tku procedura pobiera specyfikacj❎ pliku.¢           cmp #' '¢           beq eACE5       Teraz porwnuje ostatni znak nazwy do separatora.¢           cmp #','¢           bne eACFB¢¢  eACE5    jsr PRO_NAME    Gdy tak jest ustawia pierwsz⇧ nazw❎ w NAME i¢¢           ldx #$0A¢  eACEA    lda name,x      kopiuje j⇧ do names.¢           sta names,x¢           dex¢           bpl eACEA¢¢           jsr U_GEFINA    Teraz procedura ustawia drug⇧ nazw❎ i wywo uje¢           ldy #$0B¢           jmp jkrlaet     odpowiedni⇧ procedur❎ z kontrol⇧ b ❎dw.¢¢  eACFB    lda #$A5        Gdy nie ma drugiej nazwy pliku procedura zg asza¢           jmp U_FAIL      b ⇧d.¢¢      Nast❎pne dwie procedury wymagaj⇧ nazwy katalogu wskazywanej przez FILE_P,¢  domy③lnego urz⇧dzenia w CURDEV. B ⇧d zg aszaj⇧ przez U_FAIL.¢¢  CHDIR    - zmienia bieə⇧cy katalog na ustawiony w PATH.¢  GETCWD   - podaje bieə⇧cy katalog w PATH.¢¢           org $AD00 CHange working DIRectory.¢¢  U_GEPATH equ $A719¢  jkrlaet  equ $AC1F¢¢  CHDIR    lda #$10        Procedury ustawiaj⇧ swoje kody.¢           dta b($2C) bit¢¢           org $AD03 GET Curent Working Directory.¢¢  GETCWD   lda #$11¢¢  eAD05    pha¢           jsr U_GEPATH    Wywo uj⇧ procedur❎ dekoduj⇧c⇧ nazw❎ na¢           pla             DEVICE i PATH.¢           tay¢           jmp jkrlaet     i wywo uj⇧ funkcj❎ z kontrol⇧ b ❎dw.¢¢      Nast❎pna procedura zamyka wszystkie kana y SDX danego poziomu systemu.¢  Wy ⇧cza ona teə kierowanie CON IO. Funkcj❎ wywo uje si❎ bez parametrw.¢  Zg asza ona b ⇧d poprzez U_FAIL. Naleəy wtedy wywo a⇨ j⇧ ponownie by¢  dokoczy a dzie a.¢¢           org $AD0E File CLOSE ALl.¢¢  slvtab   equ $720¢  devtab   equ $740¢  siocbidx equ $760¢  temp1    equ $C38¢  SYSLEVEL equ $C5E¢  conch_i  equ $A5E¢¢  XDIVIO   equ $ABEC¢  FCLOSE   equ $ACC3¢¢  FCLOSEAL ldx #$0F¢¢  eAD10    stx siocbidx    Na pocz⇧tku procedura sprawdza czy dany kana  jest¢           lda devtab,x    otwarty,¢           bmi eAD25¢           lda slvtab,x    czy moəliwe jest jego zamkni❎cie,¢           bmi eAD25¢           cmp SYSLEVEL    i czy jest to w a③ciwy poziom systemu.¢           bcc eAD25¢           jsr FCLOSE      Gdy tak jest procedura zamyka plik.¢  eAD25    ldx siocbidx¢           dex¢           bpl eAD10       I post❎puje tak poprzez wszystkie kana y.¢¢           ldy #$01¢  eAD2D    sty temp1¢           ldx conch_i,y   Teraz procedura sprawdza czy kana  kierowania CON IO¢           lda devtab,x¢           bpl eAD3B       zosta  zamkni❎ty.¢           jsr XDIVIO      I je③li tak zdejmuje kierowanie.¢  eAD3B    ldy temp1¢           dey¢           bpl eAD2D       I tak dla PUT i GET CON.¢           rts¢¢      Procedura ustawia nowy poziom systemu dla pliku. Pozwala to na¢  zabezpieczenie pliku przed zamkni❎ciem procedur⇧ FCLOSEAL.¢  Nowy poziom niesiony w A, kana  w siocbidx.¢      Procedura nie zg asza b ❎du i nie zmienia Y.¢¢           org $AD42 File Close LEVEL.¢¢  slvtab   equ $720¢  siocbidx equ $760¢¢  FCLEVEL  ldx siocbidx    Procedura pobiera indeks kana u i¢           sta slvtab,x    ustawia odpowiedni poziom w tabeli.¢           rts¢¢      Procedura zapisuje do pliku rekord tekstowy. Wska♪nik rekordu niesiony w¢  AX w Y niesiona d ugo③⇨ rekordu. Rekord koczy si❎ znakiem EOL=$9B.¢  B ⇧d zg aszany przez U_FAIL.¢¢           org $AD49 File PUT String.¢¢  bufadr   equ $15¢  ptmpy    equ $C3E¢¢  FPUTC    equ $AD8C¢¢  FPUTS    sta bufadr      Na pocz⇧tku procedura ustala wska♪nik do rekordu i¢           stx bufadr+1¢           sty ptmpy       zapami❎tuje Y.¢¢           ldy #$00¢  eAD52    cpy ptmpy       Procedura porwnuje ilo③⇨ wys anych bajtw z¢           beq eAD61       maksymaln⇧ warto③ci⇧.¢           lda (bufadr),y  Gdy s⇧ jeszcze bajty do wys ania pobiera i wysy a¢           jsr FPUTC       bajt.¢           iny¢           cmp #$9B        Porwnuje bajt z EOL.¢           bne eAD52¢  eAD61    rts             Gdy by  to ten znak lub gdy wys ano wszystkie bajty¢                           procedura si❎ koczy.¢¢¢      Procedura pobiera rekord o d ugo③ci w Y i wska♪niku w AX. W przypadku¢  b ❎du procedura zg asza go do U_FAIL.¢  Gdy wyst⇧pi  nadmiar danych mamy A=$FF, a gdy operacja przebieg a¢  pomy③lnie mamy w A=$0. Rejestr Y zwraca d ugo③⇨ rekordu.¢  Rekordy nie mog⇧ by⇨ d uəsze niə $FF.¢¢           org $AD62 File GET String.¢¢  bufadr   equ $15¢  temp1    equ $C38¢  ptmpy    equ $C3E¢¢  FGETC    equ $ADA1¢¢  FGETS    sta bufadr      Procedura ustala wska♪nik do rekordu i¢           stx bufadr+1¢           sty ptmpy       d ugo③⇨ rekordu.¢¢           ldy #$00¢           sty temp1       Teraz procedura ustala falg❎ przepe nienia.¢           dta ($24) bit¢¢  eAD6F    dey¢¢  eAD70    jsr FGETC       Teraz pobierany jest bajt z urz⇧dzenia i¢           sta (bufadr),y  wstawiany w bufor.¢           iny             Indeks bufora si❎ zwi❎ksza i procedura sprawdza¢           cmp #$9B        czy bajt by  znakiem EOL.¢           beq eAD86¢           cpy ptmpy       Gdy tak nie by o porwnywana jest liczba wczytanych¢           bne eAD70       bajtw z warto③ci⇧ zakoəon⇧.¢           lda #$FF¢           sta temp1       Gdy przeczytano juə wszystkie bajty ustawiana jest¢           bne eAD6F       flaga przepe nienia.¢  eAD86    lda temp1       Oraz ustala wynik.¢           cpx #$00¢           rts¢¢      Nast❎pne trzy procedury s uə⇧ do otrzymywania sformatowanego odczytu¢  katalogu. Pos uguj⇧ si❎ one funkcjami MISC systemu przez to nie zajmuj⇧¢  kana u SDX.¢¢  FDOPEN   - otwiera katalog do odczytu. Wymaga wska♪nika do specyfikacji w¢           FILE_P, atrybutw w fatr1, domy③lnego urz⇧dzenia w CURDEV.¢  FDGETC   - pobiera znak katalogu.¢  FDCLOSE  - zamyka kana .¢¢           org $AF3E Format Dir OPEN.¢¢  icaxb6z  equ $2F¢  icaxb6zs equ $C3B¢¢  jmisc    equ $709¢  U_GEFINA equ $A71C¢¢  FDOPEN   jsr U_GEFINA    Na pocz⇧tku procedura ustala DEVICE,PATH i NAME.¢           lda #$06¢           dta b($2C) bit  Nast❎pnie ustawia kod operacji.¢¢           org $AF44 Format Dir GET Char.¢¢  FDGETC   lda #$07¢           dta b($2C) bit¢¢           org $AF47 Format Dir Close.¢¢  FDCLOSE  lda #$08¢¢           jsr jmisc       Teraz wywo ywana jest odpowiednia funkcja MISC i¢           ldx icax6z¢           stx icax6zs     ustawiany jest jej wynik, po czym¢           jmp rkrlaet     jest on testowany.¢¢           end of doc.¢