Přejít na obsah
ARCHIVEKArchiv e-mailových konferencí o 8bitových počítačích Archiv Pandory 1999 až 2013

Zpět na zprávu

Celé vlákno · 9 zpráv

[SharpMZ] Potize s generovanim preruseni od CTC0 na mz-800 - podezreni na mrtvy OUT0 od 8253 (?)

malinsky <mm.malinsky@[doména skryta]> SHARP MZ-800

Zdravim vsechny delegaty sharpi konference!

Po vecerech se pokousim o naprogramovani jednoduche obsluhy asynchronniho prenosu dat pres RS232C (na Unikarte). Jako nejcistsi mi pripada pravidelne generovani preruseni s frekvenci dostatecnou pro bezpecne hlidani provozu na Rx/Tx portech. 
K tomu bych rad vyuzil rychle bezici CTC0 obvodu 8253 v modu 0 (pro 9600 bd potrebuju frekvenci cca 1kHz nebo vic), jehoz OUT je podle manualu priveden na pin 4 brany A PIO; to by pak melo obstarat generovani INT.
(Uvedomuju si, ze na neco takoveho by v principu stacilo i “znasilnovani” CTC1->CTC2->INT, ale pouziti CTC0 mi prijde cistsi.)

Procetl jsem manualy k dotycnym obvodum a cvicne naprogramoval kratkou rutinu v asembleru pro mod 700, ale at zkousim, co zkousim, spravne mi to funguje jen v emulatorech (v obou, ktere jsem zkusil, tj. ten od Z. Adlera a stejne tak  i v mz800emu), tj. CTC0 vyvola preruseni, ktere se korektne obslouzi; na skutecnem zeleze, co mam doma, to ale vypada, ze se interrupt od CTC0 nikdy nevyvola. 

Zkousel jsem vsechno mozne (im1 vs. im2, mod 700 vs. mod 800, ruzne maskovani preruseni v PIO mod. 3, ruzne konfigurace I/O pinu brany A,  interrupt triggrovany na HIGH i LOW, AND i OR nemaskovanych vstupnich linek, dokonce i hrani s nastavenim PC0 a PC2 od 8255), ale nic nepomohlo. 

Nakonec jsem Sharpa rozebral a jednoduchym amaterskym osciloskopem (tj. zvukovkou stareho laptopu) jsem vyzkousel OUT0 pin 8253, a ackoli citac prokazatelne bezi (v tom programku se prubezne zobrazuje rychle se menici obsah adresy E004), na OUT0 neni zadna aktivita. (Pozn.: Tentyz “osciloskop” na OUT1 vidi pekny sekundovy tik, na datovem portu 8253ky pak bourlivou aktivitu, takze chyba snad neni na mem “prijmaci”; mimochodem, citac CTC0 nastavuju na a0a0, mod 0, tj. ocekaval bych nejakych 30 pulzu na OUT0 za sekundu, coz by i tak primitivni aparat jako je stara zvukovka mel pobrat.)

Chtel bych proto pozadat o pomoc, a to hlavne ve forme kontroly kodu onoho kratkeho testovaciho programku nezavislyma a zkusenejsima ocima - mzf vcetne komentovaneho zdrojaku pro sdcc (asembler v code.s) je ke stazeni na 

http://www-ucjf.troja.mff.cuni.cz/~malinsky/files/v3b-preruseni_na_zeleze-CTC0-var2.zip

Taky bych chtel poprosit, jestli byste nekdo mohl prilezitostne to mzfko otestovat na svem zeleze - melo by to delat to, ze v horni casti obrazovky se vypisuje cca radek a pul stridajicich se znaku, o dva radky niz se zobrazuje aktivita na E004 a jeste niz by melo nezavisle bezet nekolik radku barevnych ctverecku (ty prave vyrabi interrupt handler, a ty jsou taky presne tim, co na svem zeleze nevidim, ale v emulatorech vesmes ano). Mohli byste mi dat vedet, jestli se na vasich strojich ty ctverecky zobrazuji nebo ne?

Predem dekuju a omlouvam  za predlouhe slohove cviceni (a za svoji pitomost).

Michal Malinsky

Re: [SharpMZ] Potize s generovanim preruseni od CTC0 na mz-800 - podezreni na mrtvy OUT0 od 8253 (?)

Michal Hucik - ORDOZ <ordoz@[doména skryta]> SHARP MZ-800


Dobry den, zkusim to vzit postupne:

