// SharedStatics.Bcpl -- Statics shared between spooler and printer

// Arranged in groups based on the nature of their use.

// The file SharedStatics.Bj assigns locations to these statics, so that they will be in the same place in
// both programs. That file arranges the statics in approximate "checkpoint level".

external [


//
Options

//
Relevant to both systems
DoEtherReport
// Use event-reporting protocol to record activity
DoMeter
// Measure performance
DoFileMeter
// Measure disk performance
Debug
// Do not load RAM or communicate with printer device
Verbose
// Generate error messages in "soft-error" situations
PressServer
// True if server, false if "stand-alone"
DebugSystem
// Enables various debugging aids
Which
// Not transferred across systems, identifies program
xmFonts
// Put fonts in Bank 1 if set

//
Set during installation or by user command line, used by printer only.
UseMicroCode
// If false, use software simulation of microcode
breakPage
// Generate break page to head each printed document


//
Files, Devices, etc.
//
Relevant to both
tridentUsed
// True if
tridentDrive
// Which T80 drive contains Spruce Files
MeterFile
// System Files
SpoolFile
ErrorFile
//LogFile
QueueFile
allocLogFile
symsFile
mapTemp// Used by checkpoint code
CheckPrAttr
// used by checkpoint code
statusOf31s
// denotes single-disk, double-disk, or two single-disk systems
tridentDisk
// TFSDSK structure, if tridentUsed
// sysFont
// Saved for restoration after Junta
printDoc
// Used by checkpoint code
PressFile
// ""
//
Set up by spooler, used only by printer.
BandFile
// System File
FontFile
// Spruce.Fonts, installer must supply

//
Miscellaneous shared information
numFilesSpooled
// Number of files available to print
numMustPrint
// print this many before considering new spooling requests
SpoolVec
// vector which holds spooled files to print (as QueueFile page #s)
LocalDocsVec
// vector which holds files spooled from local disk
seed
// UID starting number
pressFileIndex
// next ’available’ page no. in QueueFile, pressFile number
printerName
// String used in status reports and on break page
LogoFont
// font information for breakpage logo
LogoText
NumBins
BinCounters

//
Parameters -- set up by spooler, used only by printer.
LandscapeDevice
// Paper moves left to right past beam, which scans bottom to top
PaperDimensionB
PaperDimensionS
printerDevice
printerForward
PaperSpeedInches
ScanLengthInches
ScanMarginAdjust
// Adjust real page with respect to hardware
BitMarginAdjust
// Adjust real page with respect to hardware
Capabilities
// what the printer can do
DutyCycle
// moved here from SprucePrintInit
Facets
// ditto
PolygonRatio
// ditto
XOffset
// Adjust Press page with respect to real page
YOffset
// Adjust Press page with respect to real page
ResolutionB
ResolutionS
nVisibleBands
FA

//
Version Information
Version
// version number is Version.MinorVersion
MinorVersion
// Set externally -- identifies version within major version
SpruceVersion
// used by checkpoint routines for validity checking
SpruceMinorVersion
SprintVersion
SprintMinorVersion
// Common Names and Usages, but maintained separately

drive1Disk
// BFSDSK structure for model 31, drive 2, if used
RunFile
CheckPointFile
CheckFp
// Checkpoint file’s cfa -- for re-opening after Junta
DPzero
// Double Precision zero
Report
// ~~ shared??
SpruceZone
ctxQ
// System context list
PermanentBottom
// Overlay, storage management descriptors
OverlayTable
ovNum
OverlayBottom
OverlayTop
overLayout
numActiveOverlays
cFA
// Run File cfa, valid before junta
CurRMR
// so we can tell what microcode is loaded

inMsg
// Argument to OutLd; message coming in
outMsg
// Argument to InLd; message going out

sprintFPRD
// InLd descriptor for running Sprint Printer
spruceFPRD
// Send to printer for returning

// Checkpoint internal statics
checkTime // time when this checkpoint output operation began
CpZone // permanent zone, for allocating info returned from checkpoint

// Spruce Utils statics
FSTrap

]

