;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 jp 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: ld c,string ld de,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 ; ld c,string ld de,msg2 ; ZWEITER TEXTTEIL call bdos ; GEBE TEXT AUF CONSOLE AUS con: ld c,conin call bdos cp cr jp z,weiter ld c,0 ; FRAGE, OB RETURN GEDRUECKT ; WURDE call punchout jp con weiter: ld c,string ld de,msg3 ; DRITTER TEXTTEIL call bdos ; GEBE TEXT AUF CONSOLE AUS ld c,open ld de,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 inc a jp nz,read0 ; OK, KEIN FEHLER, PROGRAMM ; KANN FORTFAHREN ; ld c,conout ; SONST GEBE '?' AUF CONSOLE. ; DANN WARMSTART ld e,03fh ; '?' call bdos jp wboot ; BEENDE DAS PROGRAMM, DA ; FEHLER AUFGETRETEN ; read0: ld c,read ld de,fcb call bdos ; LESE EINEN RECORD VON DISK. ; RECORDZAEHLER WIRD ; AUTOMATISCH INCREMENTIERT or a jp nz,ende ; FILE IST VOLLSTAENDIG ; UEBERTRAGEN ld c,0aah ; 'AA' GIEBT EMFFANGENDEN ; RECHNER AN, DASS EIN BLOCK ; VON 128 BYTES UEBERTRAGEN ; WIRD call punchout ; SENDE ES DEM EMPFANGENDEN ; RECHNER ld b,080h ; LAENGE DES ZU UEBERTRAGENDEN ; BLOCKS ld hl,0080h ; DMA ADRESSE trans: ld c,(hl) ; INHALT DMA ADRESSE IN DAS 'C' ; REGI5TER call punchout ; GEBE BYTE AUF PUNCHER inc hl dec b jp nz,trans ; SOLANGE BIS BLOCK UEBERTRAGEN jp control ; ; ende: ld c,close ld de,fcb call bdos ; SCHLIESSE FILE ld c,0ffh ; 'FF' GIEBT DEM EMPFANGENDEN ; RECHNER AN, DASS DAS FILE ; VOLLSTAENDIG UEBERTRABEN ; WORDEN IST call punchout ; SENDE ES jp wboot ; ZURUECK IN DAS SYSTEM ; punchout: push bc ; RETTE 'BC' REGISTER push de ; RETTE 'DE' REGISTER push hl ; RETTE 'HL' REGISTER ld e,c ; BDOS VERLANGT DAS ZEICHEN IM ; 'E' REGISTER ld c,puncher ld b,a ; RETTE 'AKKU' FUER SPAETER ; ; ld d,delay1 ; DELAY FUER VERZOEGERUNG, ; KANN BEI SCHNITTSTELLEN MIT ; RTS-LEITUNG AUF 01H GESETZT ; WERDEN warte: ld a,delay2 ; INNERE SCHLEIFE. WIRD BEI ; SCHNITTSTELLEN MIT RTS- ; LEITUNGEN AUF 01H GESTELLT. warte1: dec a jp nz,warte1 ; SOLANGE, BIS 'AKKU' NULL WIRD dec d ld a,d cp 00h jp nz,warte ; SOLANQE, BIS 'D' REGISTER ; AUF NULL IST ld a,b ; HOLE AKKU ZURUECK call bdos ; GEBE DAS BYTE UEBER DEN PUNCHER ; AUS pop hl ; HOLE 'HL' REGISTER ZURUECK pop de ; HOLE 'DE' REGISTER ZURUECK pop bc ; HOLE 'BC' REGISTER ZURUECK ret ; control:ld c,reader call bdos cp 055h ; TESTE. OB EMPFAENGER BEREIT ; IST EINEN NEUEN BLOCK ZU ; EMPFANGEN. jp nz,control ; WENN NICHT, WARTE SOLANGE jp 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: ld a,094h ld (iobyte),a ; DAS IOBYTE DES MC-CP/M ; COMPUTERS WIRD FUER ; LOGISCHES = PHYSKALISCHES ; GERAET GESTELLT ld c,0f3h ; STATUS- UND CONTROL- ; REGISTER VON SIO KANAL B ld b,0bh ; LAENGE DER BEFEHLSTABELLE ld hl,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