Čvn 292006
 

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.