@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H          SYS511
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YSYS511
~S1~M~OSYS IMPLEMENTATION DESCRIPTION
~S1~M~OSection 51 Version 1
~S1~OSection 51.1 Disc Copy Utilities
~S1~O1. General Description
~S1~O1.1 Local Mode Commands
~S1~O1.1.1 Local Mode Commands Specifications
~S1~O1.1.2 The LOAD Sequence
~S1~O1.1.3 Store Usage
~S1~O1.1.4 Interrupt Vectoring
~S1~O1.1.5 Device Initialisation
~S1~O1.1.6 Monitor Start-Up
~S1~O1.2 Services Available
~S1~O1.2.1 Remote Mode - The TRANSMIT Sequence
~S1~O1.2.2 DISC Layout
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H               SYS511
~V9 -1
~F
@TITLE SYS51(1,10)
@COL 1S-2R-4R-5R-6F
@FLOW 1-2-4-5-6
@BOX 1.0
SERVICE ROUTINE 3
   (COPY DISC)
@BOX 4.0
PROCEDURES IN MODULE:
   1 COPY DISC
@BOX 6.0
END
@BOX 1.1
#SYS51.1/1
MODULE (COPY.DISC);
@BOX 4.1
*GLOBAL 7;
LOGICAL8 [%4000] BUFFER;
*CODE 6;
PSPEC COPY.DISC (INTEGER, INTEGER, INTEGER);
   #SYS51.1
@BOX 6.1
*END
@END

@TITLE SYS51.1(1,10)
@COL 1S-4N-5R-6T-2R-3T-7R-8N-9T-10R-11N-12R-13T-14T
@COL 16T-20F
@COL 19N-18R-17R
@ROW 8-19
@ROW 9-16-18
@ROW 10-17
@ROW 13-20
@FLOW 1-4-5-6VALID-2-3VALID DIR-7-8-9READY-10-11-12-13MORE-14MORE-11
@FLOW 3INVALID OPTION-2
@FLOW 6NOT VALID-4
@FLOW 9NOT READY-16SKIP FLOPPY-17-19-8
@FLOW 16REPEAT-18-19
@FLOW 13DONE-20
@FLOW 14FLOPPY FULL-17
@BOX 1.0
COPY DISC UTILITY
@BOX 2.0
PRINT DIRECTION MENU
@BOX 3.0
VELID DIRECTION?
@BOX 5.0
PRINT COPY OPTION MENU
@BOX 6.0
VALID OPTION SELECTED
@BOX 7.0
SET UP INITIAL CONSTANTS
@BOX 9.0
ASK FOR NEXT FLOPPY
@BOX 10.0
SET UP INITIAL CONSTANTS
FOR NEXT FLOPPY
@BOX 12.0
READ NEXT BLOCK
WRITE NEXT BLOCK
@BOX 13.0
ALL DONE ?
@BOX 14.0
FLOPPY FULL ?
@BOX 16.0
RE-READ (WRITE) FLOPPY ?
@BOX 17.0
ADVANCE TO NEXT FLOPPY
@BOX 18.0
RESET FLOPPY INDEX
@BOX 20.0
PRINT 'COMPLETED'
  END
@BOX 1.1
PROC COPY.DISC (D1, D2, D3);

XLINE:;

#SYS51.1/2
#SYS51.1/3
@BOX 2.1
PRINTAP^ (^DIR.MENU);
@BOX 3.1
IF GET.CONSAP^ () - "0" =>  DIR < 1 OR DIR  > DIR.OPTS
@BOX 5.1
PRINTAP^ (^COPY.MENU);
@BOX 6.1
IF GET.CONSAP^ () - "1" => COPY.TYPE < 0 OR COPY.TYPE >= NUM.OPTS
@BOX 7.1
LIMITS [2*>COPY.TYPE+1] => TOTAL.SIZE;
BYTE(^BUFFER) => B.ADDR;
IF DIR = 1 THEN
   W.DRIVE.NO => OUT.DRIVE.NO;
   F.DRIVE.NO => IN.DRIVE.NO;
ELSE
   W.DRIVE.NO => IN.DRIVE.NO;
   F.DRIVE.NO => OUT.DRIVE.NO;
FI;
0 => DISC;
@BOX 9.1
PRINTAP^ (%"$L$LLoad floppy disc ");
PUT.HEX.CONSAP^ (DISC,8);
PRINTAP^ (%". ? (Y=ready, R=repeat)");
IF GET.CONSAP^ ()=>CH /= "Y"
@BOX 10.1
USUAL.TRAN.SIZE=>TRAN.SIZE;
DISC*SMALLER.SIZE+LIMITS[COPY.TYPE]=>START.ADDR;
IF DIR=1
   THEN START.ADDR=>OUT.DISC.POS;
        0=>IN.DISC.POS;
   ELSE START.ADDR=>IN.DISC.POS;
        0=>OUT.DISC.POS;
