OldComp.cz

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


Právě je 29.03.2024, 01:37

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 ... 13, 14, 15, 16, 17, 18, 19 ... 39  Další
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 05.08.2022, 04:08 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
To ale fakt neni vsechno... Protoze kdyz jsem ten program psal poprve tak muj main vypadal takto
Kód:
int main()
{   
   char str[] = "The five boxing wizards jump quickly.";
      pangram(str);
   return 0;
}

A sdcc me vygenerovalo ten retezec na zasobnik! Dokonce se pokousel o nejakou chabou optimalizaci prvnich znaku, aby pak vygeneroval neco jako
Kód:
ld hl, offset
add hl,de        ; v de si drzi pocatek retezce, ktera je aktualnim stavem zasobniku, protoze si ho posunul o delku retezce.
ld (hl), znak

Viz cast vlevo na obrazku
Příloha:
Snímek obrazovky_2022-08-04_16-52-01_no_stack_string.png
Snímek obrazovky_2022-08-04_16-52-01_no_stack_string.png [ 591.29 KiB | Zobrazeno 1620 krát ]

Teprve az jsem zmenil retezec na char * str = "The..." tak me pri kompilaci zacal rvat

Pangram.c(76) : warning 196: pointer target lost const qualifier

Zato strcil retezec spravne mimo zasobnik. Viz ta cast vpravo. Jak jsem dlouho nedelal v cecku, tak se me to za tech 5 let myti nadobi v restauraci pro 400 lidi s Portugalci, nasledne s tvrdsimi Polaky, nasledne s jeste odolnejsimi Rumuny a nakonec s Indama, kdy jsem to uz vzdal ja a sel myt jinam, docela vyparilo. .)
Gcc me nic nerikalo, ale taky jsem se nedival co to generuje...

Kdyz uz to ale rve na zasobnik, pro tak komplikovane? Snizit si SP a pak to strkat nad nej. Proc nepouzit PUSH??? Mohl to udela nejak takto
Kód:
_main::
   push ix
   ld   ix, #0
   add  ix, sp
;Pangram.c:23: char str[] = "The five boxing wizards jump quickly.";
   ld   bc, 256*0x0 + '.'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'y' + 'l'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'k' + 'c'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'i' + 'u'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'q' + ' '    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'p' + 'm'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'u' + 'j'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*' ' + 's'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'d' + 'r'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'a' + 'z'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'i' + 'w'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*' ' + 'g'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'n' + 'i'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'x' + 'o'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'b' + ' '    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'e' + 'v'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'i' + 'f'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*' ' + 'e'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'h' + 'T'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT

;Pangram.c:25: printf("%i", pangram(str));
   ld   hl, 0x0000
   add  hl, sp
   call _pangram             ; hl = *str
   ld   bc, #___str_1+0
   push   hl
   push   bc
   call   _printf
   pop   af
   pop   af
;Pangram.c:31: return 0;
   ld   hl, #0x0000
;Pangram.c:32: }
   ld   sp, ix              ; The original stack before allocating the text string to the stack.
   pop  ix
   ret
___str_1:
   .ascii "%i"
   .db 0x00
   .area _CODE
   .area _INITIALIZER
   .area _CABS (ABS)

_________________
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.08.2022, 04:32 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Posledni spam pro dnesni noc.
Kdyz jsem se metodou pokus omyl naucil psat v sdcc vkladany asembler a napsal si sam funkci pro tisk cisla. Protoze kdyz jsem pouzl printf tak se restartoval ZX Spectrum, jsem se dobral vysledku.
Kód:
System                     Forth / C                         Benchmark                     Time (sec/round)
ZX Spectrum Fuse 1.5.7 Ubuntu   M4_FORTH                     Pangram do loop               52.04s   
ZX Spectrum Fuse 1.5.7 Ubuntu   M4_FORTH                     Pangram begin bitset repeat   32.26s   
ZX Spectrum Fuse 1.5.7 Ubuntu   M4_FORTH _TYP_DOUBLE:fast    Pangram begin bitset repeat   27.58s   
ZX Spectrum Fuse 1.5.7 Ubuntu   sdcc 3.8.0 #10562 (Linux)    Pangram                       2m 51.61s

Pokud se to provede 10000x plus jedenkrat navic s vypsanim vysledku -1 nebo 1 pro C.
Forth je 5x nebo 6x rychlejsi s BITSETem.
Je i kratsi, ale to uz ne o tolik.
Cecko ma 338 bajtu s moji pomocnou rutinou pro tisk cisla, ktera je mozna komplikovanejsi jak ten pangram. 3381 bajtu kdyz napisi printf("%i",...)
bitset inline ma 250 bajtu
bitset ma 256 bajtu, je to delsi nez inline varianta protoze se ta funkce volala jen z jednoho mista, takze se nic neusetrilo.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Mam par minut nez pujdu do prace napsat neco noveho.
Ve zkratce nic funkcniho.
Hodne jsem premyslel nad tim spatnym kodem co generuje small device C compiler a hodne moc to bylo o tom ze se nekouka okolo sebe.
Ja se take v makru nekoukam, ale to je az pote co jsem v bashi nasel nejake poradi slov, ze kterych jde udelat "combo".
Ale byla tu jedna moznost jak se divat aspon zpet. Ze si budu drzet v "promennych" co se deje.
A kdyz prepisi vsechna slova tak, ze bych na konci nedelal nejake "ex DE,HL", ale naopak si drzel v promennych jesli je TOS v HL nebo DE a v tom druhem registru ze je NOS.
Tak bych po prepsani vsech zacatku slov na moznost dvou variant (pripadne vic pokud bych pridal dalsi volby) mohl usetrit to "ex DE,HL" a tim se dostat v nejhorsich pripadech uplne na rovinu s variantou, ze mam TOS jen v HL a NOS uz je na zasobniku.
Musel bych osetrit teda jeste vsechny skoky(jr,jp,call), kde bych predtim musel "resetovat" stav na TOS=HL,NOS=DE.

No a pak me doslo, ze nemusim jen znat co bylo, ale dokazi znat i co bude dal v kodu.

Kdyz zmenim pristup ze napr. SWAP vyvola makro ktere vlozi misto toho na vystup "ex DE,HL". Co kdyz SWAP vyvola makro ktere ulozi na zasobnik tokenu __TOKEN_SWAP a nikam nic nevypise.
Pak mohu udelat nad tim zasobnikem tokenu ruzne manipulace pro "comba" co jsem predtim delal v bashi a nemusim s tim trapit programatora. Jedina nevyhoda je jen v tom ze uz vysledny asembler vypada o neco odlisneji od vstupu.

To by vyzadovalo prepsat uplne vsechna slova a rozmyslet se jakou "datovou strukturu" zvolim pro token, jestli to vubec pujde atd.

Takze jsem udelal kopii adresare s celym forthem a zacal experimentovat.

Posledni iterace je ze slova vypadaji nejak takto
Kód:
dnl # ( b a -- a b )
dnl # prohodi vrchol zasobniku s druhou polozkou
define({SWAP},{dnl
__{}__ADD_TOKEN({__TOKEN_SWAP},{swap},$@){}dnl
}){}dnl
dnl
define({__ASM_TOKEN_SWAP},{dnl
__{}define({__INFO},{swap}){}dnl

    ex   DE, HL         ; 1:4       swap ( b a -- a b )}){}dnl
