OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 21:10

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 585 ]  Přejít na stránku Předchozí  1 ... 26, 27, 28, 29, 30, 31, 32 ... 39  Další
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 24.03.2023, 02:51 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Jeste jsem udelal pro Boriel basic benchmark na vypocet prvocisel pomoci Eratosthenova sita.
Je to uz trochu komplexnejsi programek, takze po kompilaci jsem ziskal zdrojak, ktery nejde zkompilovat a i kdyz odmazu radky zacinajici "#line xxx" tak tam zacnou vznikat duplicitni labely a nebo odkazy na neexistujici labely, kde predtim stacilo doplnit rucne .core. pred nazev.
A ke vsemu je tam 8000 radku s " DEFB 00h", zadne makro na rozvinuti a prvni vec pri kompilaci je ze pasmo zarve ze je spatnu numericky format a ukonci se bez toho ze by aspon rekl radek... tak jsem binarku ziskal vykopirovanim pameti z tap souboru.

Kód:
|       Name        |                System                |        Forth / C        |  Benchmark   | Time (sec/round) | Scale |
| :---------------: | :----------------------------------: | :---------------------: | :----------: | :--------------- | :---: |
| Dw0rkin           | ZX Spectrum Fuse 1.5.1 Ubuntu        | M4_FORTH                | Sieve Bench  | 1.16s
| Dw0rkin           | ZX Spectrum Fuse 1.6.0 Ubuntu        | Boriel Basic zxbc 1.16.4| Sieve Bench  | 3.48s
| Dw0rkin           | ZX Spectrum Fuse 1.5.1 Ubuntu        | zcc z88dk v16209        | Sieve Bench  | 5.94s
| Johan Kotlinski   | C64                                  | DurexForth 1.6.1 (STC)  | Sieve/Prime  | 10s              | 1x


Vysledek je obdobny jako v predchozich pripadech.
Je to lepsi nez C, uz ne o tolik, protoze C ma kouli u nohy s tim jak si musi vytvorit zasobnikovy ramec, protoze dela funkce tak, aby mohly byt rekurzivni.

Neco jako

ld ix,0
add ix,sp

nacte aktualni ukazatel zasobniku do registru IX a pak se da na vstupni parametry odkazovat pres

ld a,(ix+n)

A i kdyz to takhle nevypada tak jsou to fakt drahe instrukce, takze se to na malych funkcich projevi, takze i kdyby melo sdcc zbytek hodne kvalitni tak musi prvne srovnat pocatecni ztratu.

PS: Imho by bylo pro C asi lepsi kdyby misto jednoho z registru IX nebo IY tohle umelo rovnou SP.

takze by slo udelat

ld a,(sp+n)

Tohle by se hodne hodilo i pro Forth, protoze i kdyz provadi vsechno nad TOS, tak se u slozitych algoritmů nevyhneme prehrabovani v zasobniku, a jakmile je to 4. nebo 5. atd polozka, tak se k ni dostat je drahe.

Borland Basic tohle nemusi resit, vse ma v pameti na pevnych adresach (nebo aspon jsem ho neumyslne donutil to tak prekladat). To ma zase nevyhodu, ze je to mene efektivni nez si drzet neco v registrech. V tomhle ma Forth fakt vyhodu, ze uz z principu to tak programator pise.

Konec spamu. .)

Kód:
REM /*******************************/
REM /* Number of        Array Size */
REM /* Primes Found      (Bytes)   */
REM /*     1899;             8191  */
REM /*     2261;            10000  */
REM /*     4202;            20000  */
REM /*     7836;            40000  */
REM /*    14683;            80000  */
REM /*    27607;           160000  */
REM /*    52073;           320000  */
REM /*    98609;           640000  */
REM /*   187133;          1280000  */
REM /*   356243;          2560000  */
REM /*   679460;          5120000  */
REM /*  1299068;         10240000  */
REM /*  2488465;         20480000  */
REM /*        0;         40960000  */
REM /*        0;         81920000  */
REM /*        0;        163840000  */

REM #define MAX_MEM 10240

REM /**************************************/
REM /*  Sieve of Erathosthenes Program    */
REM /**************************************/

DIM Size as Uinteger = 8191
DIM SIEVE(0 to 8191) as Byte

GOSUB Erathos
END


Erathos:
   
    DIM i,j,prime,count as Uinteger
   
    LET count = 0
       
