OldComp.cz

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


Právě je 27.04.2024, 09:14

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 ... 36, 37, 38, 39, 40  Další
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 16.12.2023, 23:03 
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:
To resetovani 23672 --> 23673 --> 23674 prave nechci delat protoze to pri resetovani 23673 a 23674 uz bezi cas. A ja to obcas porovnavam i s jinym merenim, ktere uz probehlo a ja ho nedelal.
Ale ak si ho nerobil, ako vies ako bolo robene ? Co ak prave tak ako som ja navrhoval ? ;)
_dworkin píše:
Takze bych pridaval konstantni zpozdeni. Proto jsem to zmenil na to ze zacnu 23672 co se podle me meni 50x za vterinu a pak je jedno v jakem poradi udelam zbytek a opet resetnu 23672.
To mas uplne jedno, ako to budes robit. Vzdy tam budes mat neurcitost 20 ms.
_dworkin píše:
To s tim PAUSE 1 je asi dobry napad pokud to sesynchronizuje preruseni zase na nejakou konstantu.
Moje riesenie (PAUSE1 + 3xPOKE) ti dava istotu, ze po vykonani resetovania mas presne 8.8 ms do najblizsieho prerusenia, takze tvoj merany program pobezi v prvom frejme presne 8.8 ms.
_dworkin píše:
Koukam ze tam je dokonce nejake PAUSE 1 pred ctenim.. Ani nevim proc to tam mam.
To tam mas prave preto, aby si nemusel citat 2x a vyhodnocovat, ci si neprecital zrovna kolizny stav. Proste, ked spravis PAUSE 1 tak citanie hned za nim bude urcite bez kolizii a vysledok bude okamzite platny. Samozrejme kedze vies ze aj pre program, trvajuci nulovy cas, sa pocitadlo stihne inkrementnut, tak ten jeden inkrement od vysledku prostre odcitas. A je to :)
_dworkin píše:
Kód:
printf "30 RANDOMIZE USR ${addr}\n" >> "${load}"
Nooooo ale pokial chces merat dlzku programu v strojaku, tak preco rovno aj samotne meranie nespravis v strojaku ? Tam si pocitadlo zresetujes trivialne (temer) okamzite a navyse mozes s ovela vyssou presnostou zmerat kolko % posledneho frejmu program este bezal, takze presnost merania mozes mat v mikrosekundach.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 17.12.2023, 02:31 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
To ze to PAUSE 1 pridane PRED ctenim ti zaruci ze nebudes mit "kolizi" pri cteni me vubec nedoslo! Pekne! Takze to mohu odstranit pokud bych se chtel dostat az na nulovy cas.

Ale necham to jak to je s tim, ze ted vim (nez to opet zapomenu) ze je cteni korektni. Zvetsovani zavadece by mohlo nekdy zpusobit kolizi s kodem, pokud jsem nekde potreboval misto a snizoval jsem zacatek az na dren na konec basicu.

Priklad cteni co jsem nedelal ja je napriklad odsud: https://spectrumcomputing.co.uk/forums/ ... f=6&t=3487

Ohledne reseni mit cteni ve strojaku jsem proti tomu to delat timto zpusobem, protoze to ovlivnuje dalsi veci co se porovnavaji, jako je velikost kompilovaneho kodu, byla by to obcas takova koule u nohy. Ve strojaku uz mam nekdy navic veci jako cteni jaka je hloubka zasobniku a tisk... kvuli overeni ze je kod spravne, protoze v STOP rutine mam zotaveni z chyby ze tam neco zbylo, takze by se chyba mohla prehlednout. Pokud jsme brali navic tak to uz nezachrani nic.

PS: To overeni je reseno pres standartni slova forthu. DEEPT DOT.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Posledni noci resim signed a unsigned porovnani osmibitovych cisel. Nez me napadlo ze podpora procesoru Z80 pro priznak preteceni by se dala pouzit i v 16 bitovych cislech.
Mel jsem docela fajn reseni (lepsi nez nejlepsi co najdete na internetu)
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DUP PUSH(3) GT IF'
                       ;[11:40]     dup 3 > if   ( x -- x )  flag: x > 3 ;#variant: default, change: "define({_TYP_SINGLE},{sign_first})"
    ld    A, 0x03       ; 2:7       dup 3 > if   HL>3 --> 0>0x03-L --> false if not carry
    sub   L             ; 1:4       dup 3 > if   HL>3 --> 0>0x03-L --> false if not carry
    ld    A, 0x00       ; 2:7       dup 3 > if   HL>3 --> 0>0x00-H --> false if not carry
    sbc   A, H          ; 1:4       dup 3 > if   HL>3 --> 0>0x00-H --> false if not carry
    rra                 ; 1:4       dup 3 > if
    xor   H             ; 1:4       dup 3 > if   invert sign if HL is negative
    jp    p, else101    ; 3:10      dup 3 > if   positive constant --> false if not sign
; seconds: 0           ;[11:40]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DUP PUSH(-3) GT IF'
                       ;[11:40]     dup -3 > if   ( x -- x )  flag: x > -3 ;#variant: default, change: "define({_TYP_SINGLE},{sign_first})"
    ld    A, 0xFD       ; 2:7       dup -3 > if   HL>-3 --> 0>0xFD-L --> false if not carry
    sub   L             ; 1:4       dup -3 > if   HL>-3 --> 0>0xFD-L --> false if not carry
    ld    A, 0xFF       ; 2:7       dup -3 > if   HL>-3 --> 0>0xFF-H --> false if not carry
    sbc   A, H          ; 1:4       dup -3 > if   HL>-3 --> 0>0xFF-H --> false if not carry
    rra                 ; 1:4       dup -3 > if
    xor   H             ; 1:4       dup -3 > if   invert sign if HL is negative
    jp    m, else101    ; 3:10      dup -3 > if   negative constant --> false if sign
; seconds: 1           ;[11:40]

Vyuziva se faktu ze porovnani se znamenkem je to same jako bez znamenka pokud maji cisla shodne znamenka. Pokud maji odlisne tak je vysledek opacny.


Podival jsem se jak to resi prekladac C
Kód:
/* Type your code here, or load an example. */
int mul5(int num) {
    return (num <4);
}


void main(){

    mul5(10);
}

Kód:
._mul5
        pop     bc
        pop     hl
        push    hl
        push    bc
        ld      a,l
        sub     4
        ld      a,h
        rla
        ccf
        rra
        sbc     128
        ld      hl,0        ;const
        rl      l
        ret

._main
        ld      hl,10       ;const
        push    hl
        call    _mul5
        pop     bc
        ret

Ma celkem jednoduche reseni ze signed porovnani lze prevest na unsigned tim ze invertujeme nejvyssi bit (protoze to je to same co pricist 0x8000).
Vyuziva toho fakt ze tim prictenim 0x8000 nejnizsi zaporna hodnota -0x8000 mapovana na 0x8000 se prevede na nulu a nejvyssi kladna hodnota 0x7FFF mapovana na 0x7FFF se prevede na 0xFFFF. Takze tim ziskame hodnoty ktere muzeme porovnat unsigned metodou.
Kód:
        rla
        ccf
        rra

