OldComp.cz

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


Právě je 29.03.2024, 09:19

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 67 ]  Přejít na stránku 1, 2, 3, 4, 5  Další
Autor Zpráva
PříspěvekNapsal: 04.11.2019, 11:23 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2332
Has thanked: 303 times
Been thanked: 637 times
Experimentoval jsem včera s AY-3-8912 v ZX Spectrum 128k +2 a předem spočítané časování na takt mi nevychází. Musel jsem zkrátit kód ze spočítaných 61 taktů zhruba o 3 takty, abych se dostal na požadovaný čas trvání. Kód samozřejmě běží v rychlé RAM se zakázaným přerušením, zapisuju na oba porty 49149 i 65533 pomocí out(c),a

Může to být tím, že porty AY jsou zpomalené?

Matně vzpomínám, že o tom Velesoft kdesi psal detailněji. Zpomalení portů zmiňuje i tady https://velesoft.speccy.cz/pentagon512_interface.htm ale zbytek textu se věnuje jen rozšíření paměti.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 12:31 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Vsechny porty co maji A0=0 jsou zpomalene. Takze ty dva co pises jsou zpomalene.


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 12:55 
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
Ty dva mají ale A0 v jedničce ;-)

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


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

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Lanex píše:
Ty dva mají ale A0 v jedničce ;-)


Ano to mas pravdu.


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 13:02 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2332
Has thanked: 303 times
Been thanked: 637 times
Nejenže mají A0 = 1,ale A0 = 0 má port 254 a ten je hojně využíván pro beeper, tam by zpomalení dělalo velké potíže.

Až budu doma, pošlu kód, který mi nevycházel, je krátký a není v něm nic záludného, kromě toho out (c),a, který jestli trvá o 1/3 času déle... no tak to je ono.

Na druhou stranu viz https://www.worldofspectrum.org/faq/ref ... Contention Zdá se to být komplikovanější, než jen závislost na jednom bitu adresy.
Citace:
If the port address being accessed has its low bit reset, the ULA is required to supply the result, which leads to a delay if it is currently busy handling the screen.

The address of the port being accessed is placed on the data bus. If this is in the range 0x4000 to 0x7fff, the ULA treats this as an attempted access to contended memory and therefore introduces a delay. If the port being accessed is between 0xc000 and 0xffff, this effect does not apply, even on a 128K machine if a contended memory bank is paged into the range 0xc000 to 0xffff.

Suksoft má tedy s A0 = 0 pravdu plus rozsah od 0x4000 do 0x7fff. Proto se to neprojevuje například při práci s 8255.

Jenže "supply the result"... to se týká jen čtení, ne? Nebo i zápisu?

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


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 15:25 
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
Aha. Takže pri spectre ako je pomalá pamäť, tak isto sú aj pomalé porty v rovnakom rozsahu. Zaujímavé. Povedal by som, že to bude aj čítanie, aj zápis. Zbernica sa predsa používa rovnako pri oboch funkciách.

Čo tak urobiť si test? Borderom sa to dobre meria. Najprv si načasovať miesto hore nad obrazovkou, tam zmeniť border, potom funkcia ktorú chceme odmerať, a znova zmena borderu. A opakovať. Podľa dĺžky pásiku vidíme počet taktov funkcie. 1 takt je viac ako 1 cm na obrazovke, takže sa to dá celkom slušne odmerať.

_________________
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: 04.11.2019, 16:05 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Co pisi mam vycteno z ZX48 ale pro ZX128 se pry pouziva stejna logika. Pozastavavani ULY pri IORQ je v puvodnim navrhu uplne spatne udelane a nefunguje spravne. Proto se postupne delaly dve upravy co zajistuji funkcnost pri IN/OUT operaci. Prvni je Dead Cockroach - to dela to, ze pri jakemkoliv pristupu IORQ nastavi A14=1 A15=0, ula se domniva ze se cte z pomale pameti. To ale ma nevyhodu ze se zastavuji uplne vsechny porty a proto bylo v dalsich verzich dodan tranzistor, ktery dela to, ze kdyz je A0=1. tak da vstup do ULA do log1 a tak ula nevi ze je nejaka cinnost na IORQ od CPU a tak nic nepozastavuje. Stale vsak muze byt ula pozastavena na kombinaci A14=1 a A15=0, Ula se domniva ze dochazi ke cteni pomale pameti.

=============

Pro ZX128

Pri A0=0 se provadi vzdy pozastaveni hodin. Uvnitr ULA se nastavuje A14=1 A15=0 a tak ULA se domniva ze se cte z pomale pameti.

Pri A0=1 se ULA vubec nedozvi ze je nejake cteni/zapis IORQ na sbernici od CPU a tak na to nereaguje. Ale soucasne je porad platne, ze pri kombinaci A14=1 A15=0 se domniva ze dochazi ke cteni z pomale pameti a tak bude pozastavovat hodiny.

Porty co pises jsou:
49149 BFDDH 1011 - nepozastavuje se
65533 FFFDH 1111 - nepozastavuje se

Podle mne by se nemela ula pozastavovat pro tyto dva porty.


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 17:21 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3676
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
Každej IORQ má automaticky jeden waitt, s tím ale určitě počítáš :)

_________________
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: 04.11.2019, 19:56 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
PotPalo píše:
1 takt je viac ako 1 cm na obrazovke, takže sa to dá celkom slušne odmerať.
No záleží na tom, akú veľkú máš obrazovku. :)


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 20:12 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Antony/DTA píše:
PotPalo píše:
1 takt je viac ako 1 cm na obrazovke, takže sa to dá celkom slušne odmerať.
No záleží na tom, akú veľkú máš obrazovku. :)


Mozna bych radeji pouzil definici, ze jeden znak se na sirku vykresluje 4 takty CPU.


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 20:30 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2332
Has thanked: 303 times
Been thanked: 637 times
WAIT přidaný k IO operacím trvá jak dlouho? Jeden takt? Déle?

Nicméně napsal jsem si na vyzkoušení nejjednodušší možný kód
Kód:
                cpu     z80undoc
                org     60000

START           di

                ld      bc,65533                ; zvol registr 7
                ld      a,7
                out     (c),a
                ld      bc,49149                ; vypni zvuk, I/O port výstup (bit 6 v log. 1)
                ld      a,255
                out     (c),a
                ld      bc,65533                ; zvol registr 14
                ld      a,14
                out     (c),a
                ld      bc,49149                ; a bude se zapisovat na I/O port

LOOP            xor     a               ;  4T
                out     (c),a           ; 12T
                jp      $+2             ; 10T

                cpl                     ;  4T
                out     (c),a           ; 12T
                jp      LOOP            ; 10T
Spuštěno v rychlé RAM na ZX Spectrum 128k +2 by to mělo generovat stabilní obdélníky se střídou 50% o frekvenci 3546900/52 = 68209Hz
Jedním multimetrem naměřím cosi kolísajícího pod 69.9kHz (ignoruji), druhým naměřím 68.2kHz stabilně - ok, to se blíží předpokladu.

Osciloskop teď při ruce nemám, ale logickým analyzátorem vidím, že střída není 50%, log. 0 trvá 6.50us a log. 1 trvá 8.17us, tzn střída je 55.6% Celkový čas jedné periody 14.67us odpovídá zhruba 68.18kHz.

Multimetr potvrzuje, opravdu naměřím cca 55.5 až 55.6% - může být. Že by důsledek pullupů v I/O portu AY-3-8912 + ty 4 přidané (viz schéma 128k +2 - R16, R18, R20, R21 na výstupech AY A0 až A3)?

Přijde mi, že měření kromě nepoměru mezi trváním log. 0 a log. 1 odpovídá předpokladu, takže to je asi v pořádku.

Pro pořádek, neměřím na přímo na AY, ale měřím na RS232-> TTL převodníku, který je připojený do RS232/MIDI portu na zadní straně ZX Spectra. Měření přímo na AY pro mě nemá význam. Důležité je, že se nezdá, že by se tam zpomalení uplatňovalo a přidaný WAIT asi taky ne. Nebo to z toho jen nevidím?

Teď ještě zjistit, proč se ten komplikovanější kód rozchází v počtu taktů vs čas běhu. Možná jsem jen nějakou instrukci započítal špatně.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 20:49 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Nemas tam preklep? Ja bych misto $+2 instinktivne dal $+3 nebo radeji bych tam dal label. Asi tam mas takto NOP instrukci navic.


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 21:02 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2332
Has thanked: 303 times
Been thanked: 637 times
suksoft píše:
Nemas tam preklep? Ja bych misto $+2 instinktivne dal $+3 nebo radeji bych tam dal label. Asi tam mas takto NOP instrukci navic.
Zkoušel jsem trasovat a v Prometheovi to tak funguje. Ale máš pravdu, pro AS musí být $+3. Nedělalo by to nop, ale add a,b.

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


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 21:18 
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
zxcygnus píše:
suksoft píše:
Nemas tam preklep? Ja bych misto $+2 instinktivne dal $+3 nebo radeji bych tam dal label. Asi tam mas takto NOP instrukci navic.
Zkoušel jsem trasovat a v Prometheovi to tak funguje. Ale máš pravdu, pro AS musí být $+3. Nedělalo by to nop, ale add a,b.
Ano, to je znama chyba Prometea. $ neznamena instrukcny pointer na zaciatku riadku, ale na zaciatku daneho vyrazu. Najlepsie to ukaze tento kod:
Kód:
org #8000
dw $,$,$,$


Nahoru
 Profil  
 
PříspěvekNapsal: 04.11.2019, 21:28 
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
suksoft píše:
Antony/DTA píše:
PotPalo píše:
1 takt je viac ako 1 cm na obrazovke, takže sa to dá celkom slušne odmerať.
No záleží na tom, akú veľkú máš obrazovku. :)


Mozna bych radeji pouzil definici, ze jeden znak se na sirku vykresluje 4 takty CPU.


Hergot, ma neberte doslova, nemám tucha o dĺžke jedného taktu na obrazovke.
Som to myslel asi takto:

HALT
XOR A
OUT (254),A
LD BC, pauza (teraz neviem, treba odskúšať)
:loop
DEC BC
LD A,B
OR C
JR NZ,loop
LD A,4
OUT (254),A
[tu bude pozorovaná/é inštrukcia/e]
XOR A
OUT (254),A
RET

Toto spustiť z basicu v slučke. Pauzu skúsiť aby bola zelená čiarka v borderi hore nad obrazom. Podľa trvania pozorovanej inštrukcie sa dá pozorovať jej dĺžka. Prípadne porovnať s niekoľkými NOP. Trochu to bude možno skákať, lepší výsledok by bol s IM2 bez obsluhy klávesnice.

_________________
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  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 67 ]  Přejít na stránku 1, 2, 3, 4, 5  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:  
cron
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz