;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 01BH ;Escape CLEAR EQU 01AH ;Loescht den Bildschirm DELAY1 EQU 01AH ;Zeitkonstante fuer Warteschleife (muss ;an Taktverhaeltnis der beiden Camputer ;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 IOBYTE EQU 0F101H ;I/O Byte nur fuer MC-CP/M Computer FCB EQU 05CH ;File-Control-Block POS EQU 03DH ;CURSOR POSITIONIERUNGS - KENNUNG ROW EQU 020H ;ZEILENOFFSET COL EQU 020H ;SPALTENOFFSET ; ORG TPA JMP START MSG1: DB CLEAR,ESC,POS,ROW+01H,COL+0BH,'Software - ' DB 'Uebertragungs - Programm',ESC,POS,ROW+05H DB COL+06H,'von C P / M Computer auf C P / M' DB ' Computer',ESC,POS,ROW+07H,COL+0EH,' ueber ' DB 'Puncher 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 ',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 BESTELLT. AUSSERDEM WIRD EINE UNTERROUTINE ZUR ;INITIALISIERUNG VON PORT B DES SIO BAUSTEINES AUFGERUFEN. ; 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 ;IM 'DE' REGISTER MUSS DIE ;ADRESSE DES FCB STEHEN. ZU ;UEBERTRAGENDES PROGRAMM HAT ;HIER 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 EMFFANGENDEN ;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' ;REGI5TER 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 UEBERTRABEN ;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 ;DELAY FUER VERZOEGERUNG, ;KANN BEI 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 ;SOLANQE, 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 STA IOBYTE ;DAS IOBYTE DES MC-CP/M ;COMPUTERS WIRD FUER ;LOGISCHES = PHYSKALISCHES ;GERAET GESTELLT MVI C,0F3H ;STATUS- UND CONTROL- ;REGISTER VON SIO KANAL B MVI B,0BH ;LAENGE DER BEFEHLSTABELLE LXI H,TABELLE ;BEGINN DER BEFEHLTABELLE 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