Co se tyka implementace RS232 v Unikarte, tak nevim jakou mate verzi. Pokud tu puvodni, kterou jsem vyvijel spolecne s Vaskem Peroutkou, tak ta - pokud si pamatuju umi pres API nastavit vse, vcetne bd, HW/SW rizeni toku a nastaveni limitu pro interrupty z bufferu RS232... Pokud mate tu novejsi verzi Unikarty od Bohouse, tak tam bohuzel netusim jake jsou moznosti obsluhy SIO.

Podival jsem se na vas zdrojak. Zkusim to bodove:

1) Jen drobne doporuceni - pro umisteni obecneho programu bych spise doporucoval rozsah adres 0x2000 - 0x7fff, kde mate bez ohledu na rezim, ci mapovani vzdy zaruceno, ze tam bude RAM

2) Pouzivate IM 1, coz je rezim, ktery pri interruptu zavola RST 0x18 - zadna posvatna adresa na 0x1039 neexistuje. Bud si musite odmapovat dolni ROM a umistit na adresu 0x0038 obsluznou rutinu, nebo je potreba pouzivat rezim IM 2 u ktereho si na nejake sude adrese v pameti ulozite interrupt vector - adresu interrupt handleru. Horni cast adresy vectoru vlozite do registru I. Dolni (vzdy suda!) cast adresy se posle na ctrl port prislusne brany PIOZ80.

3) Vsimnul jsem si, ze vas interruipt handler konci instrukci RET. Vzhledem k tomu, ze interrupt zavolalo PIOZ80, tak mu musite sdelit, ze obsluzna rutina uz skoncila a je mozne zacit opet strasit. K tomu slouzi navratova instrukce RETI.

4) CTC0 nastavujete do rezimu MODE0, tzn. ze ve chvili, kdy zapisete kontrolni slovo, tak CTC0 output prejde do stavu "0" a zustane v nem naveky, nebo dokud nedokoncite load. Pak se spusti odecet a na jeho konci prejde CTC0 output do stavu "1", kde zustane uz naporad. POZOR: CTC0 je do PIOZ80 pripojeno na PA4 pres invertor! Vas interrupt controller musi byt tedy citlivy na uroven HIGH.

5) Aby jste se vyhnul tomu, ze prijde interrupt drive, nez chcete, nebo naopak, ze neprijde vubec, tak doporucuji pri inicializaci dodrzet nasledujici poradi procesu:

- sdelit procesoru DI

- optimalne bych pres PC2 na i8255 zablokoval interrupty z CTC2, aby se nam do toho nemotaly

- poslat CTRL MODE0 do CTC (output prejde do klidoveho stavu )

- nastavit registr I a vlozit dolni cast interrupt vectoru do PIOZ80

- dokoncit inicializaci PIOZ80 s tim, ze ve chvili kdy se nastavuje Interrupt Controll Word ( ICW - xxxx 0111 ), tak 4. bit nastavte "1" - tzn.,  ze bude nasledovat IC_MASK. V tuto chvili se provede reset pripadneho interruptu, ktery by tam mohl zakerne cekat. Ve chvili, kdy zapisete IC_MASK, tak se provede scan stavu portu a vy nutne potrebujete, aby byl v klidu /CTC0 = "1"

- sdelit procesoru EI

- dokoncit load CTC0, cimz se spusti pocitani

Vic mne toho ted od pohledu do toho zdrojaku nenapada. Dejte vedet jak jste dopadnul.

Michal


Dne 1.2.2017 v 15:05 malinsky napsal(a):
Zdravim vsechny delegaty sharpi konference!

Po vecerech se pokousim o naprogramovani jednoduche obsluhy asynchronniho prenosu dat pres RS232C (na Unikarte). Jako nejcistsi mi pripada pravidelne generovani preruseni s frekvenci dostatecnou pro bezpecne hlidani provozu na Rx/Tx portech. 
K tomu bych rad vyuzil rychle bezici CTC0 obvodu 8253 v modu 0 (pro 9600 bd potrebuju frekvenci cca 1kHz nebo vic), jehoz OUT je podle manualu priveden na pin 4 brany A PIO; to by pak melo obstarat generovani INT.
(Uvedomuju si, ze na neco takoveho by v principu stacilo i “znasilnovani” CTC1->CTC2->INT, ale pouziti CTC0 mi prijde cistsi.)

Procetl jsem manualy k dotycnym obvodum a cvicne naprogramoval kratkou rutinu v asembleru pro mod 700, ale at zkousim, co zkousim, spravne mi to funguje jen v emulatorech (v obou, ktere jsem zkusil, tj. ten od Z. Adlera a stejne tak  i v mz800emu), tj. CTC0 vyvola preruseni, ktere se korektne obslouzi; na skutecnem zeleze, co mam doma, to ale vypada, ze se interrupt od CTC0 nikdy nevyvola. 