REM    FOR i=0 TO Size
REM        LET SIEVE(i) = 0
REM    NEXT i

    FOR i=0 TO Size
        IF SIEVE(i) = 0 THEN
            LET count = count + 1
            LET prime = i + i + 3

            FOR j = i + prime TO Size STEP prime
                SIEVE(j) = 1
            NEXT j
        END IF
    NEXT i

   
    PRINT count;" PRIMES"
RETURN

https://github.com/DW0RKiN/M4_FORTH/blob/master/Benchmark/boriel_sieve.asm

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 24.03.2023, 17:57 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
_dworkin píše:
scroll_5.png
Stale ti tam ten FLASH neblika :) :lol:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 25.03.2023, 03:09 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Příloha:
scroll_5.gif
scroll_5.gif [ 4.19 KiB | Zobrazeno 955 krát ]

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 27.03.2023, 22:57 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Snazil jsem se "prekompilovat" nejake testy v "./Testing" pod tim novym fontem a u test_while.m4 to selhalo.
To je fakt radost kdyz neco co fungovalo prestane, protoze je to cele v pohybu a uhlidat to proste nejde. A na poradne testovani neni moc energie.
Hledal jsem co je tam sakra spatne, ze me to rve ze se snazim delat WHILE pro neexistujici BEGIN (ale ne presne radek atd.)
V kodu vidim vsude BEGIN tak nevim. ../check_word me zkompiluje vse v poradku. Udelam kopii a zacinam postupne pridavat odmazane veci, kdy me to vytvori chybu a udelal to u jednoho slozeneho slova. Ale check_word porad nic nenasel... Kdyz to zkousim vic tak je jen civne ze me to haze break pred while.
Kouknu se na soubor co to generuje a ...aaaaaa...

Delalo to u slov kde jsem mel UEQ nebo UNE, a protoze je to ekvivaletni s EQ a NE, na tom jestli je to znamenkove nebo ne nezalezi tak jsem to odkazoval na EQ a NE.
Ale kdyz ted to mam tokenizovane tak jsem mel upravit odkaz na to vystupni makro s kodem a ne na token. Porad ta sama chyba, jen jine priznaky.

A bylo to tam asi 6x pro ruzne kombinace slov.

No jsem rad, ze jsem to opravil, protoze nedokazu moc sedet na zidli jak me kurevsky boli zada z prace.
A to tuto sobotu me nechali delat v sobotu samotneho... na celou restauracku o 187 mistech. A kdyz po 10 hodine jsem prezil nejhorsi a byl rad, ze jsem nemusel prosit o pomoc tak na me manazerka Charlotte neco rikala a ja to nedokazal prelozit co chce a v prekladaci vylezlo neco jako Why does it look like you haven't lost anything during service? (to si fakt myslela ze pochopim? lol) Takze jsem pro ni pomaly, protoze jsem neumyval talire ale neco jineho takze talire byly celou dobu tak? %$#!!! Mycce trva 6 minut jeden rezim a pritom me to tam skladaji asi 5x rychleji ve spicce. Skoncil jsme v 3:45, protoze jsem to neosidil a jeste me do toho vlezla jeste zmena na letni cas a dalsi den uz potkam kuchare Mathewa on me o tom rika a ja jak to muze sakra vedet? Na whatsupu ani radka A prave prisel se mnou do prace a pri stridani s Ianem mi rekl hned to same, ze o me mluvi. A ja na to ze me je to jedno. Udelal jsem to nejlepsi co jsem mohl, a zbytek ovlivnit nemuzu. Jestli chteji setrit hodiny tak at si setri a klidne najdou nekoho jineho. Je mi to fuk.


Přílohy:
test_while.png
test_while.png [ 2.93 KiB | Zobrazeno 878 krát ]

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 14.04.2023, 16:21 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Takova mala hadanka. Co je spatne na tom kdyz se snazite porovnat 16 bitove cislo. A delate reseni pro pripad kdy vite, ze cislo se kterym na ktere se to testuje ma HI bajt dvojnasobek LO bajtu. A k tomu jako bonus musite to testovane cislo odstranit z vrcholu zasobniku. Coz je prekazka, protoze mate problem kdyz zjistite uz u prvniho bajtu ze se lisi tak nemuzete vyskocit, protoze jste neuklidili a naopak kdyz uklidite brzo tak nemuzete testovat druhy bajt, protoze ho nemate.

