;  вывод строки текста через порт B на 8 светодиодов по столбцам

.Include "tn2313def.inc"
.Def rmp = R16 				; регистр для временного хранения
	ldi	r16, RAMEND		; устанавливаем указатель стека на конец ОЗУ
	out	SPL,r16

	ldi rmp,0xFF			; настраиваем все линии порта B на вывод данных
	out DDRB,rmp
Begin:	ldi	zh, high(2*Text)	; указатель на строку текста
	ldi	zl, low(2*Text)

d:	rcall	stroke			; выводим 5 столбцов изображения символа
	inc	zl			; считываем следующий символ
	lpm				; в регистр r0
	tst	r0			; конец строки?
	brne	d			; нет - повторяем
	rjmp	begin			; иначе - в начало строки

Stroke:	lpm				; код символа -> r0
	push Zh				; сохраняем регистр Z в стеке
	push Zl
		mov	r17, r0		; временно храним r0 в r17
		andi	r17, 0xBF
		cpi	r17,0x80	; буква или цифра?
		brsh	let		; буква - на метку let
; если цифра или спецсимвол, выполняем следующие 4 строки
		subi	r17,0x20	; коды меньше 20h игнорируем
		ldi	ZH,HIGH(2*SymTable) ; указатель на знакогенератор цифр
		ldi	ZL,LOW(2*SymTable)
		rjmp	m5
; если буква - выполняем следующие 3 строки
	let:	subi	r17,0x80
		ldi	ZH,HIGH(2*SymTable2) ; указатель на знакогенератор букв
		ldi	ZL,LOW(2*SymTable2)
	m5:	mov	r1,r17
		lsl	r1		; умножаем r1 на 5
		lsl	r1
		add	r1,r17
		add	Zl, r1		; точка входа в таблицу
		ldi	rmp, 5		; счетчик выводимых байт равен 5
	s3:	lpm			; читаем в r0 первый байт изображения символа
; команда com меняет цвет символов/фона на обратный, если необходимо
		com	r0		; инвертируем байт 0->1, 1->0
		out	portB, r0	; выводим биты на светодиоды
		rcall	Dlay		; задержка
		inc	ZL		; следующий байт из 5 стобцов
		dec	rmp		; все столбцы выведены?
		brne	s3		; нет - выводим дальше
	pop	Zl			; восстанавливаем регистр Z из стека
	pop	Zh
		clr	r0		; промежуток между символами (пустой байт)
; команда com меняет цвет символов/фона на обратный, если необходимо
		com	r0		; инвертируем байт 0->1, 1->0
		out	portB, R0	; выводим в порт B
		rcall	Dlay		; задержка
		ret			; выход из подпрограммы
; подпрограмма задержки r19 - старший байт, r20 - младший (более тонкая настройка)
Dlay:
	ldi	r19, 1			; грубая подгонка скорости
l1:	ldi    R20, 200			; точная настройка скорости вывода
D_Loop:	dec    R20
	brne   D_Loop
	dec	r19
	brne	l1
	ret

Symtable:	; знакогенератор спецсимволов и цифр
.db 0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x5F,0x06,0x00	; 20 21
.db 0x03,0x02,0x00,0x03,0x02, 0x24,0x7E,0x24,0x7E,0x24	; 22 23
.db 0x24,0x4A,0xFF,0x52,0x24, 0x26,0x16,0x08,0x34,0x32	; 24 25
.db 0x50,0x22,0x55,0x5A,0x20, 0x00,0x00,0x01,0x03,0x00	; 26 27
.db 0x00,0x1C,0x22,0x41,0x00, 0x00,0x00,0x41,0x22,0x1C	; 28 29
.db 0x2A,0x14,0x7F,0x14,0x2A, 0x08,0x08,0x3E,0x08,0x08	; 2A 2B
.db 0x00,0x00,0xE0,0x60,0x00, 0x08,0x08,0x08,0x08,0x08	; 2C 2D
.db 0x00,0x00,0x60,0x60,0x00, 0x60,0x30,0x18,0x0C,0x06	; 2E 2F

.db 0x3E,0x41,0x41,0x41,0x3E, 0x00,0x00,0x42,0x7F,0x40	; 30 31
.db 0x46,0x61,0x51,0x4A,0x44, 0x22,0x41,0x49,0x49,0x36	; 32 33
.db 0x10,0x18,0x14,0x12,0x7F, 0x27,0x45,0x45,0x45,0x38	; 34 35
.db 0x3E,0x49,0x49,0x49,0x32, 0x41,0x21,0x11,0x09,0x07	; 36 37
.db 0x36,0x49,0x49,0x49,0x36, 0x26,0x49,0x49,0x49,0x3E	; 38 39
.db 0x00,0x00,0x66,0x66,0x00, 0x00,0x00,0x66,0xE6,0x00	; 3A 3B
.db 0x08,0x14,0x22,0x41,0x00, 0x14,0x14,0x14,0x14,0x14	; 3C 3D
.db 0x00,0x41,0x22,0x14,0x08, 0x02,0x01,0xB1,0x09,0x06	; 3E 3F

Symtable2:	; знакогенератор прописных букв
.db 0x60,0x18,0x14,0x12,0x7F, 0x7F,0x49,0x49,0x49,0x30  ; 80=А 81=Б
.db 0x7F,0x49,0x49,0x49,0x36, 0x7F,0x01,0x01,0x01,0x01  ; В Г
.db 0xC0,0x7C,0x42,0x7F,0xC0, 0x7F,0x49,0x49,0x49,0x41  ; Д Е
.db 0x63,0x14,0x3E,0x14,0x63, 0x22,0x41,0x49,0x49,0x36  ; Ж З
.db 0x7F,0x20,0x10,0x08,0x7F, 0x7F,0x20,0x11,0x08,0x7F  ; И Й
.db 0x7F,0x08,0x14,0x22,0x41, 0x40,0x7C,0x02,0x01,0x7F  ; К Л
.db 0x7F,0x06,0x08,0x06,0x7F, 0x7F,0x08,0x08,0x08,0x7F  ; М Н
.db 0x3E,0x41,0x41,0x41,0x3E, 0x7F,0x01,0x01,0x01,0x7F  ; О П 
.db 0x7F,0x09,0x09,0x09,0x06, 0x3E,0x41,0x41,0x41,0x22  ; Р С
.db 0x01,0x01,0x7F,0x01,0x01, 0x23,0x44,0x48,0x38,0x07  ; Т У
.db 0x0E,0x11,0x7F,0x11,0x0E, 0x41,0x32,0x0C,0x32,0x41  ; Ф Х
.db 0x7F,0x40,0x40,0x7F,0xC0, 0x07,0x08,0x08,0x08,0x7F  ; Ц Ч
.db 0x7F,0x40,0x7E,0x40,0x7F, 0x7F,0x40,0x7E,0x40,0xDF  ; Ш Щ
.db 0x01,0x7F,0x44,0x44,0x78, 0x7F,0x44,0x28,0x10,0x7F  ; Ь Ъ
.db 0x7F,0x44,0x44,0x44,0x38, 0x22,0x41,0x49,0x2A,0x3E  ; Э Ю
.db 0x7F,0x08,0x3E,0x41,0x3E, 0x46,0x29,0x19,0x09,0x7F  ; Ю Я

.db "$$"
Text: .Db "С НОВЫМ 2009 ГОДОМ! "
.db 0, 0

