OldComp.cz

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


Právě je 27.04.2024, 09:10

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 Předchozí  1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: 13.12.2023, 21:23 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Nejak sa v tom plácaš.
Pri obsluhe NMI sa nemusíš starať, či bolo prerušenie povolené, alebo nie. RETN na konci to obnoví na pôvodný stav. A NMI tiež zakáže prerušenie, takže ty už nemusíš mať v programe DI. A ani nemôžeš, lebo by RETN neobnovil stav EI.
Pri obsluhe maskovaného prerušenia vieš, že bolo povolené, lebo inak by nenastalo prerušenie, takže na konci musí byť EI+RET.


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 22:13 
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:
Nejak sa v tom plácaš.
Pri obsluhe NMI sa nemusíš starať, či bolo prerušenie povolené, alebo nie. RETN na konci to obnoví na pôvodný stav. A NMI tiež zakáže prerušenie, takže ty už nemusíš mať v programe DI. A ani nemôžeš, lebo by RETN neobnovil stav EI.
Pri obsluhe maskovaného prerušenia vieš, že bolo povolené, lebo inak by nenastalo prerušenie, takže na konci musí byť EI+RET.


Jak obsluha NMI resi ukladani navratove hodnoty, kdyz potrebuje zachovat nezmeneny stack.

Druhy pripad nebyla obsluha NMI ani INT ale rutina co pouziva zmenu SP na rychle kopirovani s tim ze se ma vratit do DI/EI jak bylo pred spustenim. Potrebuji nastavit DI a po ukonceni vratit hodnotu EI a nebo nechat DI.

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


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
NMI na ZX

Citace:
0066: RUTINA 'NEMASKOVATELNÉ PŘERUŠENÍ'
Tato rutina se nepoužívá ve standardním spektru, ale kód umožňuje resetování systému po aktivaci linky NMI. Systémová proměnná na 5CB0, zde pojmenovaná NMIADD , musí mít hodnotu nula, aby došlo k resetování.


Kód:
RESETOVAT:
0066        PUSH AF   ;Uložte aktuální hodnoty uložené v těchto registrech.
0067        PUSH HL
0068        LD HL, ($5CB0)   ;Aby došlo k resetování, musí být oba dva bajty NMIADD nulové.
006B        LD A,H
006C        OR L
006D        JR NZ, $0070    ;Poznámka: toto mělo být 'JR Z'!
006F        JP (HL)   ;Přejít na START .
NO_RESET:
0070        POP HL   ;Obnovte aktuální hodnoty do těchto registrů a vraťte se.
0071        POP AF
0072        RETN


Vypada to ze to umi jen resetovat ZX... a kod by zbortil hrani si se zasobnikem i predtim pouzite DI. Ale vypada to ze jakmile je kod na adrese 0x0066 tak uz je zasobnik "uspinen" navratovou hodnotou a nic to nezachrani.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 13.12.2023, 23:43 
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
Na standardním Spectru je NMI nepoužitelné, těžko říct proč to tak udělali, ale byl by to mocný nástroj kdyby to bylo správně.
Jinak NMI si stejně jako normální přerušení dá na STACK adresu kde bylo přerušeno aby se mohl vrátit - t.j. pokud někdo používá nestandardně Stack na práci s daty tak se ta data poškodí.


Nahoru
 Profil  
 
PříspěvekNapsal: 14.12.2023, 00:22 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2095
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 327 times
Správne, INT aj NMI uložia do zásobníka adresu návratu než skočia na prerušenie.

S I=57 až 59 sa pracuje už dávno, ja som dával 59, pre istotu. Potom to skáče na koniec pamäte (65535), kde si zvyčajne uložíme JR ktorého hodnota je braná z adresy 0 (teda 243), takže sa skáče na 65524, kde sa zvyčajne nerieši prerušenie samotné ale sa zvykne dať JP na obsluhu nášho prerušenia.

_________________
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: 14.12.2023, 00:32 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2095
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 327 times
Antony/DTA píše:
Pri obsluhe NMI sa nemusíš starať, či bolo prerušenie povolené, alebo nie. RETN na konci to obnoví na pôvodný stav.

Problém nastáva, keď si chceme takýto stav pamäte uložiť ako SNAPSHOT. Stav pre RETN sa nikde neukladá (IFF nieje v registri F), a teda by po spustení inokedy nahraného SNAPSHOTU cez RETN nenastavilo prerušenie správne. Preto sa jeho hodnota zisťuje cez LD A,I alebo LD A,R a následne podľa P/V flagu (alebo sa P/V flag prenesie do nejakého číselného registra trikom PUSH AF + napríklad POP DE, a máme ho v E, kde stačí testovať príslušný bit).

_________________
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: 14.12.2023, 01:01 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
PotPalo píše:
Antony/DTA píše:
Pri obsluhe NMI sa nemusíš starať, či bolo prerušenie povolené, alebo nie. RETN na konci to obnoví na pôvodný stav.

Problém nastáva, keď si chceme takýto stav pamäte uložiť ako SNAPSHOT. Stav pre RETN sa nikde neukladá (IFF nieje v registri F), a teda by po spustení inokedy nahraného SNAPSHOTU cez RETN nenastavilo prerušenie správne. Preto sa jeho hodnota zisťuje cez LD A,I alebo LD A,R a následne podľa P/V flagu (alebo sa P/V flag prenesie do nejakého číselného registra trikom PUSH AF + napríklad POP DE, a máme ho v E, kde stačí testovať príslušný bit).


P/V se da testovat primo pomoci PO(0)a PE(1) ktere umi JP ne?

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


Nahoru
 Profil  
 
PříspěvekNapsal: 14.12.2023, 11:48 
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
Pozeram ze (temer) vsetky otazky uz boli zodpovedane, tak len zopar dodatkov.

Navrhari Z80 si tak trosku zjednodusili pracu a vsetky instrukcie po #ED s opkodmi %01xxx101 su iba obycajny RET ktory este navyse IFF2 zapise do IFF1.

Normalne su IFF1 aj IFF2 nastavene vzdy rovnako:
- Pri EI sa oba sa nastavia na 1
- Pri DI a preruseni INT sa oba nastavia na 0
takze ak sa pri navrate z prerusenia INT pouzije RETI tak nevadi ze sa jeden zapise do druheho.

Ina situacia nastane pri preruseni NMI, ktore vynuluje iba IFF1 a ten druhy IFF2 ponecha bez zmeny. Preto pocas vykonavania obsluhy NMI bude INT zakazane (lebo IFF1=0) a ak chceme, aby po navrate z NMI bolo v takom stave ako pred prichodom NMI, tak mozeme but pouzit lubovolny z RET-ov #ED %01xxx101 alebo si zistit stav IFF2 znamym sposobom pomocou LD A,I / LD A,R a na konci obsluhy (ne)vykonat EI pred RET.

_dworkin píše:
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.
Jediny vyznam RETI je iba pre spravu viacurovnovych preruseni od roznych periferii (DMA,CTC,PIO,SIO...) kde tieto periferne obvody sleduju zbernicu a ked zdetekuju kod instrukcie RETI tak vedia ze prave skoncila obsluha jedneho prerusenia a ak na obsluhu caka nejake dalsie prerusenie s rovnakou alebo nizsou prioritou, tak vygeneruju INT aby sa toto prerusenie mohlo vykonat.

Ak sa pocas vykonavania nejakej urovne prerusenia vyskytne prerusenie vyssej urovne, tak sa rovno generuje dalsi INT a jeho obsluha sa spusti. Toto si samozrejme vyzaduje aby hned na zaciatku obsluhy preruseni akejkolvek urovne okrem najvyssej bolo EI. Tym padom ho uz netreba na konci kde je RETI a tym padom nie je potrebne, aby RETI robil aj EI.

_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...
Tych nevyuzitych miest v ROMke je viac :)
Suhlasim s tebou ze je to skoda, ze ten basic mohol byt este lepsi.
Ale na druhej strane, vsetko zle moze byt aj na nieco dobre, poskytlo to priestor pre rozne vylepsenia a vdaka tomu vzniklo kopec vseliakych vylepsenych ROMiek.

_dworkin píše:
A neni to spis problem autoru opravenych ROM? Jak si pak k tomu prijdou vlastnici originalni? Omezovat se kvuli dopredne kompatibilite.
Nie je. Sam Sinclair cast tejto oblasti vyuzil na rozsirenie pre ZX 128. Okrem toho, ZX 128 ma viac baniek romky a tie ostatne banky tam tu velku oblast #FF nemaju.

_dworkin píše:
Radsi bych vydal 2 verze programu at si kazdy vybere
A kazdy si vyberie tu kompatibilnejsiu verziu - ved naco drzat tu prvu, viazanu iba na originalnu romku, ked druha verzia funguje vsade rovnako dobre ? :poke: :lol:

Ono vo vseobecnosti, a pokial nie sme na ZX 16kB, je VZDY lepsie si vytvorit svoj vlastny a uplny IM2 vektor. Nejde len o stav na zbernici alebo tu oblast #FF v romke, ale napriklad, co ak prvy bajt v romke nebude DI ? ;)


Nahoru
 Profil  
 
PříspěvekNapsal: 14.12.2023, 12:08 
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:
P/V se da testovat primo pomoci PO(0)a PE(1) ktere umi JP ne?

Pri snapshote to uz nie je flag, ale hodnota v pamati, teda by sa z nej opat musel urobit flag.


Nahoru
 Profil  
 
PříspěvekNapsal: 14.12.2023, 12:23 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Busy píše:
Toto si samozrejme vyzaduje aby hned na zaciatku obsluhy preruseni akejkolvek urovne okrem najvyssej bolo EI.

To asi nie, signál INT trvá nejaký čas a ak bude hneď na začiatku EI, tak na jeden INT sa zareaguje viackrát. Neviem koľko trvá INT na ZX, ale na Sam Coupé to je dosť na niekoľkonásobné opakovanie INT, ale na Samovi sa dá aj testovať či už skončila požiadavka na INT, alebo o aký typ ide.


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

Registrován: 16.06.2014, 12:23
Příspěvky: 3677
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
Já bych k tomu řekl, že je to nekoncepčně řešené přerušení v ROM, záplatování hazardů, kdy se čte při přerušení prázdná datová sběrnice (do které kecá videoram - specialita ZX), prostě jedna prasárna za druhou :D
Ale to je úděl pionýrů. Sir Clive asi nepočítal, že se to bude rozebírat ještě za 40 let.

Jdu si pustit Micro-Men :lol:

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


Nahoru
 Profil  
 
PříspěvekNapsal: 14.12.2023, 14:00 
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
Antony/DTA píše:
To asi nie, signál INT trvá nejaký čas a ak bude hneď na začiatku EI, tak na jeden INT sa zareaguje viackrát. Neviem koľko trvá INT na ZX...
Ferranti ULA v ZXS 48k generuje /INT dlouhý zhruba 32T (9.16us).

Pokud vím, MUSÍ to být déle, než trvá zpracování nejdelší instrukce Z80 + možná část předchozí, aby mohlo přerušení spolehlivě nastat. Dá se napsat smyčka, jejíž počet taktů vychází celočíselně do 1/50 a to může způsobit, že kratší /INT přerušení nevyvolá. Narazili jsme na to při ladění ZX48-CLA, kdy u jedné konkrétní smyčky pro testování stavu klávesnice ze sys. proměnné pomocí bit 5,(iy+1) nenastávalo IM1.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 14.12.2023, 14:44 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
No za 32T to IM2 nestihne viac ako raz, IM0 a IM1 si niesom istý, ale asi tiež nie.


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

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Chtel bych uprimne podekovat vsem diskutujicim. :clap: Jste naprosto UZASNI! :god2: Myslim to smrtelne vazne. A i lidem stojicim za oldcompem, kteri to umoznili. Mit misto, kde se muzes na neco zeptat a dostat takhle odborne odpovedi neni bezna. Byt postrkovan spravnym smerem a jeste dostat rady cestou.. A na tohle si dej bacha, protoze to souvisi s...

Kdyz uz si tu vylevam srdicko tak rovnou popreji vsem pekne vanocni svatky, at vam zbyde aspon trosku casu i na spectra :speccy: atarka :atari: komouse :cman: amigy :A nebo jakykoliv jiny konicek :rpi: podle vasich preferenci :drunk:

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


Nahoru
 Profil  
 
PříspěvekNapsal: 14.12.2023, 16:00 
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
Antony/DTA píše:
Busy píše:
Toto si samozrejme vyzaduje aby hned na zaciatku obsluhy preruseni akejkolvek urovne okrem najvyssej bolo EI.
To asi nie, signál INT trvá nejaký čas a ak bude hneď na začiatku EI, tak na jeden INT sa zareaguje viackrát.
Nie, pozor, tu som nepisal o klasickom pripade obsluhy prerusenia "natvrdo" ako je to obvykle na nasich osembitoch.

Pisal som ako funguje hierarchicke viacurovnove prerusenie od pefirernych obvodov Z80 rodiny. Vtedy viacnasobne vyvolanie prerusenia nehrozi, pretoze periferne obvody sleduju odpoved Z80 CPU na prerusenie (signal /INTA ako kombinacia /M1 a /IORQ) aby vedeli ze CPU zareagoval a signal /INT mozu zhodit. A tiez mu nasledne mohli poskytnut nizsi bajt IM2 vektora.


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 Předchozí  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 36 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