// Version for floppy discs on 8086 TRIPOS
|| (C) Copyright 1979 Tripos Research Group
|| University of Cambridge
|| Computer Laboratory
SECTION "disc"
GET "libhdr"
GET "manhdr"
GLOBAL
$( deviceid : ug+1
physical.unit: ug+2
logical.unit : ug+3
string.to.number : ug+4
$)
GET "STRTONUM"
LET start(discname) = VALOF
$( LET argv = VEC 20
LET seglist = VEC 4
LET file.handler.pri = rootnode!rtn.tasktab!task.filehandler!tcb.pri
LET file.handler.seglist = rootnode!rtn.tasktab!task.filehandler!tcb.seglist
LET initialisation.obj = "SYS:L.FILE-HANDLER-INITIALISATION"
LET handler.obj.prefix = "SYS:L.FILE-HANDLER"
LET handler.obj = VEC 20
LET lv.disc = devicename(discname)
LET res, res2, restart.code, version, n.cache.slots = ?, ?, ?, ?, ?
LET new.file.handler = ?
LET envec =
// floppy disc definition
TABLE
10, || length of table
256, || block size
0, || sector origin
1, || number of surfaces
1, || sectors per block
13, || blocks per track
1, || number of reserved blocks
8, || pre-allocation factor
1, || interleave factor
15, || lower cylinder
76 || upper cylinder
FOR i = 0 TO handler.obj.prefix%0
DO handler.obj%i := handler.obj.prefix%i
deviceid := -2
physical.unit := discname%3-'0'
logical.unit := discname%0=3 -> 0, discname%5-'0'
res := rdargs("READ/S,VERSION/K,CACHESLOTS/K", argv, 20)
IF res=0
RESULTIS error("Bad discnames for mount of *"%S:*"*N", 20, 120, discname)
IF lv.disc=0
RESULTIS error("Device *"%S:*" unknown*N", 20, 0, discname)
UNLESS !lv.disc=0
RESULTIS error("Device *"%S:*" already mounted*N", 20, 0, discname)
restart.code := argv!0\=0
version := argv!1
UNLESS version=0 DO
$( FOR i = 1 TO version%0
DO handler.obj%[handler.obj.prefix%0+i] := version%i
handler.obj%0 := handler.obj.prefix%0 + version%0
|| construct version name
$)
TEST argv!2=0
THEN n.cache.slots := 3
ELSE
$( TEST string.to.number(argv!2)
THEN n.cache.slots := result2
ELSE RESULTIS error("Bad CACHESLOTS number %S*N", 20, 100, argv!2)
$)
FOR i = 0 TO envec!0 DO argv!i := envec!i
FOR i = 0 TO 3 DO seglist!i := file.handler.seglist!i
seglist!4 := loadseg(initialisation.obj)
IF seglist!4=0
RESULTIS error("Can't load %S*N", 20, result2, initialisation.obj)
UNLESS version=0
DO
$( seglist!3 := loadseg(handler.obj)
IF seglist!3=0
THEN
$( unloadseg(seglist!4)
RESULTIS error("Can't load %S*N", 20, result2, handler.obj)
$)
$)
FOR pri = file.handler.pri TO file.handler.pri-500 BY -1 DO
$( new.file.handler := createtask(seglist, 212, pri)
UNLESS new.file.handler=0 BREAK
$)
IF new.file.handler=0
RESULTIS error("Can't create new task*N", 20, result2)
IF sendpkt(-1, new.file.handler, 0, ?, ?,
1,
deviceid,
physical.unit,
n.cache.slots,
argv,
restart.code)=0
RESULTIS error("Attempt to mount *"%S:*" failed*N", 20, result2, discname)
!lv.disc := new.file.handler
RESULTIS -1 || success
$)
AND error(message, rc, res2, discname) = VALOF
$( writef(message, discname)
result2 := res2
RESULTIS 1
$)