Tady je to schovane, kde se priznak prenosu nacte do 0. bitu a nejvyssi bit vypadne a je invertovan pomoci "ccf" a zase nacten zpatky, kdyz puvodni priznak zase vypadne. Celkem chytre reseni na 3 kratke instrukce. Dokonce pokud potrebujeme ziskat carry jako vysledek jeste lepsi nez jsem pouzival, protoze me to reseni napadlo, ale ne ze jde napsat takhle snadno (ono taky jsem resil dva registry a ne registr a konstantu kdyz jsem nad tim hlouhal). Mozna to nekde jeste pouziji.

Jo a jeste u vyssiho bajtu misto nuly pricita 128, protoze invertuje ten bit u cisla 4. To je zadarmo jen zmena konstanty.

No a ma idea byla, ze pokud bych napriklad mel cislo HL < 0x8004 (takze hodne zaporne, presne min+4) tak abych overil ze je HL mensi staci od nej odecist presne hodnotu 4. Pokud by vysledek podtekl na 0x7FFF nebo mene, tak byla v HL jasne nizsi hodnota.
Ukazalo se ze tohle neplati pokud mame konstantu 4, protoze pokud odecteme 0x8004 jak predpokladame tak bude vysledek presne opacny.
Nakonec me doslo ze proste odecteni 0x8004 je chapano jako odecteni zaporneho cisla...

Takze nesmime pouzivat cislo vetsi jak 0x7FFF.
Reseni je pricist (0x8000-4) = 0x7FFC.
Pokud pri pricteni dosahneme hodnoty 0x8000 nebo vice tak vyvolame preteceni a vime ze vysledek je neplatny...

Coz nejak odpovida tomu co jsem psal pri odcitani. Protoze odceteni 0x8004 je to same co pricteni 0x7FFC.

Pri kladnych hodnotach je preteceni false a pri zapornych hodnotach je preteceni true. Pokud odcitame 0x8000 ( teda testujeme nulu ) tak to funguje jako pro kladne cislo.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DUP PUSH(3) LT IF'
                        ;[9:32]     dup 3 < if   ( x -- x )  flag: x < 3 ;#variant: default, change: "define({_TYP_SINGLE},{sign_first})"
    ld    A, L          ; 1:4       dup 3 < if   HL<3 --> L-0x03<0 --> false if overflow
    sub  0x03           ; 2:7       dup 3 < if   HL<3 --> L-0x03<0 --> false if overflow
    ld    A, H          ; 1:4       dup 3 < if   HL<3 --> H-0x80<0 --> false if overflow
    sbc   A, 0x80       ; 2:7       dup 3 < if   HL<3 --> H-0x80<0 --> false if overflow
    jp   pe, else101    ; 3:10      dup 3 < if   positive constant --> false if overflow
; seconds: 0           ;[ 9:32]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'DUP PUSH(-3) LT IF'
                        ;[9:32]     dup -3 < if   ( x -- x )  flag: x < -3 ;#variant: default, change: "define({_TYP_SINGLE},{sign_first})"
    ld    A, L          ; 1:4       dup -3 < if   HL<-3 --> L-0xFD<0 --> false if not overflow
    sub  0xFD           ; 2:7       dup -3 < if   HL<-3 --> L-0xFD<0 --> false if not overflow
    ld    A, H          ; 1:4       dup -3 < if   HL<-3 --> H-0x7F<0 --> false if not overflow
    sbc   A, 0x7F       ; 2:7       dup -3 < if   HL<-3 --> H-0x7F<0 --> false if not overflow
    jp   po, else101    ; 3:10      dup -3 < if   negative constant  --> false if not overflow
; seconds: 0           ;[ 9:32]


Takze znamenkove reseni je stejne narocne jako beznamenkove! Pokud nam staci odskok...
Tohle ani z88dk 2.2 neumi a pritom by se dalo rici ze by to mel byt zaklad, hrani si s integery.

PS: Po 2 letech a stale se ukazuje ze jdou vylepsovat veci co jsem bral ze uz lepe napsat nejdou. Jsem nejakej zpomalenej.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Opravil jsem nahodne nalezenou chybu pri "constant folding/propagation" kdy pri zpracovani logickych vyrazu d<, d<=, d>, d>=, d=, d<>, du<, du<=, du>, du>=, du=, du<> kdy jsem mel pozadovany vstup v konstantach se mi vracela booleanovska (jak se to pise spravne cesky?) hodnota typu true (-1) a nebo false (0) jako DOUBLE. Takze jsem mel na zasobniku 2 hodnoty misto jedne.
Overil jsem si to v online forthu ze to fakt vraci normalni velikost. Mel jsem automaticky ve fci ze kdyz to zacina "d" tak je to 32 bit hodnota kvuli d+, d- atd.

Zajimavejsi je, ze jak se snazim pridat vic podporu pro osmibitove cisla jsem se snazil trosku upravit bordel v tokenovych pravidlech.
Jak mam 3 iterace pruchodu temi pravidly tak se snazim minimalizovat rizika kolizi pravidel kdy jedno rozbiji druhe.
Idea je takova, ze pri prvnim pruchodu, ktery je pri prvnim vlozeni tokenu, kdy i postupne umazavam a menim predchozi pravidla to mensi hloubky bych nemel delat spojeni typu NECO + PARAMETR/DATA, ale jen PARAMETR/DATA + NECO. Abych nekradl vstup pro nasledujici slova. NECO_1+DATA a NECO_2, kdyz je to skoro na 100% optimalnejsi jako NECO_1 a DATA+NECO_2. S tim ze pokud je tech dat za sebou vice neco potrebuji tak si vezmu jen tolik kolik potrebuji a zbytek necham pro nasledujici optimalizace NECO+DATA ktere se delaji az v druhem pruchodu.
V pripade ze pri prvnim pruchodu vznikne nejake slovo (a klidne se i zmeni nejak posledni zlova v zasobniku tokenu), ktere by mohlo vyvolat dalsi optimalizace tak muzu uz prvni pruchod znovu zopakovat s tim novym slovem. Stale to bude jako prvni pruchod.

Takze prvni pruchod by mel dusledne udelat

