;==================================================================================================
; Disassembly of the file "zx-centroface-prectena-ROM-2716.bin" made by l00k
;==================================================================================================
; disassembloval a okomentoval l00k
; do zkompilovatelné podoby upravil zxcygnus
;
; Tato verze zdrojového kódu produkuje v kompileru AS identický binární kód, jako byl přečtený
; z ROM ZX-Centroface. Komentáře a jména návěští nemusí být ideální, mohou obsahovat chyby.

		cpu	z80undoc
		org	2048

;--------------------------------------------------------------------------------------------------
; #0800 2048

START		di
		ld	hl,RET_TO_ZXROM		; rutina Návrat s odpojením ROM (v bufferu tiskárny)
		push	hl			; přes ni se vrátíme
		ld	hl,(5c74h)		; T-ADDR - Address of next item in parameter table
		ld	a,(hl)			; vyzvedni
		cp	0ach			; 0EAC -> je to příkaz COPY? (test nižšího bajtu adresy)
		jp	nz,LPRINT_LLIST		; odskoč pokud není (LPRINT/LLIST)
		call	REDIR_CHAN3		; nasměruj obsluhu kanálu 3 na podprogram na adrese #0efc
		pop	hl			; návratová adresa
		pop	bc			; zahoď 3 hodnoty ze zásobníku (návrat z COPY-LINE a 2 uložené hodnoty)
		pop	bc
		pop	bc
		push	hl			; vrať adresu návratové rutiny
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	18h			; 0018: THE 'COLLECT CHARACTER' RESTART
		cp	13			; CR? (#0d)  - zde může být jen CR nebo ":" (COPY nemá parametry)
		ld	bc,WAIT_FOR_SPACE	; kudy se vrátit - rutina počkej na stisk mezerníku
		push	bc			; na zásobník
COPY_NO_CONF	jp	z,PRINT_SCRSHOT		; Z = tiskni screenshot dle aktuálního nastavení COPY
		inc	hl			; na další znak zadaného příkazu
		ld	a,(hl)			; vyzvedni
		cp	13			; CR? (#0d)
		jr	z,COPY_NO_CONF		; Z = je, CR, konec příkazu, není konfigurační parametr
		cp	234			; 234 (#ea) = token příkazu REM
		jr	nz,COPY_NO_CONF		; NZ = není REM, není konfigurační parametr
		inc	hl			; na další znak zadaného příkazu
		ld	a,(hl)			; vyzvedni znak
		push	hl			; uschovej adresu v řádku
COPY_NEXT_PARAM	ld	hl,COPY_PARAM_TAB	; adresa tabulky parametrů
		call	SEARCH_PROGADDR		; prohledej data a vrať adresu příslušné rutiny
		pop	de			; obnov adresu příkazu do DE
		jp	(hl)			; proveď konfiguraci dle parametru za COPY:REM

;--------------------------------------------------------------------------------------------------
; #0839 2105	COPY : REM neznámý příkaz / parametr za REMem

UNKNOWN_CMD	call	READ_NUMPARAM
		jp	nz,REP_NONSINBASIC	; chyba Report "C - Nonsense in BASIC"
		ld	a,(de)			; vyzvedni další znak v řádku
		push	de			; uschovej adresu příkazu na zásobník
		jr	COPY_NEXT_PARAM		; opakuj pro další parametr

;--------------------------------------------------------------------------------------------------
; #0843 2115	společný návratový bod po zpracování parametrů příkazu COPY

FINISH_SETUP	ld	hl,5c46h		; 5C45: PPC - Line number of statement being executed - vyšší bajt
		ld	a,0c0h			; maska 1100 0000
		and	(hl)			; je nastaven bit 6 nebo bit 7?
		jr	nz,CONFIG_STATUS	; NZ = ano, pokračuj zobrazením aktuální konfigurace
		pop	hl			; zahoď adresu, návrat přes čekání na mezeru
		ret				; návrat přes 5b2d

; Znamená to, že ze ZX-Centroface chová odlišně když je příkaz vložený do programu a zadaný z příkazového řádku?
;--------------------------------------------------------------------------------------------------
; #084d 2125	vypiš aktuální nastavení na obrazovku, příkaz COPY : ?

CONFIG_STATUS	xor	a			; kanál 0 (vypisuje se do řádku 23)
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	1601h			; 1601: THE 'CHAN-OPEN' SUBROUTINE
		ld	a,1			; hlášení 1 - inv 1+"CR   |TOKENS ON "
		call	WRITE_MESSAGE		; vypiš
		ld	a,(iy+77h)		; 5CB1 - druhý bajt v NMIADD
		and	0ah			; maska 0000 1010
		cp	0ah			; jsou nastaveny oba bity?
		ld	a,2			; hlášení 2 - AT 1,2+"+LF"
		call	z,WRITE_MESSAGE		; vypiš pokud ano
		bit	2,(iy+77h)		; byl jen bit 2?
		ld	a,3			; hlášení 3 - AT 1,13+"OFF""
		call	nz,WRITE_MESSAGE	; pro nenulový bit
		ld	a,4			; hlášení 4 - AT 1,17
		call	WRITE_MESSAGE		; vypiš
		ld	a,(iy+77h)		; vyzvedni
		rlca				; horní 3 bity rotuj vlevo do dolních 3 bitů
		rlca
		rlca
		and	7			; nech jen tyto 3 bity
		add	a,'0'			; přičti kód znaku 0
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	10h			; 0010: THE 'PRINT A CHARACTER' RESTART
		ld	a,7ch			; znak "|"
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	10h			; 0010: THE 'PRINT A CHARACTER' RESTART
		ld	a,(iy+30h)		; sys. proměnná FLAGS2 - zx-centroface používá jinak nevyužité horní 3 bity
;Bit 	Description
;0 	Reset when the screen is clear
;1 	Set when the printer buffer is in use
;2 	Set when in quotes during line parsing
;3 	Set when CAPS LOCK is on
;4 	Set when using channel K (keyboard)
;5 	Unused
;6 	Unused
;7 	Unused
		rlca				; posuň horní 3 nepoužívané bity dolů    
		rlca				; je zde číslo ovladače    
		rlca
		and	00000111b		; nech jen dolní 3 bity
		add	a,5			; přičti 5 (5-11 jsou názvy tiskáren)
		call	WRITE_MESSAGE		; vypiš
		ld	a,7ch			; "|"
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	10h			; 0010: THE 'PRINT A CHARACTER' RESTART
		ld	l,(iy+45h)		; 5C7F - P-POSN - Column number of printer position
		ld	h,00h			; připrav HL - počet sloupců na tiskárně
		ld	e,20h			; povol úvodní mezeru
;zde vypíše číslo z HL (0-255)
		ld	bc,0ff9ch		; -100
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	192Ah			; 192A: OUT_SP_NO This entry point is used to print a line number
						; that may (E=+20) or may not (E=+FF) require leading spaces. 
		ld	c,0f6h			; -10
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	192Ah			; 192A: OUT_SP_NO This entry point is used to print a line number
						; that may (E=+20) or may not (E=+FF) require leading spaces.
		ld	a,l
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	15EFh			; 15EF: THE 'MAIN PRINTING' SUBROUTINE
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #08b9 2233	/ - zapnutí(/x) vypnutí(/0) LF k CR, příkaz COPY : /n

SET_LINE_END	call	READ_NUMPAR_INC		; posuň se v řádku a načti možné číslo
		jp	z,REP_NONSINBASIC	; Z = nebylo číslo, chyba Report C - Nonsense in BASIC
		or	c			; vyšší bajt or nižší čísla
		jr	nz,SET_LINE_END_1	; pro nenulovou hodnotu poskoč
		ld	a,0f5h			; maska pro příznaky je 1111 01001
		and	(iy+77h)		; vynuluj příslušné bity
		jr	SET_LINE_END_2		; a poskoč na uložení výsledku
SET_LINE_END_1	ld	a,0ah			; maska 0000 1010
		or	(iy+77h)		; nastav tyto bity
SET_LINE_END_2	ld	(iy+77h),a		; ulož příznaky zpět
		jp	FINISH_SETUP		; společná část po nastavení parametru příkazem COPY

;--------------------------------------------------------------------------------------------------
; #08d4 2260	. - nastav typ COPY
;		tečka nastavuje textový/grafický tisk příkazem COPY a zvětšení grafického tisku

SET_PRN_MODE	call	READ_NUM_PARAM		; načti do horních 3 bitů C číslený parametr, může být jen 0-7
		ld	a,(iy+77h)		; vyzvedni
		and	00011111b		; vynuluj horní tři bity (#1f)
		or	c			; přidej načtený parametr
		ld	(iy+77h),a		; vrať zpět
		jp	FINISH_SETUP		; společná část po nastavení parametru příkazem COPY

;--------------------------------------------------------------------------------------------------
; #08e3 2275	CHR$ - zapnutí (1) vypnutí (0) tisku TOKENS

SET_TOKENS	call	READ_NUMPAR_INC		; posuň se v řádku a načti možné číslo
		jp	z,REP_NONSINBASIC	; Z = nebylo číslo, chyba Report C - Nonsense in BASIC
		or	c			; vyšší bajt or nižší čísla
		jr	nz,SET_TOKENS_1		; pro nenulový odskoč
		set	2,(iy+77h)		; nastav bit 2 (23610 + 119 = 23729 druhý bajt v NMIADD)
		jr	SET_TOKENS_2		; přeskoč nulování
		
SET_TOKENS_1	res	2,(iy+77h)		; vynuluj bit 2 (23610 + 119 = 23729 druhý bajt v NMIADD)
SET_TOKENS_2	jp	FINISH_SETUP		; společná část po nastavení parametru příkazem COPY

;--------------------------------------------------------------------------------------------------
; #08f9 2297	COPY - tisk kopie obrazovky podle aktuálního nastavení

PRINT_SCRSHOT	pop	hl			; zahodit návratovou adresu
		ld	a,(iy+77h)		; vyzvedni typ
		and	0e0h			; nech horní 3 bity - maska 1110 0000
		ld	hl,COPY_MODE_TAB	; adresa tabulky pro typ COPY obrazovky
		call	SEARCH_PROGADDR		; prohledej data a vrať adresu příslušné rutiny
		jp	(hl)			; a vrať se přes ni

;--------------------------------------------------------------------------------------------------
; #0906 2310	COPY - normální velikost 1:1

COPY_NORM	ld	a,2			; pošli 2. sekvenci z PRINTER_SEQ na tiskárnu = n/72 inch line spacing
		call	PRINT_CTRLSEQ
		call	PRINT_NEW_LINE		; zpracování CR - odřádkování na tiskárně
		ld	bc,0			; vynulovat počítadla B = Y <0,191> a C = X <0,255> = souřadnice pixelů od levého horního rohu
COPY_LNLOOP	push	bc			; uschovej souřadnice
		ld	a,1			; pošli 1. sekvenci PRINTER_SEQ na tiskárnu = 8 characters margin from left border
		call	PRINT_CTRLSEQ
		ld	a,3			; pošli 3. sekvenci z PRINTER_SEQ na tiskárnu = 256 columns (pixels)
		call	PRINT_CTRLSEQ
		pop	bc			; obnov souřadnice

; jehličková tiskárna tiskne pixely na výšku - je třeba načíst 8 pixelů pod sebou z obrazovky 
COPY_PXCOLMN	push	bc			; uschovej souřadnice
		ld	d,8			; počítadlo - 8 pixelů/bitů

COPY_PXCOLUMN	push	bc			; uschovej souřadnice pixelu ze sloupce 8px
		ld	a,b			; souřadnice Y do A
		call	ZXROM_CALL		; zavolej část podprog. "PIXEL ADDRESS" v ZX ROM
		dw	22b0h			; A = Y, C = X, vrátí adresu v HL a číslo bitu v A
		ld	b,a			; číslo bitu v bytu do B
		inc	b			; zvyš číslo bitu, musí být > 0
		ld	a,(hl)			; vyzvedni obrazová data
COPY_ROTPX	rlca				; rotuj je 
		djnz	COPY_ROTPX		; opakuj podle čísla bitu
		rl      e			; narotuj příslušný bit do E
		pop	bc			; obnov souřadnice pixelu ze sloupce 8px
		inc	b			; souřadnice Y o 1 pixel dolů
		dec	d			; sniž počítadlo pixelů
		jr	nz,COPY_PXCOLUMN	; opakuj pro všech 8 pixelů nad sebou
		ld	a,e			; sestavený výsledek z E do A
		call	PRINT_CHAR		; pošli A do tiskárny
		inc	c			; zvyš X souřadnici -> další osmice pixelů nad sebou o jeden pixel vpravo
		ld	a,c			; odlož X souřadnici do A
		jr	z,COPY_NEXTLN		; Z = zpracováno 256px na šířku obrazovky, odskok
		pop	bc			; obnov souřadnice
		ld	c,a			; odloženou novou souřadnici X do C
		jr	COPY_PXCOLMN		; opakuj pro další osmici pixelů nad sebou

COPY_NEXTLN	pop	de			; zahoď uložené souřadnice (v BC jsou suořadnice správné)
		call	PRINT_NEW_LINE		; pošli CR, nebo CRLF dle nastavení
		ld	a,191			; výška obrazovky - 1 do A
		cp	b			; porovnej s aktuální Y souřadnicí
		jr	nc,COPY_LNLOOP		; NC = souřadnice Y nepřesáhla 191, opakuj 
		ld	a,4			; pošli 4. sekvenci z PRINTER_SEQ na tiskárnu = 1/6 inch line spacing
		jp	PRINT_CTRLSEQ

;--------------------------------------------------------------------------------------------------
; #094e 2382	COPY - zvětšení

; TODO: tady mohou být návěští popletené... nutno zkorigovat podle disaasemblingu od l00ka

COPY_ZOOM	ld	a,6			; pošli 6. sekvenci z PRINTER_SEQ na tiskárnu = n/216-inch line spacing
		call	PRINT_CTRLSEQ
		call	PRINT_NEW_LINE		; pošli CR, nebo CRLF dle nastavení
		ld	a,1			; pošli 1. sekvenci PRINTER_SEQ na tiskárnu = 8 characters margin from left border
		call	PRINT_CTRLSEQ
		ld	bc,0			; B=0 y (0-191), C=0 (0-255)
; #095e	095eh	
COPYZOOM_LOOP	push	bc			; uschovej počítadla
		ld	a,5			; pošli 5. sekvenci z PRINTER_SEQ na tiskárnu = number of columns 768
		call	PRINT_CTRLSEQ
		pop	bc			; obnov počítadla
; #0965 0965h
COPYZOOM_PXCOL2	push	bc			; ulož počítadla 
		ld	d,4			; počítadlo 4x (protože 4 pixely na výšku, každý 2x
; #0968 0968h
COPYZOOM_PXCOL	push	bc			; ulož počítadla na začátku cyklu
		ld	a,b			; souřadnice Y do A
		call	ZXROM_CALL		; zavolej část podprog. "PIXEL ADDRESS" v ZX ROM
		dw	22b0h			; A = Y, C = X, vrátí adresu v HL a číslo bitu v A
		ld	b,a			; číslo bitu do B
		inc	b			; zvyš, použije se v cyklu
		ld	a,(hl)			; načti obrazová data
; #0972 0972h
COPYZOOM_ROTPX	rlca				; rotuj
		djnz	COPYZOOM_ROTPX		; opakuj podle čísla bitu
		rl	e			; výsledný bit do E
		rrca				; ten samý bit ještě jednou do CY
		rl	e			; a do E
		pop	bc			; obnov počítadla
		inc	b			; zvyš Y
		dec	d			; sniž počítadlo
		jr	nz,COPYZOOM_PXCOL	; opakuj 4x
		ld	a,e			; načtený výsledek doA
		call	PRINT_CHAR		; pošli A na tiskárnu
		call	PRINT_CHAR		; pošli A na tiskárnu
		call	PRINT_CHAR		; pošli A na tiskárnu
		inc	c			; zvyš X
		ld	a,c			; schovej do C
		jr	z,COPYZOOM_NEWLN	; pokud je 256 (0) poskoč
		pop	bc			; obnov počítadla
		ld	c,a			; vrať X do C
		jr	COPYZOOM_PXCOL2		; opakuj

; #0991 0991h
COPYZOOM_NEWLN	pop	de			; zahoď počítadla
		call	PRINT_NEW_LINE		; pošli CR, nebo CRLF dle nastavení
		ld	a,0bfh			; 191
		cp	b			; porovnej
		jr	nc,COPYZOOM_LOOP	; opakuj dokud není
		ld	a,7
		jp	PRINT_CTRLSEQ		; vrať se přes vypiš A-tou položku ze seznamu na PRINTER_SEQ na tiskárnu

;--------------------------------------------------------------------------------------------------
; #099f 2463	vytiskni 1 znak (8x8 bodů) graficky na tiskárně
;		přepnutí na grafiku musí být provedeno předem
;		očekává adresu předlohy v HL (písmena s diakritikou, copyright, nebo UDG

PRINTGR_CHAR	ld	bc,087fh		; B = 8, C = 01111111b
PRINTGRCHAR_1	push	bc			; uschovej počítadla
		push	hl			; a adresu
PRINTGRCHAR_2	ld	a,(hl)			; načti příslušné bity
		inc	hl			; jednotlivých řádků
		or	c			; vymaskuj, všechny bit 1, kromě žádaného (počínaje bitem 7)
		add	a,1			; proč ne inc a?
		rl      e			; do E zdola
		djnz	PRINTGRCHAR_2		; opakuj 8x
		ld	a,e			; výsledek do A
		call	PRINT_CHAR		; pošli A na tiskárnu
		pop	hl			; obnov registry
		pop	bc
		rrc     c			; posuň masku v C na další bit
		jr	c,PRINTGRCHAR_1		; opakuj 8x
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #09b8 2488	posuň se v řádku a načti možné číslo

READ_NUMPAR_INC	inc	de

; #09b9 2489	načti možné číslo
READ_NUMPARAM	ex	de,hl			; prohoď registry
		ld	de,(5c5dh)		; 5C5D: CH-ADD - Address of the next character to be interpreted
		push	de			; uschovej
		ld	(5c5dh),hl		; 5C5D: CH-ADD - Address of the next character to be interpreted
		push	hl			; vlož vstupní hodnotu z DE na proměnnou a schovej si ji
		res	7,(iy+1)		; FLAGS - Various flags to control the BASIC system
						; Reset when checking syntax
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	24FBh			; 24FB: THE 'SCANNING' SUBROUTINE
		pop	hl			; obnov adresu
		push	hl			; a ještě schovej
		ld	(5c5dh),hl		; 5C5D: CH-ADD - Address of the next character to be interpreted
		set	7,(iy+01h)		; FLAGS - Various flags to control the BASIC system
						; Reset when checking syntax
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	24FBh			; 24FB: THE 'SCANNING' SUBROUTINE
		pop	hl			; obnov adresu
		bit	6,(iy+1)		; FLAGS - Various flags to control the BASIC system
						; Variable type flag: string (reset) or numeric (set)
		push	af			; uschovej příznak řetězec/číslo
		jr	nz,READ_NUMBER		; pro číslo poskoč
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	2BF1h			; 2BF1: THE 'STK-FETCH' SUBROUTINE - načti poslední číslo ze zásobníku kalkulátoru do registrů
		jr	READ_NUM_FIN		; na ukončení

; #09e9 2537
READ_NUMBER	push	hl
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	2da2h			; 2DA2: THE 'FLOATING-POINT TO BC' SUBROUTINE
		pop	hl
		ld	a,(hl)			; vyzvedni znak
		cp	'A'			; je to A a víc? (65, #41)
		jr	nc,READ_NUM_FIN		; na konec pokud ano
		ld	a,0eh			; 14 - BASIC číslo v řádku
READ_NUMBER_2	inc	hl			; posuň se
		cp	(hl)			; porovnej
		jr	nz,READ_NUMBER_2	; opakuj dokud není
		push	bc			; schovej BC
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	11a7h			; 11A7: THE 'REMOVE-FP' SUBROUTINE
		pop	bc			; obnov BC
READ_NUM_FIN	pop	af			; obnov příznak
		ld	a,b			; vyšší bajt i do B
		pop	hl			; obnov HL - původní hodnota CH-ADD
		ld	(5c5dh),hl		; 5C5D: CH-ADD - Address of the next character to be interpreted
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0a09 2569	= - nastav typ tiskárny

SET_PRINTER	call	READ_NUM_PARAM		; načti do horních 3 bitů C číslený parametr, může být jen 0-7
		ld	a,(iy+30h)		; sys. proměnná FLAGS2 - zx-centroface používá jinak nevyužité horní 3 bity
;Bit 	Description
;0 	Reset when the screen is clear
;1 	Set when the printer buffer is in use
;2 	Set when in quotes during line parsing
;3 	Set when CAPS LOCK is on
;4 	Set when using channel K (keyboard)
;5 	Unused
;6 	Unused
;7 	Unused	
		and	00011111b		; nech dolních 5 bitů
		or	c			; přidej parametr
		ld	(iy+30h),a		; ulož zpět
		jp	FINISH_SETUP		; společná část po nastavení parametru příkazem COPY

;--------------------------------------------------------------------------------------------------
; #0a18 2584	prohledej tabulku parametrů a vrať adresu obslužné rutiny pro ten parametr
;		v HL adresa tabulky, v A testovaná hodnota

SEARCH_PROGADDR	ld	b,0			; počet položek do BC
		ld	c,(hl)			
		inc	hl			; posuň se
		ld	e,(hl)			; vyzvedni adresu tabulky adres
		inc	hl
		ld	d,(hl)
		inc	hl			; posuň se za ni
		cpir				; prohledej data 
		ex	de,hl			; adresa kde se zastavil do DE, do HL adresa začátku tabulky
		add	hl,bc			; indexuj podle BC
		add	hl,bc
		ld	e,(hl)			; vyzvedni adresu rutiny
		inc	hl
		ld	d,(hl)
		ex	de,hl			; dej ji do HL
		ret				; a návrat

;--------------------------------------------------------------------------------------------------
; #0a2a 2602	LEN - nastav délku řádky tiskárny

SET_LINE_LENGTH	call	READ_NUMPAR_INC		; posuň se v řádku a načti možné číslo
		jp	z,REP_NONSINBASIC	; Z = nebylo číslo, chyba Report C - Nonsense in BASIC
		or	a			; otestuj A
		jp	nz,MSG_OUTOFRANGE	; chyba Report B - integer out of range
		or	c			; přidej C (k nule)
		jp	z,MSG_OUTOFRANGE	; chyba Report B - integer out of range
		ld	(iy+45h),c		; nastav 5C7F: P-POSN - Column number of printer position
		jp	FINISH_SETUP		; společná část po nastavení parametru příkazem COPY

;--------------------------------------------------------------------------------------------------
; #0a3e 2622	COPY - screenshot obrazovky na tiskárnu pouze znakově (nerozpoznatelné znaky se nevytisknou)

COPY_CHARS	ld	bc,0			; resetuj znakové souřadnice - B=0 sloupec (0-31), C=0 řádek (0-23)
;smyčka
COPYCH_LOOP	push	bc			; uschovej souřadnice
		push	bc			; 2x
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	2538h			; do 2535: THE 'SCANNING SCREEN$' SUBROUTINE - v BC již souřadnice
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	2BF1h			; 2BF1: THE 'STK-FETCH' SUBROUTINE
		dec	c
		pop	bc			; obnov souřadnice
		jr	nz,COPYCH_SPACE		; pokud nebylo C=1 vytiskni mezeru
		cp	' '			; znaky menší než mezera?
		jr	c,COPYCH_SPACE		; ty taky nahraď mezerou
		cp	60h			; byla to libra?
		jr	nz,COPYCH_NOPOUND	; NZ = není libra, přeskoč nahrazení
		ld	a,23h			; tu nahraď "#"
		jr	COPYCH_PRINT		; tiskni znak
;
COPYCH_NOPOUND	cp	80h			; je znak ASCII? (tj. je kód znaku menší než 128?)
		jr	c,COPYCH_PRINT		; C = je ASCII, vytiskni
COPYCH_SPACE	ld	a,' '			; není-li ASCII, tiskni mezeru
COPYCH_PRINT	call	PRINT_CHAR		; vypiš PRINT_CHARA na tiskárnu
		inc	b			; posuň se
		ld	a,b			; uschovej
		cp	32			; už je to 32?
		jr	nc,COPYCH_NEXTLN	; NC = poskoč
		pop	bc			; obnov souřadnice
		ld	b,a			; obnov uschovanou hodnotu
		jr	COPYCH_LOOP		; a opakuj
;konec řádku
COPYCH_NEXTLN	pop	bc			; obnov počítadla
		call	PRINT_NEW_LINE		; pošli CR, nebo CRLF dle nastavení
		inc	c			; zvyš počítadlo řádků
		ld	a,23			; 23 (#17)
		cp	c			; porovnej číslo řádku s 23 v A
		ret	c			; C = 24 řádků vytištěno, návrat
		ld	b,0			; sloupec 0
		jr	COPYCH_LOOP		; opakuj pro další řádek

;--------------------------------------------------------------------------------------------------
; #0a7d 2685	načti do horních 3 bitů C číslený parametr, může být jen 0-7

READ_NUM_PARAM	call	READ_NUMPAR_INC		; posuň se v řádku a načti možné číslo
		jp	z,REP_NONSINBASIC	; Z = nebylo číslo, chyba Report C - Nonsense in BASIC
		ld	a,11111000b		; maska 11111000 (#f8) -  pro test, hodnota smí být jen 0-7
		and	c			; použij na C
		or	b			; přidej bity z B
		jp	nz,MSG_OUTOFRANGE	; pokud to nebyla 0, chyba Report B - integer out of range
		ld	a,c			; parametr
		rrca				; přesuň dolní 3 bity na horní b0->b5,b1->b6,b2->b7
		rrca
		rrca
		ld	c,a			; výsledek do C
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0a90 2704	pošli A-tou položku z tabulky sekvencí na tiskárnu (řídící ECS sekvence a copyright)

PRINT_CTRLSEQ	push	hl			; uschovej registry
		push	bc
		push	af
		ld	hl,PRINTER_SEQ		; do HL adresa tabulky sekvencí pro tiskárnu
		call	SEARCH_STRING		; najdi A-tou položku, vrací délku v C a adresu řetězce v HL
		ld	b,c			; délka řetězce do B
PRINT_CTRLSEQ_1	ld	a,(hl)			; vyzvedni znak do A
		call	PRINT_CHAR		; tiskni znak
		inc	hl			; adresu na další znak / byte
		djnz	PRINT_CTRLSEQ_1		; opakuj pro všechny znaky
		pop	af			; obnov registry
		pop	bc
		pop	hl
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0aa5 2725	vypiš na obrazovku A-tý text z tabulky řetězců (hlášky i formátovací sekvence)
;		používá se k zobrazení informačního řádku s aktuálním nastavením

WRITE_MESSAGE	push	hl			; uschovej registry
		push	bc
		push	af
		ld	hl,MESSAGE_TAB		; do HL adresa tabulky řetězců
		call	SEARCH_STRING		; najdi A-tou položku, vrací délku v C a adresu řetězce v HL
		ld	b,c			; délka textu do B
WRITE_MSG_1	ld	a,(hl)			; vyzvedni znak
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	10h			; 0010: THE 'PRINT A CHARACTER' RESTART (RST 16)
		inc	hl			; adresu na další znak / byte
		djnz	WRITE_MSG_1		; opakuj pro celý řetězec
		pop	af			; obnov registry
		pop	bc
		pop	hl
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0abc 2748	najdi A-tou položku v tabulce řetězců, dej do C její délku, do HL adresu
;		prohledává tabulku hlášek i tabulku řídících sekvencí pro tiskárnu
;		A musí být větší než 0 (1 = 1. sekvence, 0 = 256. sekvence)

SEARCH_STRING	ld	b,0			; připrav
SEARCH_STR_1	ld	c,(hl)			; délku položky do C
		inc	hl			; adresu na řetězec po bytu délky
		dec	a			; sniž počítadlo položek
		ret	z			; Z = hotovo, položka nalezena (ukazatel v HL)
		add	hl,bc			; přičti délku položky k adrese -> na další položku
		jr	SEARCH_STR_1		; a opakuj

;--------------------------------------------------------------------------------------------------
;je to do COPY-LINE, dá A do D a přistránkuje EPROM interface
;pokračuje se pak v EPROM interfejsu na 0F0Eh
;--------------------------------------------------------------------------------------------------		
; #0ac5 2757	nastav adresu obslužného programu pro kanál #3 na 0efch

REDIR_CHAN3	push	hl			; uschovej registry
		push	de
		push	bc
		push	af
		ld	bc,15			; informace o kanálu zabírají 5 bytů *3 na kanál
		ld	hl,(5c4fh)		; vyzvedni CHANS "Address of channel data", může se posunout např. TRDOSem
		add	hl,bc			; posuň ukazatel na kanál #3
		ld	bc,0efch		; do BC adresu obslužného programu (oblast COPY-LINE od #0ef4 v ZX ROM)
		ld	(hl),c			; zapiš do proměnné o kanálu #3
		inc	hl
		ld	(hl),b
		call	COLUMN_33_TO_80		; pokud je sloupec tiskárny 33, změň hodnotu na 80
		call	CPY_SUBROUTINE		; přenes rutiny do bufferu tiskárny (25 bajtů, 3 rutiny)	
		pop	af			; obnov registry
		pop	bc
		pop	de
		pop	hl
		ret				; návrat

; CHANS 5c4fh = 23631
; se samotnou ZX 48k ROM je v CHANS 5cb6h = 23734, channel #3 je na 5cc5h 23749 a obsahuje 09f4h 2548
; s inic. Betadiskem je v CHANS 5d26h 23846 (+15 = 5d35h) a obsahuje 09f4h 2548

;--------------------------------------------------------------------------------------------------
; #0ae1 2785	pokud je (IY+45h)=33, změň hodnotu na 80 .... smysl?
;
;		5C7F: P-POSN - Column number of printer position

COLUMN_33_TO_80	ld	a,(iy+45h)		; pozice znaku (sloupec) ze sys. proměnné do A
		cp	33			; je to 33?
		ret	nz			; NZ = není, návrat
		ld	(iy+45h),80		; 32 znaků vytištěno, změň na 80
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0aec 2796	posuň tiskovou pozici a vytiskni znak z A

MOVE_AND_PRINT	call	MOVE_PRINT_POSX		; posuň aktuální tiskovou souřadnici (IY+46h), pokud je max tak CR

;--------------------------------------------------------------------------------------------------
;#0aef 2799	pošli znak do tiskárny z reg. A

PRINT_CHAR	push	af			; uschovej znak
PRINT_BUSYLOOP	call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	8020			; (#1F54) test klávesy BREAK
		jp	nc,MSG_BREAK		; pokud je, ohlaš BREAK a konec
		in	a,(0bfh)		; je tiskárna připravena?
		and	01000000b		; (#40) ponech bit 6 = signál BUSY z tiskárny
		jr	nz,PRINT_BUSYLOOP	; NZ = tiskárna je BUSY, opakuj
		pop	af			; obnov hodnotu pro port
		out	(0bfh),a		; strobe H 0b10111111 = zapíše znak na port s dosud neaktivním strobe
		out	(0bbh),a		; strobe L 0b10111011 = potvrzení platnosti znaku aktivací strobe po dobu 11T (cca 3,1us)
		out	(0bfh),a		; strobe H 0b10111111 = deaktivuje strobe, ale zatím nemění znak na portu
		ret				; a návrat

;--------------------------------------------------------------------------------------------------
; #0b06 2822	počkej na stisk mezerníku

WAIT_FOR_SPACE	ld	a,127			; příslušná řada (#7F)
		in      a,(254)			; načti stav (#FE)
		rra				; bit 0 do carry
		jr	c,WAIT_FOR_SPACE	; C = 1 = není mezerník, opakuj
		ret				; je mezeník, návrat

;--------------------------------------------------------------------------------------------------
; #0b0e 2830	vstup z LPRINT/LLIST, znak k výpisu je v D
;		provede inicializaci kanálu #3 pokud už není provedena

LPRINT_LLIST	ld	hl,(5c4fh)		; vyzvedni CHANS - Address of channel data
		ld	c,15			; posun o 3*5 bytů
		ld	b,0
		add	hl,bc			; na kanál #3
		ld	c,(hl)			; vyzvedni do BC adresu
		inc	hl
		ld	b,(hl)
		ld	hl,0efch		; adresa obslužného programu
		call	REDIR_CHAN3		; nasměruj obsluhu kanálu 3 na podprogram na adrese #0efc
		sbc     hl,bc			; porovnej stávající adresu na kanálu oproti 0EFC (nová hodnota)
		jr	z,LPRINT_LLIST_2	; a pokud tam tato hodnota už byla poskoč

; inicializace kanálu #3, nastavení výchozích parametrů ZX-Centroface
		ld	a,(iy+30h)		; sys. proměnná FLAGS2 - zx-centroface používá jinak nevyužité horní 3 bity
		and	00011111b		; nech jen dolních 5 bitů (používá BASIC) - typ tiskárny 0 = STAR
		ld	(iy+30h),a		; zapiš FLAGS2
		ld	(iy+77h),0		; vynuluj
		ld	(iy+45h),80		; nastav 5C7F: P-POSN - Column number of printer position na 80
		pop	hl			; návratová adresa přes 5b2dh do HL
		pop	bc			; zahoď 4 adresy ze zásobníku před návratovou
		pop	bc
		pop	bc
		pop	bc
		jp	(hl)			; vrať se přes odpojení ROM

;--------------------------------------------------------------------------------------------------
; #0b39 2873	standardní tisk znaku LPRINT/LLIST po kontrole

LPRINT_LLIST_2	ld	a,d			; znak k výpisu do A
		bit	2,(iy+77h)		; příznak CHR$
		jr	nz,0b48h		; pokud je 1 poskoč - přímý tisk
		bit	0,(iy+77h)		; příznak ESC
		res	0,(iy+77h)		; vynuluj ho - toto umožňuje pouze ESC+ 1 znak (2 bajtové ESC povely) !!
		jp	nz,PRINT_CHAR		; pokud byl příznak =1 tak vytiskni znak z A
		ld	a,(iy+30h)		; sys. proměnná FLAGS2 - zx-centroface používá jinak nevyužité horní 3 bity
		or	00011111b		; nastav 5 dolních bitů na 1
		inc	a			; zvýšením o jedna otestuj, jestli i horní 3 bity byly 1, tj. jestli po OR bylo FLAGS2 255
		ld	a,d			; znak k výpisu do A
		call	z,PRINT_CSMODE		; Z = typ tiskárny v proměnné FLAGS2 byl 7 "CS Mode" = zpracování českých znaků 192-255
		cp	6			; řídící kód čárka (TAB)
		jr	z,PRINT_DASH		; Z = zpracuj čárku
		cp	22			; řídící kód AT (#16)
		jr	z,PRINT_TAB_AT		; Z = zpracuj AT
		cp	23			; řídící kód TAB (#17)
		jp	nz,PRINT_NO_DTA		; NZ = není TAB
;zpracování řídícího kódu TAB a AT
PRINT_TAB_AT	ld	de,5b26h		; nová adresa pro PO_CHANGE - tudy půjde další znak
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	0a80h			; 0A80: PO_CHANGE (current 'output' routine address is changed temporarily)

;--------------------------------------------------------------------------------------------------
; #0b6a 2922	kopíruj podprogram do bufferu tiskárny (25 bajtů, 3 rutiny)

CPY_SUBROUTINE	ld	hl,0f6ch		; zdroj, adresa 3 malých podprogramů
		ld	de,5b20h		; cíl, tiskový buffer ZX Printer
		ld	bc,25			; 25 bytů
		ldir				; kopíruj
		ret

;--------------------------------------------------------------------------------------------------
; #0b76 2934	zpracování čísla za TAB,AT a obnovení tiskové rutiny

PRINT_ATTAB_NUM	ld	de,5b20h		; nová adresa pro PO_CHANGE - tudy půjde další znak (standard)
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	0a80h			; 0A80: PO_CHANGE (current 'output' routine address is changed temporarily)
		or	255			; nastav příznaky NZ,NC
		ld	a,b			; znak co přišel do A
		push	af			; uschovej
		jr	PRINT_ALIGNSP		; skok na zarovnání mezerami

;--------------------------------------------------------------------------------------------------
; #0b84 2948	řídící kód 6 - čárka

PRINT_DASH	push	af			; uschovej příznaky - při vstupu zde je Z
		ld	a,(iy+45h)		; vyzvedni 5C7F: P-POSN - Column number of printer position - max. pozice (80)
		srl	a			; divné dělení 2 (co pokud si nastavím liché číslo?)

PRINT_ALIGNSP	sub	(iy+46h)		; 5C80: PR-CC - Address of next position for LPRINT to print at  - odečti aktuální pozici
		jr	nc,PRINT_HALFLN		; odskoč pokud si v první půlce řádku
		call	PRINT_NEW_LINE		; pošli CR, nebo CRLF dle nastavení
		pop	af			; obnov příznaky
		ret	z			; pro Z návrat
;vypiš B mezer
PRINT_B_SPACES	ld	a,' '			; mezera
		call	MOVE_AND_PRINT		; vypiš na tiskárnu
		djnz	PRINT_B_SPACES		; opakuj potřebný počet
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0b9c 2972	čárka a akt. pozice v první půlce řádku

PRINT_HALFLN	pop	de			; zahoď uložené příznaky
		ret	z			; pokud si přesně v půlce návrat
		ld	b,a			; rozdíl je počet mezer k výpisu do B
		jr	PRINT_B_SPACES		; vypiš mezery

;--------------------------------------------------------------------------------------------------
; #0ba1 2977	nebylo AT,čárka,TAB

PRINT_NO_DTA	cp	13			; je znak CR? (#0d)
		jp	z,PRINT_NEW_LINE	; z = pošli CR, nebo CRLF dle nastavení
		cp	24			; jiné řídící znaky z rozsahu (#18)
		ret	c			; C = řídící znaky menší než 24 budou ignorovány
		cp	27			; je ESC? (#1b)
		jr	nz,PRINT_NO_ESC		; NZ = není ESC, přeskoč zpracování ESC
		set	0,(iy+77h)		; zpracování ESC - nastav příznak ESC kód
; toto proč? zde bych očekával jp  PRINT_CHAR - tisk
; od kdy se ESC kódy počítají do délky a netisknou ???
; nastavením příznaku jde další znak  přímo na tisk... ale bez toho ESC ????
		jp	MOVE_PRINT_POSX		; návrat přes posun aktuální tiskové pozice (IY+46h), pokud je max tak CR

;--------------------------------------------------------------------------------------------------
; #0bb4 2996	pokud nebyl řídící znak

PRINT_NO_ESC	cp	96			; (#60) znak s kódem 96? - libra
		jr	nz,PRINT_NO_POUND	; poskoč pokud ne
		ld	a,23h			; nahraď libru znakem "#"
PRINT_NO_POUND	cp	127			; (#7f) znaky 0..126?
		jp	c,MOVE_AND_PRINT	; C = znaky v rozsahu 32..126 tiskni přímo (s posunem pozice)
		jp	z,PRINT_COPYRIGHT	; Z = tiskni znak 127 copyright
		cp	144			; (#90) znaky 128..143, čtverečková grafika
		jp	c,PRINT_BLOCKS		; C = tiskni čtverečkové znaky 128..143
		cp	165			; (#a5) znaky 144..164, UDG
		jp	c,PRINT_UDG		; C = tiskni UDG v rozsahu 144..164
;znaky 165 a výše
		sub	165			; (#a5) odečti offset
		call	CALL_NEXTADDR		; pokračuj v ZX ROM na adrese za CALL
		dw	0c10h			; 0C10:  PO_TOKENS Enter here when expanding token codes.


;--------------------------------------------------------------------------------------------------
; #0bd3 3027	pro CS MODE voláno toto

PRINT_CSMODE	cp	192			; 0-191? (#c0)
		ret	c			; C = menší než 192 = normální tisk, návrat
		pop	hl			; návratovou adresu zahodit (voláno CALLem)
		call	MODE_AND_TESTGR		; posuň tiskovou pozici a otestuj jestli je grafická tiskárna
		jr	z,PRINT_SPACE		; Z = není grafická tiskárna, vytiskni mezeru
		sub	192			; odečti 192 (#c0)
		ld	hl,CSCHAR_TABLE		; do HL adresa tabulky znaků s diakritikou
		jr	PRINT_GRCMN		; pokračuj společnou částí pro tisk jednoho grafického znaku

;--------------------------------------------------------------------------------------------------
; #0be3 3043	zpracování znaku 127 (copyright)

PRINT_COPYRIGHT	call	MODE_AND_TESTGR		; posuň tiskovou pozici a otestuj jestli je grafická tiskárna
		ld	hl,FONT_COPYRIGHT	; grafická předloha (c)
		jr	nz,PRINT_GRCMN_2	; NZ = vytiskni graficky
		ld	a,9			; jinak sekvence č.9  = rozepsaný copyright do 3 ASCII znaků "(c)"
		jp	PRINT_CTRLSEQ		; vrať se přes vypiš A-tou položku ze seznamu na PRINTER_SEQ na tiskárnu

;--------------------------------------------------------------------------------------------------
; #0bf0 3056	znaky 128..143 (čtverečková grafika)

PRINT_BLOCKS	call	MODE_AND_TESTGR		; posuň tiskovou pozici a otestuj jestli je grafická tiskárna
		jr	z,PRINT_SPACE		; pokud ne, vytiskni mezeru
		ld	b,a			; číslo znaku do A
		call	ZXROM_CALL		; volej rutinu v ZX ROM jejíž adresa je za CALL
		dw	0b38h			; 0B38: PO_GR_1 Graphic characters are constructed in an ad hoc manner 
						; in the calculator's memory area, i.e. mem-0 and mem-1.
		ld	hl,5c92h		; MEMBOT - Calculator's memory area - adresa vytvořené předlohy
		jr	PRINT_GRCMN_2		; vytiskni graficky

;--------------------------------------------------------------------------------------------------
; #0c00 3072	vytiskni mezeru

PRINT_SPACE	ld	a,' '			; mezera do A (#20)
		jp	PRINT_CHAR		; vytiskni

;--------------------------------------------------------------------------------------------------
; #0c05 3077	znaky 144-164 (UDG)

PRINT_UDG	call	MODE_AND_TESTGR		; posuň tiskovou pozici a otestuj jestli je grafická tiskárna
;
;zde mělo být:    jr    z,PRINT_UDG_CHAR
;                 sub   90h
;tj. prohozené instrukce

		sub	90h			; odečti 144 (první znak UDG)
		jr	z,PRINT_UDG_CHAR	; Z = tiskni UDG znakově pomocí ASCII
		ld	hl,(5c7bh)		; adresu předloh UDG do HL - "Address of first user defined graphic" - kvůli 16kB ZXS
PRINT_GRCMN	ld	d,0			; kód znaku z A do DE
		ld	e,a
		ex	de,hl			; kód znaku do HL, adresa do DE
		add	hl,hl			; 2x
		add	hl,hl			; 4x
		add	hl,hl			; 8x
		add	hl,de			; přičti adresu předloh
PRINT_GRCMN_2	ld	a,8			; pošli 8 sekvenci z PRINTER_SEQ na tiskárnu = n/72 inch line spacing
		call	PRINT_CTRLSEQ		; zachová reg. A, HL i BC
		jp	PRINTGR_CHAR

;--------------------------------------------------------------------------------------------------
; #0c1f 3103	pokud není grafická tiskárna vypiš písmeno odpovídající UDG 
;		zde by mělo být správně:  sub   4Fh (79)

PRINT_UDG_CHAR	add	a,'A'			; přičti znak A (#41)
		jp	PRINT_CHAR		; vytiskni znakově

;--------------------------------------------------------------------------------------------------
; #0c24 3108	posuň tiskovou pozici a otestuj jestli je grafická tiskárna

MODE_AND_TESTGR	call	MOVE_PRINT_POSX		; posuň aktuální tiskovou souřadnici (IY+46h), pokud je max tak CR
		push	bc			; uschovej
		ld	c,a			; uschovej A v C
		ld	a,(iy+77h)		; vyzvedni příznaky
		and	11100000b		; nech jen horní 3 bity ()
		ld	a,c			; obnov A
		pop	bc			; obnov BC
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0c31 3121	zpracování CR vs CRLF odřádkování

PRINT_NEW_LINE	push	af			; uschovej A
		ld	a,13			; kód CR do A
		ld	(iy+46h),0		; 5C80: PR-CC - Address of next position for LPRINT to print at
		call	PRINT_CHAR		; vytiskni
		ld	a,(iy+77h)		; načti příznaky
		and	10			; maska 00001010b
		cp	10			; zůstalo 10?
		call	z,PRINT_CHAR		; Z = je 10, je zapnuto CRLF, vytiskni ještě LF
		pop	af			; obnov A
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0c47 3143	posuň aktuální tiskovou souřadnici (IY+46h), dosáhla-li konce řádku, tak odřádkuj

MOVE_PRINT_POSX	push	af			; uschovej A
		ld	a,(iy+46h)		; 5C80: PR-CC - Address of next position for LPRINT to print at
		cp	(iy+45h)		; porovnej s 5C7F: P-POSN - Column number of printer position
		call	nc,PRINT_NEW_LINE	; NC = konec řádku dosažen, přejdi na další řádek
		inc	(iy+46h)		; zvyš 5C80: PR-CC - Address of next position for LPRINT to print at
		pop	af			; obnov A
		ret				; návrat

;--------------------------------------------------------------------------------------------------
; #0c56 3158	chyba Report C - Nonsense in BASIC

REP_NONSINBASIC	call	CALL_NEXTADDR		; pokračuj v ZX ROM na adrese za CALL
		dw	1C8Ah			; Report C - Nonsense in BASIC. 

;--------------------------------------------------------------------------------------------------
; #0c5b 3163	volej rutinu v ZX ROM jejíž adresa je za CALL

ZXROM_CALL	push	de
		push	hl
		push	bc
		call	CPY_SUBROUTINE		; přenes rutiny do bufferu tiskárny (25 bajtů, 3 rutiny)
		pop	bc
		pop	hl
		inc	sp
		inc	sp
		ex	(sp),hl
		ld	e,(hl)
		inc	hl
		ld	d,(hl)
		inc	hl
		ex	(sp),hl
		dec	sp
		dec	sp
		push	de
		ex	de,hl
		ld	hl,5b33h		; rutina připojení ROM interface
		inc	sp
		inc	sp
		ex	(sp),hl
		dec	sp
		dec	sp
		ex	de,hl
		jr	ROM_DISCONNECT		; návrat přes odpojení ROM

;--------------------------------------------------------------------------------------------------
; #0c7a 3194	pokračuj v ZX ROM na adrese za CALL

CALL_NEXTADDR	push	de
		push	hl
		push	bc
		call	CPY_SUBROUTINE		; přenes rutiny do bufferu tiskárny (25 bajtů, 3 rutiny)
		pop	bc
		pop	hl
		pop	de
		ex	(sp),hl
		push	de
		ld	e,(hl)
		inc	hl
		ld	d,(hl)
		pop	hl
		ex	de,hl
		ex	(sp),hl
;návrat přes odpojení ROM
ROM_DISCONNECT	push	hl			; uschovej HL
		ld	hl,RET_TO_ZXROM		; adresa rutiny odpojení ROM interface
		ex	(sp),hl			; na zásobník a obnov HL
		ret				; a vrať se


;--------------------------------------------------------------------------------------------------
; #0c91 3217	tabulka hlášení pro rutinu 0AA5h


MESSAGE_TAB	db	19			; délka 1. řetězce
		db	14h,1			; zapnutí inverze
		db	"CR   ",124
		db	"TOKENS ON ",124
; #0ca5
		db	6			; délka 2. řetězce
		db	22,1,2			; AT 1,2
		db	"+LF"
; #0cac
		db	6			; délka 3. řetězce
		db	22,1,13			; AT 1,13
		db	"OFF"
; #0cb3
		db	3			; délka 4. řetězce
		db	22,1,17			; AT 1,17
; #0cb7
		db	9			; délka 5. řetězce
		db	"STAR     "
; #0cc1
		db	9			; délka 6. řetězce
		db	"EPSON 80 "
; #0ccb
		db	9			; délka 7. řetězce
		db	"EPSON 85 "
; #0cd6
		db	9			; délka 8. řetězce
		db	"EPSON 105"
; #0cdf
		db	9			; délka 9. řetězce
		db	"SEIK 1000"
; #0ce9
		db	9			; délka 10. řetězce
		db	"SEIK 1200"
; #0cf3
		db	9			; délka 11. řetězce
		db	"PANASONIC"
; #0cfd
		db	9			; délka 12. řetězce
		db	"CS MODE  "
; #0d07
		db	2			; délka 13. řetězce
		db	14h,0			; vypnutí inverze     

;--------------------------------------------------------------------------------------------------
; #0d0a 3338	tabulka řídících sekvencí pro tiskárnu 1-9, dle referenční příručky EPSON ESP/P

PRINTER_SEQ	db	3			; sekvence 1, délka 3 byty
		db	1Bh,6Ch,8		; ESC+"l"+8 - left margin = 8 characters margin from left border

		db	3			; sekvence 2, délka 3 byty
		db	1Bh,41h,8		; ESC+"A"+8 - n/72 inch line spacing for 9 pin printers only

		db	4			; sekvence 3, délka 4 byty
		db	1Bh,4Bh,0,1		; ESC+"K"+0+1 - 60dpi graphics + number of columns 256

		db	3			; sekvence 4, délka 3 byty
		db	1Bh,32h,0		; ESC+"2"+0 - 1/6 inch line spacing for all ESC/P, ESC/P2, ESC/P 9pin

		db	4			; sekvence 5, délka 4 byty
		db	1Bh,4Ch,0,3		; ESC+"L"+0+3 - 120dpi graphics + number of columns 768

		db	3			; sekvence 6, délka 3 byty
		db	1Bh,33h,15h		; ESC+"3"+21 - Set n/216-inch line spacing for 9 pin printers only

		db	2			; sekvence 7, délka 2 byty
		db	1Bh,40h			; ESC+"@" - Initialize printer

		db	4			; sekvence 8, délka 4 byty
		db	1Bh,4Bh,8,0		; ESC+"K"+8+0 - 60dpi graphics + number of columns? (8?)

		db	3			; sekvence 9, délka 3 byty
		db	"(c)"			; náhrada znaku copyright sekvenci "(c)" = #28, #63, #29

;--------------------------------------------------------------------------------------------------
; #0d30 3376	tabulka parametrů pro příkaz COPY:REM

COPY_PARAM_TAB	db	9			; počet položek tabulky (včetně adresy druhé tabulky)
		
		dw	COPY_PARAM_ADDR		; adresy tabulky adres obslužných rutin
		
		db	13			; 9 - CR - COPY (podle nastavení)
		db	0b1h			; 8 - token LEN - nastav délku řádky tiskárny
		db	":"			; 7 - : - COPY (podle nastavení)
		db	"="			; 6 - = - nastav typ tiskárny
		db	0c2h			; 5 - token CHR$
		db	"/"			; 4 - / - zapnutí(/x) vypnutí(/0) LF k CR
		db	"?"			; 3 - ? - vypiš aktuální nastavení na obrazovku
		db	"."			; 2 - . - nastav typ COPY

COPY_PARAM_ADDR	dw	UNKNOWN_CMD		; neznámý parametr za REM
		dw	SET_PRN_MODE		; . - nastav textový / grafický tisk - ovlivňuje COPY, tisk UDG a copyrightu
		dw	CONFIG_STATUS		; ? -vypiš aktuální nastavení na obrazovku
		dw	SET_LINE_END		; / - zapnutí(/x) vypnutí(/0) LF k CR (CR vs CRLF)
		dw	SET_TOKENS		; CHR$ - zapnutí (CHR$x) nebo vypnutí (CHR$0) tokenů, vypnuté tokeny = tiskne kód, ne BASICový "příkaz"
		dw	SET_PRINTER		; = - nastav model tiskárny (s EPSON LX-800 fungovalo vše stejně?)
		dw	PRINT_SCRSHOT		; : - COPY (podle nastavení)
		dw	SET_LINE_LENGTH		; LEN - nastav délku řádku tiskárny (výchozí 80 znaků)
		dw	PRINT_SCRSHOT		; CR - COPY (podle nastavení)

;--------------------------------------------------------------------------------------------------
; #0d4d 3405	tabulka pro tisk obsahu obrazovky příkazem COPY

COPY_MODE_TAB	db	3			; počet položek tabulky (včetně adresy druhé tabulky)
		
		dw	COPY_MODE_ADDR		; adresa tabulky adres rutin

		db	20h			; 0010 0000
		db	40h			; 0100 0000

COPY_MODE_ADDR	dw	COPY_CHARS		; tisk obrazovky - pouze znakově
		dw	COPY_ZOOM		; tisk obrazovky - zvětšeno 2x (40h)
		dw	COPY_NORM		; tisk obrazovky - normální velikost 1:1 (20h)

		dec	c
		ex	af,af'

;--------------------------------------------------------------------------------------------------
; #0d5a 3418	tabulka předloh českých a slovenských znaků

CSCHAR_TABLE	db	00001000b		; 192 - ˇ (čárka)
		db	00010000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00000100b		; 193 - á
		db	00001000b
		db	00111000b
		db	00000100b
		db	00111100b
		db	01000100b
		db	00111100b
		db	00000000b

		db	00000000b		; 194 - mezera
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00010100b		; 195 - č 
		db	00001000b
		db	00011100b
		db	00100000b
		db	00100000b
		db	00100000b
		db	00011100b
		db	00000000b

		db	00010100b		; 196 - ď 
		db	00001000b
		db	00000100b
		db	00111100b
		db	01000100b
		db	01000100b
		db	00111100b
		db	00000000b

		db	00101000b		; 197 - ě 
		db	00010000b
		db	00111000b
		db	01000100b
		db	01111000b
		db	01000000b
		db	00111100b
		db	00000000b

		db	00001000b		; 198 - ŕ (r s čárkou)
		db	00010000b
		db	00011100b
		db	00100000b
		db	00100000b
		db	00100000b
		db	00100000b
		db	00000000b

		db	00000000b		; 199 - mezera 
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00101000b		; 200 - ü
		db	00000000b
		db	01000100b
		db	01000100b
		db	01000100b
		db	01000100b
		db	00111000b
		db	00000000b

		db	00001000b		; 201 - í
		db	00010000b
		db	00000000b
		db	00110000b
		db	00010000b
		db	00010000b
		db	00111000b
		db	00000000b     

		db	00010000b		; 202 - ů
		db	00101000b
		db	00010000b
		db	01000100b
		db	01000100b
		db	01000100b
		db	00111000b
		db	00000000b

		db	00000100b		; 203 - ĺ (l s čárkou)
		db	00011000b
		db	00010000b
		db	00010000b
		db	00010000b
		db	00010000b
		db	00001100b
		db	00000000b

		db	00001010b		; 204 - ľ (l s háčkem)
		db	00010100b
		db	00010000b
		db	00010000b
		db	00010000b
		db	00010000b
		db	00001100b
		db	00000000b     

		db	00101000b		; 205 - ö
		db	00000000b
		db	00111000b
		db	01000100b
		db	01000100b
		db	01000100b
		db	00111000b
		db	00000000b

		db	00101000b		; 206 - ň
		db	00010000b
		db	01111000b
		db	01000100b
		db	01000100b
		db	01000100b
		db	01000100b
		db	00000000b

		db	00001000b		; 207 - ó
		db	00010000b
		db	00111000b
		db	01000100b
		db	01000100b
		db	01000100b
		db	00111000b
		db	00000000b

		db	00010000b		; 208 - uo (o s opačným háčkem)
		db	00101000b
		db	00000000b     
		db	00111000b
		db	01000100b
		db	01000100b
		db	00111000b
		db	00000000b

		db	00101000b		; 209 - ä
		db	00000000b
		db	00111000b
		db	00000100b
		db	00111100b
		db	01000100b
		db	00111100b
		db	00000000b

		db	00010100b		; 210 - ř
		db	00001000b
		db	00011100b
		db	00100000b
		db	00100000b
		db	00100000b
		db	00100000b
		db	00000000b

		db	00101000b		; 211 - š
		db	00010000b
		db	00111000b
		db	01000000b
		db	00111000b
		db	00000100b
		db	01111000b
		db	00000000b

		db	00010100b		; 212 - ť
		db	00001000b
		db	00010000b
		db	00111000b
		db	00010000b
		db	00010000b
		db	00001100b
		db	00000000b

		db	00001000b		; 213 - ú
		db	00010000b
		db	01000100b
		db	01000100b
		db	01000100b
		db	01000100b
		db	00111000b
		db	00000000b

		db	00000000b		; 214 - mezera
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00001000b		; 215 - é
		db	00010000b
		db	00111000b
		db	01000100b
		db	01111000b
		db	01000000b
		db	00111100b
		db	00000000b

		db	00010000b		; 216 - a s opačnou čárkou
		db	00001000b
		db	00111000b
		db	00000100b
		db	00111100b
		db	01000100b
		db	00111100b
		db	00000000b

		db	00001000b		; 217 - ý
		db	00010000b
		db	01000100b
		db	01000100b
		db	01000100b
		db	00111100b
		db	00000100b
		db	00111000b

		db	00101000b		; 218 - ž
		db	00010000b
		db	01111100b
		db	00001000b
		db	00010000b
		db	00100000b
		db	01111100b
		db	00000000b

		db	00101000b		; 219 - ¨ (dvojtečka)
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00101000b		; 220 - ˇ (háček)
		db	00010000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00000000b		; 221 - německé ostré s (B)
		db	00110000b
		db	01001000b
		db	01110000b
		db	01001000b
		db	01001000b
		db	01010000b
		db	01000000b

		db	00000000b		; 222 - malá gama
		db	00000000b
		db	00000000b
		db	00111100b
		db	00000100b
		db	00000100b
		db	00000100b
		db	00000000b

		db	00010000b		; 223 - stříška
		db	00101000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00000100b		; 224 - čárka
		db	00001000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00000100b		; 225 - Á
		db	00001000b
		db	00111100b
		db	01000010b
		db	01111110b
		db	01000010b
		db	01000010b
		db	00000000b

		db	00000000b		; 226 - mezera
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00100100b		; 227 - Č
		db	00011000b
		db	00111100b
		db	01000010b
		db	01000000b
		db	01000010b
		db	00111100b
		db	00000000b

		db	01001000b		; 228 - Ď
		db	00110000b
		db	01111000b
		db	01000100b
		db	01000010b
		db	01000100b
		db	01111000b
		db	00000000b

		db	00100100b		; 229 - Ě
		db	00011000b
		db	01111110b
		db	01000000b
		db	01111100b
		db	01000000b
		db	01111110b
		db	00000000b

		db	00001000b		; 230 - Ŕ (R s čárkou)
		db	00010000b
		db	01111100b
		db	01000010b
		db	01111100b
		db	01000100b
		db	01000010b
		db	00000000b

		db	00000000b		; 231 - mezera
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00100100b		; 232 - Ü
		db	00000000b
		db	01000010b
		db	01000010b
		db	01000010b
		db	01000010b
		db	00111100b
		db	00000000b

		db	00000100b		; 233 - Í
		db	00001000b
		db	00111110b
		db	00001000b
		db	00001000b
		db	00001000b
		db	00111110b
		db	00000000b

		db	00011000b		; 234 - Ů 
		db	00011000b
		db	01000010b
		db	01000010b
		db	01000010b
		db	01000010b
		db	00111100b
		db	00000000b

		db	00001000b		; 235 - Ĺ (L s čárkou)
		db	01010000b
		db	01000000b
		db	01000000b
		db	01000000b
		db	01000000b
		db	01111110b
		db	00000000b

		db	00101000b		; 236 - Ľ (L s háčkem)
		db	01010000b
		db	01000000b
		db	01000000b
		db	01000000b
		db	01000000b
		db	01111110b
		db	00000000b

		db	00100100b		; 237 - Ö
		db	00000000b
		db	00111100b
		db	01000010b
		db	01000010b
		db	01000010b
		db	00111100b
		db	00000000b

		db	00100100b		; 238 - Ň
		db	00011000b
		db	01000010b
		db	01100010b
		db	01011010b
		db	01000110b
		db	01000010b
		db	00000000b

		db	00000100b		; 239 - Ó
		db	00001000b
		db	00111100b
		db	01000010b
		db	01000010b
		db	01000010b
		db	00111100b
		db	00000000b

		db	00011000b		; 240 - velké UO (O se stříškou)
		db	00100100b
		db	00000000b
		db	00111100b
		db	01000010b
		db	01000010b
		db	00111100b
		db	00000000b

		db	00100100b		; 241 - Ä
		db	00000000b
		db	00111100b
		db	01000010b
		db	01111110b
		db	01000010b
		db	01000010b
		db	00000000b

		db	00100100b		; 242 - Ř
		db	00011000b
		db	01111100b
		db	01000010b
		db	01111100b
		db	01000100b
		db	01000010b
		db	00000000b

		db	00100100b		; 243 - Š
		db	00011000b
		db	00111100b
		db	01000000b
		db	00111100b
		db	00000010b
		db	01111100b
		db	00000000b

		db	00100100b		; 244 - Ť
		db	00011000b
		db	11111110b		; zde je adresa 0efch, ale volá se kód v ZX ROM, ne zde
		db	00010000b
		db	00010000b
		db	00010000b
		db	00010000b
		db	00000000b

		db	00001000b		; 245 - Ú
		db	00010000b
		db	01000010b
		db	01000010b
		db	01000010b
		db	01000010b
		db	00111100b
		db	00000000b

;--------------------------------------------------------------------------------------------------
; #0f0a 3850 (znak 246)
; Zde není znak, zde je vstupní bod, který se trefil do jedné z pozic pro znaky. 
; Před vstupním bodem jsou dva byty, jako výplň pro případ posunutí předchozího kódu.
; Celé to musí zabírat spolu s instrukcemi vstupního bodu 8 bytů, stejně jako znaky okolo.

		db	0
		db	0

; hlavní vstupní bod - voláno z příkazu LPRINT přes 0EF4: THE 'COPY-LINE' SUBROUTINE
; musí být na adrese #0f0c 3852

		org	3852

		in      a,(0fbh)		; stejný in jako v ROM -> přistránkování zx-centroface ROM
		nop				; počkej 4T
		jp	START			; a skoč na začátek

; #0f0c 3852	v ZXROM součást podprogramu COPY-LINE od #0ef4, resp. COPY-L-2 od #0f0c (výpis ROM strana 57)
;		z portu (#FB) se čte stav tiskárny ZX-Printer
;		mělo by být nastaveno carry, protože nenastal BREAK
;		a v registru D by měl být stav portu (#FB), ze kterého ZX ROM čte krátce předtím (prý 0, nebo 2)
;
; A_3852	in	a,(0fbh)		; COPY-L-2 - instrukce in a,(#fb) z ZX ROM způsobí přestránkování sem
; A_3854	add	a,a			; zx-centroface reaguje na čtení portu a zároveň na běh 
; A_3855	ret	m			; programu v této oblasti
;		...

;--------------------------------------------------------------------------------------------------

		db	00001000b		; 247 - É
		db	00010000b
		db	01111110b
		db	01000000b
		db	01111100b
		db	01000000b
		db	01111110b
		db	00000000b

		db	00010000b		; 248 - A s opačnou čárkou
		db	00001000b
		db	00111100b
		db	01000010b
		db	01111110b
		db	01000010b
		db	01000010b
		db	00000000b

		db	00001000b		; 249 - Ý
		db	10010010b
		db	01000100b
		db	00101000b
		db	00010000b
		db	00010000b
		db	00010000b
		db	00000000b

		db	00100100b		; 250 - Ž
		db	00011000b
		db	01111110b
		db	00000100b
		db	00011000b
		db	00100000b
		db	01111110b
		db	00000000b

		db	00100100b		; 251 - ¨ (přehláska)
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00100100b		; 252 - ˇ (háček)
		db	00011000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

		db	00000000b		; 253- německé ss (B)
		db	01111000b
		db	01000100b
		db	01111000b
		db	01000100b
		db	01000100b
		db	01011000b
		db	01000000b

		db	00000000b		; 254 - šipka dolů
		db	00010000b
		db	00010000b
		db	00010000b
		db	01010100b
		db	00111000b
		db	00010000b
		db	00000000b

		db	00011000b		; 255 - stříška
		db	00100100b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b
		db	00000000b

;--------------------------------------------------------------------------------------------------
; #0f5a grafická předloha pro kód 127 - (c)

FONT_COPYRIGHT	db	00111100b
		db	01000010b
		db	10011001b
		db	10100001b
		db	10100001b
		db	10011001b
		db	01000010b
		db	00111100b

;--------------------------------------------------------------------------------------------------
; #0f62 3938	chyba Report "B - integer out of range"

MSG_OUTOFRANGE	call	CALL_NEXTADDR		; pokračuj v ZX ROM na adrese za CALL
		dw	046ch			; Report B - integer out of range. 

; #0f67 3943	chyba Report "L - BREAK into program"

MSG_BREAK		call	CALL_NEXTADDR		; pokračuj v ZX ROM na adrese za CALL
		dw	1b7bh			; Report L - BREAK into program.

;--------------------------------------------------------------------------------------------------
; odsud kopie 25 (#19) bajtů na 5b20h (až včetně bytu na 0F84)

; standardní rutina
A5b20_0f6c	ld	de,0efch		; adresa obslužného podprogramu pro kanál 3
A5b23_0f6f	jp	0a80h			; skok do ZX ROM na #0A80 PO_CHANGE

; příchozí znak je parametr (TAB, AT)
A5b26_0f72	ld	b,a			; znak do B
A5b27_0f73	call	ZXCENTROF_ROM		; rutina připojení ROM interface
A5b2a_0f76	call	PRINT_ATTAB_NUM		; zpracování čísla za TAB,AT a obnovení tiskové rutiny na 5B20

; návrat s odpojením ROM
RET_TO_ZXROM	equ	5b2dh

A5b2d_0f79	push	af			; uschovej A
A5b2e_0f7a	in	a,(7bh)			; odpoj ROM interface
A5b30_0f7c	pop	af			; obnov A
A5b31_0f7d	ei				; povol přerušení
A5b32_0f7e	ret				; a návrat

; podprogram připojení ROM interface

ZXCENTROF_ROM	equ	5b33h

A5b33_0f7f	push	af			; uschovej A
A5b34_0f80	di				; zákaz přerušení
A5b35_0f81	in	a,(0fbh)		; připni ROM interface
A5b37_0f83	pop	af			; obnov A
A5b38_0f84	ret				; a návrat

;--------------------------------------------------------------------------------------------------
; #0f85 3973	text - odsud víceméně volné místo, netiskne se

TXT_CREDITS	db	"SHOULD YOU HAVE ANY PROBLEM WITH THE DEVICE PLEASEPHONE:PRAG 376120 Mr.Dan."

; #0fd0 4048	verze
TXT_VERSION	db	"VERSION 1.6"

; #0fdb 4059	bordel po předchozí verzi
		db	"RSION 1.5"

; zbývající prostor do 2048 bytů

		db	0,0,0,0,0,0,0,0
		db	0,0,0,0,0,0,0,0
		db	0,0,0,0,0,0,0,0
		db	0,0,0,0


;--------------------------------------------------------------------------------------------------
; Systémové proměnné (využívané)
;
; FLAGS		23611 #5C3B	8b	různé příznaky pro práci Basicu, blíže nespecifikovatelné
;
; PPC		23621 #5C45	16b	číslo právě vykonávaného řádku
;
; UDG		23675 #5C7B	16b	adresa definice znaků UDG
;
;--------------------------------------------------------------------------------------------------
; FLAGS2	23658 #5c6a	8b	další příznaky používané při práci Basicu. Bit 3 této
;		(iy+30h)		systémové proměnné určuje, zda je zapnutý caps lock.
;
; bit 0 - Reset when the screen is clear
; bit 1 - Set when the printer buffer is in use
; bit 2 - Set when in quotes during line parsing
; bit 3 - Set when CAPS LOCK is on
; bit 4 - Set when using channel K (keyboard)
; bit 5 - Unused
; bit 6 - Unused
; bit 7 - Unused
;
; ZX-Centroface využívá BASICem nevyužité 3 bity k uložení typu zvolené tiskárny 0..7.
; Význam ostatních bitů a jejich hodnoty musí zůstat nezměněny.
;
;--------------------------------------------------------------------------------------------------
; P_POSN	23679 #5c7f	8b	číslo sloupce v tiskové vyrovnávací paměti 
;		(iy+45h)
;
; ZX-Centroface používá ke stejnému účelu, jako ZX Printer, k určení X pozice tisknutého znaku.
;
;--------------------------------------------------------------------------------------------------
; PRCC		23680 #5c80	16b	adresa v tiskovém bufferu, na kterou se zapíše další
;		(iy+46h)		znak při tisku na tiskárně. Vyšší bajt na adrese 23681,
;					obsahuje vždy hodnotu 91 (desítkově).
;
;--------------------------------------------------------------------------------------------------
; NMIADD	23728 #5CB0	16b	adresa	rutiny obsluhující NMI. U ZX Specter 48K/48K+/128K+/+2 je v ROM chyba,
;					takže pokud tato systémová proměnná obsahuje 0, provede se reset počítače,
;					jinak neprovede nic
;
; (iy+77h) 	23729 #5cb1	druhý bajt v NMIADD je použitý pro uchování konfigurace ZX -Centroface
;
; bit 7 - určuje textový vs grafický tisk a zvětšení grafického tisku
; bit 6 - určuje textový vs grafický tisk a zvětšení grafického tisku
; bit 5 - určuje textový vs grafický tisk a zvětšení grafického tisku
; bit 4
; bit 3 - v kombinaci s bitem 1 určuje LF/CRLF
; bit 2 - zapíná/vypíná TOKENy (tisk příkazů BASICu)
; bit 1 - v kombinaci s bitem 1 určuje LF/CRLF
; bit 0
;


;--------------------------------------------------------------------------------------------------
; poprogram ZX ROM #22b0 je součást #22AA "PIXEL-ADD"
;
; #22b0		ld	b,a		; souřadnici Y zkopíruj do B
;		and	a		; resetuj carry flag
;		rra			; narotuj carry flag zleva -> v A bude 0 a původní bity 7, 6, 5, 4, 3, 2, 1
;		scf			; nastav carry flag
;		rra			; narotuj carry flag zleva -> v A bude 1 0 a původní bity 7, 6, 5, 4, 3, 2
;		and	a		; resetuj carry flag
;		rra			; narotuj carry flag zleva -> v A bude 0 1 0 a původní bity 7, 6, 5, 4, 3
;		xor	b
;		and	11111000b	; vynuluj dolní 3 bity, dalším XOR se obnoví horních 5 bitů a zbudou změněné jen dolní 3
;		xor	b		; A bude obsahovat 64 + 8*INT(b/64) + (b mod 8) (0 1 0 b7 b6 b5 b2 b1 b0)
;		ld	h,a		; vyšší byte adresy je hotov, ulož do H
;		ld	a,c		; souřadnici X zkopíruj do A
;		rlca
;		rlca
;		rlca			; A obsahuje bity 2 1 0 7 6 5 4 3 z C
;		xor	b
;		and	11000111b	; vynuluj bity 5, 4, 3, do nich se vloží bity 5, 4, 3 ze souřadnice Y
;		xor	b
;		rlca
;		rlca			; v A bude 32*INT(b/(b mod64)/8)+INT(x/8)
;		ld	l,a		; nižší byte adresy je hotov, ulož do L
;		ld	a,c		; souřadnici X do A
;		and	00000111b	; ponech jen dolní tři bity = číslo bitu v bytu
;		ret
;
; VSTUP		A = souřadnice Y, C = souřadnice Y
; VÝSTUP	adresa v HL, číslo bitu v A
;--------------------------------------------------------------------------------------------------