W drugiej cz❎③ci procedury inicjuj⇧cej inicjowany jest bufor zmiennych¢ systemowych oraz adowane s⇧ urz⇧dzenia systemowe.¢¢ org $7000 LoaD DOS DeViCe.¢¢¢ dbyt equ $308¢ daux equ $30A¢ dirfatr equ $789¢ dirf1sec equ $78A¢ dirfname equ $78F¢ FLAG equ $C5C¢ gcgfln equ $708F¢ golfdef equ $715C¢ initdr equ $724E¢ gnfdir equ $7269¢ golffile equ $7281¢ btsecln equ $73BB¢ btpasflg equ $73BC¢ _DOS equ $A119¢ consol equ $D01F¢¢ lddosdvc lda #$80 Na pocz⇧tku procedury ustawiana jest dugo③⇨ sektora¢ sta dbyt dyskowego na 128 bajtw oraz jego numer na 1,¢ ldx #$01¢ stx daux¢ dex¢ stx daux+1¢ stx dbyt+1¢ stx btpasflg zostaje takəe skasowana flaga przej③cia przez¢ podprogram ustalania pami❎ci.¢¢ lda consol Nast❎pnie zostaje sprawdzony stan klawisza OPTION¢ and #$04 ktry warunkuje odczyt pliku CONFIG.SYS.¢ beq e706E Gdy klawisz by naci③ni❎ty ustalona zostanie¢ domy③lna konfiguracja.¢¢ lda <sec2buf Gdy nie by wci③ni❎ty, procedura aduje 1 sektor¢ ldx >sec2buf dysku.Gdy przy odczycie nast⇧pi b⇧d zostanie¢ jsr getsec ustalona domy③lna konfiguracja.¢ bmi e706E¢¢ lda sec2buf+$7 Nast❎pnie nast❎puje rozpoznanie dysku poprzez¢ cmp #$80 odczytanie warto③ci jmpld+1 boot sektora. Powinna¢ bne e706E znajdowa⇨ si❎ tam warto③⇨ 128.¢¢ lda sec2buf+$1F Teraz odczytywana jest dugo③⇨ sektora dyskowego¢ sta btsecln (secln) i ustalana w zmiennej.¢¢ lda sec2buf+$9 Nast❎pnie pobierany jest numer sektora mapy sektorw¢ ldx sec2buf+$A katalogu gwnego msecn i z t⇧ warto③ci⇧ zostaje¢ jsr initdr zainicjowana procedura odczytuj⇧ca pliki.¢¢ jsr gnfdir Teraz pobierany jest pierwszy wpis katalogu.¢ Wpis ten zawiera informacje okre③laj⇧ce sam katalog¢ i przy szukaniu nazwy pliku moəe by⇨ pomini❎ty.¢¢ e703D jsr gnfdir W tej p❎tli program czyta nazw❎ pliku, a gdy brak¢ beq e706E juə nazw w katalogu, wywouje konfiguracj❎ domy③ln⇧.¢¢ lda dirfatr Nast❎pnie sprawdza czy jest to wpis wolny, oznacza¢ beq e706E rwnieə koniec katalogu.¢¢ bmi e703D Gdy plik otwarty do zapisu,¢ and #$08¢ beq e703D lub jest nieuəywany pobierany jest nast❎pny wpis.¢¢ ldx #$0A¢ e704F lda dirfname,x Dopiero teraz nast❎puje porwnanie z nazw⇧ pliku¢ cmp cfgname,x konfiguracyjnego i przy jej niezgodno③ci zostaje¢ bne e703D pobrany inny, nast❎pny wpis.¢ dex¢ bpl e704F¢¢ lda dirf1sec Gdy nazwy s⇧ zgodne inicjowana zostaje procedura¢ ldx dirf1sec+1 czytaj⇧ca pliki z warto③ciami numeru pierwszego¢ jsr initdr sektora mapy sektorw pliku.¢¢ e7063 jsr golffile Teraz pobierana jest jedna linia pliku,¢ beq e7079 a gdy jej brak procedura si❎ koczy.¢ jsr gcfgln Nast❎pnie linia zostaje wykonana¢ jmp e7063 i pobierana jest nast❎pna linia.¢¢ e706E jsr golfdef W tej cz❎③ci procedura pobiera lini❎ domy③lnego¢ beq e7079 pliku konfiguracyjnego, gdy jej brak procedura si❎¢ koczy.¢ e7073 jsr gcfgln Nast❎pnie linia zostaje wykonana¢ jmp e706E i pobierana jest nast❎pna linia.¢¢ e7079 lda FLAG W ostatnim etapie kasowana jest FLAGa i nast❎puje¢ and #$0F skok do wej③cia do DOSu.¢ sta FLAG¢ jmp _DOS¢¢ cfgname dta c'CONFIG SYS' ($7084)¢¢ Omwi❎ teraz procedury wyst❎puj⇧ce w programie LDDOSDVC.¢¢ org $708F Get ConFiG LiNe.¢¢ bufoff equ $A62¢ lbuff equ $A97¢ asdxenv equ $3837¢ usep equ $70EA¢ setp equ $7126¢ devicep equ $7134¢ sextmem equ $734F¢ btpasflg equ $73BC¢ PRINTF equ $A926¢ U_GETPAR equ $B27E¢ U_TOKEN equ $B3F1¢¢ gcfgln lda #$00 Na pocz⇧tku procedura kasuje wska♪nik buforu lbuff,¢ sta bufoff po czym pobiera jeden parametr procedur⇧ bibloteczn⇧¢ jsr U_GETPAR U_GETPAR,¢ beq e70BE gdy barak parametrw nast❎puje koniec procedury.¢¢ lda >tokencfg Nast❎pnie podawany jest adres tablicy z tokenami i¢ ldx <tokencfg wywoywana jest procedura bibloteczna U_TOKEN¢ jsr U_TOKEN rozpoznaj⇧ca tokeny,¢ bcc cfgerr gdy rozkaz nierozpoznany koczy program b❎dem.¢¢ asl @ Teraz mnoəy numer rozkazu przez dwa otrzymuj⇧c¢ beq e70B5 wska♪nik do tabeli adresowej, gdy wynosi on zero¢ (rozkaz use) natychmiastowo wywoywana jest¢ odpowiedni podprogram.¢¢ bit btpasflg Gdy inny rozkaz sprawdzane jest czy wykonane byo¢ bmi e70B5 juə ustawienie pami❎ci, je③li tak to nast❎puje skok.¢¢ pha Ta cz❎③⇨ procedury wykonywana jest tylko raz,¢ jsr sextmem ustawia ona adresy pami❎ci extended oraz adres¢ jsr adsdxenv buforu na zmienne systemowe i te zmienne.¢ dec btpasflg Ustawia flag❎ wykonania przej③cia.¢ pla¢¢ e70B5 tax Pobierany jest adres odpowiedniej procedury i¢ lda tokenadr+1,x wykonywany jest do niej skok.¢ pha¢ lda tokenadr,x¢ pha¢ e70BE rts¢¢ cfgerr jsr PRINTF Procedura wy③wietlaj⇧ca b⇧d konfiguracji.¢ dta c'Config error: %s',b($9B),b(0)¢ dta a(lbuff)¢ rts¢¢ tokencfg dta c'USדDEVICדSEק',b(0) Rozpoznawalne tokeny.¢¢ tokenadr dta a(usep-1) Adresy procedur odpowiednich tokenw.¢ dta a(devicep-1)¢ dta a(setp-1)¢¢¢ org $70EA USE Proces.¢¢ _800flg equ $A73¢ nbnks equ $A75¢ bankflg equ $A76¢ osrmflg equ $A77¢ confnam equ $A79¢ btpasflg equ $73BC¢ U_GETPAR equ $B27E¢ TOUPPER equ $B442¢¢ usep bit btpasflg Na wst❎pie procedura sprawdza czy pami❎⇨ jest juə¢ bmi e7106 ustalona i gdy tak jest, koczy dziaanie.¢¢ jsr U_GETPAR Nast❎pnie pobiera parametr,¢ lda confnam zmienia jego pierwsz⇧ liter❎ na duə⇧¢ jsr TOUPPER¢ ldx #$00 i wykonuje odpowiedni podprogram.¢ cmp #'O'¢ beq uosram¢ cmp #'B'¢ beq ubanked¢ cmp #'N'¢ beq unone¢ e7106 rts¢¢ uosram bit _800flg Gdy parametrem jest Osram, sprawdza czy komputer¢ bmi e7106 ATARI 800 i gdy tak koczy dziaanie.¢ dec osrmflg W innym przypadku ustala flag❎ osram i kasuje¢ stx bankflg banked.¢ rts¢¢ unone stx osrmflg Gdy parametrem jest None, kasuje flagi pami❎ci¢ stx bankflg osram i banked.¢ rts¢¢ ubanked lda nbnks W przypadku pami❎ci BANKED sprawdza czy ta istnieje¢ beq e7106 i je③li nie koczy dziaanie.¢ dec bankflg Je③li tak ustawia banked i kasuje osram.¢ stx osrmflg¢ rts¢¢ org $7126 SET Proces.¢¢ bufoff equ $A62¢ lbuff equ $A97¢ PUTENV equ $BAC1¢¢ setp lda <lbuff Dla rozkazu SET ustalany jest adres zmiennej¢ ldx >lbuff systemowej w AX,¢ clc¢ adc bufoff¢ bcc e7131¢ inx¢ e7131 jmp PUTENV A nast❎pnie wywoywana jest procedura bibloteczna.¢¢ org $7134 DEVICE Proces.¢¢ confnam equ $A79¢ FLAG equ $C5C¢ cfgerr equ $70BF¢ U_LOAD equ $A204¢ U_SFAIL equ $A6F3¢ U_XFAIL equ $A70E¢ U_GETPAR equ $B27E¢¢ devicep jsr U_GETPAR Dla rozkazu DEVICE, pobierana jest nazwa urz⇧dzenia¢¢ ldy #$00¢ e7139 lda sysnext,y i dodawane jest do niej rozszerzenie .SYS.¢ sta confnam,x¢ iny¢ inx¢ cmp #$9B¢ bne e7139¢¢ lda <cfgerr Nast❎pnie ustawiana jest puapka na b⇧d¢ ldx >cfgerr konfiguracji,¢ jsr U_SFAIL¢ lda #$00¢ sta FLAG FLAGa adowania ustalana jest na adowanie normalne.¢ jsr U_LOAD Nast❎pnie procedura aduje plik.¢ jmp U_XFAIL Koczy dziaanie ze zdj❎ciem puapki.¢¢ sysnext c'.SYS',b($9B) ($7157)¢¢¢ Procedura pobiera wiersz domy③lnej konfiguracji.¢¢ org $715C Get One Line From DEFoult config.¢¢ lbuff equ $A97¢¢ golfdef ldx #$00 Indeks tablicy ustawiany jest na zero.¢¢ e715E lda defcfg Nast❎pnie czytany jest znak z tablicy i¢ beq e7175 gdy jest on rwny zero procedura si❎ koczy.¢ sta lbuff,x W innym przypadku znak wpisywany jest w bufor lbuff.¢¢ inc e715E+1 I program sam si❎ modyfikuje na odczyt nast❎pnego¢ bne e716E znaku.¢ inc e716E+2¢ e716E inx Zwi❎kszany jest takəe rejestr X jako indeks lbuff.¢ cmp #$9B Gdy znak rwny jest EOL,¢ bne e715E¢ lda #$01 procedura si❎ koczy z wynikiem rənym od zera.¢ e7175 rts¢¢ defcfg dta c'device sparta osram',b($9B)¢ dta c'device sio',b($9B)¢ dta c'device indus',b($9B)¢ dta c'device ataridos',b($9B)¢ dta c'device clock',b($9B)¢ dta c'device jiffy',b($9B)¢ dta c'device ramdisk',b($9B)¢ dta b(0)¢¢¢ org $724E INIT Disk Registers.¢¢ dbyt equ $308¢ btchrptr equ $73B6¢ btsecptr equ $73B7¢ btmsecn equ $73B9¢ btsecln equ $73BB¢¢ initdr sta btmsecn Procedura zapami❎tuje numer sektora mapy sektorw,¢ stx btmsecn+1¢ ldx #$00¢ lda btsecln oraz inicjuje dugo③ci⇧ sektora wska♪niki w¢ sta btsecptr sektorach mapy i pliku.¢ sta btchrptr¢ sta dbyt Ustawia takəe dugo③⇨ sektora w zmiennych DCB.¢ bne e7265¢ inx¢ e7265 stx dbyt+1¢ rts¢¢¢ org $7269 Get Name From DIRectory file.¢¢ dirbuf equ $789¢ gochar equ $729D¢ btdirptr equ $73B8¢¢ gnfdir ldx #$00 Na pocz⇧tku inicjowany jest wska♪nik buforu wpisu¢ e726B stx btdirptr katalogowego.¢ jsr gochar Nast❎pnie pobierany jest bajt pliku, gdy wynikiem¢ beq e7280 operacji jest zero procedura si❎ koczy.¢ e7273 ldx btdirptr Znak ustawiany jest w buforze na odpowiedniej¢ sta dirbuf,x pozycji,¢ inx a pozycja ta jest zwi❎kszana i porwnywana z maksy-¢ cpx #$17 maln⇧, gdy j⇧ nie jest p❎tla si❎ powtarza.¢ bne e726B¢ lda #$01 Procedura koczy si❎ warto③ci⇧ niezerow⇧.¢ e7280 rts¢¢ org $7281 Get One Line From FILE.¢¢ lbuff equ $A97¢ gochar equ $729D¢ btdirptr equ $73B8¢¢ golffile ldx #$FF Na pocz⇧tku procedury wska♪nik pozycji w lini¢ jest inicjowany.¢ e7283 inx Nast❎pnie jego warto③⇨ jest zwi❎kszana i zapisywana¢ stx btdirptr w zmiennej.¢ jsr gochar Teraz pobierany jest jeden znak pliku, gdy funkcja¢ beq e729C koczy si❎ warto③ci⇧ zerow⇧ koczy si❎ procedura.¢ ldx btdirptr Teraz znak ustawiany jest na odpowiedniej pozycji w¢ sta lbuff,x wierszu, a nast❎pnie¢ cmp #$00¢ beq e729C porwnywany jest z zerem i z warto③ci⇧ $9B ktre¢ cmp #$9B oznaczaj⇧ EOF (end of file) i EOL (end of line).¢ bne e7283¢ lda #$01 Gdy wyst⇧pi eol procedura koczy si❎ warto③ci⇧¢ e729C rts niezerow⇧.¢¢¢ org $729D Get One CHAR from file.¢¢ snfsec equ $72EF¢ getsec equ $730E¢ btchrptr equ $73B6¢ btsecln equ $73BB¢ sec1buf equ $73BD¢¢¢ gochar ldx btchrptr Na pocz⇧tku procedury bierz⇧ca pozycja wska♪nika¢ cpx btsecln porwnywana jest z dugo③ci⇧ sektora i gdy nie s⇧¢ beq e72AE one rwne¢ inc btchrptr zwi❎kszany jest ten wska♪nik.¢ lda sec1buf,x Teraz czytany jest znak z sektora i¢ ldx #$01 procedura si❎ koczy warto③ci⇧ niezerow⇧.¢ rts¢¢ e72AE jsr snfsec Gdy pozycja w sektorze bya rwna jego dugo③ci¢ beq e72C6 wywoywana jest funkcja ustawiaj⇧ca numer nast❎pnego¢ sektora, gdy wynik jej jest zerowy procedura si❎¢ lda <sec1buf koczy, w przeciwnym przypadku ustawiany jest adres¢ ldx >sec1buf buforu i¢ jsr getsec czytany jest sektor pliku.¢ bmi e72C6 Gdy wyst⇧pi b⇧d procedura si❎ koczy z warto③ci⇧ 0.¢¢ sec Teraz ustawiany jest wska♪nik w sektorze na drug⇧¢ rol btchrptr pozycj⇧, a¢¢ lda sec1buf pierwsza zostaje odczytana.¢ ldx #$01 Na kocu zostaje ustalona warto③⇨ niezerowa.¢ rts¢¢ e72C6 ldx #$00 Przy b❎dzie zostaje ustalona warto③⇨ zerowa.¢ rts¢¢¢¢ org $72C9 Get Next Map SECtor.¢¢ daux equ $30A¢ getsec equ $730E¢ btsecptr equ $73B7¢ btmsecn equ $73B9¢ btsecln equ $73BB¢ sec2buf equ $74BD¢¢ gnmsec lda btmsecn Gdy wska♪nik w sektorze numerw by rwny dugo③ci¢ sta daux sektora ustawiany jest numer nast❎pnego sektora mapy¢ lda btmsecn+1¢ sta daux+1¢ lda <sec2buf oraz adres buforu.¢ ldx >sec2buf¢ jsr getsec Teraz odczytywany jest sektor mapy, w przypadku¢ bmi e730B b❎du procedura si❎ koczy.¢¢ lda sec2buf Nast❎pnie ustawiany jest kolejny sektor mapy i¢ sta btmsecn¢ lda sec2buf+1¢ sta btmsecn+1¢ ldy #$04¢ sty btsecptr i wska♪nik w sektorze mapy.¢¢ org $72EF Set Next File SECtor.¢¢ snfsec ldy btsecptr Wska♪nik w sektorze mapy porwnywany jest z¢ cpy btsecln dugo③ci⇧ sektora i gdy jest rəny¢ beq gnmsec¢¢ lda sec2buf,y ustawiany jest wedug niego numer nast❎pnego sektora¢ sta daux pliku.¢ lda sec2buf+1,y¢ sta daux+1¢ iny Teraz zwi❎kszany i zapami❎tywany jest wska♪nik.¢ iny¢ sty btsecptr¢ lda #$01 Procedura koczy si❎ warto③ci⇧ niezerow⇧.¢ rts¢¢ e730B lda #$00 W przypadku b❎du procedura koczy sie z warto③ci⇧¢ rts zerow⇧.¢¢¢ org $730E GET SECtor.¢¢ ddevic equ $300¢ dunit equ $301¢ dcmnd equ $302¢ dstats equ $303¢ dbufa equ $304¢ jsioint equ $E459¢¢ getsec sta dbufa Na pocz⇧tku adres buforu ustawiany jest wedug AX.¢ stx dbufa+1¢ ldy #$01¢ sty dunit Nast❎pnie ustawiany jest numer stacji dyskw,¢ ldy #$31¢ sty ddevic urz⇧dzenie stacji,¢ ldy #'R'¢ sty dcmnd komenda Read-czaytaj sektor,¢ ldy #$40¢ sty dstats status na odbir danych i wywoywana jest funkcja¢ jmp jsioint OS obsuguj⇧ca z⇧cze szeregowe.¢¢¢ org $734F Set EXTended MEMory.¢¢ axext equ $902¢ pbext equ $906¢ portb_t equ $90A¢ extmask equ $91A¢ _800flg equ $A73¢ pbmask equ $A74¢ nbnks equ $A75¢ bankflg equ $A76¢ osrmflg equ $A77¢ sdxmemlo equ $C5F¢ sdxmemhi equ $C63¢¢ sextmem lda #$00 Z pocz⇧tku kasowane s⇧ warto③ci uaktywniaj⇧ca pami❎⇨¢ sta axext+2 rozszerzon⇧ dla standardu Axlon i maska dla PORTB.¢ sta extmask¢¢ bit bankflg Teraz nast❎puje sprawdzenie jaka pami❎⇨ wykorzystywa¢ bpl e7382 jest przez DOS.¢¢ lda nbnks Gdy jest to pami❎⇨ BANKED rejestr A ustawiany jest¢ dec nbnks na numer banku, a liczba bankw ulega zmniejszeniu.¢ bit _800flg Teraz sprawdzane jest czy komputer to 800.¢ bpl e736C¢¢ sta axext+2 Gdy tak jest warto③⇨ uaktywniaj⇧ca bank dodatkowy¢ bmi e737E jest po prostu jego numerem.¢¢ e736C lsr @ Gdy komputer inny niə 800, a co za tym idzie rozsze-¢ lsr @ rzenie oparte na PORTB numer banku dzielony jest¢ tax przez cztery¢¢ e736F dex zmniejszany o jeden i warto③⇨ uaktywniaj⇧ca pobie-¢ lda portb_t,x rana jest z tablicy grup bankw.¢ ora #$0C Teraz ustawiany jest najstarszy bank w grupie i¢ sta pbext+2 ostatecznie ta warto③⇨ jest ustalana dla pami❎ci¢ lda pbmask extended. Nast❎pnie maska PORTB jest przenoszona do¢ sta extmask maski pami❎ci extended.¢¢ e737E ldx #$03 Teraz ustalany jest indeks adresw memlo i memhi.¢ bne e7397¢¢ e7382 bit osrmflg W tej cz❎③ci sprawdzane jest czy uəywana jest pami❎⇨¢ bpl e7395 OSRAM.¢¢ lda #$FE Gdy tak jest warto③ci⇧ uaktywniaj⇧c⇧ jest $FE,¢ sta pbext+2¢ lda #$01¢ sta extmask a mask⇧ bitw waənych 1.¢ ldx #$05¢ bne e7397 Teraz ustalany jest indeks adresw memlo i memhi.¢¢ e7395 ldx #$01 Dla pami❎ci NONE nie ma warto③ci uaktywniaj⇧cych.¢¢ e7397 ldy #$01 W ostatniej cz❎③ci procedury adresy MEMLO i MEMHI¢ e7399 lda memlotab,x przenosone s⇧ z tablic inicjuj⇧cych do odpowiednich¢ sta sdxmemlo+2,y rejestrw wedug ustalonych indeksw.¢ lda memhitab,x¢ sta sdxmemhi+2,y¢ dex¢ dey¢ bpl e7399¢ rts Po czym procedura si❎ koczy.¢¢ memlotab dta a($0000) ($73aa) memlotab¢ dta a($4000)¢ dta a($E400)¢¢ memhitab dta a($0000) ($73b0) memhitab.¢ dta a($8000)¢ dta a($FFC0)¢¢ org $3837 ADd SDX ENVironment.¢¢ bufadr equ $15¢ faux1 equ $782¢ faux4 equ $785¢ jext_on equ $7F1¢ jext_of equ $7F4¢ env_p equ $C4F¢ envext equ $C56¢ saplahf equ $A1E8¢ MALLOC equ $AF54¢¢ adsdxenv ldx #$00 Na pocz⇧tku procedura ustawia sowo faux4 na jedn⇧¢ stx faux4 stron❎,¢ inx¢ stx faux4+1 nast❎pnie indeks X jako indeks pami❎ci ustawia na 2¢ inx (extended), a Y zeruje po czym wywouje funkcj❎¢ ldy #$00¢ jsr MALLOC MALLOC przydzielaj⇧c⇧ pami❎⇨.¢ stx envext W X zawarty jest indeks pami❎ci przydzielonej¢ lda faux1 buforowi, a w sowie FAUX1 adres buforu.¢ sta env_p Teraz zostaj⇧ ustalone wska♪nik do buforu i adres¢ sta bufadr pomocniczy adres buforu.¢ lda faux1+1¢ sta env_p+1¢ sta bufadr+1¢ txa Nast❎pnie uaktywniona zostaje odpowiednia pami❎⇨ i¢ jsr jext_on¢ ldy #$FF¢ e385F iny¢ lda sdxenv,y przepisane zostaj⇧ domy③lne zmienne ③rodowiskowe.¢ sta (bufadr),y¢ bne e385F¢ jsr jext_off Na kocu w⇧czona zostaje pami❎⇨ podstawowa i¢ jmp saplahf ustawiony zostaje wska♪nik H_FENCE.¢¢ sdxenv dta c'COMSPEC=CAR:COMMAND.COM',b($9B) ($386D)¢ dta c'PROMPT=D$N:',b($9B)¢ dta c'PATH=CAR:',b($9B)¢ dta c'BATCH=AUTOEXEC',b($9B)¢ dta c'CAR=I:CAR.SAV',b($9B)¢ dta c'BASIC=I:BASIC.SAV',b($9B)¢ dta b(0)¢¢ end of doc.¢