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

  1.       Jedn⇧ z najwaəniejszych procedur systemowych, dost❎pnych dla uəytkownika¢  jest funkcja U_LOAD. S uəy ona do  adowania i/lub uruchamiania plikw bina-¢  rnych.¢      Przebieg procedury U_LOAD moəna modyfikowa⇨ dzi❎ki zmiennej FLAG.¢  Gdy najstarszy bit jest ustawiony program zostaje zatrzymany w pami❎ci i nie¢  uruchomiony, zmienione zostaj⇧ wtedy wska♪niki wolnej pami❎ci. Gdy bit ten¢  jest zgaszony program jest 'normalnie'  adowany i uruchomiony. Poza ty FLAG¢  s uəy takəe jako rejest przesy ania parametru dla uruchamianego pliku.¢  Parametr ten moəe zajmowa⇨ 4 najm odsze bity rejestru.¢      Takəe sam wczytywany plik moəe modyfikowa⇨ przebieg tej procedury dzi❎ki¢  rejestrom INSTAL i STATUS. INSTAL s uəy do sygnalizowania əe plik jest¢  rozszerzeniem systemu i ma zosta⇨ zatrzymany w pami❎ci. STATUS s uəy do¢  przesy ania wynikw operacji np. kodu b ❎du.¢¢           org $A204   User LOAD.¢¢  dosini   equ $C¢  frun     equ $2E0¢  memlo    equ $2E7¢  name     equ $762¢  SYMBOL   equ $BF7¢  EXTENDED equ $C57¢  STATUS   equ $C58¢  INSTAL   equ $C59¢  FLAG     equ $C5C¢  sdxmemlo equ $C5F¢  aplnum   equ $C7B¢¢  dosinip  equ $92F¢  saplahf  equ $A1E8¢  jfrun    equ $A2B6¢  openldf  equ $A2B9¢  S_ADDIZ  equ $A0F4¢  U_UNLOAD equ $A1C7¢  S_LOOKUP equ $A4BF¢  U_FAIL   equ $A6BE¢  U_SFAIL  equ $A6F3¢  U_XFAIL  equ $A70E¢¢  U_LOAD   lda #$00        Na pocz⇧tku procedura kasuje flag❎ pami❎ci ext.¢           sta EXTENDED¢           jsr U_GEFINA    Nast❎pnie pobiera nazw❎ pliku do wczytania.¢           inc SYSLEVEL    Teraz zwi❎kszany jest poziom systemu i¢           jsr saplahf     ustawiany jest numer aplikacji i warto③⇨ H_FENCE dla¢           inc aplnum      nowego poziomu. Zwi❎kszany jest takəe licznik¢                           aplikacji dla nast❎pnego czytania. Ma to znaczenie¢           dla przydzia u numeru definiowanym przez plik symbolom i dla¢           przydzia u pami❎ci.¢¢           ldx #$06        Teraz nazwa pliku zostaje przepisana do pola symbolu¢  eA217    lda name,x¢           sta SYMBOL+3,x¢           dex¢           bpl eA217¢           lda #'@'        i uzupe niona pierwszym znakiem @ s uə⇧cym do¢           sta SYMBOL+2    identyfikacji wczytanych juə programw.¢           jsr S_LOOKUP    Teraz program sprawdza czy taki symbol istanieje.¢           beq eA239¢¢           lda SYMBOL+$B   Gdy tak jest, adres procedury definiowanej symbolem¢           sta frun        jest przepisywana do adresu uruchomienia pliku.¢           lda SYMBOL+$C¢           sta frun+1¢           jmp eA246¢¢  eA239    lda <ldtrap1    Gdy nie ma symbolu program zak ada pu apk❎,¢           ldx >ldtrap1¢           jsr U_SFAIL¢           jsr openldf     otwiera i czyta plik, poczym¢           jsr U_XFAIL     zdejmuje pu apk❎.¢¢  eA246    bit FLAG        Teraz sprawdzany jest znacznik FLAG.¢           bpl eA252¢¢           jsr saplahf     Gdy plik ma by⇨ zatrzymany w pami❎ci¢           dec SYSLEVEL    ustawiane jest nowe memlo, zmniejszany poziom¢           rts             systemu i program  adowania si❎ koczy.¢¢  eA252    lda #$00        Gdy plik ma by⇨ uruchomiony kasowane s⇧ rejestry¢           sta INSTALL     komunikacji z plikiem.¢           sta STATUS¢           lda <ldtrap2    Ustawiana jest druga pu apka¢           ldx >ldtrap2¢           jsr U_SFAIL¢¢           jsr jfrun       i nast❎puje uruchomienie programu.¢           jsr U_XFAIL     Po powrocie pu apka jest zdejmowana.¢           jmp eA26D¢¢  ldtrap2  sta STATUS      Gdy w wykonywanym programie wyst⇧pi  b ⇧d jest on¢                           zapami❎tany.¢  eA26D    bit INSTALL     Teraz sprawdzany jest stan flagi instalacji.¢           bmi eA288¢¢           lda memlo       Gdy program nie ə⇧da  instalacji sprawdzane jest¢           ldx memlo+1     czy nie zrobi  tego samoczynnie poprzez porwnanie¢           cmp sdxmemlo    ATARI OS MEMLO z SDXMEMLO¢           bne eA282¢           cpx sdxmemlo+1¢           beq eA2A2¢¢  eA282    sta sdxmemlo    Gdy plik zmieni  warto③ci memlo s⇧ one ustawiane dla¢           stx sdxmemlo+1  SDX.¢¢  eA288    ldx dosini+1    Nast❎pnie sprawdzane jest czy plik wymaga inicjacji¢           cpx >dosinip    po przerwaniu reset (poprzez wpisanie si❎ pod wektor¢           beq eA293       DOSINI).¢           lda dosini      Gdy tak jest program  aduj⇧cy wywo uje funkcj❎¢           jsr S_ADDIZ     dopisuj⇧c⇧ wektor do kolejki inicjacji.¢¢  eA293    jsr saplahf     Teraz ustala nawe sdxmemlo dla poziomu rozszerze¢           dec SYSLEVEL    jak i poziomu systemu.¢           jsr saplahf¢           jmp eA2A8¢¢  ldtrap1  sta STATUS      W przypadku b ❎du  adowania zapami❎tuje jego numer.¢¢  eA2A2    jsr U_UNLOAD    Wreszcie zwalnia pami❎⇨ juə wgranego fragmentu pliku¢           dec SYSLEVEL    i powraca do poziomu rozszerze.¢¢  eA2A8    ldx #$00        Na kocu  adowania procedura kasuje rejestr statusu¢           lda STATUS      z jednoczesnym jego zapami❎taniem.¢           stx STATUS¢           bmi eA2B3       Gdy nie wyst⇧pi  əaden b ⇧d procedura si❎ koczy.¢           rts¢¢  eA2B3    jmp U_FAIL      W przypadku b ❎du jest on sygnalizowany.¢¢¢      Procedura U_LOAD korzysta z wielu funkcji pomocniczych. Te ktre s⇧¢  wykorzystywane tylko przez ni⇧ podaje poniəej:¢¢           org $A2B6¢¢  frun     equ $2E0¢¢  jfrun    jmp (frun)  Procedura wykonuje skok po③redni do uruchomienia pliku.¢¢      Najobszerniejsz⇧ z nich jest procedura otwieraj⇧ca i  aduj⇧ca plik.¢¢           org $A2B9   OPEN and LoaD File.¢¢  frun     equ $2E0¢  opmode   equ $778¢  fatr1    equ $779¢  faux1    equ $782¢  syscall  equ $787¢¢  rdflblk  equ $A310¢  hdnone   equ $A435¢  gnbyte   equ $A483¢  notbinfl equ $A491¢  FOPEN    equ $AC56¢  FGETC    equ $ADA1¢  FCLOSE   equ $ACC3¢¢  openldf  lda #$24    Na pocz⇧tku program ustawia tryb otwarcia na plik do¢           sta opmode  czytania.¢  eA2BE    lda #$80    Atrybuty pliku ustawiane s⇧ na nie katalog.¢           sta fatr1¢           jsr FOPEN   Teraz plik zostaje otwarty.¢           lda #$00¢           sta fhdflg  Nast❎pnie kasowane s⇧ rejestry pomocnicze procedury¢           sta syscall U_LOAD.¢           sta frun+1¢           sta frun¢           lda #$60    ?¢           sta $00¢¢  eA2D8    jsr FGETC   Teraz zaczyna si❎ g wna p❎tla  aduj⇧ca plik binarny.¢           bmi eA30D   Na pocz⇧tku pobierany jest znak.¢           sta faux1   Gdy operacja ta zakoczy si❎ pomy③lnie ustawiany jest¢           jsr gnbyte  m odszy i starszy bajt nag wka bloku.¢           sta faux1+1¢           cmp #$FF    Gdy starszy bajt nag wka rəny jest od $FF to znaczy¢           bne eA2F1   əe nie ma nag wka.¢           lda faux1¢           cmp #$FA    Podobnie gdy m odszy bajt jest wi❎kszy, rwny $FA.¢           bcs eA2F9¢¢  eA2F1    bit fhdflg  Gdy nie ma nag wka, poprzez flag❎ FHDFLG procedura¢           bmi eA307   sprawdza czy blok moəe go niemie⇨.¢¢           jmp notbinfl Gdy tak nie jest sygnalizowany jest b ⇧d  adowania.¢¢  eA2F9    ldx #$00    Gdy nag wek istnieje kasowane s⇧ zmienne.¢           stx fhdflg¢           stx syscall¢¢  eA301    jsr rdflblk Czytany jest blok programu.¢           jmp eA2D8   I zamykana jest p❎tla  adowania.¢¢  eA307    jsr hdnone  Gdy brak nag wka czytany jest blok i¢           jmp eA2D8   p❎tla  adowania si❎ zamyka.¢¢  eA30D    jmp FCLOSE  Gdy nast⇧pi  b ⇧d odczytu plik jest zamukany i procedura¢                       si❎ koczy.¢¢      Procedura ta wywo uje odpowiedni⇧ procedur❎  adowania dla odpowiedniego¢  bloku programu.¢¢           org $A310   Read file block.¢¢  hdldpadr equ $A31E¢¢  rdflblk  sec         Od m odszego bajtu nag wka niesionego w A odejmowana¢           sbc #$FA    jest warto③⇨ $FA (najmniejszego identyfikatora), teraz¢           asl @       tak powsta y indeks mnoəony jest przez dwa i wed ug¢           tax         niego z tabeli adresowej zapisywany na stos jest skok do¢           lda hdldpadr+1,x    odpowiedniej procedury  aduj⇧cej.¢           pha¢           lda hdldpadr,x¢           pha¢           rts¢¢           org $A31E   HeaD LoaDing Procedure ADRess table.¢¢  hdfffc   equ $A32A¢  hdfffb   equ $A346¢  hdfffd   equ $A37B¢  hdfffe   equ $A3EB¢  hdffff   equ $A426¢¢  hdldpadr dta a(hdffff-1)¢           dta a(hdfffb-1)¢           dta a(hdfffc-1)¢           dta a(hdfffd-1)¢           dta a(hdfffe-1)¢           dta a(hdffff-1)¢¢      Procedura  adowania bloku definicji symbolu.¢¢           org $A32A   HeaD $FFFC.¢¢  blkaad   equ $CBB¢  SYMBOL   equ $BF7¢  gnbyte   equ $A483¢  sblkaad  equ $A499¢  gsmbnme  equ $A4B1¢  S_ADD    equ $A505¢¢  hdfffc   jsr sblkaad     Na pocz⇧tku procedury ustalany jest adres dodawany¢           clc             Teraz do niego dodawane jest przesuni❎cie¢           jsr gnbyte      definiowanej procedury wzgl❎dem pocz⇧tku bloku.¢           adc blkaad¢           sta SYMBOL+$B¢           jsr gnbyte¢           adc blkaad+1¢           sta SYMBOL+$C¢           jsr gsmbnme     Nast❎pnie pobierana jest nazwa symbolu i jest on¢           jmp S_ADD       dodawany do lisy symboli.¢¢      Procedura  aduje blok aktualizacji adresw symboli.¢¢           org $A346   Head $FFFB.¢¢  blkaad   equ $CBB¢  SYMBOL   equ $BF7¢  ldidblk  equ $A37E¢  gsmbnme  equ $A4B1¢  S_LOOKUP equ $A4BF¢  U_FAIL   equ $A6BE¢  PRINTF   equ $A926¢  FCLOSE   equ $ACC3¢¢  hdfffb   jsr gsmbnme     Na pocz⇧tku procedura pobiera nazw❎ symbolu.¢           jsr S_LOOKUP    Teraz sprawdza czy taki symbol jest zdefiniowany.¢           bne eA36C¢¢           jsr FCLOSE      Gdy tak nie jest procedura zamyka plik.¢           jsr PRINTF      Wy③wietla stosowny komunikat i¢           dta c'%8s not Defined',b($9B),b(0)¢           dta a(SYMBOL+2)¢           lda #$9A        sygnalizuje b ⇧d.¢           jmp U_FAIL¢¢  eA36C    lda SYMBOL+$B   Gdy symbol jest zdefiniowany adres dodawany¢           sta blkaad    przyjmuje warto③⇨ wska♪nika symbolu¢           lda SYMBOL+$C¢           sta blkaad+1¢           jmp ldidblk     i procedura wskakuje w procedur❎ aktualizacji.¢¢      Procedura  aduje blok aktualizacji adresw w bloku relokowalnym,  ⇧czy¢  si❎ ona z procedur⇧ LDIDBLK  aduj⇧c⇧ identyfikatory specjalne lub przesuni❎-¢  cia aktualizacji.¢¢           org $A37B   Head $FFFD.¢¢  bufadr   equ $15¢  extidx   equ $A42¢  blkmll_t equ $B57¢  blkmlh_t equ $B5F¢  blkext_t equ $B67¢  blkaad   equ $CBB¢  ldextidx equ $CC3¢¢  jext_sw  equ $7F7¢  gnbyte   equ $A483¢  sblkaad  equ $A499¢¢  hdfffd   jsr sblkaad     Na pocz⇧tku ustalany jest adres dodawany do¢¢           org $A37E   LoaD ID BLoCK.¢¢  ldidblk  jsr gnbyte      adresw w przemieszczalnym bloku binarnym.¢           jsr gnbyte      Nast❎pnie procedura opuszcza dwa bajty nag wka.¢¢           lda extidx      Teraz procedura zapami❎tuje indeks aktualnie¢           sta ldextidx    uəywanej pami❎ci.¢¢  eA38A    jsr gnbyte      Teraz zaczyna si❎ p❎tla przeliczania adresw.¢           cmp #$FE        Z pliku pobierany jest bajt i porwnywany jest z¢           beq eA3BB       warto③ciami zarezerwowanymi dla identyfikatorw¢           bcs eA3AD       operacji specjalnych.¢           cmp #$FC¢           beq eA3E5¢           bcs eA3D2¢           tay             Gdy bajt nie jest identyfikatorem staje si❎¢  eA39A    lda (bufadr),y  wska♪nikiem wzgl❎dem ostatniej poprawki.¢           clc¢           adc blkaad    Tak wskazywany adres jest przeliczany przez dodanie¢           sta (bufadr),y  adresu dodawanego (obliczonego z memlo i¢           iny             przesuni❎cia).¢           lda (bufadr),y¢           adc blkaad+1¢           sta (bufadr),y¢           dey¢           tya¢           dta ($2C) bit¢¢  eA3AD    lda #$FA        Na koniec adres nast❎pnej poprawki zostaje¢  eA3AF    clc             zwi❎kszony o warto③⇨ wska♪nika lub dla¢           adc bufadr      identyfikatora $FF o warto③⇨ $FA¢           sta bufadr¢           bcc eA3B8¢           inc bufadr+1¢¢  eA3B8    jmp eA38A       i p❎tla si❎ zamyka.¢¢  eA3BB    jsr gnbyte      Dla identyfikatora $FE procedura pobiera numer bloku¢           tax             programu i ustala dzi❎ki niemu ustale jego adres¢           lda blkmll_t,x¢           sta bufadr¢           lda blkmlh_t,x¢           sta bufadr+1¢           lda blkext_t,x   oraz uəywan⇧ pami❎⇨.¢           jsr jext_sw     Teraz prze ⇧cza pami❎⇨ i¢           jmp eA38A       pobiera nast❎pny bajt z pliku.¢¢  eA3D2    jsr gnbyte      Dla identyfikatora ustalany FD pobierany jest¢           sta bufadr      wska♪nik bloku w pami❎ci.¢           jsr gnbyte¢           sta bufadr+1¢           ldy #$00        Nast❎pnie przesuni❎cie ustawiane jest na zero¢           tya¢           jsr jext_sw     pami❎⇨ ustalana jest na g wn⇧ i¢           jmp eA39A       natychmiastowo aktualizowany jest adres.¢¢  eA3E5    lda ldextidx    Identyfikator $FC oznacza koniec pliku aktualizacji.¢           jmp jext_sw     Teraz procedura przywraca star⇧ pami❎⇨ i si❎ koczy.¢¢      Procedura pobiera blok relokowalny pod adres memlo.¢¢           org $A3EB   Head $FFFE.¢¢  faux4    equ $785¢  blkofl_t equ $B6F¢  blkofh_t equ $B77¢  EXTENDED equ $C57¢¢  lddtblk  equ $A450¢  gnbyte   equ $A483¢  U_FAIL   equ $A6BE¢  FCLOSE   equ $ACC3¢  MALLOC   equ $AF54¢¢  hdfffe   jsr gnbyte      Na pocz⇧tku procedura pobiera numer bloku i¢           tay¢           jsr gnbyte      znacznik pliku, zostaje  on zapami❎tany na stosie¢           pha¢           and #$3E        i wyznaczany jest z niego indeks pami❎ci.¢           tax¢           jsr gnbyte      Teraz procedura pobiera przesuni❎cie kodu bloku¢           sta blkofl_t,y   wzgl❎dem pocz⇧tku programu i zapami❎tuje w¢           jsr gnbyte      go w tablicach.¢           sta blkofh_t,y¢           jsr gnbyte      Na kocu pobierana jest d ugo③⇨ bloku.¢           sta faux4¢           jsr gnbyte¢           sta faux4+1¢  eA40E    jsr MALLOC      Teraz wywo uwana jest procedura przydzielaj⇧ca¢           bpl eA41B       pami❎⇨.¢¢           jsr FCLOSE      Gdy wraca ona ujemny wynik, oznacza to brak pami❎ci¢           lda #$9E        dla pliku i sygnalizowany jest b ⇧d: Out of memory.¢           jmp U_FAIL¢¢  eA41B    txa             W przeciwnym wypadku ustalany jest indeks pami❎ci¢           ora EXTENDED    dla operacji j⇧dra.¢           sta EXTENDED¢           pla             W ostatnim etapie od③wierzany jest znacznik bloku,¢           bpl lddtblk       gdy najstarszy bit jest w nim zapalony oznacza to¢           rts             rezerwacj❎ pami❎ci, w przeciwnym razie blok jest¢                            adowany.¢¢      Procedura wykonywana jest dla bloku o nag wku $FFFF jak i $FFFA. Ma ona¢  drugi pocz⇧tek (HDNONE) dla bloku bez nag wka. Po ⇧czona jest z LDDTBLK¢   aduj⇧c⇧ blok danych z pliku.¢¢           org $A426   HeaD $FFFF and $FFFA.¢¢  siocbidx equ $760¢  faux1    equ $782¢  faux4    equ $785¢  fhdflg   equ $CBD¢¢  jfinit   equ $9D3¢  sfrfi    equ $A461¢  gnbyte   equ $A483¢  notbinfl equ $A491¢  FREAD    equ $AC14¢¢  hdffff   jsr gnbyte      Na pocz⇧tku czytany jest adres  adowania pliku.¢           sta faux1¢           jsr gnbyte¢           sta faux1+1¢¢           dec fhdflg      Teraz procedura ustawia flag❎ za adowanego nag wka,¢                           nast❎pne bloki mog⇧ go by⇨ pozbawione.¢¢           org $A435   Head NONE.¢¢  hdnone   jsr gnbyte      Teraz procedura ustala d ugo③⇨ bloku.¢           sec             Odejmuje wi❎c od adresu koca pliku jego pocz⇧tek i¢           sbc faux1¢           sta faux4¢           jsr gnbyte¢           sbc faux1+1¢           sta faux4+1¢¢           inc faux4       zwi❎ksza otrzyman⇧ warto③⇨ o jeden.¢           bne lddtblk¢           inc faux4+1¢¢           org $A450   LoaD DaTa BLocK.¢¢  lddtblk  jsr sfrfi       Teraz procedura wchodzi w etap czytania ustalonego¢           jsr FREAD       bloku programu.¢           bmi notbinfl    Gdy nast⇧pi b ⇧d EOF sygnalizuje b ⇧d.¢¢           lda siocbidx    W ostatnim etapie procedura inicjalizuje plik.¢           pha¢           jsr jfinit      z zapami❎taniem ustalonego do odczytu pliku numeru¢           pla¢           sta siocbidx    kana u.¢           rts             Teraz procedura si❎ koczy.¢¢           end of doc.¢