OldComp.cz

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


Právě je 28.03.2024, 22:14

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 ... 17, 18, 19, 20, 21, 22, 23 ... 39  Další
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 13.09.2022, 01:21 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
sjasmplus obsahuje asi chybu

% x%y modulo
mod x mod y modulo

Funguje me jen " mod " varianta.
% vraci vzdy prvni parametr.

_________________
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: 13.09.2022, 07:44 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
_dworkin píše:
sjasmplus obsahuje asi chybu

% x%y modulo
mod x mod y modulo

Funguje me jen " mod " varianta.
% vraci vzdy prvni parametr.
Aj % funguje dobre:
Kód:
 1    0000 3E 02           ld   a, 12 % 5
 2    0002 3E 02           ld   a, 12 mod 5
 3    0004
 4    0004 3E FE           ld   a, -12 % 5
 5    0006 3E FE           ld   a, -12 mod 5
 6    0008
 7    0008 3E 02           ld   a, 12 % -5
 8    000A 3E 02           ld   a, 12 mod -5
 9    000C
10    000C 3E FE           ld   a, -12 % -5
11    000E 3E FE           ld   a, -12 mod -5
Vo vseobecnosti, ak modulo stale vracia prvy parameter, druhy bude asi prilis velky (napr. ze namiesto -5 sa vezme #FFFB). Tiez tam moze byt problem s prioritou (modulo je nizsie ako * / ale vyssie ako + -) kvoli comu sa druha hodnota zle vyhodnoti.


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

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
_dworkin píše:
Myslim ze jsi uplne nepochopil co jsem rikal. Bavime se ted o deleni se znamenkem, to bude asi ten zdroj nepochopeni.
Aha, tak to sa ospravedlnujem. Asi ma pomylilo toto:
_dworkin píše:
sjmasm vypada na prvni pohled ze super, umi ABS takze by to melo vse klapat.
a pochopil to tak, ze by si potreboval aj v Pasmu nejak poriesit absolutnu hodnotu.


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Busy píše:
_dworkin píše:
sjasmplus obsahuje asi chybu

% x%y modulo
mod x mod y modulo

Funguje me jen " mod " varianta.
% vraci vzdy prvni parametr.
Aj % funguje dobre:
Kód:
 1    0000 3E 02           ld   a, 12 % 5
 2    0002 3E 02           ld   a, 12 mod 5
 3    0004
 4    0004 3E FE           ld   a, -12 % 5
 5    0006 3E FE           ld   a, -12 mod 5
 6    0008
 7    0008 3E 02           ld   a, 12 % -5
 8    000A 3E 02           ld   a, 12 mod -5
 9    000C
10    000C 3E FE           ld   a, -12 % -5
11    000E 3E FE           ld   a, -12 mod -5
Vo vseobecnosti, ak modulo stale vracia prvy parameter, druhy bude asi prilis velky (napr. ze namiesto -5 sa vezme #FFFB). Tiez tam moze byt problem s prioritou (modulo je nizsie ako * / ale vyssie ako + -) kvoli comu sa druha hodnota zle vyhodnoti.


Chyba byla mezi klavesnici a zidli. .)

Zkompiloval jsem tvoji ukazku a ...bez chyb. WTF? Takze jina verze sjasmplus to neni.
Udelal jsem si kopii .bash_history do souboru a zkompiloval a ...bez chyb. WTF? Takze ani jine parametry ktere se projevi to nejsou.
Tohle uz bylo fakt divne, protoze jsem 100% tu chybu videl na vlastni oci.
Tak jsem to opakoval prikazy v bashi a ...chyba!
Sakra, jak to? sjasmplus vypise ze je vse v poradku, zadne cervene error a posledni instrukce byla spatne jen pri %.
Ale nahore me varoval bash... ze % je formatovaci parametr pro printf a to jsem prehledl jak jsem se soustredil jen na chybu v kodu... Pokud odmazu zbytek kodu tak prehledne s jedinou instrukci to vypada takto.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 0x8000\n ld hl,10 % 5" | sjasmplus - --lst=smaz && cat smaz
bash: printf: „% 5“: postrádám formátovací znak
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 2 lines, work time: 0.000 seconds
# file opened: <stdin>
1     0000               ORG 0x8000
2     8000 21 0A 00      ld hl,10
# file closed: <stdin>
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 0x8000\n ld hl,10 mod 5" | sjasmplus - --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 2 lines, work time: 0.000 seconds
# file opened: <stdin>
1     0000               ORG 0x8000
2     8000 21 00 00      ld hl,10 mod 5
# file closed: <stdin>
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 0x8000\n ld hl,10 \% 5" | sjasmplus - --lst=smaz && cat smaz
bash: printf: „% 5“: postrádám formátovací znak
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
<stdin>(2): error: Unexpected: \
Pass 3 complete
Errors: 1, warnings: 0, compiled: 2 lines, work time: 0.001 seconds
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 0x8000\n ld hl,10 %% 5" | sjasmplus - --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 2 lines, work time: 0.000 seconds
# file opened: <stdin>
1     0000               ORG 0x8000
2     8000 21 00 00      ld hl,10 % 5
# file closed: <stdin>
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$


PS: ten printf musi sezrat i tu 5 za % protoze ld hl, 10 5 skonci s chybou.
PPS: vlastne to pise v te chybe "% 5"

_________________
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: 13.09.2022, 22:07 
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
ub880d píše:
helo,

rozhodol som sa ze aj napriek nulovej reakcii na moj prechadzajuci prispevok tomu dam este sancu. a aj ked nie som pouzivatelom pasma, dal som si tu namahu a pozrel som jeho zdrojaky... ako sa vravi, najlepsia dokumentacia je zdrojak.

zo zdrojaku (verzia, ktore je v debiane) je jasne vidno, ze unarny '-' operator sa vyhodnoti uplne ako posledny. ze ked je v expression na zaciatku unarny minus, najskor sa vyhodnoti samotna expression ako keby tam ten minus nebol, a az potom sa cely vysledok zneguje, co samozrejme nie je s kostolnym poriadkom, pretoze unarne minus ma vyssiu prioritu ako binarne plus/minus (dokonca ma prioritu vyssiu ako nasobenie/delenie, ale tam to v skutocnosti nevadi, je totiz jedno ci minusom znegujeme iba prvy operand nasobenia alebo az cely vysledok... dokaz ponechavam na domacu ulohu citatela ;])

a to samozrejme plati nie len pre samotny vyraz, ale aj pre kazdy jeho uzatvorkovany podvyraz, vid napr.:
Kód:
$ cat test.asm; pasmo -d -v -8 test.asm test.bin
      org   0x4000
      ld   hl,42+(-123+567)
      ret

Loading file: test.asm in 0
Finished loading file: test.asm in 4
Entering pass 1
Pass 1 finished
Entering pass 2
      ORG 4000
4000:2178FD   LD HL, FD78
4003:C9      RET
Pass 2 finished
Emiting raw binary from 4000 to 4003


vo vysledku mame zjavne zaporne cislo (0xFD78), ale podla matematiky by vysledok mal byt kladny, pretoze vysledok zatvorky je kladny (kedze 567 je viac ako 123) a teda spocitanim cisla 42 a ineho kladneho cisla (mensieho ako 1000, aby som vylucil pretecenie) by mal zostat vysledok kladny.

nuz a tak som ucinil pokus o napravu. v prilohe je patch, ktory by mal tento problem unarneho minus osetrit (ale netvrdim, ze nie je viac podobnych situacii, kde to treba riesit, mozno aj s unarnym logickym NOT?)

po aplikovani patchu dostavam:
Kód:
$ cat test.asm; pasmo -d -v -8 test.asm test.bin
      org   0x4000
      ld   hl,42+(-123+567)
      ret

Loading file: test.asm in 0
Finished loading file: test.asm in 4
Entering pass 1
Pass 1 finished
Entering pass 2
      ORG 4000
4000:21E601   LD HL, 01E6
4003:C9      RET
Pass 2 finished
Emiting raw binary from 4000 to 4003

co znie ovela doveryhodnejsie ;]

pred tym, ako s patchom budem otravovat developera pasma, bolo by dobre (kedze tu mame takyto celkom narocny projekt, ktory tak masivne preveruje vlastnosti kompilera), aby [_dworkin] prilozeny patch experimentalne overil a nejaku dobu aktivne testoval (ci sa patchom nerozbili ine aritmeticke vyrazy a podobne..).

v prilohe je aj patch subor, ktory nesuvisi s touto temou. a sice, v pripade prekladania s parametrom "-8" (na detegovanie instrukcii, ktore i8080 nepozna) dostavame nespravny warning ohladom instrukcie "out (nn),a", ktoru i8080 samozrejme pozna (ako "OUT <NN>"). to sice nema vplyv na vygenerovany bin subor, ale zbytocne to kazi output ;]

ub

p.s.: kedze .txt prilohy stale nie su povolene (!!!) (a asi rovnako aj .patch a .diff, ktore som teraz uz radsej ani neskusal, je to proste opruz zakazdym skusat milion roznych pripon a nakoniec zistit, ze aj tak treba zipovat...), som nuteny dat prilohu na externy server. a to samozrejme implikuje, ze dana priloha bude pristupna len urcitu dobu... takze:

https://sindik.at/~ub880d/tmp/pasmo_una ... _fix.patch
https://sindik.at/~ub880d/tmp/pasmo_out ... _fix.patch


Jen chci napsat že se mi ve všeobecnosti tvé řešení líbí. Tak když už alespoň reakce ode mně... .

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 13.09.2022, 23: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 mam rozdelanou verzi, ktera podporuje aspon nekde sjasmplus, ale cim vic toho udelam tim vic vznikne veci co se maji dodelat.
Mam pocit ze jde vsechno taaaaaaaaaaaak strasne pomalu.
A ztracim se v tom.
Co si mysli programator ze pise.
Co si mysli FORTH.
Co si mysli M4.
Co si mysli sjasmplus nebo pasmo.
A vse by to melo ladit.

Staci jenom blbe ABS a premyslim a premyslim...

abs(-1) je 1 nebo 0xFFFF

No je to prece jedna, ale ja nekdy potrebuji 0xFFFF, takze to asi nechci ABS ale & 0xFFFF...?
Ok, takze existuje abs a cislo se znamenkem, ktere interpretuji jako bez znamenka pres masku.

Ted si ohlidat co dela takove UDIV

-50 10 UDIV

Hmmm, je to bez znamenka takze -50 je spatne. Co to znamena, to znamena ze nechci

abs(-50)/abs(10)

ale

(-50 & 0xFFFF)/(10 & 0xFFFF)

To je vec programatora ze zadal 0xFFCE jako -50

sjasmplus tohle asi spolkne.

Koukam co mam v kodu pro sjasmplus...

abs(-50 << 16)/abs(10 << 16)

hmm to by melo fungovat taky.

