// (C) Copyright 1979 Tripos Research Group // University of Cambridge // Computer Laboratory // Disc copy program for floppy discs on the 8086 // By default, copies the whole disc. // Keywords "boot" and "filestore" can be used to cause // copying of just the bootstrap or filestore areas SECTION "DiscCopy" GET "LIBHDR" GET "IOHDR" MANIFEST $( dkdev = -2 dcb.wordcount = 13 cylsize = 256*13 lwb.filestore.cyl = 15 upb.filestore.cyl = 76 $) LET start() BE $( LET v = VEC 50 LET rc = 0 LET dstr = "DK0:,DK1:" LET fromdrive, todrive = 0, 0 LET cylbuf = 0 if rdargs("from/a,to/a/k,boot/s,filestore/s", v, 50)=0 DO error("bad args*N") // Default is whole disc UNLESS v!2 | v!3 DO v!2, v!3 := TRUE, TRUE fromdrive := findarg(dstr, v!0) IF fromdrive=-1 DO error("unrecognised device %S*N", v!0) todrive := findarg(dstr, v!1) IF todrive=-1 DO error("unrecognised device %S*N", v!1) cylbuf := getvec(cylsize-1) IF cylbuf=0 DO error("can*'t get buffer space*N") $( LET lwbcyl = v!2 -> 0, lwb.filestore.cyl LET upbcyl = v!3 -> upb.filestore.cyl, lwb.filestore.cyl-1 FOR cyl = lwbcyl TO upbcyl DO $( LET n = 1 UNTIL sendpkt(-1, dkdev, act.read, 0, 0, cylbuf, cylsize, fromdrive, cyl, 0, 0)=0 DO $( n := n+1 IF n>=10 DO $( writef("Read from cylinder %N failed*N", cyl) rc := 10 GOTO L $) $) IF n>1 DO $( writef("Read from cylinder %N took %N tries*N", cyl, n) IF rc<5 DO rc := 5 $) IF testflags(1) DO $( rc := 10 GOTO L $) n := 1 UNTIL sendpkt(-1, dkdev, act.write, 0, 0, cylbuf, cylsize, todrive, cyl, 0, 0)=0 DO $( n := n+1 IF n>=10 DO $( writef("Write to cylinder %N failed*N", cyl) rc := 10 GOTO L $) $) IF n>1 DO $( writef("Write to cylinder %N took %N tries*N", cyl, n) IF rc<5 DO rc := 5 $) $) L: $) freevec(cylbuf) stop(rc) $) AND error(f, a) BE $( writes("DISCCOPY: ") writef(f, a) stop(20) $)