!TITLE Moving System Software to Disc Sites
!<DPRG
externalintegerfn DPRG(string (31)FILE INDEX, FILE,
integer FSYS, string (6)LABEL, integer SITE)
!
! This privileged procedure moves the contents of file FILE belonging to
! file index FILE INDEX on disc-pack FSYS to site SITE on the EMAS 2900
! disc-pack labelled LABEL.
!
! SITE is an epage number which must be X'40'-aligned. The physical
! size of the file must not exceed 256 Kbytes (512 Kbytes for sites
! X'380', X'400' and X'480'.
!>
INTEGER J
STRING (31)UNAME, INAME, FNAME, INDEX, FULL
J = IN2(66)
-> OUT UNLESS J = 0
!
J = 93
-> OUT UNLESS DTRYING << 6 < 0
!
J = UFO(FILE INDEX, FILE, UNAME, INAME, FNAME, INDEX, FULL)
-> OUT UNLESS J = 0
!
J = DPRGP(INDEX, FNAME, LABEL, FSYS, SITE, 0)
OUT:
RESULT = OUT(J, "SSISX")
END ; ! DPRG
!
!-----------------------------------------------------------------------
!
!<DUNPRG
externalintegerfn DUNPRG(string (31)FILE INDEX, FILE,
integer FSYS, string (6)LABEL, integer SITE)
!
! This privileged procedure creates a 256 Kbyte file FILE belonging to
! file index FILE INDEX on disc-pack FSYS and copies into it 256 Kbytes
! from site SITE on the EMAS 2900 disc-pack labelled LABEL. [For sites
! X'380, X'400 and X'480, the size has been extended to 512 Kbytes]
!>
INTEGER J, DA, NKB, SEG, GAP, K
STRING (31)UNAME, INAME, FNAME, INDEX, FULL
RECORD (FHDRF)NAME FHDR
J = IN2(85)
-> OUT UNLESS J = 0
!
J = 93
-> OUT UNLESS DTRYING << 6 < 0
!
J = UFO(FILE INDEX, FILE, UNAME, INAME, FNAME, INDEX, FULL)
-> OUT UNLESS J = 0
!
NKB = 256
NKB = 512 IF SITE = X'380' OR SITE = X'400'; ! bigger file for SS
J = DCREATEF(FULL, FSYS, NKB, 1, LEAVE, DA)
J = DPRGP(INDEX, FNAME, LABEL, FSYS, SITE, 1) IF J = 0
-> OUT UNLESS J = 0
!
-> OUT UNLESS NKB = 512
!
SEG = 0 { trim subsys }
GAP = 0
J = DCONNECTI(FULL, FSYS, 1, 0, SEG, GAP)
-> OUT UNLESS J = 0
!
FHDR == RECORD(SEG << 18)
NKB = (FHDR_NEXTFREEBYTE + 1023) >> 10
J = DCHSIZE(INDEX, FNAME, FSYS, NKB)
K = DDISCONNECTI(FULL, FSYS, 0)
OUT:
RESULT = OUT(J, "SSISI")
END ; ! DUNPRG
!
!-----------------------------------------------------------------------
!
INTEGERFN DPRGP(STRING (18)INDEX, STRING (11)FNAME, STRING (6)LABEL,
INTEGER FSYS, SITE, DIRECTION)
! DIRECTION = 0 PRG
! 1 UNPRG
integer TOFSYS, SYS START, EP, NP, FINDAD, LINK
integer PAGS,FLAG,CHECKPAGS
integer STARTP
integer J,OMIT PAGES, NSD
record (FDF)name FL
record (FF)name F
record (FDF)arrayname FDS
integername SD
integerarrayname SDS
conststring (5)FN = "DPRGP"
FLAG = 8
-> OUT UNLESS LENGTH(LABEL) = 6
-> OUT UNLESS STOI2(FROMSTRING(LABEL, 5, 6), TO FSYS) = 0
!
FLAG = 23; ! DISC NOT AVAILABLE
-> OUT IF AV(TOFSYS, 1) = NO
!
FLAG = SYSBASE(SYS START, TOFSYS)
-> OUT UNLESS FLAG = 0
!
FLAG = MAP FILE INDEX(INDEX, FSYS, FINDAD, FN)
-> OUT UNLESS FLAG = 0
!
F == RECORD(FINDAD)
!
FLAG = 32; ! file does not exist
J = NEWFIND(FINDAD, 0, FNAME)
-> VOUT IF J = 0
!
FDS == ARRAY(FINDAD+F_FDSTART, FDSF)
FL == FDS(J)
!
FLAG = 5; ! not available
-> VOUT UNLESS FL_CODES & UNAVA = 0
!
PAGS = FL_PGS
SDS == ARRAY(FINDAD + F_SDSTART, SDSF)
NSD = (F_FDSTART - F_SDSTART) >> 2
OMIT PAGES = 0
OMIT PAGES = 1 AND SITE = 0 IF SITE = -1
!
FLAG = 1; ! SITE NOT X40-aligned
-> VOUT UNLESS SITE & X'3F' = 0
!
FLAG = 27; ! file too big
CHECKPAGS = 64
CHECKPAGS = 128 IF SITE = X'400'; ! SUBSYS
CHECKPAGS = 256 IF SITE = X'380'
-> VOUT IF PAGS > CHECKPAGS
SD == FL_SD; ! proceed down sections chain
EP = PAGS
WHILE EP > 0 CYCLE
NP = EP
NP = 32 IF NP > 32
EP = EP - NP
LINK = SD >> 19
STARTP = (SD << 13) >> 13
STARTP = STARTP + OMIT PAGES
NP = NP - OMIT PAGES
OMIT PAGES = 0
if DIRECTION = 0 c
then J = MOVE SECTION(FSYS,STARTP,TO FSYS,SITE+SYS START,NP) c
else J = MOVE SECTION((1<<31)!TO FSYS,SITE+SYS START,FSYS,STARTP,NP)
! top bit set in param1 to suppress active block check
FLAG = 25 and -> VOUT unless J = 0
!
SITE = SITE + NP
!
EXIT UNLESS 0 < LINK <= NSD
SD == SDS(LINK)
repeat
FL_CODES = FL_CODES & (¬VIOLAT)
FLAG = 0
VOUT:
VV(ADDR(F_SEMA), F_SEMANO)
OUT:
RESULT =FLAG
END ; ! DPRGP
!
!-------------------end-of-included-text--------------------------------
!