OldComp.cz

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


Právě je 20.04.2024, 03:24

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 67 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5  Další
Autor Zpráva
PříspěvekNapsal: 09.11.2019, 16:03 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3676
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
http://web.archive.org/web/201909011058 ... _RS232.htm

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


Nahoru
 Profil  
 
PříspěvekNapsal: 09.11.2019, 18:55 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3663
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 797 times
PotPalo píše:
Mňa by zaujímalo, čo z toho by fungovalo na Didaktiku M (iná ULA, iný takt procesoru).
Vsetko by fungovalo tak ako kdekolvek inde, akurat treba mierne upravit casovanie rutiniek.

Didaktik M a Kompakt maju totiz trosku ine casovanie CPU. Sice bezi na 4 MHz, ale kvoli zobrazovaniu sa spomaluje WAIT cyklami, a to aj pocas zobrazovania borderu, takze realna priemerna rychlost je cca 3.4 MHz.

Dobra sprava je, ze cela pamet (vratane videoramky) bezi rovnako rychlo, takze nie je problem umiestnit casovo kriticke rutinky (load/save rutinky, vysielanie a prijem po seriovej linke) do videoramky.

Zla sprava je, ze vzhladom na WAIT cykly kvoli zobrazovaniu sa uz neda spolahnut na takty uvedene v tabulkach instrukcii. Napriklad vsetky troj-taktove zbernicove cykly sa kvoli WAITu predlzia na na 4T. Napriklad *LD A,cislo* tym padom trva 8T, pretoze 4T trva nacitanie operacneho kodu (ako ma), ale nasledujuce nacitanie dalsieho bajtu, co by malo trvat 3T, sa spomali na 4T. Takze pokial je nutne presne nacavanie (ako napr. v seriovych rutinkach) tak je najistejsie si to prakticky vyskusat a zmerat (napr. seriove vysielanie osciloskopom).


Nahoru
 Profil  
 
PříspěvekNapsal: 09.11.2019, 20:43 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 902
Has thanked: 51 times
Been thanked: 230 times
zxcygnus píše:
Mezitím viz na webu, co a jak funguje. Těch 115200bps se stop bitem trvajícím cca 2.7 bitu je fakt síla :)

Tak som Ti to skratil na presne 2 stopbity. Kvoli casovaniu som bol donuteny pouzit moju oblubenu instrukciu LD A, I na 9T, ale v poznamke je aj alternativny sposob, ako dostat stopbit do A za 9T.
M1

Kód:
T115200:        di                              ;       nepřerušovat
                ld      bc,65533                ;       zvol registr 7 v AY
                ld      a,7
                out     (c),a
                ld      bc,49149                ;       vypni zvuk a nastav I/O port jako výstup (bit 6 v log. 1)
                ld      a,255
                ld      i, a                    ;       alt 1!!!! priprav stop bit
                out     (c),a
                ld      bc,65533                ;        zvol registr 14 v AY
                ld      a,14
                out     (c),a
; velkost suboru a pointer
                ld      hl,DATA                 ;       adresa odkud
                ld      de,DATA_LENGTH          ;       počet bytů k přenesení
; priprava na odvysielanie
                exx
                ld      bc,49149                ;       adresa datového portu do sekundárního BC'
;               ld      a,11111111b             ;       alt2!!! stopbit
                exx
                ld      bc,49149                ;       adresa datového portu taky do BC
