Osobn⇧ i bardzo rozbudowan⇧ procedur⇧ bibloteki jest funkcja wyj③cia¢ PRINTF. Formatuje ona ci⇧g tekstowy wedug pewnych zasad. Jako symbol¢ formatuj⇧cy przyj❎to znak %. I tak :¢¢ Ci⇧g - znaczenie :¢¢ %% - pojedyczy znak %,¢ %b - bajt w postaci dziesi❎tnej,¢ %d - sowo w postaci dziesi❎tnej (2 bajty),¢ %e - dugie sowo w postaci dziesi❎tnej (3 bajty),¢ %x - liczba w postaci heksadecymalnej,¢ %c - znak ATASCI,¢ %s - ci⇧g tekstowy (nieformatowany),¢ %p - ci⇧g tekstowy (nieformatowany).¢¢ Ci⇧g %p rəni si❎ od %s tym, əe zamiast wska♪nika do tekstu podajemy¢ wska♪nik do wska♪nika do tekstu.¢ Ponadto pomi❎dzy znakiem %, a liter⇧ formatuj⇧c⇧ moəna poda⇨ rozmiar ci⇧gu,¢ podaj⇧c rozmiar w postaci 0n okre③lamy wy③wietlanie zer zamiast spacji (dla¢ liczb). Gdy zamiast rozmiaru podamy znak * znaczy to əe umie③cili③my¢ jako parametr wska♪nik do rozmiaru.¢¢ Wska♪niki do danych parametrw umieszczone s⇧ w kolejno③ci wyst❎powania¢ za ci⇧giem tekstowym. Ci⇧g tekstowy zakoczony jest zerem.¢ Procedura zgasza b⇧d w U_FAIL, ponadto zachowuje wszystkie trzy rejstry¢ procesora. Uwaga procedur❎ trzeba wywoywa⇨ poprzez JSR !¢¢ Przykad :¢¢ ...¢¢ jsr printf¢ dta c'Tekst nr %*d',b($9B),b($0)¢ dta a(size_p),a(word_p)¢¢ ...¢¢ Procedura ma trzy pocz⇧tki, osobny dla Video (szybkich procedur ekranowych),¢ osobny dla CON (ze wzgl❎du na kierowanie IO) i osobny dla procedury plikowej.¢¢¢¢¢ org $A920 Video PRINT Formated string.¢¢ bufadr equ $15¢ dskfms equ $18¢ siocbidx equ $760¢ device equ $761¢ divend equ $A52¢ ptmpiocb equ $C39¢ ptmpdev equ $C3A¢ ptmpY equ $C3E¢ ptmpX equ $C3F¢ temp2 equ $C40¢ pcharcnt equ $C41¢ pzeroflg equ $C42¢¢ svpad equ $AAB2¢ getnumer equ $AAD8¢ putend equ $AB5C¢ swapc2v equ $AB9A¢ swapc2xp equ $ABA5¢ FPUTC equ $AD8C¢ TOUPPER equ $B442¢¢ VPRINTF jsr swapc2v Na pocz⇧tku procedura podmienia kana SDX na Video.¢ jmp eA93A¢¢ org $A926 con PRINT Formated string.¢¢ PRINTF jsr swapc2xp Na pocz⇧tku procedura podmienia kana SDX na zgodny¢ jmp eA93A z kierowaniem CON IO.¢¢ org $A92C File Print Formated string.¢¢ FPRINTF pha Procedura zapami❎tuje aktywny kana i urz⇧dzenie dla¢ lda siocbidx zgodno③ci z pozostaymi wywoaniami ktre teə to¢ sta ptmpiocb robi⇧.¢ lda device¢ sta ptmpdev¢ pla¢¢ eA93A sta temp2 Teraz procedura zapami❎tuje wszystkie rejestry.¢ sty ptmpy¢ stx ptmpx¢¢ pla Zdejmuj⇧c ze stosu adres powrotu procedura uzyskuje¢ sta bufadr wska♪nik do formatowanego tekstu zmniejszony o¢ pla jeden.¢ sta bufadr+1¢¢ ldy #$01¢ eA94B lda (bufadr),y Teraz procedura odszukuje koniec tekstu, bajt zero,¢ beq eA952 dla odnalezienia tablicy wska♪nikw.¢ iny¢ bne eA94B¢¢ eA952 clc Po ich odnalezieniu procedura ustawia DSKFMS jako¢ tya wska♪nik do tablicy wska♪nikw.¢ adc bufadr¢ sta dskfms¢ lda bufadr+1¢ adc #$00¢ sta dskfms+1¢¢ ldy #$01¢ eA960 lda (bufadr),y Teraz procedura czyta poszczeglne bajty ci⇧gu¢ beq eA96F¢ iny¢ cmp #'%' i gdy nie s⇧ one znakiem EOF porwnuje je z¢ beq eA981 znakiem formatuj⇧cym.¢ jsr FPUTC Gdy nim nie s⇧ procedura wysya je na urz⇧dzenie¢ jmp eA960 i p❎tla si❎ zamyka.¢¢ eA96F lda dskfms+1 Gdy nast⇧pi koniec tekst aktualny wska♪nik do¢ pha tablicy wska♪nikw zostaje odoəony na stos jako¢ lda dskfms adres powrotny.¢ pha¢ ldy ptmpy Rejestry zostaj⇧ od③wierzone swymi pierwotnymi¢ ldx ptmpx warto③ciami i¢ lda temp2¢ jmp putend nast❎puje koniec procedury.¢¢ eA981 ldx #$00 Teraz procedura sprawdza czy dugo③⇨ podci⇧gu¢ lda (bufadr),y rozpoczyna si❎ zerem.¢ cmp #'0'¢ bne eA98D¢ iny Gdy tak jest pobierany jest nast❎pny znak, i¢ lda (bufadr),y zmieniana jest warto③⇨ X.¢ dex¢¢ eA98D stx pzeroflg Teraz odpowiednio ustawiana jest flaga wypenie¢ cmp #'*' zerami.¢ bne eA99B Nast❎pnie procedura sprawdza czy znak to *.¢ iny¢ jsr svpad Gdy tak jest indeks jest przesuwany, procedura¢ jmp eA99E pobiera warto③⇨ wskazywan⇧ wska♪nikiem.¢¢ eA99B jsr getnumer W przeciwnym razie pobiera warto③⇨ numeryczn⇧.¢¢ eA99E lda divend I odpowiednio ustawia rejestr dugo③ci.¢ sta pcharcnt¢¢ ldx #$06 Teraz procedura sprawdza jaki to ci⇧g formatuj⇧cy¢ lda (bufadr),y poprzez porwnywanie znaku z¢ jsr TOUPPER¢ eA9AB cmp pschar,x tablic⇧.¢ beq eA9B6¢ eA9B0 dex Gdy znak nie zosta rozpoznany¢ bpl eA9AB¢ jmp eA960 zostaje pobrany nast❎pny znak (zamkni❎cie p❎tli).¢¢ eA9B6 iny Gdy znak zosta rozpoznany zwi❎ksza si❎ indek znaku,¢ jsr svpad procedura pobiera jego wska♪nik, divend.¢ tya zapami❎tuje indeks i¢ pha¢ jsr eA9C4 wywouje odpowiedni⇧ funkcj❎.¢ pla po niej od③wierza indeks ci⇧gu gwnego¢ tay¢ jmp eA960 i zamyka p❎tl❎.¢¢ eA9C4 lda psadrh,x Odpowiedni adres pobierany jest z tablic i¢ pha odkadany na stos, po czym nast❎puje wywoanie przez¢ lda psadrl,x rts.¢ pha¢ rts¢¢ pschar dta 'SCXBDEP' ($A9CD)¢¢ psadrh dta h(prints-1) ($A9D4)¢ dta h(printc-1)¢ dta h(printx-1)¢ dta h(printb-1)¢ dta h(printd-1)¢ dta h(printe-1)¢ dta h(printp-1)¢¢ psadrl dta l(prints-1) ($A9DB)¢ dta l(printc-1)¢ dta l(printx-1)¢ dta l(printb-1)¢ dta l(printd-1)¢ dta l(printe-1)¢ dta l(printp-1)¢¢ Procedury wy③wietlaj⇧ niesformatowany ci⇧g znakw o podanym¢ wska♪niku do wska♪nika lub podanym wska♪niku. Dugo③⇨ moəe by⇨ ustalona w¢ pcharcnt.¢¢ org $A9E2 PRINT string from Pointer.¢¢ dskutl equ $1A¢ pcharcnt equ $C41¢¢ FPUTC equ $AD8C¢¢ printp ldy #1 Procedura pobiera wska♪nik do wska♪nika i wstawia w¢ lda (dskutl),y wska♪nik.¢ tax¢ dey¢ lda (dskutl),y¢ sta dskutl¢ stx dskutl+1¢¢ org $A9EE PRINT String.¢¢ prints ldy #$00 Procedura czyta znak wskazywany wska♪nikiem¢ eA9F0 lda (dskutl),y¢ beq eAA01¢ cmp #$9B¢ beq eAA01¢ jsr FPUTC i gdy nie jest on kocem ci⇧gu wysya go na¢ iny urz⇧dzenie.¢ cpy pcharcnt Teraz sprawdza czy nast❎pi limitowany koniec ci⇧gu.¢ bne eA9F0¢¢ eAA01 lda pcharcnt Gdy nast⇧pi koniec ci⇧gu¢ beq eAA13¢ eAA06 cpy pcharcnt¢ beq eAA13¢ lda #' ' i limit wymaga wi❎cej znakw¢ jsr FPUTC procedura wypenia wolne miejsce spacjami aə¢ eAA10 iny od wypenienia dugo③ci zaoəonej.¢ bne eAA06¢ eAA13 rts Po wysaniu caego ci⇧gu procedura si❎ koczy.¢¢ Procedura wy③wietla znak ATASICII o podanym numerze.¢¢ org $AA14 PRINT Char.¢¢ divend equ $A52¢¢ FPUTC equ $AD8C¢¢ printc lda divend Procedura pobiera bajt do wysania z divend i¢ jmp FPUTC wysya go na urz⇧dzenie.¢¢ Procedura wy③wietla jedno bajtow⇧ liczb❎ dziesi❎tn⇧. Dugo③⇨ zaoəona w¢ pcharcnt, a drukowanie zer w pzeroflg.¢¢ org $AA1A PRINT Byte.¢¢ decout equ $A45¢ divend equ $A52¢¢ clrdout equ $AA81¢¢ printb jsr clrdout Procedura czy③ci bufor DECOUT.¢¢ lda divend Teraz procedura inicjuje A warto③ci⇧ DIVEND, a¢ ldx #'0'-1 X liczb⇧ ATASIC rwna '0'-1.¢¢ eAA22 inx Teraz procedura dzieli liczb❎ z DIVEND przez 100.¢ sec¢ sbc #100¢ bcs eAA22¢ adc #100¢ cpx #'0'¢ beq eAA31¢¢ stx decout+5 Gdy wynik liczba odejmowa rəna od zero jest ona¢ wpisywana w pole wyniku.¢¢ eAA31 ldx #'0'-1 Teraz procedura dzieli liczb❎ przez 10.¢ eAA33 inx¢ sec¢ sbc #10¢ bcs eAA33¢ adc #10¢ cpx #'0'¢ beq eAA42¢¢ stx decout+6 I gdy wynik rəny od zera wpisuje wynik.¢¢ eAA42 ora #'0' A do reszty dzielenia dodaje warto③⇨ ATASCII '0'¢ sta decout+7 i wpisuje w wynik.¢ bne printod Teraz nast❎puje skok cz❎③ci wypisuj⇧cej wynik.¢¢ Procedury PRINTD i PRINTE ⇧cz⇧ si❎ z PRINTOD i wypisuj⇧¢ liczb❎ dziesi❎tn⇧ 2 lub 3 bajtow⇧ o dugo③ci pcharcnt lub o③miu znakw gdy¢ pcharnct zero. Ponadto zast❎puj⇧ spacje zerami dla pzeroflg ujemnego.¢¢ org $AA49 PRINT DECimal.¢¢ decout equ $A45¢ divend equ $A52¢ pcharcnt equ $C41¢ pzeroflg equ $C42¢¢ jmisc equ $709¢ FPUTC equ $AD8C¢¢ printd lda #$00 Procedura kasuje najstarszy bajt liczby.¢ sta divend+2¢¢ org $AA4E PRINT Extra decimal.¢¢ printe lda #$05 Teraz nast❎puje zamiana liczby na tekst.¢ jsr jmisc¢¢ org $AA4E PRINT Out Decimal.¢¢ printod lda pcharcnt Na kocu procedura sprawdza czy jest zaoəona¢ bne eAA63 dugo③⇨ tekstu wynikowego.¢¢ tax Gdy go nie ma pocz⇧tkowym indeksem DECOUT jest zero.¢¢ lda #' '¢ eAA5B cmp decout,x Teraz znak jest porwnywany ze spacj⇧.¢ bne eAA6E¢ inx I gdy ni⇧ wa③nie jest pobierany jest nast❎pny znak¢ bne eAA5B aə do napotkania znaku rənego od niej.¢¢ eAA63 sec Gdy bya zaoəona dugo③⇨ to wedug nie zostaje¢ lda #$08 ustalany ineks pierwszego znaku w DECOUT.¢ sbc pcharcnt¢ bcs eAA6D Dla wielko③ci wi❎kszych niə osiem jest to zero.¢ lda #$00¢ eAA6D tax¢¢ eAA6E lda decout,x Teraz odpowiednie znaki s⇧ pobierane z DECOUT,¢ bit pzeroflg a gdy spacje maj⇧ by⇨ zast⇧pione zerami¢ bpl eAA78¢ ora #'0' jest to wykonywane przez sum❎ logiczn⇧¢ eAA78 jsr FPUTC i znak jest wysyany na urz⇧dzenie.¢ inx¢ cpx #$08 Tak zostaj⇧ wysane wszystkie znaki z DECOUT¢ bne eAA6E¢ rts i procedura si❎ koczy.¢¢ Procedura czy③ci bufor DECOUT.¢¢ org $AA81 CLeaR DecOUT.¢¢ decout equ $A45¢¢ clrdout ldx #$07 Procedura czy③ci bufor DECOUT poprzez¢ lda #' ' wypenienie go spacjami.¢ eAA85 sta decout,x¢ dex¢ bpl eAA85¢ rts¢¢ Procedura wy③wietla liczb❎ HEX o dugo③ci z pcharcnt lub¢ dugo③ci sze③ci znakw (trzech bajtw liczby) dla pcharcnt zero.¢¢ org $AA8C PRINT heXimal.¢¢ divend equ $A52¢ pcharcnt equ $C41¢¢ FPUTC equ $AD8C¢¢ printx lda pcharcnt Na pocz⇧tku procedura pobiera ograniczenie dugo③ci.¢ bne eAA93¢¢ lda #$06 Gdy nie byo ograniczenia dugo③⇨ ustawiana na¢ sze③⇨ znakw.¢ eAA93 tay Dugo③⇨ ustawiana jako licznik.¢¢ eAA94 dey Teraz licznik jest zmniejszany¢ tya¢ lsr @ i dzielony przez dwa dla uzyskania indeksu bajtu.¢ tax¢ lda divend,x Bajt ten jest pobierany i odpowiednio¢ bcc eAAA1¢ lsr @ gdy by parzysty pobierane s⇧ starsze¢ lsr @¢ lsr @¢ lsr @¢ eAAA1 and #$0F lub modsze bity.¢ ora #'0' Teraz sumuje si❎ je z ATASCII zero¢ cmp #'9'+1 i sprawdza czy chodzi o litery.¢ bcc eAAAB¢¢ adc #$06 gdy tak jest do ATASCII dodaje si❎ przesuni❎cie¢ liter wzgl❎dem cyfr.¢¢ eAAAB jsr FPUTC Teraz bajt wysya si❎ na urz⇧dzenie.¢ tya¢ bne eAA94 I gdy nie by to ostatni znak procedura si❎¢ rts powtarza.¢¢ Procedura ustawia wska♪nik dskutl do obiektu, wkieksza wska♪nik¢ dskfms i ustawia divend wedug wskaza dskutl.¢¢ org $AAB2 Set VAR Pointer And Divend.¢¢ dksfms equ $18¢ dskutl equ $1A¢ divend equ $A52¢¢ svpad tya Procedura zapami❎tuje wska♪nik tekstu.¢ pha¢ ldy #$01 Pobiera nast❎pny wska♪nik z tablicy i wstawia go w¢ lda (dskfms),y DSKUTL. mentu z tablicy.¢ sta dskutl¢ iny¢ lda (dskfms),y¢ sta dskutl+1¢ clc¢ lda #$02 Teraz zwi❎ksza wska♪nik do tablicy wska♪nikw.¢ adc dskfms¢ sta dskfms¢ bcc eAACA¢ inc dskfms+1¢ eAACA ldy #$02¢ eAACC lda (dskutl),y A na kocu przenosi wkazywan⇧ trzy bajtow⇧ liczb❎¢ sta divend,y do divend, po czym¢ dey¢ bpl eAACC¢ pla koczy si❎ od③wierzeniem indeksu tekstu.¢ tay¢ rts¢¢¢¢ Procedura pobiera sta⇧ numeryczn⇧ i zamienia j⇧ na liczb❎. Liczba moəe¢ by⇨ co najwyəej dwu bajtowa.¢¢ org $AAD8 GET NUMbER.¢¢ bufadr equ $15¢ divend equ $A52¢ temp3 equ $C43¢¢ TOUPPER equ $B442¢¢ getnumer lda #$00 Na pocz⇧tku procedura kasuje DIVEND,¢ sta divend¢ sta divend+1¢ sty temp3 i zapami❎tuje indeks tekstu.¢ lda (bufadr),y Teraz pobiera pierwszy znak liczby i gdy jest¢ cmp #'$'¢ beq eAB29¢¢ eAAE8 lda (bufadr),y on rəny od identyfikatora liczby hex pobiera znak¢ cmp #'0'¢ bcc eAB25 i sprawdza czy mie③ci si❎ on w odpowiednich¢ cmp #'9'+1 przedziaach dla licz dziesi❎tnych.¢ bcs eAB25¢ and #$0F Gdy tak jest kasuje warto③ci ATASCII¢ pha i zapami❎tuje liczb❎.¢ lda divend Teraz mnoəy liczb❎ w DIVEND razy dziesi❎⇨¢ ldx divend+1¢ asl @¢ rol divend+1 *2¢ asl @¢ rol divend+1 *2¢ adc divend¢ sta divend¢ txa¢ adc divend+1¢ sta divend+1 +divend¢ asl divend¢ rol divend+1 *2¢ pla¢ adc divend i dodaje now⇧ uzyskan⇧ z tekstu.¢ sta divend¢ bcc eAB22¢ inc divend+1¢ eAB22 iny¢ bne eAAE8 Teraz procedura pobiera nast❎pny znak.¢ eAB25 cpy temp3 Przy wyj③ciu procedura sygnalizuje wynik operacji.¢ rts Gdy w F Z=1 nie pobrano əadnego znaku.¢¢ eAB29 iny Dla licz hex najpierw zwi❎kszany jest indeks tekstu.¢ lda (bufadr),y Pobiera znak.¢ jsr TOUPPER Teraz pobierany jest znak i literay zamieniane s⇧¢ cmp #'0' duəe litery,¢ bcc eAB25 nast❎pnie sprawdzane s⇧ przedziay ATASCII dla¢ cmp #'9'+1 liczb HEX.¢ bcc eAB41¢ cmp #'A'¢ bcc eAB25¢ cmp #'F'+1¢ bcs eAB25¢ sbc #$06 Gdy litera odejmowane jest przesuni❎cie literau¢ wzgl❎dem liczb.¢ eAB41 and #$0F Teraz kasowane s⇧ warto③ci ATASCII i¢ asl @¢ asl @¢ asl @ uzyskana liczba przeswana jest na najstarsze¢ asl @ pozycje w bajci.¢ ldx #$04¢ eAB49 asl @ Nast❎pnie poprzez cztero krotny przesw jest¢ rol divend ona wlewana do DIVEND¢ rol divend+1¢ dex¢ bne eAB49¢ beq eAB29 i pobierany jest nast❎pny znak.¢¢ end of doc.¢