V minulém díle jsem zapomněl zapracovat rutinky na tisk procent, abychom věděli, jak daleko jsme.
Přeci jen, když už tu rutinu na výpočet procent pro 32-bitová čísla máme, tak jí přece využijeme.
V adresáři s knihovnama máme navíc tyto rutiny:
cmdendsec.a80, který vypočítá poslední LBA sektor oddílu. V tabulce oddílů jsou vlastně údaje o začátku a délce, takže je třeba tyto údaje sečíst a odečíst jedničku.
CMDENDSEC: ;spocita konec oddilu ;bcde=pocatecni sektor ;ix=partition ld a,(ix+5) ;secti zacatek partition a delku partition add a,e ld e,a ld a,(ix+6) adc a,d ld d,a ld a,(ix+7) adc a,c ld c,a ld a,(ix+8) adc a,b ld b,a ;a odecti jednicku ld a,e add a,255 ld e,a ret c ld a,d add a,255 ld d,a ret c ld a,c add a,255 ld c,a ret c ld a,b add a,255 ld b,a ret
Pak je tam ještě rutina na tisk čísel, je to stará známá rutina, jmenuje se num2dec.a80:
NUM2DEC: ld e,' ' ld bc,-10000 call NUM1 ld bc,-1000 call NUM1 ld bc,-100 call NUM1 ld c,-10 call NUM1 ld e,'0' ld c,b NUM1: ld a,'0'-1 NUM2: inc a add hl,bc jr c,NUM2 sbc hl,bc cp '0' jr nz,NUM4 ld a,e NUM3: jp ZNAK2 NUM4: ld e,'0' jr NUM3
Nakonec je tam nová knihovna fdblock.a80, která je připravena na příště, která umí procházet FAT diskety, tenhle program ani nebudu komentovat, D80 developeři ho znaj a já jsem jeho funkci ani nestudoval:
FDBLOCK: push bc ld bc,DIR ld de,341 or a LESS: inc b inc b sbc hl,de jr nc,LESS add hl,de MORE: ld e,l ld d,h srl d rr e ex af,af' add hl,de add hl,bc ld e,(hl) inc hl ld d,(hl) dec hl ld a,1 ld (TYPE),a ex af,af' jr nc,NODD ODD: xor a ld (TYPE),a ld a,e ld e,d jr BOTH NODD: ld a,d rrca rrca rrca rrca BOTH: and 15 ld d,a pop bc ret TYPE: db 0
Pro výpočet procentuálního podílu, který je nutné spočítat, potřebujeme znát koncový sektor oddílu. Ten si vytáhneme hned za zavoláním rutiny GET AKTPAR, v hl je adresa tabulky, kterou přesuneme do ix, číslo vytáhneme do BCDE a skočíme si pro výpočet koncového sektoru. Výsledek nalijeme do proměnné ENDSEC, která je v rutině PROCENTO.
V hlavní smyčce programu, hned za tisk názvu diskety šoupneme výpočet procenta. Protože ale chceme ukazovat co už je hotovo, načteme sektor diskety a posuneme se za ní. Službou ADD1693 k číslu sektoru přičteme délku diskety a následně vypočteme procento, které následně vytiskneme za textem.
Na konci zdrojáku máme includnuté nové knihovní funkce a připsaný nový text.
Takže dokončení už snad přístě, doufejme, že to stihnu do Shuconu.
obsah souboru patchrun.a80, jehož doplňky jsou obarveny červeně:
;program na prepracovani outu 145 a 153 u FileManageru, protoze koliduje ;se strankovanim na 128 a pak nefunguje na neupravenych 128 ;program bude mit za ukol projit aktualni partition a na vsech nalezenych ;disketach najit soubor run.P a "opatchovat" novymi hodnotami. ;ovsem, jen ty, ktere jsou opravdu filemanagerem zname verze. cpu z80undoc relaxed on shared START,RAMTOP ;navesti k exportu SERVICE: equ $24 org 25000 ;za programem budeme potrebovat ;prostor pro nactenou disketu START: RAMTOP: equ START-1 di ld (RETURN + 1),sp ;uloz si hodnotu zasobniku STARTX: call SHADE ;prestrankuje do ROM MDOS3 call GET_VER ;zjisti informace o MDOS3 call CLS ;smaz obr. tiskni hlasku call GET_AKTPAR ;nacti udaje o aktualni partition push hl pop ix ;presun adresu aktpar do IX ld e,(ix + 1) ;napln registry pocatecnim sektorem ld d,(ix + 2) ld c,(ix + 3) ld b,(ix + 4) call CMDENDSEC ;spocte posledni sektor oddilu ld (ENDSEC),de ;a naplni do pameti ld (ENDSEC+2),bc ;pro rutinu procento.a80 call FIRST_DISK ;do BCDE prvni sektor prvni diskety MAINLOOP: call VALID_DISK ;otestuje platnou disketu (z=OK) jr nz,NEXT_DISK ;jinak skoc na dalsi ld de,16384+64+4 ld (POS),de ;nastav pozici xor a ld (COL),a ld (ROLL),a ld hl,INFOSEKTOR+4 ;vytiskni nazev diskety call PRINT32 ;presne 32 znaku ld ix,DISKETA call BCDE_IX ;ukazatel na disketu ld a,14 ;posun na konec diskety call SERVICE ;ADD1693 call PROCENTO ld de,16384+128+10 ;nastav pozici tisku ld hl,T_HOTOVO ;text call PRINT ;vytiskni ld a,(VYSLEDEK) ;vezmi vysledek ld l,a ld h,0 call NUM2DEC ;a vytiskni ld a,'%' call ZNAK2 ;a za nim znak % ;zde bude program pokracovat nactenim a patchem NEXT_DISK: ld ix,DISKETA call BCDE_IX ;ukazatel na disketu ld ix,(AKTPAR) ;ukazatel na udaje o partition ld a,16 ;NEXTDISK call SERVICE jr c,RETURN ;HOTOVO, dalsi disketa neni ld ix,DISKETA ;nezapomen si to ulozit call IX_BCDE call KEYBREAK ;nc=BREAK jr c,MAINLOOP ;jinak smyckuj RETURN: ld sp,0 ;pouzivej vzdy jen tento call ZXROM ei ;navrat zpet do BASICu. ret VALID_DISK: ld ix,DISKETA call BCDE_IX ;BCDE = infosektor diskety ld hl,INFOSEKTOR ;na adresu ld a,25 ;READHDD call SERVICE ;nacti inc c dec c ;byla nejaka chyba? jp nz,ERROR ld hl,ZNACKA ;kontroluje, jestli je v infosektoru ld de,INFOSEKTOR ;nase znacka ld b,4 ;ktera rika, ze je to disketa COMPARE: ld a,(de) ;porovnava B znaku cp (hl) ;z adresy DE a HL ret nz ;Z = stejne inc de inc hl djnz COMPARE xor a ret ZNACKA: db "SDOS" FIRST_DISK: ld a,(hl) ;typ partition inc hl ;posun se ld e,(hl) ;a postupne nacti udaje do bcde inc hl ld d,(hl) inc hl ld c,(hl) inc hl ld b,(hl) cp 255 jr z,+ ;slave=skok cp 5 jr c,++ / set 4,b ;slave / ld ix,DISKETA ;uloz udaje o diskete IX_BCDE: ld (ix+0),e ;ulozi BCDE na (IX) ld (ix+1),d ld (ix+2),c ld (ix+3),b ret BCDE_IX: ld e,(ix+0) ld d,(ix+1) ld c,(ix+2) ld b,(ix+3) ret GET_AKTPAR: ld a,3 ;GET_AKTPAR call SERVICE ;hl=aktpar ld (AKTPAR),hl ld a,(hl) ;musime zkontrolovat or a ;jestli je vubec nejaka ret nz ;partition vybrana ld de,16384+64+4 ld hl,T_NONPART ;chyba jr REPEAT GET_VER: xor a ;zjisti inicializaci MDOS3 call SERVICE ;sluzbou GET_VER ret nz ;navrat = OK pop hl ;zrus navrat adresu ld de,16384+64+4 ;pozice ld hl,T_INIT ;tiskni hlasku REPEAT: call PRINT call INKEY ;cekej na klapku call ZXROM ;prestrankuj do ZXROM call $66 ;zavolej NMI jp STARTX ;a pak spust program znovu CLS: ld hl,16384 ;smaz obrazovku ld de,16385 ld bc,6144 ld (hl),0 ldir ld (hl),7 ;nastav bila na cerne ld bc,767 ldir ld de,16387 ld hl,T_WELCOME ;vytiskni uvitaci text call PRINT ret ;jednuduche osetreni chyb. ERROR: ld de,16384+64+4 ;pozice ld hl,T_ERROR ;tiskni hlasku call PRINT jp RETURN ;a skonci ;Promenne AKTPAR: dw 0 DISKETA: db 0,0,0,0 ;TEXTY T_INIT: db "MDOS3 neni inicializova",'n'+128 T_WELCOME: db "Vitejte v PATCHRU",'N'+128 T_NONPART: db "Neni nastavena zadna partitio",'n'+128 T_ERROR: db "Chyba pri cteni/zapis",'u'+128 T_HOTOVO: db "Hotovo jiz",':'+128 ;includovane knihovny include include/shade.a80 include include/print.a80 include include/num2dec.a80 include include/inkey.a80 include include/fdblock.a80 ;programy pro praci s FAT include include/procento.a80 include include/cmdendsec.a80 ;pracovni prostor INFOSEKTOR: ds 512
stažení:
Je nám líto, ale formulář pro přidávání komentářů je momentálně uzavřen.