home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Syzygy Magazine 6
/
Syzygy_Magazine_6_1999___pl_Disk_2_of_3_Side_B.atr
/
sparta2.arc
/
SPARTA25.DOC
< prev
next >
Wrap
Text File
|
1988-09-01
|
10KB
|
1 lines
¢ Ostatni⇧ cz❎③ci⇧ tej bibloteki jest standardowy loader SDX z¢ warto③ciami pola informacji dyskowej.¢¢ org $AE1F Sdx Boot SECtor 1.¢¢ sbsec1 dta b($00) ($AE1F) +0 dflag, zawsze zero.¢ dta b($03) +$01 dsecn, liczba sektorw odczytu wst❎pnego.¢ dta a($3000) +$02 boota, adres utuchomienia boot'a.¢ dta a($07E0) +$04 inita, adres inicjowania boot'a.¢ jmp binit +$06 jmpld, skok do pocz⇧tku programu aduj⇧cego.¢¢ dta a($0000) +$09 msecn, numer pierwszego sektora mapy¢ sektorw katalogu gwnego.¢ dta a($0000) +$0B total, cakowita liczba sektorw na dysku.¢ dta a($0000) +$0D freesc, aktualna liczba wolnych sektorw.¢ dta b($00) +$0F bmplen, liczba sektorw mapy bitowej.¢ dta b($04) +$10 first, numer pierwszego sektora mapy¢ bitowej.¢ dta a($0000) +$11 fsect, numer pierwszego wolnego sektora dla¢ dla plikw.¢ dta a($0000) +$14 dsect, numer pierwszego wolnego sektora¢ dysku.¢ dta c' ' +$16 volume, nazwa dysku.¢ dta b($00) +$1E track, liczba ③cieəek na dysku. Kopia dskid¢ percom.¢ dta b($00) +$1F secln, dugo③⇨ sektora w bajtach.¢ dta b($20) +$20 ver, wersja formatu dysku = 2.0.¢ dta a($0106) +$21 magic, liczba $106.¢¢ dta b($FF) +$23 Bajty zarezerwowane.¢ dta b($FF)¢ dta b($00)¢¢ dta b($00) +$26 seqn, sekwencyjny numer dysku.¢ dta b($00) +$27 random, losowy numer dysku.¢ dta a($0000) +$28 bootf, muner pierwszego sektora mapy¢ sektorw pliku maj⇧cego by⇨ odczytanym¢ podczas odczytu wst❎pnego.¢ dta b($00) +$2A Bajty zarezerwowane.¢ dta b($FF)¢ dta b($FF)¢ dta b($FF)¢ dta b($FF)¢ dta b($FF)¢¢ dta c'Error: No DOS',b($9B) message, informacja o b❎dzie.¢¢ Get One Sector From File Sectors Map¢¢ fsmidx equ $91¢ daux equ $30A¢ fsmbuf equ $2F00¢ bsecln equ $301F¢ bbootfl equ $3028¢ rdsec equ $30F1¢¢ gosffsm lda bbootfl Procedura ustawia numer nast❎pnego sektora mapy¢ sta daux sektorw.¢ lda bbootfl+1¢ sta daux+1¢¢ lda <fsmbuf Ustawia adres buforu i czyta sektor.¢ ldx >fsmbuf¢ jsr rdsec¢¢ lda fsmbuf Nast❎pnie ustawia numer nast❎pny sektor do czytania¢ sta bbootfl¢ lda fsmbuf+1¢ sta bbootfl+1¢¢ ldy #$04 oraz ineks buforu mapy sektorw. pierwszy wpis.¢ sty fsmidx¢¢ Procedura pobiera numer nast❎pnego sektora pliku.¢¢ org $3061 Get file Next SECtor NUMber.¢¢ gnsecnum ldy fsmidx Na pocz⇧tku procedura sprawdza czy nie odczytano juə¢ cpy bsecln calego buforu mapy sektorw.¢ beq gosffsm¢¢ lda fsmbuf,y Gdy tak nie jest ustala numer¢ sta daux nast❎pnego sektoru¢ lda fsmbuf+1,y¢ sta daux+1¢ iny i zwi❎ksza indeks sektoru¢ iny o dwa bajty.¢ sty fsmidx¢¢ bp_rts rts¢¢ Program inicjowania adowanego programu.¢¢ org $3079 INIT PRoGram.¢¢ finit equ $2E2¢¢ initprg jmp (finit)¢¢ dta b($FF)¢ dta b($FF)¢ dta b($FF)¢ dta b($FF)¢¢ org $3080 Boot INIT.¢¢ fileidx equ $90¢ fsmidx equ $91¢ blkstr equ $92¢ blkend equ $94¢ btmp equ $96¢ frun equ $2E0¢ finit equ $2E2¢ dbyt equ $308¢ bsecln equ $301F¢¢ bp_rts equ $3078¢ initprg equ $3079¢ gofchar equ $310A¢ getblock equ $316B¢¢ binit ldx #$00 Na pocz⇧tku procedura¢ lda bsecln¢ sta fsmidx ustawia wska♪niki pozycji w buforze mapy¢ sta fileidx sektorw i buforze plikowym na maksymalne.¢¢ sta dbyt¢ bne e308F Teraz ustawia takəe dugo③⇨ sektoru w¢ inx¢ e308F stx dbyt+1 polu DCB.¢¢ jsr gofchar Teraz procedura pobiera nagwek pliku.¢ sta btmp¢ jsr gofchar¢ and btmp¢ cmp #$FF i porwnuje go z $FFFF.¢ e309E bne error¢¢ getprg lda <bp_rts Teraz procedura inicjuje Finit wska♪nikiem do¢ sta finit rozkazu rts.¢ lda >bp_rts¢ sta finit+1¢¢ jsr gofchar Nast❎pnie ustala adres adowania programu¢ sta blkstr¢ jsr gofchar¢ sta blkstr+1¢ ora blkstr¢ beq runprg¢¢ jsr gofchar i gdy adres taki istnieje¢ sec pobiera i ustala dugo③⇨ buforu.¢ sbc blkstr¢ pha¢ php¢ jsr gofchar¢ plp¢ sbc blkstr+1¢ sta blklen+1¢ pla¢ sta blklen¢ jsr getblock Teraz procedura pobiera blok programu¢ jsr initprg inicjuje go¢ jmp getprg i pobiera nast❎pny blok.¢¢ runprg jmp (frun) W przypadku koca danych program jest uruchamiany.¢¢ Procedura wypisuje komunikat o b❎dzie.¢¢ org $30D7 ERROR procedure.¢¢ iccmd equ $342¢ icbufa equ $344¢ icbufl equ $348¢ bmessage equ $3030¢¢ jciomain equ $E456¢¢ error lda <bmessage W przypadku wyst⇧pienia b❎du procedura¢ ldx >bmessage¢ sta icbufa¢ stx icbufa+1¢ stx icbufl ustawia rejestry zerowego kanau IOCB Atari OS i¢ lda #$09 wy③wietla stosowny komunikat.¢ sta iccmd¢ ldx #$00¢ jsr jciomain¢¢ loop jmp loop Po czym oczekuje w p❎tli bez koca na RESET.¢¢ Procedura czyta sektor o ustalonym numerze do bufora AX.¢¢ org $30F1 ReaD Sectors.¢¢ dstats equ $303¢ dbufa equ $304¢ daux equ $30A¢¢ error equ $30D7¢ jsioint equ $E459¢¢ rdsec ldy #$40 Na pocz⇧tku procedura ustala status operacji na¢ sty dstats czytanie.¢ sta dbufa¢ stx dbufa+1¢ lda daux¢ ora daux+1¢ beq error Nast❎pnie sprawdza czy nie chodzi o sektor zerowy.¢ jsr jsioint Gdy tak nie jest czyta sektor.¢ bmi error¢ rts¢¢ Procedura pobiera bajt z pliku.¢¢ org $310A Get One File Char.¢¢ fileidx equ $90¢ blkstr equ $92¢ blklen equ $94¢ dbyt equ $308¢ filebuf equ $2E00¢ bsecln equ $301F¢¢ gnsecnum equ $3061¢¢ gofchar lda #$00 Procedura ustala dugo③⇨ buforu na zero co¢ sta blklen+1 oznacza przesyanie bajtu przez akumulator.¢ sta blklen¢¢ org $3110 Get File Chars.¢¢ gfchars ldx fileidx Przed pobraniem znaku procedura sprawdza czy indeks¢ cpx bsecln w buforze pliku nie jest rwny maksymalnej dugo③ci¢ beq e311D¢¢ lda filebuf,x i gdy tak nie jest pobiera bajt z buforu po czym¢ inc fileidx zwi❎ksza indeks w buforze.¢ rts¢¢ e311D jsr gnsecnum Gdy bufor pliku jest juə pobrany procedura pobiera¢ numer kolejnego sektoru pliku.¢ lda blklen+1 Teraz sprawdza czy dugo③c bloku danych jest¢ bne e313B wi❎ksza niə 256.¢¢ lda bsecln Gdy tak nie jest procedura sprawdza czy dysk ma¢ beq e312D sektory 256 bajtowe.¢¢ lda blklen Gdy tak nie jest nast❎puje sprawdzanie czy dugo③⇨¢ bmi e313B bloku jest wi❎ksza niə 128.¢¢ e312D lda <filebuf Gdy tak nie jest sektor jest adowany do¢ ldx >filebuf¢ jsr rdsec buforu.¢ sec¢ rol fileidx Indeks w buforze pliku ustawiany jest na 1 i¢ lda filebuf pobierany jest pierwszy bajt z buforu.¢ rts¢¢ e313B lda blkstr Gdy dugo③⇨ bloku przekracza wielko③⇨ sektora¢ ldx blkstr+1 procedura czyta sektor bezpo③rednio pod adres¢ jsr rdsec adowania.¢¢ lda blkstr Nast❎pnie zwi❎ksza adres adowania o dugo③⇨¢ clc sektoru i¢ adc dbyt¢ sta blkstr¢ lda blkstr+1¢ adc dbyt+1¢ sta blkstr+1¢¢ sec i zniejsza ilo③⇨ bajtw do zaadowania o dugo③⇨¢ lda blklen sektoru.¢ sbc dbyt¢ sta blklen¢ lda blklen+1¢ sbc dbyt+1¢ sta blklen+1¢ jmp e311D Teraz p❎tla si❎ zamyka.¢¢ e3163 lda blklen Zmniejsza dugo③⇨ o jeden.¢ bne e3169¢ dec blklen+1¢ e3169 dec blklen¢¢ Procedura pobiera blok programu.¢¢ org $316B GET program BLOCK.¢¢ blkstr equ $92¢ blklen equ $94¢¢ gfchars equ $3110¢¢ getblock jsr gfchars Procedura pobiera bajty z bufora pod¢ ldy #$00¢ sta (blkstr),y odpowiedni adres.¢ inc blkstr¢ bne e3178¢ inc blkstr+1 Zwi❎ksza adres adowania bloku.¢ e3178 lda blklen¢ ora blklen+1¢ bne e3163 I sprawdza czy zostay jeszcze do pobrania jakie③¢ rts bajty.¢¢ Uwaga sektory odczytu wst❎pnego ATARI DOS opisane s⇧ w ksi⇧əce¢ Wojciecha Zientary pt.'Dyskowe systemy operacyjne'.¢¢ absec1 equ $AF9F standardowy boot blok DOSu 2.5.¢¢ end of doc¢