;=========================================
;
;        modul BIOS pro CPM
;           (verze 4.0)
;
;=========================================
;
;
.cref
.z80
;
aseg
	org	100h
	jp	pret
;
	org	01200h
;
.phase	0ec00h
;
;
bte:
ccp  	equ	bte-01600h	;start. adr. ccp
bazadr	equ	2430h		;pocatek znak. gen. v ramcard
bdos	equ	bte-0dfah	;poc. bdos
sinic	equ	080h		;iniciace stacku
delsys	equ	115d		;delka ccp+bdos+adre-
				;sar+cmt.com v sekt.
pccp	equ	02100h		;pocatek ccp po load
bdstpa	equ	1		;stopa ccp
bdsec	equ	13d		;sector ccp
sptrmc	equ	16d		;pocet sektoru na stopu v ramc.
rrbpi	equ	0fdh		;rid. reg.pio b
papio	equ	0feh		;pa pio z80
pbpio	equ	0ffh		;pb pio z80
pa55	equ	0d0h
pb55	equ	0d1h		;adresy 8255
pc55	equ	0d2h
rr55	equ	0d3h
setzer	equ	0f8h		;nast. adr. 00 v ramc.
inrmc	equ	0f9h		;cteni z ramcard (in)
outrmc	equ	0fah		;zapis do ramc.
setadr	equ	0ebh		;nast. adr. v ramc.
setpag	equ	0f9h		;nast. stranky v ramc.(pouze out)
delst	equ	0800h		;pocet byte stopy v ramc.
delsc	equ	080h		;delka sektoru v ramc.
drselp	equ	094h		;drive select port
comreg	equ	090h		;prikazovy registr WD2797
stareg	equ	090h		;stavovy reg. WD 2797
trkreg	equ	091h		;registr stopy WD 2797
datreg	equ	093h		;datovy reg. WD 2797
secreg	equ	092h		;reg. sektoru WD 2797
;
;
	jp	boot		;stud. start
wbte:	jp	wboot		;teply start
	jp	const		;stav konzoly
	jp	conin		;vstup zn. z konz.
	jp	conout		;vyst. zn. na konz.
	jp	list		;vyst. na tisk.
	jp	badio		;vyst. na der.
	jp	badio		;vstup ze snim.
	jp	dhome		;stopa 0
	jp	sldskd		;vyber disk
	jp	settrk		;nastav stopu
	jp	setsec		;nastav sektor
	jp	stdmad		;nastav adr. dma
	jp	read		;cti sektor
	jp	write		;zapis sektor
	jp	nsff		;stav tiskarny? Vraci 0ffh.
	jp	setran		;transformuj sektor
;
;
	defb	"Modul BIOS "
	defb	"(C) Marty "
identi:	defb	"1990 v4"
	defb	0		;interrupt musi zacinat
;				;na sude adrese
;
;
vint:	defw	rtint		;interrupt
rtint:	reti
	defs	6		;zona prer. vektoru
;
;
;nasleduji parametry, ktere se modifikuji pri
;studenem startu pri iniciaci mechanik nebo
;pomocnymi programy v CP/M
;
;prirazeni konkretnich mechanik logickym vystupum:
;(deje se pres port 74174)
;
typ0me:	defb	80h		;ramcard
	defb	01h		;5 1/4'
	defb	32h		;8'
	defb	04h		;5 1/4'
	defb	08h		;5 1/4'
;
;tabulka parametru pro prikaz seek, restore a pod.:
;bit0=r0,bit1=r1,bit3=V,bit4=h
;poradi urceno v tabulce typ0me.
;dalsi bity musi byt nulove.
;
typ0sk:	defb	0ch,0ch,0ch,0ch,0ch
;
;tabulka poctu fyz. sektoru na stopu disk. jednotek:
;(na jedne strane)
;
sec0me:	defb	16,09,26,09,09
;
;pocet vet po 128 byte v jednom fyz. sektoru:
;
seccap:	defb	1,4,1,4,4
;
;tabulky prozatimne nadefinovanych parametru
;disket (vcetne ramcard):
;
;tabulka ramcard:
;
dph0:	defw	0,0,0,0		;tabulka dph
	defw	dirbuf		;adr. vyr. pameti
	defw	dpb0		;adr. tab. dpb
	defw	csv0		;adr. zony k. souc.
	defw	alv0		;zona alok. vekt.
;
;tabulka 5 1/4', 18sekt/st. (pro obe str.), ds, dd,
;80 stop na stranu:
;
	defw	0,0,0,0
	defw	dirbuf
	defw	dpb1
	defw	csv1
	defw	alv1
;
;tabulka 8', 26sekt/stopu,ss,sd:
;
	defw	xlt		;prekladova tabulka
	defw	0,0,0
	defw	dirbuf
	defw	dpb2
	defw	csv2
	defw	alv2
;
;tabulka 5 1/4', 18sekt/st., ds, dd,
;40 stop na stranu:
;
	defw	0,0,0,0
	defw	dirbuf
	defw	dpb3
	defw	csv3
	defw	alv3
;
;tabulka 5 1/4', 18sekt/st., ds, dd,
;40 stop na stranu:
;
	defw	0,0,0,0
	defw	dirbuf
	defw	dpb4
	defw	csv4
	defw	alv4
;
;nasleduji tabulky dpb;pro kazdou me-
;chaniku je umyslne deklarovana vlastni
;tabulka dpb-to umozni definovat ctyri
;ruzne disketove mechaniky (patou je
;ramcard).
;
;ramcard:
;
dpb0:	defw	sptrmc		;spt
	defb	3		;bsh
	defb	7		;blm
	defb	0		;exm
	defw	241		;dsm
	defw	63		;drm
	defb	0c0h		;al0
	defb	0		;al1
	defw	16		;cks
	defw	6		;off=12 kb pro syst.
;
;5 1/4',18 sec/stopu (pro obe strany), ds,dd,
;80 stop na stranu:
;;
dpb1:	defw	72		;spt
	defb	4		;bsh
	defb	15		;blm
	defb	0		;exm
	defw	354		;dsm
	defw	191		;drm
	defb	0e0h		;al0
	defb	0		;al1
	defw	48		;cks
	defw	1		;off
;
;8', 26sec/stopu, ss,sd:
;(pozor! do vyhrazeneho mista se nevejde
;system!)
;
dpb2:	defw	26		;spt
	defb	3		;bsh
	defb	7		;blm
	defb	0		;exm
	defw	242		;dsm
	defw	63		;drm
	defb	192		;al0
	defb	0		;al1
	defw	16		;cks
	defw	2		;off
;
;5 1/4',18 sec/stopu (pro obe strany), ds,dd,
;40 stop na stranu:
;
dpb3:	defw	72		;spt
	defb	4		;bsh
	defb	15		;blm
	defb	1		;exm
	defw	174		;dsm
	defw	127		;drm
	defb	0c0h		;al0
	defb	0		;al1
	defw	32		;cks
	defw	1		;off
;
;5 1/4',18 sec/stopu (pro obe strany), ds,dd,
;40 stop na stranu:
;
dpb4:	defw	72		;spt
	defb	4		;bsh
	defb	15		;blm
	defb	1		;exm
	defw	174		;dsm
	defw	127		;drm
	defb	0c0h		;al0
	defb	0		;al1
	defw	32		;cks
	defw	1		;off
;
;prekladova tabulka:
;
xlt:	defb	1,7,13,19,25,5,11,17
	defb	23,3,9,15,21,2,8,14
	defb	20,26,6,12,18,24,4,10
	defb	16,22
;
;
;vstupni iniciace
;--------------------------------------
;
;provede vstupni iniciaci, povoli
;preruseni, nastavi mod zobrazeni
;
;
boot:	di
	im	2
	xor	a
	ld	sp,sinic	;nast. stacku
	out	(0e0h),a	;ram 0-8k
	out	(0e1h),a	;ram e000-ffff
	ld	(flags),a
	ld	(pklav),a	;norm. znaky
	ld	(fbeep),a	;beep ano
	ld	(lselby),a	;minuly vybr. disk
	ld	(pcbln),a
	ld	a,0bh		;neexistujici mod
	ld	(setmod),a	;neexistujici mod zobraz.
	call	normal		;normalni intenzita znaku
	call	norzob		;normalni zobrazeni
	ld	a,4		;mod zobrazeni
	call	inmod		;dilci nastaveni
	ld	hl,081h		;nast. io b.
	ld	(03h),hl	;akt. jedn. a uziv.
	ld	hl,vint		;prer. v. pa pio
	ld	a,h		;nastav. vys. byte
	ld	i,a
	ld	a,l		;nizsi byte
	out	(rrbpi),a	;rr por. b. z80 pio
	ld	a,0fh		;port b pio vystup
	out	(rrbpi),a
	ld	de,nap4		;ident. zprava
	call	dachz
wboot:	di
	ld	sp,sinic
	ld	a,(border)	;obnova borderu
	call	setbor
	call	normal		;normalni intenzita znaku
	call	norzob		;normalni zobrazeni
	ld	hl,tbrno	;ridici znaky con. brno
	call	setrzn
	xor	a
	ld	(unacnt),a	;pocitadlo neal. zap.
	ld	hl,pcbln
	res	1,(hl)		;roll mode obrazovky
	dec	a		;a=ff
	ld	(ftrep),a	;klav. nestlacena
	ld	hl,bcurtr	;akt. stopy
	ld	b,5		;pocet parametru
fillzr:	ld	(hl),a		;plneni neexistu-
	inc	hl		;jici stopou
	djnz	fillzr		;pro iniciaci-7bit
	ld	hl,flags	;musi byt na h
	res	3,(hl)		;vyr. pam. neaktivni
	ld	a,25		;poc. radku
	ld	(numrad),a	;nastaveni
	im	2		;prer.	mod
	ld	a,4		;zakaz prer.
	out	(rr55),a	;od hodin
	ld	hl,aktdsk	;aktualni disk
	ld	(hl),0		;musi byt ramcard
	inc	hl		;stopa diskety
	ld	(hl),bdstpa	;nast. stopy
	inc	hl		;sektor
	inc	hl
	ld	(hl),bdsec	;nast. sekt.
	ld	hl,ccp		;pocatek ccp
	ld	b,44		;delka v sekt.
	call	movrmc		;nataz. bdos+ccp
	jr	nz,bderr	;pri chybe
	ld	a,0c3h		;instr. jp
	ld	hl,wbte		;teply start
	ld	(00h),a		;jp wboot
	ld	(01h),hl
	ld	hl,bdos		;poc. bdosu
	ld	(05h),a
	ld	(06h),hl
	ei
	call	bel		;zvuk. vyst.
	ld	a,(04h)		;akt.jedn.+uziv.
	ld	c,a
	jp	ccp		;pocatek ccp