dnl
dnl
dnl # ( -- a )
dnl # push(a) ulozi na zasobnik nasledujici polozku
define({PUSH},{dnl
__{}__ADD_TOKEN({__TOKEN_PUSH},{$1},$@){}dnl
}){}dnl
dnl
define({__ASM_TOKEN_PUSH},{dnl
__{}define({__INFO},{$1}){}dnl
ifelse($1,{},{
__{}__{}.error {$0}(): Missing parameter!},
__{}$#,{1},,{
__{}__{}.error {$0}($@): $# parameters found in macro! Maybe you want to use {PUSH2}($1,$2)?})
                        ;[5:25]     __COMPILE_INFO
    push DE             ; 1:11      __INFO
    ex   DE, HL         ; 1:4       __INFO
    ld   HL, format({%-11s},$1); ifelse(__IS_MEM_REF($1),{1},{3:16},{3:10})      __INFO}){}dnl
dnl

Pomoci sedu jsem si nasel "^device({name},{" a to rozbalil na

device({name},{__ADD_TOKEN(__TOKEN_NAME,{info},$@)})

kde $@ jsou vsechny parametry.

a druhe makro je v podstate to co bylo predtim jen se jmenuje nove __ASM_TOKEN_NAME.

Ty nazvy jsou zvoleny tak abych se vyhnul nejakym problemum co jsem s tim mel, kdyz u tohoto automaticky odstarnuji puvodni _ na zacatku u slov co zacinaji cislovkou.

Struktura TOKEN vypada nejak takto
Kód:
define({__SET_TOKEN},{dnl
__{}define({__TOKEN[}__TOKEN_COUNT{].NAME},{$1}){}dnl
__{}define({__TOKEN[}__TOKEN_COUNT{].INFO},{$2}){}dnl
__{}define({__TOKEN[}__TOKEN_COUNT{].PARAM},(shift(shift($@))))}){}dnl


..a uz me dosel cas psat. Takze jen ukazky

__SHOW_TOKEN(x) je debugovaci vypis pro me
__COMPILE je slovo co ted aktivuje ten zasobnik tokenu
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth_new/M4$ ../check_word.sh 'PUSH(1) PUSH(2) SWAP SWAP EQ  __SHOW_TOKEN(1) __COMPILE'
     
 name: __TOKEN_PUSH
 info: 1 2 swap swap eq
param: (+(1=2))
array1: +(1=2)
array2:
array3:
array: +(1=2)
                        ;[5:25]     1 2 swap swap eq
    push DE             ; 1:11      +(1=2)
    ex   DE, HL         ; 1:4       +(1=2)
    ld   HL, +(1=2)     ; 3:10      +(1=2)
                       ;[ 5:25]
dworkin@dw-A15:~/Programovani/ZX/Forth_new/M4$

Zde je videt jak vlozim oddelene dve cisla, 2x nesmyslne je swapuji takze se vrati na puvodni hodnotu, a pak nad nimi provedu ekvivalenci co vraci nulu nebo -1.

Tady me zachranuje znacne pasmo, ze to umi i kdyby to nebyly cisla, ale neznama promenna. Bohuzel to nezvladne kdyz tam bude minus.
Napadlo ale nekoho dat do prekladace "ld DE,5=3" nebo ld DE,5>3"???

Ma to jeste spoustu much a jsem jen na zacatku prevodu slov, ale potencial pro vyuziti bude fakt velky.
U smycek pujde poznat zda jste pouzili indexy a pokud ne je prepsat na neco lepsiho typu X..-1..0. Atd. je spousta slov co jsem musel resit defenzivne pro nejhorsi scenar.

Vadi me jen ze je to prilis velky skok a nelze to udelat po kruccich. Dale ty zdrojaky nejsou psane pro hromadne zpracovani. Spousta maker je pomocnych a musim je "detokenizovat" po automatickem prepsani sedem.

Fakt uz nemam cas.

PS: Vsimnete si jak jsem u toho "1 2 swap swap eq" udrzoval info tak ze jsem pridaval dalsi slova ktera se spojovala a nakonec z toho vznikl obycejny push ale s infem vseho.
PPS: Bohuzel samozrejme po zmene se objevil novy problem napr s tim ze bash jsem menil komba pomoci smycek, dokud byla zmena tak to proved znovu. Ted to mam jen ze kdyz pridam slovo tak se kouknu co tam bylo a kdyz to jde spojit udelam to, jenze aby tohle fungovalo musim mit "podkomba" vsech "comb". Proste spojnena slova pro "A_B","A_B_C","A_B_C_D" pokud mam kombo "A_B_C_D_E". A ani to neni zaruka ze to bude fungovat! Takze to budu muset provest az na konci nad celym zaaobnikem opakovane, nejedn s poslednim slovem. A to si vyzada praci s posunem a reindexovanim, kdyz me vypadne z pole hodnota.

_________________
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: 11.08.2022, 19:04 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 360 times
Been thanked: 304 times
Snazim se to poctive cist a stihat kazdy dalsi post hned jak vyjde. Jestli jsem stale jeste v obraze nevim, ale kdyby se me zeptal muj pes (manzelka, deti, atd.), tak jim budu tvrdit za samozrejme ano. V kazdem pripade te obdivuji kolik tomu davas casu a usili. Mas muj velky obdiv a, jestli ti to pomuze, tak neprestavej.
Proste, za me fakt dobra prace. FORTH byl kdysi muj oblibeny jazyk a stale s nim mam jeste hodne vzpominek, takze se kazde info snazim velice aktivne hltat.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Pri pridavani pravidel pro spojovani tokenu jsem narazil na neprijemny problem.

Mam ve fronte "token_push" a "token_push", tedy ukladam dve cisla/konstanty --> udelam token_push2
Ted prijde nejaka aritmeticka nebo logicka operace se dvema operandy a ja si overim ze obe cisla dokazi vyhodnotit a zmenim

"token_push2" a "token_add" na obycejny "token_push" a dam mu hodnotu rovnou souctu tech 2 cisel.

Tohle se ale podela kdyz neznam ty hodnoty. Protoze jsem si overil ze PASMO fakt neumi pracovat se zapornymi cisly. Kdyz narazi na necekane minus tak zkolabuje. Da se tomu predejit kdyz se to obali do zavorek, ale on s tim pak zachazi jako s kladnou hodnotou. Jako by udelal -x --> x = -x & 0xFFFF.

Kód:
if 0
db "ULT -5< -5 -3 3 5"
endif
   ld bc,+((-5)<(-5))
   ld de,+((-5)<(-3))
   ld bc,+((-5)<(3))
   ld de,+((-5)<(5))
if 0
db "ULT -3< -5 -3 3 5"
endif
   ld bc,+((-3)<(-5))
   ld de,+((-3)<(-3))
   ld bc,+((-3)<(3))
   ld de,+((-3)<(5))
if 0
db "ULT 3< -5 -3 3 5"
endif
   ld bc,+((3)<(-5))
   ld de,+((3)<(-3))
   ld bc,+((3)<(3))
   ld de,+((3)<(5))
if 0
db "ULT 5< -5 -3 3 5"
endif
   ld bc,+((5)<(-5))
   ld de,+((5)<(-3))
   ld bc,+((5)<(3))
   ld de,+((5)<(5))

A vysledek je
Kód:
      IF (false)
- db "ULT -5< -5 -3 3 5"
      ENDIF
8024:010000   LD BC, 0000
8027:11FFFF   LD DE, FFFF
802A:010000   LD BC, 0000
802D:110000   LD DE, 0000
      IF (false)
- db "ULT -3< -5 -3 3 5"
      ENDIF
8030:010000   LD BC, 0000
8033:110000   LD DE, 0000
8036:010000   LD BC, 0000
8039:110000   LD DE, 0000
      IF (false)
- db "ULT 3< -5 -3 3 5"
      ENDIF
803C:01FFFF   LD BC, FFFF
803F:11FFFF   LD DE, FFFF
8042:010000   LD BC, 0000
8045:11FFFF   LD DE, FFFF
      IF (false)
- db "ULT 5< -5 -3 3 5"
      ENDIF
8048:01FFFF   LD BC, FFFF
804B:11FFFF   LD DE, FFFF
804E:010000   LD BC, 0000
8051:110000   LD DE, 0000

Bez zavorek to nezkompiluje s chybou.

Je to podivne, dela to i kdyz udelam EQU.

_a EQU -5

On si to zase vnitrne prevede na 65531 = 0xFFFB

Kód:
_x EQU -5

   ld de, -5 % 2              ; jediny pripad kdy povazuje zaporne cislo za zaporne
   ld de, -_x % 2            ; jediny pripad kdy povazuje zaporne cislo za zaporne
   ld de, 0xfffb % 2
   ld de, +(-5) % 2
   ld de, _x % 2
   ld de, +(_x) % 2

_x      EQU FFFB
80D8:11FFFF   LD DE, FFFF
80DB:11FFFF   LD DE, FFFF
80DE:110100   LD DE, 0001
80E1:110100   LD DE, 0001
80E4:110100   LD DE, 0001
80E7:110100   LD DE, 0001


A u nasobeni mam problem s tim ze M4 pocita 64 bitove a ja mam vysledky 16 bitove. Takze musim vysledek orezat na 16 bitu, a kdyz to udelam pres x = (x & 0xFFFF). Tak ziskam vzdy kladnou hodnotu. Nenapada me nejak jednoduse jak to prevest zase na cislo se znamenkem. Asi jen pres podminku pokud je znamenkovy bit jednicka (a nebo pokud je cislo > 0x7FFF) tak udelej (0x10000 - x).
Ted to ignoruji a neorezavam, coz muze vest k chybe, pokud to bude vstupem pro dalsi operaci nad tokeny. A vubec nekdy mam pocit, ze na to fakt nemam kapacitu...
Asi budu muset udelat nejake pomocne makro __EVAL16BIT().

[FIXED]
A aby toho nebylo dost tak jsem narazil na dalsi problem i u deleni a zbytku.
FORTH pouziva to sve podlahove deleni, normalni smrtelnik ocekava symetricke, ale taky si nehraje se zapornymi deliteli nebo delenci (hlavne kdyz maji opacne znamenko).

Ja to zatim chapal tak (asi podle vysledku intel instrukci pokud si pamatuji) ze:

1. vysledek ma vzdy znamenko shodne s XOR znamenky delitele a delence.
2. zbytek ma vzdy znamenko delence.

Takze puvodni cislo ziskame pres VYSLEDEK*DELITEL+ZBYTEK

7/3=2 + 1
-7/3=-2 - 1
7/-3=-2 + 1
-7/-3=2 - 1
Takhle mi to i spocita M4 pokud pouziji eval(DELENEC/DELITEL) + eval(DELENEC%DELITEL)

Podlahove deleni ani nechci vysvetlovat, ale existuje na to nejaky prevod z tohoto symetrickeho.

Tak a ted ta pointa. Pri testovani jsem zjistil ze mam chybu v podlahovem deleni nekde u spousty testu. Hledal jsem chybu a zjistil ze ani symetricke deleni me nesedi podle Forthu u jednoho testu. Takze mi ani ten prevod na podlahove nefunguje.

On ma Fort jinou predstavu i o symetrickem deleni nez mam ja, nebo M4!

a ke vsemu i kalkulacka co mam v linuxu ma treti predstavu nez oba dva predchozi.

M4: -7 / 3 = -2
Kalkulacka: -7 / 3 = -2,333 --> int(-2.333) = -2
Forth symetricke: -7 / 3 = -2

M4: -7 mod 3 = -1
Kalkulacka: -7 mod 3 = 2
Forth symetricke: -7 mod 3 = 1 !!!!!!!!!!!! podle https://forth-standard.org/standard/core/SMDivREM

Jeste to musim overit u nejake online Forthu.

Aaaaaa.. takze ztraceny cas, ten test maji asi s chybou. Mozna symetricke je dobre a jen prevod je spatne. Protoze

-7. 3 sm/rem swap . cr . cr
-1 -2

Hura tak jsem to fixnul u FM/MOD. Prvne jsem scital spatnou promennou a pak jeste tam byla blbe umistena zavorka.
[/FIXED]

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Tak to orezani na 16 bit je trosku komplikovanejsi nez jsem si myslel.

Proste se to neda nejak rozumne vyresit.

300*1000=300000 = 0x493E0

po orezani na 16bit je to 0x93E0 = "zaporne cislo".

Moje reseni je ze se drzim signed co to jde. Tim je mysleno, ze v tech makrech drzim textovy retezec cisla s pripadne zapornym znamenkem. Protoze -1 % 2 je neco jineho nez 0xFFFF % 2. I kdyz je to binarne to same.

Pokud je vysledek vetsi jak 0xFFFF tak to orezu a neresim dal. Tady by stalo za uvahu to omezit na 0x7FFF, ale rozumne to nejde. Protoze pokud umazu ten znamenkovy bit tak zase vzniknou problemy = jine chovani nez kdyz by to pocital program v rutine.
Pokud je vysledek mensi jak -0x8000 tak to orezu a neresim dal. Zadne 0x10000-x neprovadim, nebo zachovat znamenkovy bit na jednicce, protoze pak vzniknou jeste vetsi chyby = jine chovani nez kdyz by to pocital program v rutine.

PS: Na githubu je posledni aktualni, ne moc testovana, tokenizovana verze.

Kód:
define({__EVAL_S16},{dnl
__{}define({__EVAL_S16_TMP},eval($2 $1 $3)){}dnl
__{}ifelse(eval(__EVAL_S16_TMP > 0xFFFF),{1},__HEX_HL(__EVAL_S16_TMP),
__{}__{}eval(__EVAL_S16_TMP<-0x8000),{1},__HEX_HL(__EVAL_S16_TMP),
__{}__{}__EVAL_S16_TMP){}dnl
}){}dnl

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Mikes21 píše:
Snazim se to poctive cist a stihat kazdy dalsi post hned jak vyjde. Jestli jsem stale jeste v obraze nevim, ale kdyby se me zeptal muj pes (manzelka, deti, atd.), tak jim budu tvrdit za samozrejme ano. V kazdem pripade te obdivuji kolik tomu davas casu a usili. Mas muj velky obdiv a, jestli ti to pomuze, tak neprestavej.
Proste, za me fakt dobra prace. FORTH byl kdysi muj oblibeny jazyk a stale s nim mam jeste hodne vzpominek, takze se kazde info snazim velice aktivne hltat.


Pointa je v te casti
Mikes21 píše:
muj pes (manzelka, deti, atd.)


Ja se dotal do situace kdy jsem sice v naprosto nadhernem miste. Chesteru. Ale nevychazim ze sveho pokoje, bez znalosti anglictiny, delam dost tezkou praci, s Blekem bych si asi mohl podat ruku, protoze to vypada na schizoidni poruchu osobnosti (ale je to dost tezke se sebediagnostikovat, takze brat s rezervou), drzitel oceneni Darwinovy ceny, osoba ktera me nalakala sem prijet po par tydnech zacala tvrdit ze na me nema cas, protoze musi vydelavat na sve nove kozy. Na kurzy anglictiny se mnou chodit nebude, aplikace dualingo je nanic tak jsem se prestal uplne ucit, na slibovane vylety taky nepujde protoze tam byla uz na rande s nejakym anglicanem. Jak vydelame na pujdeme na vylet do Dublinu. Kdyz jsme poslal penize tak se zrusil. Ze se pujde na dovolenou, ja setril v praci dny na dovolenou a pak se taky nejede. Jak koupim kolo, pojedeme na vylet. Koupim kolo... ze musim mit elektrokolo. Koupil jsem i to elektrokolo, nic....
Potrebuje penize na gauc a ze mi ho pak ukaze. Pak na me krici pred domem, abych se nepriblizoval, ze me jeji bratr nema rad... NEBYL ANI DOMA.
Do konce zivota bude litovat ze me rekla o tech implantatech... Proc teda chtela pujcit penize? Ze ji ublizuji kdyz o tom mluvim. Mimochodem bych byl proti vedet to na co je chce. Neprotebovala to, nemusi mit kazda velke prsa a vedet ze kazdych X let se musi jit na cim dal drazsi operaci, tak bych ji pro jeji dobro nic nepujcil.
Pak mi rekne ze nemam auto... K cemu protrebuji auto kdyz je Chester tak maly?
Chtela me tu jen kvuli autu? Fakt nevim...
BEST FRIEND FOREVER...
Klidne si me blokne na mobilu na rok a necha samotneho, protoze ji pry prinasim vic problemu nez uzitku. Tohle tvrzeni je dost vypovidacjici o hodnotach...
Je toho vic, ale nema to cenu tady ventilovat.
Pripomina me holku co hodi psa do studny a pak tam chodi se divat. "Ty jses jeste porad tady? Ostatni psi uz davno uleteli... Nikdo se nechova jako ty."
Jeji idea je, ze vydelam spousty penez a na stare kolena si najdu nejakou rozvedenou s detmi a budu ji finacne podporovat... Nedoslo ji, ze to asi nepujde kdyz proziji zivot v izolaci.

Podle ni jsem spatny jsem samozrejme ten ja.

Takze tohle je takovy unik (zoufalstvi) jak na to porad nemyslet a nejak se zamestnat necim jinym. Proste mam lepsi pocit s tvoreni nez pasivni konzumace. Ale neni to jedina moznost. Mohl bych treba i hodne cist.

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

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 360 times
Been thanked: 304 times
Hmm, nevim, jestli rozumim, ale slibuji, ze budu cist tve prispevky k $subj mnohem poctiveji a s daleko vetsim respektem nez doposud ;-)

