Najwi❎kszy stopie skomplikowania wykazuj⇧ dwie wydawaoby si❎ proste¢ funkcje. FPUTC i FGETC. Wynika to z dwch faktw:¢ 1. Serce SDX nie posiada odpowiednikw tych funkcji tak wi❎c procedury te¢ koəystaj⇧ z funkcji adowania bloku o dugo③ci 1 jednego bajtu.¢ 2. Procedury uəywaj⇧ mikrobuforw dla plikowych operacji jednobajtowych.¢ Wielokrotnie skraca to czas tych operacji kosztem rozbudowy procedur.¢¢ Procedury FPUTC i FGETC ⇧cz⇧ si❎ w jedn⇧. Ponadto numer kanau¢ siocbidx=100 ($64 hex) powoduje dla procedury PUT skok przez wektor PUT_V¢ czyli takzwanych szybkich procedur ekranowych. Bajt maj⇧cy by⇨ wy③wietlony¢ lub b❎d⇧cy pobrany niesiony jest w A. Koniec pliku sygnalizowany jest poprzez¢ ustawiony w F bit N=1 i warto③⇨ X=$FF (w przeciwnym razie N=0 i X=0). Inne¢ b❎dy sygnalizowane s⇧ przez U_FAIL.¢¢ Uwaga: FPUTC zachowuje wszystkie rejestry, a¢ FGETC zachowuje Y, w X wynik operacji, a w A pobrany bajt.¢¢ org $AD8C File PUT Char.¢¢ siocbidx equ $760¢ faux1 equ $782¢ minibuf equ $AD7¢ bfidx equ $C13¢ bfopcd equ $C14¢ bfoplen equ $C15¢ bfidx_t equ $C16¢ bfopcd_t equ $C26¢ bfgptr_t equ $C2A¢ bfpptr_t equ $C2E¢ icax6zs equ $C3B¢ bftmpx equ $C3C¢ bftmpy equ $C3D¢ PUT_V equ $C44¢¢ jkernel equ $703¢ U_FAIL equ $A6BE¢ bfout equ $AE4F¢ faxs2fax equ $AE9D¢ fax2faxs equ $AEA9¢ gpbuf equ $AEB5¢ ssbufor equ $AEEF¢ bfinit equ $AF10¢¢ FPUTC sta icax6zs Na pocz⇧tku procedura zapami❎tuje bajt do wysania¢ lda siocbidx i sprawdza numer kanau.¢ cmp #$64¢ bne eAD9C¢¢ lda icax6zs Gdy numer kanau wskazuje szybkie operacje ekranowe¢ jmp (PUT_V) s⇧ one wywoywane z warto③ci⇧ do wy③wietlenia w A.¢¢ eAD9C lda #$01 Gdy operacje dotycz⇧ normalnych urz⇧dze¢ jmp eADA5 ustawiany jest rodzaj operacji (PUT=1)¢¢ org $ADA1¢¢ FGETC ldx #$00 Dla operacji GET kasowany jest X (nie EOF) oraz¢ lda #$00 rodzaj operacji (GET=0).¢¢ eADA5 sta bfopcd W miejscu po⇧czenia procedur ustawiany jest rodzaj¢ stx bftmpx operacji oraz zapami❎tywane s⇧ rejstry X i Y.¢ sty bftmpy¢¢ ldy siocbidx Teraz procedura sprawdza czy dla danego kanau¢ ldx bfidx_t,y jest aktywny minibufor.¢ bpl eADDD¢¢ jsr ssbufor Gdy tak nie jest procedura sprawdza czy bufor moəe¢ bcc eADE8 zosta⇨ otwarty.¢ jsr fax2faxs Gdy nie moəe rejestry FAUX zostaj⇧ przepisane do¢ eADBE ldx #$05 cieni, a w ich miejsce zostaj⇧ wpisane parametry¢ eADC0 lda onechar,x operacji blokowej dla jednego znaku.¢ sta faux1,x¢ dex¢ bpl eADC0¢ ldy bfopcd Teraz zostaje wywoana odpowiednia funkcja serca¢ jsr jkernel systemu,¢ pha jej wynik zostaje zapami❎tany.¢ jsr faxs2fax Ustawione s⇧ poprzednie warto③ci FAUX i¢ pla procedura sprawdza poprawno③⇨ operacji.¢ bpl eAE0A¢ cmp #$88 Gdy wyst⇧pi b⇧d procedura sprawdza czy to EOF.¢ beq eAE34¢ jmp U_FAIL Gdy tak nie jest zgasza b⇧d.¢¢ eADDD stx bfidx Gdy dla kanau jest juə otwarty minibufor procedura¢ cmp bfopcd_t,x sprawdza czy wyst❎puje zgodno③⇨ operacji dla danego¢ beq eADEB buforu.¢¢ jsr bfout Gdy tak nie jest procedura zamyka uprzedni bufor.¢¢ eADE8 jsr bfinit Teraz inicjuje go jako nowy (pusty).¢¢ eADEB ldx bfidx Gdy bufor przygotowany do pracy¢ lda bfopcd_t,x procedura sprawdza rodzaj operacji.¢ cmp #$00¢ beq eAE14¢¢ ldy bfpptr_t,x Gdy chodzi o operacj❎ PUT procedura wpisuje bajt¢ lda icax6zs¢ sta minibuf,y na odpowiedni⇧ pozycj❎,¢ iny¢ tya¢ sta bfpptr_t,x zwi❎ksza t⇧ pozycj❎ i¢ and #$0F i sprawdza czy bufor jest cakowicie wypeniony.¢ bne eAE0A¢¢ jsr bfout Gdy tak jest procedura koczy operacj❎ z buforem.¢¢ eAE0A ldy bftmpy Gdy procedura przebiega pomy③lnie od③wierzane¢ lda icax6zs s⇧ wszystkie rejestry wraz z wynikem operacji i¢ ldx bftmpx procedura si❎ koczy.¢ rts¢¢ eAE14 lda bfgptr_t,x Dla operacji GET z buforem na pocz⇧tku sprawdzane¢ cmp bfpptr_t,x sprawdzane jest czy bufor jest juə cay odczytany.¢ bne eAE3C¢¢ jsr fax2faxs Gdy tak jest rejetry przepisywane s⇧ do cieni.¢ jsr gpbuf Pobierany s⇧ nowe dane do buforu.¢ jsr faxs2fax Ustawiane s⇧ rejestry, a¢ jsr bfinit rejestry buforu s⇧ inicjowane.¢¢ clc Teraz dugo③⇨ ustalana jest dugo③⇨ buforu poprzez¢ adc bfoplen dodanie ilo③ci zaadowanych bajtw.¢ sta bfpptr_t,x¢ cmp bfgptr_t,x¢ bne eAE14¢¢ eAE34 lda #$9B W przypadku b❎du EOF A ustawiany jest na EOL,¢ ldy bftmpy Y na pierwotn⇧ warto③⇨, a¢ ldx #$FF X na EOF i procedura si❎ koczy.¢ rts¢¢ eAE3C tay W przypadku gdy nie zosta odczytany cay bufor¢ lda minibuf,y jest z niego odczytywany znak, a¢ inc bfgptr_t,x wska♪nik jest zwi❎kszany.¢ ldy bftmpy I procedura si❎ koczy z od③wierzonym Y i¢ ldx #$00 skasowanym X oraz Z=1 w F.¢ rts¢¢ onechar dta a(icax6zs) One char operation.¢ dta a($0001) Adres,Lenght and syscall.¢ dta b($00)¢¢ Procedura koczy operacj❎ z mini buforem.¢ {⇧czy si❎ ona z procedur⇧ kasowania buforu oraz z procedur⇧ przepisywania¢ rejestrw cieni do rejestrw podstawowych.¢¢ org $AE4F BuFor OUT.¢¢ siocbidx equ $760¢ faux1 equ $782¢ bfidx equ $C13¢ bfidx_t equ $C16¢ bfopcd_t equ $C26¢ bfgptr_t equ $C2A¢ bfpptr_t equ $C2E¢ fauxs equ $C32¢¢ jkrlaet equ $AC1F¢ bfclr equ $AE8F¢ fax2faxs equ $AEA9¢¢ bfout ldy siocbidx Na pocz⇧tku procedura sprawdza czy kana SDX ma¢ ldx bfidx_t,y przypisany bufor.¢ bmi eAEA8¢¢ stx bfidx Gdy tak jest ustala ona numer kanau i¢¢ jsr fax2faxs przepisuje rejestry do cieni.¢¢ lda bfopcd_t,x Teraz procedura ustala typ operacji.¢ cmp #$00¢ beq eAE6A¢¢ jsr gpbuf Dla operacji PUT bufor jest zapisywany do¢ jmp bfclr pliku, a nast❎pnie zamykany.¢¢ eAE6A ldy #$03 Dla operacji GET ustawiana jest aktualna pozycja w¢ jsr jkrlaet pliku (FTELL).¢¢ ldx bfidx¢ lda bfpptr_t,x Nast❎pnie procedura oblicza ilo③⇨ pobranych z¢ sbc bfgptr_t,x buforu bajtw,¢ eor #$FF przedstawion⇧ j⇧ jako warto③⇨ ujemna i¢¢ ldy #$03¢ ldx #$00¢ eAE7E adc faux1,x i odejmuje j⇧ od pozycji w pliku.¢ sta faux1,x¢ lda #$FF¢ inx¢ dey¢ bne eAE7E¢¢ ldy #$02 Na koniec ustala w pliku tak obliczon⇧ pozycj❎¢ jsr jkrlaet (FSEEK).¢¢ org $AE8F BuFor CLeaR.¢¢ bfclr ldy siocbidx Procedura kasuje przyporz⇧dkowanie kanaowi SDX¢ lda #$FF¢ sta bfidx_t,y buforu w tabeli numerw oraz¢ ldx bfidx¢ sta bfopcd_t,x kod operacji w tabeli operacji.¢¢ org $AE9D FAUXs Shadows to FAUX.¢¢ faxs2fx ldy #$05¢ eAE9F lda fauxs,y¢ sta faux1,y¢ dey¢ bpl eAE9F¢ eAEA8 rts¢¢ Procedura przepisuje rejestry FAUX kanau do rejestrw cieni.¢¢ org $AEA9 FAUXs to FAUXs Shadows.¢¢ faux1 equ $782¢ fauxs equ $C32¢¢ fax2faxs ldy #$05¢ eAEAB lda faux1,y¢ sta fauxs,y¢ dey¢ bpl eAEAB¢ rts¢¢ Procedura realizuje operacje odczytu i zapisu buforu.¢¢ org $AEB5 Get or Put BUFor.¢¢ faux1 equ $782¢ faux4 equ $785¢ syscall equ $786¢ minibuf equ $AD7¢ bfidx equ $C13¢ bfoplen equ $C15¢ bfopcd_t equ $C26¢ bfpptr_t equ $C2A¢ bfgptr_t equ $C2E¢¢ jkrlaet equ $AC1F¢¢ gpbuf ldx bfidx Na pocz⇧tku procedura pobiera numer buforu,¢ lda #$10 ustala jego dugo③⇨ dla GET,¢ ldy bfopcd_t,x i sprawdza rodzaj operacji.¢ cpy #$00¢ beq eAEC8¢¢ sec Gdy chodzi o operacj❎ PUT procedura ustala aktualn⇧¢ lda bfpptr_t,x dugo③⇨ buforu (przesuni❎cie-podstawa).¢ sbc bfgptr_t,x¢¢ eAEC8 sta faux4 Teraz ustawiane s⇧ rejestry dugo③ci¢ lda #$00¢ sta faux4+1¢ sta syscall i pami❎ci (0-main) dla operacji dla serca SDX.¢ txa¢ asl @¢ asl @¢ asl @¢ asl @ Nast❎pnie do adresu buforw pprocedura dodaje¢ ldx >minibuf wska♪nik do buforu¢ adc <minibuf¢ bcc eAEDF¢ inx¢ eAEDF sta faux1 i ustala ten adres w odpowiednich rejestrach.¢ stx faux1+1¢ jsr jkrlaet Na kocu wywoywana jest funkcja serca¢ lda faux4 i ustalana jest dugo③⇨ bajtw przeprowadzonej¢ sta bfoplen operacji.¢ rts¢¢ Procedura sprawdza moəliwo③⇨ uəywania minibuforu i odszukuje wolny bufor.¢¢ org $AEEF Sreach and Set bufor.¢¢ devtab equ $740¢ siocbidx equ $760¢ bfidx equ $C13¢ bfopcd_t equ $C26¢¢ ssbufor ldy siocbidx Na pocz⇧tku procedura sprawdza typ urz⇧dzenia dla¢ lda devtab,y ktrego wykonywana jest operacja.¢ bmi eAF09¢ and #$70 Gdy kana jest otwarty dla DSK: lub¢ beq eAEFF¢ cmp #$20 dla CAR: uəywane s⇧ minibufory.¢ bne eAF09¢¢ eAEFF ldx #$03 Wtedy teə procedura odszukuje wolny minibufor.¢ eAF01 lda bfopcd_t,x¢ bmi eAF0B¢ dex¢ bpl eAF01¢¢ eAF09 sec A gdy go nie znajdzie lub inne urz⇧dzenie zgasza¢ rts b⇧d w C=1.¢¢ eAF0B stx bfidx W przeciwnym razie ustawia indeks buforu i zgasza¢ clc znalezienie C=0.¢ rts¢¢ Procedura ustawia parametry buforu.¢¢ org $AF10 BuFor INITiation.¢¢ siocbidx equ $760¢ bfidx equ $C13¢ bfopcd equ $C14¢ bfidx_t equ $C16¢ bfopcd_t equ $C26¢ bfgptr_t equ $C2A¢ bfpptr_t equ $C2E¢¢ bfinit ldx bfidx Najpierw w tablicy operacji dla buforu¢ lda bfopcd¢ sta bfopcd_t,x ustawiany jest kod danej operacji.¢ ldy siocbidx¢ txa¢ sta bfidx_t,y Teraz w tablicy numerw ustawiany jest numer buforu¢ asl @ dla odpowiedniego kanau.¢ asl @¢ asl @¢ asl @¢ sta bfgptr_t,x Na koniec tablicach wska♪nikw dla buforw ustawiane¢ sta bfpptr_t,x s⇧ odpowiednie warto③ci dla get i put.¢ rts¢¢ Procedura kasuje wszystkie bufory.¢¢ org $AF2B CLeaR ALl BuFor.¢¢ bfidx_t equ $C16¢ bfopcd_t equ $C26¢¢ clralbf ldx #$03 Najpierw procedura kasuje¢¢ lda #$FF¢ eAF2F sta bfopcd_t,x tablic❎ typw operacji dla buforw.¢ dex¢ bpl eAF2F¢¢ ldx #$0F¢ eAF37 sta bfidx_t,x A nast❎pnie tablic❎ numerw buforw dla kanaw SDX.¢ dex¢ bpl eAF37¢ rts¢¢ end of doc.¢