; ppi.asm
; Uso Porta parallela PPI 8255
;
; L'I/O aggiuntivo di GPC2 e' mappato come segue in memoria XDATA:
;
;	0FA00h .. 0FA3Fh	PPI 8255
;	0FA40h .. 0FA7Fh	TIMER 82C54 (primo)
;	0FA80h .. 0FABFh	TIMET 82C54 (secondo)
;	0FAC0h .. 0FAFFh	RTC 6242b
;
;	0FB00h .. 0FFFFh	BUS esterno (ABACO Bus)
;
; In particolare, per il PPI 8255 avremo:
;	0FA00h	->	PDA = Registro dati del port A
;	0FA01h	->	PDB = Registro dati del port B
;	0FA02h	->	PDC = Registro dati del port C
;	0FA03h	->	CNT = registro di controllo
;
; L'8255 ha tre modi di funzionamento (Mode 0 = Basic Input Output, Mode 1 = Strobed
; Input Output, Mode 3 = Bi-Directional Bus), che possono essere selezionati indipendentemente
; per il gruppo Port B, Port C 0..3 e Port A,Port C 4..7.
; Avendo connesso alla scheda il tastierino (TIO 16), il solo modo che ci interessa e' lo 0,
; nel quale ogni port puo' essere programmato come ingresso o uscita, per  entrambi i gruppi.
; Vediamo ora come programmare il PPI, tramite il port di controllo:
;
; Bit 0 -> Port C 0..3 : 1 = Input, 0 = Output
; Bit 1 -> Port B :      1 = Input, 0 = Output
; Bit 2 -> Modo Port B : 0 = Mode 0, 1 = Mode 1
;
; Bit 3 ->  Port C 4..7 : 1 = Input, 0 = Output
; Bit 4 -> Port A :       1 = Input, 0 = Output
; Bit 5 -+
; Bit 6 -+> Modo port A : 00 -> Mode 0, 01 -> Mode 1, 10-11 Mode 3
;
; Bit 7 -> Programmazione Interrupt : 0 -> Interrupt, 1 -> Modo Polling
;
; Non mi preoccupo della programmazione dll'interrupt, quindi dovremo sempre programmare il
; bit 7 a 1.
;
; Il Port A e' collegato ai piedini 1..8 del connettore CN2 (Tasti rossi)
; Il Port B e' collegato ai DIP Switch
; Il Port C e' collegato ai piedini 9..16 del connettore CN2 (0..3 Tasti gialli, 
;    4..7 Tasti verdi)
;
; Scrivo un programma che:
; - Programmi il Port A in uscita, il Port B in ingresso, i bit 0..3 del Port C in uscita e 
;   i bit 4..7 in ingresso.
; - Copi i bit del Port B (dip switch) sui port A e C (bit 1..3)
; - Emetta un tono alla pressione dei tasti verdi (bit 4..7 di Port C)
;
;
	.org	8050h		; Inizio del programma caricato da Mo52
;
	mov	DPTR,#0FA03h	; Port CNT di PPI
	mov	A,#10001010b	; Mode 0 per A e B, A in out, Chi in in, B in in, Clo in out
	movx	@dptr,a		; Setta il PPI
;
loop:	mov	DPL,#1		; Port B
	movx	a,@DPTR		; Leggo porta B
	mov	DPL,#0		; Port A
	movx	@DPTR,A		; Copio su porta A
	mov	DPL,#2 		; Port C
	movx	@DPTR,A		; Copio su prota C
;
	movx	A,@DPTR		; Leggo i tasti
;
	jb	ACC.4,no4	; Tasto 4 rilasciato?
;	Tasto 4 premuto
;	128 semicicli a 900 Hz
	mov	r1,128		; Numero semicicli
lo:	mov	r0,0		; Durata semiciclo (0 -> 256)
	cpl	p1.2		; inverto l'uscita
lo1:	djnz	r0,lo1		; ritardo semiciclo
	djnz	r1,lo		; loop semicicli
;
no4:	jb	ACC.5,no5	; Tasto 5 Rilasciato?
;	Tasto 5 premuto
;	256 semicicli a 1800 Hz
	mov	r1,0		; Numero semicicli (0 -> 256)
hi:	mov	r0,128		; Durata semiciclo
	cpl	p1.2		; inverto l'uscita
hi1:	djnz	r0,hi1		; ritardo semiciclo
	djnz	r1,hi		; loop semicicli
;
no5:	jb	ACC.6,no6	; Tasto 6 Rilasciato?
;	Tasto 6 premuto
;	Tono basso poi pausa
	mov	r1,128		; Numero semicicli
lob:	mov	r0,0		; Durata semiciclo
	cpl	p1.2		; inverto l'uscita
lob1:	djnz	r0,lob1		; ritardo semiciclo
	djnz	r1,lob		; loop semicicli
;
	mov	r1,0		; Numero ritardi
off:	mov	r0,128		; Durata ritardo
	setb	p1.2		; Azione nulla - non emette suono
off1:	djnz	r0,off1		; ritardo pausa
	djnz	r1,off		; loop pause
;
no6:	jb	ACC.7,no7	; Tasto 7 Rilasciato?
;	Tasto 7 premuto
;	Tono alto poi pausa
	mov	r1,0		; Numero semicicli (0 -> 256)
hib:	mov	r0,128		; Durata semiciclo
	cpl	p1.2		; inverto l'uscita
hib1:	djnz	r0,hib1		; ritardo semiciclo
	djnz	r1,hib		; loop semicicli
;
	mov	r1,0		; Numero pause (0 -> 256)
offb:	mov	r0,128		; Durata pausa
	setb	p1.2		; Azione nulla - non emette suono
offb1:	djnz	r0,offb1	; ritardo pausa
	djnz	r1,offb		; loop pause
;
no7:	sjmp	loop		; Ripete all'infinito
