;*********************************************************
;**		Cpmtranó unä Cpmrecie			**
;*********************************************************
;		Versioî 1.3   Mai 1987
;		Copyrighô bù Andreaó Hoegner
;		Grothstr® 15
;
;		294° Wilhelmshaven
;-------------------------------------------------------
;
;
;
;DAS ASSEMBLIERTE EMPFAENGERPROGAMM
;----------------------------------
;Folgende Equates bestimmen die Befehle fuer das CP/M-
;System. Die 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
WRITE	EQU	015H	;lese einen Record von der Datei 
			;( FCB im 'DE' Register angegeben)
LOESCH	EQU	013H	;LOESCHEN EINER DATEI
OPEN	EQU	016H	;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	20H	;Escape
CLEAR	EQU	0CH	;Loescht den Bildschirm
;
;
BDOS	EQU	05H	;Software Einsprung in das System
WBOOT	EQU	0000H	;Warmstart
TPA	EQU	0100H	;Anfang der TPA
FCB	EQU	05CH	;File-Control-Block
POS	EQU	1FH	;CURSOR POSITIONIERUNGS - KENNUNG
ROW	EQU	01H	;ZEILENOFFSET
COL	EQU     01H	;SPALTENOFFSET
;
;
	ORG	TPA
	JMP	START
MSG1:	DB	CLEAR,ESC,POS,ROW+01H,COL+0BH,'Software - '
	DB	'Uebertragungs - Programm',ESC,POS,ROW+05H
	DB	COL+08H,'von  C P / M  Computer auf  C P / M'
	DB	'  Computer',ESC,POS,ROW+07H,COL+0EH,'ueber 'Š 	DB	'Reader Schnittstelle',ESC,POS,ROW+09H
	DB	COL+016H,'Version 1.2',ESC,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,'(Druecke immer '
	DB	'erst die RETURN-Taste auf dem empfangenden '
	DB	'Computer ',024H
MSG3:	DB	'Nicht stoeren, bin beschaeftigt !',24H
MSG4:   DB      CR,LF,' OKAY.. ich kann empfangen, aufgepasst! ',24H
;
START:	MVI	C,STRING
        LXI	D,MSG1	;ERSTER TEXTTEIL
	CALL	BDOS	;GEBE TEXT AUF CONSOLE AUS
;
;HIER KANN EINE INITIALISIERUNG DER SCHNITTSTELLE 
;ERFOLGEN. ES WIRD EINE UNTERROUTINE ZUR INITIALISIERUNG 
;DES SIO BAUSTEINES PORT B AUFGERUFEN.
;
; *TOT*	CALL	INIT	;INITIALISIERE DIE SCHNITTSTELLE
;
	MVI	C,STRING	;ZWEITER TEXTTEIL
	LXI	D,MSG2
	CALL	BDOS	;GEBE TEXT AUF CONSOLE AUS
CON:	MVI	C,CONIN
	CALL	BDOS	;FRAGE DIE CONSOLE AUF CR AB
	CPI	CR
	JNZ	CON	;SOLANGE, BIS RETURN GEDRUECKT 
			;WURDE
	MVI	C,LOESCH
	LXI	D,FCB
	CALL	BDOS	;LOESCHE FILE, FALLS SCHON AUF 
			;DISKETTE VORHANDEN
	MVI	C,OPEN
	LXI	D,FCB	;IÍ 'DE§ REGISTEÒ MUSÓ DIÅ 
			;ADRESSÅ DEÓ  FCÂ STEHEN®
			;ZÕ  UEBERTRAGENDEÓ PROGRAMÍ 
			;HAÔ  HIEÒ FCB VOM CP/M 
			;ZUGEWIESEN BEKOMMEN.
	CALL	BDOS	;FUEHRE BEFEHL AUS
	INR	A
	JNZ	READ	;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
;
READ:   MVI	c,string 
	LXI	D,MSG4
	CALL	BDOS	;GEBE TEXT AUF CONSOLE
READ1:	MVI	c,string 
	LXI	D,MSG3
	CALL	BDOS	;GEBE TEXT AUF CONSOLEMVI	C,READER
READ4:	CALL	BDOS	;LESE EINEN BYTE VOM READER
	CPI	0AAH
	JNZ	READ4	;WARTE SOLANGE, BIS START-ZEICHEN
			;VOM SENDER KOMMT
READ2:	MVI	B,080H	;BLOCKLAENGE EINSTELLEN
	LXI	H,0080H	;DMA ADRESSE EINSTELLEN
BLOCK:	PUSH	H
	PUSH	D	;RETTE DIE EINGESTELLTEN WERTEŠ	PUSH	B
	MVI	C,READER
	CALL	BDOS	;LESE EIN BYTE VOM READER
	POP	B
	POP	D	;ZURUECKHOLEN DER EINGESTELLTEN
	POP	H	;WERTE
	MOV	M,A
	INX	H	;ERHOEHE DMA ADRESSE UM EINS
	DCR	B	;ERNIEDRIGE BLOCK ZAEHLER
	JNZ	BLOCK	;SOLANGE, BIS BLOCK VON 128
			;BYTES GELESEN IST
	MVI	C,WRITE  ;WRITE-VORBEREITUNG
	LXI	D,FCB
	CALL	BDOS	;SCHREIBE DEN BLOCK IN DAS FILE
	CPI	0FFH	;FRAGE, OB FEHLER AUF DISK
	JZ	WBOOT	;WENN FEHLER, DANN IN DAS
			;SYSTEM ZURUECK
	MVI	C,PUNCHER
	MVI	E,055H
	CALL	BDOS	;SAGE DEM SENDER, DASS
			;EMPFAENGER FUER NAECHSTEN
			;BLOCK BEREIT IST
READ3:	MVI	C,READER
	CALL	BDOS	;HOLE BEFEHLSBYTE VOM SENDER
	CPI	0AAH	;IST ES NEUER-BLOCK-BEFEHL?
	JZ	READ2	;LESE NAECHSTEN BLOCK
	CPI	0FFH	;IST ES BLOCK-ENDE-BEFEHL?
	JNZ	READ3	;NEIN, FRAGE READER ERNEUT
	MVI	C,CLOSE
	LXI	D,FCB
	CALL	BDOS	;SCHLIESSE FILE
	JMP	WBOOT	;PROGRAMM ENDE.
;
;
;AB HIER KOENNEN VOM ANWENDER ROUTINEN FUER DIE ANPASSUNG,
;BZW. DIE INDIVIDUELLE PROGRAMMIERUNG DER SCHNITTSTELLE
;EINGEFUEGT WERDEN. DIE ROUTINE IST MIT EINEM RTS ABZU-
;SCHLIESSEN. ALS BEISPIEL WURDE HIER DIE PROGRAMMIERUNG
;DER SERIELLEN SCHNITTSTELLE VON KANAL A DES MC-CP/M
;COMPUTERS FUER KANAL B UEBERNOMMEN.
;
INIT:
;WENN CPMRECIE FUER IMPLEMENTIERUNG AUF MC-CP/M
;GEWUENSCHT, DANN SEMIKOLON'S VOR DEN ASSEMBLER
;ZEILEN LOESCHEN.
INIT:	
;	MVI	A,094H
;	STA	IOBYTE	;DAS IOBYTE DES MC-CP/M
;			;COMPUTRES WIRD FUER
;			;LOGISCHES = PHYSIKALISCHES
;			;GERAET GESTELLT
;	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
