OldComp.cz

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


Právě je 27.04.2024, 11:14

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 32 ]  Přejít na stránku 1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: 13.12.2023, 05:16 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Jsem docela v soku kdyz jsem zjistil ze ZX ROM ma od adresy 0x386E vcetne do adresy 0x3CFF vcetne vypln s hodnotama 255...
To jako vazne? 1170 drahocenych bajtu vyhozenych z okna? 7%? :o :suicide:
Vsude se setri mistem az je to pomale a nakonec nevyuziji prostor? Nejaka tabulka nasobku pro rychle positani 8bit * 8 bit, cokoliv by se dalo vymyslet do jedne hodiny...

No ma otazka zni. Preruseni im2 pri vyvolani ukonci jakoukoliv vicebajtovou instrukci a mrkne se co je v regstru I. To vezme jako horni cast adresy a ze zbernice vezme spodni cast, vetsinou hodnotu 255. Na tuto adresu skoci. Neni zarucena lichost ani sudost takze aby to pri nahodne hodnote davalo nejaky rozumny vysledek tak ta tabulka musi mit vsech 256 hodnot identickych. Plus jednu navic na vyssim "segmentu".

https://ci5.speccy.cz/assembler/5-dil-mody-preruseni

Je to tak?

A my mame takovych segmentu ...

0x39..
0x3A..
0x3B..
0x3C..
0x3D..
0x3E..
0x3F.. uz nejde pouzit protoze nezarucuje co bude v 0x4000

...sest.

Ctyri hodnoty pro I kde je zaruceno ze to bude skakat na gumaku na adresu 0xFFFF. Tam mame jeden bajt kde jde nastavit hodnotu 0xC3 kterou ma instrukce JP. Dalsi 2 bajty se nactou z nulte adresy ktera je 0xF3 a 0xAF. Takze pokud se nepletu je to adresa 0xAFF3. Na tehle adrese muze zacinat kod preruseni kde misto 257 bajtu pouzijeme jen jeden bajt na adrese 0xFFFF?

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


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Co tam vlastne lezi na tech poslednich bajtech? Jen stack? Protoze 48kb nemuselo mit nutne RAM az k 0xFFFF.
Pouzije vubec nekdy ZX ty posledni 2 bajty? Ve vypisu tam mam opakovane hodnotu 0x003C pokazde 4x v poslednich 2 bajtech "sestnactkoveho segmentu".

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


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 08:37 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 903
Has thanked: 51 times
Been thanked: 230 times
_dworkin píše:
To jako vazne? 1170 drahocenych bajtu vyhozenych z okna? 7%?

"urban legend" hovorí, že tam mala byť podpora pre Microdrive, ale sa to nestihlo, preto bola v prvých verziách ROM v päticiach, aby sa dala vymeniť. Nakoniec dostal Microdrive podporu v samostatnej ROM, a ZXROM zostala nezmenená aj so všetkými chybami.

_dworkin píše:
Co tam vlastne lezi na tech poslednich bajtech? Jen stack? Protoze 48kb nemuselo mit nutne RAM az k 0xFFFF.
Pouzije vubec nekdy ZX ty posledni 2 bajty?

UDG - grafika

m1


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 10:50 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2354
Has thanked: 304 times
Been thanked: 641 times
_dworkin píše:
Jsem docela v soku kdyz jsem zjistil ze ZX ROM ma od adresy 0x386E vcetne do adresy 0x3CFF vcetne vypln s hodnotama 255...
Na tohle lákadlo už se nachytalo mnoho jiných.

Problém je, že přesně tuhle oblast mnohé upravené ROM využívají pro rozšíření Sinclair BASICu a pak samozřejmě IM2 využívající 0xFF v ZX ROM nebude fungovat (nebo nespolehlivě). Proto se striktně používají tabulky v RAM.

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 15:05 
Offline
Radil
Uživatelský avatar

Registrován: 19.07.2013, 14:21
Příspěvky: 258
Bydliště: Košice
Has thanked: 143 times
Been thanked: 380 times
Dobre ranko. :)
Toto je dost standardna inicializacia IM2, majorita 48k veci to tak pouzivalo, aj komercne veci od Proximy apod. ;)

... a to este ked ti poviem, ze nemusis skakat na nezmyselnu adresu #AFF3, ale staci dat na #FFFF obycajne #18 (jr *), tak mozes mat od #FFF4 do #FFFE krasnych 10 bajtov na osetrenie prerusenia. :dwi:

Kód:
                org     #8000

start           di
                ld      a,#18           ; jr *
                ld      (#FFFF),a
                ld      a,#3B
                ld      i,a
                im      2

.loop           ei
                halt
                jr      .loop

                org     #FFF4

                di
                push    af
                exx
                call    something_amazing
                exx
                pop     af
                ei
                ret


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
mborik128 píše:
Dobre ranko. :)
Toto je dost standardna inicializacia IM2, majorita 48k veci to tak pouzivalo, aj komercne veci od Proximy apod. ;)

... a to este ked ti poviem, ze nemusis skakat na nezmyselnu adresu #AFF3, ale staci dat na #FFFF obycajne #18 (jr *), tak mozes mat od #FFF4 do #FFFE krasnych 10 bajtov na osetrenie prerusenia. :dwi:

Kód:
                org     #8000

start           di
                ld      a,#18           ; jr *
                ld      (#FFFF),a
                ld      a,#3B
                ld      i,a
                im      2

.loop           ei
                halt
                jr      .loop

                org     #FFF4

                di
                push    af
                exx
                call    something_amazing
                exx
                pop     af
                ei
                ret


Jestli to chapu dobre tak relativni skok nacita z adresy 0x0000 hodnotu 0xF3 to by melo byt... -13 bajtu pocitane od... 0xFFFF? Tak ne. Opcode to pocita od dalsi instrukce takze to je "jr $-11", kde je zase $ od zacatku vykonavane. Takze 11 bajtu.

PS: Nema tam byt misto "ret" instrukce "retn"? Ale mozna bych se nemel ptat, protoze to uz je fakt nejaka nemoc ptat se na veci ktere nejsou zivotne dulezite... .)

zxcygnus píše:
_dworkin píše:
Jsem docela v soku kdyz jsem zjistil ze ZX ROM ma od adresy 0x386E vcetne do adresy 0x3CFF vcetne vypln s hodnotama 255...
Na tohle lákadlo už se nachytalo mnoho jiných.

Problém je, že přesně tuhle oblast mnohé upravené ROM využívají pro rozšíření Sinclair BASICu a pak samozřejmě IM2 využívající 0xFF v ZX ROM nebude fungovat (nebo nespolehlivě). Proto se striktně používají tabulky v RAM.

A neni to spis problem autoru opravenych ROM? Jak si pak k tomu prijdou vlastnici originalni? Omezovat se kvuli dopredne kompatibilite. Radsi bych vydal 2 verze programu at si kazdy vybere, protoze nepredpokladam ze by se nekdo byl schopen dohodnout kterou tu 256 bajtovou banku meli standartne pouzivat a nechat ji na hodnotach 255.

PS: Uvedl bych tenhle trik pro kazdou ucebnici s vyhodama i nevyhodama. Zajimalo by me kolik procent uzivatelu melo neoriginalni ROM a kolik procent uprav bylo schopno prepinat mezi upravenou a originalni.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 15:50 
Offline
Radil
Uživatelský avatar

Registrován: 19.07.2013, 14:21
Příspěvky: 258
Bydliště: Košice
Has thanked: 143 times
Been thanked: 380 times
Asi si myslel `reti`, lebo `retn` je vyskok z nemaskovaneho. Ale `reti` je celkom zbytocna instrukcia, lebo fakt staci `ei; ret`.
Busy to asi vysvetli empiricky a odborne, ja som len praktik, obcasny priemerny demomaker :S


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 16:37 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Koukam ze RETI ma 2 bajty, takze se oproti EI RET neusetri nic.
Po EI ale muze byt volano nemaskovane preruseni takze rozdil bude asi v tom ze zustane v zasobniku jedna adresa.
Takze by mohlo byt RETI lepsi ne?
Zase je divne aby bylo po konci jednoho nemaskovaneho preruseni volano hned druhe, ale zase proc ne...?
Teoreticky by se to mohlo nastradat a zasobnik se dostat mimo volne misto?

PS: I kdyz... asi to cekani na ukonceni instrukce muze nastat az po ukonceni instrukce EI. Takze se bude cekat nejdrive na ukonceni instrukce RET? Takze je to pak stejne jako RETI. Hm...

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


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

Registrován: 13.05.2013, 17:48
Příspěvky: 531
Bydliště: Košice
Has thanked: 430 times
Been thanked: 265 times
_dworkin píše:
Koukam ze RETI ma 2 bajty, takze se oproti EI RET neusetri nic.
Po EI ale muze byt volano nemaskovane preruseni takze rozdil bude asi v tom ze zustane v zasobniku jedna adresa.
Takze by mohlo byt RETI lepsi ne?
Zase je divne aby bylo po konci jednoho nemaskovaneho preruseni volano hned druhe, ale zase proc ne...?
Teoreticky by se to mohlo nastradat a zasobnik se dostat mimo volne misto?

PS: I kdyz... asi to cekani na ukonceni instrukce muze nastat az po ukonceni instrukce EI. Takze se bude cekat nejdrive na ukonceni instrukce RET? Takze je to pak stejne jako RETI. Hm...
EI nepovolí prerušenie ihneď, ale až po nasledujúcej inštrukcii, čo je obvykle RET, takže ak by prišla ďalšia žiadosť o prerušenie, akceptovaná bude až po RET.

_________________
https://pmd85.borik.net - PMD 85 Emulátor, PMD 85, PMD 32-SD
https://pp01.borik.net - PP 01 Emulátor, PP 01, SD-ROM Modul


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 17:05 
Offline
Profík

Registrován: 26.11.2018, 16:59
Příspěvky: 582
Bydliště: Holešov
Has thanked: 13 times
Been thanked: 91 times
mrkni sem, tady je to pěkně popsané...
https://jnz.dk/z80/reti.html
na čistém ZX to nemá moc význam, ale v okamžiku kdyby si měl Z80 PIO, SIO, DMA nebo jiné co se dají zapojit do řetězce a nastavit jim priorita tak ta instrukce RETI je nezbytná (dokonce píšou že je lepší použít i EI RETI pro jistotu)


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 17:24 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Samotná inštrukcia RETI nepovoľuje prerušenie a tak pred ňou musí byť aj EI, ako pred obyčajným RET.


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 17:45 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Antony/DTA píše:
Samotná inštrukcia RETI nepovoľuje prerušenie a tak pred ňou musí byť aj EI, ako pred obyčajným RET.


Tak to je pak uz o bajt delsi, tak chapu proc to nepouzit. Jen me to nedava smysl z pohledu navrhu instrukce.

PS: Kdyz uz mame tohle tema tak at je to pokupe, nekde jsem myslim narazil na zminku ze nejake ret? vraci EI/DI do puvodniho stavu jak bylo predtim, je to mozne? Jak nad tim ted premyslim tak to nedava smysl, Z80 by musela mit pro to vnitrne registr (nebo aspon 1 bit). Ale bylo by to fajn moct v kodu zrusit preruseni protoze napr. sahate na SP a pak to vratit zpet, aniz vite zda bylo predtim povoleno a nebo ho ponechate zakazane.

PPS: Odkaz kde popisuji preruseni o ruznych prioritach. Myslim ze me zacina bolet hlava a ma zvedavost je vylecena... dosahl jsem sve hranice .)

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


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 19:15 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
_dworkin píše:
PS: Kdyz uz mame tohle tema tak at je to pokupe, nekde jsem myslim narazil na zminku ze nejake ret? vraci EI/DI do puvodniho stavu jak bylo predtim, je to mozne? Jak nad tim ted premyslim tak to nedava smysl, Z80 by musela mit pro to vnitrne registr (nebo aspon 1 bit). Ale bylo by to fajn moct v kodu zrusit preruseni protoze napr. sahate na SP a pak to vratit zpet, aniz vite zda bylo predtim povoleno a nebo ho ponechate zakazane.


RETN obnovuje stav prerušenia podľa toho aký bol pri NMI. A áno Z80 má IFF1 a IFF2 na stav EI/DI a jeho kópiu pre prípad NMI. Stav IFF2 sa dá zistiť inštrukciou LD A,I alebo LD A,R.


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 20:30 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Prilis rychle na me.

Citace:
Z80 podporuje dva typy přerušení, nemaskovatelné a maskovatelné. Jsou spouštěny dvěma piny: /NMI a /INT.

/NMI je vstup spouštěný zápornou hranou. Když přejde pouze z vysoké na nízkou úroveň, Z80 zahájí zpracování nemaskovatelného přerušení. Podržením /NMI na nízké úrovni nedosáhnete souvislého přerušení. Z80 nemá žádný způsob, jak toto přerušení zakázat, a proto je nemaskovatelné.

Když dojde k NMI, Z80 začne provádět kód na adrese $0066. Díky tomu je povinné umístit obsluhu přerušení na tuto adresu, i když se jedná o instrukci skoku na větší rutinu jinde v paměti.

/INT je aktivní vstup citlivý na nízkou úroveň. Když je staženo na nízkou úroveň, Z80 zahájí zpracování přerušení a toto opakuje opakovaně po každé provedené instrukci, dokud /INT opět nezvýší hodnotu. Tento typ přerušení může být řízen Z80 pomocí instrukcí DI (zakázat přerušení) a EI (povolit přerušení).

Když jsou přerušení zakázána prostřednictvím DI, Z80 odpoví na /INT, jakmile budou přerušení znovu povolena. Pokud /INT přejde na vysokou hodnotu před jejich povolením, pak se přerušení „ztratí“ a Z80 na něj nikdy nereaguje.

Externí hardware, který přerušení spustil, bude mít obvykle možnost znovu vytáhnout /INT na vysokou úroveň, buď po uplynutí nastavené doby (automatické potvrzení), nebo prostřednictvím vyhrazené adresy paměti nebo řídicího registru, ke kterému má přístup obsluha přerušení. indikují, že je přerušení obsluhováno.


Takze mame instrukci na zakazani preruseni

DI ta nastavi IFF1=0 a IFF2=0

EI povoli preruseni a nastavi IFF1=1 a IFF2=1

IFF1 určuje, zda jsou povolena přerušení, ale její hodnotu nelze přečíst.

IFF2 jde zjistit pomocí instrukce

ld A, R (R je ve skutecnosti 7 bitovy?)
nebo
ld A, I

kde se zkopiruje do příznaku P/V.

Když dojde k NMI (nemaskovatelnemu preruseni), IFF1 se resetuje, čímž se nepovolí další (maskovatelné) přerušení, ale IFF2 zůstane nezměněn. PC se nastavai na 0x0066. Takze to asi predtim ulozi na stack puvodni hodnotu? To asi ne, protoze pak by nefungovali programy co sahaji na SP a predtim provedou DI, kdyz by je NMI zbortil... Takze pouzije 2 bajty z RAM? Vlastne cela rutina nesmi pouzivat zasobnik, nebo ho premistnit jinam... A vlastne potrebuje urcite ulozit i AF. Tak to jsou uz minimalne 4 bajty RAM.
Vlastne obnovit AF jinak nez pres stack neumim... Takze ten stack asi fakt musim premistnit.

Takze Z80 se zacne chovat jako kdyby probehla instrukce DI?
Jen ale do te doby dokud je /INT dole?
V tehle chvili jsem schopen pokud pisi kod bezici od 0x0066 zjistit puvodni stav IFF2 a pak bych mel DI zase zavolat?
Ale ten signal /NMI se muze zmenit a ze jsem zapsal DI me nepomuze ne? Protoze pak muze nastat dalsi NMI... pomoci DI se uchranim jen od maskovatelneho. Takze dvojici NMI musim resit na zacatku rutiny, ze jsem prerusil uz probihajici? Ale pokud presouvam zasobnik tak predtim... z toho me vyplyva ze je to nemozne, pri odskoku na 0x0066 by si navratovou adresu musel pamatovat Z80 sam v nejakem registru a nebo vyvolat dve NMI nejde...?

NMI me nastesti moc nezajima protoze si to resi ROMka.

Me spis zajima zda zda kdyz saham na SP mohu zjistit jaka byla puvodni hodnota IFF1. A to jde teda zjistit pres

ld A,R
nebo
ld A,I
predtim nez zavolam DI (pokud ho vubec musim volat).

Takze program by vypadal nejak takto?
Kód:
ld A, R
push AF
di               ; zakazu klidne 2x
....
zde si mohu hrat s SP
...
pop AF
jp pe, $+4  ; skok kdyz je P/V alias IFF2 nastaveno na 1
ei               ; povolim preruseni pokud bylo puvodne preruseno

Tohle je realne obaleni kodu pro kompiler, kdyz nevim v jakem rezimu to bezelo a potrebuji cast kodu mit se zakazanym prerusenim.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 20:53 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Rutinu pro dvojite NMI by slo vlastne naprogramovat.
Staci resit 2 stavy.
Nastalo preruseni tak ulozim neco nekam a zjistim zda uz nejake nebezi, pokud bezi nove ignoruji a obnovuji registry.
Pokud je to prvni preruseni tak ukladam registry znovu do druheho mista (nemohu obnovit prvni protoze mohlo byt uz nekolikrat zmeneno).
Na konci obnovuji z druheho mista.
Jen by se to mohlo zbytecne zpomalovat/cyklit.
Takze asi ten signal NMI se nezvedne dokud ho obsluha nevyresi.

_________________
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ů: 32 ]  Přejít na stránku 1, 2, 3  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 21 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