Ale co UMDIV, kde delenec je dvojslovo (32 bit)

(-50 & 0xFFFFFFFF)/(10 & 0xFFFF)

tady me posuny asi nepomohou.

Vlastne je to asi spatne kdyz sjasmplus je sice 32 bit ale signed. Takze pokud bude znamenkovy bit jedna tak co udela maska? Zase signed?

A co MMUL kde vstup je 2x signed 16bit a vystup signed 32bit

((-50<<16)>>16)*((10<<16)>>16)

Tady me zase nepomuze maska protoze tentokrat potrebuji interpretovat kladne cislo vetsi jako 0x7FFF jako zaporne.
A vysledek neorezavam takze znamenka jsou dulezita.
Ok, takze existuji i nezaporna cisla, ktera chci naopak interpretovat jako jako se znamenkem.

Ted si pridejte pasmo a jak to pocita M4 a mota se me hlava jen v tom co mam delat, natoz jak.

Takze mam tohle rozdelane, ale stejne kdyz zjistim ze jsem v puvodnim kodu po pridani podpory operaci u kterych neznam hodnotu parametru udelal chybu a neosetril, kdy je vstup pointer si hraji s kodem typu.

Ok mam pointer...
To je konec.
Nebo ne? Co kdyz...
Mam...

0*(pointer)
(pointer)*0
0+(pointer)
(pointer)+0
(pointer)-0
(pointer)*1
1*(pointer)
0xFFFF & (pointer)
0xFFFF | (pointer)
0 & (pointer)
0 | (pointer)
(pointer) & 0xFFFF
(pointer) | 0xFFFF
(pointer) & 0
(pointer) | 0
0 / (pointer)
...atd. To je dost veci na hrani.

A co treba

-1*(pointer)
(pointer)*-1

Ze bych fakt pridal token? Lepsi jak nasobit prece! Ok, takze tohle bude PUSH((pointer)) NEGATE

Hele a tohle muzu delat i pro nezname promenne. To vysledny kod nezlepsi, ale ten vzorec bude kratsi. Ok, az na to minus, protoze jsme v podfunkci.

Muj aktualni kod pro sjasmplus (aspon jedna neznama)
Kód:
define({__EVAL_OP_NUM_XXX_SJASMPLUS},{dnl
__{}ifelse(__IS_NUM($2),0,{define({__TEMP_A},{($2)})},{define({__TEMP_A},{eval($2)})}){}dnl
__{}ifelse(__IS_NUM($3),0,{define({__TEMP_B},{($3)})},{define({__TEMP_B},{eval($3)})}){}dnl
ifelse(1,1,{errprint({
$2 $1 $3
}__TEMP_A{ $1 }__TEMP_B{
})}){}dnl
__{}ifelse(dnl
__{}__{}$1:__HEX_HL($2):__IS_NUM(__TEMP_B), {&:0xFFFF:0},{$3},
__{}__{}$1:__HEX_HL($3):__IS_NUM(__TEMP_A), {&:0xFFFF:0},{$2},
__{}__{}$1:__HEX_HL($2),{&:0x0000},{0},
__{}__{}$1:__HEX_HL($3),{&:0x0000},{0},
__{}__{}$1, {&},{__TEMP_A&__TEMP_B},

__{}__{}$1:__HEX_HL($2):__IS_NUM(__TEMP_B), {|:0x0000:0},{$3},
__{}__{}$1:__HEX_HL($3):__IS_NUM(__TEMP_A), {|:0x0000:0},{$2},
__{}__{}$1:__HEX_HL($2),{|:0xFFFF},{0xFFFF},
__{}__{}$1:__HEX_HL($3),{|:0xFFFF},{0xFFFF},
__{}__{}$1, {|},{__TEMP_A|__TEMP_B},

__{}__{}$1, {^},{__TEMP_A^__TEMP_B},

__{}__{}$1:__TEMP_A, {*:0},{0},
__{}__{}$1:__TEMP_B, {*:0},{0},
__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {*:1:0},{$3},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {*:1:0},{$2},
__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {*:-1:0},{-($3)},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {*:-1:0},{-($2)},
__{}__{}$1,  {*},{((__TEMP_A<<16)>>16)*((__TEMP_B<<16)>>16)},
__{}__{}$1:__TEMP_A, {u*:0},{0},
__{}__{}$1:__TEMP_B, {u*:0},{0},
__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B),{u*:1:0},{$3},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A),{u*:1:0},{$2},
__{}__{}$1,{u*},{(__TEMP_A&0xFFFF)*(__TEMP_B&0xFFFF)},
__{}__{}$1,{um*},{+(($2)&0xFFFF)*(($3)&0xFFFF)},
__{}__{}$1,{sm*},{+(($2<<16)>>16)*(($3<<16)>>16)},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {/:0:0},{0},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {/:1:0},{$2},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {/:-1:0},{-($2)},
__{}__{}$1, {/},{(__TEMP_A<<16)/(__TEMP_B<<16)},
__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {u/:0:0},{0},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {u/:1:0},{$2},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {u/:-1:0},{-($2)},
__{}__{}$1,{u/},{(__TEMP_A&0xFFFF)/(__TEMP_B&0xFFFF)},
__{}__{}$1,{um/},{+(($2)&-1)/(($3)&0xFFFF)},
__{}__{}$1,{sm/},{+($2)/(($3<<16)>>16)},

__{}__{}$1, {%},{(__TEMP_A<<16)mod(__TEMP_B<<16)},
__{}__{}$1,{u%},{(__TEMP_A&0xFFFF)/(__TEMP_B&0xFFFF)},
__{}__{}$1,{um%},{+(($2)&-1)%(($3)&0xFFFF)},
__{}__{}$1,{sm%},{+($2)%(($3<<16)>>16)},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {+:0:0},{$3},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {+:0:0},{$2},
__{}__{}$1, {+},{__TEMP_A+__TEMP_B},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {-:0:0},{-($3)},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {-:0:0},{$2},
__{}__{}$1, {-},{__TEMP_A-__TEMP_B},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {u+:0:0},{abs($3)},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {u+:0:0},{abs($2)},
__{}__{}$1,{u+},{(__TEMP_A&0xFFFF)+(__TEMP_B&0xFFFF)},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {u-:0:0},{-abs($3)},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {u-:0:0},{abs($2)},
__{}__{}$1,{u-},{(__TEMP_A&0xFFFF)-(__TEMP_B&0xFFFF)},
__{}{
__{}__{}  .error __eval_s16 $1 $2 $3}){}dnl
}){}dnl

Chce to testovat a testovat a .... a jeste doplnit "podlahove deleni"
Ten samy kod pro pasmo
Kód:
dnl # Input:
dnl #   operation num_1 xxx
dnl #   operation xxx   num_2
dnl # Output:
dnl #   eval((num1) operation (num2))
define({__EVAL_OP_NUM_XXX_PASMO},{dnl
__{}define({__TEMP_A},{__HEX_HL($2)}){}dnl
__{}define({__TEMP_B},{__HEX_HL($3)}){}dnl
__{}ifelse(substr($1,0,1),{u},,{dnl
__{}__{}ifelse(__HEX_HL($2 & 0x8000),{0x8000},{define({__TEMP_A},eval(__TEMP_A-0x10000))}){}dnl
__{}__{}ifelse(__HEX_HL($3 & 0x8000),{0x8000},{define({__TEMP_B},eval(__TEMP_B-0x10000))}){}dnl
__{}}){}dnl
__{}ifelse(__TEMP_A,{},{define({__TEMP_A},{($2)})},{define({__TEMP_A},{eval($2)})}){}dnl
__{}ifelse(__TEMP_B,{},{define({__TEMP_B},{($3)})},{define({__TEMP_B},{eval($3)})}){}dnl
__{}ifelse(dnl
__{}__{}$1:__HEX_HL($2):__IS_NUM(__TEMP_B), {&:0xFFFF:0},{$3},
__{}__{}$1:__HEX_HL($3):__IS_NUM(__TEMP_A), {&:0xFFFF:0},{$2},
__{}__{}$1:__HEX_HL($2),{&:0x0000},{0},
__{}__{}$1:__HEX_HL($3),{&:0x0000},{0},
__{}__{}$1, {&},{__TEMP_A&__TEMP_B},

__{}__{}$1:__HEX_HL($2):__IS_NUM(__TEMP_B), {|:0x0000:0},{$3},
__{}__{}$1:__HEX_HL($3):__IS_NUM(__TEMP_A), {|:0x0000:0},{$2},
__{}__{}$1:__HEX_HL($2),{|:0xFFFF},{0xFFFF},
__{}__{}$1:__HEX_HL($3),{|:0xFFFF},{0xFFFF},
__{}__{}$1, {|},{__TEMP_A|__TEMP_B},

__{}__{}$1, {^},{__TEMP_A^__TEMP_B},

__{}__{}$1:__TEMP_A, {*:0},{0},
__{}__{}$1:__TEMP_B, {*:0},{0},
__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {*:1:0},{$3},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {*:1:0},{$2},
__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {*:-1:0},{-($3)},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {*:-1:0},{-($2)},
__{}__{}$1, {*},{__TEMP_A*__TEMP_B},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {/:0:0},{0},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {/:1:0},{$2},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {/:-1:0},{-($2)},
__{}__{}$1:__SAVE_EVAL($2>=0),{/:1},{+((~($3))>>15)*__ABS($2)/($3)-(($3)>>15)*__ABS($2)/(-($3))},
__{}__{}$1:__SAVE_EVAL($2<0), {/:1},{+(($3)>>15)*__ABS($2)/(-($3))-((~($3))>>15)*__ABS($2)/($3)},
__{}__{}$1:__SAVE_EVAL($3>=0),{/:1},{+((($2)>>15) xor 1)*($2)/__ABS($3)-(($2)>>15)*(-($2))/__ABS($3)},
__{}__{}$1:__SAVE_EVAL($3<0), {/:1},{+(($2)>>15)*(-($2))/__ABS($3)-((~($2))>>15)*($2)/__ABS($3)},
__{}__{}$1, {/},{dnl
__{}__{}__{}+(((($2)|($3))>>15) xor 1)*($2)/($3)dnl
__{}__{}__{}-(((~($2))&($3))>>15)*($2)/(-($3))dnl
__{}__{}__{}-((($2)&(~($3)))>>15)*(-($2))/($3)dnl
__{}__{}__{}+((($2)&($3))>>15)*(-($2))/(-($3))},

__{}__{}$1, {%},{__TEMP_A mod __TEMP_B},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {+:0:0},{$3},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {+:0:0},{$2},
__{}__{}$1, {+},{__TEMP_A+__TEMP_B},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {-:0:0},{-($3)},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {-:0:0},{$2},
__{}__{}$1, {-},{__TEMP_A-__TEMP_B},

__{}__{}$1:__TEMP_A, {u*:0},{0},
__{}__{}$1:__TEMP_B, {u*:0},{0},
__{}__{}$1,{u*},{__TEMP_A*__TEMP_B},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {u/:0:0},{0},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {u/:1:0},{$2},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {u/:-1:0},{-($2)},
__{}__{}$1,{u/},{+($2)/($3)},
__{}__{}$1,{u%},{abs(__TEMP_A) mod __TEMP_B},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {u+:0:0},{abs($3)},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {u+:0:0},{abs($2)},
__{}__{}$1,{u+},{abs(__TEMP_A)+abs(__TEMP_B)},

__{}__{}$1:__TEMP_A:__IS_NUM(__TEMP_B), {u-:0:0},{-abs($3)},
__{}__{}$1:__TEMP_B:__IS_NUM(__TEMP_A), {u-:0:0},{abs($2)},
__{}__{}$1,{u-},{abs(__TEMP_A)-abs(__TEMP_B)},
__{}{
__{}__{}  .error __eval_s16 $1 $2 $3}){}dnl
}){}dnl