static [
//
Options
//
Relevant to both systems
DoEtherReport
// Use event-reporting protocol to record activity
DoMeter
// Measure performance
DoFileMeter
// Measure disk performance
Debug
// Do not load RAM or communicate with printer device
Verbose = true
// Generate error messages in "soft-error" situations
PressServer
// True if server, false if "stand-alone"
DebugSystem
// Enables various debugging aids, based on bits
// 1 -- Sprint: break on return from InLd
// 2 -- Sprint only: don’t really process files
// 4 -- Sprint: swat on error independent of severity
// 10 -- Sprint: don’t poll Ether ~~ not currently implemented
// 20 -- Sprint: don’t swap in spooler on Ether spool request
// 40 -- Spruce: set Debug to true at initialization
//100 -- Sprint: break at Ov0
//200 -- Sprint: break at Ov1
//400 -- Spruce: break on return from InLd
//1000 -- Sprint: no errors are fatal, return and post (unattended system)
//2000 -- Spruce: no errors are fatal, continue (not implemented yet)
//4000 -- Spruce: swat on error independent of severity
//10000 -- Both systems: Turn on allocation checking, perform various other
//forms of validity checking
//20000 -- Sprint: if Dover engine monitoring code is loaded, do measurements
//40000 -- Spruce: skip storage zone overlap check (pre core smash?)
//100000 -- Spruce: record allocation information in Spruce.Alloc
Which// Not transferred across systems, identifies program
xmFonts = 0
// Put fonts in bank 1 if set

//
Set during installation or by user command line, used by printer only.
UseMicroCode
// If false, use software simulation of microcode
breakPage
// Generate break page to head each printed document

//
Files, Devices, etc.
//
Relevant to both
tridentUsed
// True if
tridentDrive
// Which T80 drive contains Spruce Files
MeterFile
// System Files
ErrorFile
//LogFile
SpoolFile
QueueFile
allocLogFile
symsFile
mapTemp// Used by checkpoint code
CheckPrAttr
// used by checkpoint code
statusOf31s
// denotes single-disk, two single-disks, or double-disk system
// 0,1,2 (resp.)
drive1Disk
// BFSDSK structure for model 31, drive 2, if used as separate system
tridentDisk
// TFSDSK structure, if tridentUsed
sysFont
// Saved for restoration after Junta
printDoc
// Used by checkpoint code
PressFile
// ""
//
Set up by spooler, used only by printer.
BandFile
// System File
FontFile
// Spruce.Fonts, installer must supply

//
Miscellaneous shared information
numFilesSpooled
// Number of files available to print
numMustPrint
// print this many before considering new spooling requests
SpoolVec
// vector which holds spooled files to print (as QueueFile page #s)
LocalDocsVec
// vector which holds files spooled from local disk
seed
// UID starting number
pressFileIndex
// next ’available’ page no. in QueueFile, pressFile number
printerName
// string, used in status reports and on break page
LogoFont
// font information for breakpage logo
LogoText
NumBins
BinCounters

//
Parameters -- set up by spooler, used only by printer.
LandscapeDevice
// Paper moves left to right past beam, which scans bottom to top
PaperDimensionB
PaperDimensionS
printerDevice
printerForward
PaperSpeedInches
ScanLengthInches
ScanMarginAdjust
// Adjust real page with respect to hardware
BitMarginAdjust
// Adjust real page with respect to hardware
Capabilities
// what the printer can do
DutyCycle
// moved here from SprucePrintInit
Facets
// ditto
PolygonRatio
// ditto
XOffset
// Adjust Press page with respect to real page
YOffset
// Adjust Press page with respect to real page
ResolutionB
ResolutionS
nVisibleBands
FA

// ------------------------------------------------------
//
Version Information
// ------------------------------------------------------
//
Six shared statics provide version information and provide the means for checking the validity of
// the checkpoint file. Version numbers are of the form (major version).(minor version), where major
// versions indicate substantive changes, and minor versions represent small additions and repairs. The
// six statics, all restricted to fixed locations, and further restricted to remain in the same locations over
// all future releases, are:

Version = 11// Version number = Version.MinorVersion
MinorVersion// Set externally (see below)
SpruceVersion// Created by checkpoint routines, used to check validity
SpruceMinorVersion// " "
SprintVersion// " "
SprintMinorVersion// " "

//
The static Version is set manually, above, to indicate a major new system release. MinorVersion
// may be conveniently set or incremented using a program, called Note, that knows its static location
// within the Run File (see below). These statics are maintained separately, but in corresponding
// locations, by the two programs. They are never directly stored or retrieved in checkpoints.
//
In Spruce, SpruceVersion and SpruceMinorVersion receive the values of Version and
// MinorVersion as a final step of OpenCheckPointFile() (see SpruceCheck.bcpl). Then they are saved in
// the LEVVersions region of the checkpoint file, along with Spruce’s current values for SprintVersion
// and SprintMinorVersion. Sprint carries out an analogous procedure.
//
In a preceding step of OpenCheckPointFile(), if the checkpoint file seems to have valid contents,
// Spruce restores the LEVVersions region, comparing Version to SpruceVersion and MinorVersion to
// SpruceMinorVersion. If either check fails, the function invalidates all shared and Spruce-specific
// checkpoint levels, requiring complete installation. Sprint again behaves analogously, except it does not
// destroy the shared levels. It is clear that once both systems have executed this code (in either order),
// all four auxiliary version values are available to EITHER system, for use in reporting to the user.
//
In a final check, Spruce verifies that SpruceVersion eq SprintVersion -- that is, that their major
// version numbers match.

//
Guidelines:
//
Whenever the location of existing shared statics change, shared statics are deleted or added, the
// data structures of any shared objects change, or any other modification is made which requires the
// knowledge and/or participation of both system, the major version number MUST be incremented. One
// SHOULD also increment this number in order to indicate a substantive revision. The minor version
// numbers for each system should be reset at 0.
//
Whenever the location of any existing non-shared static changes, or such statics are deleted or
// added, or the data structures change, the minor version number MUST be changed (incremented). It
// should be incremented whenever a new release of any sort is announced to the Spruce community, so
// that the installers will know whether thay have the latest, and all that. A ramification of this is that
// previously-installed checkpoint information may be discarded on occasions that would not normally
// require it. This seems a small price to pay for the validity checking that is occurring. ~~ A solution
// would be the addition of yet another level, perhaps private (not reported), to allow somewhat closer
// control, but it doesn’t seem worth it.
//
It is wise to choose distinctive minor version numbers for test versions of the system. I suggest
// the current release as major version and 100, 101, ... for minor version. Be careful about shared statics
// changes, since the major version is not being incremented according to the above rules. The rules
// need only be followed rigorously for released systems.

//
Notes on the use of the Note program to update MinorVersion:
//
Available on Spruce source directories, this program lets you annotate, checksum, and
// "versionize" any Alto file. Documentation of all features is or will be available elsewhere, but the
// following examples are sufficient for version control:

//
NOTE/V Spruce.Run Repair EFTP listener bug.
// will increment a version number stored in the leader page, and add a comment to those stored in the
// leader page or Spruce.Run. This is not sufficient to update the MinorVersion static. For that, use:

//
NOTE/U Spruce.Run.
// This will place the current leader page version in the static MinorVersion, whose location Note knows.

//
NOTE/VU Spruce.Run comment.
//
NOTE/U 100/V Spruce.Run comment.
// Both commands will modify the version number (incrementing in the first instance, setting it to 100
// in the second instance) in the leader pages, and update the MinorVersion static.
// IMPORTANT: The /U option MUST be issued following each system load. The command files
// ldspruce.cm and ldsprint.cm contain calls on Note to accomplish this. Failure to do this will result in
// a MinorVersion of 0.

// Common Names and Usages, but maintained separately

RunFile
CheckPointFile
CheckFp
// Checkpoint file’s cfa -- for re-opening after Junta
DPzero
// Double Precision zero
Report
// ~~ shared??
SpruceZone
ctxQ
// System context list
PermanentBottom
// Overlay, storage management descriptors
OverlayTable
ovNum
OverlayBottom
OverlayTop
overLayout
numActiveOverlays
cFA
// Run File cfa, valid before junta
CurRMR
// so we can tell what microcode is loaded
sprintFPRD
// InLd descriptor for running Spruce Printer
spruceFPRD
// Send to printer for returning

inMsg
// Argument to OutLd; message coming in
outMsg
// Argument to InLd; message going out

// Checkpoint internal statics
checkTime // time when this checkpoint output operation began
CpZone // permanent zone, for allocating info returned from checkpoint

// Spruce Utils statics
FSTrap
]