Zakladni/default varianta:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x4221) EQ IF'
                       ;[11:53]     0x4221 = if   ( x -- ) variant: default
    ld   BC, 0x4221     ; 3:10      0x4221 = if
    or    A             ; 1:4       0x4221 = if
    sbc  HL, BC         ; 2:15      0x4221 = if
    ex   DE, HL         ; 1:4       0x4221 = if
    pop  DE             ; 1:10      0x4221 = if
    jp   nz, else101    ; 3:10      0x4221 = if
; seconds: 1           ;[11:53]

Pokud budeme chtit neco rychlejsiho
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x4221) NE IF'
                       ;[12:50/38]  0x4221 <> if   ( x -- ) variant: hi(0x4221) = rlca(lo(0x4221))
    ld    A, L          ; 1:4       0x4221 <> if
    rlca                ; 1:4       0x4221 <> if
    cp    H             ; 1:4       0x4221 <> if   x[2] = rlca(x[1])
    ex   DE, HL         ; 1:4       0x4221 <> if
    pop  DE             ; 1:10      0x4221 <> if
    jr   nz, $+7        ; 2:7/12    0x4221 <> if
    xor  0x42           ; 2:7       0x4221 <> if   x[2] = 0x42
    jp    z, else101    ; 3:10      0x4221 <> if
; seconds: 0           ;[12:50]

Tady se na zacatku porovnavaji dve nezname hodnoty HI a LO mezi sebou a zjistuje se zda plati relativni vztah HI = 2*LO (temer, ve skutecnosti je to krapet jinak)
A az kdyz zjistime ze to plati tak uz muzeme zkontrolovat jen absolutni hodnotu HI, kterou si drzime v akumulatoru, takze muzeme uz uklizet.
Tohle je ale fakt nebezpecne a zdroj chyb. Protoze zrovna rlca nepokryje vsechno pro HI=2*LO a tak puvodni navrh byl
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x4221) NE IF'
                       ;[12:50/38]  0x4221 <> if   ( x -- ) variant: hi(0x4221) = rlca(lo(0x4221))
    ld    A, L          ; 1:4       0x4221 <> if
    add   A, A          ; 1:4       0x4221 <> if
    cp    H             ; 1:4       0x4221 <> if   x[2] = x[1] + x[1]
    ex   DE, HL         ; 1:4       0x4221 <> if
    pop  DE             ; 1:10      0x4221 <> if
    jr   nz, $+7        ; 2:7/12    0x4221 <> if
    xor  0x42           ; 2:7       0x4221 <> if   x[2] = 0x42
    jp    z, else101    ; 3:10      0x4221 <> if
; seconds: 0           ;[12:50]

No a tenhle kod je spatne.

Matematicky sice plati HI = LO + LO, ale uz to neplati pro CPU.

HI = LO + LO ---> LO = HI/2

H = L + L ---> L <> H/2 !!!
PS: .tid edub es oc icijurozop enavonicsaf a etsinevarm od kicalk icijakrts okced ekajen eN ,emejuvatsderp oh is ykaj yvokat nopsA ?huB tavotsixe lhom yb kaJ .elhot it es tats a ecto a yktam zeb ,akloh alam tyB ?corP .sakir nej is oT .ilidzarvaz kap A .tel 61 a tel 11 ,tel 11 .iculk 3 ij ilinlisanz a evomod mektsed v aliz oc akcemen z ecloh etel 01 ekajen o kenalc is mesj lteC .onsur endarop ,ketap inconokilev ,ibodan mitym enevalso yninezoran ketap V .etoviz mem v hcisrohjen z yndej olyb und 7 hcindelsoP

.eratnemok yt kap A .itsonbordop tsic ensartS .advarp alyb ot ezkat https://www1.pluska.sk/regiony/obrovska-tragedia-jednej-rodiny-pri-hororovej-nehode-liptove-zahynuli-surodenci lesan a uten an ot mesj ladelH ?corP .yvtrm uosj akmmE a kirE ez akmam alaspan ileden v em ot an ynd avD

...lidiren nO .amakloh derp arejarf laled kirE eZ

