OldComp.cz

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


Právě je 27.04.2024, 08:18

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 598 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6 ... 40  Další
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 04.06.2020, 10:19 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Podarilo se mi spustit z http://rosettacode.org/wiki/Category:Forth nejake programky. Quicksort a Insersort. Pouzil jsem na prevod z klasicke forth syntaxe na M4 FORTH syntaxi sileny bash skriptik https://github.com/DW0RKiN/M4_FORTH/blob/master/Testing/forth2m4.sh (proc nevyuzit neco co trochu znam, je to teda napsany prasacky, ale staci, ze to usetri praci, je to jen mezikrok). Trosku se to jeste musi rucne poladit. Ale da se to. Pokud nepouziva autor neustale nestandartni rozsireni forthu, kde pak nevim co to ma delat a jsem v koncich.

Musel jsem pridat slova pro praci s presunem dat. Kvuli razeni jsem pridal i me nestandartni rozsireni RANDOM, aby to tridilo pokazde neco jineho. Celkem zabava ze tenhle hoby projekt neustale narazi na dalsi zajimave temata. Funkce vytvarejici pseudonahodne cisla. Zkopiroval jsem dva algoritmy a udelal dva seedy a vysledek xoruji. Snad jsem nic nepokazil, protoze jsem to netestoval.

Pridal jsem minimalni podporu pro vstup dat. Slova KEY (getchar) a ACCEPT (cte retezec a zobrazuje ho).

Pridal jsem minimalni podporu pro grafiku. Umi to nakreslit pixel. :jump: Ale otvira to prostor na vyuziti dalsich veci co jsem delal. Kresleni car, kruznic, atd.

Spousta drobnych vylepseni. Jako zmena pro rutinu co vypisuje cislo. Ukazalo se ze je rychlejsi to vypsat po znacich nez pres ukladani do retezce a jeho nasledne vypsani. To byla taky celkem zabava. Potreboval jsem aby cislo nevypisovalo pocatecni nuly.
Kód:
; Input: HL = number
; Output: print number
; Pollutes: AF, HL, BC
BIN2DEC:
    xor   A             ; 1:4       A=0 => 103, A='0' => 00103
    ld   BC, -10000     ; 3:10
    call BIN2DEC_CHAR+2 ; 3:17   
    ld   BC, -1000      ; 3:10
    call BIN2DEC_CHAR   ; 3:17
    ld   BC, -100       ; 3:10
    call BIN2DEC_CHAR   ; 3:17
    ld    C, -10        ; 2:7
    call BIN2DEC_CHAR   ; 3:17
    ld    A, L          ; 1:4
    add   A,'0'         ; 2:7
    rst   0x10          ; 1:11      putchar with ZX 48K ROM in, this will print char in A
    ret                 ; 1:10
   
BIN2DEC_CHAR:
    and  0xF0           ; 2:7       '0'..'9' => '0', unchanged 0
   
    add  HL, BC         ; 1:11
    inc   A             ; 1:4
    jr    c, $-2        ; 2:7/12
    sbc  HL, BC         ; 2:15
    dec   A             ; 1:4
    ret   z             ; 1:5/11
   
    or   '0'            ; 2:7       0 => '0', unchanged '0'..'9'
    rst   0x10          ; 1:11      putchar with ZX 48K ROM in, this will print char in A
    ret                 ; 1:10}){}dnl


Netusim kdy me to prestane bavit. Mel bych pridat cisla s plovouci desetinou carkou, kdyz uz mam na to udelanou knihovnu. Asi jen obalim volani aby byly vstupy vzdy na HL popripade (HL,DE) a nemazalo me DE a HL (stack). A dopsani cteni a zapisu techto cisel. Jen se k tomu nejak nemuzu dostat. Je toho nejak moc... :D

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Zapomnel jsem dodat jeste jednu oblast. Logicke porovnani sestnacti bitovych cisel. Se znamenkem a bez.

=
<>
<
<=
>
>=

Se to nezda, ale pokud tam je znamenko, tak je to docela tezke napsat efektivne. Zalezi i kdy vam na vystup staci jen nejaky stav, nebo potrebujete mit vystup 0 nebo -1. A zda musite vstup zachovat. Takove = je celkem zaludne. Udelat to na jeden skok? Na dva?

0 a -1:
https://github.com/DW0RKiN/M4_FORTH/blob/master/M4/logic.m4
Kód:
dnl >
dnl ( x2 x1 -- x )
dnl signed ( x2 > x1 ) --> ( 0 > x1 - x2 ) --> carry is true
define(GT,{
    ld    A, H          ; 1:4       >
    xor   D             ; 1:4       >
    jp    p, $+7        ; 3:10      >
    rl    H             ; 2:8       > sign x1
    jr   $+4            ; 2:12      >
    sbc  HL, DE         ; 2:15      >
    sbc  HL, HL         ; 2:15      >
    pop  DE             ; 1:10      >})dnl

Jen pro skok:
https://github.com/DW0RKiN/M4_FORTH/blob/master/M4/if.m4
https://github.com/DW0RKiN/M4_FORTH/blob/master/M4/loop.m4
Kód:
dnl 2dup > if
define({_2DUP_GT_IF},{define({IF_COUNT}, incr(IF_COUNT))pushdef({ELSE_STACK}, IF_COUNT)pushdef({THEN_STACK}, IF_COUNT)
    ld    A, H          ; 1:4       2dup > if
    xor   D             ; 1:4       2dup > if
    ld    C, A          ; 1:4       2dup > if
    ld    A, L          ; 1:4       2dup > if    (DE>HL) --> (HL-DE<0) --> carry if true
    sub   E             ; 1:4       2dup > if    (DE>HL) --> (HL-DE<0) --> carry if true
    ld    A, H          ; 1:4       2dup > if    (DE>HL) --> (HL-DE<0) --> carry if true
    sbc   A, D          ; 1:4       2dup > if    (DE>HL) --> (HL-DE<0) --> carry if true
    rra                 ; 1:4       2dup > if
    xor   C             ; 1:4       2dup > if
    jp    p, else{}IF_COUNT    ; 3:10      2dup > if})dnl
dnl
Tohle je znamenkove porovnani s pouzitim jedineho skoku. Vysledek se xoruje s xorem znamenek na vstupu.

PS: Nemohl jsem si vybavit jak se jmenuje soucany americky prezident. Vzpomnel jsem si jen na Baraka Obamu, ale jak se jmenuje ten soucasny se zlutou parukou ne. Nakonec jsem si vzpomnel Donald Trump, ale fakt mam pocit ze tohle neni normalni.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
U smycek jsem sjednotil slova UNLOOP a LEAVE.
LEAVE (c break) vlastne i pridal co jsem pochopil ze to dela neco jineho nez EXIT (c return).

Nezalezi uz zda je ta smycka delana pres DO LOOP nebo optimalizovana pres XDO XLOOP kde stop je napevno v kodu XLOOP a na zasobniku navratovych adres je jen index, nebo je to smycka SDO SLOOP, ktera ma vse na datovem zasobniku. Proste jak zavolate DO, XDO, SDO tak to vygeneruje definici pro UNLOOP a LEAVE a ulozi ji na M4 zasobnik, tak aby nahore bylo vzdy ta spravny UNLOOP a LEAVE pro aktualni smycku.

Tohle by slo udelat i pro indexy I J K. Ale uz by to bylo slozitejsi. Muselo by se dopocitavat a zjistovat zda to je na zasobniku a nebo RAS. Aby to bylo dokonale tak bych musel upravit aji funkce. Takze by slo automaticky zjistit tohle:
DO CALL(neco) LOOP

COLON(neco)
I DOT
SEMICOLON

Kde funkce neco taky prida data do RAS. Ale prislo me to slozity a lepsi si zatim hrat jinde... .)

PS: Jeste jsem chtel neco napsat, ale vypadlo mi to...

PSS: Ok, tak asi ohledne toho bash scriptu co pomoci sedu prevadi do loop na DO LOOP. A taky 14 10 do loop na xdo(14,10) xloop. Atd. silenym zpusobem, kdy zameni vsechny male "o" za "_____0_____" a velke "O" za "_____00_____". Pak prevede zpet jen " DO " a " LOOP " a prevod na XD_____00_____(14,10) XL_____00__________00_____P udela pouze pokud pred DO jsou dve cisla. A mezi DO a LOOP neni zadne "O". Tohle dokaze vyresit vzdy uplne nejvnitrnejsi smycku. Takze az uz neni co menit, protoze pred DO nejsou dve cisla, tak nejvnitrnejsi DO LOOP zameni na D_____00_____ L_____00__________00_____P a pokusi se zase prevest 14 10 DO LOOP na XD_____00_____(14,10) L_____00__________00_____P. Atd.

Nakonec se vrati male a velke "o". Silenstvi. :D
Ale nejak jsem jeste zapomnel menit I J na XI a XJ, jak jsem psal vysse tak je to jeste slozitejsi. Mam pocit ze jsem mel pouzit awk.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Jo uz jsem si vzpomnel! Nove nestandartni slovo BREAK. Je to vyskoceni z nepocitanych smycek
Kód:
BEGIN ... flag UNTIL
BEGIN ... flag WHILE ... REPEAT
BEGIN ... AGAIN
Ktere jsem prevedl na
Kód:
BEGIN ... flag WHILE ... flag WHILE ... flag IF BREAK THEN ...
REPEAT nebo
flag UNTIL nebo
AGAIN

Kde flag WHILE je vlastne "flag not IF BREAK THEN". REPEAT je to same co AGAIN. Pouhy skok na zacatek. A flag UNTIL skok na zacatek kdyz NEsplni podminku.

Nema to zadna data na zasobniku. WHILE vzdy skace na konec aktualni smycky.
Proc to pisu? Na rosettacode nekdo zapisuje pomoci gforth? syntaxe a ma smycky s vice WHILE a za kazdy WHILE navic prida za REPEAT THEN. Podle online forthu a pokusu o debugovani quicksortu by se to melo chovat stejne jako to mam ja. Jen s tim rozdilem ze pokud neco strci mezi REPEAT a THEN tak se to vykona pokud selze prvni WHILE. To by melo jit ale napsat alternativne i s dvema vnorenymi smyckami.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
;# log10(2^n) = y
;# 10^y = 2^n

;# log10(2^n)=n*log10(2)
;# 10^(n*log10(2)) = 2^n

;# m*2^n = m*10^(n*log10(2)) = m*10^(int+mod) = m * 10^int * 10^mod = m * 10^mod * Eint = 1 .. 1.9 10^mod * Eint = 1.0 .. 19.99 Eint

Jde na ZX Spectru v assembleru vytvorit cislo v plovouci carce a nasledne zavolat ROM rutinu na jeho vypsani? Prijde me to ted jako snazsi reseni nez pouzit ten postup co jsem napsal vyse na prevod cisla ve formatu "zlomkova_cast1 * 2^n1" na format "zlomkova_cast2 * 10^n2". :help:

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
0..9999
Kód:
       ld bc,(score)
       call 6683

0..65535
Kód:
       ld bc,(score)
       call 11563          ; stack number in bc.
       call 11747          ; display top of calc. stack.

Takze asi potrebuji jen jak ulozit floating point cislo na stack. I kdyz mozna staci kdyz ulozim cokoliv a pak zjistim kde stack lezi a prepisi to cislo na to co chci? hmm...

_________________
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: 07.06.2020, 17:47 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1980
Bydliště: Most, Praha
Has thanked: 874 times
Been thanked: 699 times
Pro tisk float čísla z vrcholu stacku kalkulátoru je funkce 2DE3h. Číslo se dá do stacku uložit např. jako integer z BC přes 2D2Bh. Na konec zásobníku čísel ukazuje proměnná STKEND 5C65h. Formát čísla: 1 bajt exponent s biasem 81h (0=číslo je integer nebo 0), 4 bajty mantisa (od vyšších bajtů) se znaménovým bitem nahrazujícím skrytý bit 1. Např. číslo 0.5 je: 80h 00h 00h 00h 00h. Číslo 1 je ve float tvaru 81h 00h 00h 00h 00h, v integer tvaru 00h 00h 01h 00h 00h (exponent = 0, 2 bajty mantisy jsou jako integer číslo).

Ve Spectru by bylo zajímavé pro Forth interpreter využít interní macro jazyk, který má k Forth jazyku velmi blízko. Interpretace se spouští přes RST 28h, za kterým následují makro tokeny, s čísly se pracuje přes stack. Lze použít i skoky, podmínky, smyčky. Tabulka tokenů je na adrese 32D7h.

Číslo Forthu by mohlo mít tvar 2 bajty integer číslo mantisa, k tomu 1 bajt dekadický exponent (zadané jako FLOAT(mant,exp)). Při uložení do stacku by se uložila mantisa 2 bajty a ta by se pak opakovaně vynásobila/vydělila 10x podle exponentu. To by se dalo zajistit makro interpreterem.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Panda38 píše:
Pro tisk float čísla z vrcholu stacku kalkulátoru je funkce 2DE3h. Číslo se dá do stacku uložit např. jako integer z BC přes 2D2Bh. Na konec zásobníku čísel ukazuje proměnná STKEND 5C65h. Formát čísla: 1 bajt exponent s biasem 81h (0=číslo je integer nebo 0), 4 bajty mantisa (od vyšších bajtů) se znaménovým bitem nahrazujícím skrytý bit 1. Např. číslo 0.5 je: 80h 00h 00h 00h 00h. Číslo 1 je ve float tvaru 81h 00h 00h 00h 00h, v integer tvaru 00h 00h 01h 00h 00h (exponent = 0, 2 bajty mantisy jsou jako integer číslo).

Diky! :god: Koukam ze ty cisla co si uvedl v hexadecimalnim formatu sedi s temi hodnotami co mam v dekadickem formatu. Problem mam s tim, ze ja prevadim cislo v plovouci carce ve formatu "Danagy" na cislo v plovouci carce ve formatu ZX, ktere si pekne popsal. Takze neukladam integer pres call 0x2D2B. Konverzi si doresim sam, ta by mela byt snadna protoze prevadim z nizsi presnosti na vyssi. Ale idealne by to chtelo neco co jsem zahledl na netu u Boriel Basicu
Kód:
FUNCTION FASTCALL fSqrt (radicand as FLOAT) as FLOAT
ASM
        ; FLOAT value arrives in A ED CB
        ; A is the exponent.
          AND   A               ; Test for zero argument
          RET   Z               ; Return with zero.

          ;Strictly we should test the number for being negative and quit if it is.
          ;But let's assume we like imaginary numbers, hmm?
          ; If you'd rather break it change to a jump to an error below.
          ;BIT   7,E          ; Test the bit.
          ;JR    NZ,REPORT       ; back to REPORT_A
                                ; 'Invalid argument'
          RES 7,E               ; Now it's a positive number, no matter what.

          call __FPSTACK_PUSH   ; Okay, We put it on the calc stack. Stack contains ABS(x)
...
FLOAT value arrives in A ED CB. Tzn. ze mam hodnoty v registru. Ale nikde jsem nenasel hodnotu pro __FPSTACK_PUSH. Mozna je to jejich rutina a ne ROM rutina.

No ale pomoci STKEND 5C65h jsem schopen to uz sesmolit primo v pameti.

Panda38 píše:
Ve Spectru by bylo zajímavé pro Forth interpreter využít interní macro jazyk, který má k Forth jazyku velmi blízko. Interpretace se spouští přes RST 28h, za kterým následují makro tokeny, s čísly se pracuje přes stack. Lze použít i skoky, podmínky, smyčky. Tabulka tokenů je na adrese 32D7h.

Číslo Forthu by mohlo mít tvar 2 bajty integer číslo mantisa, k tomu 1 bajt dekadický exponent (zadané jako FLOAT(mant,exp)). Při uložení do stacku by se uložila mantisa 2 bajty a ta by se pak opakovaně vynásobila/vydělila 10x podle exponentu. To by se dalo zajistit makro interpreterem.


Ja ale delam compiler a ne interpret. Napsat C compiler, je nad moje schopnosti, ale ten Forth je snadny. Takze se ani nesnazim, aby ten program byl nejkratsi, protoze tomu se neda u Forthu konkurovat, ale spis aby byl rychly. Tech zpusobu jak udelat Forth je nekolik jak je ukazano v tom odkazu od Kubika. Je to tam pro vice platforem, nejen Z80. Od ruznych "call xx call xy call xz" nebo jen "xx xy xz". A slo by to i tokenizovat na "x y z", ze by slova mely jen jeden bajt. A pokud jich vytvorime moc tak nektere 2 bajty. V nejake textovce u ktere nejde o rychlost by to melo hodne zkratit kod. Vic jak ten "assembler".

I ty cisla v plovouci carce jsou delany na rychlost a ne presnost. Jsou jen sestnactibitova. S EEE EEEE MMMM MMMM. Za to extremne rychla. A pouzivaji datovy stack protoze maji stejnou velikost jako integer.

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


Naposledy upravil _dworkin dne 07.06.2020, 19:04, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 07.06.2020, 19:01 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
Jde na ZX Spectru v assembleru vytvorit cislo v plovouci carce a nasledne zavolat ROM rutinu na jeho vypsani?
Samozrejme:

call #2AB6
; Ulozenie floating point cisla v na vrchol zasobnika kalkulacky
call #2DE3 ; Vypis vrcholu zasobnika kalkukacky

Na vstupe sa ocakava floating point cislo v standartnom spektrackom 5-bajtovom formate, v tychto registroch:
A ... exponent
E ... najvyssi bajt mantisy (bit 7 = znamienko)
D ... dalsi bajt mantisy
C ... dalsi bajt mantisy
B ... najnizsi bajt mantisy


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 07.06.2020, 19:05 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Busy píše:

call #2AB6
; Ulozenie floating point cisla v na vrchol zasobnika kalkulacky

Na vstupe sa ocakava floating point cislo v standartnom spektrackom 5-bajtovom formate, v tychto registroch:
A ... exponent
E ... najvyssi bajt mantisy (bit 7 = znamienko)
D ... dalsi bajt mantisy
C ... dalsi bajt mantisy
B ... najnizsi bajt mantisy


:god: Super, usetrili jste me asi nekolik dni trapeni. Muzu se rovnou pustit do konverze.

_________________
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: 07.06.2020, 20:30 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Vychazi me ze ZX Spectrum ma bias 0x81 a ne 0x7F. Je to mozne? Mluvim ted o hodnote co je ulozena v exponentu.

Takze kdyz je tam 0x80 tak vysledek je mantisa * 2^(0x80-Bias) = mantisa * 2^(-1)
A pokud mantisa ma same nuly. Plus nejvyssi bit ktery se neuklada je 1. Tak vysledek je 0.5. Protoze (1 + mantisa) * 2^-1 = 1 * 0.5 = 0.5.

PS: Chtel jsem se zeptat. Pokud vytisknu pomoci "call 0x2DE3" cislo na zasobniku. Tak tam zustane a nebo se odstrani? Pokud zustane, co se vola na odstraneni?

_________________
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: 07.06.2020, 22:22 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
Vychazi me ze ZX Spectrum ma bias 0x81 a ne 0x7F. Je to mozne? Mluvim ted o hodnote co je ulozena v exponentu.
Takze kdyz je tam 0x80 tak vysledek je mantisa * 2^(0x80-Bias) = mantisa * 2^(-1)
A pokud mantisa ma same nuly. Plus nejvyssi bit ktery se neuklada je 1. Tak vysledek je 0.5. Protoze (1 + mantisa) * 2^-1 = 1 * 0.5 = 0.5.
Zalezi ako vnimas mantisu. Obecne sa to berie ako zlomkova cast cisla, takze normalizovana mantisa (s jednotkovym najvyssim bitom, namiesto ktoreho sa uklada znamienko) predstavuje hodnoty 0.5 az 0.9999.. V tomto ponimani bias mame na 0x80 a tym padom tychto 5 bajtov 80 00 00 00 00 predstavuje floating point cislo 0.5.
_dworkin píše:
PS: Chtel jsem se zeptat. Pokud vytisknu pomoci "call 0x2DE3" cislo na zasobniku. Tak tam zustane a nebo se odstrani? Pokud zustane, co se vola na odstraneni?
Odstrani. Vsetky operacie, ktore potrebuju nejake hodnoty zo zasobniku, ich zaroven aj zo zasobniku odstrania. Takze aj #2DE3.

PS1: Ak by si niekedy potreboval zo zasobniku odstranit jednu hodnotu z vrcholu, tak to je RST #28 : DB #02 : DB #38
PS2: Urcite to vies, tak len cisto pre istotu pripominam, vypis prebieha cez RST #10, takze cez aktualne otvoreny kanal. Horna cast obrazovky je LD A,2 : CALL #1601.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 08.06.2020, 16:12 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
Zalezi ako vnimas mantisu. Obecne sa to berie ako zlomkova cast cisla, takze normalizovana mantisa (s jednotkovym najvyssim bitom, namiesto ktoreho sa uklada znamienko) predstavuje hodnoty 0.5 az 0.9999.. V tomto ponimani bias mame na 0x80 a tym padom tychto 5 bajtov 80 00 00 00 00 predstavuje floating point cislo 0.5.
Tohle je zajimava informace, protoze jsem si temer jisty ze podle normy IEEE754 je neukladany bit jednickovy a ne polovicni.
https://www.root.cz/clanky/norma-ieee-754-a-pribuzni-formaty-plovouci-radove-tecky/
V tom odkazu je i ze ZX Spectrum ma bias #80. Ale kdyz ma mantisu mezi 0.5..0.999 a ne 1..1.999 tak se trochu michaji jabka s hruskama. Jak se umisti bias a jeste podle toho zda maji specialni hodnoty to ma vliv na operaci 1/n. Protoze to muze pretect a 2x po sobe 1/n nevrati pak n.
Kód:
dworkin@Aspire:~/Forth$ cat float.c
#include <stdio.h>

int  main() {
   
    __uint32_t u32 = 0x7f000000;
    float *pf;
    pf = &u32;
    u32 >>=1; // + sign
    printf("%x = %f\n",u32,*pf);
    return 0;
}
dworkin@Aspire:~/Forth$ gcc float.c
float.c: In function ‘main’:
float.c:7:8: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
     pf = &u32;
        ^
dworkin@Aspire:~/Forth$ ./a.out
3f800000 = 1.000000


Busy píše:
PS2: Urcite to vies, tak len cisto pre istotu pripominam, vypis prebieha cez RST #10, takze cez aktualne otvoreny kanal. Horna cast obrazovky je LD A,2 : CALL #1601.

Tohle jsem uz presunul do pocatecniho INITu. Predtim jsem to mel pred kazdym tiskem... Jinak tohle jsou veci ktere jsem uspesne zapomnel, jak jsem se kdysi pokousel tisknout v basicu na spodni 2 radky obrazovky atd.
Kód:
dnl Save shadow reg.
define(INIT,{
;   ===  b e g i n  ===
    exx                 ; 1:4
    push HL             ; 1:11
    push DE             ; 1:11
    ld    L, 0x1A       ; 2:7       Upper screen
    call 0x1605         ; 3:17      Open channel
    ld   HL, ifelse($1,{},{60000
    .warning "Missing value for return address stack. The init() macro has no parameter!"},{$1})
    exx})dnl
dnl
dnl ( -- )
dnl Save shadow reg.
define(STOP,{
    pop  DE             ; 1:10
    pop  HL             ; 1:10
    exx                 ; 1:4
    ret                 ; 1:10
;   =====  e n d  =====})dnl

Po pravde si nejsem jisty co presne musim uchovat pro navrt do basicu. Urcite HL', ale to DE' je asi zbytecne. A pokud bych to volal pres PRINT USR adresa, tak to asi vypise BC?

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Jinak jsem uz udelal uplne nejzakladnejsi podporu pro cisla v plovouci carce.
Kód:
original M4 FORTH  data stack
s>f      S2F       ( s1 -- f1 )   
u>f      U2F       ( u1 -- f1 )   
f>s      F2S       ( f1 -- s1 )   
f>u      F2U       ( f1 -- u1 )   
f+       FADD      ( f2 f1 -- (f2+f1) )   
f-       FSUB      ( f2 f1 -- (f2-f1) )   
fnegate  FNEGATE   ( f1 -- -f1 )   
fabs     FABS      ( f1 -- abs(f2) )   
f.       FDOT      ( f1 -- )   
f*       FMUL      ( f2 f1 -- (f2*f1) )   
f/       FDIV      ( f2 f1 -- (f2/f1) )
Jde to dost ztuha, narazil jsem na nejake necekane problemy. Uz jen formatovani kodu a prevod na mala pisma, aby to nerozbalilo AND na funkci je pracne. Pak jsem nemel prevody cisel se znamenkem a musel je dopsat.

Dale me doslo ze je skoda, ze mam tabulky na nasobeni cisel v plovouci carce, ktere nemuzu pouzit pro nasobeni integeru, protoze jsem je uplne optimalizoval na kazdy takt a nasobit integery jsem v 3D demu nepotreboval. Pokud by to bylo vyuzitelne i pro nasobeni integeru tak by to bylo o neco pomalejsi, ale tady by to tak nevadilo... To asi necham plavat, je to moc prace. Mohl bych primo prevzit kod od Daniela A. Nagyho, protoze to tak ma udelane. Ale ma tam chybu v zaokrouhlovani. Ten vzorec je proste slozitejsi.

_________________
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: 08.06.2020, 16:44 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1980
Bydliště: Most, Praha
Has thanked: 874 times
Been thanked: 699 times
_dworkin píše:
...Tohle je zajimava informace, protoze jsem si temer jisty ze podle normy IEEE754 je neukladany bit jednickovy a ne polovicni....
Jedničkový bit znamená nejvyšší bit mantisy. Číslo 0.5 se vyjádří jako 1 * 2^(-1 + BIAS). BIAS je zde 0x81 (v ISO normě se používá bias 0x7F). BIAS se udává jako exponent pro číslo 1.000. Mantisa znamená číslo 1 až 1.9999. Mantisa pro 0.5 by měla tvar 0x80 0x00 0x00 0x00. Nejvyšší bit "1" se skryje a nahradí se znaménkem tj. bit 0. Výsledek pak je exponent 0x80 (tj. bias 0x81 - 1), mantisa se skrytým bitem "1" a nahrazeným znaménkovým bitem 0x00 0x00 0x00 0x00. Mantisa jako zlomková část bez skryté "1" je číslo 0.000 až 0.999, k němu se přičítá skrytá "1" a tím pak má mantisa hodnotu 1.000 až 1.999.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 598 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6 ... 40  Další

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


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 41 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz