; tast.asm
; (C)2022 werner.roemer@t-online.de
;
; Test fuer
;
; Seriell ueber CPU-SID mit 1200Bd
;
;--------------------------------------------------------------------
;
; 12.12.2022	SID CTS angepasst
; 10.12.2022	aus Intel-Hexlader V1.0 uebernommen
;
;
;
;--------------------------------------------------------------------
;
; Monitorparameter/Unterprogramme
;
v24buf	equ	0a000h		; V24 Eingangsbuffer *)
v24be		equ	0a7ffh		;

zbuf		equ	2d00h			; Zeilenbuffer
zbufe		equ	2d3Fh			; 64 Zeichen
timeout_flg	equ	2d40h			; Timeoutflag
;
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
;
dely1		equ	000bh			; 1ms warten
onesec	equ	001bh			; 1sec warten

;
warm		equ	1003h			; Monitor Warmstart
string	equ	1021h			; Zeichenkette ausgeben
cts		equ	0052h			; Consolenstatus	Z=0 Taste; Z=1 keine Taste
ci		equ	0043h			; Consoleneingabe	Auf Taste warten (A)=ASCII-Taste
co		equ	0049h			; (C) an Monitor
;
; Tastaturinterface
;
; Moppel original
;
mop_ci:	equ	138eh			; Video-Monitor gelb
mop_cts:	equ	1459h			;
;
; Multi-IO com1	Anschluss fuer externes Terminal
;
mio_ci:	equ	035ah			; Monitor (Patch von 04.22)
mio_cts:	equ	0308h			;
;
;
;-----------------------------------------------------------
;
;
		org	8000h			; Testadresse auf CP/M-Moppel

go:		jmp	start			; Empfang
;
		ds	10h			; Freiraum
;
;
start:	call	init			;


main:		lxi	h,msg1		;
		call	string		;
		call	onesec
;
sid:	;	call	sid_cts		;
;		ana	a			;
;		jz	sid			;
		call	sid_ci		;
		mov	c,a			;
		call	co			;
		lxi	h,msg4		; Taste erkannt
		call	string		;
		jmp	main			;


ende:		mvi	a,0c0h		; RTS loeschen
		sim
		lxi	h,msg9		;
		call	string		;
		call	onesec		;
		;
		jmp	warm			; zurueck zum Monitor
;
;-----------------------------------------------------------
;
; init	Vorbereitung fuer Empfang auf der CPU Schnittstelle SID/SOD
;		SID Daten empfangen
;		SOD als RTS		1 = gesperrt/geloescht
;					0 = freigabe

init:		mvi	a,0c0h		; RTS loeschen
		sim				;
		xra	a			;
		sta	timeout_flg		; Timeout loeschen
		lxi	h,msg0		;
		call	string		; Startmeldung
		ret
;
;-----------------------------------------------------------
;		
 Meldetete fuer das Testprogramm
;
msg0:		db	0dh			;
		db	0ah			;
		db	"Start"
		db	0dh			;
		db	0ah			;
		db	00h			;

msg1:		db	0dh			;
		db	0ah			;
		db	"bel.Taste "
		db	0dh			;
		db	0ah			;
		db	00h			;
;
msg2:		db	0dh			;
		db	0ah			;
		db	"Moppel "
		db	0dh			;
		db	0ah			;
		db	00h			;
;
msg3:		db	0dh			;
		db	0ah			;
		db	"Terminal "
		db	0dh			;
		db	0ah			;
		db	00h			;
;
msg4:		db	0dh			;
		db	0ah			;
		db	"SID "
		db	0dh			;
		db	0ah			;
		db	00h			;
;
msg9:		db	0dh			;
		db	0ah			;
		db	"Ende"
		db	0dh			;
		db	0ah			;
		db	00h			;
;
;		
;		
;SID/SOD ###################################################
;
; Routinen fuer die CPU Schnittstelle SID/SOD
;
; Aus Moppel-Monitor (C)R.Goessler 85
; Pflege und Erweiterungen werner.roemer@t-online.de
;
;
; SID wird hier als serieller Eingangskanal (RX) genutzt
; SOD dient als RTS für die Sendefreigabe (Hardware Handshake)
; auf der CPU Platine sind einfache V24Treiber vorhanden, so
; ist eine Kommunikation per V24 direkt möglich.
; 
; da SID/SOD nur das Bit7 im Akku wiederspiegeln muss 
; das Timing / Handshake komplett per Software
; abgewickelt werden. 
;
; Mit den beiden Routinen ist eine gesicherte Übertragung
; bis 2400Bd möglich. Dabei ist zu beachten, dass moderne
; PC's trotz geloeschtem RTS weiter Daten aus dem Cache
; senden können, entweder den Cache  abschalten oder
; ein Buffer auf der Moppelseite installieren der diese
; Daten verzögerungsfrei aufnehmen kann.
;.
;
;===========================================================
;
; SID_CTS 	Tastatur-Status abfragen
;
; Eintrittsparameter:	keine
;
; Resultat: (A)		keine Taste	= 0, Z = 1
;				bel. Taste  < 0, Z = 0
;
; benoetigte Register/Flags
; Register: 		A
; Flag:			Z
;
;
sid_cts:	mvi	a,40h			; RTS freigeben
		sim				;
		call	dely1			; 1ms warten
		rim				;
		ani	80h			; Startbit ?
		jnz	scts_0		;
		mvi	a,0ffh		; bel. Taste betaetigt
		;
scts_e:	push	psw			; Z-Flag sichern
		mvi	a,0c0h		; RTS sperren
		sim				;
		pop	psw
		ret				;

scts_0:	xra	a			; keine Taste
		ana	a			;
		jmp	scts_e		;
;
;===========================================================
;
; SID_CI	Tastaturabfrage
;
; wartet auf Eingabe ohne auf das loslassen zu warten
; ASCII steht in (A)
;
; Eintrittsparameter:	keine
;
; Resultat: 		(A) als ASCII
;
; benoetigte Register/Flags
; Register: 		A
; Flag:			Z
;
;
sid_ci:	mvi	a,40h		; RTS auf low		
		sim			;				
		;
stb_l:	rim			; SID abfragen		
		ani	80h		;				
		jnz	stb_l		; warte auf Startbit	
		push	d		;
		mvi	d,08h		; Bitzaehler		
		mvi	e,00h		; Schieberegister
		call	delyht	; halbe BitDauer warten 
					;
bit_l:	call	delybd	; mitte Datenbit		
		rim			;				
		ani	80h		; MSB maskieren		
		ora	e		; verknuepfen		
		rrc			;				
		mov	e,a		; ins Schieberegister	
		dcr	d		;				
		jnz	bit_l		;				
		rlc			;				
		push	psw		;				
		call	delybd	; mitte Stopbit		
					;				
		mvi	a,0c0h	; RTS loeschen		
		sim			;				
		pop	psw		;
		pop	d		;				
		ret			;				
;
;===========================================================
;
; Verzoegerungszeit fuer Halbe Bitlaenge
;
; fuer 6,144Mhz Quarz
;
; Eintrittsparameter:	keine
;
; Resultat: 		keine
;
; benoetigte Register/Flags
; Register: 		keine
; Flag:			keine
;
;
		htime	equ	87	; # 174 fuer 600Bd  0,833ms
					; #  87 fuer 1200Bd 0,417ms
					; #  37 fuer 2400Bd 0,208ms
					; #  18 fuer 4800Bd 0,104ms
; 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
;
;
; Ende SID/SOD #############################################
;
;
;
;--------------------------------------------------------------------
end

