;==============================================================================
;  MIKROPRINT 2 - modernizovaná verze pro plně osmibitové znaky (jako PRINT)
;==============================================================================
; VSTUP	- znak, který má být vytisknut v registru A
; VYSTUP	- vytisknutý znak (MPRINT), nebo řetězec (TEXTOUT) na obrazovce
;
;	TEXTOUT
;	0  - řídící znak označující konec řetězce
;	13 - řídící znak CR (carriage return) - konec řádku
;	22 - řídící znak za nímž MUSÍ následovat nejméně 2 byty určující souřadnice (řádek, sloupec)
;
;	MPRINT všechna omezení řídícími znaky ignoruje

TEXTOUT		ld	a,(hl)			; tisk řetězce ukončeného 0 (pokud není 0 jako parametr po 22)
		or	a
		ret	z			; při 0 ukonči výpis
		cp	13
		jr	z,MPRINT_CR		; Z = řídící znak 13, skoč na jeho zpracování
		cp	22
		jr	z,MPRINT_AT		; Z = řídící znak 22, skoč na jeho zpracování
		call	MPRINT
		inc	hl
		jr	TEXTOUT

TEXTOUTB	ld	a,(hl)			; tisk řetězce, délka v B, adresa textu v HL
		push	bc
		call	MPRINT			; nijak neřeší kód znaků! Nereaguje na 13, ani na 22...
		inc	hl
		pop	bc
		djnz	TEXTOUTB
		ret

MPRINT_CR	call	MPRN_NL0
		jr	TEXTOUT

MPRINT_AT	inc	hl			; a přečti znak následující po 22
		ld	c,(hl)			; číslo řádku do C (Y)
		inc	hl
		ld	b,(hl)			; číslo sloupce do B (X)
		ld	(MPRINT_XY),bc		; obojí ulož do odpovídající proměnné
		inc	hl			; HL musí ukazovat ZA 2. parametr, protože přeskočím inc ve smyčce
		push	hl			; změněný HL ulož
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; výpočet adresy ve VRAM podle čísla řádku a sloupce
		ld	a,c			; vezmi číslo řádku z C
		rrca				; a 3x rotací vpravo (dolní 3 bity na místo horních)
		rrca
		rrca
		and	11100000b		; ponech jen horní 3 bity
		ld	l,a			; vypočtené číslo ulož do reg. L (máme dolní byte)
		ld	a,c			; znovu vezmi číslo řádku z C
		and	00011000b		; ponech 3. a 4. bit
		or	01000000b		; a pričti 64
		ld	h,a			; a do H ulož výsledný horní byte adresy
		ld	(MPRINT_LNA),hl		; kompletní adresu uložím do proměnné (získali jsme adresu řádku)
		ld	a,b			; vezmi číslo sloupce z C
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; až dosud stejné pro PRINT i MPRINT
		rra				; A/2
		and	011111b			; ponech jen dolních 5 bitů (rozsah 0 až 31)
		ld	b,0			; řádek a sloupec nebudou potřeba, BC použiju ke sčítání
		ld	c,a			; v BC bude číslo sloupce
		add	hl,bc			; a přičtu ho k HL, takže v HL bude kompletní adresa znaku ve VRAM
		ld	(MPRINT_CHA),hl		; a uložit do proměnné (CHA = character address)
		pop	hl
		jp	TEXTOUT			; a je možno pokračovat ve výpisu řetězce

MPRINT		push	hl			; uloz HL kvuli smycce pro vypis retezce
		ld	l,a			; do HL kód znaku
		ld	h,0
		add	hl,hl			; HL *= 8
		add	hl,hl
		add	hl,hl			; v HL bude adresa znaku od začátku fontu pro znak 0
MPRN_FN0	ld	de,15360		; pričti k HL adresu fontu
		add	hl,de			; takže v HL je teď adresa předlohy znaku
		ex	de,hl			; adresu předlohy potřebuju v DE (takže registry přehodím)
		ld	hl,(MPRINT_CHA)		; a v HL potřebuju adresu znaku ve VRAM

		ld	a,(MPRINT_X)		; otestuj jestli se jedna o lichy, nebo sudy
		bit	0,a			; sloupec - tj. leva/prava pulka bytu
		jr	z,MPRN_SUDY		; bit 0 = 0 => znak delitelny 2

MPRN_LICHY	inc	a			; v A je Xova souradnice, spočítám novou Xovou souřadnici
		ld	(MPRINT_X),a		; krome jineho se ted znak stal lichym
		ld	a,(de)			; do A předlohu
		and	00001111b		; z předlohy jen levou půlku
		ld	c,a			; odložit do C
		ld	a,(hl)			; do A byte z obrazovky
		and	11110000b		; vymazat levou půlku, tam přijde znak
		or	c			; přidat připravený půlbajt znaku
		ld	(hl),a			; uložit do obrazovky
		inc	h			; o mikrořádek níž (nepřekročí znakovou pozici)
		inc	de			; další byte předlohy
		ld	a,(de)			; podruhé
		and	00001111b
		ld	c,a
		ld	a,(hl)
		and	11110000b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; potřetí
		and	00001111b
		ld	c,a
		ld	a,(hl)
		and	11110000b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; počtvrté
		and	00001111b
		ld	c,a
		ld	a,(hl)
		and	11110000b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; popáté
		and	00001111b
		ld	c,a
		ld	a,(hl)
		and	11110000b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; pošesté
		and	00001111b
		ld	c,a
		ld	a,(hl)
		and	11110000b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; posedmé
		and	00001111b
		ld	c,a
		ld	a,(hl)
		and	11110000b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; poosmé
		and	00001111b
		ld	c,a
		ld	a,(hl)
		and	11110000b
		or	c
		ld	(hl),a
		ld	hl,(MPRINT_CHA)		; další znak bude SUDÝ, nutno změnit adresu
		inc	hl
		ld	(MPRINT_CHA),hl
		ld	a,(MPRINT_X)		; otestuju jestli vypsaný znak nebyl na řádku poslední
		and	00111111b		; ponechám dolních 6 bitů
		jp	z,MPRN_NL		; Z => A = 64 - proveď korekci (nejspíš posun o řádek níž)
		pop	hl
		ret				; vrat se - konec rutiny MPRINT

MPRN_SUDY	inc	a			; v A je Xova souradnice, spočítám novou Xovou souřadnici
		ld	(MPRINT_X),a		; krome jineho se ted znak stal lichym
		ld	a,(de)			; do A předlohu
		and	11110000b		; z předlohy jen pravou půlku
		ld	c,a			; odložit do C
		ld	a,(hl)			; do A byte z obrazovky
		and	00001111b		; vymazat pravou půlku, tam přijde znak
		or	c			; přidat připravený půlbajt znaku
		ld	(hl),a			; uložit do obrazovky
		inc	h			; o mikrořádek níž (nepřekročí znakovou pozici)
		inc	de			; další byte předlohy
		ld	a,(de)			; podruhé
		and	11110000b
		ld	c,a
		ld	a,(hl)
		and	00001111b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; potřetí
		and	11110000b
		ld	c,a
		ld	a,(hl)
		and	00001111b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; počtvrté
		and	11110000b
		ld	c,a
		ld	a,(hl)
		and	00001111b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; popáté
		and	11110000b
		ld	c,a
		ld	a,(hl)
		and	00001111b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; pošesté
		and	11110000b
		ld	c,a
		ld	a,(hl)
		and	00001111b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; posedmé
		and	11110000b
		ld	c,a
		ld	a,(hl)
		and	00001111b
		or	c
		ld	(hl),a
		inc	h
		inc	de
		ld	a,(de)			; poosmé
		and	11110000b
		ld	c,a
		ld	a,(hl)
		and	00001111b
		or	c
		ld	(hl),a
		pop	hl			; znak se stal LICHYm, nemohlo tedy dojit
		ret				; ani ke zmene adresy natoz neceho jineho

MPRN_NL0	inc	hl			; HL ukazuje na kód 13, posunu ho za něj
		xor	a			; v A je teď nejpíš taky 13, potřebuju 0
		push	hl			; uložím adresu zpracovávaného znaku
MPRN_NL		ld	(MPRINT_X),a		; v A je 0, a tak to na začátku řádku má být
		ld	a,(MPRINT_Y)		; vezmi číslo řádku
		cp	23			; otestuj neni-li nahodou uplne nejspodnejsi
		jr	z,MPRN_LL		; Z = řádek je 23, skoč na zpracování NL na posledním řádku
		inc	a			; zvyš číslo řádku
		ld	(MPRINT_Y),a		; ulož ho
		ld	hl,(MPRINT_LNA)		; vezmi adresu prvního znaku na dosud používaném řádku
		ld	a,l			; a spočítej adresu o jeden znak níž
		add	a,32			; (obdoba rutiny DOWNCH)
		ld	l,a
		jr	nc,MPRN_NL2
		ld	a,h
		add	a,8
		ld	h,a
		cp	88
		jr	nz,MPRN_NL2
		ld	h,64
MPRN_NL2	ld	(MPRINT_LNA),hl		; adresu znaku na začátku nového řádku ulož do proměnných
		ld	(MPRINT_CHA),hl
		pop	hl
		ret  				; návrat z PRINT (po skoku na PRINT_CR se vrátím na TEXTOUT)

MPRN_LL		ld	hl,(MPRINT_LNA)		; NEW LINE na posledním řádku, vezmi adresu tohoto řádku
		ld	(MPRINT_CHA),hl		; a ulož ji jako adresu znaku
		pop	hl
		ret				; návrat z PRINT

;------------------------------------------------------------------------------
;  POTŘEBNÉ PROMĚNNÉ
;------------------------------------------------------------------------------
;
; Proměnná PRINT_COL je v této verzi ignorována, je zde pouze kvůli kompatibilitě a
; plné zaměnitelnosti této rutiny s její barevnou verzí.

MPRINT_XY		dw	0		; 1. byte je Y (řádek), druhý byte X (sloupec), kvůli
						; 16 bit. reg.
MPRINT_Y		equ	MPRINT_XY
MPRINT_X		equ	MPRINT_XY+1	; vyšší registry (H, B, D)
MPRINT_COL		db	58		; color - implicitně INK 0, PAPER 7
MPRINT_CLE		db	0		; 0 = barvy vypnuty, 1 barvy zapnuty
MPRINT_LNA		dw	16384		; adresa znaku na začátku právě aktuálního řádku
MPRINT_CHA		dw	16384		; adresa znaku, který bude tisknut
MPRINT_FNA		equ	MPRN_FN0+1	; adresa, kde mohou adresu fontu měnit externí programy

; Font by měl být dlouhý 2048 bytů pro všech 256 znaků, tj. jsou uvažovány
; i znaky mezi 0 až 31 včetně (výjimkou jsou řetězce pro 0,13,22). Pro písmo
; nevyužité pozice možno využít pro další rozšíření fontu, např. semigrafické
; znaky, rámečky a pod. Kompatibilita s ISO8859-2 případně jinou znakovou
; sadou podobné míry rozšířenosti by měla být zachována.

;		binclude	../libs/font_mprint_iso8859-2_4x8.bin

;==============================================================================
; 100 řádků kódů, 1000 řádků ASCII ART