! SCSI interface and Thorn EMI tape streamer driving routines
! RWT January 1987

externalroutinespec  scsi reset
! Call this before anything else

! Status bits
constinteger  sensemask = 15,
              ili   = 1<<5,
              eom   = 1<<6,
              fm    = 1<<7,
              fby   = 1<<8,
              dby   = 1<<9,
              ldpt  = 1<<10,
              eot   = 1<<11,
              rdy   = 1<<12,
              onl   = 1<<13,
              rwdg  = 1<<14,
              fptd  = 1<<15,
              ident = 1<<16,
              hsp   = 1<<17,
              her   = 1<<18,
              cer   = 1<<19,
              dfm   = 1<<20,
              nrz   = 1<<21

! Mode bits
constinteger  pe3200      = 16_80000000,
              pe1600      = 16_02000000,
              defaultdensity        = 0,
              buffered    = 16_00100000,
              nonbuffered           = 0,
              fast        = 16_000f0000,
              slow                  = 0,
              variableblocksize     = 0,
              densitymask = 16_ff000000,
              buffermask  = 16_00700000,
              speedmask   = 16_000f0000,
              sizemask    = 16_0000ffff

externalintegerspec  tape residue, tape status   { should be 0 after everything

externalroutinespec  tape show sense(integer  status)

externalroutinespec  tape mode select(integer  x)
externalintegerfnspec  tape mode sense
externalroutinespec  tape show mode(integer  mode)

externalpredicatespec  tape unit ready

externalroutinespec  tape rewind and wait
externalroutinespec  tape rewind off line
externalroutinespec  tape unload
externalroutinespec  tape erase three inches
externalroutinespec  tape erase to end

! Transfer single blocks of specified size
! (must have set mode with variable size)

externalintegerfnspec  tape read block(bytename  b,integer  bytes)
externalintegerfnspec  tape reverse read block(bytename  b,integer  bytes)
externalintegerfnspec  tape write block(bytename  b,integer  bytes)

! Transfer multiple fixed-size blocks until specified number of bytes done
! (must have set mode with appropriate block size)

externalintegerfnspec  tape read blocks(bytename  b,integer  bytes)
externalintegerfnspec  tape reverse read blocks(bytename  b,integer  bytes)
externalintegerfnspec  tape write blocks(bytename  b,integer  bytes)

externalroutinespec  tape write marks(integer  n)
externalroutinespec  tape space blocks(integer  n)
externalroutinespec  tape space marks(integer  n)
externalroutinespec  tape space consecutive(integer  n)

! Turn buffer back-to-front in memory, e.g. after reverse-reading from tape

externalroutinespec  reverse buffer(bytename  b,integer  bytes)