;==============================================================================
;  HLAVNI RUTINA MPRINT2, KTERA ZARIZUJE VYKRESLENI 1 ZNAKU NA OBRAZOVKU
;==============================================================================
; VSTUP	- znak, ktery ma byt vytisknut v registru A (pozor na znak 22)
; VYSTUP- vytisknuty znak na obrazovce, pripadne zmenene parametry rutiny

MPRINT2	push	hl		; uloz HL, nutno zachovat ! HL se totiz skoro
				; vzdy pouziva ve smyckach pro vypis retezce
	jp	MP_ZNAK		; rovnou vypis znak, bez dalsi kontroly

MPRINT	push	hl		; uloz HL, nutne - viz o par radek drive
	cp	13		; testuj neni-li znak 13 = konec radku (EOL)
	jp	z,MPENTER	; jestli je 13, uprav tiskovou pozici
	cp	22		; testuj neni-li znak 22 = nova pozice (AT)
	jp	nz,MP_ZNAK	; neni-li skoc rovnou na vypis znaku
MP_AT	pop	hl		; obnov ulozene HL (ukazuje na retezec)
	inc	hl		; a precti znak nasledujici po znaku 22
	ld	a,(hl)
	ld	(MP_POSY),a	; uloz cislo radku (22,y=radek,x=sloupec)
	ld	b,a		; odloz radek do registru B
	inc	hl		; a precti cislo sloupce (2. znak po 22)
	ld	a,(hl)
	ld	(MP_POSX),a	; uloz cislo sloupce
	ld	c,a		; odloz sloupec do reg. C
	push	hl		; znova uloz, ted uz zmeneny registr HL
				; nasleduje vypocet nove adresy (tiskove pozice) ve VRAM
	ld	a,b		; vezmi odlozene cislo radku
	rrca			; a 3x rotaci vpravo (dolni 3 bity na misto hornich)
	rrca
	rrca
 	and	11100000b		; ponech jen horni 3 bity
	ld	l,a		; vypoctene cislo uloz do reg. L (mame dolni byte)
	ld	a,b		; vezmi znovu cislo radku
	and	00011000b		; ponech 3. a 4. bit
	or	01000000b		; a pricti 64
	ld	h,a		; tim jsme vytvorili horni byte adresy radku
	ld	(MP_LAST),hl	; uloz kompletni adresu radku
	ld	a,c		; vezmi odlozene cislo sloupce
	rra			; a vydel ho 2 (2 znaky na 1 byte ve VRAM)
	and	01111111b		; ponech dolnich 7 bitu (pro jistotu)
	ld	b,0		; radek a sloupec uz nebudou potreba, takze
	ld	c,a		; do BC vlozime poradi bytu od zacatku radku
	add	hl,bc		; a pricteme ho k HL, cimz ziskame adresu znaku
	ld	(MP_VRAM),hl	; ulozime do promenne
	pop	hl		; a muzeme obnovit HL, pri dalsim zavolani
	ret			; bude vyrobena adresa pouzita k vypisu znaku

MP_NONS	ld	a,'?'		; pokud znak nema smysl nahrad ho znakem ?
MP_ZNAK	cp	32		; testuj jestli kod znaku neni mensi nez 32
	jp	c,MP_NONS		; a pripadne ho nahrad otaznikem
	ld	l,a		; do HL vezmi kod znaku
	ld	h,0
	add	hl,hl		; a vynasob ho 8 - pocet bytu predlohy znaku
	add	hl,hl
	add	hl,hl
	ld	de,MP_FONT-256	; pricti k HL adresu fontu
	add	hl,de		; takze ted je v HL adresa predlohy znaku
	ld	de,(MP_VRAM)	; a do DE nactu adresu znaku ve VRAM

	ld	a,(MP_POSX)	; otestuj jestli se jedna o lichy, nebo sudy
	and	1		; sloupec - tj. leva/prava pulka bytu
	jp	z,MPSUDY		; bit 0 = 0 => znak delitelny 2

MPLICHY	ld	a,(hl)		; cti predlohu znaku
	and	00001111b		; a z predlohy ponech jen pravou pulku
	ld	c,a		; zatim uloz do C
	ld	a,(de)		; nacti byte z obrazovky
	and	11110000b		; znej ponech jen tu pulku na niz nepatri znak
	or	c		; spoj se znakem
	ld	(de),a		; a uloz zpatky do obrazovky
	inc	d		; posun se o 1 mikroradek dolu (DE=DE+256)
	inc	hl		; posun se na dalsi byte predlohy
	ld	a,(hl)		; vse opakuj jeste 7x v rozvinutem cyklu
	and	00001111b		; rozvinuti cyklu ma za nasledek mirne
	ld	c,a		; zvyseni rychlosti za cenu vetsi delky kodu
	ld	a,(de)
	and	11110000b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	00001111b
	ld	c,a
	ld	a,(de)
	and	11110000b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	00001111b
	ld	c,a
	ld	a,(de)
	and	11110000b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	00001111b
	ld	c,a
	ld	a,(de)
	and	11110000b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	00001111b
	ld	c,a
	ld	a,(de)
	and	11110000b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	00001111b
	ld	c,a
	ld	a,(de)
	and	11110000b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	00001111b
	ld	c,a
	ld	a,(de)
	and	11110000b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(MP_POSX)	; v tuto chvili je dokonceno kresleni znaku
	inc	a		; je cas vypocitat pozici dalsiho znaku na r.
	ld	(MP_POSX),a	; uloz zpatky prepocitanou X-ovou pozici znaku
	ld	hl,(MP_VRAM)	; dalsi znak bude SUDY, nutno zmenit adresu
	inc	hl
	ld	(MP_VRAM),hl
MPRETL2	cp	64		; po zmene adresy mohlo dojit k prekroceni
	jp	z,MPENTER	; praveho okraje - proved prip. korekci
	pop	hl
	ret			; vrat se - konec rutiny MPRINT

MPSUDY	ld	a,(hl)
	and	11110000b
	ld	c,a
	ld	a,(de)
	and	00001111b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	11110000b
	ld	c,a
	ld	a,(de)
	and	00001111b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	11110000b
	ld	c,a
	ld	a,(de)
	and	00001111b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	11110000b
	ld	c,a
	ld	a,(de)
	and	00001111b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	11110000b
	ld	c,a
	ld	a,(de)
	and	00001111b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	11110000b
	ld	c,a
	ld	a,(de)
	and	00001111b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	11110000b
	ld	c,a
	ld	a,(de)
	and	00001111b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(hl)
	and	11110000b
	ld	c,a
	ld	a,(de)
	and	00001111b
	or	c
	ld	(de),a
	inc	d
	inc	hl
	ld	a,(MP_POSX)	; spocitej novou pozici - sloupec
	inc	a
	ld	(MP_POSX),a	; krome jineho se ted znak stal lichym
	pop	hl		; znak se stal LICHYm, nemohlo tedy dojit
	ret			; ani ke zmene adresy natoz neceho jineho

MPENTER	xor	a		; skok na zacatek nasledujiciho radku
	ld	(MP_POSX),a	; nastav X-ovou pozici na 0
	ld	a,(MP_POSY)	; precti cislo radku
	cp	23		; otestuj neni-li nahodou uplne nejspodnejsi
	jr	nz,MPENTE2	; pokud ne odskoc
	ld	hl,(MP_LAST)	; jinak vezmi adresu zacatku tohoto radku (23)
	ld	(MP_VRAM),hl	; a pouzij ji pro pristi znak
	pop	hl
	ret			; vrat se - konec rutiny MPRINT

MPENTE2	inc	a		; zvys cislo radku
	ld	(MP_POSY),a	; a uloz ho
	ld	hl,(MP_LAST)	; vezmi adresu zacatku posledniho radku
	ld	a,l		; a spocitej adresu o 8 bodu niz
	add	a,32		; (obdoba rutiny DOWNCH)
	ld	l,a
	jr	nc,MPENTE3
	ld	a,h
	add	a,8
	ld	h,a
	cp	88
	jr	nz,MPENTE3
	ld	h,64
MPENTE3 ld	(MP_LAST),hl	; adresu zacatku radku uloz (2x)
	ld	(MP_VRAM),hl
	pop	hl
	ret  			; vrat se

;==============================================================================
;  PROMENNE NEZBYTNE POTREBNE K FUNKCI TISKOVE RUTINY
;==============================================================================
MP_POSX	db	0	; X-ova souradnice znaku - sloupec
MP_POSY	db	0	; Y-ova souradnice znaku - radek
MP_LAST	dw	16384	; adresa znaku, ktery je uplne na zacatku aktual. radku
MP_VRAM	dw	16384	; adresa znaku, ktery je momentalne na rade (bude se
			; tiskout)

MP_FONT	binclude	../libs/font_mprint_iso8859-2_4x8.bin	; font, mozno nahradit cp1250.bin, ascii.bin
			; TODO: vyrobit font v ISO8859-2 a zahodit ten v CP1250 ...

;==============================================================================