NUM1 -> NUM1
NUM2 -> NUM1_NUM2
EQ (tohle je fce ktera chce 2 parametry tak by to mela dusledne vyhonotit) -> NUM3 (vyhodnoti se EQ(NUM1,NUM2)


a nebo

NUM1 -> NUM1
EQ -> NUM1_EQ (nezname oba parametry ale i jedna konstanta dokaze pomoct tak ji bereme)
IF -> NUM1_EQ_IF (if chce jeden parametr bool, tak se hodi mit tohle slovo a spojime ho uz ted)

a nebo

DUP -> DUP
NUM1 -> DUP NUM1
EQ -> DUP NUM1_EQ (nezname oba parametry ale i jedna konstanta dokaze pomoct tak ji bereme)
IF -> DUP NUM1_EQ_IF (if chce jeden parametr bool, tak se hodi mit tohle slovo a spojime ho uz ted)

a v druhem pruchodu teprve spojime DUP+DATA na

DUP -> DUP
NUM_EQ_IF -> DUP_NUM_EQ_IF

kde druhy pruchod by nasel pokud by mel na vstupu slova jako DUP+NUM na DUP_NUM.

Tohle pravidlo me dava jasne najevo kde mam co umistnit. Napriklad spojeni EQ+IF patri do prvniho pruchodu a nebude kolidovat s nicim protoze je jasne ze EQ neziskalo zadny parametr, jinak by to bylo NUM_EQ+IF, pripadne rovnou NUM+IF.

Tohle se snazim sjednotit a udelat pro vsechna nova slova c=,c<>,c<,c<=,cu>,cu>=,cu<,cu<=,cu>,cu>=. Protoze se ukazuje ze ne vsechny slozena slova mam udelana a tak ty pravidla nejsou jednotna a rozhazena vsude mozne, nekde i zbytecne duplicitne atd.

Konkretne jsem nemel vsude NUM+CONDITION takze jsem to obcas resil jako

NUM -> NUM
CONDITION -> NUM CONDITION
IF -> NUM_CONDITION_IF (nasel spojeni, ale musel se divat na 2 posledni ulozene tokeny a tohle pravidlo musi byt pred slovem CONDITION+IF, ktere sice nenaslo zadny parametr, ale aspon zna podminku a je to stale lepsi nez 2 nezavisla slova co jedno haze na zasobnik 16 bitovou bool hodnotu a druhe ji vyzvedava testuje a odstranuje, protoze pri spojeni me staci priznak a odstraneni)

a obcas

NUM -> NUM
CONDITION -> NUM_CONDITION (nasel spojeni)
IF -> NUM_CONDITION_IF (a nemusim resit poradi pravidel, protoze nenastane kolize)

Tak jsem se konecne dostal ve vypraveni k tomu ze delam PUSH_CLT (num_c<), PUSH_CLE (num_c<=), kde c je char, takze 8 bitu.

A tady jsem resil ze me nepomuze priznak preteceni protoze vysledek je bool, takze potrebuji mit pro TRUE nastaveny carry a pak udelat:

sbc HL, HL (popripade by slo i rychlejsi ale delsi sbc A,A + ld L,A + ld H,A)

s konstantou LD HL, 0 a podminkovymi skoky je to vetsinou delsi kod. Jedine kdyby to bylo ve fci a mohl bych pouzit podminkovy RET.

Takze mam kod typu "L < const" a resim to

L < const --> L - const < 0 --> carry if true

a protoze je to se znamenkem tak provedu upravu ze invertuji nejvyssi bit.

Kód:
ld A,L
xor 0x80
sub 0x80+const
sbc HL, HL


Tohle je nejsnazsi a optimalni reseni pokud je mi znamo.

Pri "L <= const" jsem to resil tak ze to prevedu na

"L <= const" --> "L < const+1" a pouziji prvni reseni s tim ze se zvlast resi kdy je const maximalni hodnota, protoze je to automaticky TRUE a ve vypoctu by to preteklo.

Ale co delat s tim ze mam otocene vstupy u

"L > const" pripadne "L >= const" protoze invertovat nejvyssi bit v L kdyz ho nedrzim v A je drahe, pripadne CCF stoji dalsi bajt a 4 takty...

A v te chvili se me zacala klicit myslenka, kterou jsem zacal testovat, protoze mam zkusenost ze kolikrat neco delam spatne.
Po XOR a zmene const pridanim 0x80 delam beznamenkove porovnani.
Takze jsem automaticky delal

UA < UB?

UA - UB --> carry true

ale plati neco co jsem vedel ale nikdy me nenapadlo to v tomhle pripade pouzit jak jsem zpomalenej...

sub 1 == add a,255 + ccf
sub 255 == add a,1 + ccf

Takhle jsem to pouzival ale nikdy jsem to nezobecnil...

"L >= const" --> (0x80+L) + (256-(0x80+const)) >= 256
Kód:
ld A,L
xor 0x80
add A, 0x80-const
sbc HL, HL


kdy se musime vyhnout (osetrit jinde) hodnotu 0x80 = -128. Protoze 256-(0x80+0x80) = 256-0 = 256 a 256 + A je vzdy carry, jenze ve vypoctu by se to zmenilo na A+0 a to naopak nikdy carry nevyvola.

Pro
"L > const" --> (0x80+L) + (255-(0x80+const)) >= 256
Kód:
ld A,L
xor 0x80
add A, 0x7F-const
sbc HL, HL


tady by to melo platit v celem rozsahu, protoze pro min(=0x80) je to add A,255 a pokud bylo v L min (0x80) tak po invertovani je to nula.
Pokud je konstanta max(=0x7F) tak je to add A, 0 a uz je jedno co je v A protoze nikdy carry nenastane a to je spravne protoze L nemuze byt vetsi nez max.

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(100) CLT'
    ld    A, L          ; 1:4       100 c<   L<100 --> (0x80+L)<(0x80+100)
    xor  0x80           ; 2:7       100 c<   min --> zero
    sub  0xE4           ; 2:7       100 c<   (0x80+L)<(0x80+100) --> (0x80+L)-(0x80+100)<0 --> true if carry
    sbc  HL, HL         ; 2:15      100 c<   HL = bool, variant: default
; seconds: 0           ;[ 7:33]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(100) CLE'
    ld    A, L          ; 1:4       100 c<=   L<=100 --> L<100+1 --> (0x80+L)<(0x81+100)
    xor  0x80           ; 2:7       100 c<=   min --> zero
    sub  0xE5           ; 2:7       100 c<=   (0x80+HL)<0xE5 --> L-0xE5<0 --> true if carry
    sbc  HL, HL         ; 2:15      100 c<=   HL = bool, variant: default
; seconds: 0           ;[ 7:33]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(100) CGE'
    ld    A, L          ; 1:4       100 c>=   L>=100 --> (0x80+L)+(256-(0x80+100))>=256 and 100 > min
    xor  0x80           ; 2:7       100 c>=   min --> zero
    add   A, 0x1C       ; 2:7       100 c>=   (0x80+L)+28>=256 --> true if carry
    sbc  HL, HL         ; 2:15      100 c>=   HL = bool, variant: default and 100 <> 0x80
; seconds: 0           ;[ 7:33]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(100) CGT'
    ld    A, L          ; 1:4       100 c>   L>100 --> (0x80+L)+(255-(0x80+100))>=256
    xor  0x80           ; 2:7       100 c>   min --> zero
    add   A, 0x1B       ; 2:7       100 c>   (0x80+L)+27>=256 --> true if carry
    sbc  HL, HL         ; 2:15      100 c>   HL = bool, variant: default and 100 <> 0x80
; seconds: 0           ;[ 7:33]

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(xx) CLT'
  if ((0xFF & (xx))=0x80)
  .warning The condition is always False!
    ld   HL, 0x0000     ; 3:10      xx c<   HL = bool, variant: min
  else
   if (xx)
    ld    A, L          ; 1:4       xx c<   L<xx --> (0x80+L)<(128+xx)
    xor  0x80           ; 2:7       xx c<   min --> zero
    sub  128+xx         ; 2:7       xx c<   (0x80+L)<(128+xx) --> (0x80+L)-(128+xx)<0 --> true if carry
    sbc  HL, HL         ; 2:15      xx c<   HL = bool, variant: variable
   else
    ld    A, L          ; 1:4       xx c<   L<xx
    add   A, A          ; 1:4       xx c<   sign to carry
    sbc  HL, HL         ; 2:15      xx c<   HL = bool, variant: zero
   endif
  endif
; seconds: 0           ;[14:66]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(xx) CLE'
  if ((0xFF & (xx))=0x7F)
  .warning The condition is always True!
    ld   HL, 0xFFFF     ; 3:10      xx c<=   HL = bool, variant: max
  else
   if ((0xFF & (xx))=0xFF)
    ld    A, L          ; 1:4       xx c<=   L<=xx
    add   A, A          ; 1:4       xx c<=   sign to carry
    sbc  HL, HL         ; 2:15      xx c<=   HL = bool, variant: zero-1
   else
    ld    A, L          ; 1:4       xx c<=   L<=xx --> (0x80+L)<(129+xx)
    xor  0x80           ; 2:7       xx c<=   min --> zero
    sub  129+xx         ; 2:7       xx c<=   (0x80+L)<(129+xx) --> (0x80+L)-(129+xx)<0 --> true if carry
    sbc  HL, HL         ; 2:15      xx c<=   HL = bool, variant: variable
   endif
  endif
; seconds: 0           ;[14:66]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(xx) CGE'
  if ((0xFF & (xx))=0x80)
  .warning The condition is always True!
    ld   HL, 0xFFFF     ; 3:10      xx c>=   HL = bool, variant: min
  else
   if (xx)
    ld    A, L          ; 1:4       xx c>=   L>=xx --> (0x80+L)+(256-(0x80+xx))>=256 and xx > min
    xor  0x80           ; 2:7       xx c>=   min --> zero
    add   A, 128-xx     ; 2:7       xx c>=   (0x80+L)+128-xx>=256 --> true if carry
    sbc  HL, HL         ; 2:15      xx c>=   HL = bool, variant: variable
   else
    ld    A, L          ; 1:4       xx c>=   L>=xx
    sub  0x80           ; 2:7       xx c>=   sign  --> invert carry
    sbc  HL, HL         ; 2:15      xx c>=   HL = bool, variant: zero
   endif
  endif
; seconds: 0           ;[15:69]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(xx) CGT'
  if ((0xFF & (xx))=0x7F)
  .warning The condition is always False!
    ld   HL, 0x0000     ; 3:10      xx c>   HL = bool, variant: max
  else
  if ((0xFF & (xx))=0xFF)
    ld    A, L          ; 1:4       xx c>   L>xx
    sub  0x80           ; 2:7       xx c>   sign  --> invert carry
    sbc  HL, HL         ; 2:15      xx c>   HL = bool, variant: zero-1
   else
    ld    A, L          ; 1:4       xx c>   L>xx --> (0x80+L)+(255-(0x80+xx))>=256
    xor  0x80           ; 2:7       xx c>   min --> zero
    add   A, 127-xx     ; 2:7       xx c>   (0x80+L)+127-xx>=256 --> true if carry
    sbc  HL, HL         ; 2:15      xx c>   HL = bool, variant: variable
   endif
  endif
; seconds: 0           ;[15:69]


Tohle ma pro me ale dusledky i pro 16 bitove porovnani, protoze to znamena ze je nedelam nekdy optimalne...
Misto "ld BC, const + or A + sbc HL, BC" to sice pocitam rychleji pomoci A osmibitove...
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) ULT'
    ld    A, L          ; 1:4       0x1234 u<   HL<4660 --> L-0x34<0 --> true if carry
    sub  0x34           ; 2:7       0x1234 u<   HL<4660 --> L-0x34<0 --> true if carry
    ld    A, H          ; 1:4       0x1234 u<   HL<4660 --> H-0x12<0 --> true if carry
    sbc   A, 0x12       ; 2:7       0x1234 u<   HL<4660 --> H-0x12<0 --> true if carry
    sbc  HL, HL         ; 2:15      0x1234 u<   HL = bool, variant: default
