;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 jp 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: ld c,string ld de,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 ; ld c,string ; ZWEITER TEXTTEIL ld de,msg2 call bdos ; GEBE TEXT AUF CONSOLE AUS con: ld c,conin call bdos ; FRAGE DIE CONSOLE AUF CR AB cp cr jp nz,con ; SOLANGE, BIS RETURN GEDRUECKT ; WURDE ld c,loesch ld de,fcb call bdos ; LOESCHE FILE, FALLS SCHON AUF ; DISKETTE VORHANDEN ld c,open ld de,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 inc a jp nz,read ; OK, KEIN FEHLER, PROGRAMM ; KANN FORTFAHREN ld c,conout ; SONST GEBE '?' AUF CONSOLE ; DANN WARMSTART ld e,03fh ; '?' call bdos jp wboot ; BEENDE DftS PROGRAMM, DA ; FEHLER AUFBETRETEN ; read: ld c,string ; DRITTER TEXTTEIL ld de,msg3 call bdos ; GEBE TEXT AUF CONSOLE read1: ld c,reader call bdos ; LESE EINEN BYTE VOM READER cp 0aah jp nz,read1 ; WARTE SOLANGE, BIS START-ZEICHEN ; VOM SENDER KOMMT read2: ld b,080h ; BLOCKLAENGE EINSTELLEN ld hl,0080h ; DMA ADRESSE EINSTELLEN block: push hl push de ; RETTE DIE EINGESTELLTEN WERTE push bc ld c,reader call bdos ; LESE EIN BYTE VOM READER pop bc pop de ; ZURUECKHOLEN DER EINGESTELLTEN pop hl ; WERTE ld (hl),a inc hl ; ERHOEHE DMA ADRESSE UM EINS dec b ; ERNIEDRIGE BLOCK ZAEHLER jp nz,block ; SOLANGE, BIS BLOCK VON 128 ; BYTES GELESEN IST ld c,write ; WRITE-VORBEREITUNG ld de,fcb call bdos ; SCHREIBE DEN BLOCK IN DAS FILE cp 0ffh ; FRAGE, OB FEHLER AUF DISK jp z,wboot ; WENN FEHLER, DANN IN DAS ; SYSTEM ZURUECK ld c,puncher ld e,055h call bdos ; SAGE DEM SENDER, DASS ; EMPFAENGER FUER NAECHSTEN ; BLOCK BEREIT IST read3: ld c,reader call bdos ; HOLE BEFEHLSBYTE VOM SENDER cp 0aah ; IST ES NEUER-BLOCK-BEFEHL? jp z,read2 ; LESE NAECHSTEN BLOCK cp 0ffh ; IST ES BLOCK-ENDE-BEFEHL? jp nz,read3 ; NEIN, FRAGE READER ERNEUT ld c,close ld de,fcb call bdos ; SCHLIESSE FILE jp 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