.umisjevilzirtsjen k ijades ilipo ezkaT .alidir isjevilzirts a lohokla an retset ilizuop uodzij derp a elhcyr ahurd ,)ledivarp eldop alidzej itc( ulamop alidzej andeJ .akletivizomas akinoM a yhard ej kacidiR .ykloh 2 nej ilem kacidiR .ylibonrec kat inen toviZ .kinivulops isj lip oc icidir k atua od sendes is zydk eZ

.icnas lemen kat oh ilavovizo a ivrk lisudaz es zydk i ezkat ,kezom a yvalh suk olyb kirE lezel edk maT .itsok yksuok a verk edusV .yliated yt elA ...corP .olats es oc titsijz alizans es ez ,upahc ot aj ,otsim ot an tavidop alyb es akinoM .udazv olakcamzor ot ukmmE .uvalh uotibzor ilem 4 inhcisV .ymleh a ysap enelisez ,ickurtsnok uonezutzyv ijam atua indovaZ .karzaz ej alizerp andej ez ezkaT .puols o es ilivatsaz a h/mk05 ej ek h/mk061 alej alidir oc aT

.kelapitv yvokat lyb kirE .akced nej ot ylyB

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 14.04.2023, 17:35 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
_dworkin píše:
Matematicky sice plati HI = LO + LO, ale uz to neplati pro CPU.
HI = LO + LO ---> LO = HI/2
H = L + L ---> L <> H/2 !!!
Preco by to nemalo platit pre CPU ?
Pokial je HI parne a LO mensie ako 128 tak to musi platit.

PS: Ako s tym suvisi Erik a Emka ? ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 14.04.2023, 17:48 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Chcel som napísať to isté ako Busy, ale som pomalý, tak len dodám, že po ADD A,A (alebo RLCA) treba skontrolovať Cy. To odhalí či je LO<128 a teda či je možné aby platila podmienka HI=2*LO.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 15.04.2023, 03:10 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Busy píše:
_dworkin píše:
Matematicky sice plati HI = LO + LO, ale uz to neplati pro CPU.
HI = LO + LO ---> LO = HI/2
H = L + L ---> L <> H/2 !!!
Preco by to nemalo platit pre CPU ?
Pokial je HI parne a LO mensie ako 128 tak to musi platit.

Pokud tim HI a LO myslis tu neznamou hodnotu, ktera se testuje tak mas pravdu. Musis jeste udelat dalsi podminku, ktera ti cely ten zpusob udela tak slozity, ze se ti vyplati to delat jinak.
Pokud tim HI a LO myslis tu neznamou v registrovem paru, u me jsem to psal jako H a L podle toho registru kde to lezi pak to neplati. 0x4422 splnuje ze LO je mensi nez 128, ale nejvyssi bit L neni testovany, jen vypadne do carry. Viz ten postnuty kod. Ten samy kod, ale kdyz tam neni DROP, napriklad pro DUP PUSH(0x4422) EQ IF je naopak validni, protoze se testuje prvne L. A az pak relativne.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DUP PUSH(0x4422) EQ IF'
                       ;[11:39/21]  dup 0x4422 = if   ( x1 -- x1 )   0x4422 == HL
    ld    A, 0x22       ; 2:7       dup 0x4422 = if
    cp    L             ; 1:4       dup 0x4422 = if   x[1] = 0x22
    jp   nz, else101    ; 3:10      dup 0x4422 = if
    add   A, L          ; 1:4       dup 0x4422 = if
    xor   H             ; 1:4       dup 0x4422 = if   x[2] = x[1] + x[1]
    jp   nz, else101    ; 3:10      dup 0x4422 = if
; seconds: 0           ;[11:39]

Tak tam to mohu pouzit, protoze testuji prvne nizsi bajt, takze mam overeno vsechno.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DUP PUSH(0x44A2) EQ IF'
                       ;[11:39/21]  dup 0x44A2 = if   ( x1 -- x1 )   0x44A2 == HL
    ld    A, 0xA2       ; 2:7       dup 0x44A2 = if
    cp    L             ; 1:4       dup 0x44A2 = if   x[1] = 0xA2
    jp   nz, else101    ; 3:10      dup 0x44A2 = if
    add   A, L          ; 1:4       dup 0x44A2 = if
    xor   H             ; 1:4       dup 0x44A2 = if   x[2] = x[1] + x[1]
    jp   nz, else101    ; 3:10      dup 0x44A2 = if
; seconds: 1           ;[11:39]


Antony/DTA píše:
Chcel som napísať to isté ako Busy, ale som pomalý, tak len dodám, že po ADD A,A (alebo RLCA) treba skontrolovať Cy. To odhalí či je LO<128 a teda či je možné aby platila podmienka HI=2*LO.


Mas pravdu. Teda krome toho RLCA, tam je to spravne rovnou, je to rotace nic ti nevypadne. Staci jen aby ta hodnota na kterou se to testuje do dovolovala pouzit. Zrovna 0x4422 je v pohode.

Busy píše:
PS: Ako s tym suvisi Erik a Emka ? ;)

Protoze je to moje rodina...

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 15.04.2023, 07:43 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
_dworkin píše:
Mas pravdu. Teda krome toho RLCA, tam je to spravne rovnou, je to rotace nic ti nevypadne. Staci jen aby ta hodnota na kterou se to testuje do dovolovala pouzit. Zrovna 0x4422 je v pohode.

Ale hodnota 0x0180 bude vyhodnotená nesprávne.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 15.04.2023, 14:26 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
_dworkin píše:
Mas pravdu. Teda krome toho RLCA, tam je to spravne rovnou, je to rotace nic ti nevypadne. Staci jen aby ta hodnota na kterou se to testuje do dovolovala pouzit. Zrovna 0x4422 je v pohode.
Ono su to ekvivalentne situacie. Pretoze podla toho, co vypadne, mozes otestovat ci to bola hodnota, co to dovolovala pouzit.

LD A,LO
ADD A,A
tam vypadne povodny najvyssi bit z LO do carry a teda podla carry poznas, ze hodnota LO bola 128 a viac. Ak nastane carry, dalej ani porovnavat nemusis, uz vies, ze (akekolvek) HI (mensie ako 256) nemoze byt dvojnasobkom LO.

LD A,HI
RLCA
tam vypadne povodny najnizsi bit z HI do carry a teda podla carry poznas, ze hodnota HI bola neparna. Ak nastane carry, dalej ani porovnavat nemusis, uz vies, ze (akekolvek celociselne) LO nemoze byt presnou polovicou z HI.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 15.04.2023, 15:31 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Antony/DTA píše:
_dworkin píše:
Mas pravdu. Teda krome toho RLCA, tam je to spravne rovnou, je to rotace nic ti nevypadne. Staci jen aby ta hodnota na kterou se to testuje do dovolovala pouzit. Zrovna 0x4422 je v pohode.

Ale hodnota 0x0180 bude vyhodnotená nesprávne.


Jakto?
Tady to splnuje ze HI=rlca(LO)
Takze bych mohl udelat
A = L
rlca
cp H
odstranit HL
jr nz, ne_
xor 01
jp z, eq_

Zadny bit se me neztrati, vsechno se testuje. Jen ve skutecnosti zrovna tenhle pripad vyvola jiny kod, protoze je tam cislo 1.

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x0180) NE IF'
                       ;[10:43]     0x0180 <> if   ( x -- ) variant: hi(0x0180) = 1
    ld    A, 0x80       ; 2:7       0x0180 <> if
    xor   L             ; 1:4       0x0180 <> if
    dec   H             ; 1:4       0x0180 <> if
    or    H             ; 1:4       0x0180 <> if
    ex   DE, HL         ; 1:4       0x0180 <> if
    pop  DE             ; 1:10      0x0180 <> if
    jp    z, else101    ; 3:10      0x0180 <> if
; seconds: 0           ;[10:43]


Ale u 0x0381 je to tam
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x0381) NE IF'
                       ;[12:50/38]  0x0381 <> if   ( x -- ) variant: hi(0x0381) = rlca(lo(0x0381))
    ld    A, L          ; 1:4       0x0381 <> if
    rlca                ; 1:4       0x0381 <> if
    cp    H             ; 1:4       0x0381 <> if   x[2] = rlca(x[1])
    ex   DE, HL         ; 1:4       0x0381 <> if
    pop  DE             ; 1:10      0x0381 <> if
    jr   nz, $+7        ; 2:7/12    0x0381 <> if
    xor  0x03           ; 2:7       0x0381 <> if   x[2] = 0x03
    jp    z, else101    ; 3:10      0x0381 <> if
; seconds: 0           ;[12:50]


