;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' 0009 = STRING EQU 09H ;gebe ASCII String auf Console 0001 = CONIN EQU 01H ;frage Tastatur auf eine Eingabe ab 0002 = CONOUT EQU 02H ;gebe Zeichen im 'AKKU' auf Console 0004 = PUNCHER EQU 04H ;gebe Zeichen auf Puncher 0003 = READER EQU 03H ;hole Zeichen vom Reader 0014 = READ EQU 014H ;lese einen Record von der Datei ;(FCB steht im 'DE' Register) 000F = OPEN EQU 0FH ;EROEFFNE EINE DATEI 0010 = CLOSE EQU 010H ;Schliesse Datei (FCB steht im 'DE' ;Register) 000A = LF EQU 0AH ;LINE FEED 000D = CR EQU 0DH ;Return-Taste 001B = ESC EQU 01BH ;Escape 001A = CLEAR EQU 01AH ;Loescht den Bildschirm 001A = DELAY1 EQU 01AH ;Zeitkonstante fuer Warteschleife (muss ;an Taktverhaeltnis der beiden Camputer ;angepasst werden, wenn Schnittstelle mit 00FF = DELAY2 EQU 0FFH ;RTS - Leitung verwendet wird, dann kann ;DELAY1 und DELAY2 auf 01 gesetzt werden 0005 = BDOS EQU 05H ;Software Einsprung ins Betriebsystem 0000 = WBOOT EQU 00H ;Warmstart Einsprung zurueck ins System 0100 = TPA EQU 0100H ;Anfang der TPA F101 = IOBYTE EQU 0F101H ;I/O Byte nur fuer MC-CP/M Computer 005C = FCB EQU 05CH ;File-Control-Block 003D = POS EQU 03DH ;CURSOR POSITIONIERUNGS - KENNUNG 0020 = ROW EQU 020H ;ZEILENOFFSET 0020 = COL EQU 020H ;SPALTENOFFSET ; 0100 ORG TPA 0100 C31B02 JMP START 0103 1A1B3D212BMSG1: DB CLEAR,ESC,POS,ROW+01H,COL+0BH,'Software - ' 0113 5565626572 DB 'Uebertragungs - Programm',ESC,POS,ROW+05H 012E 26766F6E20 DB COL+06H,'von C P / M Computer auf C P / M' 0152 2020436F6D DB ' Computer',ESC,POS,ROW+07H,COL+0EH,' ueber ' 0167 50756E6368 DB 'Puncher Schnittstelle',ESC,POS,ROW+09H 017F 3656657273 DB COL+016H,'Version 1.2',ESC,POS,ROW+0BH 018E 3024 DB COL+010H,024H 0190 436F707972MSG2: DB 'Copyright by Andreas Hoegner',ESC,POS 01AE 2D2857656E DB ROW+0DH,COL+08H,'Wenn empfangsbereit, dann ' 01CA 6472756563 DB 'druecke ',CR,LF,LF,'(RETURN-Taste ' 01EB 696D6D6572 DB 'immer erst empfangsseitig druecken)',024H 020F 0D0A436F70MSG3: DB CR,LF,'Copying..',024H ; 021B 0E09 START: MVI C,STRING 021D 110301 LXI D,MSG1 ;ERSTER TEXTTEIL 0220 CD0500 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. ; 0223 CDBB02 CALL INIT ;INITIALISIERE DIE ;SCHNITTSTELLEN ; 0226 0E09 MVI C,STRING 0228 119001 LXI D,MSG2 ;ZWEITER TEXTTEIL 022B CD0500 CALL BDOS ;GEBE TEXT AUF CONSOLE AUS 022E 0E01 CON: MVI C,CONIN 0230 CD0500 CALL BDOS 0233 FE0D CPI CR 0235 CA4002 JZ WEITER 0238 0E00 MVI C,0 ;FRAGE, OB RETURN GEDRUECKT ;WURDE 023A CD9002 CALL PUNCHOUT 023D C32E02 JMP CON 0240 0E09 WEITER: MVI C,STRING 0242 110F02 LXI D,MSG3 ;DRITTER TEXTTEIL 0245 CD0500 CALL BDOS ;GEBE TEXT AUF CONSOLE AUS 0248 0E0F MVI C,OPEN 024A 115C00 LXI D,FCB ;IM 'DE' REGISTER MUSS DIE ;ADRESSE DES FCB STEHEN. ZU ;UEBERTRAGENDES PROGRAMM HAT ;HIER FCB VOM CPM ZUGEWIESEN ;BEKOMMEN. 024D CD0500 CALL BDOS ;EROEFFNE DIE DATEI 0250 3C INR A 0251 C25E02 JNZ READ0 ;OK, KEIN FEHLER, PROGRAMM ;KANN FORTFAHREN ; 0254 0E02 MVI C,CONOUT ;SONST GEBE '?' AUF CONSOLE. ;DANN WARMSTART 0256 1E3F MVI E,03FH ; '?' 0258 CD0500 CALL BDOS 025B C30000 JMP WBOOT ;BEENDE DAS PROGRAMM, DA ;FEHLER AUFGETRETEN ; 025E 0E14 READ0: MVI C,READ 0260 115C00 LXI D,FCB 0263 CD0500 CALL BDOS ;LESE EINEN RECORD VON DISK. ;RECORDZAEHLER WIRD ;AUTOMATISCH INCREMENTIERT 0266 B7 ORA A 0267 C28002 JNZ ENDE ;FILE IST VOLLSTAENDIG ;UEBERTRAGEN 026A 0EAA MVI C,0AAH ;'AA' GIEBT EMFFANGENDEN ;RECHNER AN, DASS EIN BLOCK ;VON 128 BYTES UEBERTRAGEN ;WIRD 026C CD9002 CALL PUNCHOUT ;SENDE ES DEM EMPFANGENDEN ;RECHNER 026F 0680 MVI B,080H ;LAENGE DES ZU UEBERTRAGENDEN ;BLOCKS 0271 218000 LXI H,0080H ;DMA ADRESSE 0274 4E TRANS: MOV C,M ;INHALT DMA ADRESSE IN DAS 'C' ;REGI5TER 0275 CD9002 CALL PUNCHOUT ;GEBE BYTE AUF PUNCHER 0278 23 INX H 0279 05 DCR B 027A C27402 JNZ TRANS ;SOLANGE BIS BLOCK UEBERTRAGEN 027D C3AE02 JMP CONTROL ; ; 0280 0E10 ENDE: MVI C,CLOSE 0282 115C00 LXI D,FCB 0285 CD0500 CALL BDOS ;SCHLIESSE FILE 0288 0EFF MVI C,0FFH ;'FF' GIEBT DEM EMPFANGENDEN ;RECHNER AN, DASS DAS FILE ;VOLLSTAENDIG UEBERTRABEN ;WORDEN IST 028A CD9002 CALL PUNCHOUT ;SENDE ES 028D C30000 JMP WBOOT ;ZURUECK IN DAS SYSTEM ; 0290 C5 PUNCHOUT: PUSH B ;RETTE 'BC' REGISTER 0291 D5 PUSH D ;RETTE 'DE' REGISTER 0292 E5 PUSH H ;RETTE 'HL' REGISTER 0293 59 MOV E,C ;BDOS VERLANGT DAS ZEICHEN IM ;'E' REGISTER 0294 0E04 MVI C,PUNCHER 0296 47 MOV B,A ;RETTE 'AKKU' FUER SPAETER ; ; 0297 161A MVI D,DELAY1 ;DELAY FUER VERZOEGERUNG, ;KANN BEI SCHNITTSTELLEN MIT ;RTS-LEITUNG AUF 01H GESETZT ;WERDEN 0299 3EFF WARTE: MVI A,DELAY2 ;INNERE SCHLEIFE. WIRD BEI ;SCHNITTSTELLEN MIT RTS- ;LEITUNGEN AUF 01H GESTELLT. 029B 3D WARTE1: DCR A 029C C29B02 JNZ WARTE1 ;SOLANGE, BIS 'AKKU' NULL WIRD 029F 15 DCR D 02A0 7A MOV A,D 02A1 FE00 CPI 00H 02A3 C29902 JNZ WARTE ;SOLANQE, BIS 'D' REGISTER ;AUF NULL IST 02A6 78 MOV A,B ;HOLE AKKU ZURUECK 02A7 CD0500 CALL BDOS ;GEBE DAS BYTE UEBER DEN PUNCHER ;AUS 02AA E1 POP H ;HOLE 'HL' REGISTER ZURUECK 02AB D1 POP D ;HOLE 'DE' REGISTER ZURUECK 02AC C1 POP B ;HOLE 'BC' REGISTER ZURUECK 02AD C9 RET ; 02AE 0E03 CONTROL: MVI C,READER 02B0 CD0500 CALL BDOS 02B3 FE55 CPI 055H ;TESTE. OB EMPFAENGER BEREIT ;IST EINEN NEUEN BLOCK ZU ;EMPFANGEN. 02B5 C2AE02 JNZ CONTROL ;WENN NICHT, WARTE SOLANGE 02B8 C31400 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. ; 02BB 3E94 INIT: MVI A,094H 02BD 3201F1 STA IOBYTE ;DAS IOBYTE DES MC-CP/M ;COMPUTERS WIRD FUER ;LOGISCHES = PHYSKALISCHES ;GERAET GESTELLT 02C0 0EF3 MVI C,0F3H ;STATUS- UND CONTROL- ;REGISTER VON SIO KANAL B 02C2 060B MVI B,0BH ;LAENGE DER BEFEHLSTABELLE 02C4 21CA02 LXI H,TABELLE ;BEGINN DER BEFEHLTABELLE 02C7 ED DB 0EDH ;GEBE DIE TABELLE AUS 02C8 B3 DB 0B3H ;EDH B3H ENTSPRICHT IM Z80- ;ASSEMBLER DEM BEFEHL OTIR 02C9 C9 RET ; 02CA 010003C104TABELLE DB 01H,00H,03H,0C1H,04H,04CH,05H,068H ; ;SIO KANAL B WIRD AUF RTS UND DCD ENABLE PROGRAMMIERT. ; 02D2 END