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í: