;DAS ASSEMBLIERTE EMPFAENGERPROGAMM ;---------------------------------- ;Folgende Equates bestimmen die Befehle fuer das CP/M- ;System. Die Routinen werden ueber die Softwarescnnitt- ;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 01BH ;Escape CLEAR EQU 01AH ;Loescht den Bildschirm BDOS EQU 05H ;Software Einsprung in das System WBOOT EQU 0000H ;Warmstart 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+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 ',CR,LF,LF,'(Druecke immer ' DB 'erst die RETURN-Taste auf dem empfangenden ' DB 'Computer ',024H MSG3: DB CR,LF,'Copying..',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. ; 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 ;IM 'DE' REGISTER MUSS DIE ;ADRESSE DES FCB STEHEN. ;ZU UEBERTRASENDES PROGRAMM ;HAT HIER 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 DftS PROGRAMM, DA ;FEHLER AUFBETRETEN ; READ: MVI C,STRING ;DRITTER TEXTTEIL LXI D,MSG3 CALL BDOS ;GEBE TEXT AUF CONSOLE READ1: MVI C,READER CALL BDOS ;LESE EINEN BYTE VOM READER CPI 0AAH JNZ READ1 ;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 C0F3H ;STATUS- UND CONTROL- ; ;REG ISTER VON SIO KANAL B ; MVI B,0BH ;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