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

  1.       Najwi❎kszy stopie skomplikowania wykazuj⇧ dwie wydawa oby si❎ proste¢  funkcje. FPUTC i FGETC. Wynika to z dwch faktw:¢      1. Serce SDX nie posiada odpowiednikw tych funkcji tak wi❎c procedury te¢  koəystaj⇧ z funkcji  adowania bloku o d ugo③ci 1 jednego bajtu.¢      2. Procedury uəywaj⇧ mikrobuforw dla plikowych operacji jednobajtowych.¢  Wielokrotnie skraca to czas tych operacji kosztem rozbudowy procedur.¢¢      Procedury FPUTC i FGETC  ⇧cz⇧ si❎ w jedn⇧. Ponadto numer kana u¢  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 wys ania¢           lda siocbidx    i sprawdza numer kana u.¢           cmp #$64¢           bne eAD9C¢¢           lda icax6zs     Gdy numer kana u wskazuje szybkie operacje ekranowe¢           jmp (PUT_V)     s⇧ one wywo ywane 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 kana u¢           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 wywo ana 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 zg asza b ⇧d.¢¢  eADDD    stx bfidx       Gdy dla kana u 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 ca kowicie wype niony.¢           bne eAE0A¢¢           jsr bfout       Gdy tak jest procedura koczy operacj❎ z buforem.¢¢  eAE0A    ldy bftmpy      Gdy procedura przebieg a pomy③lnie od③wierzane¢           lda icax6zs     s⇧ wszystkie rejestry wraz z wynikem operacji i¢           ldx bftmpx      procedura si❎ koczy.¢           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ə ca y 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 d ugo③⇨ ustalana jest d ugo③⇨ buforu poprzez¢           adc bfoplen     dodanie ilo③ci za adowanych bajtw.¢           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❎ koczy.¢           rts¢¢  eAE3C    tay             W przypadku gdy nie zosta  odczytany ca y bufor¢           lda minibuf,y   jest z niego odczytywany znak, a¢           inc bfgptr_t,x  wska♪nik jest zwi❎kszany.¢           ldy bftmpy      I procedura si❎ koczy 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 koczy operacj❎ z mini buforem.¢  {⇧czy si❎ ona z procedur⇧ kasowania buforu oraz z procedur⇧ przepisywania¢  rejestrw cieni do rejestrw 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 kana u 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 bajtw,¢           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 kana owi SDX¢           lda #$FF¢           sta bfidx_t,y   buforu w tabeli numerw 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 kana u do rejestrw 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 d ugo③⇨ 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  d ugo③⇨ buforu (przesuni❎cie-podstawa).¢           sbc bfgptr_t,x¢¢  eAEC8    sta faux4       Teraz ustawiane s⇧ rejestry d ugo③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 buforw 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 kocu wywo ywana jest funkcja serca¢           lda faux4       i ustalana jest d ugo③⇨ bajtw 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    ktrego 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 zg asza¢           rts             b ⇧d w C=1.¢¢  eAF0B    stx bfidx       W przeciwnym razie ustawia indeks buforu i zg asza¢           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 numerw ustawiany jest numer buforu¢           asl @           dla odpowiedniego kana u.¢           asl @¢           asl @¢           asl @¢           sta bfgptr_t,x  Na koniec tablicach wska♪nikw dla buforw 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❎ typw operacji dla buforw.¢           dex¢           bpl eAF2F¢¢           ldx #$0F¢  eAF37    sta bfidx_t,x   A nast❎pnie tablic❎ numerw buforw dla kana w SDX.¢           dex¢           bpl eAF37¢           rts¢¢           end of doc.¢