// DDTapes.d - Definitions for the Dual Density Tape I/O Routines
// Copyright Xerox Corporation 1981

// Last modified by Tim Diebert, March 16, 1981 4:18 PM

external
[
// Procedures in the DDTapeIO package that are useful
ActOnDDTape
CloseDDTape
EraseInches
FileSkipFwd
FileSkipRev
OpenDDTape
PerformVDDTCB
RecSkipFwd
RecSkipRev
SetDensity
TapeEOF
TapeStatus
TapeRewind
TapeRewindWait
TapeUnload
WaitTapeReady

// Procedures in the DDTapeInit package that are useful
InitializeDDTape

// Procedures in the DDTapeUtilA package that are useful
DDTapeVertIntCode // used by the R/W code for use to sync the Display turn off
UBlockEq
BlockEq
UPupChecksum
AsciiXlate
EbcdicXlate
TapeTfsSwatProc

// Procedures in the DDTape Microcode package that are useful
DDTapeImage

// Statics or externals for use in other parts of the tape code
DDTapeDispSaveData1
DDTapeDispSaveData2
DDTapeDispSaveData3
DDTapeDispSavervDCBStart
DDTapeVertIntFlag
DDTapeVertIntMask
DDTapeVertIntChannel
TapeOpened
TapeActive
]

manifest
[
// Low core stuff and more
DCBStart = #420 // Display start
DCBInterupt = #421 // Display interupt field
DDTCBStart = #622
// Tape Control Block Head
IntVec = #501
IntActive = #453
MaxUnitNum = 3
// four drives: 0,1,2 and 3

// StartIO defs
TapeNormalOp = #200
TapeResetOp = #100
]

// Tape Controller Status Definitions
//--------------------------------------------------------------------------
structure DDStatus:
//--------------------------------------------------------------------------
[
RDY bit
// 100000 ReaDY. Unit loaded, Tape not in motion
ONL bit
// 40000 ON Line. Unit loaded, Tape may be in motion
RWD bit
// 20000 ReWinDing. Unit is rewinding
FPT bit
// 10000 File ProTect. Write Ring removed.
BOT bit
// 4000 Beginning Of Tape. Tape is at load point
EOT bit
// 2000 End Of Tape. EOT marker was crossed in a forward direction
FMK bit
// 1000 End Of File. Last record (R/W) was an EOF mark (Tape Mark)
NRZI bit
// 400 NRZI Status is present in the drive. 800 bits per inch mode.
HE bit
// 200 Hard Error. A non recoverable error occured during R/W operation
SE bit
// 100 Soft Error. A correctable error occured during R/W operation.
DL bit
// 40 Data Late. Write or Read buffer went empty or overflowed
RDP bit
// 20 Read Data Parity. A read parity error occured.
ICL bit
// 10 InCorrect Length on write
HDWERR bit
// 4 HarDWare ERRor. THe controller microcode detected an error.
WFP bit
// 2 Write on File Protected reel. (FPT & Write-Op)
CMDER bit
// 1 ComManD ERror. Unkown command type.
]

manifest
[ // Status bit masks
Bot = #4000
Eot = #2000
Eof = #1000
Rewound = #144000
// RDY % ONL % BOT
TapeErr = #367
]

// Tape Control Block as Required by the hardware
//--------------------------------------------------------------------------
structure DDTCB:
//--------------------------------------------------------------------------
[
ChainAddr word
// Next TCB to be executed if error not detected by the current op.
Command word =
[
Density bit 1
// 1 = NRZI mode, 0 = PE mode.
Threshold bit 1
// 0 = normal, 1 = Low read threshold for data recovery.
ReadAfterWrite bit 1
// 0 = no read data transfered after write, 1 = read trasnfered.
blank bit 2
// should be zero
Unit bit 3
// Unit this op selects.
blank bit 3
// should be zero
Opcode bit 5 =
// Define both direction and action
[
REV bit 1
// Reverse direction bit
WRT bit 1
// Write operation
WFM bit 1
// File mark operation
EDIT bit 1
// Edit spacing operation
ERASE bit 1
// Erase or disable data
]
]
ReadBuffer word
// Address of main memory read buffer
ReadCount word
// Read buffer WORD count
WriteBuffer word
// Address of main memory write buffer
WriteCount word
// The number of BYTES to write. May be odd
ByteCount word
// Number of data bytes moved on R/W.
Flags word =
[
@DDStatus // Controller Ending Status
]
]
manifest
[
// DDTCB size
lDDTCB = ((size DDTCB)+15)/16

// Timeout timers for various things
RewindTimeout = 19200 // The total time to rewind at 150ips
RecordTimeout = 250 // Time to pass 25’ of tape at 125ips
FileTimeout = 23040 // Time to pass 2400’ of tape at 125ips for a file search.
NoOpTimeout = 10 // The total time to perform a NoOp
]


// Virtual Tape Control Block used by the software to keep track of things
//--------------------------------------------------------------------------
structure VDDTCB: // virtual tape control block
//--------------------------------------------------------------------------
[
@DDTCB
opDensity word
// flag indicating drives current density
operation word
// Operation code as supplied to the software
drive word
// Unit this operation is for
errProc word
// Procedure to call in case an error is detected
interventionProc word
// Procedure to call in case an operator intervention.
retries word
// Retry count
lowthresh word
// Flag used to keep track of a read at low threshold.
timeout word
// Timeout flag. If true then timeout detected by PerformVTCB
regap word
// Flag used to keep track of a long gap write during write retry
]

manifest
[

// Operation Density Defs
PE = 1600
NRZI = 800

// VDDTCB size
lVDDTCB = ((size VDDTCB)+15)/16

// Tape Op Codes as passed to the routines by the user program
// Assignments must be maintained so that the hardware gets what is needs.
BackSpaceRecord = #21
FwdSpaceRecord = #01
BackSpaceFile = #25
FwdSpaceFile = #05
ReadFwd = #00
ReadRev = #20
ReadRevEdit = #22
Write = #10
WriteEdit = #12
Erase = #15
EraseVar = #11
WriteEOF = #14
Rewind = #35
Unload = #36
NoOp = #37
Reset = #40
]