OldComp.cz http://www.oldcomp.cz/ |
|
Blikanie kurzoru v BASICu 1Z-016 http://www.oldcomp.cz/viewtopic.php?f=134&t=2226 |
Stránka 1 z 2 |
Autor: | Milsa [ 13.01.2015, 18:19 ] |
Předmět příspěvku: | Blikanie kurzoru v BASICu 1Z-016 |
Mal by som otázku na blikanie kurzoru. Pokiaľ si správne myslím, kurzor bliká tak, že do všetkých grafických rovín sa odošle obraz kurzoru v móde XOR. Mohol by mi toto niekto potvrdiť, prípadne vyvrátiť alebo doplniť? Riešim chybné zobrazovanie grafiky v emulátore a aj keď zdroják vyzerá naoko v poriadku, mám podozrenie, že zle vykresľujem v módoch OR a XOR. V Highway a Exploding Fist mám čierne pruhy a v BASICu mi knebliká kurzor. |
Autor: | suksoft [ 13.01.2015, 18:45 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
To zalezi na programu. Rozhodne se to nemusi delat pres EXOR. Klidne se tam muze zapisovat pres Single. O zapis se stara program. I on rozhodne kde veme frekvenci na blikani. Muze mit svuj vnitrni citac nebo to vezme jako CP/M z preruseni ci muze pouzit HW casovac. |
Autor: | nobomi [ 13.01.2015, 19:08 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
V basicu 1Z-016 se řídí blikání kurzoru hodnotou na bráně C bitu 6 obvodu I8255. Je tam časovač cca 1,5Hz přímo určený pro kurzor. |
Autor: | suksoft [ 13.01.2015, 19:46 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Kdyz jsem psal "HW casovac" tak jsem myslel to co pise Nobomi. Ale jeste je mozno vyuzit casovace 8253. |
Autor: | Milsa [ 16.01.2015, 00:12 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Takže problém s blikaním v BASICu je takýto: Ako jediný som implementoval reset časovača kurzora a výsledok je taký, že sa mi v BASICu neustále resetuje tento časovač a kurzor stále svieti. Ak resetovanie zakomentujem, tak začne pekne blikať. Vie mi niekto vysvetliť prečo sa stále nuluje? Nulujem ho tak, že ak je bit 7 na bráne A 8255 je 0, tak vynulujem premennú, kde pripočítavam tiky kryštálu počítača. Ak je hodnota tejto premennej nižšia ako polovica času 0,7 sekundy (cca 10000000 tikov), tak vrátim na bite 6 brány C 8255 hocnotu 0, inak 1. Mám v implementácii chybu? V monitore sa nulovanie prejavuje tak, že po stlačení klávesu a zorazení znaku sa kurzor posunie a vynuluje a teda sa vždy po stlačení klávesu zobrazí. V monitore sa to teda, aspoň myslím, správa korektne. V BASICu sa to ale neustále nuluje. |
Autor: | Milsa [ 17.01.2015, 12:44 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Takže nové skutočnosti sú tieto: Testujem na emubasic.mzf. Pravidelne sa mi volá rutina na 092bh. Táto rutina najprv uloží na port dOh hodnotu 00h a potom ffh, čím sa mi kurzor vynuluje a teda stále svieti. Ak zakážem nulovanie kurzora (ignorácia nulovacieho bitu na porte d0h, tak sa pekne rozbliká. Aký má význam uložiť na tento port 00h a hneď potom ffh? Prečo na reálnom Sharpovi táto sekvencia kurzor nevynuluje? |
Autor: | nobomi [ 17.01.2015, 22:21 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Milsa píše: Aký má význam uložiť na tento port 00h a hneď potom ffh? Prečo na reálnom Sharpovi táto sekvencia kurzor nevynuluje? Protože to není čítač, ale analogový multivibrátor, vstup RESET obvod ovlivní pouze pokud byl výstup v log.1. Pokud už byl v log.0 (případ BASICu), nedělá nic, respektive pokračuje v půl-kmitu. Jedná se spíš o synchronizaci než reset.Sám jsem resetování 556 v emulaci taky vypustil, ale ten tvůj dotaz mě přiměl, abych to teď zkusil napsat pořádně, takže jak mi teď funguje emulace tohoto analogového obvodu ... nejdřív proměnné a definice: Kód: unsigned char I8255_A; //hodnota zapsana na branu A I8255 unsigned char _556OUT; //vystup 556 pin 5 = PC6 I8255 unsigned long _556UIN; //napeti 556 pin 2,6 - hodnota pri startu pocitace 0 #define mV 100000 //mili Volt [*10nV] zvoleno tak, aby se max hodnota napeti vesla do 32bitoveho datoveho typu #define _556UCC (5000*mV) //5V napajeni #define _556TRG (_556UCC/3-5*mV) // 1/3 napajeni minus hystereze komparatoru - hodnota na ktere preklapi vstup TRIG #define _556TRH (_556UCC*2/3+5*mV) // 2/3 napajeni plus hystereze komparatoru - hodnota na ktere preklapi vstup THRES #define _556DIS (65*mV) //65mV napeti vystupu DISCH - ubytek na vnitrnim odporu pri cca 3.4mA pri změně (zápisu) na port D0h (nebo adresu E000h v MZ700 módu): Kód: I8255_A = hodnota zapsana na port if ((I8255_A&(1<<7))==0) _556OUT=0; //PA7 reset 556 else if (_556UIN<_556TRG) _556OUT=1; //reset neni a TRIG je aktivni -> pokracuje kmitani jednou za televizní řádek (bohatě stačí, vyhovuje cokoliv mezi 1us a 1ms, při jiné frekvenci je ale potřeba přepočítat konstanty) pak zavolám update hodnot: Kód: if ((I8255_A&(1<<7))==0) _556OUT=0; if (_556OUT) { _556UIN+=((_556UCC-_556UIN)/7571); // (R*C)/t = ((47k+1k5)*10u)/64.06us = 7571 if (_556UIN>_556TRH) _556OUT=0; } else { _556UIN-=((_556UIN-_556DIS)/7337); // (R*C)/t = (47k*10u)/64.06us = 7337 if (_556UIN<_556TRG) _556OUT=1; } hodnota _556OUT se pak, jak je zřejmé, předává v dotazu na bránu C do bitu 6 u I8255 A takhle to funguje přesně jak asi tvůrci chtěli 1.5Hz střída cca 1:1 P.S.: Pro matematické puritány to asi není košér, chtělo by počítat výstup až při dotazu na jeho hodnotu rovnou dosazením do výsledku diferenciální rovnice s dosazením okrajových hodnot z minulého dotazu, dokonce by to ani nebylo tak složíté, vždyť je ta diferenciální rovnice lineární (aspoň pro jeden půl-kmit), takže to pár exponenciálních funkcí spraví, ale takhle je to matematicky míň náročné, bych řekl, a tím přičítáním přírustků, tak jak jsou nastavené, uděláme chybu max v řádu desetin promile. |
Autor: | Milsa [ 17.01.2015, 22:35 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Ešte sa snažím zorientovať v tom, čo si napísal, je toho na mňa na začiatok dosť. Ale chcel by som povedať zatiaľ toľko, že mne ten kurzor resetuje niekoľkokrát za sekundu (nejedná sa o prerušenie) a teda je kurzor stále vynulovaný. Nechápem prečo mi ho nuluje. No a ešte sa vyjadrím k tomu 00h a ffh. Ak sa pošle 00h, tak sa kurzor vynuluje, ale ak sa pošle ffh, tak je to zápis riadiaceho slova s týmito parametrami: - brána A obojsmerný strobovací režim, vstup - brána A jednosmerný strobovací režim vstup - brána C vstup Podľa toho predpokladám, že sa vlastne tá 1 zapíše ako spomínaš vyššie a teda je možné v budúcnosti nulou vynulovať. Lenže tá 1 sa zapíše len preto, aby bolo možné načítať údaje zo vstupu (vždy je odpojený log. 1 cez odpor a po privedení 0 je možné tú nulu prečítať, opačne to myslím nejde). Ale nebolo by jednoduchšie urobiť to tak, že sa zapíše 0fh, čiže bez prepínania režimov brán? Prepáč, trepem sprostosti, toto je brána A a nie práca s bránou C cez riadiace slovo. Mazať to nebudem, nerád mažem už napísané, ale ignoruj to (to zmenšené). Som z toho už osprostený a pretiem si bránu A s bránou C. |
Autor: | Milsa [ 17.01.2015, 23:08 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
K tvojmu riešeniu: Pridal som kontrolu, že či je bit nastavený na 1 a chcem nulovať alebo je 0 a chcem nulovať. Ak je 0 a dám pokyn na nulovanie, tak sa nič nestane, ak 1 a dám pokyn na nulovanie, tak sa znuluje. Aj keď toto je asi jedno, lebo podľa tvojej implementácie vidím, že ak je uložená nula, tak sa nuluje neustále. U mňa sa nuluje práve pri kontrole zapísaného bajtu v jednotke I8253 len pri zápise bajtu na bránu A. Ja to mám tak, že počítam tiky kryštálu a akonáhle dosiahnem toľko tikov, že z toho vidím, že ubehol čas 0,7 sekundy, tak odpočítam toľko tikov, koľko prislúcha tomuto času. Potom len v prípade potreby posuniem bitovú hodnotu tikov pre 0,7 sekundy o 1 bit vpravo a keď je hodnota tikov kurzora nižšia, tak vrátim 0. Takto mám blikanie vyriešené, ale v BASICu niekoľkokrát za sekundu mi ho nuluje brána A. Pri nulovaní len do počtu tikov kurzora vložím 0 a teda bliká od začiatku. Mám v takejto implementácii chybu? Doplnené: Urobil som teraz aj test na hodnotu bitu brány A pre nulovanie, ak je znulovaný tento bit, tak sa mi tiky kurzora nepočítajú, takže teraz by to malo byť úplne ideálne, ale v BASICu stále kurzor svieti. Ak zruším nulovanie, tak pekne bliká. Lenže ja chcem mať funkčné aj nulovanie. Rutina, čo ho nuluje je na adrese 092bh. Aký má táto rutina význam, keď sa neustále opakuje a nuluje mi kurzor? |
Autor: | Milsa [ 18.01.2015, 11:33 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Ďakujem, už rozumiem. Prečo ale tá rutina stále "nuluje" tento oscilátor? Ak by som dával stále nulu, tak dôjde k tomu, že tá log. 0 z oscilátora bude síce minimálne krátka, ale bude sa stále opakovať a na jednotku nevyskočí nikdy. V Zdeňkovom emulátore som dal na tú rutinu breakpoint a tiež to tam stále "chodí" "nulovať". Lenže on nulovanie implementované nemá, takže neviem ako by sa to správalo s ním. |
Autor: | nobomi [ 18.01.2015, 13:14 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Tuším, že si ještě nerozíme dokonale. Uvedu příklad: co se stane, když na 10 sekund nastavím RESET=0 a po této době RESET na 1 ? Okamžitě vyletí OUT na 1. A bude tam dokonce o nějakých 58% déle než obvykle, pokud je jasné proč, tak si rozumíme. A tomu kódu v BASICu, těžko říct, co vývojáře vedlo k tomu, jak to napsali, ale je to takhle: Kód: 092B CD BA 00 HCURON: CALL PUSHRA 092E AF XOR A 092F D3 D0 OUT (LSD0),A ;reset 556 0931 2F CPL 0932 D3 D0 OUT (LSD0),A 0934 3A 8C 10 LD A,(CURFLG) 0937 B7 OR A 0938 C0 RET NZ 0939 18 AA JR CURSM 093B CD BA 00 HCUROF: CALL PUSHRA 093E 3A 8C 10 LD A,(CURFLG) 0941 B7 OR A 0942 C8 RET Z 0943 18 A0 JR CURSM 0945 DB D2 FLASH: IN A,(LSD2) ;bit 6 0947 07 RLCA 0948 07 RLCA 0949 30 E0 JR NC,HCURON 094B 18 EE JR HCUROF Pokud není stisknutá klávesa volá se jen rutina FLASH (HCURON přímo jen po stisku klávesy), ta zavolá "resetovací" rutinu HCURON jen a pouze pokud je výstup na 0. Takže nezpůsobí na 556 vůbec žádnou změnu, tedy nezávisle na těchto "nulováních" výstup stejně přejde po cca 350ms na log. 1. Pokud by se trefila rutina nakrásně do místa, kde se sice naměří log. 0 na výstupu, ale než dojde k nastavení RESETu, tak se výstup změní na log. 1, tak se sice cyklus zkrátí, ale "nulování" se provede do 50us po přečtení stavu log. 0, tedy půl-kmit s log. 0 na výstupu skončí nejpozději do 100us od "nulování" (viz obrázek z minulého příspěvku) a výstup přejde na log. 1, takže při dalším volání rutiny FLASH už bude výstup zaručeně na log. 1. a HCURON se nazavolá a kurzor vesele blikne. Když použiješ ten algoritmus, co jsem sem napsal, celý a ne jen část, tak to bude fungovat, můžeš nahlížet do proměnných, jak to přesně funguje a pak teprve hledat možná zjednodušení, toť moje rada, víc už k tomu asi napsat neumím. Držím palec. |
Autor: | Milsa [ 19.01.2015, 00:03 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Ďakujem. Ešte si to niekoľkrát poriadne prečítam a hádam sa zadarí. |
Autor: | chaky [ 19.01.2015, 01:03 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
Nechce se mi to ted overovat na realnem HW, nicmene ve svych poznamkach mam uvedeno, ze blokovani casovace kurzoru je funkcni jen v MZ700 rezimu a v jinych rezimech jej zamknout nelze Jinak co se tyka presnosti emulace, tak konkretne u tohoto casovace bych si moc hlavu nedelal. Podivej se do archivu mailistu - pred nejakou dobou jsem poslal do sveta programek, kterym jsme merili periodu tohoto casovace na ruznych Sharpech a vysledne hodnoty mely opravdu veliky rozptyl, ktery je zavisly jak na teplote okoli, tak predevsim na stavu kondenzatoru, kterym je zdroj techto hodin realizovan. |
Autor: | nobomi [ 19.01.2015, 02:14 ] |
Předmět příspěvku: | Re: Blikanie kurzoru v BASICu 1Z-016 |
chaky píše: Nechce se mi to ted overovat na realnem HW, nicmene ve svych poznamkach mam uvedeno, ze blokovani casovace kurzoru je funkcni jen v MZ700 rezimu a v jinych rezimech jej zamknout nelze Obavám se, že tu v poznámkách došlo k záměně časovačů. Časovač/čítač který nejde v MZ800 módu blokovat (vstupem GATE) je CT0 obvodu I8253. Naproti tomu RESET obvodu 556 časování kurzoru jde ovládat nadále, je řízen z brány A obvodu I8255, která se zároveň používá k výběru řádku klávesnice, nešla by tak číst ani klávesnice a to evidentně jde chaky píše: Jinak co se tyka presnosti emulace, tak konkretne u tohoto casovace bych si moc hlavu nedelal. Podivej se do archivu mailistu - pred nejakou dobou jsem poslal do sveta programek, kterym jsme merili periodu tohoto casovace na ruznych Sharpech a vysledne hodnoty mely opravdu veliky rozptyl, ktery je zavisly jak na teplote okoli, tak predevsim na stavu kondenzatoru, kterym je zdroj techto hodin realizovan. S tím nejde nesouhlasit, přesnosti hodnot časových konstant nejsou podstatné, když tolerance součástek je nějakých 20%. Ale princip na jakém funguje u obvodu 556 ovládání přes vstup RESET důležitý je (pokud se už teda použije, protože to používá naprosté minimum programů a i ten BASIC v klidu přežije, když se to v emulaci nepoužije vůbec).
|
Stránka 1 z 2 | Všechny časy jsou v UTC + 1 hodina [ Letní čas ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |