OldComp.cz

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


Právě je 28.03.2024, 18:20

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 17 ]  Přejít na stránku 1, 2  Další
Autor Zpráva
 Předmět příspěvku: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 13.01.2015, 18:19 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
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.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 13.01.2015, 18:45 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 13.01.2015, 19:08 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 296
Has thanked: 12 times
Been thanked: 228 times
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 13.01.2015, 19:46 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Kdyz jsem psal "HW casovac" tak jsem myslel to co pise Nobomi. Ale jeste je mozno vyuzit casovace 8253.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 16.01.2015, 00:12 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
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.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 17.01.2015, 12:44 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
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?

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 17.01.2015, 22:21 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 296
Has thanked: 12 times
Been thanked: 228 times
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. 8-)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 17.01.2015, 22:35 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
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.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 17.01.2015, 23:08 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
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?

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 18.01.2015, 02:02 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 296
Has thanked: 12 times
Been thanked: 228 times
Milsa píše:
Aký má táto rutina význam, keď sa neustále opakuje a nuluje mi kurzor?
Asi jsem to napsal nesrozumitelně, tak zkusím ještě jinak, 556 není čítač, nedá se zastavit nebo "vynulovat" je v tom analogový integrační RC článek a ten běží neustále a vstupem RESET se dá jen natvrdo zvolit kterou hodnotu integruje. Zkusím přiložit obrázek, ten to snad osvětlí, zeleně je tam místo kdy byla stisknutá klávesa, následně se vygeneruje RESET v době kdy je log.1 na výstupu, výstup tedy přejde na log.0, ale kvůli napětí na vstupu TRIG(Uin), které je nižší než při plném cyklu se tento cyklus zkrátí, "čítání" se jakoby urychlí, k žádnému "nulování" nebo "resetování" nedojde.


Přílohy:
556.jpg
556.jpg [ 76.92 KiB | Zobrazeno 13428 krát ]
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 18.01.2015, 11:33 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Ď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.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 18.01.2015, 13:14 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 296
Has thanked: 12 times
Been thanked: 228 times
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 19.01.2015, 00:03 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Ďakujem. Ešte si to niekoľkrát poriadne prečítam a hádam sa zadarí.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 19.01.2015, 01:03 
Offline
Kecálek

Registrován: 10.10.2014, 10:40
Příspěvky: 89
Has thanked: 3 times
Been thanked: 48 times
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.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Blikanie kurzoru v BASICu 1Z-016
PříspěvekNapsal: 19.01.2015, 02:14 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 296
Has thanked: 12 times
Been thanked: 228 times
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).


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ů: 17 ]  Přejít na stránku 1, 2  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 9 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