Jeste jsem mel napad k tomu assembleru. Nechces zacit pouzivat nejaky jiny? Sam jsem se s nim taky docela natrapil. Dokonce jsem mel snahu neco opravovat ve src, ale pak jsem to vzdal. Mozna by to chtelo nejaky 'zivy' produkt, kde je mozne resit pripadne opravy a nove funkce.

_________________
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: 16.08.2022, 14:34 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Hral jsem si skoro celou nedeli se smyckama DO LOOP, pripadne ADDLOOP nebo PUSH_ADDLOOP (kdy nezname vstup v dobe prekladu, jinak na to mam slova XDO XLOOP).
Vymyslel jak by to vypadalo resit to 16bitove. Ale stal jsem sam proti sobe, kdy jsem to delal predtim, takze vysledek je sice o par bajtu kratsi, ale o hodne pomalejsi.
Co jsem ovsem mohl udelat lepe je zakladni varianta DO LOOP. Kdy se index inkrementuje o jednicku.
Predtim jsem v dobe kdy jsem musel napsat kod pro DO nemel informaci zda bude nasledovat LOOP nebo +LOOP.
A v pripade +LOOP kde muze byt inkrement rozdilny od jednicky. Takze i zaporny je vyhodnejsi aby kod v DO prvne snizil hodnotu STOP na ktere se to ma zastavit o jednicku. U zakladni varianty DO LOOP to neni potreba takze by se usetrila jedna instrukce "dec DE". Takze bajt a 6 taktu, protoze se to provede jen jednou v DO, ale i ta LOOP smycka pak vypada lepe a je krapet rychlejsi.
Takhle to vypadalo predtim. (Tohle uz nedokazi vyprodukovat bez hackovani, protoze LOOP me automaticky provede v tokenech nejakou akci, popisi pozdeji)
Kód:
    ld  (idx101), HL    ; 3:16      do_101   ( stop index -- )
    dec  DE             ; 1:6       do_101
    ld    A, E          ; 1:4       do_101
    ld  (stp_lo101), A  ; 3:13      do_101   lo stop-1
    ld    A, D          ; 1:4       do_101
    ld  (stp_hi101), A  ; 3:13      do_101   hi stop-1
    pop  DE             ; 1:10      do_101
    pop  HL             ; 1:10      do_101
do101:                  ;           do_101
idx101 EQU $+1          ;[20:78/61] loop_101
    ld   BC, 0x0000     ; 3:10      loop_101   idx always points to a 16-bit index
    ld    A, C          ; 1:4       loop_101
stp_lo101 EQU $+1       ;           loop_101
    xor  0x00           ; 2:7       loop_101   lo index - stop - 1
    ld    A, B          ; 1:4       loop_101
    inc  BC             ; 1:6       loop_101   index++
    ld  (idx101),BC     ; 4:20      loop_101   save index
    jp   nz, do101      ; 3:10      loop_101
stp_hi101 EQU $+1       ;           loop_101
    xor  0x00           ; 2:7       loop_101   hi index - stop - 1
    jp   nz, do101      ; 3:10      loop_101
leave101:               ;           loop_101
exit101:                ;           loop_101
                       ;[34:154]

Takhle to vypada ted. Je to bez toho dec DE a v LOOP mohu ukladat index hned, takze prvni IF nemusi cekat na jeho ulozeni.
Kód:
    ld  (idx101), HL    ; 3:16      do_101   ( stop index -- )
    ld    A, E          ; 1:4       do_101
    ld  (stp_lo101), A  ; 3:13      do_101   lo stop
    ld    A, D          ; 1:4       do_101
    ld  (stp_hi101), A  ; 3:13      do_101   hi stop
    pop  DE             ; 1:10      do_101
    pop  HL             ; 1:10      do_101
do101:                  ;           do_101
idx101 EQU $+1          ;[20:78/57] loop_101
    ld   BC, 0x0000     ; 3:10      loop_101   idx always points to a 16-bit index
    inc  BC             ; 1:6       loop_101   index++
    ld  (idx101), BC    ; 4:20      loop_101   save index
    ld    A, C          ; 1:4       loop_101   lo new index
stp_lo101 EQU $+1       ;           loop_101
    xor  0x00           ; 2:7       loop_101   lo stop
    jp   nz, do101      ; 3:10      loop_101
    ld    A, B          ; 1:4       loop_101   hi new index
stp_hi101 EQU $+1       ;           loop_101
    xor  0x00           ; 2:7       loop_101   hi stop
    jp   nz, do101      ; 3:10      loop_101
leave101:               ;           loop_101
exit101:                ;           loop_101
                       ;[33:148]

Pripadne v pripade ?DO LOOP
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'QUESTIONDO LOOP'
             
    ld  (idx100), HL    ; 3:16      ?do_100   ( stop index -- )
    or    A             ; 1:4       ?do_100
    sbc  HL, DE         ; 2:15      ?do_100
    dec  DE             ; 1:6       ?do_100
    ld    A, E          ; 1:4       ?do_100
    ld  (stp_lo100), A  ; 3:13      ?do_100   lo stop-1
    ld    A, D          ; 1:4       ?do_100
    ld  (stp_hi100), A  ; 3:13      ?do_100   hi stop-1
    pop  HL             ; 1:10      ?do_100
    pop  DE             ; 1:10      ?do_100
    jp    z, exit100    ; 3:10      ?do_100
do100:                  ;           ?do_100
idx101 EQU $+1          ;[20:78/57] loop_101
    ld   BC, 0x0000     ; 3:10      loop_101   idx always points to a 16-bit index
    inc  BC             ; 1:6       loop_101   index++
    ld  (idx101), BC    ; 4:20      loop_101   save index
    ld    A, C          ; 1:4       loop_101   lo new index
stp_lo101 EQU $+1       ;           loop_101
    xor  0x00           ; 2:7       loop_101   lo stop
    jp   nz, do101      ; 3:10      loop_101
    ld    A, B          ; 1:4       loop_101   hi new index
stp_hi101 EQU $+1       ;           loop_101
    xor  0x00           ; 2:7       loop_101   hi stop
    jp   nz, do101      ; 3:10      loop_101
leave101:               ;           loop_101
exit101:                ;           loop_101
                       ;[40:183]


Tohle je pokus o 16 bitovou variantu
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DO_I16 LOOP_I16'
             
    ld  (idx101), HL    ; 3:16      do_101   ( stop index -- )
    ld  (stp101), DE    ; 4:20      do_101
    pop  DE             ; 1:10      do_101
    pop  HL             ; 1:10      do_101
do101:                  ;           do_101
loop101:                ;[18:92]    loop_101
    push HL             ; 1:11      loop_101
idx101 EQU $+1          ;           loop_101
    ld   HL, 0x0000     ; 3:10      loop_101   idx always points to a 16-bit index
    inc  HL             ; 1:6       loop_101   index++
    ld  (idx101), HL    ; 3:16      loop_101   save index
stp101 EQU $+1          ;           loop_101
    ld   BC, 0x0000     ; 3:10      loop_101   stop
    or    A             ; 1:4       loop_101
    sbc  HL, BC         ; 2:15      loop_101   index - stop
    pop  HL             ; 1:10      loop_101
    jp   nz, do101      ; 3:10      loop_101
leave101:               ;           loop_101
exit101:                ;           loop_101
                       ;[27:148]

nebo v pripade ?DO LOOP
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'QDO_I16 LOOP_I16'
             
    ld  (stp101), DE    ; 4:20      do_101   ( stop index -- )
    dec  HL             ; 1:6       do_101
    ld  (idx101), HL    ; 3:16      do_101   index
    pop  HL             ; 1:10      do_101
    pop  DE             ; 1:10      do_101
    jp  loop101         ; 3:10      do_101
do101:                  ;           do_101
loop101:                ;[18:92]    loop_101
    push HL             ; 1:11      loop_101
idx101 EQU $+1          ;           loop_101
    ld   HL, 0x0000     ; 3:10      loop_101   idx always points to a 16-bit index
    inc  HL             ; 1:6       loop_101   index++
    ld  (idx101), HL    ; 3:16      loop_101   save index
stp101 EQU $+1          ;           loop_101
    ld   BC, 0x0000     ; 3:10      loop_101   stop
    or    A             ; 1:4       loop_101
    sbc  HL, BC         ; 2:15      loop_101   index - stop
    pop  HL             ; 1:10      loop_101
    jp   nz, do101      ; 3:10      loop_101
leave101:               ;           loop_101
exit101:                ;           loop_101
                       ;[31:164]


Abych mohl snadno najit par DO-LOOP tak jsem presunul ukladani ciselneho oznaceni smycek do zasobniku z casti kdy generuji kod do casti kdy delam tokeny. Takze ted kdyz napisi DO tak se zvedne pocitadlo smycek a ulozi na zasobnik indexu smycek a vytvori token s parametrem indexu aktualni nove smycky co je na vrcholu toho zasobniku. A kdyz napisi LOOP tak ten dostane parametr z vrcholu zasobniku a vyjme ho. A protoze je to LOOP (pripadne +1 +LOOP, ktere se prevede na LOOP) tak vim ze DO ma byt bez toho snizeni STOP hodnoty tak volam funkci co prochazi frontu tokenu a hleda token __TOKEN_DO s parametrem jaky ma ten LOOP co ukladam a az ho najde tak ho zmeni na __TOKEN_DO_I8 (increment a 8 bit) a __TOKEN_LOOP zmeni na __TOKEN_LOOP_I8. Takze se puvodni kod pro LOOP nikdy uz nevyvola.

_________________
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: 16.08.2022, 15:17 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Jak jsem psal tu 16 bitovou variantu tak jsem si uvedomil, ze v tuhle chvili jsem totalne rozbil moznost modifikaci kodu, pres definovani nejakych hodnot maker jako

define({_TYP_SINGLE},{fast})

Protoze kdyz prvne tokenizuji slova a na konci je rozbalim do kodu tak se me tim meni poradi co vykonavam.

Takze napriklad
Kód:
define({_TYP_SINGLE},{fast})
MUL
define({_TYP_SINGLE},{small})

se me vnitrne prevede na
Kód:
define({_TYP_SINGLE},{fast})
define({_TYP_SINGLE},{small})
MUL

Takze by to generovalo uplne jiny kod. Coz me pripomelo ze potrebuji mit uz i __ASM slovo pro vkladany asembler, aby se vlozil taky na spravne misto.

No a __ASM me uplne zastavil, protoze se me nedarilo to spravne napsat aby to uplne nerozbilo vsechno co jsem delal. Stravil jsem nad tim hodiny, protoze se to spatne debuguje kdyz vam to napise jen ze doslo k preteceni nebo nekde(u toho vypise nic nerikajici udaj) skoncilo makro na konci souboru v parametrech.

K tomu jsem zjistil ze se me rozbiji i PRINT nebo STRING slova. Kdy kdyz napisi PRINT({"SWAP"} tak se vykonaval. Pripadne kdyz mam 2 slova a prvni ma carku tak se to rozbiji.
Kdyz uz jsem udelal neco co PRINT zvladlo tak to rozbilo zase slova jako PUSH(1) PUSH(2) --> PUSH2(1,2).

..ale podarilo se. .)
Postupnou iteraci tam a zpet, zkousenim se chovat v "CASE" k slovum s retezci jinak nez k cislum. K vymysleni ze pridam dalsi parametr kde budu urcovat co za promennou to je (cislo nebo retezec).
Jsem dostal vysledek co zvladne PRINT({" SWAP , DUP "}) i ty PUSH prevody.
Ale __ASM se stale vzpiral.

Protoze regexp co jsem pouzival na oddeleni parametru NEZVLADNE multiline.
Takze jsem se vratil k puvodnimu hacku kdy se zbavuji jednoho rozmeru pole pres volani podfunkce.

Token vypada nejak takto

name: __TOKEN_DO_I8
info: do
param: (101)

Kdy ty zavorky jsou automaticky pridavany do toho parametru. Protoze pak se to chova jako jednorozmerna promenna i kdyz napriklad PUSH2 vypada

name: __TOKEN_PUSH2
info: 5 1
param: (5,1)

a pokud chci druhou hodnotu toho parametru tak volam __GET_TOKEN_ARRAY_2(cislo_tokenu)

Ten zavola __SPOJ s parametry "__2" a parametrem tokenu "(5,1)"
ten to spoji takze vnikne slovo "__2(5,1)" ktere se aktivuje
a __2 vypise druhy parametr.

