Inn⇧ grup❎ procedur stanowi⇧ typowe funkcje IO dla plikw. Wywouj⇧ one¢ w sposb 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 rejestrw FAUX1-adres bufora danych, FAUX4-dugo③⇨ bufora.¢ Dugo③⇨ 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 Wywoywana jest funkcja kasuj⇧ca bufor dla kanau.¢ pla Kod operacji przenoszony jest do Y i¢ tay¢¢ org $AC1F¢¢ jkrlaet jsr jkernel Wywoywane jest serce systemu.¢¢ org $AC22¢¢ rkrlaet cmp #$00 Teraz porwnywany 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 zgaszaj⇧ przez¢ U_FAIL.¢¢ REMOVE - kasowanie pliku.¢ MKDIR - tworzenie katalogu.¢ RMDIR - kasowanie katalogu.¢ CHMOD - zmiana atrybutw pliku.¢ Procedura wymaga nowych atrybutw w fatr2.¢ GETDFREE - pobiera nagwek dyskowy do PATH.¢ SETBOOT - ustawia plik startowy dysku.¢ FFIRST - znajduje pierwszy plik speniaj⇧cy warunki nazwy i atrybutw i¢ ustawia jego wpis katalogowy w DIRBUF ($789).¢¢ org $AC39 REMOVE file.¢¢ U_GEFINA equ $A71C¢ jkrlaet equ $AC1F¢¢ REMOVE lda #$0C Procedury ustalaj⇧ swj 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 wywywana jest¢ jsr U_GEFINA procedura dekoduj⇧ca specyfikacj❎.¢ pla¢ tay Na koniec w Y ustawiany jest kod operacji i¢ jmp jkrlaet wywoywana 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 zgaszana 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 dugo③⇨ ③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 wedug danych ③cieəki.¢¢ ldy #$09¢ jsr jkernel Teraz nast❎puje prba otwarcia zbioru.¢ bpl eACBA¢¢ ldy #$00 A gdy si❎ nie powioda 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 znalaza plik wedug 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 odwouje si❎ do plikw 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 speniaj⇧cy warunki nazwy i¢ atrybutw 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 dugo③⇨ pliku w AUX1-3.¢¢ org $ACC3 File CLOSE.¢¢ jkrlaet equ $AC1F¢ bfout equ $AE4F¢¢ FCLOSE lda #$07 Procedury ustalaj⇧ swj 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 wywouj⇧ serce z kontrol⇧ b❎dw.¢¢¢ 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 plikw.¢¢ 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 porwnuje 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 wywouje¢ ldy #$0B¢ jmp jkrlaet odpowiedni⇧ procedur❎ z kontrol⇧ b❎dw.¢¢ eACFB lda #$A5 Gdy nie ma drugiej nazwy pliku procedura zgasza¢ jmp U_FAIL b⇧d.¢¢ Nast❎pne dwie procedury wymagaj⇧ nazwy katalogu wskazywanej przez FILE_P,¢ domy③lnego urz⇧dzenia w CURDEV. B⇧d zgaszaj⇧ 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 Wywouj⇧ procedur❎ dekoduj⇧c⇧ nazw❎ na¢ pla DEVICE i PATH.¢ tay¢ jmp jkrlaet i wywouj⇧ funkcj❎ z kontrol⇧ b❎dw.¢¢ Nast❎pna procedura zamyka wszystkie kanay SDX danego poziomu systemu.¢ Wy⇧cza ona teə kierowanie CON IO. Funkcj❎ wywouje si❎ bez parametrw.¢ Zgasza ona b⇧d poprzez U_FAIL. Naleəy wtedy wywoa⇨ j⇧ ponownie by¢ dokoczya dziea.¢¢ 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 wa③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 kanay.¢¢ 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 zgasza b❎du i nie zmienia Y.¢¢ org $AD42 File Close LEVEL.¢¢ slvtab equ $720¢ siocbidx equ $760¢¢ FCLEVEL ldx siocbidx Procedura pobiera indeks kanau 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 dugo③⇨ rekordu. Rekord koczy si❎ znakiem EOL=$9B.¢ B⇧d zgaszany 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 porwnuje ilo③⇨ wysanych bajtw z¢ beq eAD61 maksymaln⇧ warto③ci⇧.¢ lda (bufadr),y Gdy s⇧ jeszcze bajty do wysania pobiera i wysya¢ jsr FPUTC bajt.¢ iny¢ cmp #$9B Porwnuje bajt z EOL.¢ bne eAD52¢ eAD61 rts Gdy by to ten znak lub gdy wysano wszystkie bajty¢ procedura si❎ koczy.¢¢¢ Procedura pobiera rekord o dugo③ci w Y i wska♪niku w AX. W przypadku¢ b❎du procedura zgasza go do U_FAIL.¢ Gdy wyst⇧pi nadmiar danych mamy A=$FF, a gdy operacja przebiega¢ pomy③lnie mamy w A=$0. Rejestr Y zwraca dugo③⇨ rekordu.¢ Rekordy nie mog⇧ by⇨ duə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 dugo③⇨ rekordu.¢¢ ldy #$00¢ sty temp1 Teraz procedura ustala falg❎ przepenienia.¢ 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 byo porwnywana jest liczba wczytanych¢ bne eAD70 bajtw z warto③ci⇧ zakoəon⇧.¢ lda #$FF¢ sta temp1 Gdy przeczytano juə wszystkie bajty ustawiana jest¢ bne eAD6F flaga przepenienia.¢ eAD86 lda temp1 Oraz ustala wynik.¢ cpx #$00¢ rts¢¢ Nast❎pne trzy procedury suə⇧ do otrzymywania sformatowanego odczytu¢ katalogu. Posuguj⇧ si❎ one funkcjami MISC systemu przez to nie zajmuj⇧¢ kanau SDX.¢¢ FDOPEN - otwiera katalog do odczytu. Wymaga wska♪nika do specyfikacji w¢ FILE_P, atrybutw 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 wywoywana jest odpowiednia funkcja MISC i¢ ldx icax6z¢ stx icax6zs ustawiany jest jej wynik, po czym¢ jmp rkrlaet jest on testowany.¢¢ end of doc.¢