a u 0x0281, kde nejde RLCA pouzit se to prepne na ADD A,A, jen se musi prvne testovat L, takze to uz nema 38 taktu pokud testujeme hodnotu pocitadla ve smycce, kde se to ve 255 pripadech z 256 bude lisit uz v L.

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x0281) NE IF'
                       ;[12:50/47]  0x0281 <> if   ( x -- ) variant: hi(0x0281) = 2*lo(0x0281)
    ld    A, 0x81       ; 2:7       0x0281 <> if
    cp    L             ; 1:4       0x0281 <> if   x[1] = 0x81
    jr   nz, $+4        ; 2:7/12    0x0281 <> if
    add   A, A          ; 1:4       0x0281 <> if
    xor   H             ; 1:4       0x0281 <> if   x[2] = x[1] + x[1]
    ex   DE, HL         ; 1:4       0x0281 <> if
    pop  DE             ; 1:10      0x0281 <> if
    jp    z, else101    ; 3:10      0x0281 <> if
; seconds: 0           ;[12:50]


Mam tam chybu? Nebo se jen nechapeme?

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 15.04.2023, 16:13 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Busy píše:
_dworkin píše:
Mas pravdu. Teda krome toho RLCA, tam je to spravne rovnou, je to rotace nic ti nevypadne. Staci jen aby ta hodnota na kterou se to testuje do dovolovala pouzit. Zrovna 0x4422 je v pohode.
Ono su to ekvivalentne situacie. Pretoze podla toho, co vypadne, mozes otestovat ci to bola hodnota, co to dovolovala pouzit.

LD A,LO
ADD A,A
tam vypadne povodny najvyssi bit z LO do carry a teda podla carry poznas, ze hodnota LO bola 128 a viac. Ak nastane carry, dalej ani porovnavat nemusis, uz vies, ze (akekolvek) HI (mensie ako 256) nemoze byt dvojnasobkom LO.

LD A,HI
RLCA
tam vypadne povodny najnizsi bit z HI do carry a teda podla carry poznas, ze hodnota HI bola neparna. Ak nastane carry, dalej ani porovnavat nemusis, uz vies, ze (akekolvek celociselne) LO nemoze byt presnou polovicou z HI.


Tohle jsem musel cele prepisovat, ale necham to tady, aby bylo videt kde vsude jde udelat chyba.
Takze prvni spatna idea.
U L staci testovat u RLCA jen horni bit, protoze testovani HI pak bude zaroven testovani LO.

Puvodne:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x0381) NE IF'
                       ;[12:50/38]  0x0381 <> if   ( x -- ) variant: hi(0x0381) = rlca(lo(0x0381))
    ld    A, L          ; 1:4       0x0381 <> if
    rlca                ; 1:4       0x0381 <> if
    cp    H             ; 1:4       0x0381 <> if   x[2] = rlca(x[1])
    ex   DE, HL         ; 1:4       0x0381 <> if
    pop  DE             ; 1:10      0x0381 <> if
    jr   nz, $+7        ; 2:7/12    0x0381 <> if
    xor  0x03           ; 2:7       0x0381 <> if   x[2] = 0x03
    jp    z, else101    ; 3:10      0x0381 <> if
; seconds: 0           ;[12:50]

Nove vypadava cp H a nz se meni na nc:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x0381) NE IF'
                       ;[11:46/34]  0x0381 <> if   ( x -- ) variant: hi(0x0381) = rlca(lo(0x0381))
    ld    A, L          ; 1:4       0x0381 <> if
    rlca                ; 1:4       0x0381 <> if
    ex   DE, HL         ; 1:4       0x0381 <> if
    pop  DE             ; 1:10      0x0381 <> if
    jr   nc, $+7        ; 2:7/12    0x0381 <> if
    xor  0x03           ; 2:7       0x0381 <> if   x[2] = 0x03
    jp    z, else101    ; 3:10      0x0381 <> if
; seconds: 0           ;[11:46]

Je to dobre? Neni! Tady se testuji jen spodnich 8 bitu z HL a 7. bit v L 2x.

Nez me doslo, ze je to spatne tak jsem odhalil, ze 7. bit testuji 2x, takze jsem to upravil nadsene ze mam optimalizaci na:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x0381) NE IF'
                       ;[8:36]      0x0381 <> if   ( x -- ) variant: hi(0x0381) = rlca(lo(0x0381))
    ld    A, L          ; 1:4       0x0381 <> if
    rlca                ; 1:4       0x0381 <> if
    cp    H             ; 1:4       0x0381 <> if   x[2] = rlca(x[1])
    ex   DE, HL         ; 1:4       0x0381 <> if
    pop  DE             ; 1:10      0x0381 <> if
    jp    z, else101    ; 3:10      0x0381 <> if
; seconds: 0           ;[8:36]