Kód:
dnl # Fail with multiline...
define({__BOXING},{regexp({$@},{^\(.\)\(.*\)\(.\)$},{\1\1\2\3\3})}){}dnl
define({__UNBOXING},$*){}dnl
dnl
define({__ALL},$@){}dnl
define({__1},{$1}){}dnl
define({__2},{$2}){}dnl
define({__3},{$3}){}dnl
define({__SPOJ},{$1$2}){}dnl
dnl
define({__GET_TOKEN_NAME},  {defn({__TOKEN[$1].NAME})}){}dnl   # __TOKEN_PUSH2
define({__GET_TOKEN_INFO},  {defn({__TOKEN[$1].INFO})}){}dnl   # {1 2}
define({__GET_TOKEN_PARAM}, {defn({__TOKEN[$1].PARAM})}){}dnl  # (1,2)
dnl # Fail with multiline...
define({__GET_TOKEN_ARRAY}, {regexp(defn({__TOKEN[$1].PARAM}),{^(\(.*\))$},{\1})}){}dnl
define({__GET_TOKEN_ARRAY_1},{regexp(defn({__TOKEN[$1].PARAM}),{^(\([^,]*\)[,)]},{\1})}){}dnl
define({__GET_TOKEN_ARRAY_2},{regexp(defn({__TOKEN[$1].PARAM}),{^([^,]*,\([^,]*\)[,)]},{\1})}){}dnl
define({__GET_TOKEN_ARRAY_3},{regexp(defn({__TOKEN[$1].PARAM}),{^([^,]*,[^,]*,\([^,]*\)[,)]},{\1})}){}dnl
dnl # Work with multiline
define({__GET_TOKEN_ARRAY},{__SPOJ({__ALL},defn({__TOKEN[$1].PARAM}))}){}dnl
define({__GET_TOKEN_ARRAY_1},{__SPOJ({__1},defn({__TOKEN[$1].PARAM}))}){}dnl
define({__GET_TOKEN_ARRAY_2},{__SPOJ({__2},defn({__TOKEN[$1].PARAM}))}){}dnl
define({__GET_TOKEN_ARRAY_3},{__SPOJ({__3},defn({__TOKEN[$1].PARAM}))}){}dnl


Postupny zkousenim
{{$@}}
{$@}
$@
{{$*}}
{$*}
$*
u PRINT, STRING, __ASM atd jsem se dostal do stavu kdy vse zase bezi jak ma.

Chtelo to jeste upravit __IS_NUM funkci kdy to ma spravne vratit ze to neni cislo i kdyz tam neni zadne pismeno ale vstup je >>{1,2}<< coz je bohuzel jednorozmerny vstup, pripadne >>"1"<<. A dalsi pomocne funkce.

Jinak multiline vstup jsem nikdy neresil, protoze to nejde udelat z prikazoveho radku. PRINT to napriklad stale nezvladne, musi se pouzit PRINT({"prvni radek", 0x0D, "druhy radek"}). Protoze tam se taky pouzivaji regexpy a navic to skonci na tom ze to generuje

db "prvni radek", 0x0D, "druhy radek"

PS: Pri tom testovani me dostala dalsi chyba kdy v prikazovem radku bashe se chova \1 jinak nez kdyz to mam v souboru. Proste me porad neco nefungovalo, nastesti jsem vedel co me nefunguje. Procital jsem net co delam spatne s tim regularnim vyrazem a stale nic. A v kodu me pouziti \1 fungovalo. Tak jsem napsal uplne stejny kod a... nic. \number proste nevypisoval co mel mit ulozeny pres \(nejaky_match\).
Tak jsem nakonec zkusil jestli to neni tim zpetnym lomitkem... a taky ze jo. \\1 uz fungovalo v prikazovem radku. Ostatni specialni znaky to nemenilo, takze ten regularni vyraz delal co ma jen misto vypisu vse mazal.

PPS: Ted jde pouzit pomoci __ASM ty puvodni prepinace. Proste se napisi dovnitr. Viz
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},{small}) _4OVER define({_TYP_SINGLE},{})'
 
                       ;[24:167]    4over   ( d4 d3 d2 d1 -- d4 d3 d2 d1 d4 d3 )   # default version can be changed with "define({_TYP_SINGLE},{small})"
    push DE             ; 1:11      4over   h g f e d c b . . . b a
    push HL             ; 1:11      4over   h g f e d c b a . . b a
    ld   HL, 0x000F     ; 3:10      4over   h g f e d c b a . . b 15
    add  HL, SP         ; 1:11      4over   h g f e d c b a . . b -
    ld    D,(HL)        ; 1:7       4over   h g f e d c b a . . - -
    dec  HL             ; 1:6       4over   h g f e d c b a . . - -
    ld    E,(HL)        ; 1:7       4over   h g f e d c b a . . h -
    dec  HL             ; 1:6       4over   h g f e d c b a . . h -
    push DE             ; 1:11      4over   h g f e d c b a h . h -
    ld    D,(HL)        ; 1:7       4over   h g f e d c b a h . - -
    dec  HL             ; 1:6       4over   h g f e d c b a h . - -
    ld    E,(HL)        ; 1:7       4over   h g f e d c b a h . g -
    dec  HL             ; 1:6       4over   h g f e d c b a h . g -
    push DE             ; 1:11      4over   h g f e d c b a h g g -
    ld    D,(HL)        ; 1:7       4over   h g f e d c b a h g - -
    dec  HL             ; 1:6       4over   h g f e d c b a h g - -
    ld    E,(HL)        ; 1:7       4over   h g f e d c b a h g f -
    dec  HL             ; 1:6       4over   h g f e d c b a h g f -
    ld    A,(HL)        ; 1:7       4over   h g f e d c b a h g f -
    dec  HL             ; 1:6       4over   h g f e d c b a h g f -
    ld    L,(HL)        ; 1:7       4over   h g f e d c b a h g f -
    ld    H, A          ; 1:4       4over   h g f e d c b a h g f e
                       ;[24:167]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh '__ASM({define({_TYP_SINGLE},{small})}) _4OVER __ASM({define({_TYP_SINGLE},{})})'
                         

                       ;[19:212]    4over   ( d4 d3 d2 d1 -- d4 d3 d2 d1 d4 d3 )   # small version can be changed with "define({_TYP_SINGLE},{default})"
    ex   DE, HL         ; 1:4       4over   h g f e d c . . . . a b
    push HL             ; 1:11      4over   h g f e d c b . . . a b
    ld   HL, 0x000D     ; 3:10      4over   h g f e d c b . . . a 13
    add  HL, SP         ; 1:11      4over   h g f e d c b . . . a -
    ld    B, 0x03       ; 2:7       4over   h g f e d c b . . . a -
    push DE             ; 1:11      4over   h g f e d c b(a-h-g)f -
    ld    D,(HL)        ; 1:7       4over   h g f e d c b(a-h-g)f -
    dec  HL             ; 1:6       4over   h g f e d c b(a-h-g)f -
    ld    E,(HL)        ; 1:7       4over   h g f e d c b(a-h-g)f -
    dec  HL             ; 1:6       4over   h g f e d c b(a-h-g)f -
    djnz $-5            ; 2:8/13    4over   h g f e d c b(a-h-g)f -
    ld    A,(HL)        ; 1:7       4over   h g f e d c b a h g f -
    dec  HL             ; 1:6       4over   h g f e d c b a h g f -
    ld    L,(HL)        ; 1:7       4over   h g f e d c b a h g f -
    ld    H, A          ; 1:4       4over   h g f e d c b a h g f e
                       ;[19:112]

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Jinak jak jsem u DO LOOP aktivoval to pocitadlo smycek v tokenizaci tak jsem tim asi rozbil kombinaci s ostatnimi typy smycek, ktere to tokenizuji az potom. Nemam to overene, nezkousel jsem to. Na prvni pohled by to mohlo fungovat.
Ale mam pocit ze u slov jako I J K, se pouziva jednoty kod. A ted pouzivaji I J K tu novou variantu, takze budou ukazovat hodnoty ze spatnych smycek.
Musim to dodelat az bude cas. Tam mam trochu strach ze slov jako UNLOOP a LEAVE. Zatim neprovadely zadny kod, ale v jinych variantach smycek budou neco delat / uklizet a jak to pujde aktivovat uz v tokenizaci.

