;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;	DEFINICNI SOUBOR PRO PROLOG-80		;;;;;
;;;;;;;;;	verze pro CP/M Plus 3.1			;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		.XLIST
		.Z80		; MA-LI NEKDO STARY M80
version		equ	4
REVISION	EQU	0


	EXT	$PRINT,$WINK		; CPMIO
	EXT	$TSTBREAK,$INKEY

; DEFINICE POTREBNE PRO CP/M

BDOS		EQU	5
REBOOT		EQU	0


GLINEF		EQU	10
OPENF		EQU	15
MAKEF		EQU	22
DELETEF		EQU	19
CLSEF		EQU	16
READF		EQU	20
WRITEF		EQU	21
SETDMAF		EQU	26
CONINF		EQU	1
CONDIRF		EQU	6
CONOUTF		EQU	2
CONSTF		EQU	11
RREADF		EQU	33
RSDISK		EQU	13


; DEFINICE POTREBNE PRO I/O PROLOGU

FSLENGTH	EQU	172	; POCET BYTU NA CELOU STRUKTURU
BUFLENGTH	EQU	128	; DELKA BLOKU SOUBORU
NAMEL		EQU	8	; DELKA JMENA SOUBORU
EXTL		EQU	3	; DELKA EXTENZE SOUBORU
IOPACKL		EQU	166	; DELKA FCB+BUF+ZAVISLE INFO
LLENGTH		EQU	128	; DELKA VSTUPNI RADKY
TAB0		EQU	5	; KDE ZACIT CIL V LISTING

BSTEP		EQU	80	; PO KOLIKA PRIDAVAT V EDITORU
HSTEP		EQU	8	; PO KOLIKA CUKAT <->
VSTEP		EQU	8	; PO KOLIKA CUKAT VERT.

; OFFSETY

APTOAR		EQU	-42	; OD AKTUALNIHO POINTERU NA ATOMREP
ARTOLNK		EQU	4	; OD ATOMREP NA NEXT-LINK
APTOLNK		EQU	-38	; OD AKTUALNIHO POINTERU NA LINK
APTOFCB		EQU	-36	; OD AKTUALNIHO POINTERU NA FCB

?PBLBYT		EQU	1	; CHCEME RUTINU BLOKOVANI VYSTUPU
?GOING		EQU	0	; NECHCEME UKLADAT TR. INFO.
NOCR		EQU	0	; NECHCEME POTLACOVAT CR
NOLF		EQU	0	; NECHCEME POTLACOVAT LF
EDITOR		EQU	1	; CHCEME LIBOVICKYHO EDITOR

Z80		EQU	1	; mame Z80



ERROR	MACRO	KOD
	CALL	XXERROR
	DB	KOD
	ENDM

GETMEMTOP	MACRO
	LD	HL,(BDOS+1)
	LD	DE,-6
	ADD	HL,DE
	ENDM

INITIO	MACRO
	LD	DE,ERRFCB##
	LD	C,OPENF
	CALL	BDOS		; OTEVRI SOUBOR S CHYB. HLASENIM
	INC	A
	BR	NZ,OKERRFIL
	LD	A,1
	LD	(ERRFCB##),A
	LD	DE,ERRFCB##
	LD	C,OPENF
	CALL	BDOS
OKERRFIL:
	CALL	$INIIO##
	ENDM

REST$IO	MACRO
	ENDM


BYEBYE	MACRO
	RST	REBOOT
	ENDM

?INTERRUPT	MACRO
	CALL	$TSTBREAK
	CALL	C,INTERRUPT
	ENDM

DISPCHAR	MACRO
	PUSH	AF
	CP	.CR
	JP	NZ,NOCRLF
	CALL	$PRINT
	LD	A,.LF
NOCRLF:	CALL	$PRINT
	POP	AF
	RET
	ENDM

PUTACRT	MACRO
	CALL	$PRINT
	ENDM

READCHAR	MACRO
	JP	$WINK
	ENDM

TESTCHAR	MACRO
	call	inkey##
	ENDM


GET1BYT	MACRO
	LD	DE,CPMRSEC
	CALL	GBLBYT
	ENDM

PUT1BYT	MACRO
	LD	DE,CPMWSEC
	CALL	PBLBYT
	ENDM

OPEN	MACRO
	PUSH	DE
	LD	C,OPENF
	CALL	BDOS
	INC	A
	POP	DE		; FCB
	BR	NZ,OPOK
	LD	A,1
	LD	(DE),A
	LD	C,OPENF
	CALL	BDOS
	INC	A
	JP	Z,NOFILE
OPOK:
	ENDM

CREATE	MACRO
	PUSH	DE
	LD	HL,-APTOFCB
	ADD	HL,DE
	LD	(HL),BUFLENGTH+1
	LD	C,DELETEF
	CALL	BDOS
	POP	DE
	LD	C,MAKEF
	CALL	BDOS
	INC	A
	JP	Z,DIRFULL
	ENDM

CLOSE	MACRO
	EX	DE,HL		; AP DO DE
	LD	A,(WASSEE)	; ZAVIRAME VSTUPNI SOUBOR?
	OR	A
	BR	NZ,CLOSIN	; ANO - TO JE O.K.
	PUSH	DE		; BUDE POTREBA
	EX	DE,HL		; AP DO HL
	LD	A,1AH		; CP/M EOF
	LD	DE,CPMWSEC
	CALL	PBLBYT
	POP	DE
	CALL	CPMWSEC
CLOSIN:	LD	HL,APTOFCB
	ADD	HL,DE
	EX	DE,HL
	LD	C,CLSEF
	CALL	BDOS
	INC	A
	JP	Z,CLSERR
	ENDM

FILLFCB	MACRO
XFILLFCB::
	POP	DE	; ADRESA FCB
	INC	DE
	INC	DE	; PRES LINK NA FCB
	PUSH	DE	; ADRESA FCB ULOZENA PRO DALSI
	INC	HL	; HL NA TEXT ATOMU
	LD	A,B	; DELKA ATOMU
	CP	4	; ASPON 3 ZNAKY
	BR	C,NODRIVE	; NELZE B:XXX
	LD	C,(HL)	; 1. ZNAK MUZE BYT DRIVE
	INC	HL	; NA 2. ZNAK
	LD	A,(HL)	; 2. ZNAK
	DEC	HL	; VRAT HL NA 1. ZNAK
	CP	':'	; JE TAM TEDY DRIVE?
	BR	NZ,NODRIVE
	LD	A,C	; CISLO DRIVU
	AND	0DFH	; PROSIM VELKE PISMENO
	SUB	'A'-1	; 'A'->1, 'B'->2, ...
	LD	(DE),A	; ULOZ CISLO DRIVU, JINAK CURRENT
	INC	HL
	INC	HL	; UBRALI JSME 2 ZNAKY
	DEC	B
	DEC	B

NODRIVE:
	LD	C,NAMEL	; DELKA JMENA SOUBORU
	CALL	MOVEFCB	; ULOZ TAM JMENO
	LD	A,B
	CP	1		; VYCERPALI JSME JMENO ?
	BR	Z,EXTPLG	; ANO - DEJ EXTENZI .PLG
	LD	A,(HL)
	OR	A	; DALSI ZNAK FALESNY ?
	BR	Z,EXTPLG	; ANO
	CP	'.'	; MA-LI BYT EXTENZE, MUSI BYT TED '.'
	JP	NZ,BADFNAME
	LD	C,EXTL
	INC	HL
	DEC	B		; PRESKOC '.'
	CALL	MOVEFCB		; ZAPIS TEDY EXTENZI
	LD	A,(HL)
	OR	A
	BR	Z,FCBREADY
	DEC	B		; SKONCIL TEDY PRESNE?
	JP	NZ,BADFNAME	; NE - SPATNE JMENO
	BRA	FCBREADY

EXTPLG:	EX	DE,HL		; ADRESU V FCB DO HL
	INC	HL
	LD	(HL),'P'
	INC	HL
	LD	(HL),'L'
	INC	HL
	LD	(HL),'G'

FCBREADY:
	POP	DE		; VYBER JEHO ADRESU
	ENDM

FCBRELOC	MACRO
	JP	IORELNEXT	; NIC SE NEDELA
	ENDM


MASKCH	MACRO
	ENDM

DEMASKCH	MACRO
	ENDM

DSPERROR	MACRO
	PUSH	BC
	LD	A,C
	ADD	A,A		; DELKA HLASKY 256 BYTU
	LD	HL,ERRNR
	LD	(HL),A
	PUSH	HL
	LD	DE,ERRBUF
	LD	C,SETDMAF
	CALL	BDOS
	LD	C,RREADF
	LD	DE,ERRFCB
	CALL	BDOS
	OR	A
	JP	NZ,ERRERR
	LD	DE,ERRBUF+BUFLENGTH
	LD	C,SETDMAF
	CALL	BDOS
	POP	HL
	INC	(HL)		; DRUHY SEKTOR HLASKY
	LD	C,RREADF
	LD	DE,ERRFCB
	CALL	BDOS
	OR	A
	JP	NZ,ERRERR
	LD	HL,ERRBUF
ERRLOP:	LD	A,(HL)
	OR	A
	BR	Z,ERRLE
	CALL	DISPA
	INC	HL
	BRA	ERRLOP
ERRLE:	LD	A,.CR
	CALL	DISPA
	POP	BC
	XOR	A
	LD	(ERRNR),A
	ENDM


EDITLINE	MACRO
	INC	DE
	PUSH	DE
	INC	DE
	EX	DE,HL
	CALL	@EDIT##		; RADKOVY EDITOR
	POP	HL
	LD	(HL),0
	DEC	HL
	INC	B
	LD	(HL),B
	EX	DE,HL
	RET
	ENDM

;;;; RUTINY VOLANE PREDCHOZIMI MAKRY

DEPENDENT	MACRO
CPMRSEC:
	LD	C,READF
	CALL	CPMRW		; PRO IN I OUT
	JP	NZ,EOFERR
	RET

CPMWSEC:
	LD	C,WRITEF
	CALL	CPMRW
	BR	NZ,DISKFULL
	RET

CPMRW:
	EX	DE,HL
	LD	(HL),BUFLENGTH
	PUSH	HL
	PUSH	HL
	PUSH	BC
	INC	HL
	LD	(HL),0
	INC	HL
	EX	DE,HL
	LD	C,SETDMAF
	CALL	BDOS
	POP	BC		; READF NEBO WRITEF
	POP	HL
	LD	DE,APTOFCB
	ADD	HL,DE
	EX	DE,HL
	CALL	BDOS
	POP	DE
	OR	A
	RET

MOVEFCB::
	DEC	B
	BR	Z,PUTSP
	LD	A,(HL)
	INC	HL
	CP	'.'
	BR	Z,PUTSP
	OR	A
	BR	NZ,PUTCHR
PUTSP:	LD	A,' '
	DEC	HL
	INC	B		; ZNAK ZRAT ZNOVU
PUTCHR:	INC	DE
	CP	'a'
	BR	C,PTC1
	AND	0DFH		; MALE PISMENO -> VELKE PISMENO
PTC1:	LD	(DE),A
	DEC	C
	BR	NZ,MOVEFCB
	RET

;;;; CHYBOVA HLASENI

DIRFULL::	ERROR	15
DISKFULL:	ERROR	56
CLSERR:	ERROR	58
NOFILE:	ERROR	55
SELERR::	ERROR	48
BDSERR::	LD	A,(ERRNR)
	OR	A
	BR	NZ,ERRERR
	ERROR	47
ERRERR:	CALL	TTYPRINT
	DB	.CR,.CR,XXLBR,'Error ????? - cannot read ERRORS.PLG',XXRBR,0
	JP	ERRLE

EOFERR::	ERROR	38

;;; DATOVE STRUKTURY

ERRFCB::	DB	0,'ERRORS  PLG',0,0,0,0
	DS	16
ECR:	DB	0
ERRNR:	DB	0
ERRHGH:	DW	0
ERRBUF:	DS	256
	ENDM		; TO JE VSE