Zase testovat a testovat... to "podlahove deleni" nevim, to bude strasna silenost...

No a kod pro M4 ktery zna oba parametry, takze vraci misto vzorce cislo
Kód:
dnl # Input: operation num_1 num_2
dnl # Output: eval((num1) operation (num2))
define({__EVAL_OP_NUM_NUM},{dnl
__{}define({__TEMP_A},{__HEX_HL($2)}){}dnl
__{}define({__TEMP_B},{__HEX_HL($3)}){}dnl
__{}ifelse(substr($1,0,1),{u},,{dnl
__{}__{}ifelse(__HEX_HL($2 & 0x8000),{0x8000},{define({__TEMP_A},eval(__TEMP_A-0x10000))}){}dnl
__{}__{}ifelse(__HEX_HL($3 & 0x8000),{0x8000},{define({__TEMP_B},eval(__TEMP_B-0x10000))}){}dnl
__{}}){}dnl
__{}ifelse(dnl
__{}__{}$1,  {&},   {define({__TEMP_C},eval(__HEX_HL($2) & __HEX_HL($3)))},
__{}__{}$1,  {|},   {define({__TEMP_C},eval(__HEX_HL($2) | __HEX_HL($3)))},
__{}__{}$1,  {^},   {define({__TEMP_C},eval(__HEX_HL($2) ^ __HEX_HL($3)))},

__{}__{}$1,  {*},   {define({__TEMP_C},eval(__TEMP_A * __TEMP_B))},
__{}__{}$1, {u*},   {define({__TEMP_C},eval(__TEMP_A * __TEMP_B))},
__{}__{}$1, {m*},   {define({__TEMP_C},eval(__TEMP_A * __TEMP_B))},
__{}__{}$1,{um*},   {define({__TEMP_C},eval(__TEMP_A * __TEMP_B))},

__{}__{}$1,  {/},   {define({__TEMP_C},eval(__TEMP_A      / __TEMP_B))},
__{}__{}$1, {u/},   {define({__TEMP_C},eval(__HEX_HL($2)  /__HEX_HL($3)))},
__{}__{}$1,{um/},   {define({__TEMP_C},eval(__HEX_DEHL($2)/__HEX_HL($3)))},
__{}__{}$1,{sm/},   {define({__TEMP_C},eval(($2)          / ($3)))},
__{}__{}$1,{fm/},   {define({__TEMP_C},eval(($2)          / ($3))){}dnl
__{}__{}__{}__{}__{}__{}define({__REM},eval(($2)%($3))){}dnl
__{}__{}__{}__{}__{}__{}ifelse(__REM,0,{},
__{}__{}__{}__{}__{}__{}eval((__REM ^ ($3)) & 0x8000),{0},{},
__{}__{}__{}__{}__{}__{}{define({__TEMP_C},eval(__TEMP_C-1))})},

__{}__{}$1,  {%},   {define({__TEMP_C},eval(__TEMP_A      % __TEMP_B))},
__{}__{}$1, {u%},   {define({__TEMP_C},eval(__HEX_HL($2)  % __HEX_HL($3)))},
__{}__{}$1,{um%},   {define({__TEMP_C},eval(__HEX_DEHL($2)%__HEX_HL($3)))},
__{}__{}$1,{sm%},   {define({__TEMP_C},eval(($2)          % ($3)))},
__{}__{}$1,{fm%},   {define({__TEMP_C},eval(($2)          % ($3))){}dnl
__{}__{}__{}__{}__{}__{}ifelse(__TEMP_C,0,{},
__{}__{}__{}__{}__{}__{}eval((__TEMP_C ^ ($3)) & 0x8000),{0},{},
__{}__{}__{}__{}__{}__{}{define({__TEMP_C},eval($3+__TEMP_C))})},

__{}__{}$1,  {+},   {define({__TEMP_C},eval(__TEMP_A     + __TEMP_B))},
__{}__{}$1, {u+},   {define({__TEMP_C},eval(__HEX_HL($2) + __HEX_HL($3)))},

__{}__{}$1,  {-},   {define({__TEMP_C},eval(__TEMP_A     - __TEMP_B))},
__{}__{}$1, {u-},   {define({__TEMP_C},eval(__HEX_HL($2) - __HEX_HL($3)))},
__{}{
__{}__{}  .error __eval_s16 $1 $2 $3}){}dnl
ifelse(1,1,{errprint({
$0($@)
  __TEMP_A:>}__TEMP_A{<
  __TEMP_B:>}__TEMP_B{<
  __TEMP_C:>}__TEMP_C{<
})}){}dnl
__{}ifelse(dnl
__{}__{}$1,{um*},__HEX_DEHL(__TEMP_C),
__{}__{}$1,{m*},__TEMP_C,
__{}__{}substr($1,0,1),{u},__TEMP_C,
__{}__{}__TO_SIGN(__TEMP_C)){}dnl
}){}dnl

A funkce ktere tohle pouziva
Kód:
define({__EVAL_S16},{dnl
__{}define({__TEMP_A},{__HEX_HL($2)}){}dnl
__{}define({__TEMP_B},{__HEX_HL($3)}){}dnl
__{}ifelse(substr($1,0,1),{u},,{dnl
__{}__{}ifelse(__HEX_HL($2 & 0x8000),{0x8000},{define({__TEMP_A},{eval(__HEX_HL($2)-0x10000)})}){}dnl
__{}__{}ifelse(__HEX_HL($3 & 0x8000),{0x8000},{define({__TEMP_B},{eval(__HEX_HL($3)-0x10000)})}){}dnl
__{}}){}dnl
ifelse(1,1,{errprint({
$0($*)
  __TEMP_A:>}__TEMP_A{<
  __TEMP_B:>}__TEMP_B{<
})}){}dnl
__{}ifelse(__IS_NUM($2):__IS_NUM($3),{1:1},{dnl
__{}__{}ifelse(dnl
__{}__{}__{}$1,  {/mod},{__EVAL_OP_NUM_NUM(  %,$2,$3),__EVAL_OP_NUM_NUM(  /,$2,$3)},
__{}__{}__{}$1, {u/mod},{__EVAL_OP_NUM_NUM( u%,$2,$3),__EVAL_OP_NUM_NUM( u/,$2,$3)},
__{}__{}__{}$1,{um/mod},{__EVAL_OP_NUM_NUM(um%,$2,$3),__EVAL_OP_NUM_NUM(um/,$2,$3)},
__{}__{}__{}$1,{sm/rem},{__EVAL_OP_NUM_NUM(sm%,$2,$3),__EVAL_OP_NUM_NUM(sm/,$2,$3)},
__{}__{}__{}$1,{fm/mod},{__EVAL_OP_NUM_NUM(fm%,$2,$3),__EVAL_OP_NUM_NUM(fm/,$2,$3)},
__{}__{}__{}            {__EVAL_OP_NUM_NUM( $1,$2,$3)}){}dnl
__{}},
__{}__LINKER,{sjasmplus},
__{}{dnl
__{}__{}ifelse(dnl
__{}__{}__{}$1,  {/mod},{__EVAL_OP_NUM_XXX_SJASMPLUS(  %,$2,$3),__EVAL_OP_NUM_XXX_SJASMPLUS(  /,$2,$3)},
__{}__{}__{}$1, {u/mod},{__EVAL_OP_NUM_XXX_SJASMPLUS( u%,$2,$3),__EVAL_OP_NUM_XXX_SJASMPLUS( u/,$2,$3)},
__{}__{}__{}$1,{um/mod},{__EVAL_OP_NUM_XXX_SJASMPLUS(um%,$2,$3),__EVAL_OP_NUM_XXX_SJASMPLUS(um/,$2,$3)},
__{}__{}__{}$1,{sm/rem},{__EVAL_OP_NUM_XXX_SJASMPLUS(sm%,$2,$3),__EVAL_OP_NUM_XXX_SJASMPLUS(sm/,$2,$3)},
__{}__{}__{}$1,{fm/mod},{__EVAL_OP_NUM_XXX_SJASMPLUS(fm%,$2,$3),__EVAL_OP_NUM_XXX_SJASMPLUS(fm/,$2,$3)},
__{}__{}__{}            {__EVAL_OP_NUM_XXX_SJASMPLUS( $1,$2,$3)}){}dnl
__{}},
__{}{dnl
__{}__{}ifelse(dnl
__{}__{}__{}$1,  {/mod},{__EVAL_OP_NUM_XXX_PASMO(  %,$2,$3),__EVAL_OP_NUM_XXX_PASMO(  /,$2,$3)},
__{}__{}__{}$1, {u/mod},{__EVAL_OP_NUM_XXX_PASMO( u%,$2,$3),__EVAL_OP_NUM_XXX_PASMO( u/,$2,$3)},
__{}__{}__{}$1,{um/mod},{__EVAL_OP_NUM_XXX_PASMO(um%,$2,$3),__EVAL_OP_NUM_XXX_PASMO(um/,$2,$3)},
__{}__{}__{}$1,{sm/rem},{__EVAL_OP_NUM_XXX_PASMO(sm%,$2,$3),__EVAL_OP_NUM_XXX_PASMO(sm/,$2,$3)},
__{}__{}__{}$1,{fm/mod},{__EVAL_OP_NUM_XXX_PASMO(fm%,$2,$3),__EVAL_OP_NUM_XXX_PASMO(fm/,$2,$3)},
__{}__{}__{}            {__EVAL_OP_NUM_XXX_PASMO( $1,$2,$3)}){}dnl
__{}}){}dnl
}){}dnl

A to zase pouziva case pri vkladani tokenu.

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


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Lisiak4 píše:
ub880d píše:
helo,

rozhodol som sa ze aj napriek nulovej reakcii na moj prechadzajuci prispevok tomu dam este sancu. a aj ked nie som pouzivatelom pasma, dal som si tu namahu a pozrel som jeho zdrojaky... ako sa vravi, najlepsia dokumentacia je zdrojak.