FI;
TOTAL.SIZE-START.ADDR=>TOTAL.LEFT;
SMALLER.SIZE=>FLOPPY.LEFT;
@BOX 12.1
IF TOTAL.LEFT < TRAN.SIZE THEN TOTAL.LEFT => TRAN.SIZE FI;
IF FLOPPY.LEFT<TRAN.SIZE THEN FLOPPY.LEFT=>TRAN.SIZE; FI;
DISC.TRANAP^ (IN.DISC.POS + 32, B.ADDR, IN.DRIVE.NO, TRAN.SIZE, READ);
DISC.TRANAP^ (OUT.DISC.POS + 32, B.ADDR, OUT.DRIVE.NO, TRAN.SIZE, WRITE);
TRAN.SIZE +> IN.DISC.POS;
TRAN.SIZE +> OUT.DISC.POS;
@BOX 13.1
IF TRAN.SIZE -> TOTAL.LEFT =< 0
@BOX 14.1
IF TRAN.SIZE -> FLOPPY.LEFT = 0
@BOX 16.1
IF CH = "R"
@BOX 17.1
1+>DISC;
@BOX 18.1
IF DISC>0 THEN 1->DISC FI;
@BOX20.1
PRINTAP^ (%"$LCOMPLETED$L");
END
@END
@TITLE SYS51.1/1(1,10)
@COL 1S
@BOX 1.1
PSPEC PRINT (ADDR [LOGICAL8]);
PSPEC PUT.HEX.CONS (LOGICAL32,INTEGER);
PSPEC GET.CONS () /LOGICAL;
PSPEC DISC.TRAN (LOGICAL32, LOGICAL32, LOGICAL, LOGICAL, LOGICAL) / INTEGER;
ADDR PRINT PRINTAP;
ADDR PUT.HEX.CONS PUT.HEX.CONSAP;
ADDR GET.CONS GET.CONSAP;
ADDR DISC.TRAN DISC.TRANAP;
@END
@TITLE SYS51.1/2(1,10)
@COL 1S
@BOX 1.1
LITERAL / ADDR OLAY.ADDR = %81800, HALF.MEG = %80000;
LITERAL / LOGICAL READ = 0, WRITE = 1;
LITERAL / LOGICAL8 LF = %A;

INTEGER CH, IN.DRIVE.NO, OUT.DRIVE.NO;
INTEGER COPY.TYPE, DISC, DIR, TRAN.SIZE, LAST.CH;
INTEGER32 TOTAL.LEFT;
ADDR B.ADDR, IN.DISC.POS, OUT.DISC.POS, START.ADDR, TOTAL.SIZE, FLOPPY.LEFT;

LITERAL USUAL.TRAN.SIZE = 64;

::PTV LITERAL SMALLER.SIZE = 77 * 2 * 26 - 32 :: DD FLOPPY SIZE;
::GEM LITERAL SMALLER.SIZE = 80 * 2 * 18 - 32 :: 5IN FLOPPY SIZE;

LITERAL OS.END = 77 * 2 * 26 - 32 * 2 :: SIZE OF TWO DD FLOPPIES IN SECTORS;
LITERAL / ADDR D.END = 131040 :: SIZE OF WINCHESTER SECTORS;
   :: EXCLUDING 1 MEG AND 32 SECTORS

::PTV LITERAL W.DRIVE.NO = 0, F.DRIVE.NO = 2;
::GEM LITERAL W.DRIVE.NO = 1, F.DRIVE.NO = 2;
@END
@TITLE SYS51.1/3(1,10)
@COL 1S
@BOX 1.1
DATAVEC DIR.MENU (LOGICAL8)
   LF
   LF "Copy direction :-"
   LF "1. To Winchester."
   LF "2. From Winchester."
   LF
END

LITERAL DIR.OPTS = 2;

DATAVEC COPY.MENU (LOGICAL8)
   LF
   LF "Copy option :-"
   LF "1. Copy all disc."
   LF "2. Copy system only."
::PTV    LF "3. Copy files only."
   LF
END
::PTV LITERAL NUM.OPTS = 3;
::GEM LITERAL NUM.OPTS = 2;
DATAVEC LIMITS (ADDR)
   0           D.END
   0           OS.END
::PTV   OS.END       D.END
END
@END

