Procedura czyta konfiguracj❎ stacji dyskw, ⇧czy si❎ ona z¢ procedur⇧ ustalaj⇧c⇧ ustawienia pocz⇧tkowe uəytkownika.¢¢ org $A36C ReaD drive CONFIGuration.¢¢ dcmnd equ $302¢ dstats equ $303¢ dbyt equ $308¢¢ btspsec equ $7A0¢ tsecnum equ $7A2¢ dskid equ $7A8¢ prcmflg equ $7AB¢ flpflg equ $7AC¢ secptrkl equ $7B5¢ secptrkh equ $7B7¢ frskew equ $7BA¢ frden equ $7BB¢ frtrack equ $7BD¢ lbuff equ $A97¢¢ stddnr equ $A42D¢ getdst equ $A43A¢ sdajlsio equ $A953¢¢ rdconfig lda #$00 Na pocz⇧tku procedura kasuje flag❎ rozpoznawania¢ sta prcmflg przez stacj❎ rozkazw PERCOM.¢¢ jsr getdst Teraz procedura pobiera status nap❎du i¢ bpl eA379 sprawdza wynik.¢¢ jmp stddnr Gdy stacja nie odpowiada komunikowany jest b⇧d.¢¢ eA379 lda #'N' Teraz procedura prbuje odczyta⇨ PERCOM ze stacji,¢ sta dcmnd ustawia wi❎c pola DCB,¢ lda #$40 kodu, statusu,¢ sta dstats¢ eA383 lda #$0C¢ sta dbyt dugo③ci danych i¢ lda #$00¢ sta dbyt+1¢ jsr sdajlsio wywouje funkcj❎.¢ bmi eA3DF Gdy b⇧d.¢¢ dec prcmflg Gdy operacja si❎ powioda ustawiana jest flaga¢ PERCOM i¢ ldx lbuff+7¢ stx btspsec odpowiednie zmienne procedury jak¢ ldx lbuff+2 liczba bajtw w sektorze,¢ stx secptrkh¢ ldx lbuff+3¢ stx secptrkl¢ lda lbuff¢ sta dskid identyfikator dysku,¢ and #$7F¢ tax Nast❎pnie kasowana jest cakowita liczba¢ lda #$00 sektorw¢ sta tsecnum¢ sta tsecnum+1¢¢ eA3B8 clc aby uzyska⇨ proawidowy wynik poprzez¢ lda secptrkl przemnoəenie liczby sektorw na ③cieəce przez¢ adc tsecnum liczb❎ ③cieəek.¢ sta tsecnum¢ lda secptrkh¢ adc tsecnum+1¢ sta tsecnum+1¢ dex¢ bne eA3B8¢¢ lda lbuff+4 Teraz procedura przemnaəa dwukrotnie wynik¢ beq eA3D9¢ asl tsecnum gdy stacja jest dwustronna.¢ rol tsecnum+1¢¢ eA3D9 ldx dskid Nast❎pnie procedura sprawdza czy chodzi o ramdysk¢ dex lub hard dysk.¢ beq eA40F¢¢ eA3DF bit flpflg Teraz procedura sprawdza czy chodzi o normaln⇧¢ bmi sddata stacj❎ dyskw.¢¢ eA3E4 dec flpflg A gdy tak nie jest oznacza to wykasowanie¢ lda #$00 wszelkich ustawie urzytkownika.¢ sta frskew¢ sta frtrack¢ sta frden¢ inc frskew¢¢ org $A3F5 Set Disk DATA.¢¢ btspsec equ $7A0¢ prcmflg equ $7AB¢ flpflg equ $7AC¢ frskew equ $7BA¢ frden equ $7BB¢ frmode equ $7BC¢ frtrack equ $7BD¢¢ rfsec equ $A475¢¢ sddata bit prcmflg Teraz procedura sprawdza czy zosta odczytany¢ bmi eA40C PERCOM.¢¢ lda #$02 Gdy tak nie byo oznacza to stacj❎ standardow⇧, a¢ sta frskew wi❎c przeplot ustala si❎ na zwyky (transmisje),¢ lda #$00¢ sta frtrack liczba ③cieəek jest ustalana na 40 jednostronnie,¢ lda frden¢ bne eA40C¢ inc frden a g❎sto③⇨ na single.¢¢ eA40C lda #$00 Po czym procedura si❎ koczy.¢ rts¢¢ eA40F jsr rfsec Dla ramdysku w celu odczytania ustale procedura¢ bmi stddnr czyta pierwszy sektor,¢¢ lda #$03 a gdy zdoaa ustala przeplot na niedost❎pny,¢ sta frskew¢ lda #$06¢ sta frtrack liczb❎ ③cieəek na niedost❎pn⇧,¢ lda #$00¢ sta flpflg Flaga dysku flopy jest kasowana,¢ sta frden g❎sto③⇨ ustawiana jest na double,¢ sta frmode typ katalogu na sparta,¢ sta btspsec a liczb❎ bajtw w sektorze na 256.¢ rts¢¢ Procedura wy③wiela tekst.¢¢ org $A42D Set Text Drive DoN't Responded.¢¢ dlc equ $7D9¢ ddnrtxt equ $AD3F¢¢ stddnr lda <ddnrtxt Procedura umieszcza wska♪nik do tekstu¢ sta dlc+1¢ lda >ddnrtxt w adresach DLC i koczy dziaanie.¢ sta dlc+2¢ lda #$FF¢ rts¢¢ org $A43A GET Drive STatus.¢¢ dcmnd equ $302¢ dstats equ $303¢ dbufa equ $304¢ dtimlo equ $306¢ dbyt equ $308¢ siocnter equ $7AA¢ lbuff equ $A97¢¢ sdajlsio equ $A953¢ waitftk equ $A9E7¢¢ getdst lda <lbuff Procedura ustawia adres buforu,¢ sta dbufa¢ lda >lbuff¢ sta dbufa+1¢¢ lda #'S' kod komendy status,¢ sta dcmnd¢ lda #$04 dugo③⇨ buforu dla niej na 4 bajty,¢ sta dbyt¢ lda #$00¢ sta dbyt+1¢ lda #$02 oraz czas operacji.¢ sta dtimlo¢ lda #$FF¢ sta siocnter Teraz ustawia licznik powtrze operacji,¢¢ eA45D lda #$40 ustawia status na odczyt,¢ sta dstats¢ jsr sdajlsio wywouje funkcj❎ DCB i¢ bpl eA472 sprawdza wynik.¢ inc siocnter Gdy wyst⇧pi b⇧d procedura zwi❎ksza licznik wywoa¢ bne eA472¢ jsr waitftk i gdy jest on niezerowy oczekuje chwilk❎ na klawisz,¢ jmp eA45D a gdy go nie naci③ni❎to procedura powtarza operacj❎.¢¢ eA472 cpy #$00 Podczas koczenia dziaania procedura uaktualnia¢ rts rejestr F.¢¢ Procedura czyta pierwszy sektor dyskowy.¢¢ org $A475 Read First Sector.¢¢ dcmnd equ $302¢ dstats equ $303¢ dbyt equ $308¢ daux equ $30A¢¢ sdajlsio equ $A953¢¢ rfsec lda #$40 Na pocz⇧tku procedura ustala pola DCB,¢ sta dstats status na czytanie danych,¢ asl @ dugo③⇨ sektora na $80 bajtw,¢ sta dbyt¢ rol @¢ sta dbyt+1¢ sta daux+1 numer sektora na 1,¢ rol @¢ sta daux¢ lda #'R' a komend❎ na czytaj sektor.¢ sta dcmnd¢ jmp sdajlsio Na kocu wywouje funkcj❎.¢¢ Procedura wy③wietla dane o ustawieniu ustawieniach uəytkownika.¢¢ org $A491 Print Disk DATA.¢¢ icbaz equ $24¢ icblz equ $28¢ flpflg equ $7AC¢ frtmp equ $7B3¢ frskew equ $7BA¢ frtafrm equ $ABA2¢ frtadoff equ $ABC6¢ frtidx equ $ABCB¢ frtlen equ $ABD0¢ frtadto equ $ABD5¢¢ psecabts equ $A4D9¢ sfvar equ $A52C¢¢¢ pddata bit flpflg Na pocz⇧tku procedura sprawdza jakiego dysku dotycz⇧¢ bpl eA499 ustawienia.¢¢ jsr sfvar Dla dyskw mi❎kich ustalane s⇧ warto③ci dyskowe.¢¢ eA499 jsr psecabts Nast❎pnie procedura wy③wietla liczb❎ sektorw.¢¢ ldx #$04 Teraz procedura okre③la liczb❎ wy③wietlanych¢ eA49E stx frtmp zmiennych,¢ ldy frtidx,x teraz pobierany jest indeks zmiennej,¢ lda frskew,y jest on zwi❎kszany dla odpowiednich g❎sto③ci,¢ asl @ mnoəony przez dwa,¢ adc frtadoff,x dodwane jest przesuni❎cie.¢ tay wedug tak ustalonego indeksu¢ lda frtafrm,y pobierany i ustalany jest z tabeli wska♪nik¢ sta icbaz do tekstu informacyjnego.¢ lda frtafrm+1,y¢ sta icbaz+1¢ ldy frtlen,x Teraz ustalany jest ekranowy adres wy③wietlanych¢ txa danych.¢ asl @¢ tax¢ lda frtadto,x¢ sta icblz¢ lda frtadto+1,x¢ sta icblz+1¢ eA4C6 cpy #$00¢ beq eA4D2¢ dey¢ lda (icbaz),y I tekst jest przepisywany na ekran.¢ sta (icblz),y¢ jmp eA4C6¢¢ eA4D2 ldx frtmp po przepisaniu wszystkich zmiennych¢ dex¢ bpl eA49E¢ rts procedura si❎ koczy.¢¢ Procedura oblicza i wy③wietla liczb❎ sektorw i cakowit⇧ liczb❎ bajtw¢ na dysku.¢¢ org $A4D9 Print number of SECtors and total ByTeS.¢¢ cassec equ $462¢ casbts equ $470¢ btspsec equ $7A0¢ tsecnum equ $7A2¢ decout equ $A45¢ divend equ $A52¢¢ tointer equ $A9FD¢ todecout equ $AA14¢¢ psecabts lda tsecnum Na pocz⇧tku procedura zamienia liczb❎ sektorw¢ sta divend¢ lda tsecnum+1¢ sta divend+1¢ lda #$00¢ sta divend+2¢ jsr todecout na liczb❎ dziesi❎tn⇧.¢¢ ldx #$04 Po czym wy③wietla j⇧ w odpowiednim miejscu¢ eA4EF lda decout+3,x ekranu.¢ jsr tointer¢ sta cassec,x¢ dex¢ bpl eA4EF¢¢ lda #$00 Teraz procedura ustala liczb❎ bajtw poprzez¢ sta divend jej przemnoəenie razy 256.¢ lda tsecnum¢ sta divend+1¢ lda tsecnum+1¢ sta divend+2¢¢ bit btspsec Nast❎pnie procedura sprawdza czy sektory s⇧¢ bpl eA51A 256 bajtowe¢¢ lsr divend+2 i gdy tak nie jest dzieli liczb❎ bajtw¢ ror divend+1 przez dwa.¢ ror divend¢¢ eA51A jsr todecout Teraz zamienia liczb❎ na ci⇧g znakw i¢¢ ldx #$07¢ eA51F lda decout,x wy③wietla na ekranie.¢ jsr tointer¢ sta casbts,x¢ dex¢ bpl eA51F¢ rts¢¢ Procedura ustawia rejestry dysku wedug ustale urzytkownika.¢¢ org $A52C Set Format VARiable.¢¢ btspsec equ $7A0¢ secptrk equ $7A1¢ tsecnum equ $7A2¢ dsktpe equ $7A4¢ usskwflg equ $7A5¢ hsskwflg equ $7A6¢ _77flg equ $7A7¢ dskid equ $7A8¢ tsnidx equ $7A9¢ frskew equ $7BA¢ frden equ $7BB¢ frtrack equ $7BD¢ tsntab equ $AA22¢ bps77tab equ $AA46¢ dtp77tab equ $AA48¢ spt77tab equ $AA4A¢ bpstab equ $AA4C¢ dtptab equ $AA4F¢ spttab equ $AA52¢ dskidtab equ $AA55¢¢ sfvar ldx frtrack Na pocz⇧tku procedura ustawia DSKID poprzez¢ lda dskidtab,x tablic❎.¢ sta dskid¢¢ ldy #$00 Nast❎pnie procedura sprawdza czy chodzi o stacj❎¢ and #$7F 8 calow⇧ (77 ③cieəek) i¢ cmp #$4D¢ bne eA53E¢ dey¢ eA53E sty _77flg ustawia odpowiedni⇧ flag❎.¢ txa¢ asl @¢ sta tsnidx¢ asl @¢ adc tsnidx Teraz procedura ustala indeks do tablicy danych¢ sta tsnidx dyskowych (przemnoəony przez 6).¢¢ ldx frden¢ bit _77flg Nast❎pnie sprawdza o jak⇧ stacj❎ chodzi.¢ bmi eA56A¢¢ lda bpstab,x Gdy o normaln⇧ to w zaleəno③ci od g❎sto③ci¢ sta btspsec ustawia liczb❎ bajtw w sektorze,¢ lda dtptab,x¢ sta dsktpe typ dysku,¢ lda spttab,x¢ sta secptrk i liczb❎ sektorw na ③cieəce.¢ jmp eA57C¢¢ eA56A lda bps77tab,x Dla stacji 8 calowej poczynania s⇧ identyczne¢ sta btspsec lecz procedura korzysta z innych tablic.¢ lda dtp77tab,x¢ sta dsktpe¢ lda spt77tab,x¢ sta secptrk¢¢ eA57C txa¢ asl @¢ adc tsnidx Teraz ustawiany jest indeks do tablic liczby¢ tax sektorw (indeks g❎sto③ci * 3)¢ lda tsntab,x¢ sta tsecnum¢ lda tsntab+1,x¢ sta tsecnum+1 i ustawiana jest cakowita liczba sektorw.¢¢ lda #$00¢ sta usskwflg¢ sta hsskwflg Teraz kasowane s⇧ flagi szybkich transmisji.¢¢ ldx frskew I procedura sprawdza jak⇧ wybra urzytkownik i¢ beq eA5A3 ustawia odpowiednie flagi.¢ cpx #$02¢ beq eA5A6¢ dec hsskwflg Gdy HIGH.¢ rts¢ eA5A3 dec usskwflg Gdy US.¢ eA5A6 rts Gdy normal.¢¢ Procedura dokonuje fizycznego formatowania dysku.¢¢ org $A5A7 Format DiSK Procedure.¢¢ zbufa equ $43¢ dcmnd equ $302¢ dstats equ $303¢ dtimlo equ $306¢ dbyt equ $308¢ btspsec equ $7A0¢ secptrk equ $7A1¢ usskwflg equ $7A5¢ hsskwflg equ $7A6¢ prcmflg equ $7AB¢ frskew equ $7BA¢ frden equ $7BB¢ dlc equ $7D9¢ lbuff equ $A97¢ denskew equ $AA5B¢ idprtxt equ $AC5F¢ fdtxt equ $AC7F¢ dfstxt equ $AC9F¢ dcrustxt equ $AD5F¢ dcrhstxt equ $AD7F¢¢ getdst equ $A43A¢ pddata equ $A491¢ spercom equ $A671¢ wdirs equ $A61D¢ eicdproc equ $A733¢ eifdproc equ $A739¢ sdajlsio equ $A953¢ getkey equ $A9AA¢ stawait equ $A9DD¢¢ fdskp lda hsskwflg Na pocz⇧tku procedura kasuje flag❎ HIGH, a jej¢ sta usskwflg warto③ci⇧ inicjuje flag❎ US.¢ lda #$00¢ sta hsskwflg¢¢ lda <idprtxt Teraz procedura wy③wietla tekst i¢ sta dlc+1¢ lda >idprtxt¢ sta dlc+2¢¢ eA5BC jsr getkey oczekuje naci③ni❎cia kawisza RETURN.¢ cmp #$9B¢ bne eA5BC¢¢ eA5C3 lda <fdtxt Gdy klawisz ten zosta naci③ni❎ty procedura¢ sta dlc+1 wy③wietla nast❎pny tekst 'Formating...'¢ lda >fdtxt¢ sta dlc+2¢¢ jsr getdst Nast❎pnie pobiera status stacji dyskw.¢ bit prcmflg¢ bpl eA60D¢¢ jsr spercom Gdy stacja obsuguje PERCOM jest on ustawiany¢ bit usskwflg i procedura sprawdza czy ma si❎ odby⇨ w transmisji¢ bmi eA5E5 US.¢¢ jsr sdajlsio Dla transmisji HIGHT procedura nadaje PERCOM,¢ bpl eA60D¢¢ jmp eicdproc a gdy wyst⇧pi b⇧d koczy dziaanie.¢¢ eA5E5 lda #'f' Dla transmisji US ustawiany jest odpowiedni kod¢ sta dcmnd komendy formatuj⇧cej,¢ ldx #$80¢ stx dbyt ustalana jest dugo③⇨ buforu.¢¢ lda frden Teraz procedura dla odpowiedniej g❎sto③ci¢ asl @ ustawia wska♪nik do tablicy przeplotu sektorw.¢ tax¢ lda denskew,x¢ sta zbufa¢ lda denskew+1,x¢ sta zbufa+1¢¢ ldy #$00¢ eA600 lda (zbufa),y Nast❎pnie w buforze komunikacji ustalany jest ten¢ sta lbuff+$C,y przeplot¢ iny¢ cpy secptrk¢¢ eA609 bne eA600¢ beq eA634 i wykonywana jest operacja formatowania.¢¢ eA60D lda #'!' Dla formatw zwykych lub HIGH ustalany jest rozkaz¢ ldx frden formatowania !-dla single lub percom, a¢ cpx #$02¢ bne eA618¢ lda #'"' "-dla dual (enhanced alias medium).¢ eA618 bit hsskwflg Teraz procedura sprawdza chy chodzi o HIGH.¢ bpl eA61F¢ ora #$80 Gdy tak jest rozkaz jest ustawiany w negatyw¢¢ eA61F sta dcmnd i ustalana jest odpowiednia komenda.¢ lda btspsec¢ sta dbyt Nast❎pnie procedura ustala dugo③⇨ buforu¢ eor #$80¢ asl @¢ rol @¢ sta dbyt+1 odpowiednio do g❎sto③ci i ustawia¢ lda #$40¢ sta dstats status na odczyt,¢ eA634 lda #$F8¢ sta dtimlo nast❎pnie ustala czas operacji,¢ jsr sdajlsio i wywouje funkcj❎ DCB.¢ bpl eA665¢ bit usskwflg Gdy operacja si❎ nie powioda, a transmisja¢ bpl eA64B ustawiona bya na US¢ bmi eA65C¢¢ lda <dcrustxt procedura powinna wy③wietla⇨ tekst 'DRIVE CAN'T RUN¢ ldx >dcrustxt US !' ale nigdy tego nie robi.¢ bne eA654¢¢ eA64B bit hsskwflg Nast❎pnie procedura sprawdza czy ustawiona bya¢ bpl eA662 transmisja HIGH¢¢ lda <dcrhstxt i gdy tak byo wypisuje 'DRIVE CAN'T RUN HIGHSPEED!'¢ ldx >dcrhstxt¢¢ eA654 ldy #$02 Teraz procedura wy③wietla tekst i chwil❎¢ jsr stawait oczekuje, nast❎pnie zmienia przeplot (rodzaj¢ inc frskew transmisji),¢¢ eA65C jsr pddata wy③wietla nowe ustawienia na ekran i¢ jmp eA5C3 ponawia prb❎ formatowania.¢¢ eA662 jmp eifdproc Gdy procedura sprawdzi wszystkie kombinacje i nie¢ sformatuje dysku wy③wietla komunikat o b❎dzie.¢¢ eA665 lda <dfstxt W przeciwnym wypadku wy③wietla komunikat o¢ ldx >dfstxt prawidowym przebiegu procedury i¢ ldy #$01¢ jsr stawait po chwili oczekiwania przechodzi do¢ jmp wdirs nagrywania katalogu.¢¢ Procedura ustawia PERCOM do wysania.¢¢ org $A671 Set Percom data.¢¢ dcmnd equ $302¢ dstats equ $303¢ dbyt equ $308¢ daux equ $30A¢ btspsec equ $7A0¢ secptrk equ $7A1¢ dsktpe equ $7A4¢ dskid equ $7A8¢ lbuff equ $A97¢¢ spercom ldx #$00 Na pocz⇧tku procedura czy③ci bufor lbuff uəywany¢ txa jako bufor operacji.¢ eA674 sta lbuff,x¢ inx¢ bpl eA674¢¢ sta dbyt+1 Nast❎pnie kasuje starsze bajty dugo③ci i numeru¢ sta daux+1 sektoru.¢¢ lda #$80¢ sta dstats Teraz ustawia operacj❎ nadawania,¢¢ lda #$04¢ sta daux numer sektora (pierwszy po boot sektorach),¢ lda dskid¢ and #$7F¢ sta lbuff liczb❎ ③cieəek,¢ lda secptrk¢ sta lbuff+3 liczb❎ sektorw na ③cieəce,¢ ldx #$01¢ stx lbuff+1 krok gowicy,¢ lda btspsec¢ sta lbuff+7 liczba bajtw w sektorze,¢ bmi eA6A8¢ inc lbuff+6 dla 256 zwi❎ksza starszy bajt,¢ eA6A8 lda dsktpe¢ sta lbuff+5 oraz kod typu dysku.¢¢ lda dskid Nast❎pnie ustawia liczb❎ stron dysku¢ and #$80¢ asl @ (zaznaczona jako najstarszy bit dskid).¢ rol @¢ sta lbuff+4¢¢ lda #$FF¢ sta lbuff+8 Na samym kocu wstawia bajt kontroli transmisji i¢¢ lda #'O' ustawia pole DCB, kod operacji i¢ sta dcmnd¢ lda #$0C¢ sta dbyt dugo③⇨ buforu.¢ rts¢¢ end of doc¢