; seconds: 0           ;[ 8:37]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) ULE'
    ld    A, L          ; 1:4       0x1234 u<=   HL<=4660 --> HL<4660+1
    sub  0x35           ; 2:7       0x1234 u<=   HL<4660+1 --> L-0x35<0 --> true if carry
    ld    A, H          ; 1:4       0x1234 u<=   HL<4660+1 --> H-0x12<0 --> true if carry
    sbc   A, 0x12       ; 2:7       0x1234 u<=   HL<4660+1 --> H-0x12<0 --> true if carry
    sbc  HL, HL         ; 2:15      0x1234 u<=   HL = bool, variant: default
; seconds: 0           ;[ 8:37]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) UGE'
    ld    A, 0x33       ; 2:7       0x1234 u>=   HL>=4660 --> HL>4660-1
    sub   L             ; 1:4       0x1234 u>=   HL>4660-1 --> 0>0x33-L --> true if carry
    ld    A, 0x12       ; 2:7       0x1234 u>=   HL>4660-1 --> 0>0x12-H --> true if carry
    sbc   A, H          ; 1:4       0x1234 u>=   HL>4660-1 --> 0>0x12-H --> true if carry
    sbc  HL, HL         ; 2:15      0x1234 u>=   HL = bool, variant: default
; seconds: 0           ;[ 8:37]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) UGT'
    ld    A, 0x34       ; 2:7       0x1234 u>   HL>4660 --> 0>0x34-L --> true if carry
    sub   L             ; 1:4       0x1234 u>   HL>4660 --> 0>0x34-L --> true if carry
    ld    A, 0x12       ; 2:7       0x1234 u>   HL>4660 --> 0>0x12-H --> true if carry
    sbc   A, H          ; 1:4       0x1234 u>   HL>4660 --> 0>0x12-H --> true if carry
    sbc  HL, HL         ; 2:15      0x1234 u>   HL = bool, variant: default
; seconds: 0           ;[ 8:37]

..., ale tady se ukazuje ze pro UGE a UGT mohu pouzit
Kód:
   ld   BC, edit_const ; 3:10
   add  HL, BC         ; 1:11
   sbc  HL, HL         ; 2:15      0x1234 u>   HL = bool, variant: default
; seconds: 0           ;[6:36]


6:36!!! (popripade 7:40 s ccf pro ULT a ULE pokud preferujete kratsi kod, a on je vlastne pro me optimalni protoze mam za to ze 1 bajt ma cenu 4 taktu a tady budeme o 3 takty pomalejsi a 1 bajt kratsi) Ponauceni je ze pri porovnani cisla a konstanty nepouzivejte odcitani a podteceni ale pricitani a preteceni (navic to ma tu vyhodu, ze pri pricitani muzete zamenit hodnoty).

PS: Na odcitani konstanty jsem bezne pouzival pricitani zaporne konstanty, ale u porovnani jsem se slepe drzel odcitani. Zvlastni jak hlava pracuje a drzi se zajetych koleji. Dalo by se rici ze tohle je naprosto trivialni zmena a pritom bylo na to prijit tak tezke.

PPS: Pro porovnani (a pobaveni) si jeste rypnu to C prekladace
Kód:
int lt_5(char num1) {
    return (num1<5);
}
int gt_5(char num1) {
    return (num1>5);
}
void main(){
    lt_5(10);
    gt_5(3);
}
Kód:
._lt_5
        ld      hl,2        ;const
        add     hl,sp
        call    l_gchar
        ld      a,l
        xor     128
        sub     133
        ld      hl,0        ;const
        rl      l
        ret

._gt_5
        ld      hl,2        ;const
        add     hl,sp
        call    l_gchar
        ld      de,5
        ex      de,hl
        call    l_gt
        ret

._main
        ld      hl,10       ;const
        push    hl
        call    _lt_5
        ld      hl,3        ;const
        ex      (sp),hl
        call    _gt_5
        pop     bc
        ret

Je videt ze u "< 5" to resi stejne jen vola dalsi fci l_gchar kvuli... rozsireni 8 bitove hodnoty na 16 bitovou??? a u > 5 to rovnou vzdava a radsi vola fci l_gt a resi to jako 2 promenne.

Naposledy co jsem se dival jak resi ty fce tak tam mel neco jako bezpodminkovy skok na nasledujici instrukci atd.
Kód:
; true  = 1
; false = 0


; l_lt    de<hl --> de-hl<0
   ld a,h         ;8294
   add a,080h      ;8295
   ld b,a         ;8297
   ld a,d         ;8298
   add a,080h      ;8299
   cp b         ;829b
   jp nz,082a4h      ;829c
; h==d
   ld a,e         ;829f
   cp l         ;82a0
   jp 082a4h      ;82a1  !!!!!!!?????
;82a4
   ld hl,00000h      ;82a4
   ret nc         ;82a7
   inc hl         ;82a8
   ret         ;82a9


PPPS: A rovnou mohu ukazat jak resi unsigned int (on fakt pouziva vsude 16 bitove odcitani... Aspon ze to nevola pres fce i kdyz kdyby to opravil na to 16 bitove add tak mu zustane ten pop_push cirkus protoze C...
Kód:
int lt_100(unsigned int num1) {
    return (num1<100);
}
int gt_100(unsigned int num1) {
    return (num1>100);
}
void main(){
    lt_100(10);
    gt_100(3);
}

Kód:
._lt_100
        pop     bc
        pop     hl
        push    hl
        push    bc
        ld      de,100
        and     a
        sbc     hl,de
        ld      hl,0        ;const
        rl      l
        ret

._gt_100
        pop     bc
        pop     de
        push    de
        push    bc
        ld      hl,100
        and     a
        sbc     hl,de
        ld      hl,0        ;const
        rl      l
        ret

._main
        ld      hl,10       ;const
        push    hl
        call    _lt_100
        ld      hl,3        ;const
        ex      (sp),hl
        call    _gt_100
        pop     bc
        ret


PPPPS: Takze objev super, ale dusledek je, ze me ceka spoustu dnu prace to opravit. A ani nevim co drive, zda dodelat vic tu podporu pro CHAR a nebo resit neoptimalni kod.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Lepsi matematicke vysvetleni (popisky).

Kdyz se odcita tak resime NULU a kdyz se scita tak se resi 65536(nula).
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) ULT IF'
                        ;[9:45]     0x1234 u< if   ( u -- ) variant: default
    ld   BC, 0xEDCC     ; 3:10      0x1234 u< if   HL<4660 --> HL-4660<0 --> HL+65536-4660<65536
    add  HL, BC         ; 1:11      0x1234 u< if   HL<4660 --> HL+0xEDCC<65536 --> false if carry
    ex   DE, HL         ; 1:4       0x1234 u< if
    pop  DE             ; 1:10      0x1234 u< if
    jp    c, else101    ; 3:10      0x1234 u< if   false if carry
; seconds: 0           ;[ 9:45]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) ULE IF'
                        ;[9:45]     0x1234 u<= if   ( u -- ) variant: default
    ld   BC, 0xEDCB     ; 3:10      0x1234 u<= if   HL<=4660 --> HL-4660-1<0 --> HL+65535-4660<65536
    add  HL, BC         ; 1:11      0x1234 u<= if   HL<=4660 --> HL+0xEDCB<65536 --> false if carry
    ex   DE, HL         ; 1:4       0x1234 u<= if
    pop  DE             ; 1:10      0x1234 u<= if
    jp    c, else101    ; 3:10      0x1234 u<= if   false if carry
; seconds: 0           ;[ 9:45]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) UGE IF'
                        ;[9:45]     0x1234 u>= if   ( u -- ) variant: default
    ld   BC, 0xEDCC     ; 3:10      0x1234 u>= if   HL>=4660 --> HL-4660>=0 --> HL+65536-4660>=65536
    add  HL, BC         ; 1:11      0x1234 u>= if   HL>=4660 --> HL+0xEDCC>=65536 --> false if not carry
    ex   DE, HL         ; 1:4       0x1234 u>= if
    pop  DE             ; 1:10      0x1234 u>= if
    jp   nc, else101    ; 3:10      0x1234 u>= if   false if not carry
; seconds: 1           ;[ 9:45]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) UGT IF'
                        ;[9:45]     0x1234 u> if   ( u -- ) variant: default
    ld   BC, 0xEDCB     ; 3:10      0x1234 u> if   HL>4660 --> HL-4660-1>=0 --> HL+65535-4660>=65536
    add  HL, BC         ; 1:11      0x1234 u> if   HL>4660 --> HL+0xEDCB>=65536 --> false if not carry
    ex   DE, HL         ; 1:4       0x1234 u> if
    pop  DE             ; 1:10      0x1234 u> if
    jp   nc, else101    ; 3:10      0x1234 u> if   false if not carry
; seconds: 0           ;[ 9:45]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) ULT'
    ld    A, L          ; 1:4       0x1234 u<   HL<4660 --> L-0x34<0 --> true if carry
    sub  0x34           ; 2:7       0x1234 u<   HL<4660 --> L-0x34<0 --> true if carry
    ld    A, H          ; 1:4       0x1234 u<   HL<4660 --> H-0x12<0 --> true if carry
    sbc   A, 0x12       ; 2:7       0x1234 u<   HL<4660 --> H-0x12<0 --> true if carry
    sbc  HL, HL         ; 2:15      0x1234 u<   HL = bool, variant: default
