;================================================================================================== ; RS232 - transmitting through AY-3-8912 without data flow control ; ; 57600bps (17,3611μs) 61.57813T na ZX128k, 61T bude trvat 17.19811μs, chyba -0.9% (58146bps) ; 60.76389T na ZX48k, 61T bude trvat 17.42857μs, chyba +0,4% (57377bps) ;================================================================================================== cpu z80undoc org 32768 ; musí běžet v rychlé RAM START di ; nesmí být zpomalováno a přerušováno 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 TRANSMIT_57600 ld bc,49149 ; 10T port AY-3-8912 ld h,8 ; 7T H poslouží jako počítadlo 8 bitů ld a,01010101b ; 7T data k odeslání do A ld l,a ; 4T zkopíruj data z A do L rrc l ; 8T 4x rotuj data vpravo (LSB na pozici bitu 3) rrc l ; 8T dvě rotace před outem, aby vyšly takty ; start bit ld a, 11110111b ; 7T maska out (c),a ; 12T zapiš na port rrc l ; 8T a dvě rotace ze 4 po outu rrc l ; 8T ; datové bity TRANSMIT_LOOP ld a,0 ; 7T zpoždění ld a,0 ; 7T zpoždění rrc l ; 8T další bit na pozici bitu 3 ld a,11110111b ; 7T připrav masku or l ; 4T přidej masku ; od začátku start bitu 12+8+8+7+7+8+7+4 = 61T ; od minulého bitu 12+4+12+7+7+8+7+4 = 61T out (c),a ; 12T zapiš na port dec h ; 4T počítadlo bitů jr nz,TRANSMIT_LOOP ; 12/7T opakuj ; stop bit ld a,(ix+0) ; 19T zpoždění inc hl ; 6T zpoždění inc hl ; 6T zpoždění ld a,11111111b ; 7T ; od posledního outu v cyklu 12+4+7+19+6+6+7 = 61T out (c),a ; 12T zapiš na port ei ; 4T ret ; 10T prodlouží trvání stop bitu