zo zdrojaku (verzia, ktore je v debiane) je jasne vidno, ze unarny '-' operator sa vyhodnoti uplne ako posledny. ze ked je v expression na zaciatku unarny minus, najskor sa vyhodnoti samotna expression ako keby tam ten minus nebol, a az potom sa cely vysledok zneguje, co samozrejme nie je s kostolnym poriadkom, pretoze unarne minus ma vyssiu prioritu ako binarne plus/minus (dokonca ma prioritu vyssiu ako nasobenie/delenie, ale tam to v skutocnosti nevadi, je totiz jedno ci minusom znegujeme iba prvy operand nasobenia alebo az cely vysledok... dokaz ponechavam na domacu ulohu citatela ;])

a to samozrejme plati nie len pre samotny vyraz, ale aj pre kazdy jeho uzatvorkovany podvyraz, vid napr.:
Kód:
$ cat test.asm; pasmo -d -v -8 test.asm test.bin
      org   0x4000
      ld   hl,42+(-123+567)
      ret

Loading file: test.asm in 0
Finished loading file: test.asm in 4
Entering pass 1
Pass 1 finished
Entering pass 2
      ORG 4000
4000:2178FD   LD HL, FD78
4003:C9      RET
Pass 2 finished
Emiting raw binary from 4000 to 4003


vo vysledku mame zjavne zaporne cislo (0xFD78), ale podla matematiky by vysledok mal byt kladny, pretoze vysledok zatvorky je kladny (kedze 567 je viac ako 123) a teda spocitanim cisla 42 a ineho kladneho cisla (mensieho ako 1000, aby som vylucil pretecenie) by mal zostat vysledok kladny.

nuz a tak som ucinil pokus o napravu. v prilohe je patch, ktory by mal tento problem unarneho minus osetrit (ale netvrdim, ze nie je viac podobnych situacii, kde to treba riesit, mozno aj s unarnym logickym NOT?)

po aplikovani patchu dostavam:
Kód:
$ cat test.asm; pasmo -d -v -8 test.asm test.bin
      org   0x4000
      ld   hl,42+(-123+567)
      ret

Loading file: test.asm in 0
Finished loading file: test.asm in 4
Entering pass 1
Pass 1 finished
Entering pass 2
      ORG 4000
4000:21E601   LD HL, 01E6
4003:C9      RET
Pass 2 finished
Emiting raw binary from 4000 to 4003

co znie ovela doveryhodnejsie ;]

pred tym, ako s patchom budem otravovat developera pasma, bolo by dobre (kedze tu mame takyto celkom narocny projekt, ktory tak masivne preveruje vlastnosti kompilera), aby [_dworkin] prilozeny patch experimentalne overil a nejaku dobu aktivne testoval (ci sa patchom nerozbili ine aritmeticke vyrazy a podobne..).

v prilohe je aj patch subor, ktory nesuvisi s touto temou. a sice, v pripade prekladania s parametrom "-8" (na detegovanie instrukcii, ktore i8080 nepozna) dostavame nespravny warning ohladom instrukcie "out (nn),a", ktoru i8080 samozrejme pozna (ako "OUT <NN>"). to sice nema vplyv na vygenerovany bin subor, ale zbytocne to kazi output ;]

ub

p.s.: kedze .txt prilohy stale nie su povolene (!!!) (a asi rovnako aj .patch a .diff, ktore som teraz uz radsej ani neskusal, je to proste opruz zakazdym skusat milion roznych pripon a nakoniec zistit, ze aj tak treba zipovat...), som nuteny dat prilohu na externy server. a to samozrejme implikuje, ze dana priloha bude pristupna len urcitu dobu... takze:

https://sindik.at/~ub880d/tmp/pasmo_una ... _fix.patch
https://sindik.at/~ub880d/tmp/pasmo_out ... _fix.patch


Jen chci napsat že se mi ve všeobecnosti tvé řešení líbí. Tak když už alespoň reakce ode mně... .



ub880d SORRRRRY! Uplne jsem te prehledl. Musel jsem si to sam zaspamovat.

To je naprosto uzasne. Nenapadlo me opravovat primo zdrojak pasma. Protoze to vypadalo na 17 let mrtvy projekt. Ale pokud dokazes opravit balik co je v debiane, takze vlastne po case i v ubuntu a po case i v mem xubuntu tak by to bylo super.
To fakt jde?
Ne, ze bych neveril opensource, ale asi tak nejvic je pokusit se nekde nahlasit chybu pro me...
Stahnu to a budu zkouset.

To co popisujes je presne to chovani co jsem vypozoroval a popsal. Prvni minus a nebo prvni po zavorce se provede nakonec.
Popravde ma Pasmo vic veci co me trapi a delaji kod tezsi.
Napriklad staci kdyz scitam dva vstupy o kterych nic nevim.

xxx + yyy

Tak je to jen scitani takze nepotrebuji nic ozavorkovavat.

Chyba! Staci aby yyy bylo "-10" a vypada to

xxx + -10 a tohle Pasmo nevezme. M4 v klidu ano.

Takze ja pak musim psat

xxx+(yyy)

kdyz xxx zacina -

0-xxx+(yyy)

kdyz yyy zacina taky -

0-xxx+(0-yyy)

Mohl bych delat analyzu xxx, ze je to treba jen slovo a ne vyraz/vzorec. Takze by to mohlo byt

0-xxx-yyy

Ale mam to zjednodusene a delam jen

++ ==> +
-- ==> +
-+ ==> -
+- ==> -
ani to asi nemam nejak osefovane kdy se me zpetne vytvori podminka co jsem uz delal.
(- ==> (0-
^- ==> 0-

Takze to ze +- a -+ Pasmo nezvladne povazuji trochu za chybu. Jinak bych mohl problemy Pasma resit klidne
0+....
( --> (0+
A ta druha chyba s unarnim minusem se spatnou prioritou by byla eliminovana.

PS: Ok stahuji a zkousim.

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


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
ub880d píše:
_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 ***


Tak jeste reakce na tento prispevek.

Prvne zase omluva, ze jsem nereagoval.

Neni to navestim, ja tam ani zadne v testovacim kodu nemel.

Ten manual opravdu muze byt k uplne jinemu programu se stejnym nazvem. z80asm je takove hodne univerzalni pojmenovani.

Ukazka zkraceneho kodu (bez maker a dalsich) co tomu predhodim, abych videl co to umi
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ cat -n z80asm_ld_condition.asm
     1    ORG 0x8000
     2     _a EQU 604
     3   _b EQU 0x604
     4    _c: EQU 604
     5   _d: EQU 0x604
     6    
     7   if 0
     8   DB "EQ"
     9   endif
    10      ld bc,5=3
    11      ld de,5=5
    12      ld bc,+(5=3)
    13      ld de,+(5=5)
    14      ld bc,+((-5)=(-3))
    15      ld de,+((-5)=(-5))
    16      ld de,0+((-5)=(-5))
    17      
    18      ld bc,+2*0x8000
    19      ld bc,-2*0x8000
    20      ld bc,+1*0x8000
    21      ld bc,-1*0x8000
    22      ld bc,+2*(-1)
    23      ld bc,-2*(-1)
    24      ld bc,+1*(-1)
    25      ld bc,-1*(-1)
    26      ld DE,+2/(-1)
    27      ld DE,-2/(-1)
    28      ld DE,+1/(-1)
    29      ld DE,-1/(-1)
    30      
    31      ld hl, -5 % 2
    32      ld hl, -(2-1) % 2
    33      ld hl, -(1-2) % 2
    34              
    35   _x: EQU -5
    36    _y EQU -5
    37      ld de, -5 % 2
    38      ld de, -_x % 2
    39      ld de, 0xfffb % 2
    40      ld de, +(-5) % 2
    41      ld de, _x % 2
    42      ld de, 0+(_x) % 2
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ z80asm z80asm_ld_condition.asm
z80asm_ld_condition.asm:2: error: command or comment expected (was _a EQU 604 )
z80asm_ld_condition.asm:3: error: command or comment expected (was _b EQU 0x604 )
z80asm_ld_condition.asm:12: warning: expression fully enclosed in parenthesis
z80asm_ld_condition.asm:13: warning: expression fully enclosed in parenthesis
z80asm_ld_condition.asm:14: warning: expression fully enclosed in parenthesis
z80asm_ld_condition.asm:15: warning: expression fully enclosed in parenthesis
z80asm_ld_condition.asm:18: warning: word value 65536 (0x10000) truncated
z80asm_ld_condition.asm:19: warning: word value -65536 (0xffff0000) truncated
z80asm_ld_condition.asm:36: error: command or comment expected (was _y EQU -5 )
z80asm_ld_condition.asm:42: error: unable to resolve reference: 0+(_x) % 2
z80asm_ld_condition.asm:42: error: unable to resolve reference: _x % 2
z80asm_ld_condition.asm:42: error: unable to resolve reference: +(-5) % 2
z80asm_ld_condition.asm:42: error: unable to resolve reference: 0xfffb % 2
z80asm_ld_condition.asm:42: error: unable to resolve reference: -_x % 2
z80asm_ld_condition.asm:42: error: unable to resolve reference: -5 % 2
z80asm_ld_condition.asm:42: error: unable to resolve reference: -(1-2) % 2
z80asm_ld_condition.asm:42: error: unable to resolve reference: -(2-1) % 2
z80asm_ld_condition.asm:42: error: unable to resolve reference: -5 % 2
*** 12 errors found ***

To je pak tezke nekde zacist, hodne zvlastni je ten konec protoze to neni na radku 42, viz "cat -n"
Pokusil jsem se pouzit ty dvojtecky u EQU, tim se odstrani chyba ale pak netusim jak to pouzivat.
Vadi mu ze vyraz je cely v zavorce i kdyz ma plus na zacatku.
Jde to obejit (viz radek 16) pres 0+

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


Naposledy upravil _dworkin dne 14.09.2022, 00:52, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 14.09.2022, 00:51 
Offline
Kecálek

Registrován: 10.07.2014, 01:57
Příspěvky: 168
Has thanked: 25 times
Been thanked: 225 times
_dworkin píše:
To je naprosto uzasne. Nenapadlo me opravovat primo zdrojak pasma. Protoze to vypadalo na 17 let mrtvy projekt. Ale pokud dokazes opravit balik co je v debiane, takze vlastne po case i v ubuntu a po case i v mem xubuntu tak by to bylo super.
To fakt jde?


s ubuntu skusenosti nemam, ale mam za to, ze je to (ako odnoz debianu) velmi podobne.

v debiane som si pridal medzi repozitare do /etc/apt/sources.list zaznam s "apt-src" na zaciatku (v skutocnosti som ho tam uz mal, rovnaky ako s "apt" na zaciatku, ale proste na stiahnutie zdrojakoveho balika treba zaznam s "apt-src")

samozrejme potom este bolo treba doinstalovat balik apt-src (rovnako ako zaznam v sources.list, aj tento balik mam uz davno, ale nie je instalovany by default, takze je pravdepodobne, ze ho budes musiet doinstalovat manualne).

no a potom som spravil:
Kód:
$ mkdir ~/tmp/aptsrc
$ cd ~/tmp/aptsrc
$ wget https://sindik.at/~ub880d/tmp/pasmo_unary_minus_fix.patch
$ apt-src install pasmo
$ cd pasmo-0.5.3
$ patch -p2 < ../pasmo_unary_minus_fix.patch
$ cd ..
$ apt-src build pasmo


ono, mozno je lepsie si to nedavat do ~/tmp ale niekam do "nie-tmp" adresara, pretoze apt-src si vytvara svoju databazu "nainstalovanych" balikov... toto je len ako ukazka, ako to ide spravit...

po zadani tohoto vsetkeho to skompiluje balik pasmo_0.5.3-7_i386.deb s prislusnymi zmenami a takyto balik si potom vies nainstalovat. samozrejme, nie je to na (a ani nikoho tymto na take nenabadam) sirenie zmodifikovaneho balika (minimalne kvoli chybajucim referenciam ku zmenam a pravdepodobne by ho bolo aj treba nejako podpisat), ale na take to "domace zuvanie" sa to pouzit da.

ub.


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
ub880d píše:
_dworkin píše:
To je naprosto uzasne. Nenapadlo me opravovat primo zdrojak pasma. Protoze to vypadalo na 17 let mrtvy projekt. Ale pokud dokazes opravit balik co je v debiane, takze vlastne po case i v ubuntu a po case i v mem xubuntu tak by to bylo super.
To fakt jde?


s ubuntu skusenosti nemam, ale mam za to, ze je to (ako odnoz debianu) velmi podobne.

v debiane som si pridal medzi repozitare do /etc/apt/sources.list zaznam s "apt-src" na zaciatku (v skutocnosti som ho tam uz mal, rovnaky ako s "apt" na zaciatku, ale proste na stiahnutie zdrojakoveho balika treba zaznam s "apt-src")

samozrejme potom este bolo treba doinstalovat balik apt-src (rovnako ako zaznam v sources.list, aj tento balik mam uz davno, ale nie je instalovany by default, takze je pravdepodobne, ze ho budes musiet doinstalovat manualne).

no a potom som spravil:
Kód:
$ mkdir ~/tmp/aptsrc
$ cd ~/tmp/aprsrc
$ wget https://sindik.at/~ub880d/tmp/pasmo_unary_minus_fix.patch
$ apt-src install pasmo
$ cd pasmo-0.5.3
$ patch -p2 < ../pasmo_unary_minus_fix.patch
$ cd ..
$ apt-src build pasmo


ono, mozno je lepsie si to nedavat do ~/tmp ale niekam do "nie-tmp" adresara, pretoze apt-src si vytvara svoju databazu "nainstalovanych" balikov... toto je len ako ukazka, ako to ide spravit...

po zadani tohoto vsetkeho to skompiluje balik pasmo_0.5.3-7_i386.deb s prislusnymi zmenami a takyto balik si potom vies nainstalovat. samozrejme, nie je to na (a ani nikoho tymto na take nenabadam) sirenie zmodifikovaneho balika (minimalne kvoli chybajucim referenciam ku zmenam a pravdepodobne by ho bolo aj treba nejako podpisat), ale na take to "domace zuvanie" sa to pouzit da.

ub.


Lol zrovna jsem resil jak ten patch udelat.
Protoze v system nemam zdrojaky k pasmu, hledal jsem to

dworkin@dw-A15:/$ find -name pasmo 2>/dev/null
./usr/share/doc-base/pasmo
./usr/share/doc/pasmo
./usr/bin/pasmo
./var/lib/doc-base/documents/pasmo

A mam jen binarku a manualove stranky nebo co.

Kdyz jsem prohlizel synaptic tak jediny balik co k tomu je mam naistalovany.

Takze jsem hledal na netu a tohle vypada jako mozna prave ubunti stranky

https://launchpad.net/ubuntu/+source/pa ... .3-6build1

se zrojakem doufam a ze to rucne prepisi podle tve ukazky, protoze s gitem neumim pracovat... .) Github pouzivam pres webove rozhrani a nekdy je to k vzteku kdyz omylem nahrajes soubory do spatneho adresare a chtel bys to proste tu zmenu vratit, nebo resis ze musis mit mene jak 100 souboru.

PS: Koukam ze podle tveho navodu bych to asi dal dohromady, no co uz...

Stahl jsem si z tech stranek balik, nasel asm.cpp a rucne zeditoval. Fakt staci prikaz patch? Tohle bych si mel nastudovat, nastesti toho nebylo mnoho a udelal jsem to rucne, priste to budu delat ale od spodnich radku at si nemenim cislovani.

./configure
make
make install

...

sudo make install

je sice asi zastarale ale funguje. Az na to ze jsem si tim prepsal jedinou binarku takze ted jsme jediny dva na svete kdo to tak ma.
Takze pisi prekladac uz fakt pro sebe? .)))

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ cat -n new_pasmo.asm
     1    ORG 0x8000
     2    if -1-1
     3   db "-1-1"
     4    endif
     5   
     6    ld hl,-0x101
     7    ld hl,0-0x100-1
     8    ld hl,-0x100-1
     9    ld hl,+(-0x100-1)
    10    ld hl,+(0-0x100-1)
    11   ; ld hl,10+-10
    12   
    13   _a EQU -10
    14   _b EQU -5
    15   
    16    ld hl,_a*1
    17    ld hl,_b*_a
    18    ld hl,_a/_b
    19    ld hl,+(0-10)/(0-5)
    20    ld hl,10/5
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ pasmo -d new_pasmo.asm smaz
      ORG 8000
      IF (true)
8000:2D312D31   DEFB of 4 bytes
      ENDIF
8004:21FFFE   LD HL, FEFF
8007:21FFFE   LD HL, FEFF
800A:21FFFE   LD HL, FEFF
800D:21FFFE   LD HL, FEFF
8010:21FFFE   LD HL, FEFF
_a      EQU FFF6
_b      EQU FFFB
8013:21F6FF   LD HL, FFF6
8016:213200   LD HL, 0032
8019:210000   LD HL, 0000
801C:210000   LD HL, 0000
801F:210200   LD HL, 0002
Emiting raw binary from 8000 to 8021


Opravi to i vyrazy v IF uz to neni false.

EQU si to prevede na unsigned, ale to je vlastnost.

-10/-5 se tomu stejne nikdy nepodari predhodit, kdyz nad tim tak premyslim tak pasmo nezvladne 2 operatory za sebou, neco jako 10/-5 nebo 10*-5.
Pritom parsovat matematicky vyraz a odstranovat zavorky a vyhodnotit to jsem kdysi napsal v nejakem cviceni pro FIT i ja. A to tam byly i goniometricke funkce a logaritmy.
Asi bych to zvladl i v makru, jen bych na to musel jit nejak pres regularni gramatiku.

PPS: Prejmenoval jsem /usr/bin/pasmo na pasmo_fix
Preinstaloval pasmo pres synaptic

spustil
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ /usr/bin/pasmo -d new_pasmo.asm smaz
      ORG 8000
      IF (false)
- db "-1-1"
      ENDIF
8000:21FFFE   LD HL, FEFF
8003:21FFFE   LD HL, FEFF
8006:2101FF   LD HL, FF01
8009:2101FF   LD HL, FF01
800C:21FFFE   LD HL, FEFF
_a      EQU FFF6
_b      EQU FFFB
800F:21F6FF   LD HL, FFF6
8012:213200   LD HL, 0032
8015:210000   LD HL, 0000
8018:210000   LD HL, 0000
801B:210200   LD HL, 0002
Emiting raw binary from 8000 to 801D
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ /usr/bin/pasmo_fix -d new_pasmo.asm smaz
      ORG 8000
      IF (false)
- db "-1-1"
      ENDIF
8000:21FFFE   LD HL, FEFF
8003:21FFFE   LD HL, FEFF
8006:2101FF   LD HL, FF01
8009:2101FF   LD HL, FF01
800C:21FFFE   LD HL, FEFF
_a      EQU FFF6
_b      EQU FFFB
800F:21F6FF   LD HL, FFF6
8012:213200   LD HL, 0032
8015:210000   LD HL, 0000
8018:210000   LD HL, 0000
801B:210200   LD HL, 0002
Emiting raw binary from 8000 to 801D
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$

Tohle fakt nechapu, to je to jen odkaz. Uz predtim bylo divne ze ten soubor mel posledni zmenu 2020. Budu resit jindy rano musim do prace.

PPPS: tohle je jeste vtipnejsi
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ pasmo -d new_pasmo.asm smaz
      ORG 8000
      IF (true)
8000:2D312D31   DEFB of 4 bytes
      ENDIF
8004:21FFFE   LD HL, FEFF
8007:21FFFE   LD HL, FEFF
800A:21FFFE   LD HL, FEFF
800D:21FFFE   LD HL, FEFF
8010:21FFFE   LD HL, FEFF
_a      EQU FFF6
_b      EQU FFFB
8013:21F6FF   LD HL, FFF6
8016:213200   LD HL, 0032
8019:210000   LD HL, 0000
801C:210000   LD HL, 0000
801F:210200   LD HL, 0002
Emiting raw binary from 8000 to 8021
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$

Chvilku jsem nechapal, nez me doslo ze predtim jsem uvedl celou cestu a ted ne, takze ma nekde v path pred /usr/bin tu opravenou verzi. Ja fakt nevim co delam... a presto neustale neco zkousim.
Tak ta fopravena verze je primo tam kde jsem to kompiloval.
V tom /usr/bin bude asi fakt jen nejaky link.

dworkin@dw-A15:~/Programovani/ZX/Forth/pasmo-0.5.3$ ls /usr/bin/pasmo -l
-rwxr-xr-x 1 root root 317792 Mar 22 2020 /usr/bin/pasmo
dworkin@dw-A15:~/Programovani/ZX/Forth/pasmo-0.5.3$ diff /usr/bin/pasmo ./pasmo
Binární soubory /usr/bin/pasmo a ./pasmo jsou rozdílné
dworkin@dw-A15:~/Programovani/ZX/Forth/pasmo-0.5.3$ diff /usr/bin/pasmo /usr/bin/pasmo_fix
dworkin@dw-A15:~/Programovani/ZX/Forth/pasmo-0.5.3$

A... uz me to doslo! Takze ja kopiroval v binarce puvodni nezmenenou binarku a pak naistaloval znovu puvodni nezmenenou binarku. Zmatlo me jen to, ze se me nekam do path pridal odkaz na ~/Programovani/ZX/Forth/pasmo-0.5.3 PRED /usr/bin takze nove me to nachazelo opraveny soubor. Proto i ten cas tam byl 2020.
Fakt premyslim zda bych nemel koukat na filmy, pripadne resit jen sudoku...

