Blame | Last modification | View Log | Download | RSS feed
% Z-controller by KOE %Title "Zcont";Subdesign Zcont(adr0, adr1, adr2, adr3, adr4, adr5, adr6, adr7, a[15..8], data[7..0], strobe,restrig, iorq, rd, m1, dos, wr, sdtakt, sddatain, sdabsent, readonly, magic0 : input;dbus[7..0], reso, nmi, iorqce: bidir;ebl, sdtakto, sddatao, sdcs, sdpower,iow, wrh, ior, rdh, magic1: output;)Variablemousex[7..0], mousey[7..0], mousebut[2..0], keyd0[7..0],keyd1[7..0], keyd2[7..0], keyd3[7..0], keyd4[7..0], counter[7..0],sddatawr[7..0], sddatard[7..0],sdcontrwr[1..0], sdcounter[3..0],sddel[4..0], starttr, starttr1, stoptr, synchrotrig[1..0]: dff;d[7..0], res, nmib, ioro: tri;notstrobe, var1, var2, datakey[4..0], portmx, portmy, portmb,portkey, iow, ior, wrh, rdh, eblior, naher, datasd,contrsd, %wrdatasd,% rddatasd, rdsdcontr, mniv, wrdatasd, iorqcc, sdtakt1, sdtakt2,sdstrobe, sdtakto0, sdcount : node;Beginsddel0.clk=sdtakt;sddel0.d=not(sddel0.q);sddel1.clk=sddel0.q;sddel1.d=not(sddel1.q);sddel2.clk=sddel1.q;sddel2.d=not(sddel2.q);sddel3.clk=sddel2.q;sddel3.d=not(sddel3.q);sddel4.clk=sddel3.q;sddel4.d=not(sddel4.q);sdtakt1=sdtakt;notstrobe=not(strobe);counter[0].d=not(counter[7].q); counter[7..1].d=counter[6..0].q;counter[7..0].clk=notstrobe;counter[7..0].clrn=restrig;% ╟ряюыэ хь сєЇхЁр т яюЁ фъх юўхЁхфш ё ърцф√ь ЇЁюэЄюь ёшуэрыр strobe %keyd0[7..0].d=data[7..0]; keyd1[7..0]=data[7..0];keyd2[7..0].d=data[7..0]; keyd3[7..0]=data[7..0]; keyd4[7..0]=data[7..0];mousex[7..0].d=data[7..0]; mousey[7..0].d=data[7..0]; mousebut[2..0].d=data[2..0];keyd0[7..0].clk=counter[0].q;keyd1[7..0].clk=counter[1].q;keyd2[7..0].clk=counter[2].q;keyd3[7..0].clk=counter[3].q;keyd4[7..0].clk=counter[4].q;mousebut[2..0].clk=counter[7].q;mousex[7..0].clk=counter[5].q;mousey[7..0].clk=counter[6].q;% ╚ьшЄшЁєхь чрь√ърэшх ъэюяюўхъ ╤яхъЄЁєьр ...└ тюЄ юЄё■фр эрўшэрхЄё шчтЁрЄ :( %datakey[0] = (keyd0[0].q or a[8]) and (keyd0[1].q or a[9]) and (keyd0[2].q or a[10]) and (keyd0[3].q or a[11]) and (keyd0[4].q or a[12]) and (keyd0[5].q or a[13]) and (keyd0[6].q or a[14]) and(keyd0[7].q or a[15]);datakey[1] = (keyd1[0].q or a[8]) and (keyd1[1].q or a[9]) and (keyd1[2].q or a[10]) and (keyd1[3].q or a[11]) and (keyd1[4].q or a[12]) and (keyd1[5].q or a[13]) and (keyd1[6].q or a[14]) and(keyd1[7].q or a[15]);datakey[2] = (keyd2[0].q or a[8]) and (keyd2[1].q or a[9]) and (keyd2[2].q or a[10]) and (keyd2[3].q or a[11]) and (keyd2[4].q or a[12]) and (keyd2[5].q or a[13]) and (keyd2[6].q or a[14]) and(keyd2[7].q or a[15]);datakey[3] = (keyd3[0].q or a[8]) and (keyd3[1].q or a[9]) and (keyd3[2].q or a[10]) and (keyd3[3].q or a[11]) and (keyd3[4].q or a[12]) and (keyd3[5].q or a[13]) and (keyd3[6].q or a[14]) and(keyd3[7].q or a[15]);datakey[4] = (keyd4[0].q or a[8]) and (keyd4[1].q or a[9]) and (keyd4[2].q or a[10]) and (keyd4[3].q or a[11]) and (keyd4[4].q or a[12]) and (keyd4[5].q or a[13]) and (keyd4[6].q or a[14]) and(keyd4[7].q or a[15]);% ─х°шЇЁшЁєхь яюЁЄ√ %portkey = (not ebl) or adr0 or rd;portmx = (not dos) or adr5 or a[10] or not(adr6) or not(a[8]) or not(adr7);portmy = (not dos) or (adr6 nand a[10]) or adr5 or not(adr7);portmb = (not dos) or adr5 or a[8] or a[10] or (not adr6) or not(adr7);% ┴ыюъшЁєхь яЁюїюцфхэшх iorq т юёэютэє■ яырЄє %iorqcc = not(portmx and portmy and portmb and portkey and datasd and contrsd and ebl);ioro.in = iorqcc;ioro.oe = iorqcc;iorqce = ioro.out;% ├рфшь т °шэє фрээ√ї %if not (adr0 or rd or iorq) then d[4..0].in = datakey[4..0]; d[7..5].in = vcc; end if;if not (portmx or iorq or rd) then d[7..0].in = mousex[7..0].q; end if;if not (portmy or iorq or rd) then d[7..0].in = mousey[7..0].q; end if;if not (portmb or iorq or rd) then d[2..0].in = mousebut[2..0].q; d[7..3].in=vcc; end if;dbus[7..0] = d[7..0].out;d[7..0].oe = not((portmx and portmy and portmb and portkey and rddatasd and rdsdcontr) or iorq or rd);% reset %naher = (restrig or strobe);res.in = naher;res.oe = not(naher);reso = res.out;% NMI %mniv = restrig or not(data[0]);nmib.in = gnd;nmib.oe = gnd;nmi = nmib.out; % Ёрэ№°х їюЄхы яЁюёЄю ёфхырЄ№ NMI яю эрцрЄш■ magic,яюЄюь яюэ ы, ўЄю схч яюфъы■ўхэш ╧╟╙ TR-DOS Єръшх Їюъєё√ эх яЁющфєЄ,юЄърчрыё юЄ Єръюую яюфїюфр, яю¤Єюьє т√їюф MNI тёхуфр т Z-ёюёЄю эшш%if not(mniv) then magic1 = magic0; else magic1 =vcc; end if;% SPI Interface for ZX-Spectrum ver. 1.0 by KOE %% ╧юЁЄ√: SD CONTROL: 77hSD DATA: 57h %contrsd = (adr0 nand dos) or adr7 or not(adr6) or not(adr5) %or adr3 or not(adr2)% or not(adr1);datasd = (adr0 nand dos) or adr7 or not(adr6) or adr5 %or adr3 or not(adr2)% or not(adr1);--contrsd = (adr0 nand dos) or adr7 or not (adr6 and adr5 %and adr4 and adr3 %and adr2 and adr1 and adr0);--datasd = (adr0 nand dos) or adr7 or adr6 or not (adr5 %and adr4 and adr3%and adr2 and adr1);wrdatasd = datasd or wr or iorq;% ╘шъёшЁєхь ъюэхЎ Ўшъыр чряшёш т яюЁЄ %starttr.clk = wrdatasd and rddatasd;starttr.d = vcc;starttr.clrn = stoptr.q;% ёшэїЁюэшчшЁєхьё ё ъыюъюь SPI %starttr1.clk = sdtakt1;starttr1.d=starttr.q;starttr1.clrn=stoptr.q;% ╬ёЄрэютър %stoptr.clk = not(sdcount);stoptr.d = gnd;stoptr.prn = wrdatasd and rddatasd;sdstrobe = starttr1.q and stoptr.q;sdtakto=sdstrobe and sdtakt1;% ╤ўхЄўшъ ЄръЄют фы SD-ърЁЄ√ (юЄёўшЄ√трхЄ 8 ЄръЄют) %sdcounter[].clk=not(sdtakto) and sdcount;sdcounter[].d=sdcounter[].q - 1;sdcounter[].prn=starttr1.q;sdcount = sdcounter[3].q;% ╤ЄЁюс чр∙хыъштрэш фрээ√ї т SPI %synchrotrig0.d=not(wrdatasd);synchrotrig0.clk=stoptr.q;synchrotrig0.clrn=not(synchrotrig1.q);synchrotrig1.clk=not(sdtakt1);synchrotrig1.d=synchrotrig0.q;% ╧Ёшэшьрхь фрээ√х т ёфтшур■∙шщ ЁхушёЄЁ ш яшїрхь шї т SD-ърЁЄє %if not(sdstrobe) thenif not(wrdatasd) thensddatawr[].clk = synchrotrig0.q;sddatawr[7..0].d = dbus[7..0]; else sddatawr[].clk=gnd;end if; % ярЁрыыхы№эр яюуЁєчър %else sddatawr[7..1].d=sddatawr[6..0].q;sddatawr[7..1].clk = not(sdtakt1);sddatawr[0].clk=gnd; %ёфтшу %end if;sddatao=sddatawr[7].q;% ╤їтрЄ√трхь фрээ√х шч SD-ърЁЄ√ %sddatard[7..1].d = sddatard[6..0].q;sddatard[0].d = sddatain;sddatard[].clk = sdtakto;rddatasd = datasd or rd or iorq;if not (rddatasd) then d[7..0].in = sddatard[7..0].q; end if;sdcontrwr[].clk = not(contrsd or iorq or wr);sdcontrwr[1..0].d = dbus[1..0];sdcontrwr[].clrn = reso;sdpower = not(sdcontrwr[0].q);sdcs = sdcontrwr[1].q;rdsdcontr = contrsd or iorq or rd;if not(rdsdcontr) then d[0].in = sdabsent;d[1].in = readonly;end if;% IDE яю ёїхьх Nemo %ebl = (m1 nand dos) or adr1 or adr2;eblior = ebl or iorq;iow= eblior or adr0 or wr or (not rd);wrh = eblior or wr or (adr0 nand rd);ior = eblior or adr0 or rd or (not wr);rdh = eblior or rd or (wr nand adr0);end;