‚©MS-WASH PAS^BãMSCOPY COM¿V¨áMSCOPY PASÂ`MSDISK INC|:·»MSREAD CHN RoMSREAD PAS"¬wéMSWRITE CHN_`½îMSWRITE INC¶WéYMSWRITE PASÎ�Úlÿ ÿ ÿ ÿ ÿ ÿ Program MSCOPY ; { Version 1.1 01. Februar 92 (c) Copyright by Andreas Buchelt Anpassung an andere CP/M plus Systeme : ======================================= MSCOPY besteht aus den Teilen MSCOPY.COM, MSREAD.CHN und MSWRITE.CHN, die sich alle auf dem gleichen Laufwerk befinden. Der Zugriff auf die DOS-Dis- ketten erfolgt ueber CPM+ indirekte BIOS-Calls. Multi-IO wird unterstuetzt, soweit im BIOS implementiert. Aenderungen sind nur notwendig, wenn das BIOS nicht ueber Sektor-Wrap auf die 2. Seite umschalten kann. Der DPB muss fuer das DOS-Laufwerk vor dem Programmstart folgende Form haben: DW 72 ; 72 128-Byte Records /Track DB 4 ; 2 KByte CP/M-Blockgroesse DB 15 ; Blockmask DB 1 ; 1 Extent (32K / Dir) DW 179 ; 180 Blocks = 360 K DW 0 ; keine Dirs !!! DB 0 ; keine Dir-Bloaecke DB 0 ; DW 8000 ; fixed Media, keine Dirs checken DW 0 ; keine Systracks DB 2 ; Sektorlaenge 512 Byte DB 3 ; Sektor Maske Dieses Programm darf mit Source weitergegeben werden, aber bitte die Copyright-Vermerke n i c h t entfernen !!! Sollten noch Fehler gefunden werden, so bin ich fuer Hinweise dankbar. Andreas Buchelt Am Muehlbach 17 D 8046 Garching Hinweise : Erarbeitet und getestet mit TURBO-Pascal 3.00 unter CP/M plus ========== mit einer RAM-Floppy ! Compiliert zu COM-File in 3,0 s ! MSCOPY.COM compiliert mit Endadresse 0D700H . Anzahl der DOS- Sektor-Puffer kann der Speichergroesse angepasst werden. ==============================================================================} {$imsdisk.inc} var chainfile : file ; begin MSDrive := 3 ; { Standard DOS-LW = D: systemabgengig !! } while true do begin clrscr ; gotoxy(18,5) ; write('MS-DOS Disketten unter CPM-plus lesen und schreiben') ; gotoxy(18,6) ; write('===================================================') ; gotoxy(10,10) ; write('MS-DOS Diskette in Laufwerk ',chr(MSDrive+65),': einlegen.') ; gotoxy(8,12) ; write('Disk-Parameter-Block fuer Laufwerk ',chr(MSDrive+65),': muss ') ; write('korrekt gesetzt sein.') ; gotoxy(8,13); write('Seitenumschaltung erfolgt ueber Sektorueberlauf !') ; gotoxy(10,15) ; write('Lesen MS-Disk ') ; gotoxy(10,16) ; write('Schreiben MS-Disk ') ; gotoxy(10,17) ; write('DOS-Laufwerk wechseln ') ; gotoxy(10,18) ; write('Exit --->') ; repeat read(kbd,c) ; c := upcase(c) ; until (c = 'R') or (c = 'W') or (c = 'X') or (c = 'C') ; case c of 'R' : begin Assign(chainfile,'MSREAD.CHN') ; Chain(chainfile) ; end ; 'W' : begin Assign(chainfile,'MSWRITE.CHN') ; Chain(chainfile) ; end ; 'C' : begin gotoxy(8,22) ; write('Enter new DOS-Drive : ') ; readln(c) ; c := upcase(c) ; MSDrive := ord(c) - 65 ; CurDrv := BDos(25) ; { Rette aktuelles LW } destlw := chr(CurDrv + 65 ) ; dummy := BDos(14,MSDrive) ; { existiert MSDOS-LW ? } BDos(14,CurDrv) ; if dummy <> 0 then begin meldung('MS-DOS-Laufwerk existiert nicht !? ') ; halt ; end ; end ; 'X' : halt ; end ; end ; end. {$r-} Program Lies_MS_Dos_Disketten; {============================================================================= Entwickelt auf Commodore PC 128 unter CP/M+ mit einem Diskettenlaufwerk Commodore 1571 nach MC TEDAS ----- Ueberarbeitet, Fehler entfernt, erweitert und umgebaut auf interaktives Utility von Andreas Buchelt Vers. 1.2 verarbeitet jetzt bis zu 256 Eintraege in einem Sub-Dir. Vers. 1.3 ScanDirectory unterscheidet zwischen Root und Subdirectory. Vers. 1.4 Wechsel zu MSWRITE ueber CHAIN . Vers. 1.5 nur noch fuer 360K-Disketten bzw. kein Patch des DPB mehr RW-Operationen mit Multi-IO-Unterstuetzung nur noch physikalische Sektoren werden verwendet Kommandos an ZCPR Z-FILER angeglichen Version 1.5 01. Februar 92 (c) Copyright by Andreas Buchelt Anpassung an andere CP/M plus Systeme : ======================================= Dieses Programm darf mit Source weitergegeben werden, aber bitte die Copyright-Vermerke n i c h t entfernen !!! Sollten noch Fehler gefunden werden, so bin ich fuer Hinweise dankbar. Andreas Buchelt Am Muehlbach 17 D 8046 Garching Hinweise : Erarbeitet und getestet mit TURBO-Pascal 3.00 unter CP/M plus ========== mit einer RAM-Floppy ! Compiliert zu CHN-File in 13,0 s ! MSREAD.CHN compiliert mit Endadresse 0D700H . Anzahl der DOS- Sektor-Puffer kann der Speichergroesse angepasst werden. ==============================================================================} {$imsdisk.inc} {-----------------------------------------------------------------------------} CONST { max 10 Sub-Dirs bei 80 Zeichen/Zeilex } { bei 90 oder 96 Zeichen/Zeile : MSD = 12} MSD = 12 ; { max. 12 Sub-Dirs in einem Directory !!!} Maxdir = 255 ; { max. 256 Dir-Eintraege bei DOS } dircol = 6 ; { 5 Sub-Dirspalten bei 80 Zeichen/Zeile } dirline = 24 ; { 23 bei 24 Zeilen/Schirm } var Entry : Array[0..Maxdir] of String[32] ; selected : Array[0..Maxdir] of Boolean ; Name_of_Disk : String14 ; SDir : Array[1..MSD] of String[32] ; f : real ; FreeSek : Array[1..3] of Byte ; Temp : String[32] ; fs,NSecs : Integer ; {Offset Fileende im Cluster} SubDirs : integer ; {-----------------------------------------------------------------------------} Function Filename(n : integer) : String14 ; begin Filename := copy(Entry[n],1,8)+'.'+copy(Entry[n],9,3) ; end ; {-----------------------------------------------------------------------------} Procedure Diskinfo ; begin Meldung('360K MS-DOS Diskette '); write(Disk_Space,' KByte frei') ; Wait(300) ; Meldung(' ') ; end ; {-----------------------------------------------------------------------------} procedure Titel ; begin gotoxy(10,1) ; writeln('*** Ingenious Systems MS-DOS ---> CP/M Copy Utility *** '); gotoxy(10,2) ; writeln(' from Andreas Buchelt Copyright (c) 1987'); end ; {-----------------------------------------------------------------------------} procedure Rahmen ; begin gotoxy(1,3) ; write(' Name der MS-DOS Diskette :',Name_of_Disk:12) ; write(' Angezeigtes Directory :',ActDir : 12) ; gotoxy(1,5) ; ClrEol ; gotoxy(22,5) ; write(' fuer Hilfe fuer Exit') ; gotoxy(1,dirline-2) ; ClrEol ; gotoxy(1,dirline-1) ; ClrEol ; gotoxy(1,dirline) ; ClrEol ; write('SubDirs : '); for i:= 0 to pred(SubDirs) do begin gotoxy(12 + 13 * abs(i mod dircol),dirline + i div dircol) ; write(Sdir[succ(i)]) ; end ; end ; {-----------------------------------------------------------------------------} procedure Display_Dir ; var i : integer ; begin if Anzahl < maxanz then Anzeig := Anzahl else Anzeig := maxanz-1 ; i := 0 ; while (i <= Anzeig) and ( i+r-1 < Anzahl) do begin gotoxy(2+(i div maxzeil) shl 4,7+i mod maxzeil) ; Entry[i][0] := chr(11) ; write(copy(Entry[i+r],1,8),'.',copy(Entry[i+r],9,3),' ') ; if selected[i+r] then write('#') else write(':') ; i := succ(i) ; end ; if maxanz-1 > Anzahl-r then begin gotoxy(2+(i div maxzeil) shl 4,7+i mod maxzeil) ; write('--------------') ; i := succ(i) ; while i mod maxzeil <> 0 do begin gotoxy(2+(i div maxzeil) shl 4,7+i mod maxzeil) ; write(' ') ; i := succ(i) ; end ; end ; end ; {-----------------------------------------------------------------------------} procedure Display( weiter : integer ) ; procedure mark( switch : boolean ) ; begin gotoxy(1+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; if switch then write('>') else write(' ') ; gotoxy(16+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; if switch then write('<') else write(' ') ; end ; begin Mark(false) ; dirsel := dirsel + weiter ; if anzahl < 0 then begin Meldung('Keine Datei in diesem Verzeichnis') ; Wait(300) ; Meldung(' ') ; exit ; end ; if dirsel < 0 then begin dirsel := 0 ; if (Anzahl > maxanz-1) and (r > 0) then begin dirsel := maxzeil ; r := r - maxzeil ; Display_Dir ; end ; end ; if dirsel > Anzahl then begin dirsel := 0 ; r := 0 ; end ; if r+dirsel > Anzahl then begin dirsel := 0 ; r := 0 ; Display_Dir ; end ; if dirsel > anzeig then begin r := r + maxzeil ; dirsel := maxanz - maxzeil ; Display_Dir ; end ; mark(true) ; end ; {-----------------------------------------------------------------------------} procedure Help ; begin for i:= 3 to 24 do begin gotoxy(1,i) ; ClrEol ; end ; gotoxy(20,5) ; write(' Befehlsverzeichnis fuer Version 1.5 ') ; gotoxy(20,8) ; write('Bildschirm Befehle ! Disk Befehle ') ; gotoxy(18,9) ; write('----------------------+----------------------') ; gotoxy(20,10) ; write('^X : naechste Datei ! N : neue DOS-Disk ') ; gotoxy(20,11) ; write('^E : Datei zurueck ! D : SubDir waehlen') ; gotoxy(20,12) ; write('^D : naechste Spalte! R : RootDir ') ; gotoxy(20,13) ; write('^S : Spalte zurueck ! I : DOS Diskinfo ') ; gotoxy(20,14) ; write(' ! S : Diskspace CP/M') ; gotoxy(20,16) ; write('Datei Befehle ! Copy verlassen') ; gotoxy(18,17) ; write('----------------------+----------------------') ; gotoxy(20,18) ; write('T : Tag Datei ! X : CP/M') ; gotoxy(20,19) ; write('U : Untag Datei ! ') ; gotoxy(20,20) ; write('C : copy Datei ! ') ; gotoxy(20,21) ; write('G : Group copy ! W : schreiben auf') ; gotoxy(20,22) ; write('F : Dateigroesse ! DOS-Diskette') ; gotoxy(20,24) ; write(' zurueck mit beliebiger Taste ! '); read(kbd,Antwort) ;Antwort := ' ' ; Clrfenster ; Rahmen ; Display_dir ; Display(0) ; end ; {-----------------------------------------------------------------------------} Function NeueGruppe(AGr: Integer): Integer; { Berechnet aus der alten Gruppennummer den Offset in der } { FAT und die neue Gruppennummer. } Var Offset, Hilf : Integer; Begin Offset := AGr * 3 div 2; Hilf := FATBuf[Offset+1] shl 8 + FATBuf[Offset]; If Odd(AGr) Then NeueGruppe := Hilf shr 4 Else NeueGruppe := Hilf and $FFF ; { Falls alte Gruppe ungerade obere 12 Bits, } { sonst untere 12 Bits als neue Gruppe } End; { NeueGruppe } {-----------------------------------------------------------------------------} Procedure ScanDirectory(dirspur,dirsektor,maxein : integer ; root : boolean) ; { Dient zum Einlesen und Sortieren von Haupt- und Unter - } { Inhaltsverzeichnissen der MS-Dos-Diskette } var nextClu : boolean ; gruppe : integer ; count : integer ; {$A-} Procedure Quick_Sort(Anfang,Ende : integer ) ; var VElement : String[32] ; links,rechts : integer ; begin links := Anfang ; rechts := Ende ; VElement := Entry[(Anfang+Ende) shr 1] ; repeat while Entry[links] < Velement do links := succ(links) ; while Entry[rechts] > Velement do rechts := pred(rechts) ; if links <= rechts then begin temp := Entry[rechts] ; Entry[rechts] := Entry[links] ; Entry[links] := Temp ; links := succ(links) ; rechts := pred(rechts); end ; until links > rechts ; if Anfang < rechts then quick_sort(Anfang,rechts) ; if Ende > links then quick_sort(links,Ende) ; end ; {$A+} Begin count := 0 ; if not root then gruppe := Startgruppe ; Ende := False; nextClu := false ; Anzahl := -1; SubDirs := 0 ; While not Ende do Begin Offset := 0; RWSektor(MSDrive,DirSpur,DirSektor,False,DatBuf[1]); Repeat IF (DatBuf[1][Offset] <> 0) and (DatBuf[1][Offset] <> $e5) Then case DatBuf[1][Offset+11] of $28 : begin move(DatBuf[1][offset],Name_of_Disk[1],11) ; Name_of_Disk[0] := chr(11) ; end ; $10,$12 : if DatBuf[1][offset] <> ord('.') then begin SubDirs := succ(SubDirs) ; move(DatBuf[1][offset],SDir[SubDirs][1],32) ; SDir[SubDirs][0] := chr(11) ; end ; $20..$27 : begin Anzahl := Succ(Anzahl); move(DatBuf[1][offset],Entry[Anzahl][1],32) ; Entry[Anzahl][0] := chr(32) ; end ; else end ; { case } count := succ(count) ; Ende := (DatBuf[1][Offset] = 0) or (count = maxein) ; Offset := Offset + 32 Until Ende or (Offset >= SecSiz); if not ende then if nextClu then begin gruppe := Neuegruppe(gruppe) ; if gruppe <= MaxGr then begin gruppe_in_track_sektor(gruppe,DirSpur,DirSektor) ; nextClu := false ; end else ende := true end else begin DirSektor := succ(DirSektor) ; DirSpur := DirSpur + DirSektor div SecpTr ; IF DirSektor >= SecpTr then DirSektor := DirSektor mod SecpTr ; IF root then ende := count > Eintraege else nextClu := true ; end ; End; { While } { Directory zuende } if anzahl > 0 then quick_sort(0,Anzahl) ; End; { ScanDirectory } {-----------------------------------------------------------------------------} procedure RootDir ; begin ClrFenster ; ActDir := 'ROOT ' ; Name_of_Disk := 'Kein Name'; repeat LiesFAT; if nodisk then begin Meldung('keine MS-DOS Diskette !!! Neue Disk (J/N) ?') ; read(kbd,Antwort) ; Antwort := Upcase(Antwort) ; Meldung(' ') ; if antwort = 'N' then begin gotoxy(1,24) ; halt ; end ; end ; until not nodisk ; r := 0 ; DirTr := 0; Dirsec := 5 ; ScanDirectory(Dirtr,Dirsec,Eintraege,true) ; Rahmen ; Display_Dir ; dirsel := 0 ; Display(0) ; end ; {-----------------------------------------------------------------------------} Procedure Lies; { Liest die Datei von der MS-DOS-Diskette in einen Datenbuffer bis } { zum Dateiende oder bis der Buffer voll ist. } Var z, Gruppe : Integer; Track, Sektor : integer; Ende : Boolean; Begin { Lies } Gruppe := Startgruppe; Ende := False; if NSecs > BufGr then begin z := BufGr ; NSecs := NSecs - Bufgr ; end else begin z := NSecs ; NSecs := 0 ; end ; SetMultiIO(z) ; z := 1; While not Ende and (z <= BufGr) and not Abbruch do Begin Gruppe_in_Track_Sektor(Gruppe,Track,Sektor); If not Abbruch then begin Gruppe := NeueGruppe(Gruppe) ; If (Gruppe >= $ff8) and (Gruppe <= $fff) Then Ende := True ; RWSektor(MSDrive,Track,Sektor,False,DatBuf[z]); if Ende and (fs < SecSiz) then fillchar(Datbuf[z][fs],SecSiz - fs,$1A) ; z := succ(z) ; If not Abbruch and (SecpGr = 2) Then begin Sektor := succ(Sektor); Track := Track + (Sektor div SecpTr); Sektor := Sektor mod SecpTr; RWsektor(MSDrive,Track,Sektor,False,DatBuf[z]) ; if Ende and (fs > SecSiz) then begin fs := fs - SecSiz ; fillchar(Datbuf[z][fs],SecSiz - fs,$1A) ; z := succ(z) ; end; if (not Ende) or (fs = 0) then z := succ(z) ; end ; End; End; { While } Dateiende := Ende; Startgruppe := Gruppe; benutzt := pred(z) ; End; { Lies } {-----------------------------------------------------------------------------} procedure Copy_Setup( Message : anystring ) ; begin Abbruch := false ; gotoxy(1+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; write(' ') ; gotoxy(16+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; write(' ') ; Meldung(message) ; read(kbd,destlw) ; destlw := Upcase(destlw) ; if destlw in ['A'..'P'] then write(destlw,': User ') else Abbruch := true ; user := 0 ; read(kbd,c) ; if c in ['0'..'9'] then user := 10*User + ord(c)-48 else Abbruch := true ; write(c) ; read(kbd,c) ; if c in ['0'..'9'] then begin user := 10*User + ord(c)-48 ; write (c) ; end else if c <> #13 then Abbruch := true ; if user > 15 then Abbruch := true ; end ; {-----------------------------------------------------------------------------} procedure Filecopy ; begin if Abbruch then begin Wait(100); meldung(' ') ; exit ; end ; f := 65536.*ord(Entry[dirsel+r][31])+ 256.*ord(Entry[dirsel+r][30])+ ord(Entry[dirsel+r][29]) ; if SecpGr = 2 then fs := trunc(frac(f/1024.0)*1024.0) else fs := trunc(frac(f/512.0)*512.0) ; NSecs := trunc(f/SecSiz) ; cpmname := destlw+':'+Filename(dirsel+r) ; i := 1 ; while length(cpmname)-3 > i do if cpmname[i] = ' ' then delete(cpmname,i,11-i) else i := succ(i) ; Bdos(32,user) ; Assign(CPMFile,CPMName); {$i-} reset(CPMFile) ; if IOResult = 0 then begin write(' existiert, Ueberschreiben (J/N) ? ') ; read(kbd,c) ; c:=UpCase(c) ; write(c) ; if c = 'J' then Rewrite(CPMFile) else begin Wait(100) ; Meldung(' ') ; exit ; end ; end else Rewrite(CPMFile); {$i+} if IOResult <> 0 then begin abbruch := true ; selected[dirsel+r] := true ; Meldung('Direktory ist voll weiter mit ') ; readln ; Meldung(' ') ; end ; StartGruppe := ord(Entry[dirsel+r][28]) shl 8 +ord(Entry[dirsel+r][27]) ; Dateiende := False; erst := True; While not Dateiende and not Abbruch do Begin Lies; If not Abbruch Then begin { Schreib Datenpuffer Auf CP/M Diskette bis } Reset(CPMFile) ; { zum Dateiende oder bis der Puffer leer ist } Seek(CPMFile,FileSize(CPMFile)) ; {$i-} BlockWrite(CPMFile,Datbuf,benutzt shl 2); {$i+} If IOResult <> 0 then begin close(CPMFile) ; erase(CPMFile) ; Meldung('Diskette voll, '+Filename(dirsel+r)+' wieder geloescht !') ; selected[dirsel+r] := true ; Wait(300) ; Meldung(' ') ; end else Close(CPMFile) ; End ; End; BDos(32,defUser) ; meldung(' ') ; end ; {-----------------------------------------------------------------------------} Begin { Hauptprogramm } for i := 0 to maxdir do selected[i] := false ; ClrScr; Abbruch := false ; Titel ; Meldung(' '); Init; RootDir ; repeat ; gotoxy(1,22) ; read(kbd,Antwort) ; case Upcase(Antwort) of 'T' : begin selected[dirsel+r] := true ; gotoxy(15+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; write('#') ; Display(1) ; end ; 'U' : begin selected[dirsel+r] := false ; gotoxy(15+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; write(':') ; Display(1) ; end ; ' ',#13 : Display(1) ; ^J,^X : Display(1) ; ^K,^E : Display(-1) ; ^L,^D : Display(maxzeil) ; ^H,^S : Display(maxzeil) ; 'D' : begin { Subdirs auswaehlen } ClrFenster ; i := 0 ; Abbruch := false ; while ( i+1 <= subdirs) and not Abbruch do begin i := succ(i) ; Meldung('Select '+SDir[i]+' (J/N) ? ') ; read(kbd,Antwort) ; Antwort := Upcase(Antwort) ; write(Antwort) ; Abbruch := ( Antwort = 'J' ) ; end ; Meldung(' ') ; if Abbruch then begin ActDir := Sdir[i] ; StartGruppe := ord(Sdir[i][28]) shl 8 + ord(Sdir[i][27]) ; Gruppe_in_track_sektor(startgruppe,dirtr,dirsec) ; scanDirectory(dirtr,dirsec,maxdir,false) ; end ; r := 0; dirsel := 0 ; Rahmen ; Display_dir ; Display(0) ; end ; 'C' : begin { Kopieren File } Copy_Setup('copy '+Filename(dirsel+r)+' to Drive') ; Filecopy ; Display(1) ; end ; 'G' : begin { Kopieren Marked Files } Copy_Setup('Group-copy to Drive') ; dirsel := 0 ; r := 0 ; Display_Dir ; while not Abbruch and (dirsel <= Anzahl) do begin if Selected[dirsel] then begin selected[dirsel] := false ; if dirsel < maxanz then begin gotoxy(15+(dirsel div maxzeil) shl 4, 7+dirsel mod maxzeil) ; write(':') ; end ; Meldung('Copying '+Filename(dirsel)) ; Filecopy ; end ; dirsel := succ(dirsel) ; end ; Dirsel := 0 ; r := 0 ; Meldung(' ') ; Display(0) ; end ; '/' : Help ; { Hilfsseite ausgeben } 'N' : begin { neue Diskette } ClrFenster ; Meldung('MS-DOS-Diskette einlegen und '); Readln; Meldung(' '); rootdir ; end ; 'S' : begin { Space CP/M Diskette } Meldung('Freier Diskspeicher auf Laufwerk') ; read(kbd,c) ; c := Upcase(c) ; write(c,': ') ; if c in ['A'..'P'] then begin i := BdosHL(26,addr(FreeSek)) ; i := BdosHL(46,ord(c)-65) ; f :=(FreeSek[1]+256.*FreeSek[2]+65536.*FreeSek[3])/8 ; write(f:5:0,' KByte ') ; Wait(750) ; Meldung(' ') ; end ; end ; 'R' : RootDir ; 'F' : begin meldung(Filename(dirsel)+' Filelaenge MS-DOS :') ; f := 65536.*ord(Entry[dirsel][31])+ 256.*ord(Entry[dirsel][30])+ ord(Entry[dirsel][29]) ; write(f:6:0,' Bytes ---> CP/M : ') ; if frac(f/1024) = 0 then f := f/1024 else f := f/1024 + 1 ; write(trunc(f):3,' KByte '); Wait(750) ; Meldung(' ') ; end ; 'I' : Diskinfo ; 'W' : begin assign(CPMFile,'MSWRITE.CHN') ; Chain(CPMFile) ; end ; else end ; until Upcase(Antwort)='X' ; gotoxy(1,24) ; End. Program Schreib_MS_DOS_Disketten ; {============================================================================= Entwickelt auf Commodore PC 128 unter CP/M+ mit einem Diskettenlaufwerk Commodore 1571 nach MC TEDAS ----- Ueberarbeitet, Fehler entfernt, erweitert und umgebaut auf interaktives Utility von Andreas Buchelt Vers 1.3 Wechsel zu MSREAD ueber CHAIN. Vers 1.4 RW-Operationen mit Multi-IO-Unterstuetzung nur noch physikalische Sektoren werden verwendet Kommandos an ZCPR Z-FILER angeglichen Version 1.4 01. Februar 1992 (c) Copyright by Andreas Buchelt Anpassung an andere CP/M plus Systeme : ======================================= Achtung : das Programm kann in dieser Version nur 360K Disketten richtig beschreiben. Dieses Programm darf mit Source weitergegeben werden, aber bitte die Copyright-Vermerke n i c h t entfernen !!! Sollten noch Fehler gefunden werden, so bin ich fuer Hinweise dankbar. Andreas Buchelt Am Muehlbach 17 D 8046 Garching Hinweise : Erarbeitet und getestet mit TURBO-Pascal 3.00 unter CP/M plus ========== mit einer RAM-Floppy !!! Compiliert zu CHN-File in 14,0 s ! MSWRITE.CHN compiliert mit Endadresse 0D700H . Anzahl der DOS- Sektor-Puffer kann der Speichergroesse angepasst werden. ==============================================================================} {$i msdisk.inc } const maxCpm = 255 ; { max 256 Dir-Eintraege bei CP/M } Var AnzSektoren : Integer ; fs : integer ; EndFlag : Boolean ; Name : String14 ; Gruppe : integer ; Entry : Array[0..Maxcpm] of String[12] ; selected : Array[0..Maxcpm] of Boolean ; Temp : String[12] ; tag,monat, jahr,stdn, min : byte ; datpar : array[1..2] of integer ; {$i mswrite.inc } {-----------------------------------------------------------------------------} { initialisiert Bootsektor, loescht FAT und Directory } Procedure Ini_DOS_Disk ; Const oem : array [1..8] of char = 'IGS V1.3' ; dnam : array [1..11] of char = 'CPM-->MSDOS' ; var count,Track,Sektor : integer ; begin Abbruch := false ; Meldung('Achtung ! Alle Daten der DOS-Diskette gehen verloren. Ok (J/N) ?') ; read(kbd,Antwort) ; Antwort := Upcase(Antwort) ; write(Antwort) ; if Antwort <> 'J' then begin Abbruch := true ; Meldung(' ') ; exit ; end ; Fillchar(Datbuf[1],512,0) ; move(oem,DatBuf[1,3],8) ; DatBuf[1,$0B] := 0 ; DatBuf[1,$0C] := 2 ; { 512 Bytes Sektorgroesse } DatBuf[1,$0D] := 2 ; { 2 Sektoren = Cluster } DatBuf[1,$0E] := 1 ; DatBuf[1,$0F] := 0 ; { 1 reservierter Sektor } DatBuf[1,$10] := 2 ; { 2 FAT's } DatBuf[1,$11] := lo(112) ; DatBuf[1,$12] := hi(112) ; DatBuf[1,$13] := lo(720) ; DatBuf[1,$14] := hi(720) ; DatBuf[1,$15] := $FD ; { Medium Byte } DatBuf[1,$16] := 2 ; DatBuf[1,$17] := 0 ; { 2 Sektoren = FAT } DatBuf[1,$18] := 9 ; DatBuf[1,$19] := 0 ; { Sektoren / Spur } DatBuf[1,$1A] := 2 ; DatBuf[1,$1B] := 0 ; { Seiten } FatBuf[0] := $FD ; FatBuf[1] := $FF ; FatBuf[2] := $FF ; FillChar(FatBuf[3],1021,0) ; FillChar(DatBuf[2],512,$F6) ; for count := 0 to 15 do DatBuf[2,count shl 5] := 0 ; SetMultiIO(13) ; RWSektor(MSDrive,0,0,true,DatBuf[1]) ; RWSektor(MSDrive,0,1,true,FatBuf) ; RWSektor(MSDrive,0,2,true,FatBuf[512]) ; RWSektor(MSDrive,0,3,true,FatBuf) ; RWSektor(MSDrive,0,4,true,FatBuf[512]) ; Dirsec := 5 ; Sektor := Dirsec ; Track := 0 ; for count := 1 to 6 do begin Sektor := succ(Sektor) ; Track := Track + Sektor div SecpTr ; Sektor := Sektor mod SecpTr ; RWSektor(MSDrive,Track,Sektor,true,DatBuf[2]) ; end ; fillchar(DatBuf[2],32,0) ; move(dnam,DatBuf[2],11) ; DatBuf[2,11] := $28 ; RWSektor(MSDrive,0,Dirsec,true,DatBuf[2]) ; Meldung(' ') ; end ; {-----------------------------------------------------------------------------} Procedure Directory_Eintrag(Gr: Integer) ; { Dient zum Eintrag von Namen und Startgruppe in die Directory der } { MS-DOS-Diskette } Var DirTr, DirSec, Anzahl, k : Byte ; Offset,free_sec,free_adr,free_trk : Integer ; Ende,found,free : Boolean ; Vglname : String14 ; Procedure Loeschen(AGr: Integer) ; { Loescht alle Gruppen in der FAT, bis End of File in } { der FAT erreicht wird. } Var Offset, Hilf, Gruppe : Integer; Begin gruppe := AGr ; repeat Offset := Gruppe * 3 div 2 ; Hilf := FATBuf[Offset+1] shl 8 + FATBuf[Offset]; If Odd(Gruppe) Then begin Gruppe := Hilf shr 4 ; Hilf := Hilf and $000F ; { Falls Gruppe ungerade obere 12 Bits, } end Else begin Gruppe := Hilf and $FFF ; Hilf := Hilf and $F000 ; { sonst untere 12 Bits 0 setzen } end ; FatBuf[Offset] := Hilf and $FF ; FatBuf[Offset+1] := Hilf shr 8 ; until Gruppe >= $FF8 ; End; { Loeschen } Begin DirTr := 0 ; Dirsec := 5 ; RWSektor(MSDrive,Dirtr,Dirsec,false,DatBuf[1]) ; Ende := False ; found := false ; Anzahl := 0 ; While not Ende do Begin Offset := 0 ; Repeat Anzahl := Succ(Anzahl) ; Free := (DatBuf[1][Offset] = 0) or (DatBuf[1][Offset] = $E5) ; if free and not found Then Begin { Freier Platz gefunden } Free_trk := DirTr ; Free_sec := dirsec ; Free_adr := Offset ; found := true end ; if not free and ( DatBuf[1][Offset+11] in [$20..$27] ) then begin Vglname[0] := #11 ; move(DatBuf[1][Offset],Vglname[1],11) ; if VglName = copy(Entry[dirsel+r],1,11) then begin write(' existiert, ueberschreiben (J/N) ? ') ; read(kbd,Antwort) ; Antwort := Upcase(Antwort) ; write(Antwort) ; if Antwort = 'J' then begin DatBuf[1][Offset] := $E5 ; Loeschen(DatBuf[1][Offset+26]+256*DatBuf[1][Offset+27]) ; RWSektor(MSDrive,DirTr,DirSec,true,DatBuf[1]) ; end else begin Abbruch := true ; exit end ; end ; end ; Ende := (DatBuf[1][Offset] = 0) or (Anzahl = Eintraege) ; Offset := Offset + 32 Until Ende or (Offset >= 512) ; If not Ende Then Begin DirSec := succ(Dirsec) ; DirTr := DirTr + DirSec div SecpTr ; DirSec := DirSec mod SecpTr ; RWSektor(MSDrive,DirTr,DirSec,false,DatBuf[1]) End ; End ;{ While } { Platz gefunden oder Directory zuende } If found Then Begin If (free_sec <> dirsec) or (free_trk <> DirTr) then RWSektor(MSDrive,free_trk,free_sec,false,DatBuf[1]) ; For k := 0 to 10 do DatBuf[1][free_adr+k] := Ord(Entry[dirsel+r][k+1]) ; DatBuf[1][free_adr+11] := $20 ; For k := 12 to 21 do DatBuf[1][free_adr+k] := 0 ; bdos(105,addr(datpar)) ; datum(datpar[1],tag,monat,jahr) ; stdn := bcdbin(lo(datpar[2])) ; min := bcdbin(hi(datpar[2])) ; DatBuf[1][free_adr+22] := 0 + min shl 5 ; DatBuf[1][free_adr+23] := min shr 3 + stdn shl 3 ; DatBuf[1][free_adr+24] := tag + monat shl 5 ; DatBuf[1][free_adr+25] := monat shr 3 + (jahr-80) shl 1 ; DatBuf[1][free_adr+26] := Lo(Gr) ; DatBuf[1][free_adr+27] := Hi(Gr) ; DatBuf[1][free_adr+28] := fs shl 7 and $FF ; DatBuf[1][free_adr+29] := fs shr 1 and $FF ; DatBuf[1][free_adr+30] := fs shr 9 ; DatBuf[1][free_adr+31] := 0 ; RWSektor(MSDrive,free_trk,free_Sec,True,DatBuf[1]) End Else Begin Meldung('Directory voll. Weiter mit ') ; selected[dirsel+r] := true ; Abbruch := true ; readln ; Meldung(' ') ; exit ; End End ;{ DirectoryEintrag } {-----------------------------------------------------------------------------} Procedure Schreib_DOS ; { Schreibt Puffer auf die MS-DOS-Diskette und aktualisiert die FAT. } Var z, Track, Sektor : Integer ; Procedure Trageein(var NGr : integer) ; { Dient dazu, eine Gruppe in der FAT als belegt mit dem entsprechenden } { Wert zu kennzeichnen. } Var Hilf,Gr : Integer ; Begin Gr := NGr ; If Dateiende Then Ngr := $FFF Else begin repeat NGr := succ(NGr) ; until Freie_Gruppe(NGr) or (NGr > maxGr) ; If NGr > maxGr Then Begin selected[dirsel+r] := true ; Meldung('Diskette voll ! weiter mit ') ; readln ; Abbruch := true ; Ngr := $FFF ; End ; End ; Offset := Trunc(Gr * 3 shr 1); Hilf := FATBuf[Offset+1] shl 8 + FATBuf[Offset]; If Odd(Gr) Then Hilf := hilf or (NGr shl 4) { Falls Gruppe ungerade obere } Else Hilf := Hilf or NGr ; { sonst untere 12 Bits setzen } FatBuf[Offset] := Hilf and $FF ; FatBuf[Offset+1] := Hilf shr 8 ; End ;{ Trageein } Begin z := 1 ; SetMultiIO(AnzSektoren) ; While z <= AnzSektoren do begin Gruppe_in_Track_Sektor(Gruppe,Track,Sektor) ; RWSektor(MSDrive,Track,Sektor,True,DatBuf[z]) ; z := succ(z) ; if z <= Anzsektoren then begin Sektor := succ(Sektor) ; Track := Track + Sektor div SecpTr ; Sektor := Sektor mod SecpTr ; RWSektor(MSDrive,Track,Sektor,True,DatBuf[z]) ; z := succ(z) ; end ; if ( z > AnzSektoren) and Endflag then Dateiende := true ; Trageein(Gruppe) ; End ; End ;{ SchreibeDatei } {-----------------------------------------------------------------------------} procedure Dir_Setup( Message : anystring ) ; begin gotoxy(1+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; write(' ') ; gotoxy(16+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; write(' ') ; Meldung(message) ; end ; {-----------------------------------------------------------------------------} procedure Filecopy ; var count : integer ; begin CPMName := DestLW+':'+Filename(Dirsel+r) ; i := 1 ; while length(CPMName)-3 > i do if CPMName[i] = ' ' then delete(CPMName,i,11-i) else i := succ(i) ; Assign(CPMFile,CPMName) ; Reset(CPMFile) ; fs := Filesize(CPMFile) ; if fs div 8+1 > Disk_Space then begin Meldung('Zu wenig Platz auf der MS-DOS Diskette. weiter mit ') ; readln ; Meldung(' ') ; selected[dirsel+r] := true ; exit ; end ; i := 1 ; repeat i := succ(i) ; until Freie_Gruppe(i) or ( i >= maxGr ) ; Startgruppe := i ; Directory_Eintrag(i) ; Gruppe := Startgruppe ; Dateiende := False ; Endflag := false ; fs := filesize(CPMFile) ; count := 0 ; while (count <= int(fs/4/BufGr)) and not Abbruch do begin benutzt := 4*BufGR*succ(count)-fs ; if benutzt <= 0 then benutzt := 4*BufGr else begin benutzt := 4*BufGr - benutzt ; Endflag := true ; end ; Reset(CPMFile) ; Seek(CPMFile,4*Bufgr*count) ; Blockread(CPMFile,DatBuf,benutzt) ; if benutzt mod 4 = 0 Then AnzSektoren := benutzt div 4 Else AnzSektoren := benutzt div 4 + 1 ; Schreib_Dos ; count := succ(count) ; end ; SetMultiIO(4) ; RWSektor(MSDrive,0,1,True,FatBuf) ; { FatBuf auf Diskette schreiben } RWSektor(MSDrive,0,2,True,FatBuf[512]) ; RWSektor(MSDrive,0,3,True,FatBuf) ; RWSektor(MSDrive,0,4,True,FatBuf[512]) ; { ab Sektor 3 steht das Doppel der FAT } end ; {-----------------------------------------------------------------------------} Begin { Hauptprogramm } for i := 0 to maxcpm do selected[i] := false ; ClrScr; Abbruch := false ; Titel ; Meldung(' '); Init; DestLW := chr(CurDrv+65) ; user := defUser ; Rahmen ; repeat LiesFAT; if nodisk then begin Meldung('keine DOS Diskette !'+ ' Neue Disk, Disk Initialisieren oder Ende (N/I/E) ?') ; repeat read(kbd,Antwort) ; Antwort := Upcase(Antwort) ; until Antwort in ['E','I','N'] ; Meldung(' ') ; case Antwort of 'E' : halt ; 'I' : Ini_DOS_Disk ; else end ; end ; until not nodisk ; scanDirectory ; dirsel := 0 ; r := 0 ; Display_dir ; display(0) ; Repeat gotoxy(1,22) ; read(kbd,Antwort) ; Antwort := Upcase(Antwort) ; case Antwort of 'T' : begin selected[dirsel+r] := true ; gotoxy(15+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; write('#') ; display(1) ; end ; 'U' : begin selected[dirsel+r] := false ; gotoxy(15+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; write(':') ; display(1) ; end ; ^J,^X : display(1) ; ' ',#13 : display(1) ; ^K,^E : display(-1) ; ^L,^D : display(maxzeil) ; ^H,^S : display(-maxzeil) ; 'C' : begin Dir_Setup('Copying '+Filename(dirsel+r)) ; Filecopy ; Meldung(' ') ; display(1) ; end ; 'G' : begin { Kopieren Marked Files } Abbruch := false ; Dir_Setup('Group-Copy to MS-DOS Disk') ; Wait(100) ; dirsel := 0 ; r := 0 ; Display_Dir ; While not Abbruch and (dirsel <= Anzahl) do begin if Selected[dirsel] then begin selected[dirsel] := false ; if dirsel <= maxanz then begin gotoxy(15+(dirsel div maxzeil) shl 4, 7+dirsel mod maxzeil) ; write(':') ; end ; Meldung('Copying '+Filename(dirsel)) ; Filecopy ; end ; dirsel := succ(dirsel) ; end ; Dirsel := 0 ; r := 0 ; Meldung(' ') ; display_Dir ; display(0) ; end ; '/' : Help ; { Hilfsseite ausgeben } 'N' : begin { neue Diskette } Abbruch := false ; ClrFenster ; Meldung('Directory von Laufwerk') ; read(kbd,destlw) ; destlw := Upcase(destlw) ; if destlw in ['A'..'P'] then write(destlw,': User ') else Abbruch := true ; user := 0 ; read(kbd,c) ; if c in ['0'..'9'] then user := 10*User + ord(c)-48 else Abbruch := true ; write(c) ; read(kbd,c) ; if c in ['0'..'9'] then user := 10*User + ord(c)-48 else if c <> #13 then Abbruch := true ; write (c) ; if user > 15 then Abbruch := true else BDos(32,User) ; if Abbruch then destlw := 'A' else begin Rahmen ; Scandirectory ; end ; Display_Dir ; Dirsel := 0 ; r := 0 ; display(0) ; Meldung(' '); end ; 'I' : begin dir_setup(' ') ; Ini_DOS_Disk ; display(0) ; end ; 'S' : begin Dir_Setup(' ') ; write(Disk_Space,' KByte frei auf MS-DOS Diskette') ; Wait(500) ; Meldung(' ') ; display(0) ; end ; 'F' : begin Dir_setup('Dateilaenge :') ; CPMName := DestLW+':'+Filename(Dirsel) ; i := 1 ; while length(CPMName)-3 > i do if CPMName[i] = ' ' then delete(CPMName,i,11-i) else i := succ(i) ; Assign(CPMFile,CPMName) ; Reset(CPMFile) ; fs := Filesize(CPMFile) ; if fs mod 8 = 0 then fs := fs div 8 else fs := fs div 8 + 1 ; write(fs:4,' KByte ') ; Wait(7500) ; Meldung(' ') ; display(0) ; end ; 'R' : begin Assign(CPMFile,'MSREAD.CHN') ; Chain(CPMFile) ; end ; end ; Until Antwort = 'X' ; Gotoxy(1,24) ; Bdos(32,defUser) ; End. Program MSWASH ;(* MSCOPY *) { Version 1.1 01. Februar 92 (c) Copyright by Andreas Buchelt Anpassung an andere CP/M plus Systeme : ======================================= MSCOPY besteht aus den Teilen MSCOPY.COM, MSREAD.CHN und MSWRITE.CHN, die sich alle auf dem gleichen Laufwerk befinden. Der Zugriff auf die DOS-Dis- ketten erfolgt ueber CPM+ indirekte BIOS-Calls. Multi-IO wird unterstuetzt, soweit im BIOS implementiert. Aenderungen sind nur notwendig, wenn das BIOS nicht ueber Sektor-Wrap auf die 2. Seite umschalten kann. Der DPB muss fuer das DOS-Laufwerk vor dem Programmstart folgende Form haben: DW 72 ; 72 128-Byte Records /Track DB 4 ; 2 KByte CP/M-Blockgroesse DB 15 ; Blockmask DB 1 ; 1 Extent (32K / Dir) DW 179 ; 180 Blocks = 360 K DW 0 ; keine Dirs !!! DB 0 ; keine Dir-Bloaecke DB 0 ; DW 8000 ; fixed Media, keine Dirs checken DW 0 ; keine Systracks DB 2 ; Sektorlaenge 512 Byte DB 3 ; Sektor Maske Dieses Programm darf mit Source weitergegeben werden, aber bitte die Copyright-Vermerke n i c h t entfernen !!! Sollten noch Fehler gefunden werden, so bin ich fuer Hinweise dankbar. Andreas Buchelt Am Muehlbach 17 D 8046 Garching Hinweise : Erarbeitet und getestet mit TURBO-Pascal 3.00 unter CP/M plus ========== mit einer RAM-Floppy ! Compiliert zu COM-File in 3,0 s ! MSCOPY.COM compiliert mit Endadresse 0D700H . Anzahl der DOS- Sektor-Puffer kann der Speichergroesse angepasst werden. ==============================================================================} {$imsdisk.inc} var chainfile : file ; begin MSDrive := 2; { Standard DOS-LW = C: systemabgengig !! } while true do begin clrscr ; gotoxy(18,5) ; write('MS-DOS Disketten unter CPM-plus lesen und schreiben') ; gotoxy(18,6) ; write('===================================================') ; gotoxy(10,10) ; write('MS-DOS Diskette in Laufwerk ',chr(MSDrive+65),': einlegen.') ; gotoxy(8,12) ; write('Disk-Parameter-Block fuer Laufwerk ',chr(MSDrive+65),': muss ') ; write('korrekt gesetzt sein.') ; gotoxy(8,13); write('Seitenumschaltung erfolgt ueber Sektorueberlauf !') ; gotoxy(10,15) ; write('Lesen MS-Disk ') ; gotoxy(10,16) ; write('Schreiben MS-Disk ') ; gotoxy(10,17) ; write('DOS-Laufwerk wechseln ') ; gotoxy(10,18) ; write('Exit --->') ; repeat read(kbd,c) ; c := upcase(c) ; until (c = 'R') or (c = 'W') or (c = 'X') or (c = 'C') ; case c of 'R' : begin Assign(chainfile,'MSREAD.CHN') ; Chain(chainfile) ; end ; 'W' : begin Assign(chainfile,'MSWRITE.CHN') ; Chain(chainfile) ; end ; 'C' : begin gotoxy(8,22) ; write('Enter new DOS-Drive : ') ; readln(c) ; c := upcase(c) ; MSDrive := ord(c) - 65 ; CurDrv := BDos(25) ; { Rette aktuelles LW } destlw := chr(CurDrv + 65 ) ; dummy := BDos(14,MSDrive) ; { existiert MSDOS-LW ? } BDos(14,CurDrv) ; if dummy <> 0 then begin meldung('MS-DOS-Laufwerk existiert nicht !? ') ; halt ; end ; end ; 'X' : halt ; end ; end ; end. Const Blocksize = 511 ; { physikalische Blockgroesse unter MS-DOS } SecSiz = 512 ; SecpTr = 18 ; { 2 * 9 Secs, Bios wechselt Seite ! (360K) } SecpGr = 2 ; { 2 Sectoren = 1 Cluster (360K) } DatStart = 12 ; { 1. Cluster in Sector 10 (360K) } Eintraege = 111 ; { 112 Dirs (360K) } BufGr = 40 ; { 56 fuer COM-File mit Ende bei F000H } maxgr = 355 ; { 355 Cluster auf MS-DOS Diskette } maxzeil = 14 ; { Directory wird in 5 Spalten und } maxanz = 70 ; { 14 Zeilen angezeigt. ( = 70 Dirs ) } { ********* Achtung BufGr muss eine gerade Zahl sein! ********* } Type tBuff = Array[0..Blocksize] of Byte ; String14 = String[14] ; String32 = string[32] ; Anystring = String[80] ; Var MSDrive : byte ; { Laufwerk in dem sich die MS-DOS } { Diskette befindet } Psector, CurDrv, dirsel, defUser, i, StartGruppe, benutzt, dummy, pointtodph : Integer ; DPH : ^Integer Absolute pointtodph ; FATBuf : Array[0..1023] of Byte ; DatBuf : Array[1..BufGr] of tBuff ; CPMName, ActDir : String14 ; Dateiende, erst, Abbruch : Boolean ; Antwort, DestLW, c : Char ; User, Anzahl, Anzeig : Integer ; Offset,r,DirSec,DirTr : Integer ; Ende, Nodisk : Boolean ; CPMFile : File; {-----------------------------------------------------------------------------} Procedure Meldung(Meldetext: Anystring) ; { Dient zur Ausgabe einer Meldung in der Menuzeile 22 } Begin GotoXY(1,22) ;ClrEol ; Write(' ',Meldetext,' ') ; End ; { Meldung } {-----------------------------------------------------------------------------} Procedure Wait(centisec : integer) ; var i : integer ; Begin i := centisec ; repeat delay(10) ; i := pred(i) ; until keypressed or (i = 0) ; End; {-----------------------------------------------------------------------------} Function Ubios(FN, PA, PBC, PDE, PHL: Integer): Integer ; { Da unter CP/M 3.0 BIOS-Funktionen ueber BDOS-Funktion 50 aufgerufen } { werden, wird diese Funktion benutzt. vgl. mc Heft 3/85 } Type ParameterBlock = Record func, Areg : Byte ; BCreg, DEreg, HLreg : Integer ; End ; Var BiosPB : ParameterBlock ; Result : Integer ; Begin With BiosPB do Begin func := FN ; Areg := PA ; BCreg := PBC ; DEreg := PDE ; HLreg := PHL ; End ; Result := 0 ; Case FN of 2,3,7,13,14,15,17,18,19,24: Result := Bdos(50, Addr (BiosPB)) ; 9,16,20,22,25: Result := BdosHL(50, Addr (BiosPB)) ; Else Bdos(50, Addr (BiosPB)) ; End ; Ubios := Result ; End ; { Ubios } {-----------------------------------------------------------------------------} Procedure Init ; Begin dummy := BDosHL(12) ; { Teste auf CPM plus } if dummy < 48 then begin meldung('Ohne CP/M-Plus geht da leider nichts ! ') ; halt ; end ; CurDrv := BDos(25) ; { Rette aktuelles LW } destlw := chr(CurDrv + 65 ) ; dummy := BDos(14,MSDrive) ; { existiert MSDOS-LW } if dummy <> 0 then begin meldung('MS-DOS-Laufwerk existiert nicht !? ') ; halt ; end ; BDos(14,CurDrv) ; defUser := BDos(32,255) ; ActDir := 'ROOT' ; End ; { Init } {-----------------------------------------------------------------------------} Procedure SetMultiIO(Count : Integer) ; Begin i := Ubios (23, 0, Count, 0, 0) ; { Count Sektoren lesen } End; {-----------------------------------------------------------------------------} Procedure RWSektor(Dr,Tr,Sec : Integer ; Schreib: Boolean ; Var SecBuf ) ; { Liest einen physikalischen Sektor von Diskette in SecBuf, } { bzw. schreibt SecBuf auf Diskette, je nach Wert von Schreib. } Begin if abs(tr) > 39 then begin write('^M auf Spur ',tr:4,' kann nicht zugegriffen werden. ', 'Fehler beim Umsetzen Cluster in Spur und Sektor ') ; Wait(500) ; exit ; end ; pointtodph := Ubios (9, 0, Dr, 1, 0) ; { Drive auswaehlen } Psector := Ubios (16, 0, Sec, DPH^, 0) ; { phys. Sektor berechnen } i := Ubios (10, 0, Tr, 0, 0) ; { Spur waehlen } i := Ubios (11, 0, Psector, 0, 0) ; { Sektor waehlen } i := Ubios (12, 0, Addr(SecBuf), 0, 0) ; { DMA-Adresse waehlen } i := Ubios (28, 1, 0, 0, 0) ; { Bank waehlen } If Schreib Then i := Ubios (14, 0, 0, 0, 0) { phys. Sektor schreiben } Else i := Ubios (13, 0, 0, 0, 0) ; { phys. Sektor lesen } if i <> 0 then Meldung('Fehler bei DiskIO auf MS-DOS Diskette') ; dummy := UBios (9, 0, ord(destlw)-65, 1, 0) { Zurueck auf CP/M-Drive } End ;{ RWSektor} {-----------------------------------------------------------------------------} Procedure LiesFAT ; { Liest die File-Allocation-Table in einen Buffer } Begin nodisk := false ; RWSektor(MSDrive,0,1,false,FATBuf) ; RWSektor(MSDrive,0,2,false,FATBuf[512]) ; if (FATBuf[1] <> $FF) and (FATBuf[2] <> $FF) then Nodisk := true ; End ; { LiesFAT } {-----------------------------------------------------------------------------} Procedure Gruppe_in_Track_Sektor(Gr: Integer ; Var Tr, Sec: integer) ; { Berechnet aus der Gruppennummer Spur und Sektor auf der Diskette. } Var weiter : Char ; Begin Gr := Gr - 2 ; Gr := Gr * SecpGr ; Gr := Gr + DatStart ; { Start der Daten } Tr := Gr div SecpTr ; Sec := Gr mod SecpTr ; End ; { Gruppe_in_Track_Sektor } {-----------------------------------------------------------------------------} procedure ClrFenster ; begin for i := 5 to 21 do begin gotoxy(1,i) ; clreol ; end ; end ; {-----------------------------------------------------------------------------} function Freie_Gruppe (Gr : integer) : boolean ; { Dient zur Ueberpruefung, ob in der FAT die Gruppe GR frei ist. } var Offset,hilf : integer ; begin Offset := Gr * 3 div 2 ; Hilf := FatBuf[Offset] + 256 * FatBuf[Offset+1] ; if odd(Gr) then Freie_Gruppe := ((hilf shr 4) = 0) else Freie_Gruppe := ((hilf and $FFF) = 0) ; end ; { Freie_Gruppe } {-----------------------------------------------------------------------------} function Disk_Space : integer ; var i,temp : integer ; begin Temp := 0 ; for i := 2 to maxGr do if Freie_Gruppe(i) then temp := Succ(temp) ; Disk_Space := Temp ; end ; {-------------------------------------------------------------------------} FUNCTION bcdbin(BCDVAL : Byte) : Byte ; begin Inline( $21/BCDVAL/ (* START: LD HL,BCDVAL ; HL --> Parameter *) $E6/$0F/ (* AND 0FH ; A ist schon BCD-Zahl *) $4F/ (* LD C,A ; lower Nibble in C *) $7E/ (* LD A,(HL) ; Higher Nibble *) $E6/$F0/ (* AND 0F0H ; maskieren A = HNib*16 *) $0F/ (* RRCA ; HNib * 8 *) $47/ (* LD B,A ; in B retten *) $0F/ (* RRCA ; HNib * 4 *) $0F/ (* RRCA ; A = HNib * 2 *) $80/ (* ADD A,B ; A = HNib * 10 *) $81/ (* ADD A,C ; A = Hnib * 10 + LNib *) $23/ (* INC HL ; TURBO will es nun *) $77/ (* LD (HL),A ; mal so haben *) $00) ; end ; {------------------------------------------------------------------------} PROCEDURE Datum(DATCNT : Integer ; VAR TAG,MONAT,JAHR : Byte ) ; begin Inline( $18/$0D/ (* START: JR DATUM ; um Tabelle herum *) $1F/$1C/$1F/$1E/ (* MONTAB: DEFB 31,28,31,30,31,30 *) $1F/$1E/ (* *) $1F/$1F/$1E/$1F/ (* DEFB 31,31,30,31,30,31 *) $1E/$1F/ (* *) $FF/ (* DEFB 0FFH ; Begrenzer *) $EB/ (* DATUM: EX DE,HL ; DE auf CP/M plus Datum *) $3E/$4D/ (* LD A,77 ; DE ist Wertparameter ! *) $2A/JAHR/ (* LD HL,(JAHR) ; HL auf JAHR Variable *) $77/ (* LD (HL),A ; Jahr := 78-1 *) $06/$00/ (* LD B,0 *) $3E/$01/ (* LD A,1 ; Schaltjahr Zaehler *) $2A/JAHR/ (* NXTJHR: LD HL,(JAHR) ; Schleife fuer Jahr *) $34/ (* INC (HL) *) $0E/$1C/ (* LD C,28 ; Februar mit 28 Tagen *) $21/*-30/ (* LD HL,MONTAB+1 ; Dort steht der Februar *) $28/$06/ (* JR Z,NOSWIT ; 2000 kein Schaltjahr *) $3C/ (* INC A ; *) $E6/$03/ (* AND 3 ; Z --> Schaltjahr *) $20/$01/ (* JR NZ,NOSWIT ; kein Schaltjahr *) $0C/ (* INC C ; Februar mit 29 Tagen *) $71/ (* NOSWIT: LD (HL),C ; und in Tabelle *) $2B/ (* DEC HL ; HL auf Januar *) $4E/ (* NXTMON: LD C,(HL) ; Schleife fuer Monat *) $23/ (* INC HL ; Monat mit C Tagen *) $0C/ (* INC C ; HL auf naechsten Monat *) $28/$E8/ (* JR Z,NXTJHR ; C = FF --> neues Jahr *) $0D/ (* DEC C ; BC Tage abziehen *) $EB/ (* EX DE,HL ; HL verbleibende Tage *) $B7/ (* OR A ; *) $ED/$42/ (* SBC HL,BC ; HL Tage Monatsende *) $EB/ (* EX DE,HL ; in DE *) $28/$02/ (* JR Z,FERTIG ; *) $30/$F1/ (* JR NC,NXTMON ; und naechsten Monat *) $EB/ (* FERTIG: EX DE,HL ; Ergebnis steht *) $09/ (* ADD HL,BC ; HL Tag des Monats *) $7D/ (* LD A,L ; in TAG zurueck *) $2A/TAG/ (* LD HL,(TAG) *) $77/ (* LD (HL),A *) $EB/ (* EX DE,HL ; HL = Monat +1 *) $11/*-67/ (* LD DE,MONTAB ; DE addr(Monat[0]) *) $B7/ (* OR A ; Carry weg *) $ED/$52/ (* SBC HL,DE ; 1=Jannuar 2= usw. *) $7D/ (* LD A,L ; in MONAT zur}eck *) $2A/MONAT/ (* LD HL,(MONAT) *) $77/ (* LD (HL),A *) $00) ; end ; {-----------------------------------------------------------------------------} Function Filename(n : integer) : String14 ; begin Filename := copy(Entry[n],1,8)+'.'+copy(Entry[n],9,3) ; end ; {-----------------------------------------------------------------------------} procedure Titel ; begin gotoxy(10,1) ; writeln('*** Ingenious Systems CP/M ---> MS-DOS Copy Utility *** '); gotoxy(10,2) ; writeln(' from Andreas Buchelt Copyright (c) 1988'); end ; {-----------------------------------------------------------------------------} procedure Rahmen ; begin gotoxy(20,3) ; write('Verzeichnis von Laufwerk ',DestLW,':') ; write(' User : ',user:2) ; gotoxy(25,5) ; write(' fuer Hilfe fuer Exit') ; end ; {-----------------------------------------------------------------------------} procedure Display_Dir ; var i : integer ; begin if Anzahl < maxanz then Anzeig := Anzahl else Anzeig := maxanz-1 ; i := 0 ; while (i <= Anzeig) and ( i+r-1 < Anzahl) do begin gotoxy(2+(i div maxzeil) shl 4,7+i mod maxzeil) ; Entry[i][0] := chr(11) ; write(copy(Entry[i+r],1,8),'.',copy(Entry[i+r],9,3),' ') ; if selected[i+r] then write('#') else write(':') ; i := succ(i) ; end ; if maxanz-1 > Anzahl-r then begin gotoxy(2+(i div maxzeil) shl 4,7+i mod maxzeil) ; write('--------------') ; i := succ(i) ; while i mod maxzeil <> 0 do begin gotoxy(2+(i div maxzeil) shl 4,7+i mod maxzeil) ; write(' ') ; i := succ(i) ; end ; end ; end ; {-----------------------------------------------------------------------------} procedure Display( weiter : integer ) ; procedure mark( switch : boolean ) ; begin gotoxy(1+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; if switch then write('>') else write(' ') ; gotoxy(16+(dirsel div maxzeil) shl 4,7+dirsel mod maxzeil) ; if switch then write('<') else write(' ') ; end ; begin Mark(false) ; dirsel := dirsel + weiter ; if anzahl < 0 then begin Meldung('Keine Datei in diesem Verzeichnis') ; Wait(500) ; Meldung(' ') ; exit ; end ; if dirsel < 0 then begin dirsel := 0 ; if (Anzahl > maxanz-1) and (r > 0) then begin dirsel := maxzeil ; r := r - maxzeil ; Display_Dir ; end ; end ; if dirsel > Anzahl then begin dirsel := 0 ; r := 0 ; end ; if r+dirsel > Anzahl then begin dirsel := 0 ; r := 0 ; Display_Dir ; end ; if dirsel > anzeig then begin r := r + maxzeil ; dirsel := maxanz - maxzeil ; Display_Dir ; end ; mark(true) ; end ; {-----------------------------------------------------------------------------} procedure Help ; begin for i:= 3 to 24 do begin gotoxy(1,i) ; ClrEol ; end ; gotoxy(20,5) ; write(' Befehlsverzeichnis fuer Version 1.4 ') ; gotoxy(20,8) ; write('Bildschirm Befehle ! Disk Befehle ') ; gotoxy(18,9) ; write('----------------------+----------------------') ; gotoxy(20,10) ; write('^X : naechste Datei ! N : neue CP/M-Disk') ; gotoxy(20,11) ; write('^E : Datei zurueck ! ') ; gotoxy(20,12) ; write('^D : naechste Spalte! S : Diskspace DOS ') ; gotoxy(20,13) ; write('^S : Spalte zurueck ! I : DOS-Disk erase') ; gotoxy(20,15) ; write('Datei Befehle ! Copy verlassen') ; gotoxy(18,16) ; write('----------------------+----------------------') ; gotoxy(20,17) ; write('T : Tag Datei ! ') ; gotoxy(20,18) ; write('U : Untag Datei ! ') ; gotoxy(20,19) ; write('C : copy Datei ! X : CP/M') ; gotoxy(20,20) ; write('G : Group copy ! R : lesen von DOS-') ; gotoxy(20,21) ; write('F : Dateigroesse ! Diskette') ; gotoxy(20,24) ; write(' zurueck mit beliebiger Taste ! '); read(kbd,Antwort) ;Antwort := ' ' ; Clrfenster ; gotoxy(1,24) ; ClrEol ; gotoxy(1,5) ; ClrEol ; Rahmen ; Display_dir ; display(0) ; end ; {-----------------------------------------------------------------------------} Procedure ScanDirectory ; { Dient zum Einlesen und Sortieren des } { Inhaltsverzeichnis der CP/M Diskette } var Dirbuf : Array[0..127] of byte ; FCB : Array[0..35] of Byte ; {$A-} Procedure Quick_Sort(Anfang,Ende : integer ) ; var VElement : String[12] ; links,rechts : integer ; begin links := Anfang ; rechts := Ende ; VElement := Entry[(Anfang+Ende) div 2] ; repeat while Entry[links] < Velement do links := succ(links) ; while Entry[rechts] > Velement do rechts := pred(rechts) ; if links <= rechts then begin temp := Entry[rechts] ; Entry[rechts] := Entry[links] ; Entry[links] := Temp ; links := succ(links) ; rechts := pred(rechts); end ; until links > rechts ; if Anfang < rechts then quick_sort(Anfang,rechts) ; if Ende > links then quick_sort(links,Ende) ; end ; {$A+} Begin AnZahl := -1 ; FCB[0] :=ord(DestLW)-64 ; for i:= 1 to 11 do FCB[i] := ord('?') ; for i := 12 to 35 do FCB[i] := 0 ; BDos(26,Addr(DirBuf)) ; i := BDos(17,addr(FCB)) ; if i <> $FF then begin Anzahl := succ(Anzahl) ; Entry[0][0] := #11 ; move(DirBuf[32*i+1],Entry[0][1],11) ; repeat i := BDos(18); if i <> $FF then begin AnZahl := Succ(Anzahl) ; Entry[Anzahl][0] := #11 ; move(DirBuf[32*i+1],Entry[Anzahl][1],11) ; end ; until i = $FF ; end ; if Anzahl > 0 then quick_sort(0,Anzahl) ; End; { ScanDirectory } 1!€ÖÿÍd!ƒI/\×>ÍÔÃ6AýáP!°�Íâýå!å!ÍÛ͙͛! Í"!°�Í:!ͪ! Í"Í Éýáá"¦�ýå*¦�"œ�! Í*œ�+"œ�Í å*œ�å!ÑÍÑ}³oËEÊE!Éýáá"��á"’�á"”�á"–�á"˜�ýå!€�"ˆ�*˜�ë*ˆ�s*ˆ�å*–�ëás*ˆ�å*”�ëás#r*ˆ�å*’�ëás#r*ˆ�å*��ëás#r!"~�*˜�·íRÊ;"·íRÊ;"·íRÊ;" ·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÂP"!2å!€�ëÁÍo&"~�à" ·íRÊ‚"·íRÊ‚"·íRÊ‚"·íRÊ‚"·íR”"!2å!€�ëÁÍ"~�à"!2å!€�ëÁÍ*~�"š�*š�É! åÁÍ"gÖ*gÖå!0ÑÍàËEÊö"ÍM'Ohne CP/M-Plus geht da leider nichts ! Íÿ ÃÔ !åÁÍo&"sÖ*sÖå!AÑ}2B‚!å*wÖ&ëÁÍo&"gÖ*gÖå!ÑÍ’ËEÊb#ÍM#MS-DOS-Laufwerk existiert nicht !? Íÿ ÃÔ !å*sÖëÁÍ! å!ÿëÁÍo&"oÖÍMROOT!G‚ÍâÉýáá"t�ýå!å!å*t�å!å!åÍk!"mÖÉýáá"c�á}2e�á"f�á"h�á"j�ýå*h�Í€å!'ÑÍÌËEÊb$Í›ͺ ^M auf Spur *h�å!Í&ͺ kann nicht zugegriffen werden. ͺ0Fehler beim Umsetzen Cluster in Spur und Sektor Í !ôåÍ7!ä%! å!å*j�å!å!åÍk!"eÖ!å!å*f�å*eÖ^#Vëå!åÍk!"uÖ! å!å*h�å!å!åÍk!"mÖ! å!å*uÖå!å!åÍk!"mÖ! å!å*c�å!å!åÍk!"mÖ!å!å!å!å!åÍk!"mÖ*e�&ËEÊ)%!å!å!å!å!åÍk!"mÖÃC%! å!å!å!å!åÍk!"mÖ*mÖå!ÑÍ’ËEÊ%ÍM%Fehler bei DiskIO auf MS-DOS DisketteÍÿ ! å!å*B‚&å!AÑë·íRå!å!åÍk!"gÖÉ!}21‚*wÖ&å!å!å!å!eÒåÍ´#*wÖ&å!å!å!å!eÒå!ÑåÍ´#!eÒå!Ñn&å!ÿÑÍ’å!eÒå!Ñn&å!ÿÑÍ’Ñ}£oËEÊ&!}21‚Éýáá"M�á"O�á"Q�ýå*Q�å!Ñë·íR"Q�*Q�å!ÑÍõ"Q�*Q�å! Ñ"Q�*Q�å!ÑÍë*O�s#r*Q�å!ÑÍEë*M�s#rÉ!å!ÑÍfz³Ê¦&Õ"mÖ!å*mÖÍÛÍ™*mÖ#ÑÇ&Éýáá"9�ýå*9�å!ÑÍõå!ÑÍ"/�!eÒå*/�Ñn&å!å!eÒå*/�å!ÑÑn&ÑÍõÑ"-�*9�Í‹ËEÊ'*-�å!ÑÍVå!ÑÍ}2;�Ã0'*-�å!ÿÑ|¢g}£oå!ÑÍ}2;�*;�&É!"�!å!cÑÍfz³Êl'Õ"!�*!�åͧ&ËEÊc'*�#"�*!�#ÑÃG'*�"+�*+�Éýáá"C]ýå!`å*C]å)))))ÑÑÍ:!å!Ík!.e.åÍ=!`å*C]å)))))ÑÑÍ:! å!ÍkÍ=!E]Íâýá!E]Í:ýåÉÍM360K MS-DOS Diskette Íÿ Í›Í6'å!Í&ͺ KByte freiÍ !,åÍ7!! e.åÍÿ É! å!ÍÛÍ›ͺ<*** Ingenious Systems MS-DOS ---> CP/M Copy Utility *** ÍÍÍ ! å!ÍÛÍ›ͺ6 from Andreas Buchelt Copyright (c) 1987ÍÍÍ É!å!ÍÛÍ›ͺ Name der MS-DOS Diskette :!_Í:! ͪÍ Í›ͺ Angezeigtes Directory :!G‚Í:! ͪÍ !å!ÍÛÍ™!å!ÍÛÍ›ͺ" fuer Hilfe fuer ExitÍ !å!å!Ñë·íRÍÛÍ™!å!å!Ñë·íRÍÛÍ™!å!ÍÛ͙͛ͺ SubDirs : Í !å*T]+ÑÍfz³Ê9*Õ"mÖ! å! å*mÖå!ÑÍEÍ€ÑÍõÑå!å*mÖå!ÑÍÑÍÛ!„]å*mÖ#+å)))))ÑÑÍ:Í›!ͪÍ *mÖ#ÑÃÔ)É*=‚å!FÑÍàËEÊS**=‚";‚Ãb*!Få!Ñë·íR";‚!"]*]å*;‚Ñ͸å*]å*7‚Ñå!Ñë·íRå*=‚ÑÍàÑ}£oËEÊ…+!å*]å!ÑÍå!ÑÍNÑå!å*]å!ÑÍEÑÍÛ!`å*]å)))))ÑÑå!Ñå! ëásÍ›!`å*]å*7‚Ñå)))))ÑÑÍ:!å!Ík!ͪ!.Í"!`å*]å*7‚Ñå)))))ÑÑÍ:! å!Ík!ͪ! Í"Í !_å*]å*7‚ÑÑn&ËEÊo+Í›!#Í"Í Ã{+Í›!:Í"Í *]#"]Ãh*!Få!Ñë·íRå*=‚å*7‚Ñë·íRÑÍÌËEÊ\,!å*]å!ÑÍå!ÑÍNÑå!å*]å!ÑÍEÑÍÛÍ›ͺ--------------Í *]#"]*]å!ÑÍEå!ÑÍ’ËEÊ\,!å*]å!ÑÍå!ÑÍNÑå!å*]å!ÑÍEÑÍÛÍ›ͺ Í *]#"]Ãô+ÉÃ-ýáá}2]ýå!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛ*]&ËEʰ,Í›!>Í"Í ü,Í›! Í"Í !å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛ*]&ËEÊ-Í›!<Í"Í Ã-Í›! Í"Í Éýáá"]ýå!åÍ`,*qÖå*]Ñ"qÖ*=‚å!ÑÍàËEÊw-ÍM!Keine Datei in diesem VerzeichnisÍÿ !,åÍ7!! e.åÍÿ ÃD.*qÖå!ÑÍàËEÊÎ-!"qÖ*=‚å!Få!Ñë·íRÑÍÌå*7‚å!ÑÍÌÑ}£oËEÊÎ-!"qÖ*7‚å!Ñë·íR"7‚Í:**qÖå*=‚ÑÍÌËEÊê-!"qÖ!"7‚*7‚å*qÖÑå*=‚ÑÍÌËEÊ.!"qÖ!"7‚Í:**qÖå*;‚ÑÍÌËEÊ=.*7‚å!Ñ"7‚!Få!Ñë·íR"qÖÍ:*!åÍ`,É!å!ÑÍfz³Êo.Õ"mÖ!å*mÖÍÛÍ™*mÖ#ÑÃP.!å!ÍÛÍ›ͺ& Befehlsverzeichnis fuer Version 1.5 Í !å!ÍÛÍ›ͺ)Bildschirm Befehle ! Disk Befehle Í !å! ÍÛÍ›ͺ-----------------------+----------------------Í !å! ÍÛÍ›ͺ)^X : naechste Datei ! N : neue DOS-Disk Í !å! ÍÛÍ›ͺ)^E : Datei zurueck ! D : SubDir waehlenÍ !å! ÍÛÍ›ͺ)^D : naechste Spalte! R : RootDir Í !å! ÍÛÍ›ͺ)^S : Spalte zurueck ! I : DOS Diskinfo Í !å!ÍÛÍ›ͺ) ! S : Diskspace CP/MÍ !å!ÍÛÍ›ͺ%Datei Befehle ! Copy verlassenÍ !å!ÍÛÍ›ͺ-----------------------+----------------------Í !å!ÍÛÍ›ͺT : Tag Datei ! X : CP/MÍ !å!ÍÛÍ›ͺU : Untag Datei ! Í !å!ÍÛÍ›ͺC : copy Datei ! Í !å!ÍÛÍ›ͺ(G : Group copy ! W : schreiben aufÍ !å!ÍÛÍ›ͺ)F : Dateigroesse ! DOS-DisketteÍ !å!ÍÛÍ›ͺ zurueck mit beliebiger Taste ! Í !ºÍ©!C‚ÍDÍ ! }2C‚Í|&ÍÌ(Í:*!åÍ],Éýáá"ú\ýå*ú\å!ÑÍõå!ÑÍ"ð\!eÒå*ð\å!ÑÑn&å!ÑÍNå!eÒå*ð\Ñn&Ñ"î\*ú\Í‹ËEÊ“2*î\å!ÑÍV"ü\ä2*î\å!ÿÑ|¢g}£o"ü\*ü\ÉÃ41!©\Íýáá"Ö\á"Ø\ýå*Ø\"«\*Ö\"©\!`å*Ø\å*Ö\Ñå!ÑÍVå)))))ÑÑÍ: !­\Íâ!`å*«\å)))))ÑÑÍ:!­\Í:ÍîËEÊ"3*«\#"«\Ãö2!`å*©\å)))))ÑÑÍ:!­\Í:ÍÛËEÊN3*©\+"©\Ã"3*«\å*©\Ñ͸ËEÊÐ3!`å*©\å)))))ÑÑÍ: !Z]Íâ!`å*©\å)))))ÑÑå!`å*«\å)))))ÑÑÍ: Í!`å*«\å)))))ÑÑå!Z]Í: Í*«\#"«\*©\+"©\*«\å*©\ÑÍÌËEÊö2*Ø\å*©\ÑÍàËEÊû3*Ø\å*©\åÍ«2*Ö\å*«\ÑÍÌËEÊ4*«\å*Ö\åÍ«21©\Ã"ýáá}2ç\á"è\á"ê\á"ì\ýå!"Ú\*ç\&}îoËEÊN4*kÖ"Ü\!}22‚!}2Þ\!ÿÿ"=‚!"T]*2‚&}îoËEʇ7!"9‚*wÖ&å*ì\å*ê\å!å!e‚å!+)))))))))ÑåÍ´#!e‚å!+)))))))))Ñå*9‚Ñn&å!ÑÍ’å!e‚å!+)))))))))Ñå*9‚Ñn&å!åÑÍ’Ñ}£oËEÊn6!e‚å!+)))))))))Ñå*9‚å! ÑÑn&(·íRÂ_5!e‚å!+)))))))))Ñå*9‚Ñå!_å!Ñå! Íd!_å!Ñå! ëásÃn6·íRÊs5·íRÂþ5!e‚å!+)))))))))Ñå*9‚Ñn&å!.ÑÍ’ËEÊû5*T]#"T]!e‚å!+)))))))))Ñå*9‚Ñå!„]å*T]+å)))))ÑÑå!Ñå! Íd!„]å*T]+å)))))ÑÑå!Ñå! ëásÃn6 ·íR·íBÒn6*=‚#"=‚!e‚å!+)))))))))Ñå*9‚Ñå!`å*=‚å)))))ÑÑå!Ñå! Íd!`å*=‚å)))))ÑÑå!Ñå! ëásÃn6*Ú\#"Ú\!e‚å!+)))))))))Ñå*9‚Ñn&å!ÑÍå*Ú\å*è\ÑÍÑ}³o}22‚*9‚å! Ñ"9‚*2‚&å*9‚å!ÑÍ¥Ñ}³oËEÊ¥4*2‚&}îoËEÊ„7*Þ\&ËEÊ(7*Ü\åÍ-2"Ü\*Ü\å!cÑ͸ËEÊ7*Ü\å!ì\å!ê\åÍ&!}2Þ\Ã%7!}22‚Ä7*ê\#"ê\*ì\å*ê\å!ÑÍÑ"ì\*ê\å!ÑÍ¥ËEÊa7*ê\å!ÑÍE"ê\*ç\&ËEÊ}7*Ú\å!oÑÍÌ}22‚Ä7!}2Þ\Ãh4*=‚å!ÑÍÌËEÊ¢7!å*=‚åÍ«2ÉÍ|&ÍM ROOT !G‚ÍâÍM Kein Name!_ÍâÍ¥%*1‚&ËEÊZ8ÍM0keine MS-DOS Diskette !!! Neue Disk (J/N) ?Íÿ !ºÍ©!C‚ÍDÍ *C‚&Íä}2C‚! e.åÍÿ *C‚&å!NÑÍËEÊZ8!å!ÍÛÃÔ *1‚&}îoËEÊÒ7!"7‚!"3‚!"5‚*3‚å*5‚å!oå!åͨ2ÍÌ(Í:*!"qÖ!åÍ],É*kÖ"•\!}2�\*V]å!(ÑÍÌËEÊÖ8!("—\*V]å!(Ñë·íR"V]Ãâ8*V]"—\!"V]*—\åÍ‘#!"—\*�\&}îoå*—\å!(Ñ͸Ñ}£oå*D‚&}îoÑ}£oËEÊÕ:*•\å!“\å!‘\åÍ&*D‚&}îoËEÊÒ:*•\åÍ-2"•\*•\å!øÑÍ¥å*•\å!ÿÑ͸Ñ}£oËEÊi9!}2�\*wÖ&å*“\å*‘\å!å!e‚å*—\+)))))))))ÑåÍ´#*�\&å*X]å!ÑÍàÑ}£oËEÊÙ9!e‚å*—\+)))))))))Ñå*X]Ñå!å*X]Ñë·íRå!ÍN*—\#"—\*D‚&}îoå!å!ÑÍÑ}£oËEÊÒ:*‘\#"‘\*“\å*‘\å!ÑÍÑ"“\*‘\å!ÑÍE"‘\*wÖ&å*“\å*‘\å!å!e‚å*—\+)))))))))ÑåÍ´#*�\&å*X]å!ÑÍÌÑ}£oËEÊ­:*X]å!Ñë·íR"X]!e‚å*—\+)))))))))Ñå*X]Ñå!å*X]Ñë·íRå!ÍN*—\#"—\*�\&}îoå*X]å!ÑÍÑ}³oËEÊÒ:*—\#"—\Ãï8*�\&}2F‚*•\"kÖ*—\+"iÖÉýáP!?\Íâýå!}2D‚!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›! Í"Í !å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›! Í"Í !?\Í:Íÿ !ºÍ©!B‚ÍDÍ *B‚&Íä}2B‚*B‚&åÍ�!Aå!PÍ›ÍOËEÊÎ;*B‚&Í›Í"ͺ: User Í ÃÕ;!}2D‚!"?‚!ºÍ©!A‚ÍDÍ *A‚&åÍ�!0å!9Í›ÍOËEÊ'!~]Í,ÅÕå!ŠÙáÑÁÍÿ Í4 ÅÕå!ŠÙáÑÁÍú ÍÞ"X]!~]Í,ÅÕå!ÍÙáÑÁÍÿ ÍÞ"V]*B‚&å!:e.åÍ¢ Í=*qÖå*7‚ÑåÍv'Í=!V‚Íâ!"mÖ!V‚Í:Í£å!Ñë·íRå*mÖÑÍÌËEʵ>!V‚å*mÖÑn&å! ÑÍËEÊ«>!V‚å*mÖå! å*mÖÑë·íRÍóò>*mÖ#"mÖÃY>! å*?‚ëÁÍ!‚å!V‚Í:Íp!‚ÍpÍñå!ÑÍËEÊf?Í›ͺ& existiert, Ueberschreiben (J/N) ? !ºÍ©!A‚ÍD*A‚&Íä}2A‚*A‚&Í›Í"*A‚&å!JÑÍËEÊO?!‚ÍoÃc?!dåÍ7!! e.åÍÿ Ã5AÃl?!‚ÍoÍñå!ÑÍ’ËEÊÒ?!}2D‚!_å*qÖå*7‚ÑÑå!ëásÍM"Direktory ist voll weiter mit Íÿ ÍËÍ ! e.åÍÿ !`å*qÖå*7‚Ñå)))))ÑÑå!Ñn&å!ÑÍNå!`å*qÖå*7‚Ñå)))))ÑÑå!Ñn&Ñ"kÖ!}2F‚!}2E‚*F‚&}îoå*D‚&}îoÑ}£oËEÊAÍ¡8*D‚&}îoËEÊA!‚ÍpÍ !‚å!‚Í]ÍoÍ !‚å!e‚å*iÖå!ÑÍNͺÍñå!ÑÍ’ËEÊA!‚ͰÍ !‚Í“ÍMDiskette voll, *qÖå*7‚ÑåÍv'Í=ÍM wieder geloescht !Í=Íÿ !_å*qÖå*7‚ÑÑå!ëás!,åÍ7!! e.åÍÿ ÃA!‚ͰÍ Ã.@! å*oÖëÁÍ! e.åÍÿ É!å!ÿÑÍfz³ÊcAÕ"mÖ!_å*mÖÑå!ëás*mÖ#ÑÃAAÍ>!}2D‚Í+(! e.åÍÿ ͪ"Í£7!å!ÍÛ!ºÍ©!C‚ÍDÍ *C‚&ÍäT·íRÂB!_å*qÖå*7‚ÑÑå!ëás!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›!#Í"Í !åÍ],ÃaIU·íRÂhB!_å*qÖå*7‚ÑÑå!ëás!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›!:Í"Í !åÍ],ÃaI ·íRÊ|B ·íR†B!åÍ],ÃaI ·íRÊšB·íR¤B!åÍ],ÃaI ·íRʸB·íRÂÂB!ÿÿåÍ],ÃaI ·íRÊÖB·íRÂàB!åÍ],ÃaI·íRÊôB·íRÂþB!åÍ],ÃaID·íRÂiDÍ|&!"mÖ!}2D‚*mÖå!Ñå*T]Ñ͸å*D‚&}îoÑ}£oËEʶC*mÖ#"mÖÍMSelect !„]å*mÖ+å)))))ÑÑÍ:Í=ÍM (J/N) ? Í=Íÿ !ºÍ©!C‚ÍDÍ *C‚&Íä}2C‚*C‚&Í›Í"Í *C‚&å!JÑÍ}2D‚ÃC! e.åÍÿ *D‚&ËEÊMD!„]å*mÖ+å)))))ÑÑÍ:!G‚Íâ!„]å*mÖ+å)))))ÑÑå!Ñn&å!ÑÍNå!„]å*mÖ+å)))))ÑÑå!Ñn&Ñ"kÖ*kÖå!3‚å!5‚åÍ&*3‚å*5‚å!ÿå!åͨ2!"7‚!"qÖÍÌ(Í:*!åÍ],ÃaIC·íR¬DÍMcopy *qÖå*7‚ÑåÍv'Í=ÍM to DriveÍ=Íì:ÍÇÍÿ ÍËÍ ! e.åÍÿ Í£7ÃaIS·íRÂfGÍM Freier Diskspeicher auf LaufwerkÍÿ !ºÍ©!A‚ÍDÍ *A‚&Íä}2A‚*A‚&Í›Í"ͺ: Í *A‚&åÍ�!Aå!PÍ›ÍOËEÊcG!å!{]ëÁÍ"mÖ!.å*A‚&å!AÑë·íRëÁÍ"mÖ!{]å!+Ñn&å!‰ÅÕå!{]å!+Ñn&ÍÙáÑÁÍú ÙáÍÍé ÅÕå!‘ÅÕå!{]å!+Ñn&ÍÙáÑÁÍú ÙáÑÁÍé ÅÕå!ÍÙáÑÁÍÿ Ù!~]ÍÑ!~]Í,Í›ÅÕå!å!Íyͺ KByte Í !îåÍ7!! e.åÍÿ ÃaIR·íRÂvGÍ£7ÃaIF·íRÂ%I*qÖåÍv'ÍM Filelaenge MS-DOS :Í=Íÿ !‘ÅÕå!`å*qÖå)))))ÑÑå!Ñn&ÍÙáÑÁÍú ÅÕå!‰ÅÕå!`å*qÖå)))))ÑÑå!Ñn&ÍÙáÑÁÍú ÙáÑÁÍé ÅÕå!`å*qÖå)))))ÑÑå!Ñn&ÍÙáÑÁÍé Ù!~]ÍÑ!~]Í,Í›ÅÕå!å!Íyͺ Bytes ---> CP/M : Í !~]Í,ÅÕå!ÍÙáÑÁÍÿ Í4 ÅÕå!ÍÙáÑÁ͈ËEÊÃH!~]Í,ÅÕå!ÍÙáÑÁÍÿ Ù!~]ÍÑÃðH!~]Í,ÅÕå!ÍÙáÑÁÍÿ ÅÕå!ÍÙáÑÁÍé Ù!~]ÍÑÍ›!~]Í,ÍÞå!Í&ͺ KByte Í !îåÍ7!! e.åÍÿ ÃaII·íRÂ5IÍÚ'ÃaIW·íRÂaI!‚åÍM MSWRITE.CHNÍp!‚ÍëÍ ÃaI*C‚&Íäå!XÑÍËEÊ€A!å!ÍÛÃÔ Íº KByte Í !îåÍ7!! e.åÍÿ Ã~GI·íRÂIÍÚ'Ã-IW·íRÂW!‚åÍM MSWRITE.CHNÍp!‚ÍëÍ Ã=I*1!€ÖÿÍd!ÐPýp×>ÍÔúHýáP!°�Íâýå!å!ÍÛ͙͛! Í"!°�Í:!ͪ! Í"Í Éýáá"¦�ýå*¦�"œ�! Í*œ�+"œ�Í å*œ�å!ÑÍÑ}³oËEÊE!Éýáá"��á"’�á"”�á"–�á"˜�ýå!€�"ˆ�*˜�ë*ˆ�s*ˆ�å*–�ëás*ˆ�å*”�ëás#r*ˆ�å*’�ëás#r*ˆ�å*��ëás#r!"~�*˜�·íRÊ;"·íRÊ;"·íRÊ;" ·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÂP"!2å!€�ëÁÍo&"~�à" ·íRÊ‚"·íRÊ‚"·íRÊ‚"·íRÊ‚"·íR”"!2å!€�ëÁÍ"~�à"!2å!€�ëÁÍ*~�"š�*š�É! åÁÍ"gÖ*gÖå!0ÑÍàËEÊö"ÍM'Ohne CP/M-Plus geht da leider nichts ! Íÿ ÃÔ !åÁÍo&"sÖ*sÖå!AÑ}2B‚!å*wÖ&ëÁÍo&"gÖ*gÖå!ÑÍ’ËEÊb#ÍM#MS-DOS-Laufwerk existiert nicht !? Íÿ ÃÔ !å*sÖëÁÍ! å!ÿëÁÍo&"oÖÍMROOT!G‚ÍâÉýáá"t�ýå!å!å*t�å!å!åÍk!"mÖÉýáá"c�á}2e�á"f�á"h�á"j�ýå*h�Í€å!'ÑÍÌËEÊb$Í›ͺ ^M auf Spur *h�å!Í&ͺ kann nicht zugegriffen werden. ͺ0Fehler beim Umsetzen Cluster in Spur und Sektor Í !ôåÍ7!ä%! å!å*j�å!å!åÍk!"eÖ!å!å*f�å*eÖ^#Vëå!åÍk!"uÖ! å!å*h�å!å!åÍk!"mÖ! å!å*uÖå!å!åÍk!"mÖ! å!å*c�å!å!åÍk!"mÖ!å!å!å!å!åÍk!"mÖ*e�&ËEÊ)%!å!å!å!å!åÍk!"mÖÃC%! å!å!å!å!åÍk!"mÖ*mÖå!ÑÍ’ËEÊ%ÍM%Fehler bei DiskIO auf MS-DOS DisketteÍÿ ! å!å*B‚&å!AÑë·íRå!å!åÍk!"gÖÉ!}21‚*wÖ&å!å!å!å!eÒåÍ´#*wÖ&å!å!å!å!eÒå!ÑåÍ´#!eÒå!Ñn&å!ÿÑÍ’å!eÒå!Ñn&å!ÿÑÍ’Ñ}£oËEÊ&!}21‚Éýáá"M�á"O�á"Q�ýå*Q�å!Ñë·íR"Q�*Q�å!ÑÍõ"Q�*Q�å! Ñ"Q�*Q�å!ÑÍë*O�s#r*Q�å!ÑÍEë*M�s#rÉ!å!ÑÍfz³Ê¦&Õ"mÖ!å*mÖÍÛÍ™*mÖ#ÑÇ&Éýáá"9�ýå*9�å!ÑÍõå!ÑÍ"/�!eÒå*/�Ñn&å!å!eÒå*/�å!ÑÑn&ÑÍõÑ"-�*9�Í‹ËEÊ'*-�å!ÑÍVå!ÑÍ}2;�Ã0'*-�å!ÿÑ|¢g}£oå!ÑÍ}2;�*;�&É!"�!å!cÑÍfz³Êl'Õ"!�*!�åͧ&ËEÊc'*�#"�*!�#ÑÃG'*�"+�*+�Éýáá}2ñrýå!ñræO~æðG€�#w*òr&Éýáá"árá"ãrá"årá"çrýå ÿë>M*árw>*ár4!®'(<æ  q+N# (è ë·íBë(0ñë }*årwë­'·íR}*ãrwÉýáá"Èrýå! tå*Èrå))å)ÑÑÑÍ:!å!Ík!.e.åÍ=! tå*Èrå))å)ÑÑÑÍ:! å!ÍkÍ=!ÊrÍâýá!ÊrÍ:ýåÉ! å!ÍÛÍ›ͺ<*** Ingenious Systems CP/M ---> MS-DOS Copy Utility *** ÍÍÍ ! å!ÍÛÍ›ͺ6 from Andreas Buchelt Copyright (c) 1988ÍÍÍ É!å!ÍÛÍ›ͺVerzeichnis von Laufwerk *B‚&Í"!:Í"Í Í›ͺ User : *?‚å!Í&Í !å!ÍÛÍ›ͺ! fuer Hilfe fuer ExitÍ É*=‚å!FÑÍàËEʬ)*=‚";‚û)!Få!Ñë·íR";‚!"¦r*¦rå*;‚Ñ͸å*¦rå*7‚Ñå!Ñë·íRå*=‚ÑÍàÑ}£oËEÊá*!å*¦rå!ÑÍå!ÑÍNÑå!å*¦rå!ÑÍEÑÍÛ! tå*¦rå))å)ÑÑÑå!Ñå! ëásÍ›! tå*¦rå*7‚Ñå))å)ÑÑÑÍ:!å!Ík!ͪ!.Í"! tå*¦rå*7‚Ñå))å)ÑÑÑÍ:! å!Ík!ͪ! Í"Í ! så*¦rå*7‚ÑÑn&ËEÊË*Í›!#Í"Í Ã×*Í›!:Í"Í *¦r#"¦rÃÁ)!Få!Ñë·íRå*=‚å*7‚Ñë·íRÑÍÌËEʸ+!å*¦rå!ÑÍå!ÑÍNÑå!å*¦rå!ÑÍEÑÍÛÍ›ͺ--------------Í *¦r#"¦r*¦rå!ÑÍEå!ÑÍ’ËEʸ+!å*¦rå!ÑÍå!ÑÍNÑå!å*¦rå!ÑÍEÑÍÛÍ›ͺ Í *¦r#"¦rÃP+ÉÃl,ýáá}2›rýå!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛ*›r&ËEÊ ,Í›!>Í"Í Ã,Í›! Í"Í !å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛ*›r&ËEÊ_,Í›!<Í"Í Ãk,Í›! Í"Í Éýáá"¤rýå!åͼ+*qÖå*¤rÑ"qÖ*=‚å!ÑÍàËEÊÓ,ÍM!Keine Datei in diesem VerzeichnisÍÿ !ôåÍ7!! e.åÍÿ à-*qÖå!ÑÍàËEÊ*-!"qÖ*=‚å!Få!Ñë·íRÑÍÌå*7‚å!ÑÍÌÑ}£oËEÊ*-!"qÖ*7‚å!Ñë·íR"7‚Í“)*qÖå*=‚ÑÍÌËEÊF-!"qÖ!"7‚*7‚å*qÖÑå*=‚ÑÍÌËEÊk-!"qÖ!"7‚Í“)*qÖå*;‚ÑÍÌËEÊ™-*7‚å!Ñ"7‚!Få!Ñë·íR"qÖÍ“)!åͼ+É!å!ÑÍfz³ÊË-Õ"mÖ!å*mÖÍÛÍ™*mÖ#Ñì-!å!ÍÛÍ›ͺ& Befehlsverzeichnis fuer Version 1.4 Í !å!ÍÛÍ›ͺ)Bildschirm Befehle ! Disk Befehle Í !å! ÍÛÍ›ͺ-----------------------+----------------------Í !å! ÍÛÍ›ͺ)^X : naechste Datei ! N : neue CP/M-DiskÍ !å! ÍÛÍ›ͺ^E : Datei zurueck ! Í !å! ÍÛÍ›ͺ)^D : naechste Spalte! S : Diskspace DOS Í !å! ÍÛÍ›ͺ)^S : Spalte zurueck ! I : DOS-Disk eraseÍ !å!ÍÛÍ›ͺ%Datei Befehle ! Copy verlassenÍ !å!ÍÛÍ›ͺ-----------------------+----------------------Í !å!ÍÛÍ›ͺT : Tag Datei ! Í !å!ÍÛÍ›ͺU : Untag Datei ! Í !å!ÍÛÍ›ͺC : copy Datei ! X : CP/MÍ !å!ÍÛÍ›ͺ)G : Group copy ! R : lesen von DOS-Í !å!ÍÛÍ›ͺ&F : Dateigroesse ! DisketteÍ !å!ÍÛÍ›ͺ zurueck mit beliebiger Taste ! Í !ºÍ©!C‚ÍDÍ ! }2C‚Í|&!å!ÍÛÍ™!å!ÍÛÍ™Í)Í“)!å͹+ÉÃÏ2!ÂqÍýáá"Ûqá"Ýqýå*Ýq"Äq*Ûq"Âq! tå*Ýqå*ÛqÑå!ÑÍå))å)ÑÑÑÍ: !ÆqÍâ! tå*Äqå))å)ÑÑÑÍ:!ÆqÍ:ÍîËEÊÍ1*Äq#"Äqà1! tå*Âqå))å)ÑÑÑÍ:!ÆqÍ:ÍÛËEÊú1*Âq+"ÂqÃÍ1*Äqå*ÂqÑ͸ËEÊ€2! tå*Âqå))å)ÑÑÑÍ: !ürÍâ! tå*Âqå))å)ÑÑÑå! tå*Äqå))å)ÑÑÑÍ: Í! tå*Äqå))å)ÑÑÑå!ürÍ: Í*Äq#"Äq*Âq+"Âq*Äqå*ÂqÑÍÌËEÊ 1*Ýqå*ÂqÑÍàËEÊ«2*Ýqå*ÂqåÍT1*Ûqå*ÄqÑÍÌËEÊÆ2*Äqå*ÛqåÍT1ÂqÃ"!ÿÿ"=‚!ßqå!Ñå*B‚&å!@Ñë·íRëás!å! ÑÍfz³Ê3Õ"mÖ!ßqå*mÖÑå!?ëás*mÖ#ÑÃû2! å!#ÑÍfz³ÊJ3Õ"mÖ!ßqå*mÖÑå!ëás*mÖ#ÑÃ(3!å!rëÁÍ!å!ßqëÁÍo&"mÖ*mÖå!ÿÑÍ’ËEÊ`4*=‚#"=‚! tå!å))å)ÑÑÑå!Ñå! ëás!rå! å*mÖÑÍõå!ÑÑå! tå!å))å)ÑÑÑå!Ñå! Íd!åÁÍo&"mÖ*mÖå!ÿÑÍ’ËEÊP4*=‚#"=‚! tå*=‚å))å)ÑÑÑå!Ñå! ëás!rå! å*mÖÑÍõå!ÑÑå! tå*=‚å))å)ÑÑÑå!Ñå! Íd*mÖå!ÿÑÍËEÊÕ3*=‚å!ÑÍÌËEÊ{4!å*=‚åÍT1ÉÃ’4IGS V1.3CPM-->MSDOS!}2D‚ÍM@Achtung ! Alle Daten der DOS-Diskette gehen verloren. Ok (J/N) ?Íÿ !ºÍ©!C‚ÍDÍ *C‚&Íä}2C‚*C‚&Í›Í"Í *C‚&å!JÑÍ’ËEÊ/5!}2D‚! e.åÍÿ Ãò9!e‚å!+)))))))))Ñå!å!ÍN!4å!e‚å!+)))))))))Ñå!Ñå!Íd!e‚å!+)))))))))Ñå! Ñå!ëás!e‚å!+)))))))))Ñå! Ñå!ëás!e‚å!+)))))))))Ñå! Ñå!ëás!e‚å!+)))))))))Ñå!Ñå!ëás!e‚å!+)))))))))Ñå!Ñå!ëás!e‚å!+)))))))))Ñå!Ñå!ëás!e‚å!+)))))))))Ñå!Ñå!p&ëás!e‚å!+)))))))))Ñå!Ñå!pl&ëás!e‚å!+)))))))))Ñå!Ñå!Ð&ëás!e‚å!+)))))))))Ñå!Ñå!Ðl&ëás!e‚å!+)))))))))Ñå!Ñå!ýëás!e‚å!+)))))))))Ñå!Ñå!ëás!e‚å!+)))))))))Ñå!Ñå!ëás!e‚å!+)))))))))Ñå!Ñå! ëás!e‚å!+)))))))))Ñå!Ñå!ëás!e‚å!+)))))))))Ñå!Ñå!ëás!e‚å!+)))))))))Ñå!Ñå!ëás!eÒå!Ñå!ýëás!eÒå!Ñå!ÿëás!eÒå!Ñå!ÿëás!eÒå!Ñå!ýå!ÍN!e‚å!+)))))))))Ñå!å!öÍN!å!ÑÍfz³ÊB8Õ"¸q!e‚å!+)))))))))Ñå*¸qå!ÑÍNÑå!ëás*¸q#ÑÃ8! åÍ‘#*wÖ&å!å!å!å!e‚å!+)))))))))ÑåÍ´#*wÖ&å!å!å!å!eÒåÍ´#*wÖ&å!å!å!å!eÒå!ÑåÍ´#*wÖ&å!å!å!å!eÒåÍ´#*wÖ&å!å!å!å!eÒå!ÑåÍ´#!"5‚*5‚"´q!"¶q!å!ÑÍfz³Êc9Õ"¸q*´q#"´q*¶qå*´qå!ÑÍÑ"¶q*´qå!ÑÍE"´q*wÖ&å*¶qå*´qå!å!e‚å!+)))))))))ÑåÍ´#*¸q#ÑÃÿ8!e‚å!+)))))))))Ñå! å!ÍN!‡4å!e‚å!+)))))))))Ñå! Íd!e‚å!+)))))))))Ñå! Ñå!(ëás*wÖ&å!å*5‚å!å!e‚å!+)))))))))ÑåÍ´#! e.åÍÿ ÉÃß:ýáá"Šqýå*Šq"|q*|qå!ÑÍõå!ÑÍ"€q!eÒå*€qå!ÑÑn&å!ÑÍNå!eÒå*€qÑn&Ñ"~q*|qÍ‹ËEÊs:*~qå!ÑÍV"|q*~qå!Ñ|¢g}£o"~qÕ:*~qå!ÿÑ|¢g}£o"|q*~qå!ðÑ|¢g}£o"~q!eÒå*€qÑå*~qå!ÿÑ|¢g}£oëás!eÒå*€qå!ÑÑå*~qå!ÑÍVëás*|qå!øÑÍ¥ËEÊ:Éýáá"²qýå!}2©q!}2¨q*wÖ&å*©q&å*¨q&å!å!e‚å!+)))))))))ÑåÍ´#!}2�q!}2œq!}2§q*�q&}îoËEÊu>!"¤q*§q&#}2§q!e‚å!+)))))))))Ñå*¤qÑn&å!ÑÍå!e‚å!+)))))))))Ñå*¤qÑn&å!åÑÍÑ}³o}2›q*›q&å*œq&}îoÑ}£oËEÊÛ;*©q&"žq*¨q&"¢q*¤q" q!}2œq*›q&}îoå!e‚å!+)))))))))Ñå*¤qå! ÑÑn&åÍ�! å!'Í›ÍOÑ}£oËEÊ£=!Œqå!Ñå! ëás!e‚å!+)))))))))Ñå*¤qÑå!Œqå!Ñå! Íd!ŒqÍ:! tå*qÖå*7‚Ñå))å)ÑÑÑÍ:!å! ÍkÍ�ËEÊ£=Í›ͺ# existiert, ueberschreiben (J/N) ? Í !ºÍ©!C‚ÍDÍ *C‚&Íä}2C‚*C‚&Í›Í"Í *C‚&å!JÑÍËEÊ™=!e‚å!+)))))))))Ñå*¤qÑå!åëás!e‚å!+)))))))))Ñå*¤qå!ÑÑn&å!å!e‚å!+)))))))))Ñå*¤qå!ÑÑn&ÑÍõÑåÍö9*wÖ&å*©q&å*¨q&å!å!e‚å!+)))))))))ÑåÍ´#ã=!}2D‚ÖB!e‚å!+)))))))))Ñå*¤qÑn&å!ÑÍå*§q&å!oÑÍÑ}³o}2�q*¤qå! Ñ"¤q*�q&å*¤qå!ÑÍ¥Ñ}³oËEÊK;*�q&}îoËEÊr>*¨q&#}2¨q*©q&å*¨q&å!ÑÍÑ}2©q*¨q&å!ÑÍE}2¨q*wÖ&å*©q&å*¨q&å!å!e‚å!+)))))))))ÑåÍ´#Ã7;*œq&ËEÊ@B*¢qå*¨q&ÑÍ’å*žqå*©q&ÑÍ’Ñ}³oËEÊÌ>*wÖ&å*žqå*¢qå!å!e‚å!+)))))))))ÑåÍ´#!å! ÑÍfz³Ê:?Õ}2¦q!e‚å!+)))))))))Ñå* qå*¦q&ÑÑå! tå*qÖå*7‚Ñå))å)ÑÑÑå*¦q&å!ÑÑn&ëás*¦q&#ÑÃ×>!e‚å!+)))))))))Ñå* qå! ÑÑå! ëás! å!ÑÍfz³Ê¨?Õ}2¦q!e‚å!+)))))))))Ñå* qå*¦q&ÑÑå!ëás*¦q&#ÑÃk?!iå!órëÁÍ!órå!+)Ñ^#Vëå!ûrå!úrå!ùråÍ—'!órå!+)Ñ^#Vë&åÍv'}2ør!órå!+)Ñ^#Vël&åÍv'}2÷r!e‚å!+)))))))))Ñå* qå!ÑÑå!å*÷r&å!ÑÍNÑëás!e‚å!+)))))))))Ñå* qå!ÑÑå*÷r&å!ÑÍVå*ør&å!ÑÍNÑëás!e‚å!+)))))))))Ñå* qå!ÑÑå*ûr&å*úr&å!ÑÍNÑëás!e‚å!+)))))))))Ñå* qå!ÑÑå*úr&å!ÑÍVå*ùr&å!PÑë·íRå!ÑÍNÑëás!e‚å!+)))))))))Ñå* qå!ÑÑå*²q&ëás!e‚å!+)))))))))Ñå* qå!ÑÑå*²ql&ëás!e‚å!+)))))))))Ñå* qå!ÑÑå*�å!ÑÍNå!ÿÑ|¢g}£oëás!e‚å!+)))))))))Ñå* qå!ÑÑå*�å!ÑÍVå!ÿÑ|¢g}£oëás!e‚å!+)))))))))Ñå* qå!ÑÑå*�å! ÑÍVëás!e‚å!+)))))))))Ñå* qå!ÑÑå!ëás*wÖ&å*žqå*¢qå!å!e‚å!+)))))))))ÑåÍ´#ÖBÍMDirectory voll. Weiter mit Íÿ ! så*qÖå*7‚ÑÑå!ëás!}2D‚ÍËÍ ! e.åÍÿ ÖBÉÃDýáá"lqýå*lq^#Vë"`q*F‚&ËEÊÃB!ÿë*lqs#rÃ]C*lq^#Vë#ë*lqs#r*lq^#Vëåͧ&å*lq^#Vëå!cÑÍÌÑ}³oËEÊÃB*lq^#Vëå!cÑÍÌËEÊ]C! så*qÖå*7‚ÑÑå!ëásÍMDiskette voll ! weiter mit Íÿ ÍËÍ !}2D‚!ÿë*lqs#r*`qå!ÑÍõå!ÑÍV"9‚!eÒå*9‚å!ÑÑn&å!ÑÍNå!eÒå*9‚Ñn&Ñ"bq*`qÍ‹ËEÊÊC*bqå*lq^#Vëå!ÑÍNÑ|²g}³o"bqÃßC*bqå*lq^#VëÑ|²g}³o"bq!eÒå*9‚Ñå*bqå!ÿÑ|¢g}£oëás!eÒå*9‚å!ÑÑå*bqå!ÑÍVëásÉ!"rq*�åÍ‘#*rqå*�Ñ͸ËEÊ E* �å!pqå!nqåÍ&*wÖ&å*pqå*nqå!å!e‚å*rq+)))))))))ÑåÍ´#*rq#"rq*rqå*�Ñ͸ËEÊÞD*nq#"nq*pqå*nqå!ÑÍÑ"pq*nqå!ÑÍE"nq*wÖ&å*pqå*nqå!å!e‚å*rq+)))))))))ÑåÍ´#*rq#"rq*rqå*�ÑÍÌå*�&Ñ}£oËEÊÿD!}2F‚! �åÍšBÃ&DÉýáP!qÍâýå!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›! Í"Í !å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›! Í"Í !qÍ:Íÿ É*B‚&å!:e.åÍ¢ Í=*qÖå*7‚ÑåÍü'Í=!V‚Íâ!"mÖ!V‚Í:Í£å!Ñë·íRå*mÖÑÍÌËEÊ!F!V‚å*mÖÑn&å! ÑÍËEÊF!V‚å*mÖå! å*mÖÑë·íRÍóÃF*mÖ#"mÖÃÅE!‚å!V‚Í:Íp!‚ÍpÍ !‚Í]"�*�å!ÑÍå!ÑåÍ6'ÑÍÌËEÊÅFÍM7Zu wenig Platz auf der MS-DOS Diskette. weiter mit Íÿ ÍËÍ ! e.åÍÿ ! så*qÖå*7‚ÑÑå!ëásùH!"mÖ*mÖ#"mÖ*mÖåͧ&å*mÖå!cÑÍ¥Ñ}³oËEÊËF*mÖ"kÖ*mÖåÍó9*kÖ" �!}2F‚!}2�!‚Í]"�!"ýp*ýpå*�å!ÍÙáÍÍÿ ÅÕå!(ÍÙáÑÁÍÿ Íý ÙáÍÍÂå*D‚&}îoÑ}£oËEÊBH!å!(ÑÍõå*ýp#ÑÍõå*�Ñë·íR"iÖ*iÖå!Ñ͸ËEÊ£G!å!(ÑÍõ"iÖÃÁG!å!(ÑÍõå*iÖÑë·íR"iÖ!}2�!‚ÍpÍ !‚å!å!(ÑÍõå*ýpÑÍõÍoÍ !‚å!e‚å*iÖ;Í *iÖå!ÑÍEå!ÑÍËEÊ!H*iÖå!ÑÍ"�Ã5H*iÖå!ÑÍå!Ñ"�Í—B*ýp#"ýpÃG!åÍ‘#*wÖ&å!å!å!å!eÒåÍ´#*wÖ&å!å!å!å!eÒå!ÑåÍ´#*wÖ&å!å!å!å!eÒåÍ´#*wÖ&å!å!å!å!eÒå!ÑåÍ´#É!å!ÿÑÍfz³ÊçHÕ"mÖ! så*mÖÑå!ëás*mÖ#ÑÃÅHÍ>!}2D‚Íb(! e.åÍÿ ͪ"*sÖå!AÑ}2B‚*oÖ"?‚Í)Í¥%*1‚&ËEÊåIÍMkeine DOS Diskette !ÍM3 Neue Disk, Disk Initialisieren oder Ende (N/I/E) ?Í=Íÿ !ºÍ©!C‚ÍDÍ *C‚&Íä}2C‚*C‚&åÍ�!EÍ‘!IÍ‘!NÍ‘ÍOËEÊyI! e.åÍÿ *C‚&E·íRÂÕIÃÔ ÃåII·íRÂåIÍ|4ÃåI*1‚&}îoËEÊIÍQ1!"qÖ!"7‚Í“)!å͹+!å!ÍÛ!ºÍ©!C‚ÍDÍ *C‚&Íä}2C‚*C‚&T·íR™J! så*qÖå*7‚ÑÑå!ëás!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›!#Í"Í !å͹+Ã¥PU·íRÂýJ! så*qÖå*7‚ÑÑå!ëás!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›!:Í"Í !å͹+Ã¥P ·íRÊK·íRÂK!å͹+Ã¥P ·íRÊ/K ·íRÂ9K!å͹+Ã¥P ·íRÊMK·íRÂWK!ÿÿå͹+Ã¥P ·íRÊkK·íRÂuK!å͹+Ã¥P·íRʉK·íR“K!òÿå͹+Ã¥PC·íRÂÓKÍMCopying *qÖå*7‚ÑåÍü'Í=Í EÍ”E! e.åÍÿ !å͹+Ã¥PG·íRÂìL!}2D‚ÍMGroup-Copy to MS-DOS DiskÍ E!dåÍ7!!"qÖ!"7‚Í“)*D‚&}îoå*qÖå*=‚Ñ͸Ñ}£oËEÊÉL! så*qÖÑn&ËEÊ¿L! så*qÖÑå!ëás*qÖå!FÑ͸ËEÊ£L!å*qÖå!ÑÍå!ÑÍNÑå!å*qÖå!ÑÍEÑÍÛÍ›!:Í"Í ÍMCopying *qÖåÍü'Í=Íÿ Í”E*qÖ#"qÖÃL!"qÖ!"7‚! e.åÍÿ Í“)!å͹+Ã¥P/·íRÂüLÍ¡-Ã¥PN·íRÂÃN!}2D‚Í|&ÍMDirectory von LaufwerkÍÿ !ºÍ©!B‚ÍDÍ *B‚&Íä}2B‚*B‚&åÍ�!Aå!PÍ›ÍOËEÊM*B‚&Í›Í"ͺ: User Í ÆM!}2D‚!"?‚!ºÍ©!A‚ÍDÍ *A‚&åÍ�!0å!9Í›ÍOËEÊØM! å*?‚ÑÍõå*A‚&Ñå!0Ñë·íR"?‚ÃßM!}2D‚*A‚&Í›Í"Í !ºÍ©!A‚ÍDÍ *A‚&åÍ�!0å!9Í›ÍOËEÊ9N! å*?‚ÑÍõå*A‚&Ñå!0Ñë·íR"?‚ÃRN*A‚&å! ÑÍ’ËEÊRN!}2D‚*A‚&Í›Í"Í *?‚å!ÑÍÌËEÊzN!}2D‚ÆN! å*?‚ëÁÍ*D‚&ËEÊšN!A}2B‚àNÍ)ÍQ1Í“)!"qÖ!"7‚!å͹+! e.åÍÿ Ã¥PI·íRÂäN! e.åÍ EÍ|4!å͹+Ã¥PS·íRÂFO! e.åÍ EÍ›Í6'å!Í&ͺ KByte frei auf MS-DOS DisketteÍ !ôåÍ7!! e.åÍÿ !å͹+Ã¥PF·íRÂ}PÍM Dateilaenge :Í E*B‚&å!:e.åÍ¢ Í=*qÖåÍü'Í=!V‚Íâ!"mÖ!V‚Í:Í£å!Ñë·íRå*mÖÑÍÌËEÊëO!V‚å*mÖÑn&å! ÑÍËEÊáO!V‚å*mÖå! å*mÖÑë·íRÍóÃèO*mÖ#"mÖÃ�O!‚å!V‚Í:Íp!‚ÍpÍ !‚Í]"�*�å!ÑÍEå!ÑÍËEÊ3P*�å!ÑÍ"�ÃGP*�å!ÑÍå!Ñ"�*�Í›å!Í&ͺ KByte Í !LåÍ7!! e.åÍÿ !å͹+Ã¥PR·íRÂ¥P!‚åÍM MSREAD.CHNÍp!‚ÍëÍ *C‚&å!XÑÍËEÊ J!å!ÍÛ! å*oÖëÁÍÃÔ Í&ͺ KByte Í Ãâ Í«Copyrig·åíRëáØíB Ð*ÆÉc¡BÚuí°"ÉVideo 88 Grafik-TermZC0X=;00H [2JE1LR1MTK(7m)0m~·7È#õå~Íèáñ=ÈóÍ ÉoåͦÉþ€ÜkÔ„æîå!îå!è"áãõÅÕ~#·(åÍèáôÑÁñãÉ}´È:$‡‡‡ããããÅÒÁ= ô+èÍÐØ*ÎßõÅÕå!¨Í5!¢ÍÐ*ºÔáÑÁñÉõÅÕå!´éõÅÕå!®àõ:à·(ÅÕå¯2à!ÈÍ5áÑÁñÉõ:àþÿ(öÅÕå>ÿ2à!ÂãõÅÕå!¼ÚõÅÕååð!‹í°Ñ:žO:œ‚ÕÍÜÑ:ŸO:�ƒÍÜ!ðÍÐ* ÍáÑÁñÉ!ð ë!›45(É! +/ –0ü†õyþ0(ñíÉ d!kÃ5!{Ã5Í_æÍ_o&Éô  áÁå:Ý·(ÕÅÍ |µ(Íáþ ÍáþÊÔ ÁÑ*é"Òx2Ýy·( >Ã28!û"9!¥ í°!½¸ í°¯og2Ð"Ô"Ö>~2Ñ2àÉÃà Ã9Ã/Ã4Ã*Ã9à Á‚CÄÅÁÅÕåÝåýåõo&åͦñýáÝááÑÁÉÅÕåÝåýåÍ£}ëÿ í[Òþ (ú!eÍ{ͦþA8þQ0Gþ: xÖ@¯!\w# (Í‚ þ?(þ*( þ.( ÍwÍ^þ. Í^!h6#ûÉ (þ?( þ*( Í‚( w#éÉ>?> w#üÉͦþ 8 åÅ!˜í±ÁáÉ¿É .,;:=?*[]<>{}þaØþ~ÐÖ É|Í´}õͽñæÆ�'Î@'Ãɯ7Ë|À|·}È>ÿÉ2ØÅͯÁ*·íBÚ¨ ëÑùü "Ưog"Î2Ü>Ã2Ù!Þ "Úë"Ìéå"*Æ·íB"Æí[Ä·íRëáÃ0*Æí°"ÆÙÉ^#V#Õ^#V#N#FáÉÝáëO/o&ÿ9ùëí°ÝéÑO/o&ÿ9ùëí°éÝáë!àÿ9ùëÅ(¯üí°Á> �‘(G¯üÝéÝá!àÿ9ù ¯w#üÝéÝáEͺ¶wÝéÝáÑ}“8÷�Ã' ·íR·íB0 É>‘Ã' ·íRëêqðøÉÕë·íRëáë·íR!È+ÉÍß õͰ ð·íR!À+ÉÍß õͰ ðÍr!Ð+ÉÍß õͰ ðÍr!ÈØ+ÉÍß ôͰ ïÍr!ÈØ#ÉÍß ôͰ ïÍr!Ø+ÉÍß õͰ ðT]KBë!z·> S>)ë)ë0 = öÉ|µÊ |ªõÍ€ëÍ€ëDM¯go>íjíB0 7?ËË= ðëñðHåÍ’Ë<ËÑëÍëËzÈ5ÍaÈ)ýÉÍaÈË<ËúÉëz· {þ0G·É¯goÉë|ª|ú~ºÀ}»ÉÉË|È|/g}/o#É}æo&ÉíKÊí[ÈÅÕxAJSËËËËáëáíJDM!éb"Èë!6íJ"ÊDMÉ'ÍâèÍâdÍâ Íâ} ¯<íR0û= ÈÆ0ÝwÝ#ÉÝ~Ö$O! Ý#Ý~ͦÖ08)þ 8 !Öþ 8þ0T])Ø)Ø T]Ø)Ø_ØËy·È|‡ÉÝááå}&#9N�8wë!DíB9ùëåí°ëá+Oí¸ë#ùÝé>Ã) ÝáÍÈWáÍÝ _áå}“8(º8J`9{‚T]=o`9yí¸ë ¯Ã) Í Ð>Ã' Í� õͬÍ— íÙ}·Ù>Ê' Íõ ßÙËxÙˆ Ù}·ÙÈÙÅÕåÙ}· Ù˸TÅËø¯ÙËø}Ù•(0íD=ÙÍz ,= ù(Ùñæ€ Í’ 0%Í{ ·, 7 ÍÆ ?õ(8Ùͬ Ëx ͆ - öÍr ñ8˸·ÙáÑÁÙÉÙËxÙ Í� Í Ø,-Èxî€GÉÙ}·ÙÊr }·ÈÙ…ÙÍM ÅÕåÝ9Ír Ù.Ù>Ý#ÝnË0Í’ Í{ = ñÙ-Ù åÝnûËx ͇ ,-(-ñññ·ñÙÁáÙÝá˸°G,-Ìr É}·ÈÙ•Ù?ÍM åååÝ9Ù.Ù>ÍÆ 8ͬ ?Ë= ÝuÝ+Ù-Ù(>͆ 0ßͬ ·á͆ 8ÍÆ ?áÑÁËx ͇ š, —7•8Æ€8Æ€8oÝãÙåÅxËøÙ¨æ€õËøÝåÝ!ÉáØ¯oGOW_gÉ·ËËËËËÉ·ËËËËËÉ|Ù„Ùg{Ù‹Ù_zÙŠÙWyÙ‰ÙOxÙˆÙGÉ|Ù”Ùg{Ù›Ù_zÙšÙWyÙ™ÙOxÙ˜ÙGÉxÙ¸ÙÀyÙ¹ÙÀzÙºÙÀ{Ù»ÙÀ|Ù¼ÙÉÙxÙ¨òé xÉËx(Íó È?É}Ù½ÙÀ·ÈÃÆ }Ö�Úr <þ(ÐÙÅÕåÍr 7Í{ = ùÙ|Ù¤Ùg{Ù£Ù_zÙ¢ÙWyÙ¡ÙOxÙ ÙGÃ{ ÙÅÕåÙͬÙÍý ÙÍ� ë}·ÈËx>Â' ͬ}Æ€Ë/Æ€oÖõÙÅÕåÍõ Í -ÅÕåÍ� }áÑÁÙáÑÁã¼ã0ãñÙÉÙÍŽ-Í� ÙÍŽ,Ù}þlØÅ˸Íß Á8 Íõ Í4 Í— Ëx(Í Ù-ÙÍß õ8Í� Ù-ÙÍß 8Ù,Í� }þl8;Ùª*ªª!ªÍ— ÝåÝ! >Í4ÝáͬÍ— Í— ÅÕåÙͬ--Ù-Í ÙáÑÁÙÍ� ,,ñ,-ÈØxî€GÉgª?+2×n¶*ï8t Ð Ðzˆˆˆˆ~«ªªªª,->Ê' ËxÂ' Ù͘Ù}.�•õÍõ Ù͆ÙÍ� ÅÕåÙ,Í ÙáÑÁÍõ ÝåÝ!Œ >Í4Ýá,ÙÍ¢-ÙÍ ñÅÕåo&0%ÍÙ,Í— ÙáÑÁÍ }þgÚr É}Š�؉}颋.:}Žã8Žc~I’$I~ÍÌÌÌL«ªªª*ÙÍ¢Ù·Ëxõ˸Íõ }þˆ0GÅÕå,ÍÐåË<Ë}áõÍ,-(-ÙñáÑÁõÍ� ÝåÝ!>ÍIÝáñ0 õÙ͘ÙÍ— ñ…o8 ñÈÙ͆Ãõ á>Ã' m.`1pF,þåt6|‰„!wS<ÿÃ.zÒ}[•|%¸FXc~üïýu€Ò÷r1}·ÈÝåÙ͆Ù¯Ëx(<˸õÍß 8ÙÍõ ñËÿõÙÏŽé!~JÙÍß 0Í.OÝ!Î>ÙÝÍsÙÍß 8 = ìÙ ÝÙÙÍnËøÍ ÅÕåÍsÍ— Ù͆Í ÙáÑÁÍõ ÝåÍ.ÝáÙÍnÍ ñ0 õÙÍŽ-Í� ñÝáËOÈËøÉçÏÌTöô¢0 jÁ‘ €µžŠoD€‚,:Í€jÁ‘ �€!¢ÚI}袋.º}Žã8Žc~I’$I’~ÍÌÌÌL«ªªªªÝ! >ÅÕåõͬÍ— ñÍIÙáÑÁ× õÙÍnõÙÅÕåÍnÍ ÙáÑÁÙÍ— ñ= éÙ͆à ÝÝnÝfÝ^ÝVÝNÝFÉ!�DLT\ÉI¢Ú!‚!É53ó!�úÉr1÷!€ÒÉÅÕåÙáÑÁÉÍ’!€> Ëx Ë#ËËË-= ðo˸ÉËxÙ͆(Ëø-Í ·Ë}(ËxËø>�½8(Íz ,óÍz `iÈÃ!É>’Ã' |µÊr Ë|Í€>�)=Ë|(úDMboÀ˸ÉÍÈë8þ8ÍÈÙËxÙ(’0¯þ 8> ÕÍ€ÑËx(>-ÍåË{(aËy(ÍãÍÙ ò�z·(>.Íå (Íã ÷ú±ÍÙ÷Ë{È>EÍå>+Ë|(|íDg>-Íå|/Ö 0ûÆ:ÝpÝ# ý~ý#· ý+>0ÝwÝ#Éýå,-  ý60ý#ø¯Ã}Å˸}ÙÖ€oŸgMÍõ|þÙ <ýwíDÍ@}þ�0ͳý5Ëø>„•.(Íz Ë= øý~õ> xæÆ0ýwý#xæGÅÕåË%͇ Ë%͇ ëãÑãíZëáãíJDMáË%͇ = ÈñÁýáÉýåá_~6þ5Øúœ+~¨¥Ôh¶¿ÉìÅëx-ÐÍÎÂSÞùx9?ë+¨­ÅøÉ{Η@}·ÈËøÅÕ|Íz Íz „gãíZëáãíJDMá0Í{ ,7È}Æo˸ÉÍ?¾ #øyîO!@9ùi&ÝéÍ? ë¶¾ â#÷ÚÍ?¶w#ùëùÝéÍ?/¦w#øïÍ?¦w#ùãýáÝá!9ë! E9ýéÝá!!9~·(¯+Fͺ¦!"9ù!(#Ýé>¯2èýá*ÒÍâ¯á"âýå|· >"2ÐÉ:è·( Ͷ *âwÉÍò*â6 ë!\$í°É!æÅåí[Òþ (úͦ–( áÁã·É#ëÁÁþ:À~ÉCONÁTRMÁKBD‚LSTCAUXÄUSRÅ>¯2èÍi:зÀ*âË®~æÀÍ0:зÀ*â:è·€€(@q##pÉÍZ*â ë:è·( ÕÍÑñÅÍÁ<Àx2ÐÉ*â6#ûÉ"â~æÀËv( >ÍÆÍ Ë~È*âå ëÍá< >ÿ2Ð6Éã"äãå!Â"âáÉã"äã"âË~À>2ÐÉã"äã"âËvÀ>2ÐÉ>¯ã"äãå!Â"âË®õÍèñ·(ÍááÉ!Ñ~þ8>~O6~*Ò"ÔÍáwþ(6þ(2þ(-þ()þ(6þ (8þ 0þ Ù:Ý·(ÓÝ*äà yº(È~#ÍÉÀúý+Í (±ï(« 6Íá6 #6 #"ÖÉ*â:з y~Ëo pæ .##~·ò—åͺá(å.6á¯w4Æ._~þ =*â##55= *Ôí[Ö·íR8ÿÍê*Ô~#"Ô= Í£}== ͯ}͵}*âËî#w+É#~+É>Éå*â~æþ('Íkþ!0þ(Ë®ñ]ÅÕÍkÑÁþ!8Ë®ï¯áÉÝ!]Ý~·Èþ-ÀÝ#É8Ý~·È>2Ð7ÉåÍkË®áwÉ>¯OÅÍðÁÍ$ÈÅåÍ÷ÑÁÍ6Ø̃ës #rëÉÍðÍ$ÈÅåÍ£ÙáÁÍ6ØÙÌ� ÙÃÑåëÅÕÍkÑÁþ ( þ(Ë® êáqÉÍkþ(Ë®þ ( þ ïÍkþ Ë®É*âO:зÀ~æ ##å~Æ._qá4ð(þ(áÅå=ʦ==Ê©=ʬò*è:ê¾È4^qÉ*â##~·È6ͺÈ>ð2ÐÉ}ÃÆÁÑÅÝ*ÒË|(̓ëëË|( ̓Ý6-Ý#ÕÍÆáÍÈí[ÒÝåá·íRMë‘8( Gå> ÅÍÆÁ÷áAÈ~ÅåÍÆáÁ#óÁÑÙáÑÁÙÅÝ*ÒÕÍ'¾ÁÑÅÍÈËC!¡ ¿!¥¸TRUEFALSEÍÈ!9N#ÍYÑùÕÉá~#·( G~ÅåÍÆáÁ#õé> ÍÆ> ÃÆ   "âË~(ÕÍkÑ»(þ( þ!0 (Ë®è!É!É>¯2èíSæÍz:зÀÍ0:зÀ*â6Ð##ww#w$w#wÖÿ:è· å¯Í á##N#F*æ·íBÈ>�2ÐÉå¯w#w#í[æs#rá>à "â~æÀÈÍ®*â-¯w#wÔÿw##>Í Í®Ã�ã"äã"â~æÀÀ>2ÐÉ:зÀåÍZë·íRá0¯Í *â4À#4É>™2ÐÉ:зÀåÍZ·íR> *â4 #4(>áÍ Èá>ò2ÐÉ2éë*âËf(/˦:éËG(##~++· :éËO x· y·úCÅÕ!ͺÑÁ Q*â:éËG(Ëî##~Æ.Õ_ÑÖ.Íší âf<ò\=<Íš*â##æw ÅÕåÍ®áÑÁ Õ+Ñ4 #4x±Â ëÉ>™>ð2ÐÉõ:éËG(ëñÉ"âÍ®Èæ"*âËæËnÈË®*âåÅ0ëÍÁá ëÍ·ÉÁÑíSâÅåÍZÑ·íR8@*â N#F#s#rÍ, 0}æ)ëíjëS\*â##w+ N#Fë·íB ÈÕåÍ®Ñár+sÉ>‘2ÐÉÕÙáÙ!T]>)ëíjëÙ)Ù0 0= ïÉÍ]·íR!À#ÉÍ]ëÉ*â^#V#ÕN#F#^#VáÉ>¯2èͰ:зÀÍ0:зÀ*â6Àå ë#Íá-¯Nw#FwÖÿq#p#6€#w#w#wÉ"â~æÀÈÃ�>">!DM!ð"æÝáÑáÝåÅÍýÁ:зÀ*ðíBÈ:éþ!>™(>ð2ÐÉ>">!"æÝáÁÑáÝå2é"â~æÀʰ*æ¯w#wx±(9ÅÕÍ*â ë:éOÍÑÁ· Õ*â-4 #4Ñ!€ë*æ4 #4 Ã*â-N#FÚÿq#püÿV+^ë·íBÐëq#pÉÁÑíSâÅåÍZÑ·íRÚ&*â s#r$ s#rÉÍLÀ ëÍ<À?ýá*ÒÍâ¯áýåÍLÀåÍòáåë!\ í°á åëÍÑ<( !\$í°É>2ÐÉ>¯2èÍLÀ:Ø·>!(ë*â \$í°\Í<(Ï!3°í°:è· í[1ðÕÍ\ÍÑ!€ë·(é7"â~æÈ> 2ÐÉ"æíSèëá"âNs#Frë·íB(Zë#\:Ü í°¯üå\ÍÑ<(?*æ"}íKèÅÕÍ\!ÍÑÁ· !*}#"}!€ë x± Û\Í*â éÝ*â>ðÃ) ÍÈþÐ2ÜÉ"ðëáã"ò{æü_!Þ"øÝ*ÞÝnÝf}´(HíR0ÝnÝfåÝ"øÝáã Ý^ÝVÝåMDÝnÝfÝåÝÝuÝtÝqÝpÝåÑ*øs#rÑ*òs#rÉÝåá"Ä*ð ÝåÁ ÚuíKÆíB!Ú0>ÿÃ' ëáã~#fo{æü_ë"ð*ÞåÝá·íR0RÝnÝfå·íR0ÝáðáÕýáíKðýqýpýuýtÝsÝrÝåáÝNÝFÍ( Ý^ÝVÕÝáÝåáÝNÝFÝ^ÝV*ÞíSÞÕÝáÝuÝtíKðÝqÝpë ·íRÀÕýá*Ä·íR(ý~Ýwý~Ýwýnýf ÝuÝt¯ÉÝåá"Ä6#ûÉÍK*ôÉÍK*öÉ!"ô"öÝ*ÞÝNÝFy°(*ô "ô*ö·íB0íCöÝnÝfåÝáØ*Æûÿ í[Ä·íRØë*ô"ô*ö·íRÐíSöÉí[Äs#rÉ^#Vë"Ä"Þ6#ûÉ>¯O"è¯w2Ðx2ê*â"í!F"âá"äá Í&Íy*í"â*äé>¯2ì"è*â"í!F"âá"äá"ê!\Íâ¯*ê:ì· ÍNÍr!Ð~6·go(Ýåá\íRë*ès#r£Æí_2ËÉëÝáÁáx±( s x±(T]í°ÝéDMÝáÑáx±(ôíR0í ë ëí¸ÝéU(Í�ÝáO/o&ÿ9ùq#ë (í°Ýé!€>F¸0#( ~þ (þ #ï]( ~þ (þ (#ï}“(  Õi&TÉÑÁÕ-a%â}ͦoÉ*é!Ð~6o&ÉÍ|µÈ:Ýõ¯2ÝÍ ñ2Ý}þÀÝá:зÈÝá_Ýá_ÕÍzѯ2Ý*Î|µÝåáíKÌíB "η ÕÕåÍÙÑz· Í^C User break+= Í I/OÍ Run-timeÍ error {Í´Í, PC=*ÎͯÍNot enough memoryÍ Program aborted :Ø·ÊŽ'ÃáÑÑé1!€ÖÿÍd!ˆ+ï€×>ÍÔÃv'ýáP!°�Íâýå!å!ÍÛ͙͛! Í"!°�Í:!ͪ! Í"Í Éýáá"¦�ýå*¦�"œ�! Í*œ�+"œ�Í å*œ�å!ÑÍÑ}³oËEÊE!Éýáá"��á"’�á"”�á"–�á"˜�ýå!€�"ˆ�*˜�ë*ˆ�s*ˆ�å*–�ëás*ˆ�å*”�ëás#r*ˆ�å*’�ëás#r*ˆ�å*��ëás#r!"~�*˜�·íRÊ;"·íRÊ;"·íRÊ;" ·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÊ;"·íRÂP"!2å!€�ëÁÍo&"~�à" ·íRÊ‚"·íRÊ‚"·íRÊ‚"·íRÊ‚"·íR”"!2å!€�ëÁÍ"~�à"!2å!€�ëÁÍ*~�"š�*š�É! åÁÍ"gÖ*gÖå!0ÑÍàËEÊö"ÍM'Ohne CP/M-Plus geht da leider nichts ! Íÿ ÃÔ !åÁÍo&"sÖ*sÖå!AÑ}2B‚!å*wÖ&ëÁÍo&"gÖ*gÖå!ÑÍ’ËEÊb#ÍM#MS-DOS-Laufwerk existiert nicht !? Íÿ ÃÔ !å*sÖëÁÍ! å!ÿëÁÍo&"oÖÍMROOT!G‚ÍâÉýáá"t�ýå!å!å*t�å!å!åÍk!"mÖÉýáá"c�á}2e�á"f�á"h�á"j�ýå*h�Í€å!'ÑÍÌËEÊb$Í›ͺ ^M auf Spur *h�å!Í&ͺ kann nicht zugegriffen werden. ͺ0Fehler beim Umsetzen Cluster in Spur und Sektor Í !ôåÍ7!ä%! å!å*j�å!å!åÍk!"eÖ!å!å*f�å*eÖ^#Vëå!åÍk!"uÖ! å!å*h�å!å!åÍk!"mÖ! å!å*uÖå!å!åÍk!"mÖ! å!å*c�å!å!åÍk!"mÖ!å!å!å!å!åÍk!"mÖ*e�&ËEÊ)%!å!å!å!å!åÍk!"mÖÃC%! å!å!å!å!åÍk!"mÖ*mÖå!ÑÍ’ËEÊ%ÍM%Fehler bei DiskIO auf MS-DOS DisketteÍÿ ! å!å*B‚&å!AÑë·íRå!å!åÍk!"gÖÉ!}21‚*wÖ&å!å!å!å!eÒåÍ´#*wÖ&å!å!å!å!eÒå!ÑåÍ´#!eÒå!Ñn&å!ÿÑÍ’å!eÒå!Ñn&å!ÿÑÍ’Ñ}£oËEÊ&!}21‚Éýáá"M�á"O�á"Q�ýå*Q�å!Ñë·íR"Q�*Q�å!ÑÍõ"Q�*Q�å! Ñ"Q�*Q�å!ÑÍë*O�s#r*Q�å!ÑÍEë*M�s#rÉ!å!ÑÍfz³Ê¦&Õ"mÖ!å*mÖÍÛÍ™*mÖ#ÑÇ&Éýáá"9�ýå*9�å!ÑÍõå!ÑÍ"/�!eÒå*/�Ñn&å!å!eÒå*/�å!ÑÑn&ÑÍõÑ"-�*9�Í‹ËEÊ'*-�å!ÑÍVå!ÑÍ}2;�Ã0'*-�å!ÿÑ|¢g}£oå!ÑÍ}2;�*;�&É!"�!å!cÑÍfz³Êl'Õ"!�*!�åͧ&ËEÊc'*�#"�*!�#ÑÃG'*�"+�*+�É!}2wÖ!ËEÊ…+Í>!å!ÍÛÍ›ͺ3MS-DOS Disketten unter CPM-plus lesen und schreibenÍ !å!ÍÛÍ›ͺ3===================================================Í ! å! ÍÛÍ›ͺMS-DOS Diskette in Laufwerk *wÖ&å!AÑÍ"ͺ : einlegen.Í !å! ÍÛÍ›ͺ#Disk-Parameter-Block fuer Laufwerk *wÖ&å!AÑÍ"ͺ: muss Í Í›ͺkorrekt gesetzt sein.Í !å! ÍÛÍ›ͺ1Seitenumschaltung erfolgt ueber Sektorueberlauf !Í ! å!ÍÛÍ›ͺLesen MS-Disk Í ! å!ÍÛÍ›ͺSchreiben MS-Disk Í ! å!ÍÛÍ›ͺDOS-Laufwerk wechseln Í ! å!ÍÛÍ›ͺ#Exit --->Í !ºÍ©!A‚ÍDÍ *A‚&Íä}2A‚*A‚&å!RÑÍå*A‚&å!WÑÍÑ}³oå*A‚&å!XÑÍÑ}³oå*A‚&å!CÑÍÑ}³oËEÊÞ)*A‚&R·íRÂp*!ï€åÍM MSREAD.CHNÍp!ï€ÍëÍ Â+W·íRœ*!ï€åÍM MSWRITE.CHNÍp!ï€ÍëÍ Â+C·íRÂu+!å!ÍÛÍ›ͺEnter new DOS-Drive : Í !A‚ÍËÍDÍ *A‚&Íä}2A‚*A‚&å!AÑë·íR}2wÖ!åÁÍo&"sÖ*sÖå!AÑ}2B‚!å*wÖ&ëÁÍo&"gÖ!å*sÖëÁÍ*gÖå!ÑÍ’ËEÊr+ÍM#MS-DOS-Laufwerk existiert nicht !? Íÿ ÃÔ Ã‚+X·íR‚+ÃÔ Ã}'ÃÔ *sÖå!AÑ}2B‚!å*wÖ&ëÁÍo&"gÖ!å*sÖëÁÍ*gÖå!ÑÍ’ËEÊ’ÍM#MS-DOS-Laufwerk existiert nicht !? Íÿ ÃÔ Ã¤*X·íRÂXÃ