OldComp.cz

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


Právě je 27.04.2024, 10:19

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 598 ]  Přejít na stránku Předchozí  1 ... 14, 15, 16, 17, 18, 19, 20 ... 40  Další
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 25.08.2022, 22:09 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Nekdo me tu navrhoval pouzit jiny prekladac z asm do bin nez pasmo. V distribuci (xubuntu) jsem nasel pro Z80 jeste jeden prekladac: crasm. Cetl jsem si jeho manove stranky, ale chtelo by to vic informaci. Vypada to, ze je to dalsi uz hotovy projekt a nektere veci vypadaji pro me trosku divne, oproti tomu co jsem zvykly. Pri kompilaci jsem skoncil s 27 chybama, nenasel jsem jak se tam zadavaji data. Myslim tim "DB 0x12".
Kód:
  CPU Z80
  * = 0x8000
  aa EQU 0x604

je
Kód:
ORG 0x800
aa EQU 0x604

_________________
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: 25.08.2022, 22:10 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Lisiak4 píše:
_dworkin: jak dlouho chceš na tom místě kde jsi zůstat?


Az do konce...

_________________
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: 25.08.2022, 23:01 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Stale pracuji na predelani smycek a neco uz je hotovo, ale konec jeste v nedohlednu.
Behem predelani jsem si uvedomil, ze budu muset uplne zmenit zpusob jak mam delane slova.
Predtim jsem mel:

do loop
pripadne:
do addloop
do push_addloop(krok)

pro forth slova
do loop
do +loop
do 12 +loop

Prvni varianta nezna STOP hodnotu ulozenou v NOS, ani nezna POCATECNI_INDEX ulozeny v TOS.
Jedine co vi je ze KROK je +1. Protoze je tam jen "loop".
Druha varianta nezna ani krok. Ktery si ma "+loop" vyjmout z TOS.
Treti varianta zna zase KROK.

V pripade ze jsem znal STOP i POCATECNI_INDEX jsem mel slova

xdo(STOP,INDEX) xloop
xdo(STOP,INDEX) addxloop
xdo(STOP,INDEX) push_addxloop(KROK)

A aby to bylo jeste slozitejsi tak co jsem ted popsal je jen varianta, kdy ukladam promenne do pameti (primo do samomodifikujiciho se kodu). V kodu to mam jako "memory".
Takze kod vypada tak, ze slovo "xdo(STOP,POCATECNI_INDEX)" ulozi POCATECNI_INDEX do xloop jako "ld 16reg, 0x0000", kde 0x0000 je pametove misto kam se to uklada. Takze "loop" ho tim nacte, inkrementuje o krok, zjisti zda ma skoncit a zase ho ulozi pro dalsi pruchod.
Je to velmi efektivni, ale ma to jednu nevyhodu. Neni to pouzitelne pro rekurzi. Pokud se zevnitr smycky zavola ta smycka znovu tak by si prepsala puvodni hodnotu.
Slovo "do" vyjme POCATECNI_INDEX z TOS(=HL) a ulozi ho do loop jako "ld 16reg, 0x0000". Pak vyjme z NOS jeste STOP a zase do ulozi jako "ld 16reg, 0x0000" v loop.
Stejna metoda, jen o jednu promennou vice a nepouzitelna pro rekurzi.

Druha varianta je o dost pomalejsi a mam ji pojmenovanou jako "recurse". Uklada promenne do zasobniku navratovych adres. Tak jak si mysli standartni forth ze to budete delat. Je to opravdu hodne pomale.

Slova se jmenuji stejne jen je tam navic pismeno R.

rdo rloop
rdo addrloop
rdo push_addrloop(krok)
rxdo(STOP,POCATECNI_INDEX) rxloop
rxdo(STOP,POCATECNI_INDEX) addrxloop
rxdo(STOP,POCATECNI_INDEX) push_addrxloop(KROK)

A aby to nebylo malo tak jeste existuje varianta kdy se to "uklada" na datovy zasobnik. Stack. Proste to "sdo" necha na tom zasobniku (NOS,TOS) a LOOP to jen aktualizuje. Tam jsem nemel udelany varianty s X. Protoze se to hodilo spis v pripade, ze to co je ve smycce neprida ani neubere nic z datoveho zasobniku. Ani na nej nebude sahat.
Takze s eto da velmi efektivne pouzit pro opakovane volani funkce ve smycce. Kdy funkce ma jako parametr index a po ukonceni je zasobnik jak byl.

Do toho si pridejnte jeste rozsireni

FOR(POCATECNI_INDEX) NEXT
coz je neco jako
XDO(0,POCATECNI_INDEX) PUSH_ADDLOOP(-1)

Teda "5 for i . next" by udelalo 5 4 3 2 1 0

pro memory, recurse a stack variantu. Uklada to jen INDEX.

Plus jsem se jeste nezminil slovo "?do".

Memory varianta pouzivala pro indexy "i", "j", "k". Tam neni zadny problem, protoze se jen odkazuje k nejake adrese.

Stack varianta pouzivala pro indexy "si", "sj", "sk". Tady to zacne byt komplikovanejsi.

"si" je vzdy to same co DUP. Protoze index je v TOS.
"sj" je nekdy OVER a nekdy 2 PICK. Podle toho zda vnitrni smycka musi ukladat i STOP hodnotu, a nebo jen INDEX.
"sk" je nekdy 2 PICK, nekdy 3 PICK, nekdy 4 PICK. Podle toho zda vnitrni smycka a druha vnejsi smycka musi ukladat i STOP hodnotu, a nebo jen INDEX.
Predstavte si to jako
( k stop_j j stop_i i ) pro nejvzdalenejsi variantu.
( k j i ) pro nejkratsi variantu

Recurse varianta je to same jako stack jen to lezi v emulovanem R.A.S. (zasobnik navratovych adres).

No a ja ted potreboval udelat nejake jednoduche pravidla pro tokenizaci. Kdy by melo byt mozne za behu zmenit implicitni memory variantu na recurse. Protoze zjisti ze ma token RECURSE uvnitr smycky. Co s tim?

Vsechny slova jsem sjednotil na forthovske.

DO LOOP
DO ADDLOOP

Token DO zvedne hodnotu poctu loop smycek a vytvori datovou strukturu ktera obsahuje polozky.
Kód:
define({__SET_LOOP},{dnl
__{}define({__LOOP[$1].TYPE},{$2}){}dnl # M,R,S = memory, recursive, stack
__{}define({__LOOP[$1].END},{$3}){}dnl
__{}define({__LOOP[$1].BEGIN},{$4}){}dnl
__{}define({__LOOP[$1].STEP},{$5}){}dnl
}){}dnl

Token DO pokuz zna STOP a POCATECNI_INDEX tak ho nastavi.
Token LOOP nastavi STEP na 1.
Token ADDLOOP pokud zna STEP tak ho taky nastavi.

Ve chvili kdy uz se bude volat makro menici tokeny na asembler uz budeme znat vse co jde znat. DO uz bude vedet jaky je krok a podle toho vytvorit spravnou variantu atd.

Ty slova jdou volat i s parametry v tomhle pevnem poradi DO(R,stop,index,krok).
Nebo DO(M,0,,-1) je neco jako FOR.

A indexy? Ty se ted jmenuji jen I, J,K. Takze v tuhle chvili se k dalsi vnejsi smycce nedostanete. Protoze uz se michaji memory, recurse i stack.
Pokud prekladac zjisti ze K smycka je napriklad recurse. Tak si vyhleda jestli J smycka je taky recurse a pokud ano zda uklada i STOP atd.
Musel jsem pro to vytvorit slovo PUSH_RPICK(x). Co kopiruje x-tou polozku z R.A.S. do TOS. 0 je prvni, stejne jako je to u PICK.
Je to lehci pro programatora.

_________________
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: 25.08.2022, 23:28 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Protoze nemam zadny deadline tak jsem mnohokrat odbocoval.
Napriklad u "PUSH(10) SWAP DO". Tim nastavite hodnotu STOP, ale hodnotu INDEX neznate. Tuhle kombinaci jsem neresil.
Varianta X vedela skoro vse pro analyzu smycky. Jen kdyz neznala KROK tak musela trochu varit z vody.
Ale pritom znat kde skoncite, pripadne i krok uz hodne pomaha.
U rekurse dokonce vysela moc pekny kod pro DO slovo, kdy se usetri 4 bajty kodu.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DO(R,0) LOOP'
                        ;[9:65]     do_101(r)   ( index -- ) ( R: -- index )
    ex  (SP), HL        ; 1:19      do_101(r)
    ex   DE, HL         ; 1:4       do_101(r)
    exx                 ; 1:4       do_101(r)
    pop  DE             ; 1:10      do_101(r)   DE = index
    dec  HL             ; 1:6       do_101(r)
do101:                  ;           do_101(r)
    ld  (HL),D          ; 1:7       do_101(r)
    dec   L             ; 1:4       do_101(r)
    ld  (HL),E          ; 1:7       do_101(r)
    exx                 ; 1:4       do_101(r)
    exx                 ; 1:4       loop_101(r)
    ld    E,(HL)        ; 1:7       loop_101(r)
    inc   L             ; 1:4       loop_101(r)
    ld    D,(HL)        ; 1:7       loop_101(r)   DE = index
    inc  DE             ; 1:6       loop_101(r)   index++
    ld    A, E          ; 1:4       loop_101(r)
    or    D             ; 1:4       loop_101(r)
    jp   nz, do101      ; 3:10      loop_101(r)
leave101:               ;           loop_101(r)
    inc  HL             ; 1:6       loop_101(r)
    exx                 ; 1:4       loop_101(r)
exit101:                ;           loop_101(r)
                       ;[21:121]
Jsou to ty pod labelem "do101". A pro vsechny varianty muze byt stejny. Jen u ?DO(STOP,INDEX) by to mohlo byt trosku rychlejsi s "ld (HL), low/high const", ale nechtel jsem to komplikovat.
Varianta koncici u 1
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DO(R,1) LOOP'
             
                        ;[9:65]     do_101(r)   ( index -- ) ( R: -- index )
    ex  (SP), HL        ; 1:19      do_101(r)
    ex   DE, HL         ; 1:4       do_101(r)
    exx                 ; 1:4       do_101(r)
    pop  DE             ; 1:10      do_101(r)   DE = index
    dec  HL             ; 1:6       do_101(r)
do101:                  ;           do_101(r)
    ld  (HL),D          ; 1:7       do_101(r)
    dec   L             ; 1:4       do_101(r)
    ld  (HL),E          ; 1:7       do_101(r)
    exx                 ; 1:4       do_101(r)
    exx                 ; 1:4       loop_101(r)
    ld    E,(HL)        ; 1:7       loop_101(r)
    inc   L             ; 1:4       loop_101(r)
    ld    D,(HL)        ; 1:7       loop_101(r)   DE = index
    ld    A, E          ; 1:4       loop_101(r)
    or    D             ; 1:4       loop_101(r)
    inc  DE             ; 1:6       loop_101(r)   index++
    jp   nz, do101      ; 3:10      loop_101(r)
leave101:               ;           loop_101(r)
    inc  HL             ; 1:6       loop_101(r)
    exx                 ; 1:4       loop_101(r)
exit101:                ;           loop_101(r)
                       ;[21:121]

A ted neco tezsiho. Jiny STEP a mene vhodny STOP
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DO(R,100) PUSH(10) ADDLOOP'
             

                        ;[9:65]     do_101(r)   ( index -- ) ( R: -- index )
    ex  (SP), HL        ; 1:19      do_101(r)
    ex   DE, HL         ; 1:4       do_101(r)
    exx                 ; 1:4       do_101(r)
    pop  DE             ; 1:10      do_101(r)   DE = index
    dec  HL             ; 1:6       do_101(r)
do101:                  ;           do_101(r)
    ld  (HL),D          ; 1:7       do_101(r)
    dec   L             ; 1:4       do_101(r)
    ld  (HL),E          ; 1:7       do_101(r)
    exx                 ; 1:4       do_101(r)
                       ;[25:121]    10 +loop_101(r)
    exx                 ; 1:4       10 +loop_101(r)
    ld    E,(HL)        ; 1:7       10 +loop_101(r)
    inc   L             ; 1:4       10 +loop_101(r)
    ld    D,(HL)        ; 1:7       10 +loop_101(r)   DE = index
    ex   DE, HL         ; 1:4       10 +loop_101(r)   HL = index, DE = R.A.S.
    ld   BC, 0xFF9C     ; 3:10      10 +loop_101(r)   BC = -stop = -(100)
    add  HL, BC         ; 1:11      10 +loop_101(r)   HL+= -stop = index-stop
    ld   BC, 0x000A     ; 3:10      10 +loop_101(r)   BC =  step = 10
    ld    A, H          ; 1:4       10 +loop_101(r)
    add  HL, BC         ; 1:11      10 +loop_101(r)   HL+=  step = index-stop+step
    xor   H             ; 1:4       10 +loop_101(r)   reverse sign --> exit
    ld   BC, 0x0064     ; 3:10      10 +loop_101(r)   BC =  stop = 100
    add  HL, BC         ; 1:11      10 +loop_101(r)   HL+=  stop = index+step
    ex   DE, HL         ; 1:4       10 +loop_101(r)
    jp    p, do101      ; 3:10      10 +loop_101(r)
leave101:               ;           10 +loop_101(r)
    inc  HL             ; 1:6       10 +loop_101(r)
    exx                 ; 1:4       10 +loop_101(r)   ( -- ) R:( stop index -- )
exit101:                ;           10 +loop_101(r)
                       ;[34:186]

Potrebuji drzet ctyri 16 bitove hodnoty. RAS,INDEX,KROK,STOP. Puvodni kod docasne odkladal RAS na zasobnik. Ale ukazalo se rychlejsi kdyz misto
Kód:
ld BC, STOP
or A
sbc HL, BC
...
add HL, BC


znovu nactu stop do BC. Jednou jako zaporne cislo, pak tam vlozim STEP a nakonec kladne STOP.

Ale kdyz je STOP nejake krasna konstanta, tak to jde i rychleji. Abych si to ulehcil tak jsem pro to napsal makro ADD_HL_CONST. Takze kdyz je stop napriklad 257
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DO(R,257) PUSH(10) ADDLOOP'
             

                        ;[9:65]     do_101(r)   ( index -- ) ( R: -- index )
    ex  (SP), HL        ; 1:19      do_101(r)
    ex   DE, HL         ; 1:4       do_101(r)
    exx                 ; 1:4       do_101(r)
    pop  DE             ; 1:10      do_101(r)   DE = index
    dec  HL             ; 1:6       do_101(r)
do101:                  ;           do_101(r)
    ld  (HL),D          ; 1:7       do_101(r)
    dec   L             ; 1:4       do_101(r)
    ld  (HL),E          ; 1:7       do_101(r)
    exx                 ; 1:4       do_101(r)
                       ;[21:99]    10 +loop_101(r)
    exx                 ; 1:4       10 +loop_101(r)
    ld    E,(HL)        ; 1:7       10 +loop_101(r)
    inc   L             ; 1:4       10 +loop_101(r)
    ld    D,(HL)        ; 1:7       10 +loop_101(r)   DE = index
    ex   DE, HL         ; 1:4       10 +loop_101(r)   HL = index, DE = R.A.S.
    dec  H              ; 1:4       10 +loop_101(r)
    dec  HL             ; 1:6       10 +loop_101(r)   HL+= -stop = index-stop
    ld   BC, 0x000A     ; 3:10      10 +loop_101(r)   BC =  step = 10
    ld    A, H          ; 1:4       10 +loop_101(r)
    add  HL, BC         ; 1:11      10 +loop_101(r)   HL+=  step = index-stop+step
    xor   H             ; 1:4       10 +loop_101(r)   reverse sign --> exit
    inc  H              ; 1:4       10 +loop_101(r)
    inc  HL             ; 1:6       10 +loop_101(r)   HL+=  stop = index+step
    ex   DE, HL         ; 1:4       10 +loop_101(r)
    jp    p, do101      ; 3:10      10 +loop_101(r)
leave101:               ;           10 +loop_101(r)
    inc  HL             ; 1:6       10 +loop_101(r)
    exx                 ; 1:4       10 +loop_101(r)   ( -- ) R:( stop index -- )
exit101:                ;           10 +loop_101(r)
                       ;[30:164]


Jak se divam na ten kod a vidim label leave101 tak mi to pripomina, ze jsem nemluvil o slove LEAVE. Co ma opustit smycku s uklidem v RAS. Tam jsem si musel taky hrat se vsemi tremi M,R,S variantami. Tady to usetri 2 bajty. Protoze leave v teto variante obsahuje
Kód:
    exx                 ; 1:4       leave_101(r)
    inc  L              ; 1:4       leave_101(r)
    jp   leave101       ; 3:10      leave_101(r)

_________________
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: 25.08.2022, 23:35 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
U slova RPICK jsem usetril bajt a nejaky takt od predchoziho reseni RJ RK.

Otocil jsem jen zpusob reseni. Puvodne bylo ze si ve stinovych registrech kde mam v HL R.A.S. nactu do DE index a ten pak pres zasobnik dostanu do HL. A R.A.S. vratim na puvodni hodnotu.
Nove naopak prvne vlezu do stinovych registru. Vytahnu odtam pres zasobnik R.A.S. do HL a pak ho pouziji. A je to efektivnejsi. To me hodne potesilo. Je tezke se prekonat. .))

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_RPICK(3)'

                       ;[13:85]     3 rpick   ( -- x3 ) ( R: x3 .. x1 x0 -- x3 .. x1 x0 )
    ex   DE, HL         ; 1:4       3 rpick
    exx                 ; 1:4       3 rpick
    push HL             ; 1:11      3 rpick   ras
    exx                 ; 1:4       3 rpick
    ex  (SP),HL         ; 1:19      3 rpick
    ld   BC, 0x0006     ; 3:10      3 rpick   2*(3)
    add  HL, BC         ; 1:11      3 rpick
    ld    A,(HL)        ; 1:7       3 rpick
    inc   L             ; 1:4       3 rpick
    ld    H,(HL)        ; 1:7       3 rpick
    ld    L, A          ; 1:4       3 rpick
                       ;[13:85]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh '__ASM_TOKEN_RJ'

    exx                 ; 1:4       __COMPILE_INFO(r)   ( -- j ) R:( stop_j j stop_i i -- stop_j j stop_i i )
    ld   DE, 0x0004     ; 3:10      __COMPILE_INFO(r)
    ex   DE, HL         ; 1:4       __COMPILE_INFO(r)
    add  HL, DE         ; 1:11      __COMPILE_INFO(r)
    ld    C,(HL)        ; 1:7       __COMPILE_INFO(r)   lo
    inc   L             ; 1:4       __COMPILE_INFO(r)
    ld    B,(HL)        ; 1:7       __COMPILE_INFO(r)   hi
    ex   DE, HL         ; 1:4       __COMPILE_INFO(r)
    push BC             ; 1:11      __COMPILE_INFO(r)
    exx                 ; 1:4       __COMPILE_INFO(r)
    ex   DE, HL         ; 1:4       __COMPILE_INFO(r)
    ex  (SP),HL         ; 1:19      __COMPILE_INFO(r)
                       ;[14:89]
__ASM_TOKEN_RJ je pozustatek puvodniho kodu.

_________________
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: 25.08.2022, 23:48 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Jsou pridana slova N>R a NR>. N_TO_R a NR_FROM.
Nasel jsem je pri hledani zda neni neco jako RPICK ve standartu.
Vypadaly jako idealni slova protoze nactou N polozek do R.A.S. a nezo z nej. Tim se hodne omezi ta pocatecni prace ze mam TOS v HL a index R.A.S. v HL'.
Ale v prubehu jsem zjistil ze to nebude tak horke, protoze kdyz jsem delal NR_FROM pro zpetny prevod tak jsem si uvedomil, ze ta slova jsou definovana trosku jinak.
On krome tech polozek ulozi jeste navic nakonec jeste jednu hodnotu a to ten pocet ukladanych polozek.
Takze NR_FROM pak vi kolik toho pretahnout, ale pridava to rezii s tou jednou hodnotou navic. Mam to udelano pro max 255 hodnot.

Pro optimalizaci je samozrejme i slovo PUSH_N_TO_R.
A aby to delalo co jsem myslel ze to dela je i PUSH_N_TO_R_RDROP. Jako ze tu posledni hodnotu nakonec vyjme.
A opak jsem uz nepojmenoval PUSH_R_TO_NR_FROM_DROP ale PUSH_UR_FROM.

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_UR_FROM(0)'
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_UR_FROM(1)'

                        ;[9:66]     r_from ( b a -- b a i ) ( R: i -- )
    exx                 ; 1:4       r_from
    ld    E,(HL)        ; 1:7       r_from
    inc   L             ; 1:4       r_from
    ld    D,(HL)        ; 1:7       r_from
    inc  HL             ; 1:6       r_from
    push DE             ; 1:11      r_from
    exx                 ; 1:4       r_from i . b a
    ex   DE, HL         ; 1:4       r_from i . a b
    ex  (SP), HL        ; 1:19      r_from b . a i
                       ;[ 9:66]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_UR_FROM(2)'

                      ;[15:118]     rdrop 2 >r nr> drop   ( -- x2 x1 ) ( R: x1 x2 -- )
    push DE             ; 1:11      rdrop 2 >r nr> drop
    exx                 ; 1:4       rdrop 2 >r nr> drop
    ld    E,(HL)        ; 1:7       rdrop 2 >r nr> drop
    inc   L             ; 1:4       rdrop 2 >r nr> drop
    ld    D,(HL)        ; 1:7       rdrop 2 >r nr> drop
    inc  HL             ; 1:6       rdrop 2 >r nr> drop
    ld    C,(HL)        ; 1:7       rdrop 2 >r nr> drop
    inc   L             ; 1:4       rdrop 2 >r nr> drop
    ld    B,(HL)        ; 1:7       rdrop 2 >r nr> drop
    inc  HL             ; 1:6       rdrop 2 >r nr> drop
    push BC             ; 1:11      rdrop 2 >r nr> drop   BC = x1
    push DE             ; 1:11      rdrop 2 >r nr> drop   DE = x2
    exx                 ; 1:4       rdrop 2 >r nr> drop
    pop  DE             ; 1:10      rdrop 2 >r nr> drop
    ex  (SP),HL         ; 1:19      rdrop 2 >r nr> drop
                       ;[15:118]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_UR_FROM(3)'

                      ;[21:155]     rdrop 3 >r nr> drop   ( x3 x2 x1 -- ) ( R: -- x1 x2 x3 )
    push DE             ; 1:11      rdrop 3 >r nr> drop
    push HL             ; 1:11      rdrop 3 >r nr> drop
    exx                 ; 1:4       rdrop 3 >r nr> drop
    ld    E,(HL)        ; 1:7       rdrop 3 >r nr> drop
    inc   L             ; 1:4       rdrop 3 >r nr> drop
    ld    D,(HL)        ; 1:7       rdrop 3 >r nr> drop
    inc  HL             ; 1:6       rdrop 3 >r nr> drop
    push DE             ; 1:11      rdrop 3 >r nr> drop   new nnos
    ld    E,(HL)        ; 1:7       rdrop 3 >r nr> drop
    inc   L             ; 1:4       rdrop 3 >r nr> drop
    ld    D,(HL)        ; 1:7       rdrop 3 >r nr> drop
    inc  HL             ; 1:6       rdrop 3 >r nr> drop
    push DE             ; 1:11      rdrop 3 >r nr> drop   new nos
    ld    E,(HL)        ; 1:7       rdrop 3 >r nr> drop
    inc   L             ; 1:4       rdrop 3 >r nr> drop
    ld    D,(HL)        ; 1:7       rdrop 3 >r nr> drop
    inc  HL             ; 1:6       rdrop 3 >r nr> drop
    push DE             ; 1:11      rdrop 3 >r nr> drop   new tos
    exx                 ; 1:4       rdrop 3 >r nr> drop
    pop  HL             ; 1:10      rdrop 3 >r nr> drop
    pop  DE             ; 1:10      rdrop 3 >r nr> drop
                       ;[21:155]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_UR_FROM(4)'

                       ;[20:218]    rdrop 4 >r nr> drop   ( xu .. x2 x1 -- ) ( R: -- x1 x2 .. xu )  u = 4
    push DE             ; 1:11      rdrop 4 >r nr> drop
    push HL             ; 1:11      rdrop 4 >r nr> drop
    exx                 ; 1:4       rdrop 4 >r nr> drop
    ld    B, 2          ; 2:7       rdrop 4 >r nr> drop   B = (4+1)/2
    ld    E,(HL)        ; 1:7       rdrop 4 >r nr> drop
    inc   L             ; 1:4       rdrop 4 >r nr> drop
    ld    D,(HL)        ; 1:7       rdrop 4 >r nr> drop
    inc  HL             ; 1:6       rdrop 4 >r nr> drop
    push DE             ; 1:11      rdrop 4 >r nr> drop   DE
    ld    E,(HL)        ; 1:7       rdrop 4 >r nr> drop
    inc   L             ; 1:4       rdrop 4 >r nr> drop
    ld    D,(HL)        ; 1:7       rdrop 4 >r nr> drop
    inc  HL             ; 1:6       rdrop 4 >r nr> drop
    push DE             ; 1:11      rdrop 4 >r nr> drop   DE
    djnz $-10           ; 2:8/13    rdrop 4 >r nr> drop
    exx                 ; 1:4       rdrop 4 >r nr> drop
    pop  HL             ; 1:10      rdrop 4 >r nr> drop
    pop  DE             ; 1:10      rdrop 4 >r nr> drop
                       ;[20:135]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_UR_FROM(5)'

                       ;[22:279]    rdrop 5 >r nr> drop   ( xu .. x2 x1 -- ) ( R: -- x1 x2 .. xu )  u = 5
    push DE             ; 1:11      rdrop 5 >r nr> drop
    push HL             ; 1:11      rdrop 5 >r nr> drop
    exx                 ; 1:4       rdrop 5 >r nr> drop
    ld    B, 3          ; 2:7       rdrop 5 >r nr> drop   B = (5+1)/2
    jr   $+7            ; 2:12      rdrop 5 >r nr> drop
    ld    E,(HL)        ; 1:7       rdrop 5 >r nr> drop
    inc   L             ; 1:4       rdrop 5 >r nr> drop
    ld    D,(HL)        ; 1:7       rdrop 5 >r nr> drop
    inc  HL             ; 1:6       rdrop 5 >r nr> drop
    push DE             ; 1:11      rdrop 5 >r nr> drop   DE
    ld    E,(HL)        ; 1:7       rdrop 5 >r nr> drop
    inc   L             ; 1:4       rdrop 5 >r nr> drop
    ld    D,(HL)        ; 1:7       rdrop 5 >r nr> drop
    inc  HL             ; 1:6       rdrop 5 >r nr> drop
    push DE             ; 1:11      rdrop 5 >r nr> drop   DE
    djnz $-10           ; 2:8/13    rdrop 5 >r nr> drop
    exx                 ; 1:4       rdrop 5 >r nr> drop
    pop  HL             ; 1:10      rdrop 5 >r nr> drop
    pop  DE             ; 1:10      rdrop 5 >r nr> drop
                       ;[22:147]


Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_N_TO_R_RDROP(0)'
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_N_TO_R_RDROP(1)'

                        ;[9:65]     to_r   ( c b a -- c b ) ( R: -- a )
    ex  (SP), HL        ; 1:19      to_r   a . b c
    ex   DE, HL         ; 1:4       to_r   a . c b
    exx                 ; 1:4       to_r
    pop  DE             ; 1:10      to_r
    dec  HL             ; 1:6       to_r
    ld  (HL),D          ; 1:7       to_r
    dec   L             ; 1:4       to_r
    ld  (HL),E          ; 1:7       to_r
    exx                 ; 1:4       to_r
                       ;[ 9:65]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_N_TO_R_RDROP(2)'

                      ;[15:116]     2 n>r rdrop   ( x2 x1 -- ) ( R: -- x1 x2 )
    ex   (SP),HL        ; 1:19      2 n>r rdrop
    push DE             ; 1:11      2 n>r rdrop
    exx                 ; 1:4       2 n>r rdrop
    pop  DE             ; 1:10      2 n>r rdrop   DE = x2 = origin nos
    pop  BC             ; 1:10      2 n>r rdrop   DE = x1 = origin tos
    dec  HL             ; 1:6       2 n>r rdrop
    ld  (HL),B          ; 1:7       2 n>r rdrop
    dec   L             ; 1:4       2 n>r rdrop
    ld  (HL),C          ; 1:7       2 n>r rdrop
    dec  HL             ; 1:6       2 n>r rdrop
    ld  (HL),D          ; 1:7       2 n>r rdrop
    dec   L             ; 1:4       2 n>r rdrop
    ld  (HL),E          ; 1:7       2 n>r rdrop
    exx                 ; 1:4       2 n>r rdrop
    pop  DE             ; 1:10      2 n>r rdrop
                       ;[15:116]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_N_TO_R_RDROP(3)'

                      ;[21:152]     3 n>r rdrop   ( x3 x2 x1 -- ) ( R: -- x1 x2 x3 )
    push DE             ; 1:11      3 n>r rdrop
    push HL             ; 1:11      3 n>r rdrop
    exx                 ; 1:4       3 n>r rdrop
    pop  DE             ; 1:10      3 n>r rdrop   origin tos
    dec  HL             ; 1:6       3 n>r rdrop
    ld  (HL),D          ; 1:7       3 n>r rdrop
    dec   L             ; 1:4       3 n>r rdrop
    ld  (HL),E          ; 1:7       3 n>r rdrop
    pop  DE             ; 1:10      3 n>r rdrop   origin nos
    dec  HL             ; 1:6       3 n>r rdrop
    ld  (HL),D          ; 1:7       3 n>r rdrop
    dec   L             ; 1:4       3 n>r rdrop
    ld  (HL),E          ; 1:7       3 n>r rdrop
    pop  DE             ; 1:10      3 n>r rdrop   origin nnos
    dec  HL             ; 1:6       3 n>r rdrop
    ld  (HL),D          ; 1:7       3 n>r rdrop
    dec   L             ; 1:4       3 n>r rdrop
    ld  (HL),E          ; 1:7       3 n>r rdrop
    exx                 ; 1:4       3 n>r rdrop
    pop  HL             ; 1:10      3 n>r rdrop
    pop  DE             ; 1:10      3 n>r rdrop
                       ;[21:152]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_N_TO_R_RDROP(4)'

                       ;[20:214]    4 n>r rdrop   ( xu .. x2 x1 -- ) ( R: -- x1 x2 .. xu )
    push DE             ; 1:11      4 n>r rdrop
    push HL             ; 1:11      4 n>r rdrop
    exx                 ; 1:4       4 n>r rdrop
    ld    B, 2          ; 2:7       4 n>r rdrop   B = (4+1)/2
    pop  DE             ; 1:10      4 n>r rdrop   DE
    dec  HL             ; 1:6       4 n>r rdrop
    ld  (HL),D          ; 1:7       4 n>r rdrop
    dec   L             ; 1:4       4 n>r rdrop
    ld  (HL),E          ; 1:7       4 n>r rdrop
    pop  DE             ; 1:10      4 n>r rdrop   DE
    dec  HL             ; 1:6       4 n>r rdrop
    ld  (HL),D          ; 1:7       4 n>r rdrop
    dec   L             ; 1:4       4 n>r rdrop
    ld  (HL),E          ; 1:7       4 n>r rdrop
    djnz $-10           ; 2:8/13    4 n>r rdrop
    exx                 ; 1:4       4 n>r rdrop
    pop  HL             ; 1:10      4 n>r rdrop
    pop  DE             ; 1:10      4 n>r rdrop
                       ;[20:133]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_N_TO_R_RDROP(5)'

                       ;[22:273]    5 n>r rdrop   ( xu .. x2 x1 -- ) ( R: -- x1 x2 .. xu )
    push DE             ; 1:11      5 n>r rdrop
    push HL             ; 1:11      5 n>r rdrop
    exx                 ; 1:4       5 n>r rdrop
    ld    B, 3          ; 2:7       5 n>r rdrop   B = (5+1)/2
    jr   $+7            ; 2:12      5 n>r rdrop
    pop  DE             ; 1:10      5 n>r rdrop   DE
    dec  HL             ; 1:6       5 n>r rdrop
    ld  (HL),D          ; 1:7       5 n>r rdrop
    dec   L             ; 1:4       5 n>r rdrop
    ld  (HL),E          ; 1:7       5 n>r rdrop
    pop  DE             ; 1:10      5 n>r rdrop   DE
    dec  HL             ; 1:6       5 n>r rdrop
    ld  (HL),D          ; 1:7       5 n>r rdrop
    dec   L             ; 1:4       5 n>r rdrop
    ld  (HL),E          ; 1:7       5 n>r rdrop
    djnz $-10           ; 2:8/13    5 n>r rdrop
    exx                 ; 1:4       5 n>r rdrop
    pop  HL             ; 1:10      5 n>r rdrop
    pop  DE             ; 1:10      5 n>r rdrop
                       ;[22:145]


Pri hrani s timto kodem jsem nasel tu lepsi variantu pro slovo "J".

_________________
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: 26.08.2022, 00:03 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Jeste uvedu ukazky pro memory a stack variantu s ukoncenim na 257 a krokem 10.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DO(M,257) PUSH(10) ADDLOOP'
             

    ld  (idx101), HL    ; 3:16      do_101(m)   ( index -- )   stop=257
    ex   DE, HL         ; 1:4       do_101(m)
    pop  DE             ; 1:10      do_101(m)
do101:                  ;           do_101(m)
    push HL             ; 1:11      10 +loop_101(m)
idx101 EQU $+1          ;           10 +loop_101(m)
    ld   HL, 0x0000     ; 3:10      10 +loop_101(m)
    ld   BC, 10         ; 3:10      10 +loop_101(m) BC = step
    add  HL, BC         ; 1:11      10 +loop_101(m) HL = index+step
    ld  (idx101), HL    ; 3:16      10 +loop_101(m) save index
stp_lo101 EQU $+1       ;           10 +loop_101(m)
    ld    A, low 257-1  ; 2:7       10 +loop_101(m)   lo stop-1
    sub   L             ; 1:4       10 +loop_101(m)
    ld    L, A          ; 1:4       10 +loop_101(m)
stp_hi101 EQU $+1       ;           10 +loop_101(m)
    ld    A, high 257-1 ; 2:7       10 +loop_101(m)   hi stop-1
    sbc   A, H          ; 1:4       10 +loop_101(m)
    ld    H, A          ; 1:4       10 +loop_101(m) HL = stop-(index+step)
    add  HL, BC         ; 1:11      10 +loop_101(m) HL = stop-index
    xor   H             ; 1:4       10 +loop_101(m)
    pop  HL             ; 1:10      10 +loop_101(m)
    jp    p, do101      ; 3:10      10 +loop_101(m) negative step
leave101:               ;           10 +loop_101(m)
exit101:                ;           10 +loop_101(m)
                       ;[30:153]

Kód:
    push DE             ; 1:11      257 swap
    ld   DE, 257        ; 3:10      257 swap ( a -- 257 a )
do101:                  ;           do_101(s)   ( stop index -- stop index )
    or    A             ; 1:4       10 +loop_101(s)
    sbc  HL, DE         ; 2:15      10 +loop_101(s)   HL = index-stop
    ld   BC, 10         ; 3:10      10 +loop_101(s)   BC = step
    ld    A, H          ; 1:4       10 +loop_101(s)
    add  HL, BC         ; 1:11      10 +loop_101(s)   HL = index-stop+step
    xor   H             ; 1:4       10 +loop_101(s)   sign flag!
    add  HL, DE         ; 1:11      10 +loop_101(s)   HL = index+step, sign flag unaffected
    jp    p, do101      ; 3:10      10 +loop_101(s)
leave101:               ;           10 +loop_101(s)
    pop  HL             ; 1:10      unloop_101(s)   ( stop_i i -- )
    pop  DE             ; 1:10      unloop_101(s)
                       ;[19:110]

Vsimnete si ze u stack jsem neresil ze znam konec a vrazil hodnotu zpet na zaspbnik a zavolal default fci... .)

Ty algoritmy se i ruzne lisi, jak jsem to predtim psal. Nektere pouzivaji priznak preteceni. A jsou celkem komplikovane vubec na pochopeni, chce to hodne casu... Forth ma oproti Cecku ty smycky zbytecne slozite resene.
Kód:
for(i=10000;i<257;i+=10)
by nic neprovedlo. Forth to nezajima a smycku necha bezet dokud nepretece index "i" a nedostane se pod 257 a dalsi krok by byl vetsi nez 257. A to jeste musite resit pro kladny i zaporny krok. Zaporny krok to ma podle standartu vzdy VCETNE stop hodnoty.
Snazil jsem se do toho nezabrednout, protoze mam na netu prave ted uz tyden bugovou verzi se smyckama, ale je to tezke... kdyz narazite na neco zajimaveho. Co kdybych tohle...

_________________
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: 26.08.2022, 08:49 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1202
Has thanked: 367 times
Been thanked: 304 times
_dworkin píše:
Nekdo me tu navrhoval pouzit jiny prekladac z asm do bin nez pasmo.
Ja bych snad navrhnul Z88DK-Z80ASM, ale on to neni primo asm->bin. Spise asm->obj->bin, takze je potreba i linker. Ale to je u vetsich projektu obvykle. Ale umi i asm->bin s parametrem -b.
Nenutim, jen navrhuji ;-)

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 26.08.2022, 10:25 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Mikes21 píše:
_dworkin píše:
Nekdo me tu navrhoval pouzit jiny prekladac z asm do bin nez pasmo.
Ja bych snad navrhnul Z88DK-Z80ASM, ale on to neni primo asm->bin. Spise asm->obj->bin, takze je potreba i linker. Ale to je u vetsich projektu obvykle. Ale umi i asm->bin s parametrem -b.
Nenutim, jen navrhuji ;-)
V tom pripade ja zase navrhujem pouzit SjASMPlus, ten tiez vie asm->bin, a okrem toho aj asm->tap, asm->sna, asm->trd a pod...


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 05.09.2022, 00:23 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Mikes21 píše:
_dworkin píše:
Nekdo me tu navrhoval pouzit jiny prekladac z asm do bin nez pasmo.
Ja bych snad navrhnul Z88DK-Z80ASM, ale on to neni primo asm->bin. Spise asm->obj->bin, takze je potreba i linker. Ale to je u vetsich projektu obvykle. Ale umi i asm->bin s parametrem -b.
Nenutim, jen navrhuji ;-)


Zjistil jsem ze mam nejaky z80asm nainstalovany.

dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ z80asm -V
Z80 assembler version 1.8
Copyright (C) 2002-2007 Bas Wijnen <shevek@fmf.nl>.
Copyright (C) 2005 Jan Wilmans <jw@dds.nl>.
This program comes with ABSOLUTELY NO WARRANTY.
You may distribute copies of the program under the terms
of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.

The complete text of the GPL can be found in
/usr/share/common-licenses/GPL.


Ale pri pokusu o kompilaci me to vyhodilo 41 chyb a uz na druhem radku mu vadilo

aa EQU 0x064

a nebylo to tim ze nechape 0x064

dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ z80asm z80asm_ld_condition.asm
z80asm_ld_condition.asm:2: error: command or comment expected (was aa EQU 0x604 )

http://www.s100computers.com/My%20System%20Pages/IBM%20Keyboard/z80asm%20(SLR%20Systems).pdf
na strane 28 to pritom podporuji, nechapu

Kód:
<LABEL> EQU <EXP>
 Equate Directive. This pseudo-op declares a value <EXP> to
be assigned to a label. <EXP> must evaluate to an absolute or
relative item by the second pass. The label being defined must
not have been previously defined. For example, the following
statements
 FALSE EQU 0 ;false is 0
 TRUE: EQU NOT FALSE ;true is ffff
assign values to symbols TRUE and FALSE. The colon after the
label is optional in all cases.


To cloveka odradi, kdyz nad tim stravi par hodin a vysledek nikde.
To je jako neco zkompilovat v C pro Z80.
Bud mam malo informaci, nebo jsem neschopny, netusim.

_________________
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: 05.09.2022, 01:07 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Pracuji stale na tech smyckach, jde to pomalu.

Opravil jsem nejake chyby ve vypisu cisel. Bylo tam dost "slov/funkci/maker" co se skladaly z vice slov. Nebo pro svoji potrebu volali nejake jine "slovo/funkci/makro".
A tokenizace to rozbila.

Predtim:
Kód:
DUP_DOT

se zmenilo na
Kód:
    push HL             ; 1:11      dup .   x3 x1 x2 x1{}dnl
__{}DOT
    ex   DE, HL         ; 1:4       dup .   x3 x2 x1})dnl

Ve skutecnosti to DOT se hned rozbalilo na neco jako
Kód:
    push HL             ; 1:11      dup .   x3 x1 x2 x1
    call PRT_S16        ; 3:17      .   ( s -- )
    ex   DE, HL         ; 1:4       dup .   x3 x2 x1

A ted me DUP_DOT vytvori token __TOKEN_DUP_DOT
A az se bude generovat kod z tokenu tak to teprve vola __ASM_TOKEN_DUP_DOT, ktery dela to co predtim DUP_DOT
Kód:
    push HL             ; 1:11      dup .   x3 x1 x2 x1{}dnl
__{}DOT
    ex   DE, HL         ; 1:4       dup .   x3 x2 x1

A tady to selze, protoze DOT me vytvori jen token a prida na konec fronty.
Takze vysledek bude chybne
Kód:
    push HL             ; 1:11      dup .   x3 x1 x2 x1
    ex   DE, HL         ; 1:4       dup .   x3 x2 x1
    call PRT_S16        ; 3:17      .   ( s -- )

Proste musim nekdy rucne projit vsechen kod a hledat zda nahodou uvnitr kodu nevolam jine "slovo/funkci/makro" a nahradit to za __ASM_TOKEN_DUP.

_________________
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: 05.09.2022, 01:22 
Offline
Kecálek

Registrován: 10.07.2014, 01:57
Příspěvky: 169
Has thanked: 25 times
Been thanked: 225 times
_dworkin píše:
Ale pri pokusu o kompilaci me to vyhodilo 41 chyb a uz na druhem radku mu vadilo

aa EQU 0x064

a nebylo to tim ze nechape 0x064

dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ z80asm z80asm_ld_condition.asm
z80asm_ld_condition.asm:2: error: command or comment expected (was aa EQU 0x604 )

http://www.s100computers.com/My%20System%20Pages/IBM%20Keyboard/z80asm%20(SLR%20Systems).pdf
na strane 28 to pritom podporuji, nechapu


len ci to pdf nie je o nejakom inom z80asm ako mas nainstalovane, v INTRODUCTION je hned prva veta:
Citace:
Z80ASM is a powerful relocating macro assembler for Z80-based CP/M systems.


co sa sice da chapat aj tak, ze pomocou z80asm sa da kompilovat zdrojak a vysledok kompilacie potom moze bezat na z80 cp/m, ale asi sa to da chapat aj tak ze je to z80asm beziace priamo na cp/m a tam kompilujuce (a toto asi nebude tvoj pripad)...

kazdopadne, z80asm v debiane (z balika z80asm) vyzaduje dvojbodku za navestiami, tak ju tam skus pridat, lebo chybova hlaska co si pastol je rovnaka ako ked navestie nema dvojbodku:
Kód:
$ z80asm test.asm
test.asm:3: error: command or comment expected (was tst      equ   1 )
*** 1 error found ***


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 05.09.2022, 01:27 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Pri tom prepisu smycek jsem nejak opomnel variantu kdy znam pocatek smycky. V typech smycky kdy se to uklada do pameti a do ras to odstranilo "push(index)" z kodu pred smyckou, ale samotne "do" se pak tvarilo ze index lezi v HL(tos).

Bylo to hodne variant, opravoval jsem to cele 2 dny, vcetne dneska(ted uz vcerejska, protoze mam 0:14 pondeli).
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO __SET_LOOP_STEP(101,1)'
 
    ld  (idx101), HL    ; 3:16      do_101(m)   index  ( stop index -- )
    ld    A, E          ; 1:4       do_101(m)
    ld  (stp_lo101), A  ; 3:13      do_101(m)   lo stop
    ld    A, D          ; 1:4       do_101(m)
    ld  (stp_hi101), A  ; 3:13      do_101(m)   hi stop
    pop  DE             ; 1:10      do_101(m)
    pop  HL             ; 1:10      do_101(m)
do101:                  ;           do_101(m)
                       ;[13:70]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO __SET_LOOP_STEP(101,1)'
 
    ld  (idx101), HL    ; 3:16      do_101(m)   index  ( stop index -- )
    ld    A, E          ; 1:4       do_101(m)
    ld  (stp_lo101), A  ; 3:13      do_101(m)   lo stop
    ld    A, D          ; 1:4       do_101(m)
    ld  (stp_hi101), A  ; 3:13      do_101(m)   hi stop
    pop  DE             ; 1:10      do_101(m)
    pop  HL             ; 1:10      do_101(m)
do101:                  ;           do_101(m)
                       ;[13:70]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO __SET_LOOP_STEP(101,-1)'
 
    ld  (idx101), HL    ; 3:16      do_101(m)   ( stop index -- )
    dec  DE             ; 1:6       do_101(m)
    ld    A, E          ; 1:4       do_101(m)
    ld  (stp_lo101), A  ; 3:13      do_101(m)   lo stop-1
    ld    A, D          ; 1:4       do_101(m)
    ld  (stp_hi101), A  ; 3:13      do_101(m)   hi stop-1
    pop  DE             ; 1:10      do_101(m)
    pop  HL             ; 1:10      do_101(m)
do101:                  ;           do_101(m)
                       ;[14:76]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'QUESTIONDO __SET_LOOP_STEP(101,1)'
 
    ld  (idx101), HL    ; 3:16      ?do_101(m)   index  ( stop index -- )
    or    A             ; 1:4       ?do_101(m)
    sbc  HL, DE         ; 2:15      ?do_101(m)
    ld    A, E          ; 1:4       ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      ?do_101(m)   lo stop
    ld    A, D          ; 1:4       ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      ?do_101(m)   hi stop
    pop  HL             ; 1:10      ?do_101(m)
    pop  DE             ; 1:10      ?do_101(m)
    jp    z, exit101    ; 3:10      ?do_101(m)
do101:                  ;           ?do_101(m)
                       ;[19:99]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'QUESTIONDO __SET_LOOP_STEP(101,-1)'
 
    ld  (idx101), HL    ; 3:16      ?do_101(m)   ( stop index -- )
    or    A             ; 1:4       ?do_101(m)
    sbc  HL, DE         ; 2:15      ?do_101(m)
    dec  DE             ; 1:6       ?do_101(m)
    ld    A, E          ; 1:4       ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      ?do_101(m)   lo stop-1
    ld    A, D          ; 1:4       ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      ?do_101(m)   hi stop-1
    pop  HL             ; 1:10      ?do_101(m)
    pop  DE             ; 1:10      ?do_101(m)
    jp    z, exit101    ; 3:10      ?do_101(m)
do101:                  ;           ?do_101(m)
                       ;[20:105]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(0) DO __SET_LOOP_STEP(101,1)'
 
    ld    A, L          ; 1:4       0 do_101(m)   ( stop 0 -- )
    ld  (stp_lo101), A  ; 3:13      0 do_101(m)   lo stop
    ld    A, H          ; 1:4       0 do_101(m)
    ld  (stp_hi101), A  ; 3:13      0 do_101(m)   hi stop
    ld   HL, 0          ; 3:10      0 do_101(m)
    ld  (idx101), HL    ; 3:16      0 do_101(m)   index
    ex   DE, HL         ; 1:4       0 do_101(m)
    pop  DE             ; 1:10      0 do_101(m)
do101:                  ;           0 do_101(m)
                       ;[16:74]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(0) DO __SET_LOOP_STEP(101,-1)'
 
    dec  HL             ; 1:6       0 do_101(m)
    ld    A, L          ; 1:4       0 do_101(m)
    ld  (stp_lo101), A  ; 3:13      0 do_101(m)   lo stop-1
    ld    A, H          ; 1:4       0 do_101(m)
    ld  (stp_hi101), A  ; 3:13      0 do_101(m)   hi stop-1
    ld   HL, 0          ; 3:10      0 do_101(m)
    ld  (idx101), HL    ; 3:16      0 do_101(m)
    pop  HL             ; 1:10      0 do_101(m)
    ex   DE, HL         ; 1:4       0 do_101(m)
do101:                  ;           0 do_101(m)
                       ;[17:80]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(0) QUESTIONDO __SET_LOOP_STEP(101,1)'
 
    ld    A, L          ; 1:4       0 ?do_101(m)   ( stop 0 -- )
    ld  (stp_lo101), A  ; 3:13      0 ?do_101(m)   lo stop
    ld    A, H          ; 1:4       0 ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      0 ?do_101(m)   hi stop
    or    L             ; 1:4       0 ?do_101(m)
    ld   HL, 0          ; 3:10      0 ?do_101(m)
    ld  (idx101), HL    ; 3:16      0 ?do_101(m)
    pop  HL             ; 1:10      0 ?do_101(m)
    ex   DE, HL         ; 1:4       0 ?do_101(m)
    jp    z, exit101    ; 3:10      0 ?do_101(m)
do101:                  ;           0 ?do_101(m)
                       ;[20:88]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(0) QUESTIONDO __SET_LOOP_STEP(101,-1)'
 
                     ;[22:98/98,98] 0 ?do_101(m)   (  index -- )
    ld    A, H          ; 1:4       0 ?do_101(m)   x[1] = 0
    or    L             ; 1:4       0 ?do_101(m)   x[2] = 0
    dec  HL             ; 1:6       0 ?do_101(m)
    ld    A, L          ; 1:4       0 ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      0 ?do_101(m)   lo stop-1
    ld    A, H          ; 1:4       0 ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      0 ?do_101(m)   hi stop-1
    ld   HL, 0          ; 3:10      0 ?do_101(m)
    ld  (idx101), HL    ; 3:16      0 ?do_101(m)
    pop  HL             ; 1:10      0 ?do_101(m)
    ex   DE, HL         ; 1:4       0 ?do_101(m)
    jp    z, exit101    ; 3:10      0 ?do_101(m)
do101:                  ;           0 ?do_101(m)
                       ;[22:98]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(1) QUESTIONDO __SET_LOOP_STEP(101,1)'
 
    ld    A, H          ; 1:4       1 ?do_101(m)   ( stop 1 -- )
    ld  (stp_hi101), A  ; 3:13      1 ?do_101(m)   hi stop
    ld    A, L          ; 1:4       1 ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      1 ?do_101(m)   lo stop
    dec   A             ; 1:4       1 ?do_101(m)
    or    H             ; 1:4       1 ?do_101(m)
    ld   HL, 1          ; 3:10      1 ?do_101(m)
    ld  (idx101), HL    ; 3:16      1 ?do_101(m)
    pop  HL             ; 1:10      1 ?do_101(m)
    ex   DE, HL         ; 1:4       1 ?do_101(m)
    jp    z, exit101    ; 3:10      1 ?do_101(m)
do101:                  ;           1 ?do_101(m)
                       ;[21:92]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(1) QUESTIONDO __SET_LOOP_STEP(101,-1)'
 
                  ;[23:102/102,102] 1 ?do_101(m)   (  index -- )
    ld    A, L          ; 1:4       1 ?do_101(m)
    dec   A             ; 1:4       1 ?do_101(m)   x[1] = 1
    or    H             ; 1:4       1 ?do_101(m)   x[2] = 0
    dec  HL             ; 1:6       1 ?do_101(m)
    ld    A, L          ; 1:4       1 ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      1 ?do_101(m)   lo stop-1
    ld    A, H          ; 1:4       1 ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      1 ?do_101(m)   hi stop-1
    ld   HL, 1          ; 3:10      1 ?do_101(m)
    ld  (idx101), HL    ; 3:16      1 ?do_101(m)
    pop  HL             ; 1:10      1 ?do_101(m)
    ex   DE, HL         ; 1:4       1 ?do_101(m)
    jp    z, exit101    ; 3:10      1 ?do_101(m)
do101:                  ;           1 ?do_101(m)
                       ;[23:102]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(255) QUESTIONDO __SET_LOOP_STEP(101,1)'
 
    ld    A, H          ; 1:4       255 ?do_101(m)   ( stop 255 -- )
    ld  (stp_hi101), A  ; 3:13      255 ?do_101(m)   hi stop
    ld    A, L          ; 1:4       255 ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      255 ?do_101(m)   lo stop
    inc   A             ; 1:4       255 ?do_101(m)
    or    H             ; 1:4       255 ?do_101(m)
    ld   HL, 255        ; 3:10      255 ?do_101(m)
    ld  (idx101), HL    ; 3:16      255 ?do_101(m)
    pop  HL             ; 1:10      255 ?do_101(m)
    ex   DE, HL         ; 1:4       255 ?do_101(m)
    jp    z, exit101    ; 3:10      255 ?do_101(m)
do101:                  ;           255 ?do_101(m)
                       ;[21:92]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(255) QUESTIONDO __SET_LOOP_STEP(101,-1)'
 
                  ;[23:102/102,102] 255 ?do_101(m)   (  index -- )
    ld    A, L          ; 1:4       255 ?do_101(m)
    inc   A             ; 1:4       255 ?do_101(m)   x[1] = 0xFF
    or    H             ; 1:4       255 ?do_101(m)   x[2] = 0
    dec  HL             ; 1:6       255 ?do_101(m)
    ld    A, L          ; 1:4       255 ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      255 ?do_101(m)   lo stop-1
    ld    A, H          ; 1:4       255 ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      255 ?do_101(m)   hi stop-1
    ld   HL, 255        ; 3:10      255 ?do_101(m)
    ld  (idx101), HL    ; 3:16      255 ?do_101(m)
    pop  HL             ; 1:10      255 ?do_101(m)
    ex   DE, HL         ; 1:4       255 ?do_101(m)
    jp    z, exit101    ; 3:10      255 ?do_101(m)
do101:                  ;           255 ?do_101(m)
                       ;[23:102]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(1000) QUESTIONDO __SET_LOOP_STEP(101,1)'
 
    ld    A, L          ; 1:4       1000 ?do_101(m)   ( stop 1000 -- )
    ld  (stp_lo101), A  ; 3:13      1000 ?do_101(m)   lo stop
    ld    A, H          ; 1:4       1000 ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      1000 ?do_101(m)   hi stop
    ld   BC, 1000       ; 3:10      1000 ?do_101(m)
    ld  (idx101), BC    ; 4:20      1000 ?do_101(m)
    or    A             ; 1:4       1000 ?do_101(m)
    sbc  HL, BC         ; 2:15      1000 ?do_101(m)
    pop  HL             ; 1:10      1000 ?do_101(m)
    ex   DE, HL         ; 1:4       1000 ?do_101(m)
    jp    z, exit101    ; 3:10      1000 ?do_101(m)
do101:                  ;           1000 ?do_101(m)
                       ;[23:107]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(1000) QUESTIONDO __SET_LOOP_STEP(101,-1)'
 
    ld    C, L          ; 1:4       1000 ?do_101(m)   ( stop 1000 -- )
    ld    B, H          ; 1:4       1000 ?do_101(m)
    ld   HL, 1000       ; 3:10      1000 ?do_101(m)
    ld  (idx101), HL    ; 3:16      1000 ?do_101(m)
    or    A             ; 1:4       1000 ?do_101(m)
    sbc  HL, BC         ; 2:15      1000 ?do_101(m)
    dec  BC             ; 1:6       1000 ?do_101(m)
    ld    A, C          ; 1:4       1000 ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      1000 ?do_101(m)   lo stop-1
    ld    A, B          ; 1:4       1000 ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      1000 ?do_101(m)   hi stop-1
    pop  HL             ; 1:10      1000 ?do_101(m)
    ex   DE, HL         ; 1:4       1000 ?do_101(m)
    jp    z, exit101    ; 3:10      1000 ?do_101(m)
do101:                  ;           1000 ?do_101(m)
                       ;[25:117]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH((1000)) QUESTIONDO __SET_LOOP_STEP(101,1)'
 
    ld    A, L          ; 1:4       (1000) ?do_101(m)   ( stop (1000) -- )
    ld  (stp_lo101), A  ; 3:13      (1000) ?do_101(m)   lo stop
    ld    A, H          ; 1:4       (1000) ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      (1000) ?do_101(m)   hi stop
    ld   BC, (1000)     ; 4:20      (1000) ?do_101(m)
    ld  (idx101), BC    ; 4:20      (1000) ?do_101(m)
    or    A             ; 1:4       (1000) ?do_101(m)
    sbc  HL, BC         ; 2:15      (1000) ?do_101(m)
    jp    z, exit101    ; 3:10      (1000) ?do_101(m)
    pop  HL             ; 1:10      (1000) ?do_101(m)
    ex   DE, HL         ; 1:4       (1000) ?do_101(m)
    jp    z, exit101    ; 3:10      (1000) ?do_101(m)
do101:                  ;           (1000) ?do_101(m)
                       ;[27:127]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH((1000)) QUESTIONDO __SET_LOOP_STEP(101,-1)'
 
    ld    C, L          ; 1:4       (1000) ?do_101(m)   ( stop (1000) -- )
    ld    B, H          ; 1:4       (1000) ?do_101(m)
    ld   HL, (1000)     ; 3:16      (1000) ?do_101(m)
    ld  (idx101), HL    ; 3:16      (1000) ?do_101(m)
    or    A             ; 1:4       (1000) ?do_101(m)
    sbc  HL, BC         ; 2:15      (1000) ?do_101(m)
    dec  BC             ; 1:6       (1000) ?do_101(m)
    ld    A, C          ; 1:4       (1000) ?do_101(m)
    ld  (stp_lo101), A  ; 3:13      (1000) ?do_101(m)   lo stop-1
    ld    A, B          ; 1:4       (1000) ?do_101(m)
    ld  (stp_hi101), A  ; 3:13      (1000) ?do_101(m)   hi stop-1
    pop  HL             ; 1:10      (1000) ?do_101(m)
    ex   DE, HL         ; 1:4       (1000) ?do_101(m)
    jp    z, exit101    ; 3:10      (1000) ?do_101(m)
do101:                  ;           (1000) ?do_101(m)
                       ;[25:123]

atd.

_________________
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: 05.09.2022, 01:32 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'DO(R) __SET_LOOP_STEP(101,1)'
 
                       ;[15:116]    do_101(r)   ( stop index -- ) ( R: -- stop index )
    ex  (SP),HL         ; 1:19      do_101(r)
    push DE             ; 1:11      do_101(r)
    exx                 ; 1:4       do_101(r)
    pop  DE             ; 1:10      do_101(r)   DE = stop
    dec  HL             ; 1:6       do_101(r)
    ld  (HL),D          ; 1:7       do_101(r)
    dec   L             ; 1:4       do_101(r)
    ld  (HL),E          ; 1:7       do_101(r)
    pop  DE             ; 1:10      do_101(r)   DE = index
    dec  HL             ; 1:6       do_101(r)
    ld  (HL),D          ; 1:7       do_101(r)
    dec   L             ; 1:4       do_101(r)
    ld  (HL),E          ; 1:7       do_101(r)
    exx                 ; 1:4       do_101(r)
    pop  DE             ; 1:10      do_101(r)
do101:                  ;           do_101(r)
                       ;[15:116]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'QUESTIONDO(R) __SET_LOOP_STEP(101,1)'
 
                       ;[24:158]    ?do_101(r)   ( stop index -- ) R: ( -- stop index )
    push HL             ; 1:11      ?do_101(r)   index
    push DE             ; 1:11      ?do_101(r)   stop
    or    A             ; 1:4       ?do_101(r)
    sbc  HL, DE         ; 2:15      ?do_101(r)
    exx                 ; 1:4       ?do_101(r)
    pop  DE             ; 1:10      ?do_101(r)   stop
    pop  BC             ; 1:10      ?do_101(r)   index
    jr    z, $+10       ; 2:7/12    ?do_101(r)
    dec  HL             ; 1:6       ?do_101(r)
    ld  (HL),D          ; 1:7       ?do_101(r)   hi stop
    dec  HL             ; 1:6       ?do_101(r)
    ld  (HL),E          ; 1:7       ?do_101(r)   lo stop
    dec  HL             ; 1:6       ?do_101(r)
    ld  (HL),B          ; 1:7       ?do_101(r)   hi index
    dec  HL             ; 1:6       ?do_101(r)
    ld  (HL),C          ; 1:7       ?do_101(r)   lo index
    exx                 ; 1:4       ?do_101(r)
    pop  HL             ; 1:10      ?do_101(r)
    pop  DE             ; 1:10      ?do_101(r)
    jp    z, exit101    ; 3:10      ?do_101(r)
do101:                  ;           ?do_101(r)
                       ;[24:158]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(0) DO(R) __SET_LOOP_STEP(101,1)'
 
                       ;[14:93]     0 do_101(r)   ( stop 0 -- ) ( R: -- stop 0 )
    ex  (SP),HL         ; 1:19      0 do_101(r)
    exx                 ; 1:4       0 do_101(r)
    pop  DE             ; 1:10      0 do_101(r)   DE = stop
    dec  HL             ; 1:6       0 do_101(r)
    ld  (HL),D          ; 1:7       0 do_101(r)
    dec   L             ; 1:4       0 do_101(r)
    ld  (HL),E          ; 1:7       0 do_101(r)
    dec  HL             ; 1:6       0 do_101(r)
    xor   A             ; 1:4       0 do_101(r)
    ld  (HL),A          ; 1:7       0 do_101(r)   hi index
    dec  L              ; 1:4       0 do_101(r)
    ld  (HL),A          ; 1:7       0 do_101(r)   hi index
    exx                 ; 1:4       0 do_101(r)
    ex   DE, HL         ; 1:4       0 do_101(r)
do101:                  ;           0 do_101(r)
                       ;[14:93]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(1) QUESTIONDO(R) __SET_LOOP_STEP(101,1)'
 
                  ;[24:130/130,130] 1 ?do_101(r)   ( stop 1 -- ) ( R: -- stop 1 )
    ld    A, H          ; 1:4       1 ?do_101(r)
    dec   A             ; 1:4       1 ?do_101(r)   x[1] = 1
    or    L             ; 1:4       1 ?do_101(r)   x[2] = 0
    jr    z, $+16       ; 2:7/12    1 ?do_101(r)
    push HL             ; 1:11      1 ?do_101(r)   stop
    exx                 ; 1:4       1 ?do_101(r)
    pop  DE             ; 1:10      1 ?do_101(r)   stop
    dec  HL             ; 1:6       1 ?do_101(r)
    ld  (HL),D          ; 1:7       1 ?do_101(r)
    dec  HL             ; 1:6       1 ?do_101(r)
    ld  (HL),E          ; 1:7       1 ?do_101(r)   stop
    dec  HL             ; 1:6       1 ?do_101(r)
    ld  (HL),high 1     ; 2:10      1 ?do_101(r)   hi index
    dec  HL             ; 1:6       1 ?do_101(r)
    ld  (HL),low 1      ; 2:10      1 ?do_101(r)   lo index
    exx                 ; 1:4       1 ?do_101(r)
    pop  HL             ; 1:10      1 ?do_101(r)
    ex   DE, HL         ; 1:4       1 ?do_101(r)
    jp    z, exit101    ; 3:10      1 ?do_101(r)
do101:                  ;           1 ?do_101(r)
                       ;[24:130]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(255) QUESTIONDO(R) __SET_LOOP_STEP(101,1)'
 
                  ;[24:130/130,130] 255 ?do_101(r)   ( stop 255 -- ) ( R: -- stop 255 )
    ld    A, H          ; 1:4       255 ?do_101(r)
    inc   A             ; 1:4       255 ?do_101(r)   x[1] = 0xFF
    or    L             ; 1:4       255 ?do_101(r)   x[2] = 0
    jr    z, $+16       ; 2:7/12    255 ?do_101(r)
    push HL             ; 1:11      255 ?do_101(r)   stop
    exx                 ; 1:4       255 ?do_101(r)
    pop  DE             ; 1:10      255 ?do_101(r)   stop
    dec  HL             ; 1:6       255 ?do_101(r)
    ld  (HL),D          ; 1:7       255 ?do_101(r)
    dec  HL             ; 1:6       255 ?do_101(r)
    ld  (HL),E          ; 1:7       255 ?do_101(r)   stop
    dec  HL             ; 1:6       255 ?do_101(r)
    ld  (HL),high 255   ; 2:10      255 ?do_101(r)   hi index
    dec  HL             ; 1:6       255 ?do_101(r)
    ld  (HL),low 255    ; 2:10      255 ?do_101(r)   lo index
    exx                 ; 1:4       255 ?do_101(r)
    pop  HL             ; 1:10      255 ?do_101(r)
    ex   DE, HL         ; 1:4       255 ?do_101(r)
    jp    z, exit101    ; 3:10      255 ?do_101(r)
do101:                  ;           255 ?do_101(r)
                       ;[24:130]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH(1000) QUESTIONDO(R) __SET_LOOP_STEP(101,1)'
 
                  ;[29:147/134,147] 1000 ?do_101(r)   ( stop 1000 -- ) ( R: -- stop 1000 )
    ld    A, 0x03       ; 2:7       1000 ?do_101(r)
    cp    L             ; 1:4       1000 ?do_101(r)   x[1] = 0x03
    jr   nz, $+7        ; 2:7/12    1000 ?do_101(r)
    ld    A, 0xE8       ; 2:7       1000 ?do_101(r)
    xor   H             ; 1:4       1000 ?do_101(r)   x[2] = 0xE8
    jr    z, $+16       ; 2:7/12    1000 ?do_101(r)
    push HL             ; 1:11      1000 ?do_101(r)   stop
    exx                 ; 1:4       1000 ?do_101(r)
    pop  DE             ; 1:10      1000 ?do_101(r)   stop
    dec  HL             ; 1:6       1000 ?do_101(r)
    ld  (HL),D          ; 1:7       1000 ?do_101(r)
    dec  HL             ; 1:6       1000 ?do_101(r)
    ld  (HL),E          ; 1:7       1000 ?do_101(r)   stop
    dec  HL             ; 1:6       1000 ?do_101(r)
    ld  (HL),high 1000  ; 2:10      1000 ?do_101(r)   hi index
    dec  HL             ; 1:6       1000 ?do_101(r)
    ld  (HL),low 1000   ; 2:10      1000 ?do_101(r)   lo index
    exx                 ; 1:4       1000 ?do_101(r)
    pop  HL             ; 1:10      1000 ?do_101(r)
    ex   DE, HL         ; 1:4       1000 ?do_101(r)
    jp    z, exit101    ; 3:10      1000 ?do_101(r)
do101:                  ;           1000 ?do_101(r)
                       ;[29:147]
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'PUSH((1000)) QUESTIONDO(R) __SET_LOOP_STEP(101,1)'
 
                       ;[28:172]    (1000) ?do_101(r)   ( stop (1000) -- ) ( R: -- stop (1000) )
    ld   BC,(1000)      ; 4:20      (1000) ?do_101(r)   index
    push BC             ; 1:11      (1000) ?do_101(r)
    push HL             ; 1:11      (1000) ?do_101(r)   stop
    or    A             ; 1:4       (1000) ?do_101(r)
    sbc  HL, BC         ; 2:15      (1000) ?do_101(r)
    exx                 ; 1:4       (1000) ?do_101(r)
    pop  DE             ; 1:10      (1000) ?do_101(r)   stop
    pop  BC             ; 1:10      (1000) ?do_101(r)   index
    jr    z, $+10       ; 2:7/12    (1000) ?do_101(r)
    dec  HL             ; 1:6       (1000) ?do_101(r)
    ld  (HL),D          ; 1:7       (1000) ?do_101(r)   hi stop
    dec  HL             ; 1:6       (1000) ?do_101(r)
    ld  (HL),E          ; 1:7       (1000) ?do_101(r)   lo stop
    dec  HL             ; 1:6       (1000) ?do_101(r)
    ld  (HL),B          ; 1:7       (1000) ?do_101(r)   hi index
    dec  HL             ; 1:6       (1000) ?do_101(r)
    ld  (HL),C          ; 1:7       (1000) ?do_101(r)   lo index
    exx                 ; 1:4       (1000) ?do_101(r)
    pop  HL             ; 1:10      (1000) ?do_101(r)
    ex   DE, HL         ; 1:4       (1000) ?do_101(r)
    jp    z, exit101    ; 3:10      (1000) ?do_101(r)
do101:                  ;           (1000) ?do_101(r)
                       ;[28:172]

atd.

_________________
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: 05.09.2022, 02:11 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
No a predtim jsem hodne zabredl do slov jako

DROP I
DUP I
I PUSH
PUSH I
PUSH I STORE
PUSH I CSTORE

DROP J
PUSH J
PUSH J STORE
PUSH J CSTORE

DROP K
PUSH K
PUSH K STORE
PUSH K CSTORE

U pametove varianty je to snadne, ale jak je tam ras nebo datovy zasobnik a musi se pouzivat slova jako PICK nebo nestanartni RPICK tak to ve skutecnosti znamena vytvorit novy PICK/RPICK pro kazdou variantu.

A jeste u datoveho zasobniku je tezke jak to vubec brat.

DROP I ???
I je vlastne TOS... takze samotne I se zameni za DUP
Takze to beru tak ze tady se I tvari ze o nejakem DROP nevi, predpoklada se ze jsem udelal nejake
PUSH .... .... .... DROP I

DUP I
Tady se to zase bere jako ze je to jedno slovo takze DUP_I se nahradi za DUP_DUP

To same PUSH I se zameni za PUSH OVER. Ve skutecnosti je to teda PUSH_PICK_PUSH_SWAP. Protoze obdobne slovo PUSH2_PICK by delalo trosku neco jineho.

PUSH_PICK_PUSH_SWAP(x,500)
PUSH2_PICK(500,y)

kde x + 1 = y, a x >=0 dela to same.

Pokud by ale nekdo volal PUSH2_PICK(500,0) Tak vlastne vola obycejne PUSH_DUP(500) a nebo PUSH2(500,500).

A jeste vetsi opruz nastane pokud do zacnete psat v asembleru.
Pak se dostanete totiz do situace kdy je X neznama hodnota v dobe prekladu, nebo ukazatel.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_PICK_PUSH_SWAP(0,500)'

    push DE             ; 1:11      0 pick 500 swap   ( a -- a 500 a )
    push HL             ; 1:11      0 pick 500 swap
    ld   DE, 500        ; 3:10      0 pick 500 swap
                       ;[ 5:32]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_OVER(500)'

    push DE             ; 1:11      500 over   ( a -- a 500 a )
    push HL             ; 1:11      500 over
    ld   DE, 500        ; 3:10      500 over
                       ;[ 5:32]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_PICK_PUSH_SWAP(1,500)'

                        ;[6:36]     1 pick 500 swap   ( x1 x0 -- x1 x0 500 x1 )
    push DE             ; 1:11      1 pick 500 swap
    push HL             ; 1:11      1 pick 500 swap
    ld   HL, 500        ; 3:10      1 pick 500 swap
    ex   DE, HL         ; 1:4       1 pick 500 swap
                       ;[ 6:36]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'OVER_PUSH_SWAP(500)'

                        ;[6:36]     over 500 swap   ( x1 x0 -- x1 x0 500 x1 )
    push DE             ; 1:11      over 500 swap
    push HL             ; 1:11      over 500 swap
    ld   HL, 500        ; 3:10      over 500 swap
    ex   DE, HL         ; 1:4       over 500 swap
                       ;[ 6:36]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_PICK_PUSH_SWAP(2,500)'

                       ;[ 9:61]     2 pick 500 swap   ( x2 x1 x0 -- x2 x1 x0 500 x2 )
    pop  BC             ; 1:10      2 pick 500 swap
    push BC             ; 1:11      2 pick 500 swap
    push DE             ; 1:11      2 pick 500 swap
    push HL             ; 1:11      2 pick 500 swap
    ld    L, C          ; 1:4       2 pick 500 swap
    ld    H, B          ; 1:4       2 pick 500 swap
    ld   DE, 500        ; 3:10      2 pick 500 swap
                       ;[ 9:61]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_PICK_PUSH_SWAP(3,500)'

                       ;[11:82]     3 pick 500 swap   ( x3 x2 x1 x0 -- x3 x2 x1 x0 500 x3 )
    pop  AF             ; 1:10      3 pick 500 swap
    pop  BC             ; 1:10      3 pick 500 swap
    push BC             ; 1:11      3 pick 500 swap
    push AF             ; 1:11      3 pick 500 swap
    push DE             ; 1:11      3 pick 500 swap
    push HL             ; 1:11      3 pick 500 swap
    ld    L, C          ; 1:4       3 pick 500 swap
    ld    H, B          ; 1:4       3 pick 500 swap
    ld   DE, 500        ; 3:10      3 pick 500 swap
                       ;[11:82]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_PICK_PUSH_SWAP(4,500)'

                       ;[13:77]     4 pick 500 swap   ( x4 .. x1 x0 -- x4 .. x1 x0 500 x4 )
    push DE             ; 1:11      4 pick 500 swap
    push HL             ; 1:11      4 pick 500 swap
    ld   HL, 0x0008     ; 3:10      4 pick 500 swap
    add  HL, SP         ; 1:11      4 pick 500 swap
    ld    E,(HL)        ; 1:7       4 pick 500 swap
    inc  HL             ; 1:6       4 pick 500 swap
    ld    D,(HL)        ; 1:7       4 pick 500 swap
    ld   HL, 500        ; 3:10      4 pick 500 swap
    ex   DE, HL         ; 1:4       4 pick 500 swap
                       ;[13:77]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_PICK_PUSH_SWAP(5,500)'

                       ;[13:77]     5 pick 500 swap   ( x5 .. x1 x0 -- x5 .. x1 x0 500 x5 )
    push DE             ; 1:11      5 pick 500 swap
    push HL             ; 1:11      5 pick 500 swap
    ld   HL, 0x000A     ; 3:10      5 pick 500 swap
    add  HL, SP         ; 1:11      5 pick 500 swap
    ld    E,(HL)        ; 1:7       5 pick 500 swap
    inc  HL             ; 1:6       5 pick 500 swap
    ld    D,(HL)        ; 1:7       5 pick 500 swap
    ld   HL, 500        ; 3:10      5 pick 500 swap
    ex   DE, HL         ; 1:4       5 pick 500 swap
                       ;[13:77]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_PICK_PUSH_SWAP(aaa,500)'

  ; warning The condition >>>aaa<<< cannot be evaluated
                       ;[13:77]     aaa pick 500 swap   ( xaaa .. x1 x0 -- xaaa .. x1 x0 500 xaaa )
    push DE             ; 1:11      aaa pick 500 swap
    push HL             ; 1:11      aaa pick 500 swap
    ld   HL, 2*(aaa)    ; 3:10      aaa pick 500 swap
    add  HL, SP         ; 1:11      aaa pick 500 swap
    ld    E,(HL)        ; 1:7       aaa pick 500 swap
    inc  HL             ; 1:6       aaa pick 500 swap
    ld    D,(HL)        ; 1:7       aaa pick 500 swap
    ld   HL, 500        ; 3:10      aaa pick 500 swap
    ex   DE, HL         ; 1:4       aaa pick 500 swap
                       ;[13:77]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH_PICK_PUSH_SWAP((aaa),500)'

                       ;[14:94]     (aaa) pick 500 swap   ( x(aaa) .. x1 x0 -- x(aaa) .. x1 x0 500 x(aaa) )
    push DE             ; 1:11      (aaa) pick 500 swap
    push HL             ; 1:11      (aaa) pick 500 swap
    ld   HL, (aaa)      ; 3:16      (aaa) pick 500 swap
    add  HL, HL         ; 1:11      (aaa) pick 500 swap
    add  HL, SP         ; 1:11      (aaa) pick 500 swap
    ld    E,(HL)        ; 1:7       (aaa) pick 500 swap
    inc  HL             ; 1:6       (aaa) pick 500 swap
    ld    D,(HL)        ; 1:7       (aaa) pick 500 swap
    ld   HL, 500        ; 3:10      (aaa) pick 500 swap
    ex   DE, HL         ; 1:4       (aaa) pick 500 swap
                       ;[14:94]

Protoze bych nevedel zda PUSH2_PICK neni volano s nulou tak bych musel pouzit kod vypadajici nejak takto
Kód:
                       ;[16:115]    (aaa) pick 500 swap   ( x(aaa) .. x1 x0 -- x(aaa) .. x1 x0 500 x(aaa) )
    push DE             ; 1:11      (aaa) pick 500 swap
    push HL             ; 1:11      (aaa) pick 500 swap
    ld   HL, 500        ; 3:10      (aaa) pick 500 swap
    push HL             ; 1:11      (aaa) pick 500 swap
    ld   HL, (aaa)      ; 3:16      (aaa) pick 500 swap
    add  HL, HL         ; 1:11      (aaa) pick 500 swap
    add  HL, SP         ; 1:11      (aaa) pick 500 swap
    ld    E,(HL)        ; 1:7       (aaa) pick 500 swap
    inc  HL             ; 1:6       (aaa) pick 500 swap
    ld    D,(HL)        ; 1:7       (aaa) pick 500 swap
    pop  HL             ; 1:10      (aaa) pick 500 swap
    ex   DE, HL         ; 1:4       (aaa) pick 500 swap
                       ;[16:115]

Ulozit a zase vytahnout ze zasobniku o jednu polozku vic, a to jen pro jediny pripad: PUSH2_PICK(???,0)

PUSH I STORE a PUSH I CSTORE ma taky spoustu kodu, ale to nebudu ukazovat.

I PUSH jsem delal narychlo naposledy a jen a pouze pro variantu s I, protoze jsem si vsiml ze to nekde pouzivam.
Nabehl jsem si tim, protoze kdyz vytvorim token __TOKEN_I_PUSH tak se mi tim zrusi jakekoliv dalsi kombinace za PUSH

napr.
I PUSH DO
ma pro me vetsi cenu to rozdelit na I a PUSH_DO
Neco jsem uz opravil a neco jeste ne.

_________________
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ů: 598 ]  Přejít na stránku Předchozí  1 ... 14, 15, 16, 17, 18, 19, 20 ... 40  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 40 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