Jedn⇧ z najwaəniejszych procedur systemowych, dost❎pnych dla uəytkownika¢ jest funkcja U_LOAD. Suəy ona do adowania i/lub uruchamiania plikw 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¢ suəy takəe jako rejest przesyania parametru dla uruchamianego pliku.¢ Parametr ten moəe zajmowa⇨ 4 najmodsze bity rejestru.¢ Takəe sam wczytywany plik moəe modyfikowa⇨ przebieg tej procedury dzi❎ki¢ rejestrom INSTAL i STATUS. INSTAL suəy do sygnalizowania əe plik jest¢ rozszerzeniem systemu i ma zosta⇨ zatrzymany w pami❎ci. STATUS suəy do¢ przesyania wynikw 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 przydziau numeru definiowanym przez plik symbolom i dla¢ przydziau 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 uzupeniona pierwszym znakiem @ suə⇧cym do¢ sta SYMBOL+2 identyfikacji wczytanych juə programw.¢ 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 zakada puapk❎,¢ ldx >ldtrap1¢ jsr U_SFAIL¢ jsr openldf otwiera i czyta plik, poczym¢ jsr U_XFAIL zdejmuje puapk❎.¢¢ 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❎ koczy.¢¢ eA252 lda #$00 Gdy plik ma by⇨ uruchomiony kasowane s⇧ rejestry¢ sta INSTALL komunikacji z plikiem.¢ sta STATUS¢ lda <ldtrap2 Ustawiana jest druga puapka¢ ldx >ldtrap2¢ jsr U_SFAIL¢¢ jsr jfrun i nast❎puje uruchomienie programu.¢ jsr U_XFAIL Po powrocie puapka 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 porwnanie¢ 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 wywouje 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 kocu 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❎ koczy.¢ rts¢¢ eA2B3 jmp U_FAIL W przypadku b❎du jest on sygnalizowany.¢¢¢ Procedura U_LOAD korzysta z wielu funkcji pomocniczych. Te ktre 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❎ gwna p❎tla aduj⇧ca plik binarny.¢ bmi eA30D Na pocz⇧tku pobierany jest znak.¢ sta faux1 Gdy operacja ta zakoczy si❎ pomy③lnie ustawiany jest¢ jsr gnbyte modszy i starszy bajt nagwka bloku.¢ sta faux1+1¢ cmp #$FF Gdy starszy bajt nagwka rəny jest od $FF to znaczy¢ bne eA2F1 əe nie ma nagwka.¢ lda faux1¢ cmp #$FA Podobnie gdy modszy bajt jest wi❎kszy, rwny $FA.¢ bcs eA2F9¢¢ eA2F1 bit fhdflg Gdy nie ma nagwka, 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 nagwek 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 nagwka 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❎ koczy.¢¢ Procedura ta wywouje odpowiedni⇧ procedur❎ adowania dla odpowiedniego¢ bloku programu.¢¢ org $A310 Read file block.¢¢ hdldpadr equ $A31E¢¢ rdflblk sec Od modszego bajtu nagwka niesionego w A odejmowana¢ sbc #$FA jest warto③⇨ $FA (najmniejszego identyfikatora), teraz¢ asl @ tak powstay indeks mnoəony jest przez dwa i wedug¢ 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 adresw 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 adresw 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 adresw w przemieszczalnym bloku binarnym.¢ jsr gnbyte Nast❎pnie procedura opuszcza dwa bajty nagwka.¢¢ lda extidx Teraz procedura zapami❎tuje indeks aktualnie¢ sta ldextidx uəywanej pami❎ci.¢¢ eA38A jsr gnbyte Teraz zaczyna si❎ p❎tla przeliczania adresw.¢ cmp #$FE Z pliku pobierany jest bajt i porwnywany jest z¢ beq eA3BB warto③ciami zarezerwowanymi dla identyfikatorw¢ 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 gwn⇧ 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❎ koczy.¢¢ 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 kocu pobierana jest dugo③⇨ bloku.¢ sta faux4¢ jsr gnbyte¢ sta faux4+1¢ eA40E jsr MALLOC Teraz wywouwana 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 nagwku $FFFF jak i $FFFA. Ma ona¢ drugi pocz⇧tek (HDNONE) dla bloku bez nagwka. 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❎ zaadowanego nagwka,¢ nast❎pne bloki mog⇧ go by⇨ pozbawione.¢¢ org $A435 Head NONE.¢¢ hdnone jsr gnbyte Teraz procedura ustala dugo③⇨ bloku.¢ sec Odejmuje wi❎c od adresu koca 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 kanau.¢ rts Teraz procedura si❎ koczy.¢¢ end of doc.¢