PPPPS: Tak je to jeste jinak.

Jsou tri soubory. (smazal jsem /usr/bin/pasmo_fix)
/usr/bin/pasmo puvodni
/home/dworkin/Programovani/ZX/Forth/pasmo-0.5.3/pasmo_fix prejmenovany, ale "pasmo" se stale odkazuje na opravenou verzi.
/usr/local/bin/pasmo opraveny a evidetne ten ktery se spousti jako prvni.

Dokonce mam v ceste jen /usr/local/bin protoze po prejmenovani na pasmo_fix me uz pasmo nic nenaslo dokud jsem neprekopiroval

sudo cp /usr/bin/pasmo /usr/local/bin/pasmo

Takze konecne hotovo.

pasmo --> puvodni
pasmo_fix --> novy

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 14.09.2022, 13:43 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
_dworkin píše:
Mam pocit ze jde vsechno taaaaaaaaaaaak strasne pomalu.
A ztracim se v tom.
Co si mysli programator ze pise.
Co si mysli FORTH.
Co si mysli M4.
Co si mysli sjasmplus nebo pasmo.
A vse by to melo ladit.
Mozno by nebol zly napad nekompatibility tohto typu poriesit podmienenym prekladom. Napriklad:
Kód:
 IFDEF __SJASMPLUS__
 ...
 ELSE
 ...
 ENDIF
SjASMPlus ma predefinovany symbol __SJASMPLUS__ podla ktoreho zdrojak dokaze poznat, ze je prave prekladany v SjASMPlus. Mozno maju podobne predefinovane symboly aj ostatne asemblery. A ak nie, tak obvykle je mozne takyto symbol definovat priamo v cmdline, napriklad:
pasmo -d -v -8 test.asm test.bin --equ symbol=value


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Busy píše:
_dworkin píše:
Mam pocit ze jde vsechno taaaaaaaaaaaak strasne pomalu.
A ztracim se v tom.
Co si mysli programator ze pise.
Co si mysli FORTH.
Co si mysli M4.
Co si mysli sjasmplus nebo pasmo.
A vse by to melo ladit.
Mozno by nebol zly napad nekompatibility tohto typu poriesit podmienenym prekladom. Napriklad:
Kód:
 IFDEF __SJASMPLUS__
 ...
 ELSE
 ...
 ENDIF
SjASMPlus ma predefinovany symbol __SJASMPLUS__ podla ktoreho zdrojak dokaze poznat, ze je prave prekladany v SjASMPlus. Mozno maju podobne predefinovane symboly aj ostatne asemblery. A ak nie, tak obvykle je mozne takyto symbol definovat priamo v cmdline, napriklad:
pasmo -d -v -8 test.asm test.bin --equ symbol=value


Hmm.. zkusim nad tim jeste popremyslet, nekdy by se to mohlo hodit. Protoze zrovna nevidim jak by me to pomohlo s tim co prave delam, spis uskodilo.

Pro priklad mam kod

PUSH(x) PUSH(y) MUL

To se me prevede na tokeny a ja vidim ze mam MUL ktere potrebuje 2 operandy a ty tam jsou takze tohle nemusi delat kod ale zmenim to na token

PUSH(x*y)

Jen potrebuji zjistit co je to x*y. Kdyz x i y jsou hodnoty tak to vynasobi M4 a mam PUSH(cislo)

kdyz neco z toho neni hodnota tak pouziji takovy vzorec podle toho jaky mam prekladac.

PUSH(vzrorec_pro_pasmo)

nebo

PUSH(vzorec_pro_sjasmplus)

Neni to tak hrozne protoze ted mam funkci ktera se jmenuje __EVAL_S16() a ta ma tri operandy, prvni je text obsahujici co cci delat, napriklad *. Dalsi uz jsou 2 operandy. Ta funkce dela presne to co popisuji vyse, vraci vysledek jako cislo nebo vzorec.

Dokud jsem to nemel tokenizovane a mel bych

PUSH2_MUL

a to hned prevadel na asembler tak bych mohl tvuj navrh pouzit.

Cele to neni tak strasne, protoze se stale jedna o okrajovy pripad kdy programator proste zada nejake konstanty co jdou spocitat v dobe prekladu. Muze se tomu vyhnout kdyz si to spocita sam.
Ale kdyz ta konstanta je adresa nejake promenne tak bych mu pridaval zbytecne praci a to je zrovna pripad kdy ani M4 nezna hodnotu ale prekladac ji uz bude znat.
A za druhe je to zrovna u FORTHu docela bezna vec, videl jsem to v hodne ukazkach na rossetacode. Ze tam bylo neco jako

CREATE NUMBERS 10 200 * CELLS ALLOT

To by melo vytvorit novy label s nazvem NUMBERS
pak spocitat pole 10*200
To mame 2000 bunek
To prevest na bajty pomoci CELLS ktere to u 16bitu vynasobi dvema u 32 bitu ctyrma atd.
A tu hodnotu alokovat

Takze to udela

NUMBERS:
DS 4000

Pokud M4 nespocita to 4000 pro ALLOT tak je to v haji.

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


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Ohledne toho pasma.

Neni to mrtvy projekt.

Uz existuje dokonce verze 0.5.5, stahl jsem ji a naistaloval a otestoval. Stale ma problem s minusky.

https://pasmo.speccy.org/

Pasmo documentation.
(C) 2004-2022 Julián Albo.

Use and distribution allowed under the terms of the GPL license.

Last revision date: 05-mar-2022

Current Pasmo version: 0.5.5

Ja mu pred nejakym tydnem psal o te chybe na - j u l i a n . n o t f o u n d @ g m a i l . c o m

Ale bud jsem nepochopil pointu s notfound, nebo mu to nedorazilo a nebo jen neodepsal.

Dnes jsem resil

UMDIVMOD, uz predtim jsem odhalil ze mam u tri slov chybu

um/mod
sm/rem
fm/mod

Ocekava se prvni parametr 32bit a druhy 16bit. A ja mel v pravidlech pro tokeny push2 + umdivmod atd.

Takze jsem to upravil na push3 + umdivmod a pak jeste pridal

pushdot + push + umdivmod

a to me prislo slozite, resit 3 tokeny najednou, taky to bylo, jeden smazat, druhy prepsat atd.

tak jsem vytvoril pravidla kdy pushdot se hned prevadi na push2

push + pushdot = push3
push2 + pushdot = push4
push3 + pushdot = push2 + push3
push4 + pushdot = push3 + push3

Musim uz jen nekdy upravit vsechny pravidla s pushdot ze maji byt s pushx.

Dale si hral s MIN a MAX.

Pamatujete si jak jsem resil v pasmu jak udelat

<,>,<=,>=,==

a zjistil ze pasmo to umi je unsigned?

Tak jsem pri psani MIN a MAX pro neznamou hodnotu nasel elegantni reseni

Kdyz vim ze pasmo pocita vse 16bit, tak staci udelat

($1+0x8000) < ($2 + 0x8000)
($1+0x8000) <= ($2 + 0x8000)
($1+0x8000) > ($2 + 0x8000)
($1+0x8000) >= ($2 + 0x8000)

A on udela vysledek ktery bude spravny pro signed. Protoze jsem prevedl znamenkove hodnoty z -0x8000 .. 0x7FFF na neznamenkove hodnoty 0 .. 0xFFFF.

Druha pozitivni vec je ze Pasmo zna ? operator.

Takze MIN MAX uz je jen pridani za tohle ? prvni_vstup : druhy_vstup
Kód:
__{}__{}$1:__IS_NUM(__TEMP_A),{<?:1},{__HEX_HL($2+0x8000)<=($3+0x8000)?($2):($3)},
__{}__{}$1:__IS_NUM(__TEMP_B),{<?:1},{__HEX_HL($3+0x8000)>=($2+0x8000)?($2):($3)},
__{}__{}$1,{<?},{+(($2+0x8000)<=($3+0x8000))?($2):($3)},

__{}__{}$1:__IS_NUM(__TEMP_A),{>?:1},{__HEX_HL($2+0x8000)>=($3+0x8000)?($2):($3)},
__{}__{}$1:__IS_NUM(__TEMP_B),{>?:1},{__HEX_HL($3+0x8000)<=($2+0x8000)?($2):($3)},
__{}__{}$1,{>?},{+(($2+0x8000)>=($3+0x8000))?($2):($3)}

Tady je cely kod, i s osetrenim aby byl vzorec co nejktatsi kdyz je jeden z parametru ciselna hodnota. Ta bude vzdy prvni, abych se vyhnul zavorce a pripadnemu minusku.

U sjmasmplus to bylo o dost lehci Tam jsem nepridaval 0x8000 ale posouval <<16 a vysledek >> 16
Kód:
__{}__{}$1,{<?},{+((($2)<<16)<?(($3)<<16))>>16},
__{}__{}$1,{>?},{+((($2)<<16)>?(($3)<<16))>>16},


M4 zna obe hodnoty
Kód:
__{}__{}$1, {<?},   {define({__TEMP},ifelse(eval(__16BIT_TO_SIGN($2)<=__16BIT_TO_SIGN($3)),{1},__16BIT_TO_SIGN($2),__16BIT_TO_SIGN($3)))},
__{}__{}$1, {>?},   {define({__TEMP},ifelse(eval(__16BIT_TO_SIGN($2)>=__16BIT_TO_SIGN($3)),{1},__16BIT_TO_SIGN($2),__16BIT_TO_SIGN($3)))},

a pouziva fci __16BIT_TO_SIGN pro prevod nejake hodnoty/vzorce na hexadecimalni reprezentaci a zpet na cislo se znamenkem.

x = x & 0xFFFF (vnitrne to dela __HEX_HL(x))

if (x > 0x7FFF) x = eval(x - 0x10000) else x = eval(x)

eval(0xFFFF) = 65535
eval(0x0001) = 1
ale ja mu dam vzdy takovy vstup, aby vysledek byl -32768..32767.

Udelal jsem par testu a vypada to dobre.

Jeste by to chtelo teda pridat vsechny ty sign >,<,<=,>= a vlastne i unsigned delat pres tu funkci __EVAL_S16.

A pak "zkopirovat" ty pravidla pro push2 + neco na push3 + neco a push4 + neco a budu spokojeny.

Jen mam smeny do konce tydne a zitra a pozitri dokonce celodenni, tak nevym kdy se k tomu dostanu.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'aaa EQU 0x8888 PUSH(0x9999) PUSH(aaa) MAX' > smaz.asm && cat -n smaz.asm && pasmo -d smaz.asm smaz.bin

