; оригинал для attiny13 9.6 MHz
;;; Soft UART -- Побитно передаем байт из TXB
; на линии всегда 1. стартовый бит = 0. потом 8 бит данных, стоп-бит = 1.
; данные инверсные - 0=1, 1=0. хотя в этом алгоритме -- прямые
; похоже, что инверсия только на физ. уровне. т.е. у нас -- прямые...
; проверить в протеусе!!!
SoftUART:
	PUSHF
	push	tmp1

	cbi	PortB,TX	; стартовый бит
	ldi	tmp1,8		; 8 бит данных

LOSL:	push	temp		; 2 | 115 тактов для 38400, 73 для 57600 (ошибка -0.4%)
	ldi	temp,11		; 1 | 27 для 38400, 11 для 57600, 6 для 115200
LOS0:	nop			; 1 \ для 38400 и 115200 - 1 nop
	nop			; 1 | для 57600 - 3 nop-а
	nop			; 1 | - осталось 108/66 тактов
	dec	temp		; 1 |
	brne	LOS0		; 2 / 1
	pop	temp		; 2 |
;	nop			; 1 | Для 115200
	nop			; 1 | --- конец цикла задержки. вход и выход - 7 тактов

	lsr	TXB		; 1	мл бит вперёд
	brcc	LOUT0		; 1/2	если C не установлен - выводим 0
	sbi	PortB,TX	; 2	вывели 1
	rjmp	LOEC		; 2	конец цикла
LOUT0:	cbi	PortB,TX	; 2	вывели 0
	nop			; 1	для выравнивания тактов
LOEC:	nop			; 1	для круглого счёта
	dec	tmp1		; 1
	brne	LOSL            ; 2, 1 при выходе
; 10 тактов == 2,083 мкс на 1 бит, 9 тактов == 1,875 мкс на 1 бит
; 83.3 - 57600; 125 - 38400; 250 - 19200; 500 - 9600; 41.6 - 115200
; на скорости 57600 можно успеть передать 28 байт за время 1-го прервания
; ~56 байт, 42-10=32 такта, 32-... (ошибка +1%)
	sbi	PortB,TX	; стоповый бит

	pop	tmp1
	POPF
	ret
