;*********************************************************
;**							**
;**		Cpmtranó unä Cpmrecie			**
;**							**
;*********************************************************
;
;		Versioî 1.²   Januaò 1984
;
;		Copyrighô bù Andreaó Hoegner
;
;		Grothstr® 15
;
;		 294° Wilhelmshaven
;
;		(Bundesrepublië Deutschland)
;
;-------------------------------------------------------
;
;Daó  Programmpaaò dienô deò Uebertragunç voî CP/M-Disk-
;fileó  voî CPM-Computeò zõ CP/M-Computeò uebeò dereî
;Puncher-Schnittstelle® Diå Fileó werdeî blockweiså voî
;Disë zõ Disë uebertragen® Daó vorliegendå Programmpaar
;isô fueò einå Uebertragunç voí MC-CP/Í Computeò zuí
;Apple-Computeò angepasst® Generelì isô daó Programmpaaò
;jedocè auæ beliebigeî CP/M-Computerî beé entsprechender 
;Anpassung lauffaehig.
;    1®   Anpassunç beé serielleî Schnittstelleî ohneî RTÓ
;         (request to send) - Leitung :
;         Entsprechenä deò unterschiedlicheî Taktfrequenzeî
;         voî sendendeí unä empfangendeí Computeò musó diå
;         Verzoegerungschleifå deó Sendeprogrammó angepassô
;         werden¬ wenî deò sendendå Computeò diå hoeherå
;         Taktfrequenú besitzt® Haô deò empfangendå
;         Computeò diå hoeherå Taktfrequenz¬ daîn kanî
;         dieså Verzoegerunç auæ 01H gestellt werden.
;         Dazõ das Equate DELAY1 auf Werte zwischeî 01 bis
;         30 HEX unä das Equal DELAY2 zwischen 01H und FFH
;         HEX (01H keinå Verzoegerung) einstellen.
;         Die vorliegende Anpassung ist fuer ein
;         Taktverhaeltnis von 4 zu 1 geeignet mit einem
;         Wert fuer DELAY1 gleich 1A HEX und DELAY2 gleich
;	  FF HEX.
;    2®   Anpassunç beé serielleî Schnittstelleî miô RTÓ -
;         Leitung:
;         Diå Verzoegerungswertå fuer die obeî angegebeneî
;         Equates  koennen auf 01H gesetzt werden.
;    3®   Anpassunç fueò unterschiedlichstå Schnittstelleî
;         iî den Programm-Routinen:
;         Diå individuellå Programmierunç deó jeweiligeî
;         I/Ï Bausteinó - SIO¬ USART¬ odeò PIÏ - musó fueò
;         Sende- unä Empfangs-Programí im U-Programm INIT
;         erfolgen® Die dort zõ schreibendå Anpassroutinå
;         musó miô eineí RTS abgeschlosseî werden. Daó
;         vorliegendå Programí enthaelô aî dieseò Stellå
;         einå Routine¬ welchå diå RTS- unä DCD-Leitunç ií
;         Sendeprogramm disabled.
;
;
;
;
;;Das assemblierte Sendeprogramm
;------------------------------
;Folgende Equates bestimmen die Befehle fuer das CP/M-
;System. Diese Routinen werden ueber die Softwareschnitt-
;stelle 0005H angesprungen. Die Befehle stehen im Register
;'C'
;
STRING	EQU	09H	;gebe ASCII String auf Console
CONIN	EQU	01H	;frage Tastatur auf eine Eingabe ab
CONOUT	EQU	02H	;gebe Zeichen im 'AKKU' auf Console
PUNCHER	EQU	04H	;gebe Zeichen auf Puncher
READER	EQU	03H	;hole Zeichen vom Reader
READ	EQU	014H	;lese einen Record von der Datei
			;(FCB steht im 'DE' Register)
OPEN	EQU	0FH	;EROEFFNE EINE DATEI
CLOSE	EQU	010H	;Schliesse Datei (FCB steht im 'DE'
			;Register)