__EVAL_S16(>?,0x9999,aaa)
  __TEMP_A:>-26215<
  __TEMP_B:><
     1   aaa EQU 0x8888   
     2       push DE             ; 1:11      0x9999 aaa max
     3       ex   DE, HL         ; 1:4       0x9999 aaa max
     4       ld   HL, 0x1999>=(aaa+0x8000)?(0x9999):(aaa); 3:10      0x9999 aaa max
     5                          ;[ 5:25]
aaa      EQU 8888
0000:D5      PUSH DE
0001:EB      EX DE, HL
0002:219999   LD HL, 9999
Emiting raw binary from 0000 to 0004
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'aaa EQU 0x7777 PUSH(0x9999) PUSH(aaa) MAX' > smaz.asm && cat -n smaz.asm && pasmo -d smaz.asm smaz.bin

__EVAL_S16(>?,0x9999,aaa)
  __TEMP_A:>-26215<
  __TEMP_B:><
     1   aaa EQU 0x7777   
     2       push DE             ; 1:11      0x9999 aaa max
     3       ex   DE, HL         ; 1:4       0x9999 aaa max
     4       ld   HL, 0x1999>=(aaa+0x8000)?(0x9999):(aaa); 3:10      0x9999 aaa max
     5                          ;[ 5:25]
aaa      EQU 7777
0000:D5      PUSH DE
0001:EB      EX DE, HL
0002:217777   LD HL, 7777
Emiting raw binary from 0000 to 0004
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'aaa EQU 0x7777 __ASM({define({__LINKER},sjasmplus)}) PUSH(0x9999) PUSH(aaa) MAX' > smaz.asm && cat -n smaz.asm && sjasmplus smaz.asm --lst=smaz.lst && cat smaz.lst

__EVAL_S16(>?,0x9999,aaa)
  __TEMP_A:>-26215<
  __TEMP_B:><

0x9999 >? aaa
39321 >? (aaa)
     1   aaa EQU 0x7777   
     2   
     3       push DE             ; 1:11      0x9999 aaa max
     4       ex   DE, HL         ; 1:4       0x9999 aaa max
     5       ld   HL, +(((0x9999)<<16)>?((aaa)<<16))>>16; 3:10      0x9999 aaa max
     6                          ;[ 5:25]
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 7 lines, work time: 0.001 seconds
# file opened: smaz.asm
1     0000              aaa EQU 0x7777
2     0000
3     0000 D5               push DE             ; 1:11      0x9999 aaa max
4     0001 EB               ex   DE, HL         ; 1:4       0x9999 aaa max
5     0002 21 77 77         ld   HL, +(((0x9999)<<16)>?((aaa)<<16))>>16; 3:10      0x9999 aaa max
6     0005                                     ;[ 5:25]
7     0005
# file closed: smaz.asm
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'aaa EQU 0x8888 __ASM({define({__LINKER},sjasmplus)}) PUSH(0x9999) PUSH(aaa) MAX' > smaz.asm && cat -n smaz.asm && sjasmplus smaz.asm --lst=smaz.lst && cat smaz.lst

__EVAL_S16(>?,0x9999,aaa)
  __TEMP_A:>-26215<
  __TEMP_B:><

0x9999 >? aaa
39321 >? (aaa)
     1   aaa EQU 0x8888   
     2   
     3       push DE             ; 1:11      0x9999 aaa max
     4       ex   DE, HL         ; 1:4       0x9999 aaa max
     5       ld   HL, +(((0x9999)<<16)>?((aaa)<<16))>>16; 3:10      0x9999 aaa max
     6                          ;[ 5:25]
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 7 lines, work time: 0.000 seconds
# file opened: smaz.asm
1     0000              aaa EQU 0x8888
2     0000
3     0000 D5               push DE             ; 1:11      0x9999 aaa max
4     0001 EB               ex   DE, HL         ; 1:4       0x9999 aaa max
5     0002 21 99 99         ld   HL, +(((0x9999)<<16)>?((aaa)<<16))>>16; 3:10      0x9999 aaa max
6     0005                                     ;[ 5:25]
7     0005
# file closed: smaz.asm


PS: U M4 to prevadim na signed protoze pri vstupu

0xFFFF < 0x0001

je to ve skutecnosti

-1 < 1

M4 to pocita signed (asi) 32 bitove ale vstup je textovy pro eval.

PPS: Mozna jsem mel zamenit notfound za ALBO a dokazat ze nejsem robot... .))) Ja uz fakt dementnim.

_________________
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.09.2022, 15:31 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Postupne jsem prepsal pravdila u tokenu u tech zakladnich operaci tak aby misto PRVNI a DRUHY parametr se odkazovaly na PREDPOSLEDNI a POSLEDNI parametr.

U pravidel typu

0xFFFF pointer AND

kdy potrebuji jen smazat predposledni parametr jsem mel shift(__LAST_TOKEN_ARRAY) co mazal PRVNI parametr. Jak ale odmazat PREDPOSLEDNI parametr?
Nakonec me napadlo __DROP_2_PAR(__LAST_TOKEN_ARRAY),__LAST_TOKEN_REVERSE_1 co je delsi zapis, ale nebudu ho uz muset prepisovat u PUSH3, PUSH4. Doslova to odmaze podledni 2 parametry a prida posledni.

Jeste jsem tam nasel problem s MMUL a UMMUL. Je to nasobeni typu (u)32bit=(u)16bit*(u)16bit. Protoze vysledek jsem mel 32bit = PUSHDDOT. A ja chci pro lepsi pravidla mit vysledek jako PUSH2. Stejne to musim ulozit do registru DEHL.

Vyresil jsem to pro M4 kdy znam ciselne hodnoty.
Vyresil jsem to pro sjasmplus.
U pasma jsem ted resil jen variantu UMMUL protoze umi pekne nasobit unsigned.
A tady jsem tvrde narazil.
Mel jsem ideu Aa*Bb=(A0+a)*(B0+b)=A*B*100+10*(a*B+A*b)+a*b
Nastrkal jsem vsude spoustu HIGH a LOW
Opravil chybu v casti 10*(a*B+A*b) kde jsem to mel jako
high(...) kvuli preteceni
zmenil jsem to na (...)>>8
co je taky blbe :D
spravne je to
(a*B)>>8+(A*b)>>8
A protoze jsem mel stesti tak ten test me porad ukazoval chybu, protoze je to stale blbe. Uz jen o +1 nekdy.

Protoze ty odsunute casti o 8 bitu mohou pretect. Vlastne mohou pretect az s prictenim (a*b)>>8

Lol ted me asi napadlo jak to napsat spravne(i kdyz desne komplikovane, stacilo si to jen sem zapsat a vic si to tim srovnat v hlave. I pres to ze pasmo nezna carry a pocita 16 bitove, tak by to s duplicitnim nasobenim a ? operatorem melo jit.

Ok, ani ten ? nepotrebuji.
Bavime se teda stale o vyssich 16 bitech vysledku. Spodnich 16 bitu je proste Aa*Bb a pasmo si to oreze sam.
Kód:
__{}__{}$1,{um*},{+((high __TEMP_A)*(high __TEMP_B))+((low __TEMP_A)*(high __TEMP_B))>>8+((high __TEMP_A)*(low __TEMP_B))>>8+((low((low __TEMP_A)*(high __TEMP_B)))+(low((high __TEMP_A)*(low __TEMP_B)))+(low __TEMP_A)*(low __TEMP_B)>>8)>>8,+(__TEMP_A)*(__TEMP_B)},


Citelneji je to:
high16(Aa*Bb) = high16((A0+a)*(B0+b)) = A*B + A*b>>8 + a*B>>8 + ((A*b)&255 + (a*B)&255 + (a*b)>>8)>>8

Trik je tom, ze si mohu dovolit zahodit nejnizsich 8 bitu v (a*b)>>8 aniz by to melo nejake nasledky, protoze u A*b i a*B je nejnizsich 8 bitu vzdy nulovych. Takze mam 8 bitovy prostor pro emulaci carry. Takhle to vypada uz skoro jednoduse, ale pockejte jak to vypada v kodu .)
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'abc EQU -100 PUSH(abc) PUSH(-100) UMMUL' > smaz.asm && cat -n smaz.asm && pasmo -d smaz.asm smaz.bin

__EVAL_S16(um*,abc,-100)
  __TEMP_A:><
  __TEMP_B:>0xFF9C<
     1   abc EQU -100   
     2                           ;[8:42]     abc -100 um*   ( -- +((high (abc))*(high -100))+((low (abc))*(high -100))>>8+((high (abc))*(low -100))>>8+((low((low (abc))*(high -100)))+(low((high (abc))*(low -100)))+(low (abc))*(low -100)>>8)>>8 +((abc))*(-100) )
     3       push DE             ; 1:11      abc -100 um*
     4       push HL             ; 1:11      abc -100 um*
     5       ld   DE, +((high (abc))*(high -100))+((low (abc))*(high -100))>>8+((high (abc))*(low -100))>>8+((low((low (abc))*(high -100)))+(low((high (abc))*(low -100)))+(low (abc))*(low -100)>>8)>>8; 3:10      abc -100 um*
     6       ld   HL, +((abc))*(-100); 3:10      abc -100 um*
     7                          ;[ 8:42]
abc      EQU FF9C
0000:D5      PUSH DE
0001:E5      PUSH HL
0002:1138FF   LD DE, FF38
0005:211027   LD HL, 2710
Emiting raw binary from 0000 to 0007
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'abc EQU -100 PUSH(abc) PUSH(-101) UMMUL' > smaz.asm && cat -n smaz.asm && pasmo -d smaz.asm smaz.bin

__EVAL_S16(um*,abc,-101)
  __TEMP_A:><
  __TEMP_B:>0xFF9B<
     1   abc EQU -100   
     2                           ;[8:42]     abc -101 um*   ( -- +((high (abc))*(high -101))+((low (abc))*(high -101))>>8+((high (abc))*(low -101))>>8+((low((low (abc))*(high -101)))+(low((high (abc))*(low -101)))+(low (abc))*(low -101)>>8)>>8 +((abc))*(-101) )
     3       push DE             ; 1:11      abc -101 um*
     4       push HL             ; 1:11      abc -101 um*
     5       ld   DE, +((high (abc))*(high -101))+((low (abc))*(high -101))>>8+((high (abc))*(low -101))>>8+((low((low (abc))*(high -101)))+(low((high (abc))*(low -101)))+(low (abc))*(low -101)>>8)>>8; 3:10      abc -101 um*
     6       ld   HL, +((abc))*(-101); 3:10      abc -101 um*
     7                          ;[ 8:42]
abc      EQU FF9C
0000:D5      PUSH DE
0001:E5      PUSH HL
0002:1137FF   LD DE, FF37
0005:217427   LD HL, 2774
Emiting raw binary from 0000 to 0007
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'abc EQU -100 PUSH(abc) PUSH(100) UMMUL' > smaz.asm && cat -n smaz.asm && pasmo -d smaz.asm smaz.bin