TRANSIEV_LOOP:  ld      a,(hl)                  ; 7T    vezmi byte,který má být vyslán
                exx                             ; 4T    sekundární sada registrů s připraveným BC, abych neměnil důležité HL
                ld      d,a                     ; 4T    a uschovej A do D (na HL' nesahat, abych ho nemusel ukládat při návratu do BASICu)
; start bit
                ld      a,11110111b             ; 7T    start bit
                out     (c),a                   ; 12T   zapiš na port (vždy log. 0 = start bit)

                rrc     d                       ; 8T    rotuj L, bit 0 na pozici bitu 3 (LSB)
                sbc     a, a                    ; 4T    priprav datovy bit
                or      11110111b               ; 7T    vymaskuj, vše kromě významného bitu nastav na 1
                out     (c),a                   ; 12T   zapiš na port, celkem 31T od předchozího out (c),a

                rrc     d                       ; 8T    bit 1 na pozici bitu 3
                sbc     a, a                    ; 4T    priprav datovy bit
                or      11110111b               ; 7T    vymaskuj
                out     (c),a                   ; 12T   zapiš na port
                 
                rrc     d                       ; 8T    bit 2
                sbc     a, a                    ; 4T    priprav datovy bit
                or      11110111b               ; 7T    vymaskuj
                out     (c),a                   ; 12T   zapiš na port
                 
                rrc     d                       ; 8T    bit 3
                sbc     a, a                    ; 4T    priprav datovy bit
                or      11110111b               ; 7T    vymaskuj
                out     (c),a                   ; 12T   zapiš na port
                 
                rrc     d                       ; 8T    bit 4
                sbc     a, a                    ; 4T    priprav datovy bit
                or      11110111b               ; 7T    vymaskuj
                out     (c),a                   ; 12T   zapiš na port
                 
                rrc     d                       ; 8T    bit 5
                sbc     a, a                    ; 4T    priprav datovy bit
                or      11110111b               ; 7T    vymaskuj
                out     (c),a                   ; 12T   zapiš na port
                 
                rrc     d                       ; 8T    bit 6
                sbc     a, a                    ; 4T    priprav datovy bit
                or      11110111b               ; 7T    vymaskuj
                out     (c),a                   ; 12T   zapiš na port

                rrc     d                       ; 8T    bit 7
                sbc     a, a                    ; 4T    priprav datovy bit
                or      11110111b               ; 7T    vymaskuj
                out     (c),a                   ; 12    zapiš na port, poslední bit (MSB)

;               ld      a,e                     ; 4T    nastav stop bit alt2!!!!
                exx                             ; 4T    vrať primární sadu registrů s adresou v HL a délkou v DE
                inc     hl                      ; 6T    další adresa v RAM
                ld      a,i                     ; 9T    nastav stop bit alt1!!!!
;               ret     z                       ; 5T    jen zpoždění alt2!!!!
                out     (c),a                   ; 12T   zapiš na port, zde začíná stop bit

                nop                             ; 4T    zpoždění
                dec     de                      ; 6T    o byte ke zpracování míň
                ld      a,d                     ; 4T    testuj, jestli byly zpracovány všechny
                or      e                       ; 4T
                jp      nz,TRANSIEV_LOOP        ; 10T   a opakuj, dokud nejsou přenesena všechna data

; opakování nastane zpoždění 12+4+6+4+4+10 = 40T
; plus na začátku cyklu dalších 7+4+4+7 = 22T
; celkem 62T délka stop bitu při přenosu sekvence, tj. 2 délky trvání jednoho bitu

                ei
                ret

; a to je vse, pratele!

DATA            db      "Hello RS232 world! ZX Spectrum 128 is sending data."
                db      13,10           ; CR, LF


Nahoru
 Profil  
 
PříspěvekNapsal: 11.11.2019, 12:09 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2344
Has thanked: 303 times
Been thanked: 640 times
Včera jsem na to opět našel chvilku a maličko přidal https://cygnus.speccy.cz/popis_zx-spect ... _rs232.php

Přibyl pokus o řízení toku směrem ze ZX Spectra https://cygnus.speccy.cz/download/zx128 ... s_cts.html

Problém je, že přepínání směru I/O portu, když ho dělám tak, jak říká datasheet AY, je pomalé. Zvolit registr 7, zapsat hodnotu, zvolit registr 14 a s ním pracovat... moc kroků.

Směrem ven ze ZX Spectra se to ještě dá, pouze to prodlouží stop bit. Opačně to je problém, protože nestihnu zahýbat RTS a pak včas načíst start bit přicházejících dat.

Přidal jsem i kousek kódu z RS232 ROM Paula Farrowa https://cygnus.speccy.cz/download/zx128 ... ntrol.html

A tam moc nechápu, jak to přepínání vlastně provádí. Určitě budu muset ještě jednou projít komplet disassemblovanou ROM (tu část, kterou se liší od ZX48k ROM), jestli něco nepřehlížím. Našel jsem tam jen podprogram, který jsem pojmenoval SET_AY_PORTS, ten zvolí registr 7, nastaví I/O port AY jako výstup, zvolí registr 14 a zapíše na něj 255.

No a pak jsou rovnou ty dvě rutiny, které vysílají/přijímají data. Zjevně v tom je nějaký trik, kterým si přepínání směrů zjednodušil a zrychlil.

Může to být třeba tak, že když je I/O port jako výstup a zapíše se do něj 255, tak jsou všechny výstupní tranzistory otevřené (netahají výstup na GND) a uplatní se jen pullupy? To by nemuselo se čtením kolidovat.

Nutno zkoumat na reálném hardwaru.

(vím o překlepu, vím o instrukci navíc, kde je zbytečná...)

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 11.11.2019, 13:19 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3663
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 797 times
zxcygnus píše:
Problém je, že přepínání směru I/O portu, když ho dělám tak, jak říká datasheet AY, je pomalé. Zvolit registr 7, zapsat hodnotu, zvolit registr 14 a s ním pracovat... moc kroků.
Prepinat smer vobec nie je treba, maj ho trvale zapnuty ako vystupny a na vstupne piny zapis hodnotu 1. Vtedy cez ne mozes normalne citat stavy prichadzajuce z vonku.
zxcygnus píše:
Může to být třeba tak, že když je I/O port jako výstup a zapíše se do něj 255, tak jsou všechny výstupní tranzistory otevřené (netahají výstup na GND) a uplatní se jen pullupy? To by nemuselo se čtením kolidovat.
Ano, presne takto by to malo fungovat.


Nahoru
 Profil  
 
PříspěvekNapsal: 11.11.2019, 14:56 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 902
Has thanked: 51 times
Been thanked: 230 times
zxcygnus píše:
Přidal jsem i kousek kódu z RS232 ROM Paula Farrowa
A tam moc nechápu, jak to přepínání vlastně provádí.



Ak to spravne chapem, pri prijmani bajtu povoli prenos CTS, 31x3-krat cita port, ci neprisiel startbit, ak nepride, zakaze prenos CTS ale pre istotu este 31x3-krat cita port. Ak prisiel start bit, zakaze CTS a nacita 8 bitov a nastavi CF, inak je CF resetovany.

M.


Nahoru
 Profil  
 
PříspěvekNapsal: 12.11.2019, 00:10 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2344
Has thanked: 303 times
Been thanked: 640 times
Busy píše:
zxcygnus píše:
Může to být třeba tak, že když je I/O port jako výstup a zapíše se do něj 255, tak jsou všechny výstupní tranzistory otevřené (netahají výstup na GND) a uplatní se jen pullupy? To by nemuselo se čtením kolidovat.
Ano, presne takto by to malo fungovat.
Tohle přesně jsem potřeboval potvrdit, protože mám podezření, že to na DG192 takto nefunguje, protože to je jedna z věcí, které jsem zkusil. Ale k tomu se vrátím později, možná jsem se jen spletl, protože jsem nevěděl, co čekat.

S šedou amstradí +2 to ale funguje. Zkusil jsem napsat kód, který dělá cca 18μs log. 0 na RTS směrem do PC a PC poslušně pošle přesně jeden byte ze svého bufferu. A to dokonce s USB převodníkem (konkrétně ID 10c4:ea60 Cygnal Integrated Products, Inc. CP2102/CP2109 UART Bridge Controller [CP210x family]).

Jdu zkoumat dál.


Přílohy:
2019-11-11_prenos_do_zx_spectra_z_PC_reakce_na_zmenu_RTS_jeden_byte_do_fora.png
2019-11-11_prenos_do_zx_spectra_z_PC_reakce_na_zmenu_RTS_jeden_byte_do_fora.png [ 22.31 KiB | Zobrazeno 6890 krát ]

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS
Nahoru
 Profil  
 
PříspěvekNapsal: 12.11.2019, 07:46 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3663
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 797 times
zxcygnus píše:
Busy píše:
zxcygnus píše:
Může to být třeba tak, že když je I/O port jako výstup a zapíše se do něj 255, tak jsou všechny výstupní tranzistory otevřené (netahají výstup na GND) a uplatní se jen pullupy? To by nemuselo se čtením kolidovat.
Ano, presne takto by to malo fungovat.
Tohle přesně jsem potřeboval potvrdit, protože mám podezření, že to na DG192 takto nefunguje
DG192 ma AY-3-8912 a port A z nej zapojeny presne tak isto ako ZX 128 ?


Nahoru
 Profil  
 
PříspěvekNapsal: 12.11.2019, 11:20 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2344
Has thanked: 303 times
Been thanked: 640 times
Busy píše:
zxcygnus píše:
Tohle přesně jsem potřeboval potvrdit, protože mám podezření, že to na DG192 takto nefunguje
DG192 ma AY-3-8912 a port A z nej zapojeny presne tak isto ako ZX 128 ?
Má připojený MAX232 na stejné bity, jako je v ZXS128k skrz MC1488/1489 zapojený konektor RS232/MIDI. Bity odpovídající KEYPAD zapojené nemá.

Viz popis na mém webu (víc na začátku) https://cygnus.speccy.cz/popis_zx-spect ... _rs232.php Pod titulkem "RS232 z Didaktiku Gama 192k na DSUB-9", je tam i kousek schéma.

Výstupy a vstupy MAX232 na RS232 straně zapojené neměl. Resp. podivně, žádné RxD a TxD, ale CH1, CH2 IN/OUT a tak jsem si je po vzoru ZXS128k zapojil na DSUB 9. Potud snad ok.

Problém je, že zatímco v k MC1489 se dá dohledat vnitřní zapojení ze kterého je vidět, že má na TTL straně výstup s otevřeným kolektorem (skoro, je tam pullup), což je přesně to, co tam je potřeba. Tak u MAX232 si tím nejsem jistý.

Nefungovalo mi to napoprvé, ani napodruhé, možná jsem udělal hloupou chybu, možná se to chová odlišně, proto jsem to začal důkladně zkoumat na 128k +2, abych si byl nejprve zcela jistý, že vím, jak se I/O port AY v kombinaci s RS232 převodníky úrovní má chovat.

Ještě k tomu předchozímu pokusu - zapomněl jsem dodat, že ZX Spectrum nejenom posílalo log. 0 do RTS, ale vzápětí četlo stav RxD a zapisovalo do VRAM.

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 12.11.2019, 13:15 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 902
Has thanked: 51 times
Been thanked: 230 times
zxcygnus píše:
Problém je, že zatímco v k MC1489 se dá dohledat vnitřní zapojení ze kterého je vidět, že má na TTL straně výstup s otevřeným kolektorem (skoro, je tam pullup), což je přesně to, co tam je potřeba. Tak u MAX232 si tím nejsem jistý.

Tento obrazok z datasheetu by do toho mohol vniest trochu svetla. Ta dioda na vystupe prijmaca nepriamo ukazuje na to, ze vo vnutri je sink aj source driver.
Co by Ti aj tak nemalo vadit, ak na AY zapises na port log. H.
M1


Přílohy:
max232.GIF
max232.GIF [ 5.61 KiB | Zobrazeno 6801 krát ]
Nahoru
 Profil  
 
PříspěvekNapsal: 12.11.2019, 14:15 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3676
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
Ta dioda nic neříká :)
Zjistíš to snadno, změřením zkratového proudu H na výstupu. Když bude pod 5mA, tak je tam jen pracovní pullup.

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


Nahoru
 Profil  
 
PříspěvekNapsal: 12.11.2019, 14:19 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3676
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
;)

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


Nahoru
 Profil  
 
PříspěvekNapsal: 16.11.2019, 14:00 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2344
Has thanked: 303 times
Been thanked: 640 times
Tak už mi funguje i přenos do ZX Spectra
https://youtu.be/NwtOEqhA0iQ

Ještě pár experimentů, měření, přidat zdrojáky na web, zkusit, jestli se detekce zahájeného přenosu dá, nebo nedá stíhat... Pro tuto chvíli přenáším obrázek bez jakéhokoli řízení toku dat. Prostě na PC pošlu data a na ZXS, které musí být připravené předem, data přijmu. Důležité je, že jsou nastavené dva stop bity, to dává potřebných 61T navíc, aby se přenos stíhal zacyklit a data ukládat do RAM.

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 16.11.2019, 17:30 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2089
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 327 times
Na tom videu sa to prenesie do pamäte, a potom až zobrazí? Krajší efekt a demonštrácia rýchlosti by bola, keby sa to nahrávalo priamo na obrazovku.

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
PříspěvekNapsal: 16.11.2019, 21:57 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 902
Has thanked: 51 times
Been thanked: 230 times
zxcygnus píše:
Ještě pár experimentů, měření, přidat zdrojáky na web, zkusit, jestli se detekce zahájeného přenosu dá, nebo nedá stíhat... Pro tuto chvíli přenáším obrázek bez jakéhokoli řízení toku dat. Prostě na PC pošlu data a na ZXS, které musí být připravené předem, data přijmu. Důležité je, že jsou nastavené dva stop bity, to dává potřebných 61T navíc, aby se přenos stíhal zacyklit a data ukládat do RAM.


To sa musí vojsť do jedného stop bitu, inak platím pivo :dch:
Pošli mi ten zdroják z videa, zoptimalizujem na 1 stop bit. Vidím tam ešte veľké rezervy :-)
M.


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ů: 67 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5  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 19 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