-- StreamDefs.Mesa Edited by Sandman on June 30, 1980 5:05 PM
-- Copyright Xerox Corporation 1979, 1980
DIRECTORY
AltoDefs USING [BYTE, CharsPerPage, PageNumber],
AltoFileDefs USING [FA, vDA],
Mopcodes USING [zLDIV, zMUL, zPUSH],
SegmentDefs USING [
AccessOptions, Append, DefaultAccess, FileHandle, Read, ReadWrite,
ReadWriteAppend, Write, WriteAppend];
StreamDefs: DEFINITIONS =
BEGIN
KeyBufChars: PRIVATE INTEGER = 80;
StreamHandle: TYPE = POINTER TO StreamObject;
KeyboardHandle: TYPE = POINTER TO Keyboard StreamObject;
DisplayHandle: TYPE = POINTER TO Display StreamObject;
DiskHandle: TYPE = POINTER TO Disk StreamObject;
OtherStreamHandle: TYPE = POINTER TO Other StreamObject;
StreamObject: TYPE = RECORD [
reset: PROCEDURE [StreamHandle],
get: PROCEDURE [StreamHandle] RETURNS [UNSPECIFIED],
putback: PROCEDURE [StreamHandle, UNSPECIFIED],
put: PROCEDURE [StreamHandle, UNSPECIFIED],
endof: PROCEDURE [StreamHandle] RETURNS [BOOLEAN],
destroy: PROCEDURE [StreamHandle],
link: StreamHandle,
body:
SELECT type: * FROM
Keyboard => [
in, out: CARDINAL, buffer: PACKED ARRAY [0..KeyBufChars) OF CHARACTER],
Display => [
clearCurrentLine: PROCEDURE [stream: StreamHandle],
clearLine: PROCEDURE [stream: StreamHandle, line: CARDINAL],
clearChar: PROCEDURE [stream: StreamHandle, char: CHARACTER],
type: UNSPECIFIED,
data: POINTER],
Disk => [
eof, dirty: BOOLEAN,
read, write, append: BOOLEAN,
unit: [1..2],
index, size: CARDINAL,
page: AltoDefs.PageNumber,
char: CARDINAL,
buffer: RECORD [
SELECT OVERLAID * FROM
byte => [byte: POINTER TO PACKED ARRAY [0..0) OF AltoDefs.BYTE],
word => [word: POINTER TO ARRAY [0..0) OF WORD],
ENDCASE],
file: SegmentDefs.FileHandle,
das: ARRAY {last, current, next} OF AltoFileDefs.vDA,
getOverflow: PROCEDURE [StreamHandle],
savedGet: PROCEDURE [StreamHandle] RETURNS [UNSPECIFIED],
putOverflow: PROCEDURE [StreamHandle],
savedPut: PROCEDURE [StreamHandle, UNSPECIFIED]],
Other => [type: UNSPECIFIED, data: POINTER],
ENDCASE];
StreamError: SIGNAL [stream: StreamHandle, error: StreamErrorCode];
StreamErrorCode: TYPE = {
StreamType, StreamAccess, StreamOperation, StreamPosition, StreamEnd,
StreamBug};
-- extensions applicable to keyboard streams
CreateKeyStream: PROCEDURE RETURNS [KeyboardHandle];
GetDefaultKey, GetCurrentKey: PROCEDURE RETURNS [KeyboardHandle];
OpenKeyStream, CloseKeyStream: PROCEDURE [stream: StreamHandle];
StartKeyHandler, StopKeyHandler, DestroyKeyHandler: PROCEDURE;
trackCursor: BOOLEAN;
CursorTrack: PROCEDURE [b: BOOLEAN] = INLINE BEGIN trackCursor ← b END;
userAbort: BOOLEAN;
ControlDELtyped: PROCEDURE RETURNS [BOOLEAN] = INLINE
BEGIN RETURN[userAbort] END;
ResetControlDEL: PROCEDURE = INLINE BEGIN userAbort ← FALSE END;
GetDefaultDisplayStream: PROCEDURE RETURNS [DisplayHandle];
-- extensions applicable to disk streams
StreamPosition: TYPE = LONG CARDINAL;
StreamIndex: TYPE = RECORD [page: AltoDefs.PageNumber, byte: CARDINAL];
AccessOptions: TYPE = SegmentDefs.AccessOptions;
Read: AccessOptions = SegmentDefs.Read;
Write: AccessOptions = SegmentDefs.Write;
Append: AccessOptions = SegmentDefs.Append;
ReadWrite: AccessOptions = SegmentDefs.ReadWrite;
WriteAppend: AccessOptions = SegmentDefs.WriteAppend;
ReadWriteAppend: AccessOptions = SegmentDefs.ReadWriteAppend;
DefaultAccess: AccessOptions = SegmentDefs.DefaultAccess;
NewByteStream, NewWordStream: PROCEDURE [name: STRING, access: AccessOptions]
RETURNS [DiskHandle];
FileNameError: SIGNAL [name: STRING];
CreateByteStream, CreateWordStream: PROCEDURE [
file: SegmentDefs.FileHandle, access: SegmentDefs.AccessOptions]
RETURNS [DiskHandle];
OpenDiskStream, CloseDiskStream: PROCEDURE [stream: StreamHandle];
CleanupDiskStream, TruncateDiskStream: PROCEDURE [stream: StreamHandle];
FileLength: PROCEDURE [stream: StreamHandle] RETURNS [StreamIndex];
GetFA: PROCEDURE [stream: StreamHandle, fa: POINTER TO AltoFileDefs.FA];
JumpToFA: PROCEDURE [stream: StreamHandle, fa: POINTER TO AltoFileDefs.FA];
ReadBlock, WriteBlock: PROCEDURE [
stream: StreamHandle, address: POINTER, words: CARDINAL] RETURNS [CARDINAL];
GetDiskStreamList: PROCEDURE RETURNS [DiskHandle];
-- StreamPosition Stuff
GetPosition: PROCEDURE [stream: StreamHandle] RETURNS [StreamPosition];
SetPosition: PROCEDURE [stream: StreamHandle, pos: StreamPosition];
ModifyPosition: PROCEDURE [pos: StreamPosition, change: INTEGER]
RETURNS [StreamPosition] = INLINE
BEGIN
RETURN[IF change < 0 AND pos <= ABS[change] THEN 0 ELSE pos + change];
END;
IndexToPosition: PROCEDURE [index: StreamIndex] RETURNS [StreamPosition] =
INLINE
BEGIN
LongMult: PROCEDURE [CARDINAL, CARDINAL] RETURNS [LONG CARDINAL] = MACHINE
CODE BEGIN Mopcodes.zMUL; Mopcodes.zPUSH END;
RETURN[LongMult[index.page, AltoDefs.CharsPerPage] + index.byte];
END;
PositionToIndex: PROCEDURE [pos: StreamPosition] RETURNS [index: StreamIndex] =
INLINE
BEGIN
LongDivMod: PROCEDURE [StreamPosition, CARDINAL]
RETURNS [quotient, remainder: CARDINAL] = MACHINE CODE
BEGIN Mopcodes.zLDIV; Mopcodes.zPUSH END;
[quotient: index.page, remainder: index.byte] ← LongDivMod[
pos, AltoDefs.CharsPerPage];
END;
-- StreamIndex Stuff
GetIndex: PROCEDURE [stream: StreamHandle] RETURNS [StreamIndex];
SetIndex: PROCEDURE [stream: StreamHandle, index: StreamIndex];
NormalizeIndex: PROCEDURE [index: StreamIndex] RETURNS [StreamIndex];
ModifyIndex: PROCEDURE [index: StreamIndex, change: INTEGER]
RETURNS [StreamIndex];
EqualIndex: PROCEDURE [i1, i2: StreamIndex] RETURNS [BOOLEAN];
GrEqualIndex: PROCEDURE [i1, i2: StreamIndex] RETURNS [BOOLEAN];
GrIndex: PROCEDURE [i1, i2: StreamIndex] RETURNS [BOOLEAN];
END.