-- SegmentDefs.Mesa Edited by Sandman on August 12, 1980 9:54 AM
-- Copyright Xerox Corporation 1979, 1980
DIRECTORY
AltoDefs USING [
BytesPerPage, MaxFilePage, MaxVMPage, PageCount, PageNumber, PageSize,
PagesPerMDS],
AltoFileDefs USING [CFA, FA, FH, FI, FP, vDA],
Mopcodes USING [zAND, zLDIV, zMUL, zPUSH];
SegmentDefs: DEFINITIONS =
BEGIN OPEN AltoDefs, AltoFileDefs;
FileHint: TYPE = AltoFileDefs.FH;
FileIndex: TYPE = AltoFileDefs.FI;
PageCount: TYPE = AltoDefs.PageCount;
PageNumber: TYPE = AltoDefs.PageNumber;
-- Basic Memory Addressing:
PagePointer: PROCEDURE [a: POINTER] RETURNS [POINTER] = INLINE
BEGIN
BITAND: PROCEDURE [UNSPECIFIED, UNSPECIFIED] RETURNS [UNSPECIFIED] = MACHINE
CODE BEGIN Mopcodes.zAND END;
RETURN[BITAND[a, 177400B]]
END;
PageFromAddress: PROCEDURE [a: POINTER] RETURNS [PageNumber];
AddressFromPage: PROCEDURE [p: PageNumber] RETURNS [POINTER] = INLINE
BEGIN RETURN[LOOPHOLE[p*PageSize]] END;
PageFromLongAddress: PROCEDURE [a: LONG POINTER] RETURNS [PageNumber] = INLINE
BEGIN
LongDiv: PROCEDURE [p: LONG POINTER, den: CARDINAL] RETURNS [CARDINAL] =
MACHINE CODE BEGIN Mopcodes.zLDIV END;
RETURN[LongDiv[p: a, den: PageSize]]
END;
LongAddressFromPage: PROCEDURE [p: PageNumber] RETURNS [LONG POINTER] = INLINE
BEGIN
LongMult: PROCEDURE [CARDINAL, CARDINAL] RETURNS [LONG POINTER] = MACHINE CODE
BEGIN Mopcodes.zMUL; Mopcodes.zPUSH END;
RETURN[LongMult[p, PageSize]]
END;
PageAvailable: PROCEDURE [page: PageNumber, info: AllocInfo] RETURNS [BOOLEAN];
LargestMDSHole: PROCEDURE RETURNS [base: PageNumber, pages: PageCount];
LargestHole: PROCEDURE RETURNS [base: PageNumber, pages: PageCount];
PagesAvailable: PROCEDURE [base: PageNumber, pages: PageCount, info: AllocInfo]
RETURNS [BOOLEAN];
-- Configuration Information
MachineType: TYPE = {
unknown0, AltoI, AltoII, AltoIIXM, D0, Dorado, unknown6, unknown7};
ControlStoreType: TYPE = {Ram0, RamandRom, Ram3k, unknown};
BankIndex: TYPE = [0..17B];
Banks: TYPE = PACKED ARRAY BankIndex OF BOOLEAN;
MemoryConfig: TYPE = MACHINE DEPENDENT RECORD [
reserved: [0..37B],
AltoType: MachineType,
xmMicroCode, useXM: BOOLEAN,
mdsBank: BankIndex,
controlStore: ControlStoreType,
banks: [0..177777B],
mesaMicrocodeVersion: [0..177777B]];
memConfig: PUBLIC READONLY MemoryConfig;
GetMemoryConfig: PROCEDURE RETURNS [MemoryConfig] = INLINE
BEGIN RETURN[memConfig] END;
-- Primative System Objects:
ObjectType: PRIVATE TYPE = {free, segment, file, length};
ObjectHandle: PRIVATE TYPE = POINTER TO Object;
Object: TYPE = RECORD [
busy: PRIVATE BOOLEAN ← FALSE,
body:
SELECT tag: ObjectType FROM
free => [
seal: PRIVATE [0..37B],
size: PRIVATE FrobSize,
fwdp, backp: PRIVATE FrobLink],
segment => [
VMpage: [0..MaxVMPage],
info:
SELECT type: SegmentType FROM
data => [
type: DataSegmentType ← UnknownDS, pages: [1..PagesPerMDS]],
file => [
swappedin: BOOLEAN,
write: BOOLEAN,
class: FileSegmentClass,
inuse: BOOLEAN,
lock: SegLockCount,
pages: [1..PagesPerMDS],
file: FileHandle,
base: PageNumber,
location:
SELECT loc: SegmentLocation FROM
disk => [hint: FileHint],
remote => [proc: RemoteSegProc, info: UNSPECIFIED],
ENDCASE],
ENDCASE],
file => [
open: BOOLEAN,
length: BOOLEAN,
lengthvalid: BOOLEAN,
read, write, append: BOOLEAN,
lengthchanged: BOOLEAN,
unused: [0..77B] ← 0,
lock: FileLockCount,
swapcount: RefCount,
segcount: SegCount,
fp: FP],
length => [
unused: [0..7B] ← 0,
byte: [0..BytesPerPage],
page: PageNumber,
file: FileHandle,
da: vDA],
ENDCASE];
MaxRefs: CARDINAL = 377B;
RefCount: TYPE = [0..MaxRefs];
MaxSegLocks: CARDINAL = 17B;
SegLockCount: TYPE = [0..MaxSegLocks];
MaxFileLocks: CARDINAL = 377B;
FileLockCount: TYPE = [0..MaxFileLocks];
MaxSegs: CARDINAL = 177777B;
SegCount: TYPE = [0..MaxSegs];
-- Free Objects
Frob: TYPE = free Object;
FrobHandle: TYPE = POINTER TO Frob;
FrobLink: TYPE = ORDERED POINTER [0..AltoDefs.PageSize) TO Frob;
FrobSize: TYPE = [0..AltoDefs.PageSize);
FrobNull: FrobLink = LAST[FrobLink];
-- S E G M E N T S:
DefaultPages: PageCount = 0;
DefaultBase: PageNumber = MaxFilePage;
DefaultMDSBase: PageNumber = DefaultBase - 1;
DefaultXMBase: PageNumber = DefaultMDSBase - 1;
DefaultANYBase: PageNumber = DefaultXMBase - 1;
DefaultBase0: PageNumber = DefaultANYBase - 1;
DefaultBase1: PageNumber = DefaultBase0 - 1;
DefaultBase2: PageNumber = DefaultBase1 - 1;
DefaultBase3: PageNumber = DefaultBase2 - 1;
SegmentObject: TYPE = segment Object;
SegmentHandle: TYPE = POINTER TO SegmentObject;
SegmentType: TYPE = {data, file};
SegmentLocation: TYPE = {disk, remote};
SegmentClass: TYPE = {frame, table, code, other};
RemoteSegProc: TYPE = PROCEDURE [
seg: FileSegmentHandle, command: RemoteSegCommand];
RemoteSegCommand: TYPE = UNSPECIFIED;
VMtoSegment: PROCEDURE [a: POINTER] RETURNS [SegmentHandle];
SegmentAddress: PROCEDURE [seg: SegmentHandle] RETURNS [POINTER];
AllocInfo: TYPE = RECORD [
effort: {hard, easy}, direction: {topdown, bottomup}, class: SegmentClass];
EasyUp: AllocInfo = AllocInfo[easy, bottomup, other];
EasyDown: AllocInfo = AllocInfo[easy, topdown, other];
HardUp: AllocInfo = AllocInfo[hard, bottomup, other];
HardDown: AllocInfo = AllocInfo[hard, topdown, other];
-- Data Segments:
DataSegmentObject: TYPE = data SegmentObject;
DataSegmentHandle: TYPE = POINTER TO DataSegmentObject;
DataSegmentType: TYPE = CARDINAL [0..377B];
UnknownDS: DataSegmentType = 0;
FrameDS: DataSegmentType = 1;
TableDS: DataSegmentType = 2;
HeapDS: DataSegmentType = 3;
SystemDS: DataSegmentType = 4;
BitmapDS: DataSegmentType = 5;
StreamBufferDS: DataSegmentType = 6;
PupBufferDS: DataSegmentType = 7;
NewDataSegment: PROCEDURE [base: PageNumber ← DefaultBase, pages: PageCount]
RETURNS [DataSegmentHandle] = INLINE
BEGIN RETURN[MakeDataSegment[base, pages, EasyDown]] END;
MakeDataSegment: PROCEDURE [
base: PageNumber ← DefaultBase, pages: PageCount, info: AllocInfo ← EasyDown]
RETURNS [seg: DataSegmentHandle];
DeleteDataSegment: PROCEDURE [seg: DataSegmentHandle];
VMtoDataSegment: PROCEDURE [a: POINTER] RETURNS [DataSegmentHandle];
DataSegmentAddress: PROCEDURE [seg: DataSegmentHandle] RETURNS [POINTER];
EnumerateDataSegments: PROCEDURE [
proc: PROCEDURE [DataSegmentHandle] RETURNS [BOOLEAN]]
RETURNS [DataSegmentHandle];
-- File Segments:
FileSegmentObject: TYPE = file SegmentObject;
FileSegmentHandle: TYPE = POINTER TO FileSegmentObject;
FileSegmentClass: TYPE = {code, other};
InvalidSegmentSize: SIGNAL [pages: PageCount];
NewFileSegment: PROCEDURE [
file: FileHandle, base: PageNumber, pages: PageCount, access: AccessOptions]
RETURNS [FileSegmentHandle];
MoveFileSegment: PROCEDURE [
seg: FileSegmentHandle, base: PageNumber, pages: PageCount];
MapFileSegment: PROCEDURE [
seg: FileSegmentHandle, file: FileHandle, base: PageNumber];
DeleteFileSegment: PROCEDURE [seg: FileSegmentHandle];
VMtoFileSegment: PROCEDURE [a: POINTER] RETURNS [FileSegmentHandle];
FileSegmentAddress: PROCEDURE [seg: FileSegmentHandle] RETURNS [POINTER];
GetFileSegmentDA: PROCEDURE [seg: FileSegmentHandle] RETURNS [vDA];
SetFileSegmentDA: PROCEDURE [seg: FileSegmentHandle, da: vDA];
EnumerateFileSegments: PROCEDURE [
proc: PROCEDURE [FileSegmentHandle] RETURNS [BOOLEAN]]
RETURNS [FileSegmentHandle];
-- File Segment Swapping:
SwapError: SIGNAL [seg: FileSegmentHandle];
SegmentFault: SIGNAL [seg: FileSegmentHandle, pages: PageCount];
SwapUp, SwapOut, Unlock: PROCEDURE [seg: FileSegmentHandle];
SwapIn: PROCEDURE [seg: FileSegmentHandle] = INLINE
BEGIN MakeSwappedIn[seg, DefaultMDSBase, EasyUp] END;
MakeSwappedIn: PROCEDURE [
seg: FileSegmentHandle, base: PageNumber ← DefaultBase,
info: AllocInfo ← EasyUp];
-- Initializing File and Data Segments
CopyDataToFileSegment: PROCEDURE [
dataseg: DataSegmentHandle, fileseg: FileSegmentHandle];
CopyFileToDataSegment: PROCEDURE [
fileseg: FileSegmentHandle, dataseg: DataSegmentHandle];
ChangeDataToFileSegment: PROCEDURE [
dataseg: DataSegmentHandle, fileseg: FileSegmentHandle];
InsufficientVM: SIGNAL [needed: PageCount];
VMnotFree: SIGNAL [base: PageNumber, pages: PageCount];
-- F I L E S:
FileObject: TYPE = file Object;
FileHandle: TYPE = POINTER TO FileObject;
LengthObject: TYPE = length Object;
LengthHandle: TYPE = POINTER TO LengthObject;
AccessOptions: TYPE = [0..7];
Read: AccessOptions = 1;
Write: AccessOptions = 2;
Append: AccessOptions = 4;
ReadWrite: AccessOptions = 3;
WriteAppend: AccessOptions = 6;
ReadWriteAppend: AccessOptions = 7;
VersionOptions: TYPE = [0..3];
NewFileOnly: VersionOptions = 1;
OldFileOnly: VersionOptions = 2;
DefaultAccess: AccessOptions = 0;
DefaultVersion: VersionOptions = 0;
FileNameError: SIGNAL [name: STRING];
InvalidFP: SIGNAL [fp: POINTER TO FP];
FileError, FileAccessError: SIGNAL [file: FileHandle];
NewFile: PROCEDURE [
name: STRING, access: AccessOptions ← DefaultAccess,
version: VersionOptions ← DefaultVersion] RETURNS [FileHandle];
InsertFile: PROCEDURE [fp: POINTER TO FP, access: AccessOptions ← DefaultAccess]
RETURNS [FileHandle];
OpenFile, CloseFile: PROCEDURE [file: FileHandle];
LockFile, UnlockFile: PROCEDURE [file: FileHandle];
ReleaseFile, DestroyFile: PROCEDURE [file: FileHandle];
GetFileTimes: PROCEDURE [file: FileHandle]
RETURNS [read, write, create: LONG CARDINAL];
SetFileTimes: PROCEDURE [
file: FileHandle, read, write, create: LONG CARDINAL ← 0];
GetFileAccess: PROCEDURE [file: FileHandle] RETURNS [access: AccessOptions];
SetFileAccess: PROCEDURE [file: FileHandle, access: AccessOptions];
InsertFileLength: PROCEDURE [file: FileHandle, fa: POINTER TO FA];
GetEndOfFile: PROCEDURE [file: FileHandle]
RETURNS [page: PageNumber, byte: CARDINAL];
SetEndOfFile: PROCEDURE [file: FileHandle, page: PageNumber, byte: CARDINAL];
SetFileLength: PROCEDURE [file: FileHandle, fa: POINTER TO FA];
UpdateFileLength: PROCEDURE [file: FileHandle, fa: POINTER TO FA];
GetFileLength: PROCEDURE [file: FileHandle, fa: POINTER TO FA];
JumpToPage: PROCEDURE [cfa: POINTER TO CFA, page: PageNumber, buf: POINTER]
RETURNS [prev, next: vDA];
GetFileFP: PROCEDURE [file: FileHandle, fp: POINTER TO FP];
FindFile: PROCEDURE [fp: POINTER TO FP] RETURNS [FileHandle];
EnumerateFiles: PROCEDURE [proc: PROCEDURE [FileHandle] RETURNS [BOOLEAN]]
RETURNS [file: FileHandle];
-- Extended Memory
ValidateVMPage: PROCEDURE [page: UNSPECIFIED];
InvalidVMPage: ERROR [page: UNSPECIFIED];
ValidateLongPointer: PROCEDURE [a: LONG UNSPECIFIED];
InvalidLongPointer: ERROR [lp: LONG UNSPECIFIED];
LongVMtoSegment: PROCEDURE [a: LONG POINTER] RETURNS [SegmentHandle];
LongSegmentAddress: PROCEDURE [seg: SegmentHandle] RETURNS [LONG POINTER];
LongVMtoDataSegment: PROCEDURE [a: LONG POINTER] RETURNS [DataSegmentHandle];
LongDataSegmentAddress: PROCEDURE [seg: DataSegmentHandle]
RETURNS [LONG POINTER];
LongVMtoFileSegment: PROCEDURE [a: LONG POINTER] RETURNS [FileSegmentHandle];
LongFileSegmentAddress: PROCEDURE [seg: FileSegmentHandle]
RETURNS [LONG POINTER];
ImmovableSegmentInXM: SIGNAL [seg: SegmentHandle];
END.