OldComp.cz

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


Právě je 28.03.2024, 21:33

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 156 ]  Přejít na stránku Předchozí  1 ... 3, 4, 5, 6, 7, 8, 9 ... 11  Další
Autor Zpráva
PříspěvekNapsal: 21.08.2018, 15:34 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2062
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
Ale pokiaľ si obslužný program pre NMI zistí stav DI alebo EI (ako napríklad SNAP u D40), a následne podľa toho na konci pred klasickým RET urobí aj EI, tak netreba RETN, bude to fungovať rovnako. Alebo sa [zase] mýlim?

hynek píše:
...RETI mj. generuje jiny prubeh na sbernici kvuli signalizaci konce preruseni pro periferie z rady Z80.

Zaujímavé. Vieme aj o nejakej konkrétnej periférii, ktorá to na niečo používa?

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
PříspěvekNapsal: 21.08.2018, 15:46 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
PotPalo píše:
Ale pokiaľ si obslužný program pre NMI zistí stav DI alebo EI (ako napríklad SNAP u D40), a následne podľa toho na konci pred klasickým RET urobí aj EI, tak netreba RETN, bude to fungovať rovnako. Alebo sa [zase] mýlim?
Nemylis, je to presne tak. Ak si DI/EI urobis "rucne", na konci obsluhy NMI postaci obycajny RET.
hynek píše:
...RETI mj. generuje jiny prubeh na sbernici kvuli signalizaci konce preruseni pro periferie z rady Z80.
A ten iny priebeh je prave o tom ze ma iny operacny kod. Periferie sleduju zbernicu a ked detekuju ze sa po zbernici cita operacny kod instrukcie RETI, tak podla toho poznaju ze nastal koniec obsluznej rutinky prerusenia.
PotPalo píše:
Zaujímavé. Vieme aj o nejakej konkrétnej periférii, ktorá to na niečo používa?
Su to periferne obvody priamo z rodiny Z80: PIO,SIO,CTC...


Nahoru
 Profil  
 
PříspěvekNapsal: 11.02.2020, 15:22 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Potreboval jsem naprogramovat prikaz switch, pro vetsi rozsah hodnot, kdyz uz je opakovane puleni intervalu neefektivni.
Kód:
 cp $04
 jr nc, greq4
 sub $02
 jr z, eq2
 jr nc, eq3
 inc a
 jr z, eq1
;eq0:
 ...
eq1:
 ...
eq2:
 ...
eq3:
 ...
greq4:
 atd.

A dosel jsem k teto variante:
Kód:
 ld (JMP),a   ; a = 2*x
 JMP EQU $+1
 jr $    ; prvni skok na tabulku skoku

 jr eq0
 jr eq1
 jr eq2
 ret ; u eq3 neni potreba dlouhy kod
 nop
 jr eq4
 jr eq5
 ...
eq_last:  ; bez druheho skoku

eq2:
 ...
 ;fall
eq1:
 ...
 ret

eq5:
 ...
 atd

13+12+12 T-cycles.
Kde tahle konstrukce dava relativni volnost v sirce a poradi jednotlivych vetvi a nepouziva zadne registry krome akumulatoru. Pripadne:
Kód:
 ld (JMP),a   ; a = 4*x
 JMP EQU $+1
 jr $    ; prvni skok na tabulku skoku

 jp eq0
 nop
 jp eq1
 nop
 jp eq2
 nop
 ld a, d
 and $07
 ret  ; u eq3 neni potreba dlouhy kod
 jp eq4
 nop
 jp eq5
 nop
 ...
eq_last:  ; bez druheho skoku

eq2:
 ...
 ;fall
eq1:
 ...
 ret

eq5:
...
atd

13+12+10 T-cycles.
Kdy sirka vetvi je prakticky neomezena, a pokud mate vstupni hodnotu uz vynasobenou ctyrma (jako ja), tak je to drobet rychlejsi.

var 1:https://github.com/DW0RKiN/Floating-point-Library-for-Z80/blob/6ac4c43fd73c4aaae310acd04aa7357ca4e31042/binary16/srl_de.asm
var 2:https://github.com/DW0RKiN/Floating-point-Library-for-Z80/blob/master/binary16/srl_de.asm

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


Nahoru
 Profil  
 
PříspěvekNapsal: 11.02.2020, 19:17 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
A co třeba:
Org 32764
ld h,0x80
Ld l,a ;a×4
Jp (hl)
Jp #0
Nop
Jp #1
nop
Jp #2
..... atd...

25 taktů jestli počítám správně (píšu to z hlavy a na mobilu, snad se nepletu). Žere teda registr HL a A.

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
PříspěvekNapsal: 11.02.2020, 21:54 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2062
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
Keď pred to pridáš ADD A,A (alebo RLCA, skrátka vynásobíš A dvoma), tak to bude fungovať. Adresy skokov sú totiž vždy dva byty. Teda pokiaľ je A od 0 do 3. Pokiaľ je už vynásobené číslom 4, potom by ho bolo vhodné vydeliť na polovicu (RRCA) aby nebola tabuľka skokov zbytočne dvojnásobnej veľkosti.

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 03:38 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Lanex píše:
A co třeba:
Kód:
     Org 32764
     ld h,0x80
     Ld l,a     ;a×4
     Jp (hl)
     Jp #0
     Nop
     Jp #1
     nop
     Jp #2
     ...atd...

25 taktů jestli počítám správně (píšu to z hlavy a na mobilu, snad se nepletu). Žere teda registr HL a A.

JP (HL) je ve skutecnosti JP HL? Uf! Diky moc!!!

Jo, je to 25 taktu, 7+4+4+10 (ld, ld, jp, jp). Ja mam uz normalni regisry obsazene, protoze ten shift DE potrebuji u scitani a odcitani cisel s desetinou carkou. Takze dva 16 bitove registry jsou uz hned plne (obzvlast HL, ktery je pouzit pro ADD, SBC) a posledni potrebuji na mezivypocty. Takze by to u me bylo o 8 taktu pomalejsi pri vyuziti EXX. Takze 33 taktu. Coz je jen o 2 takty rychlejsi. Asi bych se mel kouknout zda by to neslo nejak preskupit... ale obavam se ze to proste tech 8 taktu vzdy prida.
To ze tahle varianta musi byt navic zarovnana na 256 bajtu neni velka nevyhoda, protoze uz stejne mam v kodu tabulky, co maji stejnou podminku. Takze by se ten kod jen rozdelil do dvou souboru a soubor s vetvemi by byl hned za tabulkami.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 03:52 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
PotPalo píše:
Keď pred to pridáš ADD A,A (alebo RLCA, skrátka vynásobíš A dvoma), tak to bude fungovať. Adresy skokov sú totiž vždy dva byty. Teda pokiaľ je A od 0 do 3. Pokiaľ je už vynásobené číslom 4, potom by ho bolo vhodné vydeliť na polovicu (RRCA) aby nebola tabuľka skokov zbytočne dvojnásobnej veľkosti.

Mas pravdu ze ta hodnota v registru A musi splnovat podminku nejakeho nasobku. Ja to napsal do komentaru v kodu ze A = 4*x nebo 2*x.

Konkretne v mem pripade mam v DE cislo ve formatu binary16 (half) coz je SEEE EEMM MMMM MMMM, kde S je sign, E je exponent zvyseny o BIAS a M je mantisa (fraction). A ja to cislo DE potrebuji posunout vpravo o rozdil exponentu. A ty exponenty uz mam vlastne vynasobene ctyrma. Potrebuji jen umazat cast s SEEE EE a pridat neukladany "jednickovy bit" na pozici nejnizsiho E, tzn. 0000 01MM MMMM MMMM >> rozdil_exp. Registr A obsahuje prave ten rozdil_exp. Jen teda jeste chci posouvat u scitani o bit mene a u odcitani o 2 bity mene. A jeste udelat jednu drobnou upravu, ale to uz... bych se do toho moc zamotal.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 05:57 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Hmm.. ona se ta tabulka skoku nemusi vycpavat nopama, staci aby v te dane vetvi slo pouzit jako prvni instrukci neco jednobajtoveho.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 07:38 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Lanex píše:
A co třeba:
Org 32764
ld h,0x80
Ld l,a ;a×4
Jp (hl)
Jp #0
Nop
Jp #1
nop
Jp #2
..... atd...

25 taktů jestli počítám správně (píšu to z hlavy a na mobilu, snad se nepletu). Žere teda registr HL a A.


Jak jsem tak premyslel nad tema stinovyma regitrama, tak mi doslo ze to neni 25 taktu, ale v podstate jen 18 taktu! Protoze "ld h,0x80" muze byt zadano jednorazove. Bohuzel to potrebuji pro matematickou knihovnu, a nechci pouzivat stinove registry a omezovat tak program, ktery ji mohl pozivat. Pokud to teda nekdo nekdy pouzije... Pro 2 takty me to prijde jako vysoka cena. :/

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


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 08:34 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Alebo ak su rutinky rozsiahle a treba pouzit absolutne skoky, tak sa namiesto vypchavania nopmi da vstupna hodnota nasobit 3x:
Kód:
ld c,a
add a,a
add a,c
add a,low tabulka_skokov
ld (tabulka_skokov-1),a
jr $
tabulka_skokov:
jp case0
jp case1
jp case2
jp case3
...
Vdaka add a,low tabulka_skokov kod nemusi byt na pevnej adrese, ale tabulka skokov by mala byt cela v ramci jednej 256 bajtovej stranky.


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 09:59 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2062
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
Alebo s JR ešte kratšie:
Kód:
add a,a
add a,low tabulka_skokov
ld (tabulka_skokov-1),a
jr $
tabulka_skokov:
jr case0
jr case1
jr case2
jr case3
...


Inak v mojom predošlom príspevku mám chybu, nedošlo mi že JP (HL) je vlastne JP HL, takže ono by sa tie dva byty museli ešte načítať z (HL) a následne až skok.

Mimochodom, prečo nepoužiť:
Kód:
or a
jr z, case0
dec a
jr z, case1
dec a
jr z, case2
:case3+
Pri case0 to má najmenej taktov, pri case3 najviac.

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 10:18 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
... a při case255? :poke: :mrgreen:

jinak JP (HL) vs JP HL, to hrozně mate to je fakt.

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 10:24 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
PotPalo píše:
Inak v mojom predošlom príspevku mám chybu, nedošlo mi že JP (HL) je vlastne JP HL, takže ono by sa tie dva byty museli ešte načítať z (HL) a následne až skok.
Myslim ze jsem se ztratil. V jakem predeslem prispevku si zminoval JP (HL)? Syntaxe se zavorkama okolo (HL), moje skleroza a neprilis jasne popisy na netu co instrukce dela, plus lenost si to overit v emulatoru zapracovala spis u me.. .) Diky obsazenemu HL jsem to ani moc nezkoumal. Zavrhl jsem proto i zrychleni posunu o nibble pomoci RRD/RLD.
PotPalo píše:
Mimochodom, prečo nepoužiť:
Kód:
or a
jr z, case0
dec a
jr z, case1
dec a
jr z, case2
:case3+
Pri case0 to má najmenej taktov, pri case3 najviac.

V prvni prispevku jsem ukazoval kod s pulenim intervalu. Ktery neni spatny pokud je tech hodnot malo. Sam sis odpovedel. Tvuj kod se ale hodi pokud hodnota 0 ma 90% pravdepodobnost, hodnota 1 ma 9% pravdepodobnost, hodnota 2 ma 0.9% pravdepodobnost...

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


Naposledy upravil _dworkin dne 12.02.2020, 10:30, celkově upraveno 1

Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 10:26 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 16.03.2017, 11:36
Příspěvky: 1493
Bydliště: Kósek vod Brna
Has thanked: 101 times
Been thanked: 112 times
Citace:
JP (HL) je vlastne JP HL


JP (HL) je skok na adresu uloženou na adrese HL

_________________
TEMS-49, PMI-80, rep. MK14, ZX81, ZXspectrum+, TI58, MZ-800


Nahoru
 Profil  
 
PříspěvekNapsal: 12.02.2020, 10:32 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
microlan píše:
Citace:
JP (HL) je vlastne JP HL


JP (HL) je skok na adresu uloženou na adrese HL

Coze?
Kód:
org 32768

ld hl, $89ab
jp (hl)


Fuse 1.5.1 a skocil jsem na adresu $89ab. Coz je 1/65536 ze je to nahoda.

_________________
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ů: 156 ]  Přejít na stránku Předchozí  1 ... 3, 4, 5, 6, 7, 8, 9 ... 11  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 11 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