; CE PROGRAMME PERMET DE CONVERTIR UN FICHIER PROCEDURE
; GENERE SUR UN MCZ , EN UN FICHIER EXECUTABLE AU FORMAT INTEL
; HEXA INTEL , OU TEKTRO
;
; APPEL:
; %COPY Nom du fichier $PHEX/X [OPTIONS]
;
; X DEFINISSANT LE FORMAT DESIRE Intel,Hexa,Tektro
; OPTION PERMETTANT DE DEFINIR LA LONGUEUR DES BLOCS GENERES
; PAR  : RL=HH (HH=NOMBRE HEXA)
; OPTION PERMETTANT DE GENERER UNE AMORCE PAR  : A
;
; INITIALISATION %INITIALIZE $PHEX DDD
; AVEC DDD= $CON OU VITESSE DE TRANSMISSION
; CETTE IMPLEMENTATION CREE LE FICHIER RESULTAT SUR LE FICHIER
; DISQUE INTEL.ABS DRIVE 2
; A CE TITRE DDD N' A PAS D'ACTION MAIS DOIT ETRE PRESENT
;
; *************************************************************
;
	GLOBAL	MCZINT
MCZINT:	LD	A,(IY+1)
	LD	L,(IY+2)
	LD	H,(IY+3)
	LD	E,(IY+4)
	LD	D,(IY+5)
	LD	(IY+10),80H
	AND	A
	JR	Z,INIT
	CP	4
	JP	C,OPCOMI
	JP	Z,OPEN
	CP	6
	JP	Z,CLOSE
	CP	14
	JP	Z,WRIT
BADOP:	LD	(IY+10),0C1H
	RET
*H	INITIALISATION USART
INIT:
;
;	PUSH	AF		; TEL
;	LD	A,0		; TEL
;	LD	(FIRST),A	; TEL
;	POP	AF		; TEL
;
	LD	E,(IY+11)
	LD	D,(IY+12)
	CALL	PSPEED
	JR	Z,INIT0
	LD	(IY+10),44H
INIT0:
	LD	A,(SPEED)
	AND	A
	LD	HL,SCHR
	JR	Z,INIT1
;	LD	HL,PCHR
INIT1:
;	LD	(PRNTD),HL
	LD	HL,TINIT
	CALL	POUT
	JP	OPCOMI
POUT:
	LD	C,(HL)
	INC	C
	DEC	C
	RET	Z
	INC	HL
	OUTI
	JR	POUT
;
;	PROGRA VITESSE
PSPED0:
	INC	DE
PSPEED:
	LD	A,(DE)
	CP	KRC
	RET	Z
	CP	';'
	RET	Z
	CP	'	'
	JR	Z,PSPED0
	LD	HL,TBAUD
PSPED1:
	LD	A,(HL)
	AND	A
	JR	NZ,PSPED2
	DEC	A
	RET
PSPED2:
	LD	B,A
	INC	HL
	PUSH	DE
	XOR	A
PSPED3:
	JR	NZ,PSPED4
	LD	A,(DE)
	INC	DE
	CP	(HL)
PSPED4:
	INC	HL
	DJNZ	PSPED3
	LD	A,(HL)
	POP	DE
	INC	HL
	JR	NZ,PSPED1
	LD	(SPEED),A
	RET
TBAUD:
	DEFT	'$CON'
	DEFB	0
	DEFT	'110B'
	DEFB	KSPEED/110
	DEFT	'300B'
	DEFB	KSPEED/300
	DEFT	'1200B'
	DEFB	KSPEED/1200
	DEFT	'2400B'
	DEFB	KSPEED/2400
	DEFT	'4800B'
	DEFB	KSPEED/4800
	DEFB	0
TINIT:
	DEFB	CTC1
	DEFB	TIMMOD
	DEFB	CTC1
SPEED:
	DEFB	KSPEED/SPED		; KSPEED/SPEED
	DEFB	TTYCNT
	DEFB	0
	DEFB	TTYCNT
	DEFB	0
	DEFB	TTYCNT
	DEFB	0
	DEFB	TTYCNT
	DEFB	40H
	DEFB	TTYCNT
	DEFB	0CEH
	DEFB	TTYCNT
	DEFB	27H
	DEFB	0
*H	OPEN
OPEN:
	LD	A,(HL)
	CP	80H
	JR	Z,OPEN1
TELE0:	LD	(IY+10),46H
	RET
OPEN1:
	LD	DE,DESCRIP
	LD	BC,DESCR1-DESCRIP
	LDIR
	LD	A,(RECLG+1)
	AND	A
	JR	Z,OPEN2
	LD	HL,128
	LD	(RECLG),HL
OPEN2:
	LD	L,(IY+11)
	LD	H,(IY+12)
	LD	A,L
	OR	H
	JR	Z,OPEN3
	PUSH	HL
	POP	IX
	LD	A,(HL)
	LD	(FLAGA),A
;	LD	A,(IX+2)
;	AND	A
;	JR	Z,OPEN3
;	LD	A,(IX+3)
;	LD	(FORMAT),A
OPEN3:

;
	PUSH	HL
	PUSH	AF
	PUSH	BC		; SECURITE
;
;
;	OPEN DU FICHIER RESULTAT
;
	LD	BC,3		; CALCUL MODULE NAME ADDRESS
	PUSH	IX
	POP	HL
	ADD	HL,BC
	LD	C,0
	LD	B,(IX+2)	; MODULE NAME LENGTH
	LD	A,B
	ADD	A,4		; +   .ABS
	LD	(LNAME),A
	LD	DE,FNAME
TELE2:	LD	A,(HL)
	INC	HL
	LD	(DE),A
	INC	DE
	DJNZ	TELE2
	LD	B,4		; AJOUT EXTENSION .ABS
	LD	HL,EXT
TELE3:	LD	A,(HL)
	INC	HL
	LD	(DE),A
	INC	DE
	DJNZ	TELE3
;
	LD	IY,IOPEN
	CALL	SYSTEM
	LD	A,(SOPEN)
	BIT	6,A
	JP	Z,TELE1
	POP	BC
	POP	AF
	POP	HL
	JP	TELE0
TELE1:	LD	HL,BUFD
	LD	(ABUF),HL
	LD	HL,0
	LD	(NBCAR),HL
;
;	SORTIE RECORD ENTETE
;
	LD	C,0		; INIT BCC
	LD	A,02H		; TYPE RECORD ENTETE
	CALL	PHEXI
;
	LD	A,(IX+2)	; MODULE NAME LENGTH
	ADD	A,4		; RECORD LENGTH
	CALL	PHEXI
	LD	A,0
	CALL	PHEXI
	PUSH	BC		; SAVE BCC IN C
	LD	BC,3
	PUSH	IX
	POP	HL
	ADD	HL,BC		; MODULE NAME ADRESS
	POP	BC		; RESTORE BCC IN C
	LD	B,(IX+2)	; MODULE NAME LENGTH
	LD	A,B
	CALL	PHEXI
OPEN6:	LD	A,(HL)		; LENGTH IN B
	CALL	PHEXI
	INC	HL
	DJNZ	OPEN6
	LD	A,0		; MODULE TYPE ASSEMBLEUR
	CALL	PHEXI
	CALL	PHEXI
	XOR	A		; BCC
	SUB	C
	CALL	PHEXI
	CALL	PFLIG		; CR LF POUR FIN DE LIGNE
	POP	BC
	POP	AF
	POP	HL
;
	JP	OPCOMI
DESCRI:
TYP	DEFB	0
	DEFW	0
RECLG	DEFW	0
	DEFW	0
	DEFB	0
SAX	DEFW	0
FILRL	DEFW	0
FICNAM:	DEFS	16
TDESCR:
ADRSEG	DEFW	0
LGSEG	DEFW	0
	DEFS	19*4
DESCR1:
;
;
;
EXT:	DEFM	'.ABS'		; EXTENSION NOM FICHIER SORTIE
;
;
IOPEN:	DEFB	4		; LUN
	DEFB	4		; CODE OPEN
	DEFW	0		; ATTRIBUT ADDRESS
	DEFW	0		; ATTRIBUT LENGTH
	DEFW	0		; COMPLETION ADDRESS
	DEFW	0		; RETURN ERROR ADDRESS
SOPEN:	DEFB	0		; STATUS
	DEFW	EOPEN
EOPEN:	DEFB	1		; OPEN NEW FILE
	DEFB	'*'		; ASSIGN