Tady testuji vsech 16 bitu HL, ale jen relativne. Pokud to zmenim z "cp H" na "xor 0x03" tak budu testovat jen L.

Pokracoval jsem v chybnych optimalizacich u ADD A,A varianty. Kde teda to carry testovat musim.

Misto:
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x0281) NE IF'
                       ;[12:50/47]  0x0281 <> if   ( x -- ) variant: hi(0x0281) = 2*lo(0x0281)
    ld    A, 0x81       ; 2:7       0x0281 <> if
    cp    L             ; 1:4       0x0281 <> if   x[1] = 0x81
    jr   nz, $+4        ; 2:7/12    0x0281 <> if
    add   A, A          ; 1:4       0x0281 <> if
    xor   H             ; 1:4       0x0281 <> if   x[2] = x[1] + x[1]
    ex   DE, HL         ; 1:4       0x0281 <> if
    pop  DE             ; 1:10      0x0281 <> if
    jp    z, else101    ; 3:10      0x0281 <> if
; seconds: 0           ;[12:50]


Tam mit
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},fast) PUSH(0x0281) NE IF'
                       ;[11:46/34]  0x0281 <> if   ( x -- ) variant: hi(0x0281) = 2*lo(0x0281)
    ld    A, L          ; 1:4       0x0281 <> if
    add   A, A          ; 1:4       0x0281 <> if
    ex   DE, HL         ; 1:4       0x0281 <> if
    pop  DE             ; 1:10      0x0281 <> if
    jr   nc, $+7        ; 2:7/12    0x0281 <> if
    xor  0x02           ; 2:7       0x0281 <> if   x[2] = 0x02
    jp    z, else101    ; 3:10      0x0281 <> if
; seconds: 0           ;[11:46]


Ve skutecnosti tohle zase testuje jen L.

Radsi ukazuji kod, aby to bylo jednoznacne.

Takze nejde testovat jen carry a pak horni bajt. Protoze se to prepne do situace ze testujes jen relativni vztah a nebo ti uplne vypadne horni bajt z testu. Zbyva pak jen to udelat s testem navic a to ti prebije default varianta, ktera pak vyhrava.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 15.04.2023, 17:34 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
_dworkin píše:
Antony/DTA píše:
Ale hodnota 0x0180 bude vyhodnotená nesprávne.
Jakto?
Tady to splnuje ze HI=rlca(LO)
No moment moment. Aky teda musi byt vztah medzi HI a LO ?
Ma to byt HI=rlca(LO), alebo to ma byt to co si napisal predtym: "cislo se kterym na ktere se to testuje ma HI bajt dvojnasobek LO bajtu" ??? Pretoze to su dve rozne veci...


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 15.04.2023, 17:42 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Nemysli si, ja som tiež borec na "výrobu" chýb, to sa stáva, keď sa šetrí každý bajt a naháňajú sa takty.
Ešte ma napadlo urobiť tú default rutinu 8-bitovú, je trochu dlhšia, ale štatisticky rýchlejšia v 255 prípadoch z 256.
Kód:
   ld   a,l      ; 1:4
   cp   Lo      ; 2:7
   ld   a,h      ; 1:4
   ex   de,hl      ; 1:4
   pop   de      ; 1:10
   jr   nz,$+7   ; 2:7/12   [ 8:41]
            ;[8:36]
   cp   Hi      ; 2:7
   jp   z,else101   ; 3:10   [13:53]


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 16.04.2023, 21:40 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Antony/DTA píše:
Nemysli si, ja som tiež borec na "výrobu" chýb, to sa stáva, keď sa šetrí každý bajt a naháňajú sa takty.
Ešte ma napadlo urobiť tú default rutinu 8-bitovú, je trochu dlhšia, ale štatisticky rýchlejšia v 255 prípadoch z 256.
Kód:
   ld   a,l      ; 1:4
   cp   Lo      ; 2:7
   ld   a,h      ; 1:4
   ex   de,hl      ; 1:4
   pop   de      ; 1:10
   jr   nz,$+7   ; 2:7/12   [ 8:41]
            ;[8:36]
   cp   Hi      ; 2:7
   jp   z,else101   ; 3:10   [13:53]


Jo tohle se vygeneruje kdyz se zada _TYP_SINGLE jako fast nebo L_first. Jen misto CP je tam XOR.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 585 ]  Přejít na stránku Předchozí  1 ... 26, 27, 28, 29, 30, 31, 32 ... 39  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 7 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz