You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The reason will be displayed to describe this comment to others. Learn more.
Pri testovani 64 bitoveho (double) kodu primo v emulatoru jsem mel uz nejaky test pro 16 bitovy (single) kod. Tak jsem ho jen drobne upravil, prejmenoval funkce na neco ted vic logictejsiho, zkopiroval je a upravil pro 64bit. Jako
CALL(x_x_test)
CALL(d_d_test)
CALL(x_p3_test) ; tady je prvni parametr signed/unsigned 16 bit a druhy parametr implicitni +3
CALL(x_m3_test) ; tady je prvni parametr signed/unsigned 16 bit a druhy parametr implicitni -3
No a u toho 32 bitoveho kodu jsem udelal chybu kdy jsem menil
_2PUSH_nejakapodminka_IF na
_4PUSH_Dnejakapodminka_IF
A ja jen pridal D pred jmeno podminky a zapomnel zmenit _2PUSH na _4PUSH. Po kompilaci me pasmo zacalo rvat ze nejaky label je uz definovan. Dival jsem se na to o co jde a videl, ze se me nerozbalilo makro pro cislo v jake urovni jsme v IF a misto cisla to delalo label "endTHEN_STACK:".
Tak jsem resil co jsem v tech makrech udelal za chybu. Po nejake dobe jsem si vsimnnul, ale ze mam ve vyslednem asm kodu nerozbaleny _2PUSH_nejakapodminka_IF, protoze to slovo nezna. Takze je logicke ze pak THEN nema co ukoncovat, kdyz nema zadny IF.
Takze chyba byla ve FORTH programu a ne v prekladaci.
Doslo me, ze by bylo pekne, kdyby to ten prekladac napsal rovnou, protoze mam jen jedno slovo THEN a uprava neni tak slozita. Staci pridat podminku ze kdyz se makro THEN_STACK rovna primo textu THEN_STACK tak vypis chybu ".error THEN for non-existent IF".
To same jsem udelal pro BEGIN strukturu. Jen tam to bylo o dost slozitejsi, protoze u IF ELSE THEN mam jen jedno ELSE a jedno THEN, zato spoustu neco_neco_IF slov. Tak u BEGIN to vypada nejak takto:[code]BEGIN
nejaka_podminka WHILE
nejaka_podminka WHILE
nejake podminka IF BREAK THEN
nejaka_podminka WHILE
ukonceni pres AGAIN,UNTIL,neco_neco_UNTIL,REPEAT[/code]
A vsechny ty varianty pro WHILE, UNTIL, slova jako AGAIN, BREAK a REPEAT atd. musi byt uvnitr BEGIN struktury, protoze BEGIN slovo vypada takto[code]define({BEGIN_COUNT},100)dnl
dnl
dnl ( -- )
define({BEGIN},{define({BEGIN_COUNT}, incr(BEGIN_COUNT))pushdef({BEGIN_STACK}, BEGIN_COUNT)
dnl # begin ... flag until
dnl # begin ... flag while ... repeat
dnl # begin ... again
dnl # begin while repeat
dnl # do { ... if (!) break; } while (1)
begin{}BEGIN_STACK: ; begin BEGIN_STACK})dnl[/code]
Ulozi si na zasobnik jmenem BEGIN_STACK ciselnou hodnotu, pocinaje 101. viz "pushdef({BEGIN_STACK}, BEGIN_COUNT)"
A tu hodnotu BEGIN_STACK pouzivaji vsechny slova, tady nejde jen o slova, ktera obsahuji popdef({BEGIN_STACK}) a snizuji hodnotu zasobniku BEGIN_STACK.
Takze jsem musel kazde slovo osetrit. Pritom jsem narazil i na nejake moje chyby, kdy jsem mel v kodu neco
Pokud je _TYP_DOUBLE rovny function tak udelej tohle. Jenze jsem mel misto
ifelse(_TYP_DOUBLE,{function},{TRUE_VETEV....
napsano
ifelse({_TYP_DOUBLE},{function},{TRUE_VETEV....
takze ta podminka byla vzdy neplatna protoze tohle dela to ze porovna retezec "_TYP_DOUBLE" a "function" jestli neni stejny. M4 vzdy vezme kazde slovo a vykona ho. Pokud je to makro tak ho rozbali a pokracuje dal. Pokud je to v {} tak ty odstrani vypise vnitrek a pokracuje dal. Pokud to nezna tak to jen vypise.
Mimochodem tohle je ten duvod proc pri definici slova by mel byt nazev naopak VZDY v {}. Vse bude pekne fungovat do okamziku kdy se pokusite definovat stejne makro, nebo se stejnym nazvem znovu. Pak se vam rozbali v define(JMENO_MAKRA,{bla bla}).
Takze hotovo, opraveno. Ted bude prekladac rvat chybu ze neni BEGIN nebo IF.
870210c
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pri testovani 64 bitoveho (double) kodu primo v emulatoru jsem mel uz nejaky test pro 16 bitovy (single) kod. Tak jsem ho jen drobne upravil, prejmenoval funkce na neco ted vic logictejsiho, zkopiroval je a upravil pro 64bit. Jako
CALL(x_x_test)
CALL(d_d_test)
CALL(x_p3_test) ; tady je prvni parametr signed/unsigned 16 bit a druhy parametr implicitni +3
CALL(x_m3_test) ; tady je prvni parametr signed/unsigned 16 bit a druhy parametr implicitni -3
No a u toho 32 bitoveho kodu jsem udelal chybu kdy jsem menil
_2PUSH_nejakapodminka_IF na
_4PUSH_Dnejakapodminka_IF
A ja jen pridal D pred jmeno podminky a zapomnel zmenit _2PUSH na _4PUSH. Po kompilaci me pasmo zacalo rvat ze nejaky label je uz definovan. Dival jsem se na to o co jde a videl, ze se me nerozbalilo makro pro cislo v jake urovni jsme v IF a misto cisla to delalo label "endTHEN_STACK:".
Tak jsem resil co jsem v tech makrech udelal za chybu. Po nejake dobe jsem si vsimnnul, ale ze mam ve vyslednem asm kodu nerozbaleny _2PUSH_nejakapodminka_IF, protoze to slovo nezna. Takze je logicke ze pak THEN nema co ukoncovat, kdyz nema zadny IF.
Takze chyba byla ve FORTH programu a ne v prekladaci.
Doslo me, ze by bylo pekne, kdyby to ten prekladac napsal rovnou, protoze mam jen jedno slovo THEN a uprava neni tak slozita. Staci pridat podminku ze kdyz se makro THEN_STACK rovna primo textu THEN_STACK tak vypis chybu ".error THEN for non-existent IF".
To same jsem udelal pro BEGIN strukturu. Jen tam to bylo o dost slozitejsi, protoze u IF ELSE THEN mam jen jedno ELSE a jedno THEN, zato spoustu neco_neco_IF slov. Tak u BEGIN to vypada nejak takto:[code]BEGIN
nejaka_podminka WHILE
nejaka_podminka WHILE
nejake podminka IF BREAK THEN
nejaka_podminka WHILE
ukonceni pres AGAIN,UNTIL,neco_neco_UNTIL,REPEAT[/code]
A vsechny ty varianty pro WHILE, UNTIL, slova jako AGAIN, BREAK a REPEAT atd. musi byt uvnitr BEGIN struktury, protoze BEGIN slovo vypada takto[code]define({BEGIN_COUNT},100)dnl
dnl
dnl ( -- )
define({BEGIN},{define({BEGIN_COUNT}, incr(BEGIN_COUNT))pushdef({BEGIN_STACK}, BEGIN_COUNT)
dnl # begin ... flag until
dnl # begin ... flag while ... repeat
dnl # begin ... again
dnl # begin while repeat
dnl # do { ... if (!) break; } while (1)
begin{}BEGIN_STACK: ; begin BEGIN_STACK})dnl[/code]
Ulozi si na zasobnik jmenem BEGIN_STACK ciselnou hodnotu, pocinaje 101. viz "pushdef({BEGIN_STACK}, BEGIN_COUNT)"
A tu hodnotu BEGIN_STACK pouzivaji vsechny slova, tady nejde jen o slova, ktera obsahuji popdef({BEGIN_STACK}) a snizuji hodnotu zasobniku BEGIN_STACK.
Takze jsem musel kazde slovo osetrit. Pritom jsem narazil i na nejake moje chyby, kdy jsem mel v kodu neco
Pokud je _TYP_DOUBLE rovny function tak udelej tohle. Jenze jsem mel misto
ifelse(_TYP_DOUBLE,{function},{TRUE_VETEV....
napsano
ifelse({_TYP_DOUBLE},{function},{TRUE_VETEV....
takze ta podminka byla vzdy neplatna protoze tohle dela to ze porovna retezec "_TYP_DOUBLE" a "function" jestli neni stejny. M4 vzdy vezme kazde slovo a vykona ho. Pokud je to makro tak ho rozbali a pokracuje dal. Pokud je to v {} tak ty odstrani vypise vnitrek a pokracuje dal. Pokud to nezna tak to jen vypise.
Mimochodem tohle je ten duvod proc pri definici slova by mel byt nazev naopak VZDY v {}. Vse bude pekne fungovat do okamziku kdy se pokusite definovat stejne makro, nebo se stejnym nazvem znovu. Pak se vam rozbali v define(JMENO_MAKRA,{bla bla}).
Takze hotovo, opraveno. Ted bude prekladac rvat chybu ze neni BEGIN nebo IF.