Zkousel jsem vsechno mozne (im1 vs. im2, mod 700 vs. mod 800, ruzne maskovani preruseni v PIO mod. 3, ruzne konfigurace I/O pinu brany A,  interrupt triggrovany na HIGH i LOW, AND i OR nemaskovanych vstupnich linek, dokonce i hrani s nastavenim PC0 a PC2 od 8255), ale nic nepomohlo. 

Nakonec jsem Sharpa rozebral a jednoduchym amaterskym osciloskopem (tj. zvukovkou stareho laptopu) jsem vyzkousel OUT0 pin 8253, a ackoli citac prokazatelne bezi (v tom programku se prubezne zobrazuje rychle se menici obsah adresy E004), na OUT0 neni zadna aktivita. (Pozn.: Tentyz “osciloskop” na OUT1 vidi pekny sekundovy tik, na datovem portu 8253ky pak bourlivou aktivitu, takze chyba snad neni na mem “prijmaci”; mimochodem, citac CTC0 nastavuju na a0a0, mod 0, tj. ocekaval bych nejakych 30 pulzu na OUT0 za sekundu, coz by i tak primitivni aparat jako je stara zvukovka mel pobrat.)

Chtel bych proto pozadat o pomoc, a to hlavne ve forme kontroly kodu onoho kratkeho testovaciho programku nezavislyma a zkusenejsima ocima - mzf vcetne komentovaneho zdrojaku pro sdcc (asembler v code.s) je ke stazeni na 


Taky bych chtel poprosit, jestli byste nekdo mohl prilezitostne to mzfko otestovat na svem zeleze - melo by to delat to, ze v horni casti obrazovky se vypisuje cca radek a pul stridajicich se znaku, o dva radky niz se zobrazuje aktivita na E004 a jeste niz by melo nezavisle bezet nekolik radku barevnych ctverecku (ty prave vyrabi interrupt handler, a ty jsou taky presne tim, co na svem zeleze nevidim, ale v emulatorech vesmes ano). Mohli byste mi dat vedet, jestli se na vasich strojich ty ctverecky zobrazuji nebo ne?

Predem dekuju a omlouvam  za predlouhe slohove cviceni (a za svoji pitomost).

Michal Malinsky


_______________________________________________
SharpMZ mailing list
SharpMZmail.ordoz.com
http://mail.ordoz.com/mailman/listinfo/sharpmz


Re: [SharpMZ] Potize s generovanim preruseni od CTC0 na mz-800 - podezreni na mrtvy OUT0 od 8253 (?)

Michal Hucik - ORDOZ <ordoz@[doména skryta]> SHARP MZ-800

Dne 1.2.2017 v 16:31 Michal Hucik - ORDOZ napsal(a):

Zobrazit citovaný text (6 řádků)
> 4) CTC0 nastavujete do rezimu MODE0, tzn. ze ve chvili, kdy zapisete 
> kontrolni slovo, tak CTC0 output prejde do stavu "0" a zustane v nem 
> naveky, nebo dokud nedokoncite load. Pak se spusti odecet a na jeho 
> konci prejde CTC0 output do stavu "1", kde zustane uz naporad. POZOR: 
> CTC0 je do PIOZ80 pripojeno na PA4 pres invertor! Vas interrupt 
> controller musi byt tedy citlivy na uroven HIGH.
Preklep: z CTC na konci vyleze "1" a do PIOZ80-PA4 vleze "0" - citlivost 
tedy na LOW!

Michal

Re: [SharpMZ] Potize s generovanim preruseni od CTC0 na mz-800 - podezreni na mrtvy OUT0 od 8253 (?)

malinsky <mm.malinsky@[doména skryta]> SHARP MZ-800

Dobry den,

vrele diky za Vas cas i za velmi poucne cteni. 

Co se tyce toho RS232C na Unikarte (mam jednu z posledni varky od B. Novacka), chci ho pouzit na komunikaci pres UART rozhrani s mikrokontrolerem, u ktereho se mi nedostavaji nozky na neco slozitejsiho nez je asynchronni prenos, proto se snazim resit bufferovani po svem.

Ke zdrojaku:
1) a 2) jsou jasne; onou ?posvatnosti? adresy 0x1039 jsem mel na mysli prave situaci, kdy je dolni ROM primapovana :-) Im 2 mi take prijde elegantnejsi, i kdyz pro rychle (a hlavne laicke) experimentovani slozitejsi, a tudiz az druhy v poradi.
3) Aha, to mi nedoslo.
4)+5) Rozumim.

Co me ale stale mate je fakt, ze jsem na fyzickem pinu OUT0 na 8253 nenasel zadnou aktivitu, ackoli citac CTC0 prokazatelne (snad) bezel. Zkusim totez promerit pri nejake ?obycejnejsi? cinnosti (beep), aby bylo jiste, ze je chyba skutecne mezi zemi a klavesnici.

Jeste jednou dekuji a jsem s pozdravem,

MM

On 1 Feb 2017, at 16:31, Michal Hucik - ORDOZ <ordoz[doména skryta]> wrote:


Dobry den, zkusim to vzit postupne:

Co se tyka implementace RS232 v Unikarte, tak nevim jakou mate verzi. Pokud tu puvodni, kterou jsem vyvijel spolecne s Vaskem Peroutkou, tak ta - pokud si pamatuju umi pres API nastavit vse, vcetne bd, HW/SW rizeni toku a nastaveni limitu pro interrupty z bufferu RS232... Pokud mate tu novejsi verzi Unikarty od Bohouse, tak tam bohuzel netusim jake jsou moznosti obsluhy SIO.

Podival jsem se na vas zdrojak. Zkusim to bodove:

1) Jen drobne doporuceni - pro umisteni obecneho programu bych spise doporucoval rozsah adres 0x2000 - 0x7fff, kde mate bez ohledu na rezim, ci mapovani vzdy zaruceno, ze tam bude RAM

2) Pouzivate IM 1, coz je rezim, ktery pri interruptu zavola RST 0x18 - zadna posvatna adresa na 0x1039 neexistuje. Bud si musite odmapovat dolni ROM a umistit na adresu 0x0038 obsluznou rutinu, nebo je potreba pouzivat rezim IM 2 u ktereho si na nejake sude adrese v pameti ulozite interrupt vector - adresu interrupt handleru. Horni cast adresy vectoru vlozite do registru I. Dolni (vzdy suda!) cast adresy se posle na ctrl port prislusne brany PIOZ80.

3) Vsimnul jsem si, ze vas interruipt handler konci instrukci RET. Vzhledem k tomu, ze interrupt zavolalo PIOZ80, tak mu musite sdelit, ze obsluzna rutina uz skoncila a je mozne zacit opet strasit. K tomu slouzi navratova instrukce RETI.

4) CTC0 nastavujete do rezimu MODE0, tzn. ze ve chvili, kdy zapisete kontrolni slovo, tak CTC0 output prejde do stavu "0" a zustane v nem naveky, nebo dokud nedokoncite load. Pak se spusti odecet a na jeho konci prejde CTC0 output do stavu "1", kde zustane uz naporad. POZOR: CTC0 je do PIOZ80 pripojeno na PA4 pres invertor! Vas interrupt controller musi byt tedy citlivy na uroven HIGH.

5) Aby jste se vyhnul tomu, ze prijde interrupt drive, nez chcete, nebo naopak, ze neprijde vubec, tak doporucuji pri inicializaci dodrzet nasledujici poradi procesu:

- sdelit procesoru DI

- optimalne bych pres PC2 na i8255 zablokoval interrupty z CTC2, aby se nam do toho nemotaly

- poslat CTRL MODE0 do CTC (output prejde do klidoveho stavu )

- nastavit registr I a vlozit dolni cast interrupt vectoru do PIOZ80

- dokoncit inicializaci PIOZ80 s tim, ze ve chvili kdy se nastavuje Interrupt Controll Word ( ICW - xxxx 0111 ), tak 4. bit nastavte "1" - tzn.,  ze bude nasledovat IC_MASK. V tuto chvili se provede reset pripadneho interruptu, ktery by tam mohl zakerne cekat. Ve chvili, kdy zapisete IC_MASK, tak se provede scan stavu portu a vy nutne potrebujete, aby byl v klidu /CTC0 = "1"

- sdelit procesoru EI

- dokoncit load CTC0, cimz se spusti pocitani

Vic mne toho ted od pohledu do toho zdrojaku nenapada. Dejte vedet jak jste dopadnul.

Michal


Dne 1.2.2017 v 15:05 malinsky napsal(a):
Zdravim vsechny delegaty sharpi konference!

Po vecerech se pokousim o naprogramovani jednoduche obsluhy asynchronniho prenosu dat pres RS232C (na Unikarte). Jako nejcistsi mi pripada pravidelne generovani preruseni s frekvenci dostatecnou pro bezpecne hlidani provozu na Rx/Tx portech. 
K tomu bych rad vyuzil rychle bezici CTC0 obvodu 8253 v modu 0 (pro 9600 bd potrebuju frekvenci cca 1kHz nebo vic), jehoz OUT je podle manualu priveden na pin 4 brany A PIO; to by pak melo obstarat generovani INT.
(Uvedomuju si, ze na neco takoveho by v principu stacilo i ?znasilnovani? CTC1->CTC2->INT, ale pouziti CTC0 mi prijde cistsi.)

Procetl jsem manualy k dotycnym obvodum a cvicne naprogramoval kratkou rutinu v asembleru pro mod 700, ale at zkousim, co zkousim, spravne mi to funguje jen v emulatorech (v obou, ktere jsem zkusil, tj. ten od Z. Adlera a stejne tak  i v mz800emu), tj. CTC0 vyvola preruseni, ktere se korektne obslouzi; na skutecnem zeleze, co mam doma, to ale vypada, ze se interrupt od CTC0 nikdy nevyvola. 

Zkousel jsem vsechno mozne (im1 vs. im2, mod 700 vs. mod 800, ruzne maskovani preruseni v PIO mod. 3, ruzne konfigurace I/O pinu brany A,  interrupt triggrovany na HIGH i LOW, AND i OR nemaskovanych vstupnich linek, dokonce i hrani s nastavenim PC0 a PC2 od 8255), ale nic nepomohlo. 

Nakonec jsem Sharpa rozebral a jednoduchym amaterskym osciloskopem (tj. zvukovkou stareho laptopu) jsem vyzkousel OUT0 pin 8253, a ackoli citac prokazatelne bezi (v tom programku se prubezne zobrazuje rychle se menici obsah adresy E004), na OUT0 neni zadna aktivita. (Pozn.: Tentyz ?osciloskop? na OUT1 vidi pekny sekundovy tik, na datovem portu 8253ky pak bourlivou aktivitu, takze chyba snad neni na mem ?prijmaci?; mimochodem, citac CTC0 nastavuju na a0a0, mod 0, tj. ocekaval bych nejakych 30 pulzu na OUT0 za sekundu, coz by i tak primitivni aparat jako je stara zvukovka mel pobrat.)

Chtel bych proto pozadat o pomoc, a to hlavne ve forme kontroly kodu onoho kratkeho testovaciho programku nezavislyma a zkusenejsima ocima - mzf vcetne komentovaneho zdrojaku pro sdcc (asembler v code.s) je ke stazeni na 


Taky bych chtel poprosit, jestli byste nekdo mohl prilezitostne to mzfko otestovat na svem zeleze - melo by to delat to, ze v horni casti obrazovky se vypisuje cca radek a pul stridajicich se znaku, o dva radky niz se zobrazuje aktivita na E004 a jeste niz by melo nezavisle bezet nekolik radku barevnych ctverecku (ty prave vyrabi interrupt handler, a ty jsou taky presne tim, co na svem zeleze nevidim, ale v emulatorech vesmes ano). Mohli byste mi dat vedet, jestli se na vasich strojich ty ctverecky zobrazuji nebo ne?

Predem dekuju a omlouvam  za predlouhe slohove cviceni (a za svoji pitomost).

Michal Malinsky


_______________________________________________
SharpMZ mailing list
SharpMZmail.ordoz.com
http://mail.ordoz.com/mailman/listinfo/sharpmz


_______________________________________________
SharpMZ mailing list
SharpMZmail.ordoz.com
http://mail.ordoz.com/mailman/listinfo/sharpmz

Re: [SharpMZ] Potize s generovanim preruseni od CTC0 na mz-800 - podezreni na mrtvy OUT0 od 8253 (?)

Michal Hucik - ORDOZ <ordoz@[doména skryta]> SHARP MZ-800


