; V24 ueber SID - SOD
; V2 - 1200Bd
;
; 09.12.2018				; SID-SODV2
;						; Quelltext ueberarbeitet
;						; FCT SID-SOD aus MonitorV5.5
;						; Warteschleife auf 1/2Bitzeit angepasst
;
; Buffer 9000h-9fffh
; TX wartet auf CTS=LOW gibt den ganzen Buffer aus
; RX setzt RTS auf LOW und wartet auf Startbit und fuellt den Buffer
; ohne Abbruchbedingung (Endlosschleife)
; Diese muss im aufrufendem Programm realisiert werden
;
;
;--------------------------------------------------------------------
;
; Monitorparameter
srcbeg	equ 	2fbfh			; Startadresse
srcend	equ 	2fc1h			; Endadresse
dstbeg	equ 	2fc3h			; Anfang Zieladresse/Parameter
dstend	equ 	2fc5h			; 
rambeg	equ 	2800h			;
adres		equ	2fbbh			; Adresse HI
adrhi		equ	2fbch			; Adresse LO
;
onesec	equ	001bh			; 1sec warten		
warm		equ	1003h			; zurueck zum Monitor
;	
;--------------------------------------------------------------------	
		org	8000h			;
			
sod:		jmp	tx			;
sid:		jmp	rx			;
;		
		
tx:		call	init			; Daten aus Buffer ausgeben
		call	fctsod		;
		jmp	warm			; 
				
rx:		call	init			; Daten in Buffer ablegen	
		call	fctsid		;
		jmp	warm			;
		
init:		lxi	h,9000h		; Anfang Buffer
		shld	srcbeg		;
		lxi	h,9fffh		; Ende Buffer
		shld	adres			;
		mvi	a,04h			;
		sim				; RTS high
		ret
;
;--------------------------------------------------------------------
;		
; FCT- SOD/SID aus Monitor V5.5
;
fctsod:	lhld	adres			; SOD Ausgabe
		inx	h
		xchg				; (DE) Endadress
		lhld	srcbeg		; (HL) Startadresse
sodlop:	mov	c,m			; Zeichen holen
		call	cpuot			; und ausgeben
		inx	h
		mov	a,l			; Endabfrage
		cmp	e
		jnz	sodlop		; weiter
		mov	a,h
		cmp	d
		jnz	sodlop		; weiter
		ret
;		
fctsid:	lhld	adres			; SID eingabe
		inx	h
		xchg				; (DE) Endadresse
		lhld	srcbeg		; (HL) Staradresse
						;
sidlop:	call	cpuin			; Zeichen holen
		mov	m,a			; ablegen
		
		call	onesec
		
		inx	h
		mov	a,l			; Endabfrage
		cmp	e
		jnz	sidlop		; weiter
		mov	a,h
		cmp	d
		jnz	sidlop		; Weiter
		ret
;
; Ausgabe (C) ueber die CPU-Schnittstelle SOD
;
cpuot:	rim				; CTS abfragen
		ani	80h			;
		jnz	cpuot			; SID auf LOW, warten
		mov	a,c			; Zeichen holen
		call	stabit		; Startbit ausgeben
		mvi	c,08h			; Bitzaehler
otlop:	rrc				; LSB zuerst ausgeben
		ana	a
		jm	high			; Bit ist High
low:		call	stabit		; LOW-Bit ausgeben	
		jmp	outcte		;
		
high:		call	stobit		; High-Bit ausgeben
outcte:	dcr	c
		jnz	otlop			;
		call	stobit		; Stopbit ausgeben
		ret
		;
stabit:	push	psw
		mvi	a,0c0h		; SOD auf High
		jmp	bitcte		;
;
stobit:	push	psw
		mvi	a,40h			; SOD auf Low
bitcte:	sim
		call	delybd		; Wartezeit
		pop	psw
		ret
;
; CPUIN (A) Daten ueber die CPU-Schnittstelle entgegennehmen
;
cpuin:	mvi	a,0c0h		; RTS auf low
		sim	
sidl		rim				; SID abfragen
		ani	80h
		jnz	sidl			; auf Startbit warten
		push	d
		mvi	d,08h			; Bitzaehler
		mvi	e,00h			; Schieberegister
		call	delyht		; halbe Bit-Dauer warten
inlop:	call	delybd		; mitte Datenbit
		rim
		ani	80h			; MSB maskieren
		ora	e			; verknuepfen
		rrc	
		mov	e,a			; ins Schieberegister
		dcr	d
		jnz	inlop			;
		rlc	
		push	psw
		call	delybd		; mitte Stopbit
		mvi	a,40h			; RTS auf High
		sim
		pop	psw
		pop	d
		ret
;	  
;--------------------------------------------------------------------
;	  
; Verzoegerungszeit fuer Halbe Bitlaenge 
;
; fuer 6,144Mhz Quarz
;
		htime	equ	174		;	# 174 fuer 600Bd	0,833ms
						;	#  87 fuer 1200Bd	0,417ms
						;	#  37 fuer 2400Bd	0,208ms
						;
; Bit-Zeit warten
delybd	call	delyht		; 
		call	delyht		;
		ret				;
; 1/2 Bit-Zeit warten
delyht:	push	psw			; 	# 12
		mvi	a,htime		;	#  7
delop: 	dcr	a			;	#  4	
		jnz	delop			;	# 10/7 
		pop	psw			;	# 10
		ret				;	# 10	  
;
;