;
LF	EQU	0AH	;LINE FEED
CR	EQU	0DH	;Return-Taste
ESC	EQU	1BH	;Escape
CLEAR	EQU	0CH	;Loescht den Bildschirm
;
;
DELAY1	EQU	01AH	;Zeitkonstantå fueò Warteschleifå (musó
			;aî Taktverhaeltnis der beiden Computer
			;angepasst werden. Wenn Schnittstelle mit
DELAY2	EQU	0FFH	;RTS - Leitung verwendet wird, dann kann
			;DELAY1 und DELAY2 auf 01 gesetzt werden
;
BDOS	EQU	05H	;Software Einsprung ins Betriebsystem
WBOOT	EQU	00H	;Warmstart Einsprung zurueck ins System
TPA	EQU	0100H	;Anfang der TPA
FCB	EQU	05CH	;File-Control-Block
POS	EQU	03DH	;CURSOR POSITIONIERUNGS - KENNUNG
ROW	EQU	01H	;ZEILENOFFSET
COL	EQU	01H	;SPALTENOFFSET
;
;
	ORG	TPA
	JMP	START
MSG1:	DB	CLEAR,POS,ROW+01H,COL+0BH,'Software - '
	DB	'Uebertragungs - Programm',POS,ROW+05H
	DB	COL+08H,'von  C P / M  Computer auf  C P / M'
	DB	'  Computer',POS,ROW+07H,COL+0EH,'ueber '
	DB	'Puncher Schnittstelle',POS,ROW+09H
	DB	COL+016H,'Version 1.2',POS,ROW+0BH
	DB	COL+010H,024H
MSG2:	DB	'Copyright by Andreas Hoegner',ESC,POS
	DB	ROW+0DH,COL+08H,'Wenn empfangsbereit, dann '
	DB	'druecke <RETURN>',CR,LF,LF,'(RETURN-Taste '
	DB	'immer erst empfangsseitig druecken) ',024H
MSG3:	DB	CR,LF,'Copying..',024H
;
START:	MVI	C,STRING
	LXI	D,MSG1	;ERSTER TEXTTEIL
	CALL	BDOS	;GEBE TEXT AUF CONSOLE AUS
;
;HIER KANN EINE INITIALISIERUNG DER SCHNITTSTELLE ERFOLGEN.
;IM VORLIEGENDEN PROGRAMM WURDE DAS IOBYTE DES MC/CPM;COMPUTERS FUER IDENTITAET VON LOGISCHES = PHYSIKALISCHES
;GERAET GESTELLT. AUSSERDEM WIRD EINE UNTERROUTINE ZUR
;INITIALISIERUNG VON PORT B DES SIO BAUSTEINES AUFGERUFEN.
;
; *TOT*	CALL	INIT	;INITIALISIERE DIE
			;SCHNITTSTELLEN
;
	MVI	C,STRING
	LXI	D,MSG2	;ZWEITER TEXTTEIL
	CALL	BDOS	;GEBE TEXT AUF CONSOLE AUS
CON:	MVI	C,CONIN
	CALL	BDOS
	CPI	CR
	JZ	WEITER
	MVI	C,0	;FRAGE, OB RETURN GEDRUECKT
			;WURDE
	CALL	PUNCHOUT
	JMP	CON
WEITER:	MVI	C,STRING
	LXI	D,MSG3	;DRITTER TEXTTEIL
	CALL	BDOS	;GEBE TEXT AUF CONSOLE AUS
	MVI	C,OPEN
	LXI	D,FCB	;IÍ 'DE§ REGISTEÒ MUSÓ DIÅ
 			;ADRESSÅ DEÓ FCÂ STEHEN® ZÕ
			;UEBERTRAGENDEÓ PROGRAMÍ HAÔ
			;HIEÒ FCB VOM CPM ZUGEWIESEN
			;BEKOMMEN.
	CALL	BDOS	;EROEFFNE DIE DATEI
	INR	A
	JNZ	READ0	;OK, KEIN FEHLER, PROGRAMM
			;KANN FORTFAHREN
;
	MVI	C,CONOUT  ;SONST GEBE '?' AUF CONSOLE,
			  ;DANN WARMSTART
	MVI	E,03FH	;'?'
	CALL	BDOS
	JMP	WBOOT	;BEENDE DAS PROGRAMM, DA
	;FEHLER AUFGETRETEN
;
READ0:	MVI	C,READ
	LXI	D,FCB
	CALL	BDOS	;LESE EINEN RECORD VON DISK.
			;RECORDZAEHLER WIRD
			;AUTOMATISCH INCREMENTIERT
	ORA	A
	JNZ	ENDE	;FILE IST VOLLSTAENDIG
			;UEBERTRAGEN
;
	MVI	C,0AAH	;'AA' GIEBT EMPFANGENDEN
			;RECHNER AN, DASS EIN BLOCK
			;VON 128 BYTES UEBERTRAGEN
			;WIRD
	CALL	PUNCHOUT  ;SENDE ES DEM EMPFANGENDEN
			  ;RECHNER
	MVI	B,080H	;LAENGE DES ZU UEBERTRAGENDEN
			;BLOCKS
	LXI	H,0080H	;DMA ADRESSE
TRANS:	MOV	C,M	;INHALT DMA ADRESSE IN DAS 'C'
			;REGISTER
	CALL	PUNCHOUT  ;GEBE BYTE AUF PUNCHER
	INX	H	DCR	B
	JNZ	TRANS	;SOLANGE BIS BLOCK UEBERTRAGEN
	JMP	CONTROL
;
;
ENDE:	MVI	C,CLOSE
	LXI	D,FCB
	CALL	BDOS	;SCHLIESSE FILE
	MVI	C,0FFH	;'FF' GIEBT DEM EMPFANGENDEN
			;RECHNER AN, DASS DAS FILE
			;VOLLSTAENDIG UEBERTRAGEN
			;WORDEN IST
	CALL	PUNCHOUT  ;SENDE ES
	JMP	WBOOT	;ZURUECK IN DAS SYSTEM
;
;
PUNCHOUT: PUSH	B	;RETTE 'BC' REGISTER
	PUSH	D	;RETTE 'DE' REGISTER
	PUSH	H	;RETTE 'HL' REGISTER
	MOV	E,C	;BDOS VERLANGT DAS ZEICHEN IM
			;'E' REGISTER
	MVI	C,PUNCHER
	MOV	B,A	;RETTE 'AKKU' FUER SPAETER
;
;
	MVI	D,DELAY1  ;DELAÙ FUEÒ VERZOEGERUNG¬
			;KANÎ BEÉ SCHNITTSTELLEN MIT
			;RTS-LEITUNG AUF 01H GESETZT
			;WERDEN
WARTE :	MVI	A,DELAY2  ;INNERE SCHLEIFE. WIRD BEI
			;SCHNITTSTELLEN MIT RTS-
			;LEITUNGEN AUF 01H GESTELLT.
WARTE1:	DCR	A
	JNZ	WARTE1	;SOLANGE, BIS 'AKKU' NULL WIRD
	DCR	D
	MOV	A,D
	CPI	00H
	JNZ	WARTE	;SOLANGE, BIS 'D' REGISTER
		;AUF NULL IST
	MOV	A,B	;HOLE AKKU ZURUECK
	CALL	BDOS	;GEBE DAS BYTE UEBER DEN PUNCHER
			;AUS
	POP	H	;HOLE 'HL' REGISTER ZURUECK
	POP	D	;HOLE 'DE' REGISTER ZURUECK
	POP	B	;HOLE 'BC' REGISTER ZURUECK
	RET
;
;
CONTROL:  MVI	C,READER
	CALL	BDOS
	CPI	055H	;TESTE, OB EMPFAENGER BEREIT
			;IST EINEN NEUEN BLOCK ZU
			;EMPFANGEN.
	JNZ	CONTROL	;WENN NICHT, WARTE SOLANGE
	JMP	READ	;OK, EMPFAENGER IST BEREIT.
;
;
;AB HIER KOENNEN VOM ANWENDER ROUTINEN FUER DIE ANPASSUNG,
;BZW. DIE INDIVIDUELLE PROGRAMMIERUNG DER SCHNITTSTELLE
;EINGEFUEGT WERDEN. DIE ROUTINE IST MIT EINEM RTS
;ABZUSCHLIESSEN. ALS BEISPIEL WURDE HIER DIE PROGRAMMIERUNG;DER SERIELLEN SCHNITTSTELLE VON KANAL A DES MC-CP/M
;COMPUTERS FUER KANAL B UEBERNOMMEN.
;
INIT:	MVI	A,094H
	MVI	C,0F3H	;STATUS- UND CONTROL-
			;REGISTER VON SIO KANAL B
	MVI	B,08H	;LAENGE DER BEFEHLSTABELLE
	LXI	H,TABELLE  ;BEGINN DER BEFEHLSTABELLE
	DB	0EDH	;GEBE DIE TABELLE AUS
	DB	0B3H	;EDH B3H ENTSPRICHT IM Z80-
			;ASSEMBLER DEM BEFEHL OTIR
	RET
;
TABELLE   DB   01H,00H,03H,0C1H,04H,04CH,05H,068H
;
;SIO KANAL B WIRD AUF RTS UND DCD ENABLE PROGRAMMIERT.
;
	END

