;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' ; 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 0015 = WRITE EQU 015H ;lese einen Record von der Datei ;( FCB im 'DE' Register angegeben) 0013 = LOESCH EQU 013H ;LOESCHEN EINER DATEI 0016 = OPEN EQU 016H ;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 0005 = BDOS EQU 05H ;Software Einsprung in das System 0000 = WBOOT EQU 0000H ;Warmstart 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 C32B02 JMP START 0103 1A1B3D212BMSG1: DB CLEAR,ESC,POS,ROW+01H,COL+0BH,'Software - ' 0113 5565626572 DB 'Uebertragungs - Programm',ESC,POS,ROW+05H 012E 28766F6E20 DB COL+08H,'von C P / M Computer auf C P / M' 0152 2020436F6D DB ' Computer',ESC,POS,ROW+07H,COL+0EH,'ueber ' 0166 5265616465 DB 'Reader Schnittstelle',ESC,POS,ROW+09H 017D 3656657273 DB COL+016H,'Version 1.2',ESC,POS,ROW+0BH 018C 3024 DB COL+010H,024H 018E 436F707972MSG2: DB 'Copyright by Andreas Hoegner',ESC,POS 01AC 2D2857656E DB ROW+0DH,COL+08H,'Wenn empfangsbereit, dann ' 01C8 6472756563 DB 'druecke ',CR,LF,LF,'(Druecke immer ' 01EA 6572737420 DB 'erst die RETURN-Taste auf dem empfangenden ' 0215 436F6D7075 DB 'Computer ',024H 021F 0D0A436F70MSG3: DB CR,LF,'Copying..',24H ; 022B 0E09 START: MVI C,STRING 022D 110301 LXI D,MSG1 ;ERSTER TEXTTEIL 0230 CD0500 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. ; 0233 CDBC02 CALL INIT ;INITIALISIERE DIE SCHNITTSTELLE ; 0236 0E09 MVI C,STRING ;ZWEITER TEXTTEIL 0238 118E01 LXI D,MSG2 023B CD0500 CALL BDOS ;GEBE TEXT AUF CONSOLE AUS 023E 0E01 CON: MVI C,CONIN 0240 CD0500 CALL BDOS ;FRAGE DIE CONSOLE AUF CR AB 0243 FE0D CPI CR 0245 C23E02 JNZ CON ;SOLANGE, BIS RETURN GEDRUECKT ;WURDE 0248 0E13 MVI C,LOESCH 024A 115C00 LXI D,FCB 024D CD0500 CALL BDOS ;LOESCHE FILE, FALLS SCHON AUF ;DISKETTE VORHANDEN 0250 0E16 MVI C,OPEN 0252 115C00 LXI D,FCB ;IM 'DE' REGISTER MUSS DIE ;ADRESSE DES FCB STEHEN. ;ZU UEBERTRASENDES PROGRAMM ;HAT HIER FCB VOM CP/M ;ZUGEWIESEN BEKOMMEN. 0255 CD0500 CALL BDOS ;FUEHRE BEFEHL AUS 0258 3C INR A 0259 C26602 JNZ READ ;OK, KEIN FEHLER, PROGRAMM ;KANN FORTFAHREN 025C 0E02 MVI C,CONOUT ;SONST GEBE '?' AUF CONSOLE ;DANN WARMSTART 025E 1E3F MVI E,03FH ;'?' 0260 CD0500 CALL BDOS 0263 C30000 JMP WBOOT ;BEENDE DftS PROGRAMM, DA ;FEHLER AUFBETRETEN ; 0266 0E09 READ: MVI C,STRING ;DRITTER TEXTTEIL 0268 111F02 LXI D,MSG3 026B CD0500 CALL BDOS ;GEBE TEXT AUF CONSOLE 026E 0E03 READ1: MVI C,READER 0270 CD0500 CALL BDOS ;LESE EINEN BYTE VOM READER 0273 FEAA CPI 0AAH 0275 C26E02 JNZ READ1 ;WARTE SOLANGE, BIS START-ZEICHEN ;VOM SENDER KOMMT 0278 0680 READ2: MVI B,080H ;BLOCKLAENGE EINSTELLEN 027A 218000 LXI H,0080H ;DMA ADRESSE EINSTELLEN 027D E5 BLOCK: PUSH H 027E D5 PUSH D ;RETTE DIE EINGESTELLTEN WERTE 027F C5 PUSH B 0280 0E03 MVI C,READER 0282 CD0500 CALL BDOS ;LESE EIN BYTE VOM READER 0285 C1 POP B 0286 D1 POP D ;ZURUECKHOLEN DER EINGESTELLTEN 0287 E1 POP H ;WERTE 0288 77 MOV M,A 0289 23 INX H ;ERHOEHE DMA ADRESSE UM EINS 028A 05 DCR B ;ERNIEDRIGE BLOCK ZAEHLER 028B C27D02 JNZ BLOCK ;SOLANGE, BIS BLOCK VON 128 ;BYTES GELESEN IST 028E 0E15 MVI C,WRITE ;WRITE-VORBEREITUNG 0290 115C00 LXI D,FCB 0293 CD0500 CALL BDOS ;SCHREIBE DEN BLOCK IN DAS FILE 0296 FEFF CPI 0FFH ;FRAGE, OB FEHLER AUF DISK 0298 CA0000 JZ WBOOT ;WENN FEHLER, DANN IN DAS ;SYSTEM ZURUECK 029B 0E04 MVI C,PUNCHER 029D 1E55 MVI E,055H 029F CD0500 CALL BDOS ;SAGE DEM SENDER, DASS ;EMPFAENGER FUER NAECHSTEN ;BLOCK BEREIT IST 02A2 0E03 READ3: MVI C,READER 02A4 CD0500 CALL BDOS ;HOLE BEFEHLSBYTE VOM SENDER 02A7 FEAA CPI 0AAH ;IST ES NEUER-BLOCK-BEFEHL? 02A9 CA7802 JZ READ2 ;LESE NAECHSTEN BLOCK 02AC FEFF CPI 0FFH ;IST ES BLOCK-ENDE-BEFEHL? 02AE C2A202 JNZ READ3 ;NEIN, FRAGE READER ERNEUT 02B1 0E10 MVI C,CLOSE 02B3 115C00 LXI D,FCB 02B6 CD0500 CALL BDOS ;SCHLIESSE FILE 02B9 C30000 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 02BC C9 RET ; ;TABELLE: DB 01H,00H,03H,0C1H,04H,04CH,05H,068H ; ;SIO KANAL B WIRD AUF RTS UND DCD ENABLE PROGRAMMIERT. ; ; 02BD END