;---------------------------------------------------------------------------
;===========================================================================
;---------------------------------------------------------------------------

;			PROGRAMMA GESTIONE OMR

;	VERSIONE: 	1.0

;	DATA:		3/91

;	AUTORE:		G.BECATTINI (DA UN PROGRAMMA PRECEDENTE DI A.TARANI)

;	COPYRIGHT:	LOGITRON SRL - FIRENZE

;---------------------------------------------------------------------------
;===========================================================================
;---------------------------------------------------------------------------

;===========================================================================
;	DEFINIZIONE COSTANTI
;===========================================================================

RECEIVE	EQU	1
TRASMIT	EQU	1-RECEIVE

KDLY	EQU	12			;COSTANTE RITARDO EEPROM

SIOAD	EQU	104
SIOAC	EQU	SIOAD+1
SIOBD	EQU	SIOAD+2
SIOBC	EQU	SIOAD+3

CTC0	EQU	100
CTC1	EQU	CTC0+1
CTC2	EQU	CTC0+2
CTC3	EQU	CTC0+3

;	PORTA INGRESSI

PIN	EQU	0C8H

;	BIT UTILIZZATI

RESI	EQU	0			;/RESET 	(0 = RESET)
REWR	EQU	1			;WRITE/READ 	(1 = WRITE)
STMO	EQU	2			;START MOTORE 	(1 = START)
STOP	EQU	3			;A CAPO		(1 = A CAPO)
COPE	EQU	4			;COPERTURA RD	(1 = ABIL.RD)
KEY	EQU	7			;/TASTO		(0 = PREMUTO)

;	PORTA USCITE (DISPLAY)

;	I SEGMENTI DA 'A' A 'G' SONO SUI BIT DA 0 A 6
;	IL BIT 7 E' IL SEGNALE /LOW ALLA CARD

POUT	EQU	0C4H

;	USCITA DA SIO BIT "DTR" - DTR E' IL COMPLEMENTO DEL BIT 7 DEL REG. 5
;	LIDR: MEGLIO PENSARLO COME /HOME

LIDR	EQU	7			;TESTINA A CAPO (0 = A CAPO)


	CSEG

;===========================================================================
;	PROGRAMMA PRINCIPALE
;===========================================================================

;	QUESTO PRIMO SEGMENTO E' COMUNE PER LETTURE E SCRITTURE

	LD	SP,USTK

RESTART:CALL	INISYS		;INIZIALIZZAZIONI VARIE

	LD	HL,BUFFER	;PREDISPONI PUNTATORE
	LD	(WRPNT),HL

	LD	HL,0
	LD	(RXCHCNT),HL

	CALL	PRESIO 		;INIZIALIZZAZIONI VARIE

;	LA ROUTINE EXTINT SETTA (SNCFLG) QUANDO VIENE RILEVATO IL
;	PRIMO FLAG SDLC

	CALL	SETSIO
;
READST	DEFB	READLN-1
;	DEFB	73H		;RESET CRC + ERROR RESET + REG.3
;	DEFB	0DDH		;RX 8 BIT + HUNT PHASE + RX CRC ENA +
;				;+ ADDRESS SEARCH MODE (SDLC) + RX ENA
	DEFB	73H		;RESET CRC + ERROR RESET + REG.3
	DEFB	0D9H		;RX 8 BIT + HUNT PHASE + RX CRC ENA + RX ENA

	DEFB	5		;REG. 5
	DEFB	068H		;TX 8 BIT + TX ENA

	DEFB	1		;REG. 1
	DEFB	15H		;INT RX ENA + PARITY AFFECTS VECTOR +
				;+ EXT INT ENA
READLN	EQU	$-READST

	EI
SLF:

	IF	TRASMIT
	CALL	SPROG

	LD	HL,STRING1
	LD	(TXPOINT),HL

	LD	HL,30
	LD	(TXCHCNT),HL

	CALL	SNDFIL

	JR	SLF
	ENDIF





;---------------------------------------------------------------------------
;	RICEZIONE DI UN FILE
;---------------------------------------------------------------------------

;	PER RISPARMIARE TEMPO SI IPOTIZZA OGNI OPERAZIONE ESSERE DI LETTURA
;	SALVO SUCCESSIVA PROVA CONTRARIA

RCVFIL:	LD	HL,BUFFER	;PREDISPONI PUNTATORE
	LD	(WRPNT),HL

	LD	HL,0
	LD	(RXCHCNT),HL

;	ATTENDI SINCRO

;	manca roba



	XOR	A
	LD	(SNCFLG),A	;AZZERA SEGNALE DI FLAG SDLC ARRIVATA

	EI

;	SIAMO PRONTI AD ATTENDERE IL SINCRONISMO - NELL'ATTESA SI CONTROLLA
;	CHE L'OPERAZIONE FOSSE PROPRIO DI (NOSTRA) LETTURA - SE NON LO E' SI
;	SPROGRAMMA LA SIO E SI RIPROGRAMMA PER INVIARE IL FILE

;G	CALL	NOHOME		;INIZIA IL VIAGGIO DELLA TESTINA
				;(E QUINDI HOST INIZIA A TRASMETTERE)
;G	LD	B,50		;ATTENDI >150 USEC PER AVERE REWR VALIDO
;G	DJNZ	$		;TANTO SI RICEVE UGUALE

;G	IN	A,(PIN)
;G	BIT	REWR,A		;VEDI SE OPERAZIONE E' PROPRIO DI LETTURA
;G	JR	Z,DOSND1	;NO, DOBBIAMO INVIARE UN FILE

;	LA PARTE CHE SEGUE E' ESEGUITA SOLO IN SCRITTURA

WTS:	LD	A,(SNCFLG)	;ATTENDE SINCRO
	OR	A
	JR	Z,WTS


WTRDONE	LD	A,(SNCFLG)	;FLAG SINCRO USATO AL CONTRARIO PER SEGNALARE
	OR	A		;FINE LETTURA
	JR	NZ,WTRDONE


WTREWRL:IN	A,(PIN)			;ATTENDI SEGNALE R/W NON PIU' W
	BIT	REWR,A
	JR	NZ,WTREWRL

	CALL	SPROG			;'SPROGRAMMA' SIO


WTRERD:	IN	A,(PIN)			;DOPO SCRITTURA SEGUE SEMPRE RILETTURA
	BIT	STOP,A			;QUINDI ATTENDI HOME TESTINA
	JR	Z,WTRERD

;	CALL	NOHOME			;SEGNALA SUBITO TESTINA HOME

	CALL	WRFIL			;E COPIA COSI' LUI ASPETTA
	CALL	ISHOME
	JR	DOSND

DOSND1:	CALL	SPROG			;E CADE IN INVIO FILE QUI SOTTO

;---------------------------------------------------------------------------
;	TRASMISSIONE DI UN FILE
;---------------------------------------------------------------------------

DOSND:	CALL	RDFIL

	LD	HL,BUFFER+3		;LOC. INIZIO FILE DA TRASMETTERE
;	INC	HL			;ESCLUDI N.MACCHINA
;	INC	HL			;ESCLUDI N.PROG.HI
;	INC	HL			;ESCLUDI N.PROG.LOW
	LD	(TXPOINT),HL

	LD	HL,(TXCHCNT)		;NUMERO CARATTERI DA INVIARE
	DEC	HL			;ESCLUDI N.MACCHINA
	DEC	HL			;ESCLUDI N.PROG.HI
	DEC	HL			;ESCLUDI N.PROG.LOW

	DEC	HL			;ESCLUDI CRC DAL CONTEGGIO
	LD	(TXCHCNT),HL

	CALL	SNDFIL

	CALL	SPROG

	LD	A,(PNUMR)		;COPIA NUMERO PROGRAMMA CORRENTE
	LD	(PNUME),A		;IN EEPROM
	CALL	EDLY

WTSTMOL:IN	A,(PIN)			;ATTENDI BASSO STMO MA TENENDO D'OCCHIO
					;ANCHE STOP
	BIT	STOP,A			;SE HOST VUOLE FARE UN ALTRO GIRO
	JP	NZ,RESTART		;SALTA

	BIT	STMO,A
	JP	Z,RESTART

	JR	WTSTMOL


;---------------------------------------------------------------------------
;	GESTIONE TASTO
;---------------------------------------------------------------------------

TASTO:	CALL	NXTPRG

TST2:	CALL	EDLY		;ANTIRIMBALZO
	IN	A,(PIN)
	BIT	KEY,A
	JR	Z,TST2
	JP	TST2	;G

;G	JP	WTSTMOH

;===========================================================================
;	SOTTOPROGRAMMI
;===========================================================================

;---------------------------------------------------------------------------
;	INISYS - INIZIALIZZA SISTEMA
;---------------------------------------------------------------------------
INISYS:

KIO	EQU	60H
PIOAD	EQU	KIO
PIOAC	EQU	KIO+1
PIOBD	EQU	KIO+2
PIOBC	EQU	KIO+3
	LD	A,89H		;WR ENABLE + ORDINE SIO - CTC - PIO
	OUT	(KIO+14),A

	LD	A,0FFH
	OUT	(PIOAC),A

	LD	A,62H
	OUT	(PIOAC),A	;SONO IN SOLO SO, AUTOSTART E AUX

	LD	A,07FH		;SPEGNI LED
	OUT	(PIOAD),A


	LD	A,.HIGH.TABINT
	LD	I,A
	IM	2

	IF	TRASMIT
	LD	A,5		;CTC PER CLOCK 2.5 MHZ
	OUT	(CTC0),A
	LD	A,6		;COSTANTE
	OUT	(CTC0),A
	ENDIF

	LD	HL,BUFFER
	LD	(TXPOINT),HL

	CALL	SETSIO
;
STARTS	DEFB	STARTL-1
	DEFB	4 		;REG.4
	DEFB	20H		;SDLC - SYNC MODE - NO PARITY
	DEFB	5
	DEFB	00H		;TESTINA NON HOME
STARTL	EQU	$-STARTS

	RET

;---------------------------------------------------------------------------
;	BANK0 - SELEZIONA IL BANCO 0 (QUELLO DI SERVIZIO) DELLA EEPROM
;---------------------------------------------------------------------------

;	DOPO L'USO CHIAMARE DISP

BANK0:	XOR	A		;BANCO 0
	LD	(BKSEL),A
	OUT	(POUT),A
	RET

;---------------------------------------------------------------------------
;	BANK1 - SELEZIONA IL BANCO 1 (QUELLO DI SERVIZIO) DELLA EEPROM
;---------------------------------------------------------------------------

;	DOPO L'USO CHIAMARE DISP

BANK1:	LD	A,80H		;BANCO 1
	LD	(BKSEL),A
	OUT	(POUT),A
	RET

;---------------------------------------------------------------------------
;	NXTPRG - SELEZIONA IL PROSSIMO PROGRAMMA
;---------------------------------------------------------------------------

;	I PROGRAMMI AMMESSI VANNO DA 1 A 7

NXTPRG:	CALL	BANK0		;SELEZIONA LA PAGINA DI SERVIZIO
	LD	A,(PNUMR)
	INC	A
	CP	8		;SEI AL MASSIMO?
	JR	NZ,NXT2
	LD	A,1		;RICIRCOLA
NXT2:	LD	(PNUMR),A
	CALL	EDLY		;ATTENDI PER SCRITTURA EEPROM
	CALL	DISP
	RET

;---------------------------------------------------------------------------
;	DISP - ESEGUE IL DISPLAY DEL NUMERO DI PROGRAMMA ATTUALE
;---------------------------------------------------------------------------

;	DISTRUGGE SOLO ACC

DISP:	PUSH	BC
	PUSH	HL
	CALL	BANK0
	LD	B,0
	LD	A,(PNUMR)
	LD	C,A
	LD	HL,ZERO7		;BASE DELLA TABELLA
	ADD	HL,BC			;AGGIUNGI OFFSET
	LD	A,(HL)			;CARICA COSTANTE
	LD	B,A			;SALVA
	LD	A,(BKSEL)		;COMBINA CON BIT SELEZIONE EEPROM
	OR	B
	LD	A,B			;EMETTI SU PORTA DI USCITA
	OUT	(POUT),A
	POP	HL
	POP	BC
	RET

;---------------------------------------------------------------------------
;	CKCARD - CONTROLLA CARTUCCIA
;---------------------------------------------------------------------------

;	CONTROLLA CARTUCCIA - DEVE CONTENERE UN NUMERO DI PROGRAMMA COMPRESO
;	TRA 1 E 7 - SE NON LO E' VI SCRIVE 1 (LEGGERA' SCHIFEZZE E MPMR ANDRA'
;	IN ERRORE - UTENTE DEVE REGISTRARE PROGRAMMA)
;	IN CASO DI CARTUCCIA NON BUONA CONTROLLA SE HA PRESO LO '1'
;	SE COSI' NON FOSSE DEDUCE CHE LA CARTUCCIA NON E' INSERITA E VA
;	IN BLOCCO CON '0' SUL DISPLAY

CKCARD:	CALL	BANK0
	LD	A,(PNUME)		;CONTROLLIAMO CHE CARTUCCIA
	BIT	7,A			;SIA USABILE
	JR	NZ,FORMAT		;NON DEVE ESSERE NEGATIVO

	OR	A			;NE' ZERO
	JR	Z,FORMAT

NOLT1:	CP	8
	LD	(PNUMR),A		;COPIA NUMERO LETTO IN RAM
	RET	C			;MINORE O UGUALE A 7 - OK

FORMAT:	LD	A,1			;<1 O >7 - INIZIALIZZA
	LD	(PNUME),A		;SCRIVI IN EEPROM E
	LD	(PNUMR),A		;COPIA NUMERO IN RAM
	CALL	EDLY

	LD	A,(PNUME)		;CONTROLLIAMO PERO' CHE CARTUCCIA
	CP	1			;CI SIA DAVVERO
	RET	Z

	LD	A,(ZERO7)		;DISPLAY ZERO
	OUT	(POUT),A
	DI
	JR	$			;BLOCCO


;---------------------------------------------------------------------------
;	SETBK - PREDISPONE PER LETTURA O SCRITTURA
;---------------------------------------------------------------------------

;	SELEZIONA BANCO E LASCIA DE ALL'INDIRIZZO DELL'AREA DA USARE
;	PER UNA LETTURA OD UNA SCRITTURA EEPROM
;	SPEGNE DISPLAY

SETBK:	PUSH	HL
	LD	HL,FAT
	LD	A,(PNUMR)
	LD	E,A
	LD	D,0
	ADD	HL,DE			;OGNI ELEMENTO DELLA TAB. E' 3 BYTES
	ADD	HL,DE
	ADD	HL,DE
	LD	A,(HL)
	OUT	(POUT),A
	LD	(BKSEL),A
	INC	HL
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	POP	HL
	RET

;---------------------------------------------------------------------------
;	SNDFIL - TRASMISSIONE DI UN FILE
;---------------------------------------------------------------------------

;	(TXPOINT) = INIZIO BUFFER
;	(TXCHCNT) = NUMERO DI BYTES DA INVIARE

SNDFIL:	CALL	PRESIOTX	;PREINIZIALIZZAZIONI SIO

	CALL	SETSIO		;PREDISPONI SIO PER TRASMISSIONE
;
WRST	DB	WRSTL-1
	DB	81H 		;TX CRC RESET + REG.1
	DB	6 		;TX INT ENABLE + STATUS AFFECTS VECTOR
				;(PER IL CANALE A ?)
	DB	5 		;REG.5
	DB	069H		;DTR + TX 8 BIT CHAR + TX ENA + TX CRC ENA
WRSTL	EQU	$-WRST
;
	LD	A,(BUFFER)	;INVIA INDIRIZZO (E AVVIA SEQUENZA INTERRUPT)
	OUT	(SIOAD),A	;(CODICE MACCHINA)

	LD	A,0		;RESETTA FLAG DI FINE SCRITTURA
	LD	(WRDONE),A

	LD	IY,(TXPOINT) 	;PREDISPONE PUNTATORE
	LD	BC,(TXCHCNT)	;E LUNGHEZZA

	EI			;ABILITA INTERRUPTS PER TX

WR2
;	IN	A,(PIN)		;SE MOTORE SI FERMA, ABORTISCI
;	BIT	STMO,A
;	RET	Z
	LD	A,(WRDONE) 	;ATTESA SCRITTURA EFFETTUATA
	OR	A
	JR	Z,WR2
	RET


;----------------------------------------------------------------------------
;	SETSIO - ROUTINES DI PROGRAMMAZIONE SIO
;----------------------------------------------------------------------------

;	SETSIO INIZIALIZZA LA SIO SIOAC
;	SETSIA INIZIALIZZA LA SIO INDICATA NEL REGISTRO C

;	PREVEDE TABELLA SUBITO DOPO LA CALL

SETSIO	LD	C,SIOAC
SETSIA	POP	HL		;INDIRIZZO DI RITORNO DELLA ROUTINE
				;(I DATI SONO MISCHIATI NEL CODICE)
	LD	B,(HL)
	INC	HL
	OTIR
	JP	(HL)

;---------------------------------------------------------------------------
;	PRESIOTX - GENERICHE PREDISPOSIZIONI PER SIO (USATA IN TX)
;---------------------------------------------------------------------------

PRESIOTX IN	A,(SIOAD)	;SVUOTA BUFFER RX SIO
	IN	A,(SIOAD)
	IN	A,(SIOAD)

	LD	DE,SIOAVT 	;PREDISPONE TAVOLA VETTORI INTERRUPT
	LD	HL,DKINV1	;CON WRCH1, CAPOIN, RDCH1, RDSP
	LD	BC,8
	LDIR

	CALL	SETSIO		;PROGRAMMA SIO
CAPOCX	DB	CAPOCLX-1
	DB	5		;REG.5
	DB	068H		;DTR + TX 8 BIT + TX ENA + SDLC
	DB	7		;REG. 7
	DB	0H		;SYNCRO FLAG = 0 PER ZERI INIZIALI
CAPOCLX	EQU	$-CAPOCX

	LD	A,10H		;RESET EXT/STATUS INTERRUPT
	OUT	(SIOAC),A

	LD	C,10
	CALL	DLY1
	JR	PRESIO2

;---------------------------------------------------------------------------
;	PRESIO - GENERICHE PREDISPOSIZIONI PER SIO (USATA IN RX)
;---------------------------------------------------------------------------

PRESIO	IN	A,(SIOAD)	;SVUOTA BUFFER RX SIO
	IN	A,(SIOAD)
	IN	A,(SIOAD)

	LD	DE,SIOAVT 	;PREDISPONE TAVOLA VETTORI INTERRUPT
	LD	HL,DKINV1	;CON WRCH1, CAPOIN, RDCH1, RDSP
	LD	BC,8
	LDIR

	CALL	SETSIO		;PROGRAMMA SIO
CAPOC	DB	CAPOCL-1
	DB	5		;REG.5
	DB	068H		;DTR + TX 8 BIT + TX ENA + SDLC
CAPOCL	EQU	$-CAPOC

	LD	A,10H		;RESET EXT/STATUS INTERRUPT
	OUT	(SIOAC),A


PRESIO2:LD	C,SIOBC		;INIZIALIZZAZIONE DELLA SIO B
	CALL	SETSIA		;(LA SIO B NON C'E' - PROGRAMMA SOLO
				;STATUS AFFECTS VECTOR E VETTORE)

CAPOB	DB	CAPOBL-1	;NUMERO DI ELEMENTI DELLA TABELLA
	DB	1		;REG. 1
	DB	4		;STAT. AFFECTS VECTOR
	DB	2		;INT. VECTOR
	DB	.LOW.TABINT
CAPOBL	EQU	$-CAPOB

	CALL	SETSIO		;INIZIALIZZAZIONE DELLA SIO A

CAPOA	DB	CAPOAL-1 	;NUMERO DI ELEMENTI DELLA TABELLA
	DB	11H		;RES. EXT/STAT + REG. 1
	DB	5		;INT ON ALL RX CHAR + PARITY AFFECTS VECTOR +
				;+ EXT INT ENABLE

	DB	5		;REG. 5
	DB	060H		;SET DTR + TX 8 BIT CHAR + SDLC

	DB	7		;REG. 7
	DB	7EH		;SYNCRO FLAG = 7EH (COME GIUSTO PER SDLC)

	DB	6		;REG. 6 - SECONDARY ADDRESS FIELD
CAPOAL	EQU	$-CAPOA		;VIENE INVIATO DOPO CON UNA OUT
 				;LA ROUTINE RITORNA QUI

;	LD	A,(BUFFER)	;CODICE MACCHINA NEL REGISTRO 6
	LD	A,99
	OUT	(SIOAC),A	;(SECONDARY ADDRESS FIELD)

	RET


;---------------------------------------------------------------------------
;	WTSYNC - PROGRAMMA SIO ED ATTENDE UN SEGNALE DI SINCRONISMO
;---------------------------------------------------------------------------

;---------------------------------------------------------------------------
;	ISHOME - ATTIVA LIDR (OSSIA LO METTE BASSO)
;---------------------------------------------------------------------------

ISHOME:	LD	A,5			;ATTIVA LIDR
	OUT	(SIOAC),A		;REG. 5
	XOR	A
	SET	LIDR,A			;ALTRI BIT SARANNO PROGRAMMATI DOPO
	OUT	(SIOAC),A
	RET

;---------------------------------------------------------------------------
;	NOHOME - DISATTIVA LIDR (OSSIA LO METTE ALTO)
;---------------------------------------------------------------------------

NOHOME:	LD	A,5			;DISATTIVA LIDR
	OUT	(SIOAC),A		;REG. 5
	XOR	A
	RES	LIDR,A			;ALTRI BIT SARANNO PROGRAMMATI DOPO
	OUT	(SIOAC),A
	RET


;---------------------------------------------------------------------------
;	WTSTOPH - ATTENDE STOP ALTO (SEGNALE COMANDO HOME TESTA)
;---------------------------------------------------------------------------

WTSTOPH:IN	A,(PIN)			;ATTENDI STOP ALTO (RITORNO A CAPO)
	BIT	STOP,A
	JR	Z,WTSTOPH
	RET

;---------------------------------------------------------------------------
;	DLY - ATTESA
;---------------------------------------------------------------------------

DLY:	LD	C,100			;ATTESA PER MAGGIORE REALISMO
DLY1:	LD	B,0
	DJNZ	$
	DEC	C
	JR	NZ,DLY1
	RET


;---------------------------------------------------------------------------
;	SPROG - 'SPROGRAMMA' LA SIO
;---------------------------------------------------------------------------
SPROG:	CALL	SETSIO
OFFST	DEFB	OFFSTL-1
	DEFB	1 			;REG.1
	DEFB	0

	DEFB	5 			;REG.5
	DEFB	060H			;TX 8 BIT CHAR + TX DISABLE

	DEFB	3 			;REG.3
	DEFB	0C0H			;RX 8 BIT CHAR + RX DISABLE
OFFSTL	EQU	$-OFFST

;	LD	A,18H			;SOFTWARE RESET
;	OUT	(SIOAC),A

 	RET

;---------------------------------------------------------------------------
;	RDFIL - CARICA IL BUFFER DA EEPROM DALLA POSIZIONE ATTUALE
;---------------------------------------------------------------------------

RDFIL:	CALL	BANK0			;OPERA IN PAGINA SERVIZIO
	LD	HL,NAMELEN		;CARICA LA LUNGHEZZA DEL PROG
	LD	A,(PNUMR)		;DALL'APPOSITO SPAZIO IN TABELLA
	LD	E,A
	LD	D,0
	ADD	HL,DE			;OGNI ELEMENTO E' 5 BYTES
	ADD	HL,DE
	ADD	HL,DE
	ADD	HL,DE
	ADD	HL,DE

	LD	C,(HL)			;LEGGI NUMERO CARATTERI
	INC	HL
	LD	B,(HL)

	LD	A,21H			;SERVE PER EVITARE CARICAMENTI ASSURDI
	CP	B			;IN CASO DI EEPROM SPORCA
	JR	NC,LENOK
	LD	B,20H			;FORZA 8K - PMR ANDRA' IN ERRORE

LENOK:	LD	(TXCHCNT),BC		;PREDISPONI PER TRASMISSIONE

	INC	HL
	LD	A,(HL)
	LD	(BUFFER),A		;ADESSO CARICA CODICE MACCHINA

	INC	HL
	LD	A,(HL)			;E NOME PROGRAMMA LO
	LD	(BUFFER+1),A

	INC	HL
	LD	A,(HL)			;ED HI
	LD	(BUFFER+2),A

	CALL	SETBK			;ORIGINE
	EX	DE,HL			;SETBK SETTA DE - METTI IN HL

	LD	DE,BUFFER+3		;DESTINAZIONE - (SALTA NOME PROGR)
	LDIR
	CALL	DISP			;RIATTIVA DISPLAY
	RET

;---------------------------------------------------------------------------
;	WRFIL - COPIA RAM->EPROM
;---------------------------------------------------------------------------

WRFIL:	CALL	BANK0			;OPERA IN PAGINA SERVIZIO
	LD	BC,(RXCHCNT)		;NUMERO DEI CARATTERI DA SCRIVERE

	LD	HL,NAMELEN		;REGISTRA LA LUNGHEZZA DEL PROG
	LD	A,(PNUMR)		;NELL'APPOSITO SPAZIO IN TABELLA
	LD	E,A
	LD	D,0
	ADD	HL,DE			;OGNI ELEMENTO E' 5 BYTES
	ADD	HL,DE
	ADD	HL,DE
	ADD	HL,DE
	ADD	HL,DE

	LD	(HL),C			;NUMERO DEI CARATTERI RICEVUTI

	INC	HL
	LD	(HL),B

	INC	HL
	LD	A,(BUFFER)		;ADESSO AGGIUNGE CODICE MACCHINA
	LD	(HL),A

	INC	HL
	LD	A,(BUFFER+1)		;E NOME PROGRAMMA LO
	LD	(HL),A

	INC	HL
	LD	A,(BUFFER+2)		;ED HI
	LD	(HL),A

	CALL	EDLY

	CALL	SETBK			;FISSA BANCO E DE (DESTINAZIONE)
	LD	HL,BUFFER+3		;INIZIO BUFFER (ORIGINE) NOME ESCL.
	LD	BC,(RXCHCNT)		;NUMERO DEI CARATTERI DA SCRIVERE

	SRL	B			;B/2
	RR	C

	SRL	B			;B/4
	RR	C

	SRL	B			;B/8
	RR	C

	SRL	B			;B/16
	RR	C

	SRL	B			;B/32
	RR	C

	SRL	B			;B/64
	RR	C

	INC	C			;UNO DI PIU'

	LD	A,80H			;MASSIMO N.BLOCCHI = 128
	CP	C
	JP	NC,NBOK			;N.BLOCCHI OK?
	LD	C,80H			;AL PIU' 128 BLOCCHI

NBOK:	LD	B,C

EELOP:	CALL	MOV64
	DJNZ	EELOP
	CALL	DISP			;RIATTIVA DISPLAY
	RET

;---------------------------------------------------------------------------
;	MOV64 - REGISTRA 64 BYTES IN EEPROM
;---------------------------------------------------------------------------

;	TRASFERISCE 64 BYTE DA (HL) A (DE)

MOV64: 	PUSH	BC			;SALVA IL PUNTATORE PRINCIPALE
	LD	B,64

BLK64:	LD	A,(HL)			;ESEGUE UNA LDIR CON CONTROLLO
	LD	(DE),A			;REGISTRA
	INC	HL
	INC	DE
	DJNZ	BLK64

	CALL	EDLY			;ATTESA PER SCRITTURA IN MODO PAGE

	POP	BC
	RET

;---------------------------------------------------------------------------
;	EDLY - RITARDO 10 MSEC PER SCRITTURA IN EPROM
;---------------------------------------------------------------------------

EDLY:	PUSH	BC
	LD	C,KDLY
	CALL	DLY1
	POP	BC
	RET

;===========================================================================
;	ROUTINES DI SERVIZIO INTERRUPT
;===========================================================================

;---------------------------------------------------------------------------
;	RDCH1 - SERVIZIO INTERRUPT CARATTERE RICEVUTO
;---------------------------------------------------------------------------
RDCH1:	EX	AF,AF'
	EXX
	IN	A,(SIOAD)	;LEGGE DATO

	LD	HL,(WRPNT)	;CARICA PUNTATORE
	LD	(HL),A		;SALVA CARATTERE
	INC	HL		;INCREMENTA PUNTATORE
	LD	(WRPNT),HL

	LD	HL,(RXCHCNT)	;AGGIORNA CONTACARATTERI
	INC	HL
	LD	(RXCHCNT),HL

	EX	AF,AF'
	EXX
	EI
	RETI

;---------------------------------------------------------------------------
;	WRCH1 - SERVIZIO INTERRUPT BUFFER TX VUOTO
;---------------------------------------------------------------------------

;	MODIFICA DINAMICAMENTE LA TABELLA DEI VETTORI PER CHIAMARE VIA VIA
;	DELLE ROUTINES DIVERSE

;	INVIA PRIMA META' DI PROGRM (CODICE MACCHINA E' GIA' STATO INVIATO
;	DA SNDFIL)

WRCH1	PUSH	AF
	PUSH	HL
	LD	A,(BUFFER+1)	;PROGRM E' 16 BIT - LO MANDA IN DUE VOLTE
	LD	HL,WRCH4	;POI CHIAMERAI WRCH4

;	RE-ENTRY POINT COMUNE

WRCH2	OUT	(SIOAD),A 	;INVIA
WRCH6	LD	(SIOAVT),HL
WRCH3	POP	HL
EXT3	POP	AF
	EI
	RETI
;
;	INVIA SECONDA META' DI PROGRM

WRCH4:	PUSH	AF
	PUSH	HL
	LD	HL,WRCH5	;POI TOCCA A WRCH5
	LD	A,0C0H		;RESET TX UNDERRUN/EOM LATCH
	OUT	(SIOAC),A

	LD	A,(BUFFER+2)	;INVIA SECONDA META' DI PROGRM
	JR	WRCH2

;	INVIA PROGRAMMA

WRCH5	PUSH	AF
	PUSH	HL
	LD	HL,(TXCHCNT)
	LD	A,(IY)
	OUT	(SIOAD),A
	INC	IY
	DEC	HL
	LD	(TXCHCNT),HL
	LD	A,H
	OR	L
	JR	NZ,WRCH3
	LD	HL,WRCH7
	JR	WRCH6

;	ARRESTA INTERRUPTS

WRCH7	PUSH	AF
	PUSH	HL
	LD	A,28H		;RESET TRASMITTER INTERRUPT PENDING
	OUT	(SIOAC),A
	LD	HL,WRCH8
	JR	WRCH6

;	DISABILITA TX

WRCH8	PUSH	AF
	LD	A,1 		;REGISTRO N.1
	OUT	(SIOAC),A
	XOR	A		;DISABILITA INTERRUPTS
	OUT	(SIOAC),A
	INC	A
	LD	(WRDONE),A
	JP	EXT3

;---------------------------------------------------------------------------
;	EXTINT - SERVIZIO INTERRUPT EXT/INT
;---------------------------------------------------------------------------

;	QUANDO SIO INDICA SYNC TROVATO PONE SNCFLG = 1

EXTINT	PUSH	AF
	IN	A,(SIOAC)
	BIT	4,A 		;OSSIA SYNC/HUNT
	JR	NZ,QEXT 	;SE =0 E' STATA TROVATA LA PRIMA FLAG SDLC

	LD	A,1 		;FLAG TROVATA - SETTA BIT
	LD	(SNCFLG),A

QEXT:	LD	A,10H 		;RESET EXT/STATUS INTERRUPT
	OUT	(SIOAC),A

	POP	AF
	EI
	RETI

;---------------------------------------------------------------------------
;	RXSPEC - SERVIZIO INTERRUPT SPECIAL CONDITIONS
;---------------------------------------------------------------------------

RXSPEC:	EX	AF,AF'
	LD	A,1		;CONTROLLA SE END OF FRAME
	OUT	(SIOAC),A	;REG.1
	IN	A,(SIOAC)
	BIT	7,A
	JR	Z,QSPEC		;NON E' EOF - IGNORA

	AND	60H
	JR	Z,ALLOK
				;CASO DI CRC ERRATO
TRAP:	NOP			;VEDREMO POI COSA FARE

ALLOK:	LD	A,30H		;ERROR RESET (RESETTA FLAG EOF)
	OUT	(SIOAC),A
	XOR	A		;SEGNALA FINE CICLO DI LETTURA
	LD	(SNCFLG),A

QSPEC:	EX	AF,AF'
	EI
	RETI

;---------------------------------------------------------------------------
;	DUMMY - PER TAPPARE INTERRUPT IMPREVISTI
;---------------------------------------------------------------------------
DUMMY:	EI
	RETI

;===========================================================================
;	AREE DATI
;===========================================================================

;---------------------------------------------------------------------------
;	AREA EPROM
;---------------------------------------------------------------------------

;	DATI PER TABELLA VETTORI DI INTERRUPT - VENGONO COPIATI IN RAM

DKINV1	DEFW	WRCH1 		;TRASMISSIONE
	DEFW	EXTINT		;EXT/INT
	DEFW	RDCH1		;RICEZIONE
	DEFW	RXSPEC		;CONDIZIONI SPECIALI

;	COSTANTI PER DISPLAY SETTE SEGMENTI
;	IL VALORE DELLA COSTANTE DEVE ESSERE 'OR'-ATO CON IL VALORE
;	DELLA VARIABILE (BKSEL) CHE CONTIENE L'INDICAZIONE DEL BANCO
;	DI EEPROM ATTIVO (SONO SULLA STESSA PORTA)

ZERO7:	DB	3FH		;ZERO
	DB	6		;UNO
	DB	5BH		;DUE
	DB	4FH		;TRE
	DB	66H		;QUATTRO
	DB	6DH		;CINQUE
	DB	7DH		;SEI
	DB	7		;SETTE
	DB	7FH		;OTTO
	DB	6FH		;NOVE

;	TABELLA DISLOCAZIONE PROGRAMMI IN EEPROM (VEDI ANCHE NOTE A
;	'AREA EEPROM')

;	I DUE VALORI RAPPRESENTANO:
;		BANCO (0/80H)
;		INDIRIZZO CORPO PROGRAMMA


FAT:	DB	0			;NON USATO
	DW	8000H

	DB	0			;PROGRAMMA 1
	DW	0A000H

	DB	0			;PROGRAMMA 2
	DW	0C000H

	DB	0			;PROGRAMMA 3
	DW	0E000H

	DB	80H			;PROGRAMMA 4
	DW	8000H

	DB	80H			;PROGRAMMA 5
	DW	0A000H

	DB	80H			;PROGRAMMA 6
	DW	0C000H

	DB	80H			;PROGRAMMA 7
	DW	0E000H


STRING1:DB	'OTTO furbacchione e puzzolente'


;---------------------------------------------------------------------------
;	AREA RAM
;---------------------------------------------------------------------------
	DSEG

RAM:

;	TABELLE VETTORI

;	I PRIMI 8 BYTES SAREBBERO I VETTORI DELLA SIO B
;	POICHE' ESSA NON C'E' LI USIAMO PEL CTC

TABINT

;	TABELLA VETTORE CTC

STAT1	DS	2		;CTC VECTOR TABLE
OUTCT	DS	2
CTC2VT	DS	2
CTC3VT	DS	2

;	TABELLA VETTORI SIO A

SIOAVT	DS	2		;TRANSMIT BUFFER EMPTY
	DS	2		;EXTERNAL/STATUS CHANGE
	DS	2		;RECEIVE CHAR AVAILABLE
	DS	2		;SPECIAL RX CONDITION

WRDONE:	DS	1		;FLAG DI FINE SCRITTURA
SNCFLG:	DS	1		;FLAG DI OPENING FLAG TROVATA

TXCHCNT	DS	2		;CONTATORE CARATTERI ANCORA DA TRASMETTERE
TXPOINT	DS	2		;PUNTATORE AL BUFFER DEI CARATTERI DA TRASM.

WRPNT	DS	2		;PUNTATORE SCRITTURA CARATTERI RICEVUTI
RXCHCNT	DS	2		;CONTATORE DEI CARATTERI RICEVUTI
PNUMR:	DS	1		;NUMERO DEL PROGRAMMA CORRENTE (RAM)
BKSEL:	DS	1		;SELEZIONA BANCHI EEPROM - VALE 0/80H


	DS	100		;STACK PROGRAMMI
USTK:

BUFFER:				;BUFFER FILE
	DS	8192

;---------------------------------------------------------------------------
;	AREA EEPROM
;---------------------------------------------------------------------------

;	LA EEPROM E' ORGANIZZATA COSI':

;	SE E' SELEZIONATO BANK0:

;	8000H-9FFFH - BANCO DI SERVIZIO
;	A000H-BFFFH - BANCO PROGRAMMA 1
;	C000H-DFFFH - BANCO PROGRAMMA 2
;	E000H-FFFFH - BANCO PROGRAMMA 3

;	SE E' SELEZIONATO BANK1:

;	8000H-9FFFH - BANCO PROGRAMMA 4
;	A000H-BFFFH - BANCO PROGRAMMA 5
;	C000H-DFFFH - BANCO PROGRAMMA 6
;	E000H-FFFFH - BANCO PROGRAMMA 7

;	OGNI BANCO E' LUNGO 8K


	ORG	RAM+4000H		;OSSIA 8000H (DSEG A 4000H)

;	QUESTA LOCAZIONE E' NEL BANCO DI SERVIZIO DELLA EEPROM (DETTO BANK0)
;	VIENE SEMPRE CHIAMATA PRIMA LA ROUTINE BANK0 CHE SELEZIONA LA
;	EEPROM APPROPRIATA

;	LE SEGUENTI VARIABILI SONO RELATIVE SOLO AL BANK 0

PNUME:	DS	1		;NUMERO DEL PROGRAMMA REGISTRATO IN EEPROM

NAMELEN	DS	40		;TABELLA AUSILIARIA - OGNI ELEMENTO INCLUDE
				;1) LUNGHEZZA PROGRAMMA (2 BYTES)
				;2) NOME PROGRAMMA (2 BYTES)
				;L'ELEMENTO 0 NON E' USATO
	END