// ------- History . . .

// DCS, July 21, 1977 1:45 PM, derived from other places
// August 8, 1977 9:08 PM, add DebugSystem
// August 22, 1977 5:26 PM, DebugSystem takes on bit by bit meaning
// August 25, 1977 3:20 PM, previousOverlay defined
// August 28, 1977 7:29 AM, spruce->sprint, sprouller->spruce
// October 17, 1977 11:41 AM, add XOffset, YOffset, Versions 4.(0,0)
// December 7, 1977 10:04 AM, Verbose defaults to true
// January 21, 1978 1:23 AM, major version 5
// September 1, 1978 9:23 AM, numSpooled -> numFilesSpooled
// September 12, 1978 3:39 PM, add CheckCfa
// September 14, 1978 3:22 PM, revised version scheme
// September 15, 1978 4:42 PM, inherit printerName
// September 18, 1978 9:27 AM, CheckCfa -> CheckFp
// September 20, 1978 9:58 AM, format, document versions
// October 27, 1978 4:57 PM, add statusOf31s, stop sharing drive1Disk
// December 6, 1978 10:07 AM add new printer attribute stuff. Major version 10
// April 30, 1979 11:25 AM add 20000 bit to DebugSystem (see SpruceMeasure {Swinehart}); xmFonts
// August 29, 1979 10:13 AM, add NumBins and BinCounters
// November 16, 1979 2:12 PM, add LogoFont and LogoText
// January 30, 1980 12:56 PM, add CurRMR
// September 27, 1982 5:24 PM remove LogFile and add QueueFile
// September 30, 1982 12:52 PM add SpoolVec
// December 24, 1982 12:30 PM add LocalDocsVec