; seconds: 0           ;[ 8:37]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) ULE'
    ld    A, L          ; 1:4       0x1234 u<=   HL<=4660 --> HL<4660+1
    sub  0x35           ; 2:7       0x1234 u<=   HL<4660+1 --> L-0x35<0 --> true if carry
    ld    A, H          ; 1:4       0x1234 u<=   HL<4660+1 --> H-0x12<0 --> true if carry
    sbc   A, 0x12       ; 2:7       0x1234 u<=   HL<4660+1 --> H-0x12<0 --> true if carry
    sbc  HL, HL         ; 2:15      0x1234 u<=   HL = bool, variant: default
; seconds: 1           ;[ 8:37]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) UGE'
    ld   BC, 0xEDCC     ; 3:10      0x1234 u>=   HL>=4660 --> HL-4660>=0 --> HL+65536-4660>=65536
    add  HL, BC         ; 1:11      0x1234 u>=   HL>=4660 --> HL+0xEDCC>=65536 --> true if carry
    sbc  HL, HL         ; 2:15      0x1234 u>=   HL = bool, variant: default and <> 0
; seconds: 0           ;[ 6:36]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0x1234) UGT'
    ld   BC, 0xEDCB     ; 3:10      0x1234 u>   HL>4660 --> HL-4660-1>=0 --> HL+65535-4660>=65536
    add  HL, BC         ; 1:11      0x1234 u>   HL>4660 --> HL+0xEDCB>=65536 --> true if carry
    sbc  HL, HL         ; 2:15      0x1234 u>   HL = bool, variant: default
; seconds: 0           ;[ 6:36]

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Pridal jsem podporu pro volani ROM fce BEEPER, protoze se to ukazalo pri programovani morseovky jako uzitecna vlastnost.

Kód:
\ define morse letters 32..127

create ascii_table
c"  " ,       \ space
c" -.-.--" ,  \ ! ( or ---...-) (or +)
c" .-..-." ,  \ "
c" ..--.." ,  \ # --> ? --> "num"?
c" ...-..-" , \ $
c" ..--.." ,  \ % --> ? --> "per"?
c" ..--.." ,  \ & --> ? --> "amp"?
c" .----." ,  \ ' or tab 
c" -.--." ,   \ (
c" -.--.-" ,  \ )
c" ..--.." ,  \ * --> ? --> "mul"?
c" .-.-." ,   \ + (or !)
c" --..--" ,  \ , 
c" -....-" ,  \ -
c" .-.-.-" ,  \ . 
c" -..-." ,   \ /   
c" -----" ,   \ 0   
c" .----" ,   \ 1
c" ..---" ,   \ 2   
c" ...--" ,   \ 3
c" ....-" ,   \ 4   
c" ....." ,   \ 5
c" -...." ,   \ 6   
c" --..." ,   \ 7
c" ---.." ,   \ 8   
c" ----." ,   \ 9
c" ---..." ,  \ :
c" -.-.-." ,  \ ;
c" ..--.." ,  \ < --> ? --> "lt"?
c" -...-" ,   \ =
c" ..--.." ,  \ > --> ? --> "gt"?
c" ..--.." ,  \ ?
c" .--.-." ,  \ @
c" .-"  ,     \ A 
c" -..." ,    \ B   
c" -.-." ,    \ C   
c" -.." ,     \ D
c" ." ,       \ E 
c" ..-." ,    \ F   
c" --." ,     \ G   
c" ...." ,    \ H
c" .." ,      \ I 
c" .---" ,    \ J   
c" -.-" ,     \ K   
c" .-.." ,    \ L
c" --" ,      \ M 
c" -." ,      \ N   
c" ---" ,     \ O   
c" .--." ,    \ P
c" --.-" ,    \ Q 
c" .-." ,     \ R   
c" ..." ,     \ S   
c" -" ,       \ T
c" ..-" ,     \ U 
c" ...-" ,    \ V   
c" .--" ,     \ W   
c" -..-" ,    \ X
c" -.--" ,    \ Y 
c" --.." ,    \ Z
c" -.--." ,   \ [ --> (
c" .---." ,   \ \ 
c" -.--.-" ,  \ ] --> )
c" ..--.." ,  \ ↑ or ^ --> "hat"?
c" ..--.-" ,  \ _ or ←
c" .--.-." ,  \ @
c" .-"  ,     \ small A 
c" -..." ,    \ small B   
c" -.-." ,    \ small C   
c" -.." ,     \ small D
c" ." ,       \ small E 
c" ..-." ,    \ small F   
c" --." ,     \ small G   
c" ...." ,    \ small H
c" .." ,      \ small I 
c" .---" ,    \ small J   
c" -.-" ,     \ small K   
c" .-.." ,    \ small L
c" --" ,      \ small M 
c" -." ,      \ small N   
c" ---" ,     \ small O   
c" .--." ,    \ small P
c" --.-" ,    \ small Q 
c" .-." ,     \ small R   
c" ..." ,     \ small S   
c" -" ,       \ small T
c" ..-" ,     \ small U 
c" ...-" ,    \ small V   
c" .--" ,     \ small W   
c" -..-" ,    \ small X
c" -.--" ,    \ small Y 
c" --.." ,    \ small Z
c" -.--." ,   \ { --> (
c" ..--.." ,  \ | --> ? --> "vbr"?
c" -.--.-" ,  \ } --> )
c" ..--.." ,  \ ~ --> ? --> "til"?
c" ..--.." ,  \ (c) or del --> "del"?

80  constant duration       \ 0.08 sec
1   constant dit_dur        \ relative
3   constant dah_dur        \ relative
1   constant inter_gap_dur  \ relative (between the dits and dahs)
3   constant short_gap_dur  \ relative (between letters)
7   constant medium_gap_dur \ relative (between words)

596  constant u_cpudiv2hz  \ F5 --> 3500000/(8*698.4565(hz))-30.125
56   constant u_ft         \ f*t = 698.4565*0.08 (Hz*sec);

: MORSE_CSTRING_EMIT  ( cstring -- )

    count
\      ." >"   

    duration short_gap_dur * ms          \ between letters
   
    1- for
        dup c@
\          bl emit
        duration inter_gap_dur * ms         \ inter_gap_dur
        dup bl = if                         \ check for space character
\               bl emit
             duration short_gap_dur * ms    \ and delay if detected
        else dup [char] . = if
\               [char] . emit
             u_ft dit_dur *
             u_cpudiv2hz zx_beep        \ .
        else dup [char] - = if
\               [char] - emit
             u_ft dah_dur *
             u_cpudiv2hz zx_beep        \ -
        else
\               [char] ( emit
\               dup emit
\               [char] ) emit
        then then then
        drop
        1+
    next
\  ." <" cr
    drop ;

: CHAR_EMIT ( char -- )
    32 -
    dup 96 u>=       \ non-printable character
    if
        [char] ? 32 -
    then
    2* ascii_table + @
    MORSE_CSTRING_EMIT
;

       
: TRANSMIT ( ADDR LEN -- )
           cr                          \ newline,
           bounds                      \ convert loop indices to address ranges
           do
              I C@ dup emit            \ dup and send char to console
              CHAR_EMIT               \ send the morse code
           loop ;

s" Welcome to Wikipedia, the free encyclopedia that anyone can edit." TRANSMIT
\  s" Hello Word!" TRANSMIT
\  s" SOS SOS SOS SSS SSS OOO OOO" TRANSMIT


Ale i kdyz se jedna o pomaly prenos tak je to na me asi 2x rychlejsi nez jsem schopen poradne vnimat. Zacina me to tak splyvat ze jsem z toho jen zmateny co to pipa, jestli je to tecka nebo carka, kde je dalsi pismeno atd. Carka se pak pozna tim ze po tecce to zni jinak... .)
Snazil jsem se to udelat v tonu a rychlosti jako je to na wikipedii.
Muzete si to sami poslechnout zda to davate.

Originalni program pro Forht premapoval vsechny pismena a slova a to bez podpory slovniku tezko slo udelat takze je to cele udelane jinak.
https://rosettacode.org/wiki/Morse_code#Forth

Roku 1851 byl v Rakousku a Nemecku prijat navrh nemeckeho spisovatele Gerkeho pro podporu nemeckych specialnich pismen a s nimi i podpora pro CH. Coz me hlava nebere proc to udelal.
Ale kdyz se koukam na ty rozsirene znaky tak je tam i polske Ž, a slo by z nich poskladat kompletne cestina s diakritikou. Ale kdo by se to ucil... .))) Hodne divne je ze tam je i Š. Kdo to krome cestiny pouziva? A pokud je ceske proc tam neni zbytek? A jeste k tomu je to Š sdilene s CH... :D

Á É Ě Í Ó Ú Ů Ý
Č Ď CH Ň Ř Š Ť Ž

nelatinské
přípony À, à, Å, å
▄ ▄▄▄ ▄▄▄ ▄ ▄▄▄ --> Á

nelatinské
přípony Ä, ä, Ą, ą, Æ, æ
▄ ▄▄▄ ▄ ▄▄▄ --> Í

nelatinské
přípony Ć, ć, Ĉ, ĉ, Ç, ç
▄▄▄ ▄ ▄▄▄ ▄ ▄ --> Č

nelatinské
přípony CH, ch, Ĥ, ĥ, Š, š
▄▄▄ ▄▄▄ ▄▄▄ ▄▄▄ --> CH

nelatinské
přípony Đ, đ, Ę, ę, É, é
Odlišný od eth ( Ð , ð )
▄ ▄ ▄▄▄ ▄ ▄ --> É

nelatinské
přípony Ð, ð
Odlišné od D s tahem ( Đ , đ )
▄ ▄ ▄▄▄ ▄▄▄ ▄ --> Ď

nelatinské
přípony È, è, Ł, ł
▄ ▄▄▄ ▄ ▄ ▄▄▄ --> Ě

nelatinské
přípony Ü, ĝ
▄▄▄ ▄▄▄ ▄ ▄▄▄ ▄

nelatinské
přípony Ĵ, ĵ
▄ ▄▄▄ ▄▄▄ ▄▄▄ ▄ --> Ť

nelatinské
přípony Ń, ń, Ñ, ñ
▄▄▄ ▄▄▄ ▄ ▄▄▄ ▄▄▄ --> Ň

nelatinské
přípony Ó, ó, Ö, ö, Ø, ø
▄▄▄ ▄▄▄ ▄▄▄ ▄ --> Ó

nelatinské
přípony Ś, ś
▄ ▄ ▄ ▄▄▄ ▄ ▄ ▄ --> Ú

nelatinské
přípony Ŝ, ŝ
▄ ▄ ▄ ▄▄▄ ▄ --> Š

nelatinské
přípony Þ, þ
▄ ▄▄▄ ▄▄▄ ▄ ▄ --> Ř

nelatinské
přípony Ü, ü, Ŭ, ŭ
▄ ▄ ▄▄▄ ▄▄▄ --> Ů

nelatinské
přípony Ź, ź
▄▄▄ ▄▄▄ ▄ ▄ ▄▄▄ ▄ --> Ý

nelatinské
přípony Ż, ż
▄▄▄ ▄▄▄ ▄ ▄ ▄▄▄ ---> Ž

PS: Mozna a jenom mozna, kdyby se podpora pro CH nahradila za vysilani C a H jak se to stejne napise a ---- bylo Š a nejak se to preskladalo snad by sla i slovencina (sakra jak se to rekne cesky.. slovenstina?)


Přílohy:
Morse_code.zip [11.06 KiB]
13 krát

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Tak by to asi neslo. Slovenstina ma "navic" ä ŕ ĺ ľ ô. Takze jedine mit kody ciste pro "diakritiku".
Jeste by slo samozrejme udelat sjednoceni kodu pro I + Y a Í Ý a Ú + Ů, pak by to uz slo.. :D
Vzhledem k tomu sjednoceni a nerozliseni velkych a malych pismen by se cestina dost zjednodusila. .)
Jeste spojit S a Z na S pokud je na zacatku slova. .)

PS: Hmmm... a nebo pouzit nejaky silene dlouhy nepouzity kod, ale to by se do toho zacala michat politika.
PPS: Mozna by slo ô nahradit jako uo? Ŕ spojit s Ř, Ä spojit s Ě a pak zbyvaji 2 volne kody pro ĺ ľ pokud se CH vynecha.
PPPS: Koukam ze by

nelatinské
přípony Ä, ä, Ą, ą, Æ, æ
▄ ▄▄▄ ▄ ▄▄▄ --> Í --> Ě + Ä

nelatinské
přípony CH, ch, Ĥ, ĥ, Š, š
▄▄▄ ▄▄▄ ▄▄▄ ▄▄▄ --> CH --> Š

nelatinské
přípony È, è, Ł, ł
▄ ▄▄▄ ▄ ▄ ▄▄▄ --> Ě --> Ľ

nelatinské
přípony Ü, ĝ
▄▄▄ ▄▄▄ ▄ ▄▄▄ ▄ --> Í

nelatinské
přípony Ü, ü, Ŭ, ŭ
▄ ▄ ▄▄▄ ▄▄▄ --> Ů + Ô

nelatinské
přípony Þ, þ
▄ ▄▄▄ ▄▄▄ ▄ ▄ --> Ř + Ŕ

nelatinské
přípony Ŝ, ŝ
▄ ▄ ▄ ▄▄▄ ▄ --> Š --> Ĺ

_________________
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: 21.02.2024, 20:13 
Offline
Kecálek
Uživatelský avatar

Registrován: 18.06.2023, 18:37
Příspěvky: 109
Bydliště: Pražák z Prahe, žádná náplava :)
Has thanked: 20 times
Been thanked: 27 times
A nebo použít jeden nějaký znak jako prefix (U+) a pak tam nacpat unikod (podle vzoru U+1F61B) a hotovo :-P

_________________
Spousta věcí chodí líp, když se zapne ...
http://micro-corner.gilhad.cz/, http://8bit.gilhad.cz/ a mnohé další


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Pokud zmenite slovo MORSE_CSTRING_EMIT na tohle
Kód:
: MORSE_CSTRING_EMIT  ( cstring -- )

    count
0 [IF]
    duration short_gap_dur * ms          \ between letters
    1- for
        dup c@
        duration inter_gap_dur * ms         \ inter_gap_dur
        dup bl = if                         \ check for space character
             bl emit
             duration short_gap_dur * ms    \ and delay if detected
        else dup [char] . = if
             u_ft dit_dur *
             u_cpudiv2hz zx_beep        \ .
        else dup [char] - = if
             u_ft dah_dur *
             u_cpudiv2hz zx_beep        \ -
        then then then
        drop
        1+
    next
[ELSE]
    duration short_gap_dur * ms          \ between letters
    bl emit
    1- for
        dup c@
        8 emit bl emit 8 emit
        duration inter_gap_dur * ms         \ inter_gap_dur
        dup bl = if                         \ check for space character
             duration short_gap_dur * ms    \ and delay if detected
        else dup [char] . = if
             [char] . emit
             u_ft dit_dur *
             u_cpudiv2hz zx_beep        \ .
        else dup [char] - = if
             [char] - emit
             u_ft dah_dur *
             u_cpudiv2hz zx_beep        \ -
        else
             emit
        then then then
        drop
        1+
    next
    8 emit bl emit 8 emit
[ENDIF]

a znovu zkompilujete, tak je to mnohem lepsi. Kdyz vam to pri pipani ukazuje - nebo . tak je to snadne rozlisit.

PS: https://codeberg.org/DW0RKiN/M4_FORTH/s ... e_code.tap
PPS: Vypada to jako hodne zajimavy zpusob vypsani textu a zaroven jako desne otravny jak je to pomale.. .)

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Existuje stranka s chatovanim v morseovce. Ale moc nedoporucuji pouzivat pokud to nemate natrenovano...

Protoze jsem tam hrozne trolil a nebyl schopen nic napsat. :?

https://morse.halb.it/?channel=ch1

Dulezita vec na zacatku, zmente si rychlost psani WPN na nejakou nizsi hodnotu.
Druha vec je ze se vam bude ukazovat co plodite nahore.
Zda jste zvladli tecku (snadne)
Zda to podrzeni se uz zmenilo na carku (obtiznejsi)
Dulezite jsou i rozestupy. Co ukoncuje znak a co slovo... Doporucuji mezery uprostred pismena delat ...skoro zadne, proste to hned zase stlacit.
Pocitejte s tim ze nezvladnete ani jedno slozitejsi pismeno.
Misto Y -.-- bude psat -. -- co je NM atd.

PS: Ona je tam moznost si podrzet mys i nad kosem a smazat to nez se to odesle pokud je to nesmysl... a jeste jde prepnout kanal na trenink, kde nikoho neobtezujete.
PPS: A nahore nad textem zacne bezet odpocet a v te chvili uz jste vlozili mezeru, takze jste ukoncili nejen pismeno ale i slovo a pokud probehne cely tak se to odesle. Dobre je zacit zkouset psat neco jako "aaaaa aa a a a" protoze je to ".-".
PPPS: Taky nejde zkazit kdyz pretahnete signal pro -, klidne mnohonasobne a nic se nestane...je to takova pauza... naopak pokud ho "nedotahnete" tak dostanete tecku misto carky.
PPPPS: Nevim proc ale je pro me velice obtizne napsat neco jako pismeno C "-.-." casto se to rozpoji "TR" "-/.-." a nebo to skonci jako X "-..-" nebo Y "-.--". Moje pokusy na 20 WPM (na mene nemam trpelivost) "tr c cc k y ykxb cyxxxx x c x x tr c cbb xcxc de e "

A jeste jsem si vsimnul ze - zobrazuji jako _ takze je to v jedne linii s ".". To pouziji v programu. Hmm.. pro zobrazeni pri psani je to dobre, ale zapis je lepsi s -, protoze nesplyva pri navazovani "----" "____". Hmm... a navic je pak ten pomer 1:4 a ne 1:3. Nevim co je ted horsi zda poskakovani nebo tohle.. .)

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Pokud jste chteli vedet jak by znela skladba z Cyberpunk 2077 Edgerunners hrana na beeperu ZX Spectra tak si to muzete poslechnout.
phpBB [video]

https://www.youtube.com/watch?v=1AQGruKJhO4


Přílohy:
cyberpunk.tap.zip [5.36 KiB]
3 krát

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Pri prevodu do videa se stala nejaka chyba. Kdyz se pozorne zadivate na ten obrazek, tak pouhou dedukci jde najit misto, ktere by ZX nedokazal zobrazit! Nemusite u toho pocitat pixely.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Nike #1
dsx_nike1.mod
phpBB [video]

https://www.youtube.com/watch?v=PKDMHVykX9A
https://modarchive.org/index.php?request=view_by_moduleid&query=67507

PS: Pro ty obrazky jsem musel upravit skript v adresari ./Compile, protoze implicitne ocekaval vystup z octode2k16, takze ten prvne kompiloval na binarku pevne na adresu bufferu. Ted vse co nema priponu ".dat" bere jako binarku a rovnou pakuje.

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Tak neco takoveho jste na beeperu jeste neslyseli!
prelude.mod
phpBB [video]

https://www.youtube.com/watch?v=RFJooCUfuFk
https://modarchive.org/index.php?request=view_by_moduleid&query=56349
https://codeberg.org/DW0RKiN/M4_FORTH/src/branch/master/Testing/prelude.tap

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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
W.O.T.W: Intro number 82 (ZX Spectrum 1 bit beeper cover)
phpBB [video]

https://www.youtube.com/watch?v=28eajCmzOcc
https://modarchive.org/index.php?reques ... ery=124507
https://www.facebook.com/wotw.8bit/

PS: Dokazal jsem identifikovat autora, pry je slavny na amiga scene. V textu pise ze mu mam napsat... ale... nasel jsem jen kontakt na facebook, nasr*t! .)) Ja s nikym nemluvim. Nekdy odpovidam i s 4 letym spozdenim... Mesice nezvedam telefon. Dokonce i vodafone me zrusil cislo a uz vyprsel mesic z dvoumesicni lhuty kdy me zrusi cislo. Mozna ho obnovim, mozna ne. Bez neho se nedostanu ke sve bance. Zbude me jen anglicka a anglicke cislo. Takze mu psat nebudu kvuli takove prkotine.

_________________
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ů: 598 ]  Přejít na stránku Předchozí  1 ... 36, 37, 38, 39, 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 26 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