;================================================================================================== ; RS232 - transmitting through AY-3-8912 without data flow control ; ; 115200bps (8,68056μs) 30.78906T na ZX128, 31T bude trvat 8,7400μs, chyba +0.7% (114416bps) ; 30,38194T na ZX48k, 31T bude trvat 8,8571μs, chyba +2,0% (112903bps) ;================================================================================================== cpu z80undoc org 32768 TRANSMIT_115200 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 out (c),a ld bc,65533 ; zvol registr 14 v AY ld a,14 out (c),a ld hl,DATA ; adresa odkud ld de,DATA_LENGTH ; počet bytů k přenesení exx ld bc,49149 ; adresa datového portu do sekundárního BC' exx ; odsud se bude opakovat, násl. instrukce prodlouží stop bit TRANSMIT_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 rrca ; 4T předrotuj data 4x vpravo z bitu 0 do bitu 4 rrca ; 4T rrca ; 4T rrca ; 4T 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) ld a,11110111b ; 7T priprav masku or d ; 4T 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 ld a,11110111b ; 7T or d ; 4T vymaskuj out (c),a ; 12T zapiš na port rrc d ; 8T bit 2 ld a,11110111b ; 7T or d ; 4T vymaskuj out (c),a ; 12T zapiš na port rrc d ; 8T bit 3 ld a,11110111b ; 7T or d ; 4T vymaskuj out (c),a ; 12T zapiš na port rrc d ; 8T bit 4 ld a,11110111b ; 7T or d ; 4T vymaskuj out (c),a ; 12T zapiš na port rrc d ; 8T bit 5 ld a,11110111b ; 7T or d ; 4T vymaskuj out (c),a ; 12T zapiš na port rrc d ; 8T bit 6 ld a,11110111b ; 7T or d ; 4T vymaskuj out (c),a ; 12T zapiš na port rrc d ; 8T bit 7 ld a,11110111b ; 7T or d ; 4T vymaskuj out (c),a ; 12 zapiš na port, poslední bit (MSB) rrc d ; 8T zpomalení nop ; 4T zpomalení ld a,11111111b ; 7T vymaskuj stop bit na 1 out (c),a ; 12T zapiš na port, zde začíná stop bit exx ; 4T vrať primární sadu registrů s adresou v HL a délkou v DE inc hl ; 6T další adresa v RAM 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,TRANSMIT_LOOP ; 10T a opakuj, dokud nejsou přenesena všechna data ; opakování nastane zpoždění 12+4+6+6+4+4+10 = 46T ; plus na začátku cyklu dalších 7+4+4+4+4+4+4+7 = 38T ; celkem 84T délka stop bitu při přenosu sekvence, tj. asi 2.7 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 DATA_LENGTH equ $ - DATA