SYMFF   ASM                                                                                                                     ; -----------------------------------------------------------------------------
; Beispiel fuer die Wiedergabe von Samples am TV-RGB-Ausgang vom KC85/4 und /5.
;
; Die Ausgabe erfolgt, unter Umgehung der CTC, ueber die Bits fuer die 
; Lautstaerkeregelung am Port 89h.  =>22kHz/4Bit/Mono
;								FL, 2023
;
;
; 26.09.26: Spielt die vier verschiedenen Schaltzustände der Sym-FF's durch
; -----------------------------------------------------------------------------
;
	ORG	0200H

PROLOG	EQU	07F7FH
PV1	EQU	0F003H
WAIT	EQU	014H
OSTR	EQU	023H

PIOBD	EQU	089H
CTC0	EQU	08CH
CTC1	EQU	08DH

	DW	PROLOG
	DB	'PLAY'
	DB	01H
	CALL	PV1
	DB	OSTR
	DB	0DH,0AH
	DB	'Ton nur ueber TV-RGB!',0DH,0AH,0AH
	DB	'Symmetrie-Flip-Flops:',0DH,0AH,0
	IN	A,(PIOBD)
	AND	0E0H		;RAM8 und Blinken ON/OFF merken
	LD	E,A
	INC	E		;Bit fuer Sym-FF auf 1
	OR	10H		;Nullpunkt einstellen
;Ruecksetzen der Symmetrie-Flip-Flops
	OUT	(PIOBD),A	;Reset Impuls
	INC	A
	OUT	(PIOBD),A

;beide Sym-FF auf HIGH setzen:
; Dazu an den Ausgaengen beider CTC-Kanaele einen Impuls ausgeben:
	LD	A,07H		;Zeitgebermode+VT16+Kanalreset+ZKfolgt
	OUT	(CTC0),A
	OUT	(CTC1),A
	LD	A,1		;Impuls an "CTC-OUT" nach 16 Takten
	OUT	(CTC0),A
	OUT	(CTC1),A
	LD	A,3
	OUT	(CTC0),A	;Kanaele wieder anhalten 
	OUT	(CTC1),A
;
	CALL	PV1
	DB	OSTR
	DB	'High ',5CH,' High',0DH,0AH,0
	CALL	PLAYER
;
; Sym-FF von CTC0 toggeln:
	LD	A,07H	
	OUT	(CTC0),A
	LD	A,1	
	OUT	(CTC0),A
	LD	A,3		; 7 Takte verbraten
	LD	A,3
	OUT	(CTC0),A	
;
	CALL	PV1
	DB	OSTR
	DB	'Low  ',5CH,' High',0DH,0AH,0
	CALL	PLAYER
;
; beide Sym-FF toggeln:
	LD	A,07H	
	OUT	(CTC0),A
	OUT	(CTC1),A
	LD	A,1	
	OUT	(CTC0),A
	OUT	(CTC1),A
	LD	A,3
	OUT	(CTC0),A	
	OUT	(CTC1),A
;
	CALL	PV1
	DB	OSTR
	DB	'High ',5CH,' Low ',0DH,0AH,0
	CALL	PLAYER
;
; beide Sym-FF jetzt 0:
	LD	A,07H		
	OUT	(CTC0),A
	LD	A,1		
	OUT	(CTC0),A
	LD	A,3		; 7 Takte verbraten
	LD	A,3
	OUT	(CTC0),A	
;
	CALL	PV1
	DB	OSTR
	DB	'Low  ',5CH,' Low ',0DH,0AH,0AH,0
	CALL	PLAYER
;
	CALL	PV1
	DB	OSTR
	DB	'fertig.',0DH,0AH,0
	RET
;
;
;Wiedergabe:
;------------

PLAYER:	LD	A,50		;kurz warten
	CALL	PV1
	DB	WAIT
;
	LD	HL,TONBEG	;Anfang Samplepuffer
	LD	BC,(TONLEN)	;Groesse Samplepuffer
	LD	D,01EH		;Maske fuer die Lautstaerke-Bits
;
; Laufzeit zwischen 2 Ausgabefehlen 80 Takte, ergibt 22kHz Sampling-Rate
; (Beim KC85EMU dauert jeder Befehl 8Takte. Erfordert 9Befehle zwischen 2OUT's)

LOOP:	 LD	A,R		; +9	35   ;mit 3 Befehlen 24 Takte verbraten
	 LD	A,R		; +9	44
	 INC	BC		; +6	50
	;
	LD	A,(HL)		; +7	57   ;pro Byte 2 Samples:
	ADD	A		; +4	61   ; untere Tetrade:
	AND	D		; +4	65   ;  maskieren
	OR	E		; +4	69   ;  +RAM8, Blinken ON/OFF, Sym-FF 
	OUT	(PIOBD),A	;+11	80   ;  ausgeben
	;
	 JR	$+2		;+12	     ;mit 3 Befehlen 30 Takte verbraten
	 JR	$+2		;+12	24
	 DEC	BC		; +6	30
	;
	LD	A,(HL)		; +7	37   ; jetzt obere Tetrade.
	SRL	A		; +8	45
	SRL	A		; +8	53
	SRL	A		; +8	61
	AND	D		; +4	65
	OR	E		; +4	69
	OUT	(PIOBD),A	;+11	80
	;
	CPI			;+16	     ; INC HL, DEC BC
	JP	PE,LOOP		;+10	26   ; bis BC=0 
;
	LD	A,10H		; Nullpunkt wieder einstellen
	OR	E
	OUT	(PIOBD),A
	RET

;------------
TONLEN:	DW	08000H-TONBEG

; Array mit den Samples im Anschuss an das Programm
; - pro Byte 2Samples; zuerst untere Tetrade, dann die obere
TONBEG:

	END