;
;
bderr:	ld	de,nap5		;chyb. hlaseni
	call	bioerr		;napis
	call	conin		;ceka na klavesu
	ld	sp,04h		;chybovy navrat
	ld	hl,0e9h		;jp (hl)
	push	hl
	ld	hl,0e3d3h	;out (0e3)
	push	hl		;nahore eprom
	ld	hl,0e800h	;vstup monit.
	rst	00h
;
;
;nacte bdos + ccp z diskety nebo ramc.
;-------------------------------------------
;
;vstup: hl=adresa uklad. progr. v oper. pam.
;       bc=delka progr. v "sekt." (po 128b.).
;       sets a setrk urcuji misto na diskete,
;       odkud se bude natahovat program,disketa
;	je urcena prom. aktdsk.
;vystup: ulozi program od (hl).a=0 pri
;       uspes. natazeni, a=1 pri chybe.
;meni: af,hl,de,bc
;
;
movrmc:	ld	(setdm),hl	;adr. dma
allcab:	push	bc
	call	read		;cteni sekt.
	pop	bc
	and	a
	ret	nz		;pri chybe
	ld	de,080h		;dalsi adr.
	ld	hl,(setdm)	;minul. adr.
	add	hl,de
	ld	(setdm),hl	;naplneni pr.
	ld	hl,setsc	;prom. sekt.
	inc	(hl)		;inc sektoru
	ld	a,(dpb0)	;poc. sekt. na st.
	cp	(hl)		;"za" stopu?
	jr	nz,deltes	;pri nevycerpano
	ld	(hl),0		;prvni sekt.
	dec	hl		;adr. seltrk
	dec	hl
	inc	(hl)		;inkrement stopy
deltes:	djnz	allcab		;dalsi sektor
	xor	a		;uspesny navrat
	ret
;
;
;      nastavi border
;--------------------------------------------
;
;vstup: a=byte pro nastaveni
;vystup: nastavi border
;meni: bc
;
;
setbor:	ld	bc,06cfh	;border col. reg.
	out	(c),a		;nast. borderu
	ld	(border),a	;nastaveni prom.
	ret
;
;
;iniciacni nastaveni vybraneho modu 1 nebo 3
;-----------------------------------------
;
;vstup: a= zobrazeni 1-4 (=mod 1 a 3)
;vystup:  nast. zvol. zobr, scroll cele ob-
;       razovky, cls, zakl. nast. palet
;       dle (paltb).
;       pri chybnem nast. modu c=1.
;meni: af,hl,de,bc
;
;
inmod:	call	necur		;zhasnuti kur.
	ld	e,a		;odl. modu
	cp	03h		;mod 3 ?
	ld	c,085h		;rov. zap.
	ld	d,80		;poc. zn. na rad.
	ld	a,6		;mod 4
	jr	nc,zn80		;ma-li byt 80 zn.
	xor	a		;a=0
	ld	c,083h		;mod 1
	ld	d,40		;40 zn. na rad.
zn80:	out	(0ceh),a	;volba modu
	ld	a,d		;poc. zn. na rad.
	ld	(numzn),a	;nast. prom.
	ld	a,c		;zap. mozmosti
	ld	(provza),a	;nast. prom.
	ld	a,(rovza)	;neni vyssi intenzita?
	cp	81h		;zobrazeni s vyssi inten.?
	call	nz,inten	;nastavi nove roviny
	dec	e		;porovnani s minul. modem
	ld	a,(setmod)
	xor	e
	and	0feh		;odliseni 40 a 80 zn. modu
	push	af
	ld	a,e		;obn. modu
	ld	(setmod),a	;novy mod
	ld	hl,borbuf	;border buf.
	ld	b,0
	ld	c,a
	add	hl,bc		;adr. v buf.
	ld	d,(hl)		;prevz. byte
	rlca	;x2
	rlca	;x4
	add	a,c		;x5
	ld	hl,paltb	;buf. palet
	ld	c,a
	add	hl,bc		;adr. v buf.
	ld	bc,05f0h	;adr. pal. reg.
	otir			;nast.	palet
	ld	a,d		;nast. bord.
	call	setbor
	xor	a		;neni cad konz.
	ld	(altm),a
	pop	af
	ld	a,81h		;zadny znak
	ret	z
	ld	hl,0		;nast. scrol. reg.
	ld	(scofs),hl	;ulozeni
	ld	hl,escrb	;kon. scrl. buf.
	ld	bc,06cfh	;adr. registru
	otdr	;vyslani
	ld	c,0ch
	call	outcrt		;smazani cele obraz.
	ld	a,0dh		;cr
	ret
;
;
paltb:	defb	040h,00h,01fh,02eh,030h	;z1-c,b,sv. zluta,c
	defb	040h,0fh,011h,022h,03fh	;z2-b,m,t.cer.,b
	defb	040h,00h,01fh,02eh,030h	;z3-c,b,sv. zluta,c
	defb	040h,0fh,011h,022h,03fh	;z4-b,m,t.cer.,b
;
borbuf:	defb	0fh,01h,0fh,01h		;b,m,b,m
;
	defb	00h,00h,07dh,00h	;pro scrl. reg.
escrb:	defb	07dh
;
;
;vystup znaku v ascii na konzolu
;------------------------------------
;
;
;vstup: ascii znak (i ridici) v c
;vystup: tisk znaku na obrazovku
;meni: af,hl,de,bc
;
;
conout:	call	conper		;test prirazeni
outcrt:	push	bc
	call	necur		;zhasnuti kurzoru
	pop	bc
	ld	a,(altm)	;prime rizeni kurs.?
	and	a
	jp	nz,jealt	;skok na pr.riz.
	ld	a,c
	sub	020h		;ridici znaky?
	jr	c,rznak		;skok pri ano
	cp	05fh		;znaky ascii?
	jp	z,exrzn		;zamena ridicich zn.
	jr	c,chtest	;skok na tisk znaku
	cp	0dbh		;>z s hackem?
	ret	nc		;pokud ano
	sub	41h
	cp	60h
	ret	c		;neplatne znaky
chtest:	ld	hl,(dfbin)	;misto tisku
	call	outch		;vystup znaku
	ld	hl,(dfcc)	;suradnice vys. zn.
cright:	inc	l		;dalsi pozice
	ld	a,(numzn)	;pocet zn./rad.
	dec	a		;posl. sour.
	cp	l		;konec radku?
	jr	nc,setdf	;skok na nast. uk.
	ld	l,0		;prvni pozice
lf:	inc	h
	ld	a,(pnumrd)	;posledni radek?
	dec	a
	cp	h		;radky vycerpany?
	jr	nc,setdf	;nast. ukaz.
	ld	h,a		;nast. posl. rad.
	ld	a,(pcbln)	;je roll mode?
	and	2
	jr	z,mroll		;skok pri roll mode
	ld	h,0		;prvni radek
mroll:	push	hl
	call	z,rolup		;scroll pouze pri roll modu
	pop	hl
setdf:	ld	(dfcc),hl	;ulozeni ukazov. kur.
stdf:	call	dfthl		;pris. adr. ve vram
	ld	(dfbin),hl	;uloz. bin. adr.
	ret
;----------------------------------
rznak:	add	a,20h
	add	a,a		;x2
	ld	hl,tabri	;tab. rid. zn.
	ld	b,0		;vypocet poz.
	ld	c,a
	add	hl,bc		;adresa v tab.
	ld	c,(hl)
	inc	hl
	ld	b,(hl)
	ld	hl,(dfcc)	;misto tisku
	push	bc		;rozeskok
return:	ret
;
tabri:	defw	return,home,home,return
	defw	inten,return,normal
	defw	bel,cleft,tabul
	defw	lf,cdwn,ff
	defw	cr,invzob
	defw	norzob,return,rollm
	defw	pagem,return,eos,cright
	defw	eol,return
nastrz:	defw	cup,return
	defw	cright,esc,return,return
	defw	return,invez
offesc:	defb	1		;offset escape
pnumrd:	defb	25		;pom. pocet radku
drzn:	defw	t2702		;poc. tab. dal. rid. zn
;
inten:	ld	a,(provza)	;nastavi odlisnou intenzitu
	and	0feh		;(barvu)
	jr	setint
;
normal:	ld	a,81h		;nastavi normalni intenzitu
setint:	ld	(rovza),a
	ret
exrzn:	ld	hl,(drzn)	;nastavi dalsi ridici sadu
				;pocatek tabulky dalsich
				;ridicich znaku
setrzn:	ld	de,nastrz	;sem se bude presouvat
	ld	bc,drzn+2-nastrz;delka
	ldir			;presun
	ret
;
rollm:	ld	hl,pcbln	;nastaveni roll mode
	res	1,(hl)		;a obnoveni kurzoru
	ret
;
pagem:	call	necur		;vypnuti kurzoru a nastaveni
	ld	hl,pcbln	;page mode
	set	1,(hl)
	ret
;
tabul:	ld	c," "		;tabulator o 8 pozic
	call	outcrt
	ld	a,(dfcc)
	and	7
	ret	z		;navrat,je pozice tabulatoru
	ld	c,9		;znovu test na pozici tab.
	jp	outcrt
cup:	ld	a,h		;kursor nahoru
	and	a		;posledni radek?
	ret	z
	dec	h		;posun k.
	jr	psetdf		;navrat
;
cdwn:	ld	a,(numrad)	;posl. radek?
	dec	a
	cp	h
	ret	z
	inc	h		;dalsi pozice
	jr	psetdf
;
cleft:	ld	a,l		;kursor doleva
	dec	l
	and	a		;prvni poz. v rad.?
	jr	nz,psetdf	;skok, neni-li
	ld	a,h		;pozice radku
	and	a		;prvni radek
	jr	z,home		;pocat. pol.
	ld	a,(numzn)	;poc. zn. na radek
	dec	a		;posledni poz. v r.
	ld	l,a
	dec	h		;predch. radek
	jr	psetdf		;nast. ukaz.
;
home:	ld	h,0		;poloha c. home
cr:	ld	l,0
psetdf:	jp	setdf
;
esc:	ld	a,2		;prima adr. cur.
	ld	(altm),a	;nast esc modu
	ret
jealt:	dec	a		;obsluha esc
	ld	(altm),a	;pro dalsi pruchod
	ld	hl,dfcc		;ukazov. tisku
	ld	d,0		;vypocet ukaz.
	ld	e,a
	add	hl,de		;ukaz. rad. nebo sl.
	ld	a,(offesc)	;pozice 0,0 je
	ld	b,a
	ld	a,c
	sub	b		;zadavana s ruznym offsetem
				;dle typu terminalu
	ret	c		;spodni mez
	ld	c,a		;zpet do c
	ld	a,(altm)	;sloupec?
	and	a
	ld	a,(numzn)	;test na druhe meze
	jr	z,pozvra	;pri sloupcich
	ld	a,(numrad)	;pocet radku
pozvra:	dec	a
	cp	c
	ret	c		;pri chyb. zadani
	ld	(hl),c		;ulozeni hodnoty
	ld	hl,(dfcc)	;ukaz. do hl
	jp	stdf		;nast. ukaz.
;
eol:	ld	a,(numzn)	;vymezer. do konce radku
	ld	c,a		;pocet znaku na radek
	ld	b,0
	sub	l		;pocet znaku do konce r.
	ret	z
	ld	d,a
	ld	hl,(dfbin)	;bin. poloha kurzoru
	di
	ld	a,(rovza)	;roviny zapisu
	or	080h
	out	(0cch),a
	ld	e,8
	in	a,(0e0h)	;vram
	ld	a,(typcls)	;cim se ma mazat
davym:	push	hl
	call	vymrad		;vymaz telev. radku
	pop	hl
	add	hl,bc		;dalsi adresa
	dec	e
	jr 	nz,davym
	in	a,(0e1h)	;zpet ram
	ei
	ret
vymrad:	ld	b,d
vymtr:	ld	(hl),a		;nulovani
	inc	hl
	djnz	vymtr
	ret
;
	defb	"ident akcep"	;vnitrni identifikace
;
ff:	call	home		;smazani obrazovky
	ld	h,0
	jr	pocrad
;
eos:	ld	a,l		;mazani od poz. kur.
	and	a		;poc.radku?
	jr	z,pocrad	;skok pri pocatku
	push	hl
	call	eol		;vymezer. do k. radku
	pop	hl
	inc	h
pocrad:	ld	a,019h		;max. poc. r.
	sub	h
	ret	z		;konec obr. ret
	ld	l,a		;vypocet zony
	ld	h,0
	add	hl,hl		;x2
	add	hl,hl		;x4
	add	hl,hl		;x8
	ld	b,h		;prevzeti delky
	ld	c,l
	call	clsp		;mazani
	ret
;
bel:	ld	hl,btab1	;zvuk. znameni
	ld	d,030h		;delka tonu
	ld	e,3		;pocet tonu
	call	cpbeep		;pipnuti
	ret
;
invzob:	xor	a		;inverzni zobrazeni
	jr	cszob
;
norzob:	ld	a,61h		;normalni zobrazeni
	jr	cszob
;
invez:	ld	a,(drucur)	;inverze znaku a pozadi,
cszob:	xor	61h		;kurzoru; je inverze?
	ld	(drucur),a	;zmena kurzoru
	ld	a,2fh		;instrukce cpl
	ld	hl,0ffffh	;pro druh mazani obrazovky
sendin:	ld	(setinv),a
	ld	(typcls),hl
	ret	z
	inc	hl		;hl=0
	xor	a		;nop
	jr	sendin
;
tbrno:	defw	cup,return	;ridici znaky brno
	defw	cright,esc,return,return
	defw	return,invez
	defb	1		;offset escape
	defb	25		;pom. pocet radku
	defw	t2702		;poc. tab. dal. rid. zn
;
t2702:	defw	cright,return	;ridici znaky 2702
	defw	cup,esc,return
	defw	home,eol,eos
	defb	20h		;offset escape
	defb	24		;pocet radku
	defw	tbrno		;tab. dalsich r. zn.
;
;
;      vysle souvisly ton
;---------------------------------
;
;vstup: d=delka tonu,e=pocet tonu,hl=adr. tabulky
;vystup: tony o stejne delce
;meni: af,hl,bc,de
;
;
cbeep:	ld	e,1
cpbeep:	ld	a,1		;zapnuti kanalu
	out	(rr55),a
	ld	b,3		;pocet parametru
	call	outby		;start tonu
	push	de
	ld	b,0		;zpozdeni
delb:	ex	(sp),hl		;casova smycka
	djnz	delb
	dec	d
	jr	nz,delb
	pop	de
	dec	e		;tony vycerpany?
	jr	nz,cpbeep
	ld	hl,btab2	;konec beepu
	ld	b,2		;dva param.
outby:	ld	a,(hl)		;co vyslat
	inc	hl
	ld	c,(hl)		;kam
	inc	hl
	out	(c),a		;vyslani byte
	djnz	outby		;cela serie
	ret
;
btab1:	defb	036h,0d7h,0cch,0d4h,018h,0d4h;f-3
	defb	036h,0d7h,093h,0d4h,012h,0d4h;a#-3
	defb	036h,0d7h,02ah,0d4h,025h,0d4h;a#-2
btab2:	defb	036h,0d7h,00h,0d3h
btab3:	defb	036h,0d7h,04ah,0d4h,09h,0d4h;a#-4
;
;
;      beep
;-------------------------------
;
;vstup: 0
;vystup: kratke pipnuti
;meni: hl,de,bc
;
;
beep:	push	af
	ld	a,(fbeep)	;povoleno pipnuti?
	dec	a
	ld	hl,btab3	;parametry
	ld	d,05h		;delka
	call	nz,cbeep	;pipnuti
	pop	af
	ret


;
;
;zapise znak v ascii do vram
;------------------------------------
;
;vstup: ascii znak v a
;vystup: zapis do vram na bin. pozici v hl
;meni: af,hl,de,bc
;
;
outch:	di
	ex	de,hl		;na (de) se bude ukladat
	ld	l,a		;rel. adresa v zn. gen.
	ld	a,(rovza)	;roviny zapisu
tisk:	ld	h,0
	out	(0cch),a	;writte form. reg.
	add	hl,hl		;x2
	add	hl,hl		;x4
	add	hl,hl		;x8 (1 znak = 8 byte)
	ld	bc,bazadr	;bazova adresa zn.gen
	add	hl,bc		;abs.adresa
	in	a,(setzer)	;nulova strana v ramcard
	ld	b,h		;nastaveni adresy v ramcard
	ld	c,setadr
	out	(c),l
	ld	hl,(numzn)	;pocet znaku na radek
	ld	h,0
	ex	de,hl
	in	a,(0e0h)	;zapnuti vram
	ld	b,8		;8 bitu
dara:	in	a,(inrmc)	;cteni byte
setinv:	cpl			;misto pro pripadnou inverzi
	ld	(hl),a		;ulozeni znaku
	add	hl,de		;dalsi pozice
	djnz	dara		;vsech 8 bytu
	in	a,(0e1h)	;vypnuti vram
	ei
	ret
;
;
;prepocet souradnic kursoru na adr. v vram
;-----------------------------------------
;
;vstup: sour. kursoru: h=radek, l=sloupec
;vystup  bin. adresa ve vram v hl
;meni: af,hl,de
;
;
dfthl:	ld	d,h		;poradi radku
	ld	e,0
	ld	a,l		;poradi sloupce
	ld	l,h		;poradi radku
	ld	h,e		;nulovani h
	add	hl,hl		;x2
	add	hl,hl		;x4
	add	hl,hl		;x8
	add	hl,hl		;x16
	add	hl,hl		;x32
	add	hl,hl		;x64
	add	hl,de		;x320=byte na 1 zn. rad.
	ld	d,e		;nulovani d
	ld	e,a		;pocet znaku vrad.
	ld	a,(numzn)	;
	cp	028h		;40zn. na radek?
	jr	z,ne80		;ano, skok
	add	hl,hl		;x640       (80 zn.)
ne80:	add	hl,de		;rel. adr. v vram
	set	7,h		;vram je od 8000h
	ret
;
;
;      inverze znaku ve vram
;------------------------------------
;
;vstup: 0
;vystup: inverze znaku kursorem
;meni: af,hl,de,bc
;
;
invz:	ld	a,(drucur)	;druh kursoru
	ld	de,(dfbin)	; sour. kursoru bin
	di
	ld	l,a		;rel. adr.
	ld	a,(rovza)	;rovina zapisu
	or	020h		;zapis jako xor
	and	07fh
	jr	tisk		;zapis do vram
;
;
;
;      blikani kursoru
;------------------------------------
;
;vstup: 0
;vystup: blika kursor
;meni: af,hl,de,bc
;
;
cblnk:	in	a,(pc55)	;bezi casovac?
	rlca
	rlca
	jr	c,nec1		;skok na zhas. kurs.
	xor	a
	out	(pa55),a	;nuluje timer
	cpl
	out	(pa55),a	;spusteni timeru
	ld	a,(pcbln)	;stav zobr. kursoru
	and	a
	ret	nz		;kurs. je zobr., ret
	jr	inv		;inverse kursoru
;
;
;      zhasne kursor
;------------------------------------
;
;vstup: 0
;vystup: zhasnuti kursoru
;meni: f,hl,de,bc
;
;
necur:	ld	h,a
nec1:	ld	a,(pcbln)	;stav kursoru
	bit	0,a
	ld	a,h		;obnoveni a
	ret	z		;kursor nesviti, ret
inv:	push	af
	ld	a,(pcbln)	;zmena stavu zob. k.
	xor	1
	ld	(pcbln),a
	call	invz		;inverse kurs.
	pop	af
	ret
;
;
;      hardwarovy roll nahoru
;----------------------------------------
;
;vstup: 0
;vystup: posun obrazu o jeden znak. radek
;        mezi start a end udaji offset reg.
;meni: af,de,bc,hl
;
;
rolup:	ld	hl,(scofs)	;ud. pro sc. of. reg.
	ld	de,028h		;roll o 1 znak. radek
	add	hl,de		;novy scroll offset
	push	hl
	ld	de,03e8h	;znak. del. scr. wdth
	and	a
	sbc	hl,de		;je uz max. rol. delka?
	pop	hl
	jr	nz,noscw	;skok, pokud ne
nulofs:	ld	hl,0		;nulov. scr. off. reg.
noscw:	ld	(scofs),hl	;uloz. nove hodnoty
wzp:	in	a,(0ceh)	;je zatemnov. pulz?
	and	040h		;maska
	jr	nz,wzp		;ceka se na zat. pulz
	di
	ld	bc,02cfh	;adr. scr. ofs. reg. 1
	out	(c),h		;nast. scr. offs. reg.
	dec	b		;scr. offs. reg. 2
	out	(c),l
	ei
	ld	bc,8		;maze posl. radek
	call	clsp
	ret
;
;
;      mazani obrazovky
;-----------------------------------------
;
;vstup: pocet ctyricetic (osmdesatic) b. v bc
;vystup: smazani obr. "odzadu" o "delce" v bc
;meni: af,bc,hl
;
;
clsp:	ld	a,(numzn)	;40 znaku na radek?
	cp	028h
	ld	hl,01f40h	;relat. delka vram
	jr	z,cls40		;skok pri 40 zn. na rad.
	sla	c		;bc x 2
	rl	b
	add	hl,hl		;x2 pro 80 zn. na rad.
cls40:	set	7,h		;abs. adr. ve vram
	ld	(prosp),sp	;uloz. ukazatele
	ld	(prosp-2),hl	;novy ukazatel
	ld	hl,(typcls)	;pro mazani
	ld	a,(rovza)	;roviny zapisu do vram
	or	080h		;zapis do nast. rov.
	out	(0cch),a	;wr. rol. reg.
nclr:	di
	ld	sp,(prosp-2)	;nastaveni ukaz.
	in	a,(0e0h)	;vram
	push	hl		;vlastni nulovani
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	push	hl
	in	a,(0e1h)	;ram
	ld	(prosp-2),sp	;ulozeni ukazatele
	ld	sp,(prosp)	;obnoveni puv. hodn.
	ei
	dec	bc
	ld	a,c		;vycerpan poc. radku?
	or	b
	jr	nz,nclr		;skok pri nevycerpano
	ret
;
;
;cte klav. konz. s cekanim na stisk klavesy
;-----------------------------------------------
;
;vstup: ceka na klavesu + repeat
;vystup: ascii kod v a a v lastk
;        misto vstupu je az conin
;        je-li prirazena klav. mz-800,
;       sejme f1-f5; f1-f4=m1-m4
;       zobr., f5=zmena fce beepu
;meni: af,hl,de,bc
;
;
nekl1:	pop	bc
conin:	xor	a		;nulov. promenne
	ld	(ftrep),a
nekl:	call	cblnk		;blikani kursoru
	call	ctekl		;cteni klavesnice
	cp	81h		;klavesa stlacena?
	jr	nz,jekl		;skok pri stlac. kl.
	ld	(lastk),a	;klavesa nestlacena
	jr	nekl		;cekani na klavesu
jekl:	ld	bc,0a00h	;zpozdeni
delay:	dec	c
	jr	nz,delay
	djnz	delay
	ld	c,a		;klav. do c
	ld	a,(pokl)	;navrat pro kl. f1-f5
	cp	72h
	ld	a,c
	jr	nc,fknvr
	call	ctekl		;cteni klavesnice
	cp	c		;souhlas obou cteni?
	jr	nz,nekl		;skok pri nesouhl.
	ld	a,(lastk)	;minula klavesa
	cp	c		;souhlasi?
	jr	z,klok		;skok pri shode
	ld	a,028h		;pro zpozdeni-nesh.
	jr	nesh		;skok pri neshode
klok:	push	bc
	ld	a,(pokl)	;poradi klavesy
	ld	c,a
smyc1:	call	ctekl		;cteni klav.
	ld	a,(pokl)	;porov. por. klav.
	cp	c		;souhlas sminulym?
	jr	nz,nekl1	;skok pr  nesouhl.
	call	rdtim		;vyprsel cas casovace?
	jr	nz,smyc1
	pop	bc
	ld	a,c		;znak do a
	ld	hl,takl		;bez repeat?
	ld	b,3		;jsou 3 r. znaky
look:	cp	(hl)
	jr	z,nacon		;r. znak nal., skok
	inc	hl		;dalsi pozice
	djnz	look
	ld	a,03h		;konstanta repeat
nesh:	ld	(konzp),a	;ulozeni
	ld	a,c		;v a je cteny znak
	call	beep		;kratke pipnuti
fknvr:	call	settim
	ld	(lastk),a	;ulozeni
	cp	080h		;inv. fce shift?
	ret	nz		;neni, navrat
	ld	a,(pklav)	;priznaky klav.
	xor	1		;inv. fce shift
	ld	(pklav),a	;ulozeni
nacon:	jp	conin
;
takl:	defb	03h,080h,01bh		;zn. bez rep:^C,shift,
					;esc
;
;
;nastavi casovac 2 a 3 8253 na odezvu danou promennou konzp
;----------------------------------------------------------
;
;vstup:	0
;vystup:casovac 2 nastaven na 00h, casovac 1 nastaven
;	na generaci jednoho pulzu za cas dany promennou
;	konzp (mod 4)
;meni:	bc,hl
;
;
settim:	push	af
	ld	hl,tab1tm	;tabulka parametru
	ld	b,3		;jejich pocet
	call	outby		;vyslani
	ld	c,0d6h
	ld	hl,sttim	;promenna
	ini			;cteni citace 2
	ini
	pop	af
	ret
;
tab1tm:	defb	078h,0d7h,00h,0d5h
konzp:	defb	04h,0d5h
;
;
;sejme stav citace 2 obvodu 8253
;--------------------------------
;
;vstup:	0
;vystup:a=0 pri zadanem stavu, jinak a<>0
;meni:	hl,af
;
;
rdtim:	push	bc
	ld	a,080h
	out	(0d7h),a		;cteni za chodu cit 2
	ld	c,0d6h
	in	a,(c)
	in	b,(c)
	ld	c,a
	ld	hl,(sttim)		;minuly stav citace
	dec	hl			;zadany stav
	and	a
	sbc	hl,bc			;souhlas?
	ld	a,h
	or	l
	pop	bc
	ret
;
;
;pruchozi cteni klavesnice mz-800
;--------------------------------------
;
;vstup: cteni klavesnice bez debou
;vystup: znak ascii a sluz. kody v a.
;        pri nastlaceno a=81h.
;        u f1-f5, viz cteni klav. s cekanim
;meni: af,de,hl
;
;
ctekl:	push	bc
	ld	bc,0f800h+pa55	; shift, ctrl,br.
	out	(c),b		;zapis do portu
	nop	;pauza
	in	a,(pb55)	;cteni sloupce
	push	af
	and	081h		;test na shift+break
	jr	nz,nebr		;skok, neni shift+break
	ld	a,3		;kod ctrl+C
retct:	pop	bc
	pop	bc
	ret
nebr:	bit	7,a
	ld	a,01bh		;prim. riz. kursoru
	jr	z,retct
	inc	b		;test na klavesy f1-f5
	ld	h,1		;sejme se sloupec f1-f5
	call	snima		;sejmuti sloupce
	jp	nz,zpfk		;skok pri stlaceni klav.
	ld	b,0f7h		;sejmuti klaves 0-63
	ld	h,8		;sejme se 8 sloupcu
	call	snima
	ld	(pokl),a	;uloz. por. kl.+1
	pop	de		;v d je sl. 8
	jr	z,nulv		;klavesa nestlacena
	ld	h,41		;offset alfabet. znaku
	ld	e,11h		;offset diakritiky
	ld	bc,tabsh	;tabulka siftovanych znaku
	bit	0,d		;je shift?
	jr	z,tectrl	;ano, skok
	ld	e,21h		;offset cislic
	ld	bc,tabnsh	;tabulka nasift. znaku
tectrl:	bit	6,d		;klavesa ctrl
	jr	z,ctrl		;skok pri ctrl
	ld	a,(pklav)	;prizn. byte kl.
	cp	01h		;ma byt inv. shift?
	ld	a,d
	jr	nz,notran
transf:	ld	a,d		;inv. shift (u pism.)
	xor	1
notran:	bit	0,a		;je shift?
	jr	nz,nequ		;skok, neni shift
	ld	h,73d		;tabulka shift. znaku
nequ:	call	prevd		;prevod na ascii
navrt:	pop	bc
	ret
ctrl:	call	prevd		;prevod na ascii
	cp	020h		;<sp?
	jr	c,navrt		;navrat se sluz. znaky
	cp	7fh		;delete?
	jr	z,navrt
	sub	40h
	jr	c,nulv		;pro znaky < 40h
	cp	20h
	jr	c,navrt		;pri platnych znacich
nulv:	ld	a,81h		;klavesa nestlacena
	jr	navrt		;navrat s 0 pro zn.<40h
;
;
;	zjisti poradi stlacene klavesy
;----------------------------------------------
;
;vstup:	c=adresa portu pa55, b=sloupec, od ktereho
;	se ma snimat, h=pocet sloucu, ktere se maji
;	sejmout
;vystup:l=poradi stlacene klavesy nebo nula pri nestl.
;meni:	hl,de,b,af
;
;
snima:	ld	l,0		;pro vysledek
	ld	e,1		;do e se pocita poradi
dalsl:	out	(c),b		;zapis sloupce
	nop	;pauza
	in	a,(pb55)	;cteni odezvy
	ld	d,8		;8 rad
dalra:	rlca	;test	bitu
	jr	c,nkla		;skok, neni-li kl. stlac.
	inc	l		;stlaceny dve klavesy?
	dec	l
	jr	nz,error	;chyba, stlaceny 2 klav.
	ld	l,e		;zachyceni stlacene klav.
nkla:	inc	e		;dalsi klavesa
	dec	d		;rady vycerpany?
	jr	nz,dalra	;skok, nejsou-li
	dec	b		;dalsi sloupec
	dec	h		;pocitadlo
	jr	nz,dalsl	;dalsi sloupec fyzicky
	ld	a,l		;nestlaceno?
	dec	l		;cislov. od nuly
	and	a
	ret
error:	xor	a
	ld	l,a
	ret
;
;
;      obslouzeni klaves f1-f5
;--------------------------------------
;
;
zpfk:	ld	d,a		;odlozeni
	ld	a,(pokl)	;predch. pruch. nestl?
	and	a
	jr	nz,navrf
	ld	h,020h		;pro cykl cteni
flk:	push	de
	ld	b,0		;cek. smycka
delf:	djnz	delf
	ld	bc,0f900h+pa55	;klav. f1-f5
	push	hl
	ld	h,1
	call	snima		;sejmuti
	pop	bc
	ld	h,b
	pop	af		;puvodni klavesa
	inc	l
	cp	l		;stejne klavesy?
	jr	nz,navrf	;pri nesouhlasu
	ld	d,a		;pro dalsi srovnani
	dec	h		;dekr. pocitadla
	jr	nz,flk		;skok, nevycerp. pr.
	ld	d,a		;odl. klav.
	add	a,072h		;poradi klavesy
	ld	(pokl),a	;ulozeni por. klavesy
	ld	a,d		;obnova a
	call	beep
	ld	hl,fbeep	;zmena zapnuti beepu
	cp	5		;ma byt zmena zap.
	jr	nc,invbep	;skok na inverzi beepu
	call	inmod		;nastaveni modu
	jr	nvrt
invbep:	jr	nz,navrf	;pri ostatnich klavesach
	ld	a,(hl)
	xor	1
	ld	(hl),a
navrf:	ld	a,81h		;zadne znaky ascii
nvrt:	pop	de
	jp	navrt		;navrat
;
;
;	prevod kodu klavesnice na ascii
;-------------------------------------------
;
;vstup: bc = poc. prevodni tabulky pro klavesy 0-16
;	a 50-63, h = offset pro prevod na alfabeticke
;	znaky, l=poradi klavesy, e = offset pro prevod
;	pro cislice a diakritiku (sloupec f5h)
;vystup: ascii znak v a
;meni: af,hl,bc,de
;
;
prevd:	ld	a,l		;poradi klavesy v a
	cp	16		;prevod pres tabulku?
	jr	c,pres2t
	cp	50
	jr	nc,pres1t
	cp	24		;prevod klaves 16-23
	jr	c,cisl
	ld	e,h		;prevod klaves 24-49
cisl:	add	a,e
	ret
pres1t:	sub	34		;@=17
pres2t:	ld	h,0		;prevod pres tabulku
	ld	l,a
	add	hl,bc		;adresa v tabulce
	ld	a,(hl)		;prevzeti znaku
	ret
;
;
tabnsh:	defb	8h,7fh,5,18h,4	;neshiftovane znaky
	defb	13h,3fh,2fh,5ch,5eh
	defb	2dh,20h,30h,39h,2ch
	defb	2eh,40h,5bh,5dh,81h
	defb	81h,81h,5fh,1ah,5fh
	defb	80h,9,3bh,3ah,0dh
;
tabsh:	defb	0ch,2,12h,3,6	;shiftovane znaky
	defb	1,81h,81h,7ch,7eh
	defb	3dh,20h,81h,29h,3ch
	defb	3eh,60h,7bh,7dh,81h,81h
	defb	81h,5fh,1ah,5fh,80h
	defb	9,2bh,2ah,0dh
;
;
;     zjisti stav klavesnice konzoly
;---------------------------------------
;
;vstup: 0
;vystup: a=0ffh pri pripravene klavese
;        a=00 pri nepripravene klavese
;meni: af,bc,hl,de
;
;
const:	call	cblnk		;blikani kurzoru
	call	toukey		;osahani klavesnice
nrdy:	ld	hl,ftrep	;adresa priznaku
	ld	c,(hl)		;minuly stav
	jr	nz,noth		;pri stlaceno
	ld	(hl),0ffh	;novy stav
	ld	hl,lastk
	ld	(hl),82h	;minula lavesa
	ret			;nepriprav.
noth:	sub	c
	jr	z,trdy		;pripraveno
	call	rdtim
	ld	a,0
	ret	nz
trdy:	ld	d,10h		;pocet pruchodu
nored:	dec	d		;dekr. poc.
	jr	z,nrdy		;klav. neplatna
	ld	e,10h		;platne pruch.
real:	ld	b,0		;zpozdeni
delt:	nop
	djnz	delt
	call	toukey		;test. klav.
	jr	z,nored		;nestlaceno
	dec	e		;dekr. poc.
	jr	nz,real		;a dalsi
	ret			;klavesa plati
;
;
;      testuje stav klavesnice konzoly
;--------------------------------------------------
;
;vstup: 0
;vystup: a=00 pri nestlacene, =ffh pri stlacene
;        klavese. netestuje shift a ctrl.
;meni: af,bc,hl
;
;
toukey:	call	touk		;sloupce mimo f8h
	ret	nz		;klav. stlacena, navrat
	in	a,(pb55)	;cteni sloupce f8h
	or	7fh		;plati pouze break
	inc	a
	ret	z		;nestlaceno, navrat
	jr	nsff		;navrat se stlac. klav.
touk:	ld	hl,tasl		;tabulka sloupcu
	ld	bc,0a00h+pa55	;pocet pruchodu a adresa
nsl:	outi
	ret	z		;vycerpano, nestlaceno, nav.
	in	a,(pb55)	;cteni sloupce
	inc	a
	jr	z,nsl		;dalsi sloupec
nsff:	ld	a,0ffh		;navrat se stlacenou klavesou
	ret
;
tasl:	defb	0f9h,0f7h,0f6h,0f5h;tabulka sloupcu
	defb	0f4h,0f3h,0f2h,0f1h
	defb	0f0h,0f8h
;
;      vystup znaku na zarizeni list
;--------------------------------------------
;
;vstup: ascii znak v registru c
;vystup: tisk znaku na list
;meni: af,hl,b, pri chybe de
;
;
list:	ld	hl,3		;io byte
	ld	a,(hl)
	and	0c0h		;plati list
	cp	040h		;vystup na crt?
	jp	z,outcrt
	cp	080h		;tiskarna?
	jr	z,lpt		;vyst. na tiskarnu
	jr	nc,ul1		;vystup ul1
	call	badio		;neimpl. per.
prescr:	ld	hl,3
	res	7,(hl)		;vystup crt
	set	6,(hl)
agaer:	call	cblnk
	call	toukey		;ceka na klavesu
	jr	z,agaer
	ret
ul1:	push	bc
	ld	hl,nap10	;test na pritomnost
	ld	de,prgul1	;programu ul1;
	ld	bc,3		;musi zacinat napi-
	call	cpdehl		;sem UL1
	pop	bc
	jp	z,prgul1+3	;start programu
	ld	de,nap8		;chybi program
erlpt:	call	bioerr		;chybovy navrat
	jr	prescr
lpt:	ld	b,15		;vystup na tiskarnu
	ld	hl,0		;cas. smycka
lptwi:	in	a,(papio)	;tiskarna priprav.?
	and	0dh
	jr	z,lptok		;skok na tisk
	dec	hl
	ld	a,l
	or	h
	jr	nz,lptwi	;cas smycka
	djnz	lptwi
	ld	de,nap3		;tiskarna nepriprav.
	jr	erlpt
lptok:	ld	a,c		;prevz. znaku
	out	(pbpio),a	;vystup dat
	ld	a,080h		;data pristavena
	out	(papio),a
lptre:	in	a,(papio)	;data prijata?
	and	0dh
	cp	01h
	jr	nz,lptre	;ceka na prijeti dat
	xor	a		;data neplatna
	out	(papio),a
	ret
;
;
;nastaveni hlavy diskove jednotky na stopu 0
;-------------------------------------------
;
;vstup: 0
;vystup: nastavi promennou setrk=0
;meni: c,hl
;
;
dhome:	ld	c,0
	ld	hl,flags
	bit	4,(hl)		;neco k zapisu?
	jr	nz,settrk
	res	3,(hl)		;hostbuff neakt.
	jr	settrk
;
;
;      vyber diskove jednotky
;------------------------------------------
;
;vstup: c=cislo disk. jednotky
;vystup: hl=adresa dph prisl. jednotky
;        nebo 0 pri neexist. jednotce
;meni: af,hl,de,bc
;
;
sldskd:	ld	hl,0		;jedn. neexist.
	ld	a,c		;cislo jedn.
	cp	5		;je 5 jednotek
	ret	nc		;neexistuje-li
	ld	(aktdsk),a
	ld	b,l		;nulovani b
	ld	hl,bcurtr	;pole aktualnich fyz. stop
	add	hl,bc
	ld	a,(hl)		;vybrana jednotka
	bit	7,a		;je treba iniciace?
	jr	z,poup		;pokud ne
	ld	hl,typ0me	;pro ramcard se neprovadi
	add	hl,bc
	ld	a,(hl)
	cp	80h
	jr	z,poup		;pri ramcard
	push	bc
	call	read		;iniciace tabulky dpb
	pop	bc
poup:	ld	a,c
poupom:	ld	de,16d		;vypocet dph
	call	axde
	ld	de,dph0		;tabulka dph0
	add	hl,de
	ret
;
;
;      nastaveni cisla stopy
;-----------------------------------------
;
;vstup: cislo stopy v bc
;vystup: nastavi promennou setrk
;meni: hl
;
;
settrk:	ld	hl,setrk
	ld	(hl),c
	ret
;
;
;      nastaveni cisla sektoru
;------------------------------------------
;
;vstup: cislo fyzickeho sektoru v bc
;vystup: nastavi promennou setsc
;meni: hl
;
;
setsec:	ld	hl,setsc
	ld	(hl),c
	ret
;
;
;transformace mezi log. a fyz. cislem sekt.
;------------------------------------------
;
;vstup: cislo sektoru v bc
;       pocatek prev. tab. v de
;vystup: fyzicky sektor v hl
;meni: hl,af
;
;
setran:	ld	h,0
	ld	l,c
	ld	a,d
	or	e		;pri de=0 se
	ret	z		;neprovadi
	add	hl,de		;adr. v preklad. tab.
	ld	l,(hl)		;cislo sekt.
	ld	h,0
	ret
;
;
;      nastaveni adresy pro dma
;---------------------------------------
;
;vstup: adresa zony dma v bc
;vystup: nastavi promennou setdm
;meni: 0
;
;
stdmad:	ld	(setdm),bc
	ret
;
;
;precte vetu o 128 bytech (sektor) z disk. nebo ramc.
;----------------------------------------------------
;
;vstup: nastavene promenne aktdsk,setrk,setsc
;	a setdm
;vystup: veta o 128 byte od (setdm)
;meni: af,de,bc hl
;
read:	call	pshiy		;ulozeni iy+nav.
				;adr., iy=(flags)
	set	0,(iy+0)	;je cteni
	jr	z,wr128		;cteni sec. 128b.
	set	1,(iy+0)	;cteci operace
	set	2,(iy+0)
	xor	a
	ld	(unacnt),a	;citac neal. zap.
	inc	a		;zapis do neal. bloku
	inc	a		;a=2
	ld	(wrtype),a
	jr	rwoper
;
;
;zapise vetu o 128 bytech na disk. nebo ramc.
;--------------------------------------------
;
;vstup: nastavene promenne aktdsk, setrk,
;	setsc a setdm, data od (setdm)
;vystup: veta od (setdm) na diskete nebo ramc.
;meni: af,de,hl,bc
;
write:	call	pshiy		;uloz. iy, navr. adr.
				;iy=(flags)
	res	0,(iy+0)	;bude se zapisovat
	res	1,(iy+0)	;neni cteni
	jr	nz,rwoper	;pri sec. >128 byte
wr128:	ld	hl,(setdm)	;parametry se mohou
	ld	(seldma),hl	;pristavit beze zmeny
	ld	hl,(aktdsk)
	ld	(seldsk),hl
	ld	a,(setsc)
	ld	(selsec),a
	res	5,(iy+0)	;sektor=128byte
	jp	spolrw		;fyzicke cteni/zapis
rwch:	pop	bc		;chybovy navrat
	ret
rwoper:	ld	hl,hstbuf	;pro nastaveni DMA
	ld	(seldma),hl
	set	5,(iy+0)	;sektor > nez 128 byte
	ld	a,(setsc)	;pozadovany sektor
	push	bc		;b=kapacita fyz. s.-1
	rlca
vypfyz:	srl	a		;vypocet fyzickeho cisla
	srl	b		;sektoru
	jr	c,vypfyz
	inc	a
	ld	(pomsec),a
	xor	a
	bit	3,(iy+0)	;host buff. aktivni?
	set	3,(iy+0)	;vzdy bude aktivni
	jr	nz,noinit	;neni iniciace, skok
	set	2,(iy+0)	;musi se predecitat
	jr	filhst		;neni-li aktivni
noinit:	bit	1,(iy+0)	;je cteni?
	call	z,yeswr		;pri zapisu
	ld	bc,3
	ld	de,dupdsk	;minule fyz. par.
	ld	hl,aktdsk	;nove fyz. par.
	push	bc
	call	cpdehl		;porovnani par.
	pop	bc
	jr	z,match		;pri souhlasu
	ld	hl,dupdsk	;parametry pro pozas-
	ld	de,seldsk	;taveny zaznam
	ldir	
	xor	a
	bit	4,(iy+0)	;pozastaveny zapis?
	res	0,(iy+0)	;bude se zapisovat
	call	nz,spolrw	;zapis na disk
	and	a		;chyba zapisu?
	jr	nz,rwch		;pri chybe
filhst:	ld	hl,aktdsk	;nastaveni duplicit-
	ld	de,dupdsk	;nich parametru
	ld	bc,3
	push	bc
	push	hl
	ldir
	pop	hl		;nastaveni fyzickych
	pop	bc		;parametru
	ld	de,seldsk
	ldir
	bit	2,(iy+0)	;je treba cist?
	set	0,(iy+0)	;bude se cist
	call	nz,spolrw	;predecteni nebo cteni
	and	a
	jr	nz,rwch		;pri chybe
	res	4,(iy+0)	;bez priznaku odl. zap.
match:	pop	bc
	ld	a,(setsc)	;presun vety do/z vy-
	and	b		;rovnavaci pameti
	ld	de,128		;delka vety
	push	de
	call	axde		;v hl relat. adresa
	ld	de,hstbuf	;vyrovnav. buffer
	add	hl,de
	ld	de,(setdm)	;adresa dma
	bit	1,(iy+0)	;je cteni?
	jr	nz,budect	;skok na cteni
	ex	de,hl		;obrat smer presunu
	set	4,(iy+0)	;pozastaveny zapis
budect:	pop	bc		;delka sektoru (128 b.)
	ldir			;presun
	ld	a,(wrtype)	;jde o zap. do adresare?
	cp	01
	ld	a,0
	ret	nz
	res	4,(iy+0)	;zruseni priz. odl. zap.
	res	0,(iy+0)	;budeme zapisovat
spolrw:	ld	de,(seldsk)	;vybrany fyz.disk
	ld	d,0
	ld	hl,typ0me	;tabulka fyz. prirazeni
	add	hl,de		;disku
	ld	a,(hl)		;prevzeti prirazeni
	cp	80h		;je to ramcard?
	jp	z,ramdsk
	ld	(selby),a	;udaj pro select port
	push	af
	ld	hl,bcurtr	;tab. nastav. stop disku
	add	hl,de
	ld	(curtrk),hl	;nastaveni ukazovatka
	ld	hl,typ0sk	;param. pro prikazov. reg.
	add	hl,de
	ld	a,(hl)		;parametry pro prikaz
	ld	(spseek),a	;seek a restore
	ld	hl,sec0me	;pocet fyzickych sektoru
	add	hl,de		;na stopu
	ld	a,(hl)
	ld	(pocsec),a
	ld	a,(lselby)	;minuly parametr
	ld	l,a
	pop	af		;novy parametr
	cp	l		;stejny disk?
	ld	(lselby),a	;novy bude stary
	ld	c,drselp	;drive select port
	ld	d,04h		;pro prikazovy reg.
	ld	b,a
	jr	nz,baddr	;pri nesouhlasu jednotek
	in	a,(c)		;motor bezi?
	and	01h		;motorovy bit
	res	2,d		;bez cekani
	jr	nz,sametr	;skok,bezi-li
baddr:	set	2,d		;s cekanim na hlavicku
	out	(c),b		;vyber nove mech.
sametr:	ld	hl,21142	;testuje po dobu 1s
wfr:	in	a,(stareg)	;ready?
	bit	7,a
	jr	z,strack	;je ready
	call	pau
	jr	z,wfr		;ceka 1s
	ld	de,nap6		;drive not ready
chybna:	ld	a,(seldsk)	;fyzicky disk
	add	a,41h		;znaky ASCII
	ld	(retdsk),a	;doplneni napisu
	ld	(stdsk),a
	call	bioerr		;chybovy navrat
	ld	a,1		;priznak chyby
	ret
strack:	out	(c),b		;retrigr monoflopu
	ld	hl,(curtrk)	;nastaveni stopy
	ld	a,(hl)		;nastavena stopa
	bit	7,a		;je treba iniciace
				;mechaniky?
	jr	z,yftrk		;neni-li treba
	bit	0,(iy+0)	;neni zapis?
	jr	z,yftrk		;pri zapisu
	bit	5,(iy+0)	;sektor 128byte?
				;=8" muze byt bez
				;tabulky dpb
	ret	z		;pokud je
	xor	a		;pro chybovy napis
	ld	(seltrk),a
	ld	(hl),a		;aktualni stopa
	inc	a
	ld	(selsec),a
	out	(secreg),a	;sektor
	call	recal		;home hlavy
	ld	e,5		;bude 5 pokusu
catchd:	call	physco		;cteni sektoru
	jr	z,noes0		;neni-li chyba
	dec	e		;dalsi pokus
	jr	nz,catchd
	jr	cenerr		;na chyb. vystup
noes0:	ld	a,(seldsk)	;vybr. disk
	call	doddpb		;prislusna tabulka
	ex	de,hl		;dpb do de
	ld	hl,(seldma)	;sem se cetlo
	ld	bc,2eh		;offset v sektoru
	add	hl,bc		;pocatek tab.
	push	de
	ld	de,identi	;identifikace format.
	ld	bc,7d		;programu
	call	cpdehl		;porovnani napisu
	pop	de
	jr	z,fpok		;pri spravnem prog.
	ld	de,nap9		;chybove hl.
	call	bioerr
	ret
fpok:	ld	bc,15d		;delka
	ldir			;presun tabulky
	ret
yftrk:	out	(trkreg),a	;stara stopa
	ld	a,(seltrk)	;nova stopa
	ld	(hl),a		;nova bude stara
	ld	a,(pocsec)	;pocet sekt. na st.
	ld	e,a
	ld	a,(selsec)	;pozadovany sektor
	cp	e		;urceni strany disku
	jr	c,ssect		;nastav sektor
	jr	z,ssect
	sub	e		;vypocet cisla sekt.
				;na druhe strane
	set	1,d		;nastav. priz. 2.str.
ssect:	out	(secreg),a	;nastaveni sektoru
	ld	e,3		;pocet pokusu o nast.
physop:	ld	hl,seltrk	;pozad. fyz. stopa
	in	a,(trkreg)	;souc. stopa disku
	cp	(hl)		;stopa nastavena?
	ld	a,(hl)		;pozad. stopa
	call	nz,seekco	;nastaveni stopy
	jr	nz,physre	;pri chybe nastaveni
				;rekalibrace
	call	physco		;cteni/zapis
	ret	z		;uspesny navrat
	res	2,d		;bez cekani na hlavu
	ld	a,e		;byl to prvni pokus
	cp	02		;o nastaveni stopy?
	jr	nz,perrt
physre:	call	recal		;rekalibrace pri ne-
perrt:	dec	e		;uspesnem pokusu
	jr	nz,physop	;dalsi pokus
cenerr:	ld	a,(seltrk)	;prevod stopy na deka-
	call	dfromh		;dicky tvar
	ld	(sttrc),hl	;doplneni chyboveho
	ld	a,(selsec)	;napisu
	call	dfromh		;prevod sektoru
	ld	(retsc),hl
	ld	a,0feh		;neplatne cteni
	ld	(dupsec),a	;nebo predecteni
	ld	hl,(curtrk)	
	ld	(hl),0		;je poloha home
	ld	de,nap7		;chybna r/w operace
	jp	chybna		;chybovy navrat
;
;
;transformuje hexacislo na dekadicky tvar v ASCII
;------------------------------------------------
;
;vstup: hexacislo <64h v A
;vystup: odpovidajici dekadicke cislo v znacich
;	 ASCII: l=znak s vyssi vahou
;		h=znak s nizsi vahou
;meni: af, de,hl
;
;
dfromh:	ld	l,0		;sumacni bunka
dades:	sub	10d
	inc	l
	jr	nc,dades	;dalsi desitka
	add	a,10d
	dec	l
	ld	h,a		;jednotky
	ld	de,3030h
	add	hl,de		;prevod na ASCII
	ret
;
;
;presun hlavy disk. jednotky na nultou stopu
;-------------------------------------------
;
;vstup:	0
;vystup: hlava na stope 0 nebo chyb. hlaseni
;meni: af,bc, modifikuje d
;
;
recal:	ld	a,(spseek)	;param. pro rest.
	ld	c,04		;er. maska prikazu
	jr	conrc		;vyslani restore
;
;
;nastaveni hlavy disk. jednotky na zadanou stopu
;-----------------------------------------------
;
;vstup:	registr stopy v WD 2797 nastaveny na po-
;	lohu hlavy a pozadovana stopa v A
;vystup: hlava na pozadovane stope nebo chybove
;	 hlaseni
;meni: af,bc, modifikuje d
;
;
seekco:	out	(datreg),a	;pozadovana stopa
	ld	a,(spseek)	;parametry jednotky
	set	4,a		;prikaz seek
	ld	c,18h		;seek error maska
conrc:	out	(comreg),a	;vyslani prikazu
	ld	a,(selby)	;retrigr monoflopu
	out	(drselp),a
	ld	b,10d
	djnz	$		;cekaci smycka
wfseek:	in	a,(stareg)	;stavove slovo
	bit	0,a		;je platne?
	jr	nz,wfseek	;ceka na platnost
	set	2,d		;s cekanim na hlavu
	and	c		;maska platnych bitu
	ret
;
;
;fyzicke cteni - zapis na disk
;-----------------------------------
;
;vstup:	disk ready, nastavena stopa, adresa DMA, bit 0
;	flags je nastaven dle pozad. operace, d=strana
;	disku apriznak zpozdeni, v zaz. prist. data
;vystup: precteny nebo zapsany sektor od adr. (seldma);
;	 z=h-uspesna operace, jinak a obsahuje vymasko-
;	 vany stavovy registr WD 2797
;meni: af,hl,bc
;
;
physco:	ld	hl,(seldma)	;poc. pole dat
	di
	ld	a,(selby)	;retrigr monofl.
	out	(drselp),a
	ld	c,datreg	;datovy registr
	bit	0,(iy+0)	;cteni?
	jr	z,cowr		;pri zapisu
	ld	a,88h		;floppy read c.
	or	d		;volba strany+
				;zpozdeni
	out	(comreg),a	;nastaveni rezimu
	ld	b,10d
	djnz	$		;ceka
nxtrd:	in	a,(stareg)	;stavovy registr
	cp	01		;operace ok, ale
				;je busy?
	jr	z,nxtrd		;ceka na ready
	in	b,(c)		;cteni dat
	bit	1,a		;data platna?
	jr	z,rnbw		;jeste ne, skok
	ld	(hl),b		;ulozeni dat
	inc	hl
	jr	nxtrd		;dalsi byte
rnbw:	bit	0,a		;busy bit
	jr	nz,nxtrd	;jeste se ceka
	ei
	and	9ch		;maska chyb v read
	ret
;
cowr:	ld	a,0a8h		;floppy write code
	or	d		;strana+cekani
	out	(comreg),a	;do prikaz. reg.
	ld	b,10d
	djnz	$		;ceka
nxtwd:	ld	b,(hl)		;prevzeti byte
	inc	hl
nxtwr:	in	a,(stareg)	;mozno vyslat byte?
	cp	01
	jr	z,nxtwr		;ceka se dal
	out	(c),b		;vyslani byte
	bit	1,a		;pozadavek pristave-
				;ni byte?
	jr	nz,nxtwd	;dalsi byte
	bit	0,a		;je busy?
	jr	nz,nxtwr	;novy zapis tehoz b.
	and	0dch		;maska chyby zapisu
	jr	nz,wrserr	;pri chybe
	ld	a,88h		;floppy read code
	res	2,d		;bez zpozdeni
	or	d		;strana disku
	out	(comreg),a	;zapis prikazu
	ld	b,10d		;ceka
	djnz	$
versct:	in	a,(datreg)	;data se zahazuji
	in	a,(stareg)	;stavove slovo
	bit	0,a		;je busy?
	jr	nz,versct	;dalsi byte
	and	98h		;maska na verify
wrserr:	ei
	ret			;chybu
;
;
;podprogram pauzy-celkova delka 100 stroj. taktu
;-----------------------------------------------
;
pau:	dec	hl
	rept	4
	ex	(sp),hl
	endm
	bit	7,h
	ret
;
;
;uschovani reg. iy a jeho obnova
;---------------------------------
;
;vstup: nastavena prom. aktdisk
;vystup: uschovani a obnova pres ret reg. iy. iy
;	 naplni adresou flags, a=0, z=h pri sec
;	 128 byte, jinak a=b=(pocet 128-mic byte
;	 ve fyz. sektoru)-1
;meni: iy,hl,de,af
;
;
pshiy:	pop	hl		;navratova adresa
	push	iy		;uschova iy
	ld	iy,popiy	;navratova adresa
	push	iy
	push	hl
	ld	iy,flags
	ld	de,(aktdsk)	;aktual. disk
	ld	d,0
	ld	hl,seccap	;tab. kapacity fyzic-
	add	hl,de		;kych sektoru
	ld	a,(hl)		;kapacita vybr. jedn.
	dec	a
	ld	b,a
	ret
popiy:	pop	iy		;obnova iy
	ret			;navrat
;
;
;porovnani zony od (de) s zonou od (hl)
;------------------------------------------
;
;vstup: nastavene de, hl, delka bloku v bc
;vystup: pri souhlasu zon se nastavi priznak z,
;	 pri nesouhlasu je nulovan.
;meni: af,de,hl,bc
;
;
cpdehl:	ld	a,(de)
	inc	de
	cpi
	ret	nz
	jp	pe,cpdehl
	ret
;
;
;	dodani tabulky DPB
;-----------------------------------------
;
;vstup: a=pozadovana jednotka
;vystup: hl obsahuje adresu DPB poz. jednotky
;meni: af,de,hl,bc
;
;
doddpb:	call	poupom		;tabulka DPH
	ld	de,0ah
	add	hl,de
	ld	a,(hl)
	inc	hl
	ld	h,(hl)
	ld	l,a
	ret
;
;
;testuje pokracovani v nealokovanem zapise
;------------------------------------------
;
;vstup: c=typ zapisu (0-2), e=aktualni disk,
;	d=0
;vystup: nuluje nebo nastavi bit urcujici
;	 predecteni fyz. sekt. pri zapisu.
;meni: af,hl,de,bc
;
;
yeswr:	ld	a,c		;typ zapisu do a
	ld	(wrtype),a
	cp	2		;zapis do neal. bl?
	jr	nz,caltst	;skok na dalsi roz-
				;liseni, muze jit o
				;pokrac. v neal. zap.
	ld	a,e		;aktualni disk
	call	doddpb		;tabulka dpb
	inc	hl
	inc	hl		;pocet vet v alok.
	inc	hl		;bloku - 1 do a
	ld	a,(hl)		;
	ld	(unacnt),a	;zapis musi smerovat
				;do 1. vety, jinak
				;chyba!!!
	ld	hl,(aktdsk)	;nastaveni parametru
	ld	(unadsk),hl
	ld	a,(setsc)
	ld	(unasec),a
	jr	noof
caltst:	ld	a,(unacnt)	;test na pokracovani
	and	a		;v nealok. zapise
	jr	z,alloc		;blok alok, nutno cist
	dec	a		;pocitadlo sektoru
	ld	(unacnt),a
	ld	hl,unasec	;urceni soucasneho
	inc	(hl)		;predpokladaneho sekto-
	push	hl		;ru z minulych param.
	ld	a,(unadsk)
	call	doddpb		;tabulka dpb
	ld	b,(hl)		;pocet vet 128 b. na st.
	pop	hl
	ld	a,(hl)		;konec stopy?
	inc	a
	cp	b
	jr	c,noof		;neni-li konec stopy
	ld	(hl),0ffh	;prvni sektor
	dec	hl
	dec	hl		;ukazuje na stopu
	inc	(hl)		;dalsi stopa
noof:	ld	bc,2		;porovnaji se 2 par.
	ld	hl,unadsk	;porovnani disku a stop
	ld	de,aktdsk
	call	cpdehl
	jr	nz,alloc	;pri nesouhlasu
	inc	de
	inc	hl		;preskoci se fyzicky
	inc	bc		;sektor
	call	cpdehl		;porovnani sektoru 128b.
	res	2,(iy+0)	;shoda, neni treba pre-
	ret	z		;decitat
alloc:	set	2,(iy+0)	;musi se predecitat
	xor	a
	ld	(unacnt),a	;nulov. cit. neal. zap.
	ret
;
;
;zapise - precte sektor z ramcard
;-----------------------------------------
;
;vstup: parametry v seldma,seltrk a v selsec
;       iy=flags, nastaven bit 0 flags
;vystup: ulozeni dat z sektoru na adr. seldma
;        a=0 pri cteni ok, jinak a=1
;meni: af,hl,de,bc
;
;
ramdsk:	di
	call	nastad		;adresa v ramcard
	ld	d,0		;pro kont. sumu
	bit	0,(iy+0)	;neni zapis?
	jr	z,wrrdsk	;pri zapisu
	ld	hl,(seldma)	;misto presunu
	ld	b,delsc		;delka sektoru
reaby:	in	a,(inrmc)	;cteni dat
	ld	(hl),a		;ulozeni
	inc	hl		;dalsi adresa
	xor	d		;kontr. suma
	ld	d,a
	djnz	reaby		;cely sektor
	push	de
	call	setsum		;adr. kont. sumy
	pop	de
	in	a,(inrmc)	;cteni sumy
	xor	d		;souhlas sum?
	ei
	ret	z		;pri souhlasu
wrerr:	ld	a,1		;pro chyb. hlas.
	ei
	ret
;
;
;zapis zony pameti do zadaneho sektoru v ramc.
;---------------------------------------------
;
;vstup: misto zaznamu urceno setrk a setsc
;       adresa v operacni pameti dle setdm
;	d=0,urcena adresa v ramcard pres
;	call nastad
;vystup: zapis zony pameti do zad. sekt.
;meni: af,hl,de,bc
;
;
wrrdsk:	push	hl
	push	af		;uschovani par.
	ld	hl,(seldma)	;adresa dma
	ld	b,delsc		;delka sekt.
wrby:	ld	a,(hl)		;prevzeti byte
	inc	hl		;dalsi adresa
	out	(outrmc),a	;zapis do ramcard
	xor	d		;kont. suma
	ld	d,a
	djnz	wrby		;cely sektor
	push	de
	call	setsum		;adr. kont. sumy
	pop	de
	ld	a,d		;uloz. kont. sumy
	out	(outrmc),a	;zapis sumy
	call	sadrp		;znova nast. adresy
	in	a,(inrmc)	;suma zapsana?
	cp	d
	pop	hl
	ld	a,h
	pop	hl
	jr	nz,wrerr	;chyba zaznamu
	call	sadr		;kontrola zapisu
	ld	b,delsc
	ld	hl,(seldma)	;vstupni parametry
wnoer:	in	a,(inrmc)	;cteni byte
	xor	(hl)		;souhlasi?
	jr	nz,wrerr	;pri chybe
	inc	hl		;dalsi byte
	djnz	wnoer
	ei			;uspesny zapis
	ret
;
;
;vypocet a nastaveni adresy v ramcard
;---------------------------------------------
;
;vstup: udaje v seltrk a v selsec
;vystup: nastaveni adresy v ramcard
;meni: af,hl,de,bc
;
;
nastad:	ld	a,(seltrk)	;cislo stopy
	ld	de,delst	;poc. byte na st.
	call	axde		;a x de
	push	af
	push	hl		;ulozeni vysledku
	ld	a,(selsec)	;cislo sektoru
	ld	de,delsc	;delka sekt.
	call	axde		;por. 1. byte sekt.
	pop	de
	add	hl,de		;abs. adr. v ramcard
	pop	bc
	adc	a,b
sadr:	out	(setpag),a	;volba adresy
sadrp:	ld	b,h
	ld	c,setadr
	out	(c),l
	ret
;
;
;vypocte a nastavi adresu kontrolni sumy
;-----------------------------------------
;
;vstup: udaje v seltrk a v selsec
;vystup: nastaveni adresy kont. sumy sekt.
;       v ramcard
;meni: af,hl,de,bc
;
;
setsum:	ld	a,(seltrk)	;aktualni stopa
	ld	de,sptrmc	;poc. sekt. na stopu
	call	axde		;a x de
	ld	de,(selsec)	;cislo sektoru
	ld	d,0f8h		;baz. adr. sum
	add	hl,de		;adr. sumy
	ld	a,3		;zac. zony=3f800h
	jr	sadr		;volba adresy
;
;
;      vypocte soucin a x de
;--------------------------------------------
;
;vstup: a,de=cinitele
;vystup: a,h,l (a=nejvyssi vaha)
;meni: af,hl,de,bc
;
;
axde:	ld	hl,0		;pro vysledek
	ld	b,h		;b=0
	ld	c,a		;1. cinitel
	ld	a,h		;a=0
dalrad:	bit	0,c		;platny rad?
	jr	z,vyrad		;vynecha se
	add	hl,de
	adc	a,b		;pricteni radu
vyrad:	sla	e		;vypoc. dal. radu
	rl	d
	rl	b
	srl	c		;cinitel vycerpan?
	jr	nz,dalrad	;dalsi rad
	ret
;
;
;otestuje prirazeni konzoly+chybovy vystup
;--------------------------------------------
;
;vstup:  0 pri rutine conper
;        de=adresa napisu pri rutine error
;vystup: navrat pri crt,nebo vystup na tiskarnu,
;	 jinak zmena priraz na crt a navrat
;	 s chyb. hlasenim
;meni:   af,hl,de
;
;
conper:	ld	hl,0003h	;io byte
	ld	a,(hl)
	and	3		;platna konzola
	cp	1		;crt?
	ret	z		;navr. pri crt
	pop	de		;likvidace ret
	cp	3		;je uc1?
	jp	z,list		;skok na tiskarnu
	res	1,(hl)		;volba con=crt
	set	0,(hl)
badio:	ld	de,nap2		;periferie neexist.
bioerr:	push	de		;chybove hlaseni
	ld	de,nap1		;bios error
	call	dachz		;tisk napisu
	pop	de		;chybovy text
dachz:	ld	a,(de)		;tisk
	cp	"$"
	ret	z
	push	de
	ld	c,a
	call	outcrt
	pop	de
	inc	de
	jr	dachz
;
;
nap1:	defb	0ah,0dh,"BIOS "
	defb	"error: $"
nap2:	defb	"not implemented "
	defb	"peripheral",0ah
	defb	0dh,"$"
nap3:	defb	"LPT not ready"
	defb	0ah,0dh,"$"
nap4:	defb	"60K CPM "
	defb	"verse 2.2-4 (KOI-8"
	defb	0c3h,"s2)"
	defb	0ah,0dh,"$"
nap5:	defb	"bad "
	defb	"loading BDOS & "
	defb	"CCP",0ah,0dh,"$"
nap6:	defb	"drive "
retdsk:	defb	"  not ready",0ah,0dh,"$"
nap7:	defb	"bad r/w operation on drive "
stdsk:	defb	" , track "
sttrc:	defb	"  , sector "
retsc:	defb	"  ",0ah,0dh,"$"
nap8:	defb	"program "
nap10:	defb	"UL1 is not initiated!",0ah,0dh,"$"
nap9:	defb	"invalid format on  select disk -"
	defb	" not found tab. DPH!",0ah,0dh,"$"
;
pret1:
.dephase
loader:
.phase	pret1
;
	defs	1	;rezerva
wrtype:	defs	1	;typ zapisove operace
;			1=do adresare,2,0=data
flags:	defs	1	;bit0=h-fyzicke cteni z disku
;			     =l-zapis na disk
;			 bit1=h-vstupni pozadavek cteni
;			     =l-vstupni poz. zapisu
;			 bit2- pomocna kopie bitu 1
;			 bit3=h-hstbuf aktivni
;			 bit4=h-priznak odlozeneho zap.
;			 bit5=h-sektor=128byte
;
;nasledujici promenne musi byt ponechany v uvedene konfi-
;guraci, jinak bude porusena funkce programu.
;
aktdsk:	defs	1	;pozadovany disk
setrk:	defs	1	;pozadovana stopa
pomsec:	defs	1	;pozadovany fyzicky sektor
;			 (pomocna promenna)
setsc:	defs	1	;pozadovany sektor
;
unadsk:	defs	1	;pracovni kopie aktdsk
unatrk:	defs	1	;dtto setrk
unacnt:	defs	1	;pocet vet do konce alok. bloku
unasec:	defs	1	;pracovni kopie setsc
;
seldsk:	defs	1	;vybrany fyzicky disk
seltrk:	defs	1	;dtto stopa
selsec:	defs	1	;dtto sektor
;
dupdsk:	defs	1	;pracovni kopie seldsk
duptrk:	defs	1	;dtto seltrk
dupsec:	defs	1	;dtto selsec
;
;konec spolecne konfigurace
;
setdm:	defs	2	;pozadovana adresa DMA
seldma:	defs	2	;adr. dma fyzickeho disku
spseek:	defs	1	;udaj pro seek vybr. disku
pocsec:	defs	1	;pocet sekt. na stopu
;			 vybraneho fyzickeho disku
selby:	defs	1	;vybrany fyzicky disk
lselby:	defs	1	;minuly vybr. fyz. disk
curtrk:	defs	2	;ukazovatko akt. stop
bcurtr:	defs	5	;pole akt. stop disku
pklav:	defs	1	;priznaky klavesnice
pcbln:	defs	1	;kursor blink; bit 1 prepina
			;page a roll mod, zakazuje nebo
			;povoluje kurzor
provza:	defs	1	;povolene roviny zapisu
rovza:	defs	1	;roviny zapisu vram
drucur:	defs	1	;druh kurzoru
dfcc:	defs	2	;sour. kurs., l=sloupec
dfbin:	defs	2	;adr. kur. ve vram
lastk:	defs	1	;posl. pl. kl. ascii
sttim:	defs	2	;stav citace 2 8253
	defs	2	;pro prom. prosp-2
prosp:	defs	2	;pro prim. adr. cur.
fbeep:	defs	1	;potlac. beepu
ftrep:	defs	1	;pro repeat klav.
pokl:	defs	1	;poradi klav. +1
numzn:	defs	1	;pocet znaku na radek
scofs:	defs	2	;udaj scr. offset reg.
altm:	defs	1	;pro pr. adr. cur.
setmod:	defs	1	;nast. mod zobrazeni
border:	defs	1	;byte borderu
typcls:	defs	2	;druh mazani obrazovky
numrad:	defs	1	;poc. radku na obrazovce
;
;nasleduji zony al. vektoru a kont. souctu. 
;
alv0:	defs	01fh	;alok. vekt. jedn.0 (ramc.)
csv0:	defs	16	;kont. soucty jedn.0
alv1:	defs	45	;alok. vekt. jedn.1 (5 1/4'
;			 18sek/stopu, ds,dd,80 stop
csv1:	defs	48	;je to max.kapacita, se
alv2:	defs	45	;kterou se pocita
csv2:	defs	48
alv3:	defs	45
csv3:	defs	48
alv4:	defs	45	
csv4:	defs	48
;
dirbuf:	defs	080h	;vyrov. pamet
hstbuf:	defs	512	;vyrov. pam blok/deblok alg.
prgul1:	defs	512	;misto pro uziv. program tisku
;
.dephase
;
	org	loader
;
pret:	out	(0e1h),a	;nahore RAM
	ld	hl,01200h	;odtud se presouva
	ld	bc,pret1-bte	;delka bloku
	ld	de,bte		;misto presunu
	ldir	;pres.	do pr. ob.
	jp	bte		;pocat. bios
prets:	ld	hl,pret1-bte+prets-loader
				;delka bios
	ld	(01102h),hl	;uloz. delky
	ld	hl,01200h	;odtud se pres.
	ld	(01104h),hl
	push	hl
	ld	hl,pret		;start. adresa
	ld	(01106h),hl	;ulozeni do hlav.
	out	(0e1h),a	;nahore ram
	ld	bc,pret1-bte	;delka bloku
	ld	de,bte		;misto presunu
	pop	hl		;odtud presun
	ldir
	ld	hl,seltrk	;stopa ramcard
	ld	(hl),bdstpa	;nast. stopy
	inc	hl
	ld	(hl),bdsec	;nast. sektoru
	ld	b,delsys	;delka syst. v sec.
	ld	hl,pccp		;poc.ccp
	ld	(seldma),hl	;adr. dma
	ld	iy,flags	;bude se zapisovat
	res	0,(iy+0)
allcb:	push	bc
	call	ramdsk		;zapis sekt.
	pop	bc
	jr	nz,wrch		;pri chybe
	ld	de,080h		;dalsi adr.
	ld	hl,(seldma)	;minul. adr.
	add	hl,de
	ld	(seldma),hl	;naplneni pr.
	ld	hl,selsec	;prom. sekt.
	inc	(hl)		;inc sektoru
	ld	a,(dpb0)	;poc. sekt. na st.
	cp	(hl)		;"za" stopu?
	jr	nz,dltes	;pri nevycerpano
	ld	(hl),0		;prvni sekt.
	dec	hl		;adr. setrk
	inc	(hl)		;inkrement stopy
dltes:	djnz	allcb		;dalsi sektor
	xor	a		;uspesny navrat
wrch:	out	(0e4h),a	;init rom
	ld	de,prena	;napis wr. err.
	jp	nz,0eb2eh	;navr. do mon. s err.
	ld	c,setzer	;init ramcard
	jp	0e76ch		;zapis do ramc.
prena:	defb	"WRITE ERROR ON "
	defb	"RAMCARD!",0dh,0
;
	end	prets
