OldComp.cz

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

Sokolovna Slavonn

Právě je 17.05.2022, 13:03

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 174 ]  Přejít na stránku Předchozí  1 ... 8, 9, 10, 11, 12
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.03.2022, 21:54 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 712
Has thanked: 64 times
Been thanked: 125 times
Kód:
S_STK_LST   274C   PUSH DE   Stack the 'last' values briefly.
274D   CALL SYNTAX_Z   Do not perform the actual operation if syntax is being checked.
2750   JR Z,S_SYNTEST
2752   LD A,E   The 'last' operation code.
2753   AND $3F   Strip off bits 6 and 7 to convert the operation code to a calculator offset.
2755   LD B,A
2756   RST $28   Now use the calculator.
2757   DEFB $3B   fp_calc_2: (perform the actual operation)
2758   DEFB $38   end_calc
2759   JR S_RUNTEST   Jump forward.

Urcite #2755? Protoze to pak pokracuje S_RUNTEST a pak to udela S_LOOP na 0x2734.
Nemyslel jsi taky https://skoolkid.github.io/rom/asm/353B.html?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.03.2022, 22:12 
Offline
Pan Generální

Registrován: 22.05.2013, 21:14
Příspěvky: 3360
Bydliště: Bratislava
Has thanked: 334 times
Been thanked: 687 times
_dworkin píše:
Kód:
...
2755   LD B,A
2756   RST $28   Now use the calculator.
2757   DEFB $3B   fp_calc_2: (perform the actual operation)
2758   DEFB $38   end_calc
...
Urcite #2755? Protoze to pak pokracuje S_RUNTEST a pak to udela S_LOOP na 0x2734.
Ano, urcite, ved si sam v tom vypise uviedol - na #2755 sa pomocou LD B,A presunie kod operacie do B a potom od #2756 je sekvencia pre kalkulacku pozostavajuca z kodu #3B.

Uvadzal som to len ako priklad kde v romke a preco sa to pouziva. Ze kod za tym pokracuje dalsimi cinnostami, nie je podstatne.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.03.2022, 22:38 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 712
Has thanked: 64 times
Been thanked: 125 times
Busy píše:
_dworkin píše:
Kód:
...
2755   LD B,A
2756   RST $28   Now use the calculator.
2757   DEFB $3B   fp_calc_2: (perform the actual operation)
2758   DEFB $38   end_calc
...
Urcite #2755? Protoze to pak pokracuje S_RUNTEST a pak to udela S_LOOP na 0x2734.
Ano, urcite, ved si sam v tom vypise uviedol - na #2755 sa pomocou LD B,A presunie kod operacie do B a potom od #2756 je sekvencia pre kalkulacku pozostavajuca z kodu #3B.

Uvadzal som to len ako priklad kde v romke a preco sa to pouziva. Ze kod za tym pokracuje dalsimi cinnostami, nie je podstatne.


Aha uz me doslo jak to myslis. Protoze ja narazel na to ze kdyz budu volat call #2755 tak se mi program nikdy nevrati do meho kodu a ty jsi to myslel jen jako ukazku kterou mam zkopirovat do me rutiny.

Edit profiler me ukazuje ze pokud je po RST 0x28 byte s 0x3B tak to trva 2033356 taktu a pokud je tam 0x0D tak o trosku mene 2029202 taktu.
Oboje vraci spravne vysledky.
Kód:
Pouze rozdilne pruchody
0x0D    t-clock         0x3B   t-clock          diff t-clock
0x0a4f   475         0x0a4f   483               8
0x0adc   7984         0x0adc   8046               62
0x0ae2   7667         0x0ae2   7700               33
0x0ae8   7839         0x0ae8   7905               66
0x0aec   6445         0x0aec   6471               26
0x0b03   7309         0x0b03   7291               -18
0x0b09   7488         0x0b09   7506               18
0x0b0d   6199         0x0b0d   6220               21
0x0b10   7756         0x0b10   7820               64
0x0b66   6417         0x0b66   6335               -82
0x0b6e   4814         0x0b6e   4841               27
0x0b74   1375         0x0b74   1366               -9
0x0b9b   4214         0x0b9b   4195               -19
0x0bab   6643         0x0bab   6615               -28
0x0bb8   17088         0x0bb8   17074               -14
0x0bbc   18254         0x0bbc   18276               22
0x0be4   6496         0x0be4   6531               35
0x0be8   2157         0x0be8   2153               -4
0x0bec   6369         0x0bec   6392               23
0x0bfa   6792         0x0bfa   6823               31
0x0c08   2186         0x0c08   2183               -3
0x0c55   917         0x0c55   913               -4
0x0c5f   893         0x0c5f   879               -14
0x0c66   834         0x0c66   824               -10
0x0ddc   1381         0x0ddc   1369               -12
0x0de3   1436         0x0de3   1452               16
0x15f4   5971         0x15f4   6055               84
0x15f7   2315         0x15f7   2301               -14
0x15f9   2489         0x15f9   2483               -6
0x1f05   11237         0x1f05   11177               -60
0x2abb   39         0x2abb   42               3
0x2e8a   15631         0x2e8a   15666               35
0x2e8d   14461         0x2e8d   14442               -19
0x2e9d   1311         0x2e9d   1365               54
0x2ea1   10265         0x2ea1   9887               -378
0x2ea9   751         0x2ea9   791               40
0x2eab   2271         0x2eab   2250               -21
0x2eae   2339         0x2eae   2338               -1
0x2eba   691         0x2eba   675               -16
0x2edf   6394         0x2edf   6386               -8
0x2f02   5703         0x2f02   5684               -19
0x2f06   2521         0x2f06   2473               -48
0x2f07   7414         0x2f07   7428               14
0x2f10   964         0x2f10   973               9
0x2f19   2521         0x2f19   2523               2
0x2f1c   2246         0x2f1c   2255               9
0x2f2d   950         0x2f2d   959               9
0x2f36   997         0x2f36   989               -8
0x2f56   982         0x2f56   999               17
0x335f   4060         0x335f   4033               -27
0x3365   36180         0x3365   36415               235
0x336c   17743         0x336c   17941               198
0x336d   6452         0x336d   6524               72
0x336e   16130         0x336e   16310               180
0x3380   8659         0x3380   8785               126
0x3382   12484         0x3382   12700               216
0x338c   4948         0x338c   5020               72
0x338d   4948         0x338d   5020               72
0x338e   16130         0x338e   16310               180
0x3391   11291         0x3391   11417               126
0x3393   17743         0x3393   17941               198
0x3394   11291         0x3394   11417               126
0x3395   9678         0x3395   9786               108
0x3396   11291         0x3396   11417               126
0x3397   16130         0x3397   16310               180
0x339a   30647         0x339a   30989               342
0x339b   17743         0x339b   17941               198
0x339c   6452         0x339c   6524               72
0x339d   37617         0x339d   38340               723
0x33a1   18130         0x33a1   18310               180
            0x33a2   180               180
            0x33a3   236               236
            0x33a6   72               72
            0x33a7   216               216
0x33c3   61606         0x33c3   61677               71
0x3410   1642         0x3410   1594               -48
0x342f   4543         0x342f   4487               -56
0x35bf   6472         0x35bf   6335               -137
0x8148   1024         0x8148   1039               15
0x817f   1020         0x817f   987               -33
0x818c   1175         0x818c   1197               22
                              
   2029202            2033356               


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.03.2022, 14:28 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 712
Has thanked: 64 times
Been thanked: 125 times
Jen pro zajimavost jak muze byt programovani matouci. Overoval jsem si jak vlastne presne uklada ROM cela cisla dovnitr floating-point. Na netu toho moc neni a neco je dokonce spatne. Slo mi hlavne o zaporna cisla, kvuli testu zda je cislo mensi nez nula. Zda mi staci overovat pouze nevyssi bit druheho bajtu. Zmatlo me ze mi nedoslo ze treti bajt je NIZSI a ctvrty VYSSI cisla, ne jak to ma mantisa. Tak jsem si napsal slovo pro vypis cisel v hex forme, abych rychle videl co je fyzicky v pameti a co se tiskne za cislo.
No a tohle me vylezlo, prvne jsem si toho nevsiml a pak jen ziral:
Příloha:
negate.png
negate.png [ 3.31 KiB | Zobrazeno 1490 krát ]

Vidite to taky? :D Co to ma byt?
Problem psani kompilatoru je ze chyba muze byt uplne kdekoliv. I v casti kterou uz pouzivate a zatim se chyba neprojevila. Takze jsem tam pridal jiny zpusob ukladani cisel na float zasobnik. Kopirovani z pameti z konstanty. Problem stejny. Prohlizim ZX48FHEXDOT a nechapu, vzdyt tam jen ctu a nic neukladam! Prohlizim jiny program kde nepouzivam ZX48FHEXDOT a ten funguje. Divam se do asm zdrojaku a nic nevidim.
Tisknu cislo pred ZX48FHEXDOT a je to spravne a po nem spatne.
Tisknu pomoci ZX48FHEXDOT 2x a uz je to spavne! Ale druhy hex vypis tiskne jine cislo. Nektere bity otoci, nektere ne. Presne tak aby ten float byl zaporny. Jak je to sakra mozny, az takhle komplexne.

Oh! Je zapomel ukoncit fci pomoci RET...

A pod tim je ZX48FNEGATE...

lol


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.03.2022, 19:12 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 712
Has thanked: 64 times
Been thanked: 125 times
Zmenil jsem nacitani celych cisel z Forth zasobniku do floating zasobniku.
Kód:
_ZX48U_TO_F:
    push DE             ; 1:11      _zx48u>f   ( c ret . b a -- ret . c b )
    ld    B, H          ; 1:4       _zx48u>f
    ld    C, L          ; 1:4       _zx48u>f
    call 0x2D2B         ; 3:17      _zx48u>f   call ZX ROM stack BC routine
    pop  HL             ; 1:10      _zx48u>f
    pop  BC             ; 1:10      _zx48u>f   ret
    pop  DE             ; 1:10      _zx48u>f
    push BC             ; 1:11      _zx48u>f   ret
    ret                 ; 1:10      _zx48u>f
                       ;[11:87]
_ZX48BC_TO_F:
    push DE             ; 1:11      _zx48bc_to_f
    push HL             ; 1:11      _zx48bc_to_f
    call 0x2D2B         ; 3:17      _zx48bc_to_f   call ZX ROM stack BC routine
    pop  HL             ; 1:10      _zx48bc_to_f
    pop  DE             ; 1:10      _zx48bc_to_f
    ret                 ; 1:10      _zx48bc_to_f
                       ;[ 8:69]
_ZX48FNEGATE:
    push DE             ; 1:11      _zx48fnegate
    push HL             ; 1:11      _zx48fnegate
    rst 0x28            ; 1:11      Use the calculator
    db  0x1B            ; 1:        calc-negate
    db  0x38            ; 1:        calc-end    Pollutes: AF, BC, BC', DE'(=DE)
    pop  HL             ; 1:10      _zx48fnegate
    pop  DE             ; 1:10      _zx48fnegate
    ret                 ; 1:10      _zx48fnegate
                       ;[ 8:63+?]

Mam na mysli variantu kdy vlozite konstantu do Forthu a tu hned presouvate do float zasobniku.
Predtim jsem pouzival ZX ROM fci "BC_TO_F".
Ta byla super kratoucka.
Ale nacita cisla jakou unsigned.
Takze zaporna jsem nacital tak, ze jsem je po prevedeni na kladna nacetl a zavolal fci FNEGATE.
To fungovalo pekne, jen to u vsech zapornych hodnot bylo o 3 bajty delsi a kod celkem pomaly.

Ted kdyz jsem pochopil jak ma ZX ulozeny ty celociselne konstanty jsem udelal fce:
Kód:
_ZX48S_TO_F:            ;           _zx48s>f   ( num ret . de hl -- ret . num de )
    ld    B, H          ; 1:4       _zx48s>f
    ld    C, L          ; 1:4       _zx48s>f
    pop  HL             ; 1:10      _zx48s>f   ( num . de ret )
    ex  (SP),HL         ; 1:19      _zx48s>f   ( ret . de num )
    ex   DE, HL         ; 1:4       _zx48s>f   ( ret . num de )
    ; fall to _zx48bbc_to_f

_ZX48BBC_TO_F:          ;[3:12]     _zx48bbc_to_f
    ld    A, B          ; 1:4       _zx48bbc_to_f
    add   A, A          ; 1:4       _zx48bbc_to_f
    sbc   A, A          ; 1:4       _zx48bbc_to_f
    ; fall to _zx48abc_to_f

_ZX48ABC_TO_F:         ;[21:134]    _zx48abc_to_f
    push HL             ; 1:11      _zx48abc_to_f
    ld   HL,(0x5C65)    ; 3:16      _zx48abc_to_f   load STKEND
    ld  (HL),0x00       ; 2:10      _zx48abc_to_f
    inc  HL             ; 1:6       _zx48abc_to_f
    ld  (HL), A         ; 1:7       _zx48abc_to_f
    inc  HL             ; 1:6       _zx48abc_to_f
    ld  (HL), C         ; 1:7       _zx48abc_to_f
    inc  HL             ; 1:6       _zx48abc_to_f
    ld  (HL), B         ; 1:7       _zx48abc_to_f
    inc  HL             ; 1:6       _zx48abc_to_f
    ld  (HL),0x00       ; 2:10      _zx48abc_to_f
    inc  HL             ; 1:6       _zx48abc_to_f
    ld  (0x5C65),HL     ; 3:16      _zx48abc_to_f   save STKEND+5
    pop  HL             ; 1:10      _zx48abc_to_f
    ret                 ; 1:10      _zx48abc_to_f
Ktera jsou o dost vetsi nez puvodni osmibajtova BC_TO_F. Ale vypadla dalsi osmibajtova fce FNEGATE, protoze ji nemusim pouzivat pro zaporne konstanty.
A pokud volam cislo v rozsahu 16 bitoveho integeru staci me volat vzdy BBC_TO_F. Protoze znamenko do druheho bajtu si najde.
Pokud bych volal kladne cislo vetsi nez 0x7FFF tak mi to vygeneruje
xor A
call ABC_TO_F
Coz je o jeden bajt delsi nez puvodni varianta.
Pokud bych volal zaporne cislo, ktere je zaporne pouze jako 17 bitove. Teda ma nejvyssi bajt nulovy tak mi to vygeneruje
ld A, 0xFF
call ABC_TO_F
Na kazdem volani bych tak usetril 1 bajt oproti puvodni variante.

Zda je to lepsi zalezi hodne na konkretnim programu, ale prijde mi, ze to stoji za zmenu.
Puvodni slovo jsem radsi ponechal s novym jmenem ZX48U_TO_S ( == u>s) a PUSH_ZX48U_S(123) ( == 123 s>f )

PS: Hmm, mohl jsem vtvorit rutinu pro zaporna cisla s volanim BC_TO_HL a pak negate. Takze by pak volani bylo vzdy 3 bajty. Ale to je mi stale proti srsti, delat to tak zbytecne pomalu a slozite.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 11.03.2022, 03:48 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 712
Has thanked: 64 times
Been thanked: 125 times
Ukazalo se vyhodnejsi pouzit misto parametru "reg A + reg BC" pouze "carry + reg BC".
Mezi rutinami jsem jen presunul instrukci "sbc A,A" a ted usetrim pokazde jeden bajt kdyz misto "ld A, 0xFF" pouziji "scf".

Dalsich 8 bajtu se usetrilo kdyz volam 0x2ABB. Viz
Kód:
_ZX48S_TO_F:            ;           _zx48s>f   ( num ret . de hl -- ret . num de )
    ld    B, H          ; 1:4       _zx48s>f
    ld    C, L          ; 1:4       _zx48s>f
    pop  HL             ; 1:10      _zx48s>f   ( num . de ret )
    ex  (SP),HL         ; 1:19      _zx48s>f   ( ret . de num )
    ex   DE, HL         ; 1:4       _zx48s>f   ( ret . num de )
    ; fall to _zx48bbc_to_f

_ZX48BBC_TO_F:          ;[2:8]      _zx48bbc_to_f
    ld    A, B          ; 1:4       _zx48bbc_to_f
    add   A, A          ; 1:4       _zx48bbc_to_f
    ; fall to _zx48cfbc_to_f

if 1
_ZX48CFBC_TO_F:        ;[14:200]    _zx48cfbc_to_f
    sbc   A, A          ; 1:4       _zx48cfbc_to_f   0x00 or 0xff
    push HL             ; 1:11      _zx48cfbc_to_f
    push DE             ; 1:11      _zx48cfbc_to_f
    ld    E, A          ; 1:4       _zx48cfbc_to_f
    ld    D, C          ; 1:4       _zx48cfbc_to_f
    ld    C, B          ; 1:4       _zx48cfbc_to_f
    xor   A             ; 1:4       _zx48cfbc_to_f
    ld    B, A          ; 1:4       _zx48cfbc_to_f
    call 0x2ABB         ; 3:124     _zx48cfbc_to_f   new float = a,e,d,c,b = 0,0-sign,lo,hi,0
    pop  DE             ; 1:10      _zx48cfbc_to_f
else
_ZX48CFBC_TO_F:        ;[22:138]    _zx48cfbc_to_f
    sbc   A, A          ; 1:4       _zx48cfbc_to_f   0x00 or 0xff
    push HL             ; 1:11      _zx48cfbc_to_f
    ld   HL,(0x5C65)    ; 3:16      _zx48cfbc_to_f   load STKEND
    ld  (HL),0x00       ; 2:10      _zx48cfbc_to_f
    inc  HL             ; 1:6       _zx48cfbc_to_f
    ld  (HL), A         ; 1:7       _zx48cfbc_to_f
    inc  HL             ; 1:6       _zx48cfbc_to_f
    ld  (HL), C         ; 1:7       _zx48cfbc_to_f
    inc  HL             ; 1:6       _zx48cfbc_to_f
    ld  (HL), B         ; 1:7       _zx48cfbc_to_f
    inc  HL             ; 1:6       _zx48cfbc_to_f
    ld  (HL),0x00       ; 2:10      _zx48cfbc_to_f
    inc  HL             ; 1:6       _zx48cfbc_to_f
    ld  (0x5C65),HL     ; 3:16      _zx48cfbc_to_f   save STKEND+5
endif
    pop  HL             ; 1:10      _zx48cfbc_to_f
    ret                 ; 1:10      _zx48cfbc_to_f

Kód:
2ABB   LD HL,($5C65)   Fetch the address of the first location above the present stack (STKEND).
2ABE   LD (HL),A   Transfer the first byte.
2ABF   INC HL   Step on.
2AC0   LD (HL),E   Transfer the second and third bytes; for a string these will be the 'start'.
2AC1   INC HL
2AC2   LD (HL),D
2AC3   INC HL   Step on.
2AC4   LD (HL),C   Transfer the fourth and fifth bytes; for a string these will be the 'length'.
2AC5   INC HL
2AC6   LD (HL),B
2AC7   INC HL   Step on so as to point to the location above the stack.
2AC8   LD ($5C65),HL   Save this address in STKEND and return.
2ACB   RET


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 17.03.2022, 15:57 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 712
Has thanked: 64 times
Been thanked: 125 times
Mensi odbocka od floating point. Dodelal jsem si optimalizaci pro bitove posuny. Mel jsem univerzalni funkce co ctou parametry ze zasobniku (RSHIFT & LSHIFT) a pak pro pripad posunu o jeden bit (_1RSHIFT & _1LSHIFT). Pridal jsem zbytek, kdyz je znamo v dobe prekladu o kolik bitu se to ma posouvat.

V podstate je to skoro stejne jako na strance https://www.chilliant.com/z80shift.html, jen tam chybi v posunu >> 6 optimalni varianta.

Takhle to vypada v testech pro LSHIFT
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ echo "10 lshift" | ../forth2m4.sh
include(`../M4/FIRST.M4')dnl
ORG 0x8000
INIT(60000)
...
STOP
PUSH_LSHIFT(10)

include({../M4/LAST.M4})dnl
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ echo "+10 lshift" | ../forth2m4.sh
include(`../M4/FIRST.M4')dnl
ORG 0x8000
INIT(60000)
...
STOP
PUSH_LSHIFT(+10)

include({../M4/LAST.M4})dnl
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ echo "-10 lshift" | ../forth2m4.sh
include(`../M4/FIRST.M4')dnl
ORG 0x8000
INIT(60000)
...
STOP
PUSH_RSHIFT(10)

include({../M4/LAST.M4})dnl
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT()"
; vvv
; ^^^
    .error PUSH_LSHIFT(): Missing address parameter!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(1,2)"
; vvv
; ^^^
    .error PUSH_LSHIFT(1,2): 2 parameters found in macro!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(xxx)"
m4:stdin:3: bad expression in eval: xxx
; vvv
; ^^^
    .error PUSH_LSHIFT(xxx): M4 does not know the "xxx" value and therefore cannot create the code!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT((0x8080))"
; vvv
; ^^^
    .error PUSH_LSHIFT((0x8080)): Pointer as parameter is not supported!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(0)"
; vvv
; ^^^
                        ;           0 lshift
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(17)"
; vvv
; ^^^
                        ;           17 lshift --> 16 lshift
    ld   HL, 0x0000     ; 3:10      16 lshift   ( u -- u<<16 )
                       ;[ 3:10]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(1)"
; vvv
; ^^^
    add  HL, HL         ; 1:11      1 lshift   ( u -- u<<1 )
                       ;[ 1:11]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(2)"
; vvv
; ^^^
    add  HL, HL         ; 1:11      2 lshift   ( u -- u<<2 )
    add  HL, HL         ; 1:11      2 lshift
                       ;[ 2:22]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(3)"
; vvv
; ^^^
    add  HL, HL         ; 1:11      3 lshift   ( u -- u<<3 )
    add  HL, HL         ; 1:11      3 lshift
    add  HL, HL         ; 1:11      3 lshift
                       ;[ 3:33]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(4)"
; vvv
; ^^^
    add  HL, HL         ; 1:11      4 lshift   ( u -- u<<4 )
    add  HL, HL         ; 1:11      4 lshift
    add  HL, HL         ; 1:11      4 lshift
    add  HL, HL         ; 1:11      4 lshift
                       ;[ 4:44]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(5)"
; vvv
; ^^^
    add  HL, HL         ; 1:11      5 lshift   ( u -- u<<5 )
    add  HL, HL         ; 1:11      5 lshift
    add  HL, HL         ; 1:11      5 lshift
    add  HL, HL         ; 1:11      5 lshift
    add  HL, HL         ; 1:11      5 lshift
                       ;[ 5:55]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(6)"
; vvv
; ^^^
                       ;[12:47]     6 lshift   ( u -- u<<6 )
    ld    A, H          ; 1:4       6 lshift
    and   0x03          ; 2:7       6 lshift   .... ..98   7654 3210
    rra                 ; 1:4       6 lshift   .... ...9 8 7654 3210
    rr    L             ; 2:8       6 lshift   .... ...9   8765 4321 0
    rra                 ; 1:4       6 lshift   0... .... 9 8765 4321
    rr    L             ; 2:8       6 lshift   0... ....   9876 5432 1
    rra                 ; 1:4       6 lshift   10.. .... . 9876 5432
    ld    H, L          ; 1:4       6 lshift
    ld    L, A          ; 1:4       6 lshift
                       ;[12:47]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(7)"
; vvv
; ^^^
    xor   A             ; 1:4       7 lshift   ( u -- u<<7 )
    srl   H             ; 2:8       7 lshift
    rr    L             ; 2:8       7 lshift
    ld    H, L          ; 1:4       7 lshift
    rra                 ; 1:4       7 lshift
    ld    L, A          ; 1:4       7 lshift
                       ;[ 8:32]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(8)"
; vvv
; ^^^
    ld    H, L          ; 1:4       8 lshift   ( u -- u<<8 )
    ld    L, 0x00       ; 2:7       8 lshift
                       ;[ 3:11]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(9)"
; vvv
; ^^^
    sla   L             ; 2:8       9 lshift   ( u -- u<<9 )
    ld    H, L          ; 1:4       9 lshift
    ld    L, 0x00       ; 2:7       9 lshift
                       ;[ 5:19]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(10)"
; vvv
; ^^^
    ld    A, L          ; 1:4       10 lshift   ( u -- u<<10 )
    add   A, A          ; 1:4       10 lshift
    add   A, A          ; 1:4       10 lshift
    ld    H, A          ; 1:4       10 lshift
    ld    L, 0x00       ; 2:7       10 lshift
                       ;[ 6:23]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(11)"
; vvv
; ^^^
    ld    A, L          ; 1:4       11 lshift   ( u -- u<<11 )
    add   A, A          ; 1:4       11 lshift
    add   A, A          ; 1:4       11 lshift
    add   A, A          ; 1:4       11 lshift
    ld    H, A          ; 1:4       11 lshift
    ld    L, 0x00       ; 2:7       11 lshift
                       ;[ 7:27]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(12)"
; vvv
; ^^^
    ld    A, L          ; 1:4       12 lshift   ( u -- u<<12 )
    add   A, A          ; 1:4       12 lshift
    add   A, A          ; 1:4       12 lshift
    add   A, A          ; 1:4       12 lshift
    add   A, A          ; 1:4       12 lshift
    ld    H, A          ; 1:4       12 lshift
    ld    L, 0x00       ; 2:7       12 lshift
                       ;[ 8:31]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(13)"
; vvv
; ^^^
    ld    A, L          ; 1:4       13 lshift   ( u -- u<<13 )
    rrca                ; 1:4       13 lshift
    rrca                ; 1:4       13 lshift
    rrca                ; 1:4       13 lshift
    and  0xE0           ; 2:7       13 lshift
    ld    H, A          ; 1:4       13 lshift
    ld    L, 0x00       ; 2:7       13 lshift
                       ;[ 9:34]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(14)"
; vvv
; ^^^
    ld    A, L          ; 1:4       14 lshift   ( u -- u<<14 )
    rrca                ; 1:4       14 lshift
    rrca                ; 1:4       14 lshift
    and  0xC0           ; 2:7       14 lshift
    ld    H, A          ; 1:4       14 lshift
    ld    L, 0x00       ; 2:7       14 lshift
                       ;[ 8:30]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_LSHIFT(15)"
; vvv
; ^^^
    xor   A             ; 1:4       15 lshift   ( u -- u<<15 )
    rr    L             ; 2:8       15 lshift
    ld    L, A          ; 1:4       15 lshift
    rra                 ; 1:4       15 lshift
    ld    H, A          ; 1:4       15 lshift
                       ;[ 6:24]


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 17.03.2022, 16:03 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 712
Has thanked: 64 times
Been thanked: 125 times
A tohle ukazi testy pro RSHIFT
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ echo "10 rshift" | ../forth2m4.sh
include(`../M4/FIRST.M4')dnl
ORG 0x8000
INIT(60000)
...
STOP
PUSH_RSHIFT(10)

include({../M4/LAST.M4})dnl
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ echo "+11 rshift" | ../forth2m4.sh
include(`../M4/FIRST.M4')dnl
ORG 0x8000
INIT(60000)
...
STOP
PUSH_RSHIFT(+11)

include({../M4/LAST.M4})dnl
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ echo "-11 rshift" | ../forth2m4.sh
include(`../M4/FIRST.M4')dnl
ORG 0x8000
INIT(60000)
...
STOP
PUSH_LSHIFT(11)

include({../M4/LAST.M4})dnl
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(xxx)"
m4:stdin:3: bad expression in eval: xxx
; vvv
; ^^^
    .error PUSH_RSHIFT(xxx): M4 does not know the "xxx" value and therefore cannot create the code!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "CONSTANT(xxx,8)PUSH_RSHIFT(xxx)"
; vvv
; ^^^
xxx                  EQU 8
    ld    L, H          ; 1:4       8 rshift   ( u -- u>>8 )
    ld    H, 0x00       ; 2:7       8 rshift
                       ;[ 3:11]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT((0x8000))"
; vvv
; ^^^
    .error PUSH_RSHIFT((0x8000)): Pointer as parameter is not supported!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT()"
; vvv
; ^^^
    .error PUSH_RSHIFT(): Missing address parameter!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(1,2)"
; vvv
; ^^^
    .error PUSH_RSHIFT(1,2): 2 parameters found in macro!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(0)"
; vvv
; ^^^
                        ;           0 rshift
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(1)"
; vvv
; ^^^
    srl   H             ; 2:8       1 rshift   ( u -- u>>1 )
    rr    L             ; 2:8       1 rshift
                       ;[ 4:16]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(2)"
; vvv
; ^^^
    srl   H             ; 2:8       2 rshift   ( u -- u>>2 )
    rr    L             ; 2:8       2 rshift
    srl   H             ; 2:8       2 rshift
    rr    L             ; 2:8       2 rshift
                       ;[ 8:32]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(3)"
; vvv
; ^^^
    ld    A, L          ; 1:4       3 rshift   ( u -- u>>3 )
    srl   H             ; 2:8       3 rshift
    rra                 ; 1:4       3 rshift
    srl   H             ; 2:8       3 rshift
    rra                 ; 1:4       3 rshift
    srl   H             ; 2:8       3 rshift
    rra                 ; 1:4       3 rshift
    ld    L, A          ; 1:4       3 rshift
                       ;[11:44]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(4)"
; vvv
; ^^^
    ld    A, L          ; 1:4       4 rshift   ( u -- u>>4 )
    srl   H             ; 2:8       4 rshift
    rra                 ; 1:4       4 rshift
    srl   H             ; 2:8       4 rshift
    rra                 ; 1:4       4 rshift
    srl   H             ; 2:8       4 rshift
    rra                 ; 1:4       4 rshift
    srl   H             ; 2:8       4 rshift
    rra                 ; 1:4       4 rshift
    ld    L, A          ; 1:4       4 rshift
                       ;[14:56]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(5)"
; vvv
; ^^^
    xor   A             ; 1:4       5 rshift   ( u -- u>>5 )
    add  HL, HL         ; 1:11      5 rshift
    adc   A, A          ; 1:4       5 rshift
    add  HL, HL         ; 1:11      5 rshift
    adc   A, A          ; 1:4       5 rshift
    add  HL, HL         ; 1:11      5 rshift
    adc   A, A          ; 1:4       5 rshift
    ld    L, H          ; 1:4       5 rshift
    ld    H, A          ; 1:4       5 rshift
                       ;[ 9:57]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(6)"
; vvv
; ^^^
    xor   A             ; 1:4       6 rshift   ( u -- u>>6 )
    add  HL, HL         ; 1:11      6 rshift
    adc   A, A          ; 1:4       6 rshift
    add  HL, HL         ; 1:11      6 rshift
    adc   A, A          ; 1:4       6 rshift
    ld    L, H          ; 1:4       6 rshift
    ld    H, A          ; 1:4       6 rshift
                       ;[ 7:42]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(7)"
; vvv
; ^^^
    xor   A             ; 1:4       7 rshift   ( u -- u>>7 )
    add  HL, HL         ; 1:11      7 rshift
    adc   A, A          ; 1:4       7 rshift
    ld    L, H          ; 1:4       7 rshift
    ld    H, A          ; 1:4       7 rshift
                       ;[ 5:27]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(8)"
; vvv
; ^^^
    ld    L, H          ; 1:4       8 rshift   ( u -- u>>8 )
    ld    H, 0x00       ; 2:7       8 rshift
                       ;[ 3:11]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(9)"
; vvv
; ^^^
    srl   H             ; 2:8       9 rshift   ( u -- u>>9 )
    ld    L, H          ; 1:4       9 rshift
    ld    H, 0x00       ; 2:7       9 rshift
                       ;[ 5:19]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(10)"
; vvv
; ^^^
    srl   H             ; 2:8       10 rshift   ( u -- u>>10 )
    srl   H             ; 2:8       10 rshift
    ld    L, H          ; 1:4       10 rshift
    ld    H, 0x00       ; 2:7       10 rshift
                       ;[ 7:27]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(11)"
; vvv
; ^^^
    ld    A, H          ; 1:4       11 rshift   ( u -- u>>11 )
    and  0xF8           ; 2:7       11 rshift
    rrca                ; 1:4       11 rshift
    rrca                ; 1:4       11 rshift
    rrca                ; 1:4       11 rshift
    ld    L, A          ; 1:4       11 rshift
    ld    H, 0x00       ; 2:7       11 rshift
                       ;[ 9:34]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(12)"
; vvv
; ^^^
    ld    A, H          ; 1:4       12 rshift   ( u -- u>>12 )
    and  0xF0           ; 2:7       12 rshift
    rrca                ; 1:4       12 rshift
    rrca                ; 1:4       12 rshift
    rrca                ; 1:4       12 rshift
    rrca                ; 1:4       12 rshift
    ld    L, A          ; 1:4       12 rshift
    ld    H, 0x00       ; 2:7       12 rshift
                       ;[10:38]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(13)"
; vvv
; ^^^
    ld    A, H          ; 1:4       13 rshift   ( u -- u>>13 )
    and  0xE0           ; 2:7       13 rshift
    rlca                ; 1:4       13 rshift
    rlca                ; 1:4       13 rshift
    rlca                ; 1:4       13 rshift
    ld    L, A          ; 1:4       13 rshift
    ld    H, 0x00       ; 2:7       13 rshift
                       ;[ 9:34]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(14)"
; vvv
; ^^^
    ld    A, H          ; 1:4       14 rshift   ( u -- u>>14 )
    and  0xC0           ; 2:7       14 rshift
    rlca                ; 1:4       14 rshift
    rlca                ; 1:4       14 rshift
    ld    L, A          ; 1:4       14 rshift
    ld    H, 0x00       ; 2:7       14 rshift
                       ;[ 8:30]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(15)"
; vvv
; ^^^
    xor   A             ; 1:4       15 rshift   ( u -- u>>15 )
    rl    H             ; 2:8       15 rshift
    ld    H, A          ; 1:4       15 rshift
    rra                 ; 1:4       15 rshift
    ld    L, A          ; 1:4       15 rshift
                       ;[ 6:24]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(16)"
; vvv
; ^^^
    ld   HL, 0x0000     ; 3:10      16 rshift   ( u -- u>>16 )
                       ;[ 3:10]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(17)"
; vvv
; ^^^
                        ;           17 rshift --> 16 rshift
    ld   HL, 0x0000     ; 3:10      16 rshift   ( u -- u>>16 )
                       ;[ 3:10]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(-1)"
; vvv
; ^^^
    .error PUSH_RSHIFT(-1): negative parameters found in macro! Use PUSH_LSHIFT(1).
                       ;[ 0:0]

V emulatoru jsem to jeste netestoval.

Mimochodem mel jsem celou dobu pocit, ze jsem to prece uz jednou delal... a taky ano, resil jsem to v nasobeni, jen jsem na to jako sklerotik uz zapomnel.

Jinak uplne mimo tema jsem sehnal novou praci, nebo mi spis uplne spadla do klina, protoze jsem byl bez anglictiny uplne bezradny, ale napsal me po mesici byvaly sef zda neshanim praci. A taky jsem zoufale shanel a i zaroven neshanel, podle toho jak se na to podivate. Takze budu mit mene casu a budu mene spamovat. "Delam" s jednou symptatickou brazilkou (co byla v Brazilii profesorkou hry na akustickou kytaru, ale neumi poradne anglicky, takze dela tuhle hroznou praci) a jeste rumunem. Ta restaurace je celkem mala, je to prace jen pro jednoho, takze se vidime jen pri stridani smen.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 17.03.2022, 20:19 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 712
Has thanked: 64 times
Been thanked: 125 times
Tak uz by to melo byt spravne, nasel jsem jen chybu v ">> 15" kdy jsem 15. bit presouval do 7. bitu a ne do nulteho.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(15)"
; vvv
; ^^^
    xor   A             ; 1:4       15 rshift   ( u -- u>>15 )
    rl    H             ; 2:8       15 rshift
    ld    H, A          ; 1:4       15 rshift
    rra                 ; 1:4       15 rshift
    ld    L, A          ; 1:4       15 rshift
                       ;[ 6:24]
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../compile.sh shift
old: -rw-rw-r-- 1 dworkin dworkin 1865 Mar 17 18:14 shift.bin
new: -rw-rw-r-- 1 dworkin dworkin 1865 Mar 17 18:17 shift.bin
dworkin@dw-A15:~/Programovani/ZX/Forth/new2$ ../check_word.sh "PUSH_RSHIFT(15)"
; vvv
; ^^^
    xor   A             ; 1:4       15 rshift   ( u -- u>>15 )
    rl    H             ; 2:8       15 rshift
    ld    H, A          ; 1:4       15 rshift
    adc   A, A          ; 1:4       15 rshift
    ld    L, A          ; 1:4       15 rshift
                       ;[ 6:24]


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ů: 174 ]  Přejít na stránku Předchozí  1 ... 8, 9, 10, 11, 12

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