home *** CD-ROM | disk | FTP | other *** search
- {$R+}
- program CPCREAD;
- { Marco Vieth, 26.9.1992 }
- {Reads CPC-Disks to a File (only Side A) }
- {40 Track, Data-Format}
-
- uses dos; {fuer intr}
-
- const
- MAXHD = 0; {nur Head 0}
-
- type
- regpack = registers; {>=TP4.0}
- {TP3.0:
- record
- ax,bx,cx,dx,bp,si,di,ds,es,flags : integer;
- end;
- }
- medium = RECORD
- drive : byte;
- head : byte;
- track : byte;
- sektor : byte;
- sanz : byte; {Sektoranzahl}
- end;
-
- format = RECORD
- FSC : byte; {First Sector}
- PST : byte; {physik. Sectoren pro Track}
- LTRK : byte; {letzter Track}
- BSEC : integer; {Bytes pro Sector}
- end;
-
- secdat = array[0..$1FF] of byte;
- trkdat = array[0..8] of secdat;
-
- var
- qfor : format;
- qdrv : medium;
- datbu : trkdat;
-
- disk_info : array[0..$ff] of byte; {disk-info-array}
-
- track_info : array[0..$ff] of byte; {track-info-array}
-
-
-
- procedure rsek(was:medium; lw:format; var buffer);
- var retry : integer;
- register:regpack;
- begin
- retry:=0;
- repeat
-
- {
- writeln('command=',was.command);
- writeln('drive =',was.drive);
- writeln('head =',was.head);
- writeln('track =',was.track);
- writeln('sektro =',was.sektor);
- }
-
- with register do begin
- ax:=$0200 + was.sanz; {Anz. Sektoren}
- cx:=(was.track shl 8) + (was.sektor or (lw.FSC-1));
- dx:=(was.head shl 8) + was.drive; {Kopf und Drive}
- es:=seg(buffer); {DMA-Segment}
- bx:=ofs(buffer); {DMA-Offset}
- end;
- intr($13,register);
- if (register.ax and $FF00) <> 0 then begin
- retry:=retry + 1;
- if retry>3 then begin
- writeln('Fehler beim Diskettenzugriff Drive ',chr(was.drive+65));
- halt;
- end;
- end;
- until register.ax and $FF00 = 0;
- end;
-
-
- procedure setformat(var form:format);
- begin
- form.FSC:=$C1; {First-Sector}
- form.PST:=9; {Sectoren pro Track}
- form.LTRK:=39; {last Track}
- form.BSEC:=$200; {Bytes pro Sector}
- end;
-
- procedure initdrv(var drv:medium; laufw:byte);
- begin
- drv.drive:=laufw;
- drv.head:=0;
- drv.track:=0;
- drv.sektor:=0;
- drv.sanz:=1;
- end;
-
-
- procedure create_disk_info;
- const ident:string = 'MV - Z80EMU Disk-File'#13#10'Disk-Info'#13#10;
-
- var i:integer;
-
- begin
- fillchar(disk_info,$100,0);
- for i:=0 to length(ident) do begin
- disk_info[i] := ord(ident[i+1]);
- end;
- i:=i+14;
- disk_info[i] := 40; {# tracks}
- i:=i+1;
- disk_info[i] := 1; {# heads}
- i:=i+1;
- disk_info[i] := 0; {lo-byte track-size}
- i:=i+1;
- disk_info[i] := $13; {hi-byte track-size}
- end;
-
-
- procedure create_track_info(track,head:byte);
- const ident:string = 'Track-Info'#13#10;
- var i,j : integer;
-
- begin
- fillchar(track_info,$100,0);
- for i:=0 to length(ident) do begin
- track_info[i] := ord(ident[i+1]);
- end;
- i:=i+4;
- track_info[i] := track; {track-number}
- i:=i+1;
- track_info[i] := head; {head-number}
- i:=i+1;
- i:=i+2; { 2 bytes not used}
-
- {format-track-parameter}
- track_info[i] := 2; {BPS}
- i:=i+1;
- track_info[i] := 9; {# sectors}
- i:=i+1;
- track_info[i] := $4e; {GAP #3 format}
- i:=i+1;
- track_info[i] := $e5; {fill-byte}
- i:=i+1;
-
- {sector-data}
- for j:=1 to 9 do begin
- {sector-ID}
- track_info[i] := track; {track-number}
- i:=i+1;
- track_info[i] := head; {head-number}
- i:=i+1;
- track_info[i] := j or $c0; {sector}
- i:=i+1;
- track_info[i] := 2; {BPS}
- i:=i+1;
-
- {errors in sector}
- track_info[i] := 0; {state 1 errors}
- i:=i+1;
- track_info[i] := 0; {state 2 errors}
- i:=i+1;
- track_info[i] := 0; {not used}
- i:=i+1;
- track_info[i] := 0; {not used}
- i:=i+1;
- end;
-
- end;
-
-
-
- procedure kopiere(quelle:byte; ziel:string);
- var
- trk,hd,sec:byte;
- cfile : file;
- anzahl,writeanz : word;
-
- begin
- writeln('Kopiere von ',chr(quelle+65),' nach ',ziel);
- writeln;
-
- assign(cfile,ziel);
- rewrite(cfile);
-
- initdrv(qdrv,quelle);
- setformat(qfor);
-
- create_disk_info;
- blockwrite(cfile,disk_info,2,writeanz);
- if (writeanz=2) then writeln('Disk-Info-Block written.');
-
- for trk:=0 to qfor.LTRK do begin
- write('Lade Track ',trk,' ... ');
- qdrv.track:=trk;
- for sec:=1 to qfor.PST do begin
- qdrv.sektor:=sec;
- qdrv.head:=hd;
- rsek(qdrv,qfor,datbu[sec-1]);
- end;
- write(' ok - ');
- write('und ins File ... ');
- create_track_info(trk,0);
- blockwrite(cfile,track_info,2,writeanz);
- if (writeanz=2) then write('data ... ');
-
- anzahl := qfor.PST*4;
- blockwrite(cfile,datbu,anzahl,writeanz);
- if (anzahl = writeanz) then writeln(' ok.');
- end;
- close(cfile);
- end;
-
-
- procedure menue;
- const
- quelle:byte = 0;
- zielfile: string[40] = 'DISK1.CPC';
-
- var ch : char;
- eingabe : string;
-
- begin
- repeat
- writeln;
- writeln('CPCREAD (v1.0) ');
- writeln;
- writeln('Kopiert CPC-Disketten in ein File');
- writeln('(im Moment DATA-Format,40 Track, Seite A)');
- writeln;
- writeln('Quellaufwerk : ',chr(quelle+65),' / Zielfile : ',zielfile);
- writeln;
- writeln('1) Kopieren');
- writeln('2) Quellaufwerk aendern');
- writeln('3) Zielfile aendern');
- writeln('4) Ende');
- writeln;
- writeln('Ihre Wahl : ');
- readln(ch);
- case ch of
- '1' : kopiere(quelle,zielfile);
- '2' :
- begin
- write('Neues Quellaufwerk : ');
- readln(eingabe);
- eingabe[1] := upcase(eingabe[1]);
- if (eingabe[1]>='A') and (eingabe[1]<='E') then quelle := ord(eingabe[1])-65;
- end;
- '3' :
- begin
- write('Neues Zielfile : ');
- readln(eingabe);
- zielfile := eingabe;
- end;
- '4' : ;
- else writeln('Was war das ??');
- end;
- until ch='4';
- end;
-
-
- begin {main}
- menue;
- end.
- {Ende cpcread.pas}
-
-
-