;==================================================================================================
; odvysielanie bajtu z reg. A na seriovu linku
;
; 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í
		ld	bc,49149		;	adresa datového portu

; odsud se bude opakovat, násl. instrukce prodlouží stop bit

TRANSMIT_LOOP	push	hl			; 10T	zapamatuj HL
		ld	a,(hl)			; 7T	vezmi byte,který má být vyslán
		rrca				; 4T 	předrotuj data 4x vpravo z bitu 0 do bitu 4
		rrca				; 4T
		rrca				; 4T
		rrca				; 4T
		ld	l,a			; 4T	a uschovej A do L
; start bit
		ld	a,11110111b		; 7T	start bit
		out	(c),a			; 12T	zapiš na port (vždy log. 0 = start bit)

		rrc	l			; 8T	rotuj L, bit 0 na pozici bitu 3 (LSB)
		ld	a,11110111b		; 7T	priprav masku
		or	l	 		; 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	l			; 8T	bit 1 na pozici bitu 3
		ld	a,11110111b		; 7T
		or	l	 		; 4T	vymaskuj
		out	(c),a			; 12T	zapiš na port
		 
		rrc	l			; 8T	bit 2
		ld	a,11110111b		; 7T
		or	l	 		; 4T	vymaskuj
		out	(c),a			; 12T	zapiš na port
		 
		rrc	l			; 8T	bit 3
		ld	a,11110111b		; 7T
		or	l	 		; 4T	vymaskuj
		out	(c),a			; 12T	zapiš na port
		 
		rrc	l			; 8T	bit 4
		ld	a,11110111b		; 7T
		or	l	 		; 4T	vymaskuj
		out	(c),a			; 12T	zapiš na port
		 
		rrc	l			; 8T	bit 5
		ld	a,11110111b		; 7T
		or	l	 		; 4T	vymaskuj
		out	(c),a			; 12T	zapiš na port
		 
		rrc	l			; 8T	bit 6
		ld	a,11110111b		; 7T
		or	l	 		; 4T	vymaskuj
		out	(c),a			; 12T	zapiš na port

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

		rrc	l			; 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

		pop	hl			; 11T	obnov registr HL
		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+11+6+6+4+4+10 = 53T
; plus na začátku cyklu dalších 44T
; celkem 97T délka stop bitu při přenosu sekvence, tj. asi 3.1 délky trvání jednoho bitu (3 stop bity)

		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