LNAME:	DEFB	0		; FILENAME LENGTH
FNAME:	DEFS	16		; FILE NAME
;
;
;
ICLOS:	DEFB	4
	DEFB	06H
	DEFW	0
	DEFW	0
	DEFW	0
	DEFW	0
	DEFB	0
	DEFW	0
;
;
IWRIT:	DEFB	4
	DEFB	0EH
	DEFW	BUFD
LWRIT:	DEFW	0
	DEFW	0
	DEFW	0
SWRIT:	DEFB	0
	DEFW	0
;
;
IQAT:	DEFB	4
	DEFB	030H
	DEFW	BUFD
	DEFW	116
	DEFW	0
	DEFW	0
	DEFB	0
	DEFW	0
;
ISAT:	DEFB	4
	DEFB	02EH
	DEFW	BUFD
	DEFW	116
	DEFW	0
	DEFW	0
	DEFB	0
	DEFW	0
;
;
*H	CLOSE
CLOSE:
	LD	A,(FLAGB)
	INC	A
	RET	NZ
	LD	HL,(SAX)
	LD	(ADRSEG),HL
;
;	SORTIE RECORD DE FIN
;
	LD	C,0		; INIT BCC
	LD	A,04H		; TYPE RECORD
	CALL	PHEXI
	LD	A,05H		; RECORD LENGTH
	CALL	PHEXI
	LD	A,0
	CALL	PHEXI
	LD	A,01		; MODULE MAIN
	CALL	PHEXI
	LD	A,0		; MODULE ABSOLU
	CALL	PHEXI
	LD	A,(ADRSEG)	; ADR LANCEMENT P.FAIBLE
	CALL	PHEXI
	LD	A,(ADRSEG+1)
	CALL	PHEXI
	XOR	A		; BCC
	SUB	C
	CALL	PHEXI
	CALL	PFLIG		; CR LF POUR FIN DE LIGNE
;
;	SORTIE RECORD FIN ENREGISTREMENT
;
	LD	A,0EH		; TYPE RECORD
	CALL	PHEXI
	LD	A,01		; RECORD LENGH
	CALL	PHEXI
	LD	A,0
	CALL	PHEXI
	LD	A,0F1H		; BCC
	CALL	PHEXI
;
;
	LD	HL,(NBCAR)
	LD	A,H
	OR	L
	JP	Z,CLOS1		; NON
	LD	IY,IWRIT
	LD	(LWRIT),HL
	CALL	SYSTEM
	LD	A,(SWRIT)
	BIT	6,A
	JP	Z,CLOS1
	LD	A,(SWRIT)
	LD	(IY+10),A
	JP	OPCOMI
;
;	MODIF DU HEADER FILE
;
CLOS1:	LD	IY,IQAT		; LECTURE HEADER FILE
	CALL	SYSTEM
	LD	HL,(NBCAR)
	LD	A,L
	AND	07FH		; SUPRIME 128
	CP	0
	JP	NZ,CLOS2
	LD	A,128
CLOS2:	LD	HL,BUFD+10
	LD	(HL),A
	LD	IY,ISAT
	CALL	SYSTEM		; REECRITURE DU HEADER FILE
;
;	CLOSE DU FICHIER
	LD	IY,ICLOS
	CALL	SYSTEM
;
;
OPCOMI:
	XOR	A
	LD	(FLAGB),A
	RET
*H	WRITE
FLAGB	DEFB	0
FLAGA	DEFB	0
BUFADR	DEFW	0
BUFLG	DEFW	0
WRIT:
	LD	A,D
	OR	E
	RET	Z
	PUSH	HL
	PUSH	DE
	LD	HL,LGSEG
	LD	A,(HL)
	INC	HL
	OR	(HL)
	JR	NZ,SEG
	LD	HL,TDESCR+4
	LD	DE,TDESCR
	LD	BC,19*4
	LDIR
	LD	HL,LGSEG
	LD	A,(HL)
	INC	HL
	OR	(HL)
SEG:
	POP	DE
	POP	HL
	JR	NZ,SEG1
	LD	(IY+10),0D4H
	RET
SEG1:
	LD	A,(FLAGB)
	AND	A
	CALL	Z,AMORD
	LD	A,-1
	LD	(FLAGB),A
*E
	PUSH	HL
	CALL	LDSLG
	EX	DE,HL
	XOR	A
	SBC	HL,DE
	JR	NC,WRI0
	ADD	HL,DE
	EX	DE,HL
	LD	(LGSEG),HL
	LD	A,C
	SUB	L
	LD	L,A
	LD	A,B
	SBC	A,H
	LD	H,A
	LD	(LGSEG),HL
	LD	HL,0
	LD	(BUFLG),HL
	POP	HL
	JR	WRI1
WRI0:
	LD	(BUFLG),HL
	POP	HL
	PUSH	HL
	ADD	HL,DE
	LD	(BUFADR),HL
	LD	HL,0
	LD	(LGSEG),HL
	LD	D,B
	LD	E,C
	POP	HL
WRI1:
	LD	BC,(RECLG)
	EX	DE,HL
	XOR	A
	SBC	HL,BC
	JR	NC,WRI2
	ADD	HL,BC
	LD	C,L
	LD	B,H
	LD	HL,0
WRI2:
	EX	DE,HL
	PUSH	BC
	CALL	PBLOC
	PUSH	HL
	PUSH	DE
	CALL	TTYTST
	POP	DE
	POP	HL
	POP	BC
	JP	WRI3		; TELEMECANIQUE
;	JR	NZ,WRI3
	LD	(IY+10),49H
	RET
WRI3:
	PUSH	HL
	LD	HL,(ADRSEG)
	ADD	HL,BC
	LD	(ADRSEG),HL
	POP	HL
	LD	A,D
	OR	E
	JR	NZ,WRI1
	LD	DE,(BUFLG)
	LD	HL,(BUFADR)
	JP	WRIT
LDSLG:
	PUSH	DE
	LD	HL,(LGSEG)
	LD	DE,(FILRL)
	LD	C,L
	LD	B,H
	DEC	DE
	ADD	HL,DE
	LD	A,E
	CPL
	AND	L
	LD	L,A
	LD	A,D
	CPL
	AND	H
	LD	H,A
	POP	DE
	RET
*H	FORMAT
AMORD:
	LD	A,(FLAGA)
	CP	3
	RET	NZ
	LD	A,XON
	CALL	PRNT
	PUSH	BC
	LD	B,80
AMORD1:
	XOR	A
	CALL	PRNT
	DJNZ	AMORD1
	LD	A,02H
	CALL	PRNT
	POP	BC
	RET
AMORF:
	LD	A,(FLAGA)
	CP	3
	RET	NZ
	XOR	A
	LD	B,80
AMORF1:
	CALL	PRNT
	DJNZ	AMORF1
	LD	A,XOFF
	CALL	PRNT
	RET
PBLOC:
;	LD	A,(FORMAT)
;	CP	'I'
;	JR	Z,INTEL
	JP	INTEL		; FORCE INTEL PAR DEFAULT
	CP	'H'
	JP	Z,HEXA
	CP	'T'
	JP	Z,TEKTRO
	LD	(IY+10),0C1H
	LD	DE,0
	RET
FORMAT	DEFB	'T'
*H	FORMAT INTEL
INTEL:
	LD	B,C
	LD	C,0		; INIT BCC
	LD	A,06H		; TYPE RECORD DATA
	CALL	PHEXI
	LD	A,B		; DATA LENGTH
	ADD	A,4		; RECORD LENGTH
	CALL	PHEXI		; RC LENGTH P.FAIBLE
	LD	A,0
	CALL	PHEXI		; P.FORT
	LD	A,0		; MODULE ABSOLU
	CALL	PHEXI
	LD	A,(ADRSEG)	; ADR CHARGEMENT P.FAIBLE
	CALL	PHEXI
	LD	A,(ADRSEG+1)	; ----------------- FORT
	CALL	PHEXI
INTEL1:
	LD	A,B		; DATA LENGTH
	AND	A
	JR	Z,INTEL2
	LD	A,(HL)
	INC	HL
	CALL	PHEXI
	DJNZ	INTEL1
INTEL2:
	XOR	A
	SUB	C
	CALL	PHEXI		; BCC
	JR	PFLIG
RTYPI	EQU	0
PFLIG:
;	LD	A,KLF
;	CALL	PRNT
;	LD	A,KRC
;	CALL	PRNT
;	LD	A,0
;	CALL	PRNT
;	CALL	PRNT
	RET
PHEXI:	CALL	PRNT
	RET
	PUSH	AF
	ADD	A,C
	LD	C,A
	POP	AF
PHEX:
	CALL	PHE
PHE:
	RLCA
	RLCA
	RLCA
	RLCA
PHA:
	PUSH	AF
	AND	0FH
	ADD	A,90H
	DAA
	ADC	A,40H
	DAA
	CALL	PRNT
	POP	AF
	RET
*H	FORMAT HEXA
HEXA:	EQU	$
	CALL	PFLIG
	LD	A,'$'
	CALL	PRNT
	LD	A,(ADRSEG+1)
	CALL	PHEX
	LD	A,(ADRSEG)
	CALL	PHEX
	LD	A,','
	CALL	PRNT
	CALL	PFLIG
	LD	B,16
	LD	A,C
	AND	A
	RET	Z
HEXA1:
	LD	A,(HL)
	INC	HL
	CALL	PHEX
	LD	A,' '
	CALL	PRNT
	DJNZ	HEXA2
	LD	B,16
	CALL	PFLIG
HEXA2:
	DEC	C
	JR	NZ,HEXA1
	RET
*H	FORMAT TEKTRO
TEKTRO:	LD	B,C
	LD	C,0
	LD	A,'/'
	CALL	PRNT
	LD	A,(ADRSEG+1)
	CALL	PHEXT
	LD	A,(ADRSEG)
	CALL	PHEXT
	LD	A,B
	CALL	PHEXT
	LD	A,C
	CALL	PHEXT
	LD	C,0
	LD	A,B
	AND	A
	JR	Z,PBLO2
PBLO1:
	LD	A,(HL)
	INC	HL
	CALL	PHEXT
	DJNZ	PBLO1
	LD	A,C
	CALL	PHEXT
PBLO2:
	JP	PFLIG
PHEXT:
	CALL	PHET
PHET:
	RLCA
	RLCA
	RLCA
	RLCA
	PUSH	AF
	AND	0FH
	ADD	A,C
	LD	C,A
	POP	AF
	JP	PHA
*H	SORTIE D'UN CAR
PRNT:
	PUSH	IX
	PUSH	BC
	PUSH	DE
	PUSH	HL
	PUSH	AF
	LD	HL,(ABUF)
	LD	(HL),A
	INC	HL
	LD	(ABUF),HL
	LD	HL,(NBCAR)
	INC	HL
	LD	(NBCAR),HL
	LD	A,L
	CP	128
	JP	NZ,PRN2
;
;	WRITE DU BUFFER SUR DISQUE
;
	LD	IY,IWRIT
	LD	(LWRIT),HL
	CALL	SYSTEM
	LD	A,(SWRIT)
	BIT	6,A
	JP	Z,PRN1
	LD	A,(SWRIT)
	LD	(IY+10),A
	JR	PRN2
PRN1:	LD	HL,BUFD
	LD	(ABUF),HL
	LD	B,128
	LD	A,0
PRN3:	LD	(HL),A
	INC	HL
	DJNZ	PRN3
;
	LD	HL,0
	LD	(NBCAR),HL
PRN2:	POP	AF
	POP	HL
	POP	DE
	POP	BC
	POP	IX
	RET
;
;
ABUF:	DEFS	2		; ADR POINTEUR COURANT SUR BUFD
NBCAR:	DEFS	2		; NBR DE CAR DANS BUFD
BUFD:	EQU	$		; BUFFER ECRITURE DISQUE
	DEFS	128		; 40K DE BUFFER
;				; $ -> FC00 NON RESERVE PAR DES
;				; DIRECTIVES DEFS CAR LINK PLANTE...
;				; PROGRAM TOO BIG ...
; LE SOFT RIO EST UN PEU LEGER !!!
;
;
TTYCNT	EQU	0DH
TRMCHR	EQU	0
TTY	EQU	0DEH
CTC1	EQU	0D9H
TIMMOD	EQU	07H
KSPEED	EQU	4800
KLF	EQU	0AH
KRC	EQU	0DH
SPED	EQU	300
XON	EQU	12H
XOFF	EQU	14H
SYSTEM	EQU	1403H
	EXTERNAL	TTYTST
	EXTERNAL	SCHR,INTZ