__EVAL_S16(um*,abc,100)
  __TEMP_A:><
  __TEMP_B:>0x0064<
     1   abc EQU -100   
     2                           ;[8:42]     abc 100 um*   ( -- +((high (abc))*(high 100))+((low (abc))*(high 100))>>8+((high (abc))*(low 100))>>8+((low((low (abc))*(high 100)))+(low((high (abc))*(low 100)))+(low (abc))*(low 100)>>8)>>8 +((abc))*(100) )
     3       push DE             ; 1:11      abc 100 um*
     4       push HL             ; 1:11      abc 100 um*
     5       ld   DE, +((high (abc))*(high 100))+((low (abc))*(high 100))>>8+((high (abc))*(low 100))>>8+((low((low (abc))*(high 100)))+(low((high (abc))*(low 100)))+(low (abc))*(low 100)>>8)>>8; 3:10      abc 100 um*
     6       ld   HL, +((abc))*(100); 3:10      abc 100 um*
     7                          ;[ 8:42]
abc      EQU FF9C
0000:D5      PUSH DE
0001:E5      PUSH HL
0002:116300   LD DE, 0063
0005:21F0D8   LD HL, D8F0
Emiting raw binary from 0000 to 0007
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'abc EQU -100 __ASM({define({__LINKER},sjasmplus)}) PUSH(abc) PUSH(-100) UMMUL' > smaz.asm && sjasmplus smaz.asm --lst=smaz && cat smaz

__EVAL_S16(um*,abc,-100)
  __TEMP_A:><
  __TEMP_B:>0xFF9C<

abc um* -100
(abc) um* -100
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 9 lines, work time: 0.001 seconds
# file opened: smaz.asm
1     0000              abc EQU -100
2     0000
3     0000                                      ;[8:42]     abc -100 um*   ( -- (((abc)&0xFFFF)*0xFF9C)>>16 (((abc)&0xFFFF)*0xFF9C)&0xFFFF )
4     0000 D5               push DE             ; 1:11      abc -100 um*
5     0001 E5               push HL             ; 1:11      abc -100 um*
6     0002 11 38 FF         ld   DE, (((abc)&0xFFFF)*0xFF9C)>>16; 3:10      abc -100 um*
7     0005 21 10 27         ld   HL, (((abc)&0xFFFF)*0xFF9C)&0xFFFF; 3:10      abc -100 um*
8     0008                                     ;[ 8:42]
9     0008
# file closed: smaz.asm
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'abc EQU -100 __ASM({define({__LINKER},sjasmplus)}) PUSH(abc) PUSH(-101) UMMUL' > smaz.asm && sjasmplus smaz.asm --lst=smaz && cat smaz

__EVAL_S16(um*,abc,-101)
  __TEMP_A:><
  __TEMP_B:>0xFF9B<

abc um* -101
(abc) um* -101
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 9 lines, work time: 0.001 seconds
# file opened: smaz.asm
1     0000              abc EQU -100
2     0000
3     0000                                      ;[8:42]     abc -101 um*   ( -- (((abc)&0xFFFF)*0xFF9B)>>16 (((abc)&0xFFFF)*0xFF9B)&0xFFFF )
4     0000 D5               push DE             ; 1:11      abc -101 um*
5     0001 E5               push HL             ; 1:11      abc -101 um*
6     0002 11 37 FF         ld   DE, (((abc)&0xFFFF)*0xFF9B)>>16; 3:10      abc -101 um*
7     0005 21 74 27         ld   HL, (((abc)&0xFFFF)*0xFF9B)&0xFFFF; 3:10      abc -101 um*
8     0008                                     ;[ 8:42]
9     0008
# file closed: smaz.asm
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ ../check_word.sh 'abc EQU -100 __ASM({define({__LINKER},sjasmplus)}) PUSH(abc) PUSH(100) UMMUL' > smaz.asm && sjasmplus smaz.asm --lst=smaz && cat smaz

__EVAL_S16(um*,abc,100)
  __TEMP_A:><
  __TEMP_B:>0x0064<

abc um* 100
(abc) um* 100
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 9 lines, work time: 0.000 seconds
# file opened: smaz.asm
1     0000              abc EQU -100
2     0000
3     0000                                      ;[8:42]     abc 100 um*   ( -- (((abc)&0xFFFF)*0x0064)>>16 (((abc)&0xFFFF)*0x0064)&0xFFFF )
4     0000 D5               push DE             ; 1:11      abc 100 um*
5     0001 E5               push HL             ; 1:11      abc 100 um*
6     0002 11 63 00         ld   DE, (((abc)&0xFFFF)*0x0064)>>16; 3:10      abc 100 um*
7     0005 21 F0 D8         ld   HL, (((abc)&0xFFFF)*0x0064)&0xFFFF; 3:10      abc 100 um*
8     0008                                     ;[ 8:42]
9     0008
# file closed: smaz.asm

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 18.09.2022, 14:38 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Pracoval jsem na signed16 * signed16 = signed32 nasobeni pro Pasmo a dospel jsem k vzorci

high16(signed32) = high16(u16_A*u16_B) - (u16_A>>15)*(u_16A) - (u16_B>>15)*(u_16_B)
low16(signed32) = u16_A*u16_B tady se nic nemusi resit a mohu to nasobit unsigned

Funguje to na principu ze kladna cisla jako (priklad pro signed4bit)

7
6
5
4
3
2
1
0 jsou stejna signed i unsigned

Zaporna cisla jsou zvedla o 16
-1 = (15-16)
-2 = (14-16)
-3 = (13-16)
-4 = (12-16)
-5 = (11-16)
-6 = (10-16)
-7 = (9-16)
-8 = (8-16)

Takze:
+*+
A*B=A*B
1*2 =1*2=2
2*3 =2*3=6

-*-
(A-16)*(B-16)=A*B-16*B-16*A+256_preteceni_muzeme_ignorovat
-1*-2=15*14 -16*14 -16*15 = 210 - 224 - 240 = 210 - 464 = 0xD2 - 0x1D0 = 2
-2*-3 =14*13 -16*13 - 16*14 = 182 - 208 - 224 = 182 - 432 = 0xB6 - 0x1B0 = 6

+*-
A*(B-16)=A*B-16*A
1*-2 = 1*14 -16*1 = 14 - 16 = -2
2*-3 = 2*13 -16*2 = 26 - 32 = -6

-*+
(A-16)*B=A*B-16*B
-1*2 = 15*2 - 16*2 = 30 - 32 = -2
-2*3 = 14*3 - 16*3 = 42 - 48 = -6

A kdyz se podivate na ty vzorce a prevedete je na high4

+*+
A*B=A*B
high4(A*B)=high4(A*B)

-*-
(A-16)*(B-16)=A*B-16*B-16*A+256_preteceni_muzeme_ignorovat
high4((A-16)*(B-16))=high4(A*B)-B-A
+*-
A*(B-16)=A*B-16*A
high4(A*(B-16))=high4(A*B)-A

-*+
(A-16)*B=A*B-16*B
high4((A-16)*B)=high4(A*B)-B

Tak zjistite ze od unsigned nasobeni se to lisi jen odectenim pokud byl protejsek zaporny

high16(signed32) = high16(u16_A*u16_B) - (u16_A>>15)*(u_16A) - (u16_B>>15)*(u_16_B)

proto je tam
- (u16_A>>15)*(u_16A)
a
- (u16_B>>15)*(u_16_B)


Tolik (moje) teorie. Kdyz jsem to zacal testovat tak jsem zjistil ze tam mam chybu.
No ale pri blizsim zkoumani jsem zjistil ze mam uz blbe to unsigned nasobeni.
Tohle selze: -1*1
Kód:
     1   ld ix,+((high abc)*(high 1))
     2   ld ix,+((low abc)*(high 1))>>8
     3   ld ix,+((high abc)*(low 1))>>8
     4   ld de,+((high abc)*(high 1))+((low abc)*(high 1))>>8+((high abc)*(low 1))>>8
     5   ld bc,+(low((low abc)*(high 1)))
     6   ld bc,+(low((high abc)*(low 1)))
     7   ld bc, +(low abc)*(low 1)>>8
     8   ld ix,+((low((low abc)*(high 1)))+(low((high abc)*(low 1)))+(low abc)*(low 1)>>8)>>8
     9   ld de,+((high abc)*(high 1))+((low abc)*(high 1))>>8+((high abc)*(low 1))>>8+((low((low abc)*(high 1)))+(low((high abc)*(low 1)))+(low abc)*(low 1)>>8)>>8
    10   ld hl,+(abc)*(1)
0000:DD210000   LD IX, 0000
0004:DD210000   LD IX, 0000
0008:DD210000   LD IX, 0000
000C:110000   LD DE, 0000 <-- tohle je high16 vysledek bez carry z low16
000F:010000   LD BC, 0000
0012:01FF00   LD BC, 00FF
0015:010000   LD BC, 0000
0018:DD210000   LD IX, 0000
001C:110000   LD DE, 0000  <-- tohle ma byt high16 a spravne ma byt FFFF
001F:21FFFF   LD HL, FFFF <-- tohle je low16 (tam neni co resit)

Koukam na to a hledam kde mam chybu.

; AAaa*BBbb = ((0x100*AA)+aa)*((0x100*BB)+bb) = 0x10000*AA*BB + 0x100*AA*bb + 0x100*aa*BB + aa*bb

AAaa = FFFF
BBbb = 0001

Takze kde je BB tam musi byt nula takze je to spravne ze je to

; AAaa*BBbb = 0x100*AA*bb + aa*bb

Problem je podle me v te casti kde implementuji 0x100*AA*bb, tahle cast se dostane jen do registru E pokud bude 32 bit v DEHL

Je to tenhle kousek

+((high abc)*(low 1))>>8

Jenze to high abc neni 255 je to podle matematiky -1
Takze >> by to melo delat aritmeticky (jako sjasmplus) a ne logicky jako pasmo.
Budu muset prvne vymyslet jak prinutit pasmo (idealne nejkratsim) zapisem tohle udelat. A pak hledat znovu chyby.

PS: Otazka jeste je, jak se chovat k "aa" ktere je taky 255, zda to neni -1. Ale podle me neni, protoze

AAaa = FFFF a ja to rozdelim na AA ktere se ma chovat jako -1 (proste nacita ty FF ktere nejsou uvedeny pro posunu doprava) a aa ktere je 00FF. Asi... tohle uz je za hranici meho chapani, takze radsi budu testovat a pak premyslet.

PPS: hmmm...

Takze mozna misto kde mam vsude high

+((high abc)*(low 1))>>8

by melo byt vsude aritmeticky

+(((abc) >> 8)*(low 1))>>8

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


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 585 ]  Přejít na stránku Předchozí  1 ... 17, 18, 19, 20, 21, 22, 23 ... 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 1 návštěvní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