_________________
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: 16.08.2022, 15:59 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Zapomnel jsem napsat, ze jsem delal fakt zabavnou cast s PUSH3 a nejaky aritmeticky vyraz pro 2 operandy. Nic sloziteho.

Protoze jsem zkousel napsat PUSH(5) PUSH(10) OVER SUB SUB OR
to by melo udelat:
"5"
"5 10"
"5 10 5"
"5 5"
"0"
"" protoze 0 or

Slova jako PUSH2 OVER nebo PUSH2 DUP vytvori PUSH3 slovo a u neho jsem nemel pravidla na prevod na jiny token s kombinaci s dalsim tokenem. Takze jsem kopiroval co jsem mel u PUSH2 a upravoval to. Musel jsem toho prepsat trosku vic, aby to bylo vic citelne.

__LAST_TOKEN_IS_NUM_1-__LAST_TOKEN_IS_NUM_2

co me kontroluje prvni a druhy parametr u posledniho tokenu zda je to cislo na

__LAST_TOKEN_IS_NUM_1_2

u PUSH3 je to

__LAST_TOKEN_IS_NUM_2_3 a do vysledku se na zacatek pridava __LAST_TOKEN_ARRAY_1, protoze se nemeni.

Je to cele trochu nekoncepcni. Protoze pokud udelam: PUSH(1) PUSH(2) PUSH(3) PUSH(4)

tak to udela: PUSH3(1,2,3) PUSH(4)

a pokud pridam "+" tak je to v haji... :) Udela to PUSH3(1,2,3) PUSH_ADD(4) a ne PUSH3(1,2,7).

Takze by to chtelo token jako __TOKEN_PUSH (1 parametr ) a __TOKEN_PUSHS (2 a vice parametru).

Pravidla by byly o neco komplikovanejsi kdy

__TOKEN_PUSHS __TOKEN_ADD vytvori

__TOKEN_PUSH a nebo __TOKEN_PUSHS

pripadne pokud jeden z poslednich 2 parametru neni znama hodnota tak

__TOKEN_PUSH __TOKEN_PUSH_ADD

nebo

__TOKEN_PUSHS __TOKEN_PUSH_ADD.

Proste by si ukrojil z konce co potrebuje.

Nebo mit jen jeden token pro vkladani cisel.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) PUSH(0x0A)'
 
                        ;[8:42]     5 0x0A
    push DE             ; 1:11      5 0x0A   ( -- 5 0x0A )
    push HL             ; 1:11      5 0x0A
    ld   DE, 0x0005     ; 3:10      5 0x0A
    ld   HL, 0x000A     ; 3:10      5 0x0A
                       ;[ 8:42]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) PUSH(0x0A) OVER'
 
    push DE             ; 1:11      5 0x0A over   ( -- 5 0x0A 5 )
    push HL             ; 1:11      5 0x0A over
    ld   HL, 5          ; 3:10      5 0x0A over
    push HL             ; 1:11      5 0x0A over
    ld   DE, 0x000A     ; 3:10      5 0x0A over
                       ;[ 9:53]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) PUSH(0x0A) OVER SUB'
   
                        ;[7:40]     5 0x0A over -
    push DE             ; 1:11      5 5   ( -- 5 5 )
    push HL             ; 1:11      5 5
    ld   DE, 0x0005     ; 3:10      5 5
    ld    L, E          ; 1:4       5 5   L = E = 0x05
    ld    H, D          ; 1:4       5 5   H = D = 0x00
                       ;[ 7:40]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) PUSH(0x0A) OVER SUB SUB'
   
                        ;[5:25]     5 0x0A over - -
    push DE             ; 1:11      0
    ex   DE, HL         ; 1:4       0
    ld   HL, 0          ; 3:10      0
                       ;[ 5:25]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) PUSH(0x0A) OVER SUB SUB OR'
     
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$

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

                        ;[5:25]     5
    push DE             ; 1:11      5
    ex   DE, HL         ; 1:4       5
    ld   HL, 5          ; 3:10      5
                       ;[ 5:25]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) DUP'
 
                        ;[7:40]     5 dup
    push DE             ; 1:11      5 5   ( -- 5 5 )
    push HL             ; 1:11      5 5
    ld   DE, 0x0005     ; 3:10      5 5
    ld    L, E          ; 1:4       5 5   L = E = 0x05
    ld    H, D          ; 1:4       5 5   H = D = 0x00
                       ;[ 7:40]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) DUP ADD'
 
                        ;[5:25]     5 dup +
    push DE             ; 1:11      10
    ex   DE, HL         ; 1:4       10
    ld   HL, 10         ; 3:10      10
                       ;[ 5:25]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) DUP ADD PUSH(0x0A)'
   
                        ;[7:40]     5 dup + 0x0A
    push DE             ; 1:11      10 0x0A   ( -- 10 0x0A )
    push HL             ; 1:11      10 0x0A
    ld   DE, 0x000A     ; 3:10      10 0x0A
    ld    L, E          ; 1:4       10 0x0A   L = E = 0x0A
    ld    H, D          ; 1:4       10 0x0A   H = D = 0x00
                       ;[ 7:40]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) DUP ADD PUSH(0x0A) SUB'
   
                        ;[5:25]     5 dup + 0x0A -
    push DE             ; 1:11      0
    ex   DE, HL         ; 1:4       0
    ld   HL, 0          ; 3:10      0
                       ;[ 5:25]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(5) DUP ADD PUSH(0x0A) SUB OR'
     
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Opravil jsem LEAVE a UNLOOP pro DO LOOP variantu smycek. Kde jsem prevedl ziskavani cisla smycky do casti kde provadim tokenizaci.
Tim jsem ale v tuto chvili rozbil LEAVE a UNLOOP u vsech ostatnich typů smycek.
U XDO XLOOP varianty se musi pouzit XI XJ XK slova pro ziskani indexu, protoze I J K jsou uz upravena pro DO LOOP.
Zitra mam volny den, tak snad to dotahnu do konce.
Dnes jsem prisel v noci z odpoledni smeny a rano mam dopoledni.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DO I LEAVE UNLOOP DO I J LEAVE UNLOOP DO LEAVE UNLOOP K DROP_K J DROP_J I DROP_I UNLOOP LOOP LEAVE UNLOOP LOOP LEAVE UNLOOP LOOP DO LEAVE UNLOOP I LOOP'
                                                                                                                                                                                                                                                                                                                                                                                                     
    ld  (idx101), HL    ; 3:16      do_101   ( stop index -- )
    ld    A, E          ; 1:4       do_101
    ld  (stp_lo101), A  ; 3:13      do_101   lo stop
    ld    A, D          ; 1:4       do_101
    ld  (stp_hi101), A  ; 3:13      do_101   hi stop
    pop  DE             ; 1:10      do_101
    pop  HL             ; 1:10      do_101
do101:                  ;           do_101
    push DE             ; 1:11      i_101   ( -- i )
    ex   DE, HL         ; 1:4       i_101
    ld   HL, (idx101)   ; 3:16      i_101   idx always points to a 16-bit index
    jp   leave101       ;           leave_101
                        ;           unloop_101
    ld  (idx102), HL    ; 3:16      do_102   ( stop index -- )
    ld    A, E          ; 1:4       do_102
    ld  (stp_lo102), A  ; 3:13      do_102   lo stop
    ld    A, D          ; 1:4       do_102
    ld  (stp_hi102), A  ; 3:13      do_102   hi stop
    pop  DE             ; 1:10      do_102
    pop  HL             ; 1:10      do_102
do102:                  ;           do_102
    push DE             ; 1:11      i_102   ( -- i )
    ex   DE, HL         ; 1:4       i_102
    ld   HL, (idx102)   ; 3:16      i_102   idx always points to a 16-bit index
    push DE             ; 1:11      j_101   ( -- j )
    ex   DE, HL         ; 1:4       j_101
    ld   HL, (idx101)   ; 3:16      j_101   idx always points to a 16-bit index
    jp   leave102       ;           leave_102
                        ;           unloop_102
    ld  (idx103), HL    ; 3:16      do_103   ( stop index -- )
    ld    A, E          ; 1:4       do_103
    ld  (stp_lo103), A  ; 3:13      do_103   lo stop
    ld    A, D          ; 1:4       do_103
    ld  (stp_hi103), A  ; 3:13      do_103   hi stop
    pop  DE             ; 1:10      do_103
    pop  HL             ; 1:10      do_103
do103:                  ;           do_103
    jp   leave103       ;           leave_103
                        ;           unloop_103
    push DE             ; 1:11      k_101
    ex   DE, HL         ; 1:4       k_101
    ld   HL, (idx101)   ; 3:16      k_101   idx always points to a 16-bit index
    ld   HL, (idx101)   ; 3:16      drop k_101   ( x -- k )  idx always points to a 16-bit index
    push DE             ; 1:11      j_102   ( -- j )
    ex   DE, HL         ; 1:4       j_102
    ld   HL, (idx102)   ; 3:16      j_102   idx always points to a 16-bit index
    ld   HL, (idx102)   ; 3:16      drop j_102   ( x -- j )  idx always points to a 16-bit index
    push DE             ; 1:11      i_103   ( -- i )
    ex   DE, HL         ; 1:4       i_103
    ld   HL, (idx103)   ; 3:16      i_103   idx always points to a 16-bit index
    ld   HL, (idx103)   ; 3:16      drop i_103   ( x -- i )  idx always points to a 16-bit index
                        ;           unloop_103
idx103 EQU $+1          ;[20:78/57] loop_103
    ld   BC, 0x0000     ; 3:10      loop_103   idx always points to a 16-bit index
    inc  BC             ; 1:6       loop_103   index++
    ld  (idx103), BC    ; 4:20      loop_103   save index
    ld    A, C          ; 1:4       loop_103   lo new index
stp_lo103 EQU $+1       ;           loop_103
    xor  0x00           ; 2:7       loop_103   lo stop
    jp   nz, do103      ; 3:10      loop_103
    ld    A, B          ; 1:4       loop_103   hi new index
stp_hi103 EQU $+1       ;           loop_103
    xor  0x00           ; 2:7       loop_103   hi stop
    jp   nz, do103      ; 3:10      loop_103
leave103:               ;           loop_103
exit103:                ;           loop_103
    jp   leave102       ;           leave_102
                        ;           unloop_102
idx102 EQU $+1          ;[20:78/57] loop_102
    ld   BC, 0x0000     ; 3:10      loop_102   idx always points to a 16-bit index
    inc  BC             ; 1:6       loop_102   index++
    ld  (idx102), BC    ; 4:20      loop_102   save index
    ld    A, C          ; 1:4       loop_102   lo new index
stp_lo102 EQU $+1       ;           loop_102
    xor  0x00           ; 2:7       loop_102   lo stop
    jp   nz, do102      ; 3:10      loop_102
    ld    A, B          ; 1:4       loop_102   hi new index
stp_hi102 EQU $+1       ;           loop_102
    xor  0x00           ; 2:7       loop_102   hi stop
    jp   nz, do102      ; 3:10      loop_102
leave102:               ;           loop_102
exit102:                ;           loop_102
    jp   leave101       ;           leave_101
                        ;           unloop_101
idx101 EQU $+1          ;[20:78/57] loop_101
    ld   BC, 0x0000     ; 3:10      loop_101   idx always points to a 16-bit index
    inc  BC             ; 1:6       loop_101   index++
    ld  (idx101), BC    ; 4:20      loop_101   save index
    ld    A, C          ; 1:4       loop_101   lo new index
stp_lo101 EQU $+1       ;           loop_101
    xor  0x00           ; 2:7       loop_101   lo stop
    jp   nz, do101      ; 3:10      loop_101
    ld    A, B          ; 1:4       loop_101   hi new index
stp_hi101 EQU $+1       ;           loop_101
    xor  0x00           ; 2:7       loop_101   hi stop
    jp   nz, do101      ; 3:10      loop_101
leave101:               ;           loop_101
exit101:                ;           loop_101
    ld  (idx104), HL    ; 3:16      do_104   ( stop index -- )
    ld    A, E          ; 1:4       do_104
    ld  (stp_lo104), A  ; 3:13      do_104   lo stop
    ld    A, D          ; 1:4       do_104
    ld  (stp_hi104), A  ; 3:13      do_104   hi stop
    pop  DE             ; 1:10      do_104
    pop  HL             ; 1:10      do_104
do104:                  ;           do_104
    jp   leave104       ;           leave_104
                        ;           unloop_104
    push DE             ; 1:11      i_104   ( -- i )
    ex   DE, HL         ; 1:4       i_104
    ld   HL, (idx104)   ; 3:16      i_104   idx always points to a 16-bit index
idx104 EQU $+1          ;[20:78/57] loop_104
    ld   BC, 0x0000     ; 3:10      loop_104   idx always points to a 16-bit index
    inc  BC             ; 1:6       loop_104   index++
    ld  (idx104), BC    ; 4:20      loop_104   save index
    ld    A, C          ; 1:4       loop_104   lo new index
stp_lo104 EQU $+1       ;           loop_104
    xor  0x00           ; 2:7       loop_104   lo stop
    jp   nz, do104      ; 3:10      loop_104
    ld    A, B          ; 1:4       loop_104   hi new index
stp_hi104 EQU $+1       ;           loop_104
    xor  0x00           ; 2:7       loop_104   hi stop
    jp   nz, do104      ; 3:10      loop_104
leave104:               ;           loop_104
exit104:                ;           loop_104
                       ;[176:857]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$


PS: Pridal jsem slova DROP_I, DROP_J, DROP_K

_________________
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: 17.08.2022, 10:21 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
_dworkin: jak dlouho chceš na tom místě kde jsi zůstat? Já jsem na anglinu taky retard, ale mít tu možnost být v tom prostředí, začni do sebe tu anglinu kopat! ;) A na tu ženu se již vyser! ;)

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 17.08.2022, 11:28 
Offline
Óm Nejvyšší
Uživatelský avatar

Registrován: 07.07.2019, 22:14
Příspěvky: 3767
Has thanked: 269 times
Been thanked: 452 times
Přesně, žen opačného pohlaví je 50% populace 8-).


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 ... 13, 14, 15, 16, 17, 18, 19 ... 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 4 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:  
cron
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz