Sari la conținut
ELFORUM - Forumul electronistilor

Reconstruirea minicomputerului Cobra cu circuite moderne ?


cristi7521

Postări Recomandate

Mai am cateva ore pana plec la aeroport si ma uitam la partea de porturi si la tastatura. 

Partea de porturi sunt maxim 5 linii de VHDL dar la tastatura e foarte simplu daca o las asa cum e si pun un conector pentru o tastatura de Cobra (de care n-am de nici un fel) dar devine usor idiotic sa convertesc de la PS2 la 8 biti (8 si ceva - ca tastaurile de PC trimit mai mult) dupa care sa fac un blackbox care sa arate ca la cobra pe partea cobrei. (ma doare neuronul numai cand ma gandesc)

RR 

 

PS - ma gandeam acum ca e mai complicat sa scriu codul ca la cobra (sa iasa compatibil cu cobra) decat sa-l scriu asa cum ar trebui sa-l scriu pentru rezultate mult mai eficiente. (Parca ma pune cineva sa bat cuie stramb si sa fiu mandru la sfarsit)

Editat de roadrunner
Link spre comentariu
  • Răspunsuri 145
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • roadrunner

    73

  • cloudy

    24

  • Ovidanie

    12

  • BIZONUL66

    9

Top autori în acest subiect

Imagini postate

@BIZONUL66 @nustiunimic  

2.12 Input/Output The F5 74LS377 register is used as output port. Whenever an out instruction is executed at any even address (A0=0), for example 0feh, the output data byte is stored to F5. Bits Q[2:0] set the border color, Q3 is used as output for tape recording, similar to CoBra, Q4 is the audio output, Q5 enables/disables the EEPROM, Q6 sets the Spectrum mode, and Q7 is not used. Any in instruction loads the Q5 and Q6 bits to the CE and SM flops (see section 2.7 Operating Modes on page 10). The B 74LS244 buffer is used as input port. Whenever an in instruction is executed from any even address (A0=0), for example 0feh, Z80 reads the K[7:0] bus. Bits K[5:0] are driven by the keyboard, same as for CoBra, K6 is the tape input, and K7 is not used.

 

probabil ca chestia asta a salvat niste porti (IC pe PCB) si a consumat jumatate din adress space-ul de porturi. Sunt sigur ca la timpul respectiv a fost o decizie buna dar acum daca eu fac "altfel" adica decodez full o anumita adresa (dracu stie care) cine stie ce cod scris demult nu mai functioneaza. Stie cineva daca adresa pe bune a portului asta trebuie sa fie 0xFE ? (ma refer la registrul F5 https://cobrasov.org/Download/TS_Spec.pdf )

Editat de roadrunner
Link spre comentariu

@roadrunner
Am folosit test bench de la tine. Si T80 pare ok.
Întradevăr trebuie renunțat la REFR ram dinamic care încurcă și in simulare.
Chiar mă minunam de ce JP C3C3 nu incrementează Addr doar la C3C4, C3C5 și tot așa ...
Cănd ai timp poate faci un ToDo. Și poate iese de un Z80 la ... 240Mhz.
Prea mulți neuroni nu am eu antrenați pentru asta, dar în limita timpului pot să mai spun căte o prostie pe aici.
Baftă !

wave.png

Link spre comentariu
Acum 4 ore, roadrunner a spus:

@BIZONUL66 @nustiunimic  

2.12 Input/Output The F5 74LS377 register is used as output port. Whenever an out instruction is executed at any even address (A0=0), for example 0feh, the output data byte is stored to F5. Bits Q[2:0] set the border color, Q3 is used as output for tape recording, similar to CoBra, Q4 is the audio output, Q5 enables/disables the EEPROM, Q6 sets the Spectrum mode, and Q7 is not used. Any in instruction loads the Q5 and Q6 bits to the CE and SM flops (see section 2.7 Operating Modes on page 10). The B 74LS244 buffer is used as input port. Whenever an in instruction is executed from any even address (A0=0), for example 0feh, Z80 reads the K[7:0] bus. Bits K[5:0] are driven by the keyboard, same as for CoBra, K6 is the tape input, and K7 is not used.

 

probabil ca chestia asta a salvat niste porti (IC pe PCB) si a consumat jumatate din adress space-ul de porturi. Sunt sigur ca la timpul respectiv a fost o decizie buna dar acum daca eu fac "altfel" adica decodez full o anumita adresa (dracu stie care) cine stie ce cod scris demult nu mai functioneaza. Stie cineva daca adresa pe bune a portului asta trebuie sa fie 0xFE ? (ma refer la registrul F5 https://cobrasov.org/Download/TS_Spec.pdf )

Da portul este #FE, eu ca sa pun de exemplu un card cf care iam alocat de la portul  80 la portul  87 am decodat aceste port intr-un gal .

 

Link spre comentariu

Am decodat full portul 0xFE si i-am dat sa se duca prin tool-uri sa vad cam cat de repede ar merge Z80 (care stiu din aminitiri ca e scris sub optim, free de pe net deci sa nu dam cu pietre) - tool-urile zic ca pot sa-l rulez la 86MHz, deci un pic mai repede decat originalul. (pe un fpga cam vechi ce-i drept dar nu va rula mult mai repede nici pe unul modern poate cu un un 10-15% mai repede)

Din pacate nu prea ne foloseste la nimic viteza asta ca tastatura originala nu va functiona corect (apesi o tasta si o citeste de 30 de ori) nu mai zic de intefetele audio, casetofon si ce-o mai fi pe acolo.

Testul e facut cu memorie RAM (interna FPGA) de 64KB si un port 8 biti atasat. Parte cea mai lenta e T80-ul ca restul stiu ca le pot face sa mearga la 200+ MHz.

RR  

Editat de roadrunner
Link spre comentariu
36 minutes ago, roadrunner said:

Testul e facut cu memorie RAM (interna FPGA) de 64KB

Ai eliminat si ciclul RFSH din codul T80 ? Si asta va aduce un spor la viteza de executie.
Eu nu am reusit ... inca.
Este putin comentat codul T80 si tot caut prin el.
Mie unul nu-mi place cum este scris. Este totuși multa muncă acolo.

Link spre comentariu

nu m-am uitat prin cod ca oricum merge mai repede decat trebuie. (de vreo 30 de ori) e scris cum e scris cred ca asa o sa ramana. Putinul timp alocat pentru proiectul asta o sa-l folosesc la partea de afisare (si poate la PS2 -> Cobra Keypad ca sa-i atasez o tastatura de PC)  

Era bun sa am niste diagrame de timp la semnalele de la tastatura., macar sa inteleg cat de repede e scanata.

deci (CQ CQ) cine are informatii despre tastatura de cobra nu fiti timizi. 

RR

 

PS  am vazut un paratetrii de la inceputul codului T80

Mode            : integer := 1;     -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB

si am sperat ca "Fast Z80" e fara refresh, nah tot are cicluri de refresh.

 

Ma gandeam sa scriu un python script sa converteasca ROM-urile de la Cobra in format MIF sa COE ca sa pot initializa automat memoria Block RAM. Inca nu am gasit niste tool-uri bune de Z80 (nici nu am prea cautat) cu care sa scriu cod de test.

RR

 

PS2 - am gasit niste tool-uri mai decente 39$ (Z80) si 99$ pentru toate ...

https://www.oshonsoft.com/z80.php

 

Editat de roadrunner
Link spre comentariu

Testat si scrierea in RAM si merge...probabil ca partea de afisare pe monitor e next, si scrierea a ceva in RAM-ul video.

Ma tot creieresc cum sa fac border-ul (nu ca as avea mare nevoie de el, chiar l-as elimina)

rezolutia la Sinclair e 256x192 daca afisez cu supersampling 1:4 pica pe 1024 x 768 (XGA) si nu-i mai fac nici un border sau optiunea a doua SXGA 1280 x 1024, tot rezolutie video ca la XGA si diferenta o fac border. (sunt convins ca o sa arate ca pixu' amadoua variantele)

RR

Link spre comentariu

Am dat drumul la timingul de VGA (bare colorate) - nu e din memorie barele alea sunt direct din counter-ele de timing.

Urmeaza sa leg RAM-ul video cu tarasenia asta curand. Pixel clk-ul e 65Mhz (1024 x 768 x 60Hz) 

http://www.tinyvga.com/vga-timing/1024x768@60Hz

Probabil ca o sa las si T80 (Z80) sa ruleze la 65Mhz deocamdata.

RR

 

VGA.png

Editat de roadrunner
Link spre comentariu
14 minutes ago, roadrunner said:

Pixel clk-ul e 65Mhz

La 65Mhz o să ai nevoie de ceva bandwidth la accesare RAM video functie de rezolutie si adâncime culoare.

Editat de cloudy
Link spre comentariu

adacime de culoare? la spectrum?  atributele sunt definite intr-o memorie de toata gluma (1 octet la fiecare 8x8 pixeli)

https://www.overtakenbyevents.com/lets-talk-about-the-zx-specrum-screen-layout/

din cauza ca fac oversampling (256x4 = 1024 la fiecare octet din memoria video obtin 32 de pixeli pe ecran) - la atribute e si mai si ca atributele se schimba de 8 ori mai incet (ca sunt pentru grupuri de 8 pixeli) 

de lene probabil ca o sa fac un shift register de 32 biti pe care-l incarc cu copiile de la pixelii din

memorie ceva de genul  (sa zicem ca un octet video e pix(7 downto 0))

reg32 <= (

pix(0) & pix(0) & pix(0) & pix(0) & 

pix(1) & pix(1) & pix(1)  & pix(1) & 

......

& pix(7) & pix(7) & pix(7) & pix(7)

);

 

Iesirea seriala din registrul asta de 32 de biti o colored in functie de continutul memoriei de atribute pentru grupul ala de 8 pixeli. 

 

RR

Editat de roadrunner
Link spre comentariu

Aha, deci afisarea culorii se face cu sprites la Spectrum ?
 

Editat de cloudy
Link spre comentariu

nu chiar (sprites sunt mult mai complicate ca au ram distinct si mentin coordonate ca sa poate fi pictate cand le vine randul la scan) - practic ai o memorie video de pixeli (alb negru sa-i zicem) de la 0x4000 la 0x57FF asta e mapata fiecare bit in octetii aia reprezinta pixel aprins sau stins.

Dupa care ai o zona de la 0x5700 la 0x5AFF care contine culorile de foreground (pixeli) si background (fond) dar se aplica la nivel de caracter (8x8 pixeli) nu pentru fiecare pixel in parte. Memoria de atribute e gandita la nivel text pentru un font 8x8. Deci nu ai rezolutie de culoare la nivel de pixel ci la nivel de caracter.

La nivel de citire faci o citire in memoria de pixeli urmata de una la atribute, prima citire iti zice ce pixeli sunt apinsi/stinsi si a doua iti da culoarea pixelilor aprinsi si culoarea celor stinsi.

RR

 

E principiul de la fisierele gif - care au o harta de pixeli si o harta de culori, valoarea pixel-ului e un entry (index) in harta de culori. 

Editat de roadrunner
Link spre comentariu
9 minutes ago, roadrunner said:

se aplica la nivel de caracter (8x8 pixeli) nu pentru fiecare pixel in parte

Iar grafica (jocurile) tot de "rezolutia" asta de culoare beneficiază ? Cât chin a mai fost ...
Dacă tu scalezi x4, cum oare o să arate pe un ecran mai mare (ca cele din zilele noastre) ?

Editat de cloudy
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări