;==================================================================================================
; 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