Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
DW0RKiN committed Jun 30, 2022
1 parent 081ed0e commit 870210c
Showing 1 changed file with 293 additions and 139 deletions.

1 comment on commit 870210c

@DW0RKiN
Copy link
Owner Author

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.

Please sign in to comment.