Dne 1.2.2017 v 17:10 malinsky napsal(a):
Zobrazit citovaný text (6 řádků)
>
> Ke zdrojaku:
> 1) a 2) jsou jasne; onou “posvatnosti” adresy 0x1039 jsem mel na mysli 
> prave situaci, kdy je dolni ROM primapovana :-) Im 2 mi take prijde 
> elegantnejsi, i kdyz pro rychle (a hlavne laicke) experimentovani 
> slozitejsi, a tudiz az druhy v poradi.
Pokud chcete pouzivat IM 1, tak staci odmapovat dolni rom a na 0x0038 si 
vlozte treba JP int_handler
Zobrazit citovaný text (4 řádky)
> Co me ale stale mate je fakt, ze jsem na fyzickem pinu OUT0 na 8253 
> nenasel zadnou aktivitu, ackoli citac CTC0 prokazatelne (snad) bezel. 
> Zkusim totez promerit pri nejake “obycejnejsi” cinnosti (beep), aby 
> bylo jiste, ze je chyba skutecne mezi zemi a klavesnici.
No pozor, ona CTC0 sice na pocatku zrejme pocitala, tak jak jste si ji 
nastavil, ale kdyz prislo na hodnotu 0, tak se zmenil stav na output a 
konec... output uz se nemeni.
To ze z citace dostavate stale nejake hodnoty je jen jakasi jeho 
ezotericka vlastnost, kterou jsem si ja ve svem emu nazval BLIND_COUNT - 
registr citace je neustale inkrementovan s kazdym taktem vstupnich 
hodin, nicmene oficialni citani uz skoncilo.

Mam zrovna k Sharpu pichnuty analyzer, protoze zkoumam ruzne 
nedokumentovane zaludnosti PIOZ80 a mohu potvrdit, ze po spusteni vaseho 
MZF se stav na vystupu CTC0 nemeni. Kdyby jste zvolil v CTC MODE2, nebo 
MODE3, tak ten by se po dokonceni odectu periodicky znovu preloadoval do 
hodnoty, kterou jste nastavil na zacatku a odecet by se skutecne 
opakoval i se zmenama na outputu.

Re: [SharpMZ] Potize s generovanim preruseni od CTC0 na mz-800 - podezreni na mrtvy OUT0 od 8253 (?)

Michal Hucik - ORDOZ <ordoz@[doména skryta]> SHARP MZ-800

Zobrazit citovaný text (4 řádky)
> 1) a 2) jsou jasne; onou “posvatnosti” adresy 0x1039 jsem mel na mysli 
> prave situaci, kdy je dolni ROM primapovana :-) Im 2 mi take prijde 
> elegantnejsi, i kdyz pro rychle (a hlavne laicke) experimentovani 
> slozitejsi, a tudiz az druhy v poradi.
Aha, az ted mne napadlo podivat se do vypisu ROM :) 0x1039 jsem vskutku 
neznal :) Jinak jak k inicializaci PIO v IM 2 pouzivam tohle:


set_ivector:
     ld hl, ivector_addr
     bit 0, l
     jr z,ivector_is_even
     inc hl
ivector_is_even:
     push hl
     pop ix
     ld hl,interrupt_routine
     ld (ix + 0), l
     ld (ix + 1), h
     push ix
     pop hl
     ld a,h
     ld i,a
     ld a,l
     ld hl, pioz80_init_data
     ld (hl), a
     ;ld bc, 0x06fc
     ld b, 0x05
     ld c,pio_ctrl
     otir
     ret


; inicializacni data pro z80pio
pioz80_init_data:
     db 0x00            ; dolni cast adresy int. vectoru (nulty bit musi 
byt 0!)

     db 0xcf            ; dolni 4 bity musi byt 1111, horni 2 pak
                        ; mod nasledujici operace 0 - out, 1 - in,
                        ; 2 - bidir, 3 - control
                        ; 4. a 5. bit nemaji vyznam


    db 0x3f            ; v modu 3 musi nasledovat I/O Register Control Word
                        ; Vstup - 1, vystup - 0
                        ;
                        ; PA0 - IN - /RDA (LPT)
                        ; PA1 - IN - /STA (LPT)
                        ; PA2 - IN - GND
                        ; PA3 - IN - GND
                        ; PA4 - IN - /CTC0 (pozor, je invertovany!)
                        ; PA5 - IN - /VBLN
                        ; PA6 - OUT - IRT (LPT)
                        ; PA7 - OUT - RDP (LPT)
;db 0x2f ; ooio iiii
;db 0x3f ; ooii iiii
;db 0xff ; oooo oooo



   db 0x97            ; dolni 4 bity musi byt 0111 -
                        ; 7 - 1/0 En.INT/disable
                        ; 6 - 1/0 AND/OR,
                        ; 5 - 1/0 Hi/Low,
                        ; 4 - Mask follows
                        ; 0x97 = 1001 0111


;db 0x97 ; IENA, OR, LOW, MASK
;db 0xb7 ; IENA, OR, HIGH, MASK
;db 0xd7 ; IENA, AND, LOW, MASK
;db 0xf7 ; IENA, AND, HIGH, MASK


     ;db 0xef            ; protoze v predch. slove byl 4b = 1,
                        ; nasleduje bitova maska. Sledovany jsou jen
                        ; piny, jejihz bity jsou 0
                        ;
                        ; 0xef - 4. bit (/CTC0)
                        ; 0xdf - 5. bit (/VBLN)
db 0xef ; /CTC0
;db 0x6f ; /CTC0, PA7
;db 0xff ; nic



ivector_addr:
     db 0x00
     dw 0x0000

Re: [SharpMZ] Potize s generovanim preruseni od CTC0 na mz-800 - podezreni na mrtvy OUT0 od 8253 (?)

malinsky <mm.malinsky@[doména skryta]> SHARP MZ-800

Dobry vecer,

tak uz mi to beha, jak ma (tj. i na zeleze), a to v obou konfiguracich, tj.

1) CTC1->CTC2->INT v modu IM1
2) CTC0->PIO->INT v modu IM2

Hlavni problem byl v obou pripadech s maskovanim preruseni pinem PC2 8255, respektive v tom, ze jsem 8255 zapomnel predtim poslat inicializacni byte, takze nezabral nasledy pokus o odmaskovani.

V pripade 1 jsem pro jednoduchost vyuzil Vasi poznamky o modu 2, v nem ted bezi CTC1, tj. posila tik na CTC2 s frekvenci cca 550 kHz a neni nutne ho restartovat. CTC2 je v modu 0, a po kazdem dopocitani se znovu nastavi a prostrednictvim sveho GATE (bit 0 E008) se spusti, cimz spadne jeho OUT zpatky na 0.

V pripade 2 je im2 patrne jedina funkcni moznost, aspon tak to sugeruje poznamka o maskovacim pinu PC2 8255 v manualu na scavu. Jak je to ale presne zadratovano netusim.

Pokud se chcete podivat, oba funkcni kody vcetne zdrojaku jsou na adrese

http://www-ucjf.troja.mff.cuni.cz/~malinsky/files/vnitrni_preruseni_na_zeleze.zip

Jeste jednou dekuju za pomoc,

MM

On 01 Feb 2017, at 18:19, Michal Hucik - ORDOZ <ordoz[doména skryta]> wrote:

Zobrazit citovaný text (97 řádků)
> 
>> 1) a 2) jsou jasne; onou “posvatnosti” adresy 0x1039 jsem mel na mysli 
>> prave situaci, kdy je dolni ROM primapovana :-) Im 2 mi take prijde 
>> elegantnejsi, i kdyz pro rychle (a hlavne laicke) experimentovani 
>> slozitejsi, a tudiz az druhy v poradi.
> 
> Aha, az ted mne napadlo podivat se do vypisu ROM :) 0x1039 jsem vskutku 
> neznal :) Jinak jak k inicializaci PIO v IM 2 pouzivam tohle:
> 
> 
> set_ivector:
>     ld hl, ivector_addr
>     bit 0, l
>     jr z,ivector_is_even
>     inc hl
> ivector_is_even:
>     push hl
>     pop ix
>     ld hl,interrupt_routine
>     ld (ix + 0), l
>     ld (ix + 1), h
>     push ix
>     pop hl
>     ld a,h
>     ld i,a
>     ld a,l
>     ld hl, pioz80_init_data
>     ld (hl), a
>     ;ld bc, 0x06fc
>     ld b, 0x05
>     ld c,pio_ctrl
>     otir
>     ret
> 
> 
> ; inicializacni data pro z80pio
> pioz80_init_data:
>     db 0x00            ; dolni cast adresy int. vectoru (nulty bit musi 
> byt 0!)
> 
>     db 0xcf            ; dolni 4 bity musi byt 1111, horni 2 pak
>                        ; mod nasledujici operace 0 - out, 1 - in,
>                        ; 2 - bidir, 3 - control
>                        ; 4. a 5. bit nemaji vyznam
> 
> 
>    db 0x3f            ; v modu 3 musi nasledovat I/O Register Control Word
>                        ; Vstup - 1, vystup - 0
>                        ;
>                        ; PA0 - IN - /RDA (LPT)
>                        ; PA1 - IN - /STA (LPT)
>                        ; PA2 - IN - GND
>                        ; PA3 - IN - GND
>                        ; PA4 - IN - /CTC0 (pozor, je invertovany!)
>                        ; PA5 - IN - /VBLN
>                        ; PA6 - OUT - IRT (LPT)
>                        ; PA7 - OUT - RDP (LPT)
> ;db 0x2f ; ooio iiii
> ;db 0x3f ; ooii iiii
> ;db 0xff ; oooo oooo
> 
> 
> 
>   db 0x97            ; dolni 4 bity musi byt 0111 -
>                        ; 7 - 1/0 En.INT/disable
>                        ; 6 - 1/0 AND/OR,
>                        ; 5 - 1/0 Hi/Low,
>                        ; 4 - Mask follows
>                        ; 0x97 = 1001 0111
> 
> 
> ;db 0x97 ; IENA, OR, LOW, MASK
> ;db 0xb7 ; IENA, OR, HIGH, MASK
> ;db 0xd7 ; IENA, AND, LOW, MASK
> ;db 0xf7 ; IENA, AND, HIGH, MASK
> 
> 
>     ;db 0xef            ; protoze v predch. slove byl 4b = 1,
>                        ; nasleduje bitova maska. Sledovany jsou jen
>                        ; piny, jejihz bity jsou 0
>                        ;
>                        ; 0xef - 4. bit (/CTC0)
>                        ; 0xdf - 5. bit (/VBLN)
> db 0xef ; /CTC0
> ;db 0x6f ; /CTC0, PA7
> ;db 0xff ; nic
> 
> 
> 
> ivector_addr:
>     db 0x00
>     dw 0x0000
> 
> _______________________________________________
> SharpMZ mailing list
> SharpMZmail.ordoz.com
> http://mail.ordoz.com/mailman/listinfo/sharpmz

Re: [SharpMZ] Potize s generovanim preruseni od CTC0 na mz-800 - podezreni na mrtvy OUT0 od 8253 (?)

Michal Hucik - ORDOZ <ordoz@[doména skryta]> SHARP MZ-800

Nerozumim uplne poznamce o nutnosti IM2 ve druhem pripade. Je to spise 
naopak:

1) CTC1->CTC2->INT umime obslouzit vyhradne jen modu IM1

2) CTC0->PIO->INT lze obslouzit v IM1 i IM2, ale vzdy se musi pouzit RETI


Shodou okolnosti prave pred par dny jsem psal do konference o svych pokusech s vyzkumem ruznych ezoterickyma vlastnosti kolem aplikace preruseni v MZ-800. Hledal jsem, zda je mozne najit alespon nejake jistoty pri hazardnim pouziti IM2, nebo IM0 v situaci, kdy vznikne interrupt od jineho zarizeni, nez je interni PIOZ80. Prozatim uz alespon v ramci jednoho Sharpa vim, ze to co na sbernici pri CPU_INT_ACK obdrzim neni uplne tak nahodna hodnota, ale prozatim jsem jeste neodhalil zadny smysluplny vztah na kterem je zavisla.


BTW: Kompletni schema zapojeni vsech obvodu v Sharpu naleznete v SM na strane 45 http://www.scav.cz/upload/sm800.pdf


Michal

Dne 1.2.2017 v 23:47 malinsky napsal(a):
Zobrazit citovaný text (20 řádků)
> Dobry vecer,
>
> tak uz mi to beha, jak ma (tj. i na zeleze), a to v obou konfiguracich, tj.
>
> 1) CTC1->CTC2->INT v modu IM1
> 2) CTC0->PIO->INT v modu IM2
>
> Hlavni problem byl v obou pripadech s maskovanim preruseni pinem PC2 8255, respektive v tom, ze jsem 8255 zapomnel predtim poslat inicializacni byte, takze nezabral nasledy pokus o odmaskovani.
>
> V pripade 1 jsem pro jednoduchost vyuzil Vasi poznamky o modu 2, v nem ted bezi CTC1, tj. posila tik na CTC2 s frekvenci cca 550 kHz a neni nutne ho restartovat. CTC2 je v modu 0, a po kazdem dopocitani se znovu nastavi a prostrednictvim sveho GATE (bit 0 E008) se spusti, cimz spadne jeho OUT zpatky na 0.
>
> V pripade 2 je im2 patrne jedina funkcni moznost, aspon tak to sugeruje poznamka o maskovacim pinu PC2 8255 v manualu na scavu. Jak je to ale presne zadratovano netusim.
>
> Pokud se chcete podivat, oba funkcni kody vcetne zdrojaku jsou na adrese
>
> http://www-ucjf.troja.mff.cuni.cz/~malinsky/files/vnitrni_preruseni_na_zeleze.zip
>
> Jeste jednou dekuju za pomoc,
>
> MM