home *** CD-ROM | disk | FTP | other *** search
/ Syzygy Magazine 6 / Syzygy_Magazine_6_1999___pl_Disk_2_of_3_Side_B.atr / sparta2.arc / SPARTA18.DOC < prev    next >
Text File  |  1988-09-01  |  16KB  |  1 lines

  1.       Osobn⇧ i bardzo rozbudowan⇧ procedur⇧ bibloteki jest funkcja wyj③cia¢  PRINTF. Formatuje ona ci⇧g tekstowy wed ug pewnych zasad. Jako symbol¢  formatuj⇧cy przyj❎to znak %. I tak :¢¢  Ci⇧g   - znaczenie :¢¢      %% - pojedyczy znak %,¢      %b - bajt w postaci dziesi❎tnej,¢      %d - s owo w postaci dziesi❎tnej (2 bajty),¢      %e - d ugie s owo 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 parametrw umieszczone s⇧ w kolejno③ci wyst❎powania¢  za ci⇧giem tekstowym. Ci⇧g tekstowy zakoczony jest zerem.¢  Procedura zg asza b ⇧d w U_FAIL, ponadto zachowuje wszystkie trzy rejstry¢  procesora. Uwaga procedur❎ trzeba wywo ywa⇨ poprzez JSR !¢¢      Przyk ad :¢¢           ...¢¢           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 pozosta ymi wywo aniami ktre 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♪nikw.¢           iny¢           bne eA94B¢¢  eA952    clc             Po ich odnalezieniu procedura ustawia DSKFMS jako¢           tya             wska♪nik do tablicy wska♪nikw.¢           adc bufadr¢           sta dskfms¢           lda bufadr+1¢           adc #$00¢           sta dskfms+1¢¢           ldy #$01¢  eA960    lda (bufadr),y  Teraz procedura czyta poszczeglne bajty ci⇧gu¢           beq eA96F¢           iny¢           cmp #'%'        i gdy nie s⇧ one znakiem EOF porwnuje je z¢           beq eA981       znakiem formatuj⇧cym.¢           jsr FPUTC       Gdy nim nie s⇧ procedura wysy a 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♪nikw zostaje od oə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 d ugo③⇨ 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 wype nie¢           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 d ugo③ci.¢           sta pcharcnt¢¢           ldx #$06        Teraz procedura sprawdza jaki to ci⇧g formatuj⇧cy¢           lda (bufadr),y  poprzez porwnywanie 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       wywo uje odpowiedni⇧ funkcj❎.¢           pla             po niej od③wierza indeks ci⇧gu g wnego¢           tay¢           jmp eA960       i zamyka p❎tl❎.¢¢  eA9C4    lda psadrh,x    Odpowiedni adres pobierany jest z tablic i¢           pha             odk adany na stos, po czym nast❎puje wywo anie 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 znakw o podanym¢  wska♪niku do wska♪nika lub podanym wska♪niku. D ugo③⇨ 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 kocem ci⇧gu wysy a 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 znakw¢           jsr FPUTC       procedura wype nia wolne miejsce spacjami aə¢  eAA10    iny             od wype nienia d ugo③ci za oəonej.¢           bne eAA06¢  eAA13    rts             Po wys aniu ca ego ci⇧gu procedura si❎ koczy.¢¢      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 wys ania z divend i¢           jmp FPUTC       wysy a go na urz⇧dzenie.¢¢      Procedura wy③wietla jedno bajtow⇧ liczb❎ dziesi❎tn⇧. D ugo③⇨ za oə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 rwna '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 d ugo③ci pcharcnt lub o③miu znakw 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 kocu procedura sprawdza czy jest za oəona¢           bne eAA63       d ugo③⇨ tekstu wynikowego.¢¢           tax             Gdy go nie ma pocz⇧tkowym indeksem DECOUT jest zero.¢¢           lda #' '¢  eAA5B    cmp decout,x    Teraz znak jest porwnywany ze spacj⇧.¢           bne eAA6E¢           inx             I gdy ni⇧ w a③nie jest pobierany jest nast❎pny znak¢           bne eAA5B       aə do napotkania znaku rənego od niej.¢¢  eAA63    sec             Gdy by a za oəona d ugo③⇨ to wed ug 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 wysy any na urz⇧dzenie.¢           inx¢           cpx #$08        Tak zostaj⇧ wys ane wszystkie znaki z DECOUT¢           bne eAA6E¢           rts             i procedura si❎ koczy.¢¢      Procedura czy③ci bufor DECOUT.¢¢           org $AA81 CLeaR DecOUT.¢¢  decout   equ $A45¢¢  clrdout  ldx #$07        Procedura czy③ci bufor DECOUT poprzez¢           lda #' '        wype nienie go spacjami.¢  eAA85    sta decout,x¢           dex¢           bpl eAA85¢           rts¢¢      Procedura wy③wietla liczb❎ HEX o d ugo③ci z pcharcnt lub¢  d ugo③ci sze③ci znakw (trzech bajtw 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 d ugo③ci.¢           bne eAA93¢¢           lda #$06        Gdy nie by o ograniczenia d ugo③⇨ ustawiana na¢                           sze③⇨ znakw.¢  eAA93    tay             D ugo③⇨ 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 m odsze 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 wysy a 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 wed ug 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♪nikw.¢           adc dskfms¢           sta dskfms¢           bcc eAACA¢           inc dskfms+1¢  eAACA    ldy #$02¢  eAACC    lda (dskutl),y  A na kocu przenosi wkazywan⇧ trzy bajtow⇧ liczb❎¢           sta divend,y    do divend, po czym¢           dey¢           bpl eAACC¢           pla             koczy 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      przedzia ach 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 litera y zamieniane s⇧¢           cmp #'0'        duəe litery,¢           bcc eAB25       nast❎pnie sprawdzane s⇧ przedzia y 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 litera u¢                           wzgl❎dem liczb.¢  eAB41    and #$0F        Teraz kasowane s⇧ warto③ci ATASCII i¢           asl @¢           asl @¢           asl @           uzyskana liczba przeswana jest na najstarsze¢           asl @           pozycje w bajci.¢           ldx #$04¢  eAB49    asl @           Nast❎pnie poprzez cztero krotny przesw jest¢           rol divend      ona wlewana do DIVEND¢           rol divend+1¢           dex¢           bne eAB49¢           beq eAB29       i pobierany jest nast❎pny znak.¢¢           end of doc.¢