;********************************************************* ;** ** ;** 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 ',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