Omwi❎ teraz procedury pomocnicze programw czytaj⇧cych bloki pliku¢ binarnego.¢¢ Procedura inicjuje warto③ci FRUN i FINIT.¢¢ org $A464 Set FRun and FInit.¢¢ frun equ $2E0¢ finit equ $2E2¢ faux1 equ $782¢¢ p_rts equ $857¢¢ sfrfi lda frun+1 Na wst❎pie procedura sprawdza czy ustawiony jest¢ ora frun adres uruchomienia.¢ bne eA478¢¢ lda faux1 Gdy nie jest on ustawiony procedura ustawia go¢ sta frun na adres pierwszego zaadowanego bloku.¢ lda faux1¢ sta frun+1¢¢ eA478 lda <p_rts Teraz inicjuje ona wektor FINIT wska♪nikiem do¢ sta finit procedury RTS.¢ lda >p_rts¢ sta finit+1¢ rts¢¢ Procedura pobieraj⇧ca nast❎pny bajt z pliku.¢¢ org $A483 Get Next BYTE.¢¢ ldtmp1 equ $CBE¢¢ notbinfl equ $A491¢ FGETC equ $ADA1¢¢ gnbyte php Na pocz⇧tku procedura zachowuje rejestr statusu i X.¢ stx ldtmp1¢ jsr FGETC Teraz pobierany jest bajt.¢ bmi notbinfl¢ ldx ldtmp1 Gdy operacja si❎ udaa od③wierzany jest X i F poczym¢ plp¢ rts procedura si❎ koczy.¢¢ Procedura sygnalizuj⇧ca b⇧d prby wczytania pliku niewykonywalnego.¢¢ org $A491 NOT BINary File error.¢¢ U_FAIL equ $A6BE¢ FCLOSE equ $ACC3¢¢ notbinfl jsr FCLOSE Na pocz⇧tku plik jest zamykany.¢ lda #$98 Teraz ustawiany jest numer b❎du i sygnalizowany j¢ jmp U_FAIL jest b⇧d.¢¢ Procedura ustawiaj⇧ca adres dodawany w blokach relokowalnych SDX.¢¢ org $A499 Set BloCK Adress ADd.¢¢ blkmll_t equ $B57¢ blkmlh_t equ $B5F¢ blkext_t equ $B67¢ blkofl_t equ $B6F¢ blkofh_t equ $B77¢ blkaad equ $CBB¢¢ gnbyte equ $A483¢¢¢ sblkaad jsr gnbyte Na pocz⇧tku procedura czyta numer bloku z pliku.¢ tax¢ sec¢ lda blkmll_t,x Teraz ustawia adres dodawany obliczaj⇧c go poprzez¢ sbc blkofl_t,x odj❎cie przesuni❎cia bloku wzgl❎dem pocz⇧tku pliku¢ sta blkaad od warto③ci MEMLO dla danego bloku.¢ lda blkmlh_t,x¢ sbc blkofh_t,x¢ sta blkaad+1¢ rts¢¢ Procedura pobiera nazw❎ symbolu w wstawia j⇧ w odpowiednie pole obszaru¢ SYMBOL.¢¢ org $A4B1 Get SyMBol NAME.¢¢ SYMBOL equ $B7F¢¢ gnbyte equ $A483¢¢ gsmbnme ldy #$00 Na pocz⇧tku kasowany jest indeks pola nazwy.¢ eA4B3 jsr gnbyte Teraz nast❎puje pobranie znaku i¢ sta SYMBOL+2,y wstawienie w pole.¢ iny¢ cpy #$08 Poczym po o③miu znakach procedura si❎ koczy.¢ bne eA4B3¢ rts¢¢ Procedura ustawiaj⇧ca numer aplikacji, oraz wska♪niki H_FENCE dla danego¢ poziomu SYSLEVEL.¢¢ org $A1E8 Set APLication number And H_Fence.¢¢ SYSLEVEL equ $C5E¢ sdxmemlo equ $C5F¢ H_FENCE equ $C67¢ aplnum equ $C7B¢ aplnum_t equ $C7C¢¢ saplahf ldx SYSLEVEL Procedura pobiera poziom systemu, numer¢ lda aplnum numer aplikacji ustawia w tabeli numerw dla¢ sta aplnum_t,x poziomw systemu.¢ txa Nast❎pnie oblicza indeks H_FENCE dla poziomu¢ asl @ systemu¢ asl @¢ tax¢ ldy #$00¢ eA1F7 lda sdxmemlo,y i ustawia w niej aktualn⇧ warto③⇨ wska♪nikw¢ sta H_FENCE,x pami❎ci.¢ inx¢ iny¢ cpy #$04¢ eA201 bne eA1F7¢ rts¢¢ Z analizy tych procedur moəna odtworzy⇨ budow❎ plikw SDX.¢ Plik SDX skada si❎ z blokw. SDX potrafi zaadowa⇨ plik skadaj⇧cy si❎¢ maksymalniej liczby blokw relokowalnych i dowolnej liczby blokw adowanych¢ pod stae adresy w pami❎ci.¢¢ SDX rozrənia nast❎puj⇧ce bloki:¢¢ Blok adowany pod stay adres:¢¢ a($FFFA),a(str_adr),a(end_adr) lub¢ a($FFFF),a(str_adr),a(end_adr) lub¢ a(str_adr),a(end_adr) lecz tylko gdy niepierwszy blok.¢ Gdzie :¢¢ str_adr - adres pierwszego bajtu danych,¢ end_adr - adres ostatniego bajtu danych.¢¢ Po nagwku nast❎puje blok end_adr-str_adr+1 bajtw danych.¢¢ Relokowalny blok programu:¢¢ a($FFFE),b(blk_num),b(blk_id),a(blk_off),a(blk_len)¢ Gdzie:¢¢ blk_num - numer bloku w pliku,¢ blk_id - &$3E oznacza indeks pami❎ci do ktrej ma by⇨¢ zaadowany blok,¢ &$80 oznacza brak bloku danych (rezerwacja pami❎ci).¢ blk_off - przesuni❎cie adresw programu wzgl❎dem pocz⇧tku¢ programu,¢ blk_len - dugo③⇨ bloku w bajtach.¢¢ Pozostae bloki maj⇧ charakter uəytkowy i nie s⇧ na stae zatrzymywane w¢ w pami❎ci.¢¢ Blok aktualizacji adresw w bloku (relokowalnym).¢¢ a($FFFD),b(blk_num),a(reserved),¢ b(r_off | r_id)¢ ...............¢¢ blk_num - numer bloku maj⇧cego by⇨ uaktualniany.¢ reserved - dwa bajty zarezerwowane, nie maj⇧ce znaczenia.¢ r_id - identyfikator funkcji specjalnej,¢ r_off - przesuni❎cie wzgl❎dem ostatniej aktualizacji.¢¢ Adresy w program s⇧ aktualizowane o warto③⇨ ADR_AD poprzez jej¢ dodanie do adresu istniej⇧cego. ADR_AD procedura aduj⇧ca¢ oblicza przez odj❎cie od fizycznego adresu programu warto③ci¢ BLK_OFF podawanej w pliku relokowalnym.¢¢ Warto③⇨ R_OFF jest przesuni❎ciem aktualizacji. Pierwszy bajt¢ programu ma R_OFF=0. Po aktualizacji adresu wska♪nik w programie¢ aduj⇧cym jest zwi❎kszany o R_OFF. Najwi❎ksza dopuszczalna¢ warto③⇨ R_OFF wynosi $FB.¢¢ Warto③ci wi❎ksze s⇧ zarezerwowane dla R_ID.¢¢ R_ID=$FC - oznacza koniec bloku.¢¢ R_ID=$FD,a(adres) - natychmiastowa aktualizacja podanego wprost¢ adresu,¢¢ R_ID=$FE,b(blk_num) - ustalenie nowego bloku do aktualizacji.¢¢ R_ID=$FF - przesuni❎cie rwne $FA bez aktualizacji adresu.¢¢ Blok aktualizacji adresw procedur SDX zdefiniowanych symbolami.¢¢ a($FFFB),c'smb_name',a(reserved)¢ b(r_off | r_id)¢ ...............¢ SMB_NAME - symboliczna nazwa procedury.¢¢ Blok definicji nowych procedur symbolami.¢¢ a($FFFC),b(blk_num),a(smb_off),c'smb_name'¢¢ Wszystkie wyst❎puj⇧ce nazy pl opisane s⇧ przy pliku¢ aktualizacji adresw i maj⇧ identyczne znaczenie.¢¢¢ Procedur⇧ przeciwstawn⇧ procedurze U_LOAD jest U_UNLOAD zwalniaj⇧ca¢ obszar pami❎ci zajmowany przez program zatrzymany w pami❎ci. Procedura kasuje¢ teə wszystkie symbole zdefiniowane przez program.¢¢ org $A1C7 User_UNLOAD.¢¢ SYSLEVEL equ $C5E¢ sdxmemlo equ $C5F¢ H_FENCE equ $C67¢ aplnum equ $C7B¢ aplnum_t equ $C7C¢¢ newmemlo equ $AFCB¢ S_CLEAR equ $A54C¢¢ U_UNLOAD ldx SYSLEVEL Na pocz⇧tku procedura ustawia numer aplikacji dla¢ lda aplnum_t,x podanego w SYSLEVEL poziomu systemu.¢ sta aplnum¢ txa Teraz obliczany jest indeks dla H_FENCE zaleəny od¢ asl @ tego poziomu.¢ asl @¢ tax¢ ldy #$00¢ eA1D6 lda H_FENCE,x Teraz ustalane jest SDX MEMLO i¢ sta sdxmemlo,y¢ inx¢ iny¢ cpy #$04¢ bne eA1D6¢ jsr newmemlo ATARI OS memlo w ostatnim etapie kasowane s⇧ symbole¢ jmp S_CLEAR danej aplikacji.¢¢ Uəywan⇧ przez U_UNLOAD procedur❎ NEWMEMLO opisz❎ wraz z MALLOC.¢¢¢ end of doc.¢