                                           /GEORGE FRIEDMAN
/MAN VEHICLE CONTROL LABORATORY
/MASSACHUSETTS INSTITUTE OF TECHNOLOGY
/CAMBRIDGE, MASSACHUSETTS
/
/ONE PAGE SUBROUTINES FOR READ, WRITE & SEARCH OF DECTAPE
/WITH OR WITHOUT INTERUPT OPERATION
/FOR DECTAPE CONTROL TYPE 552 ONLY.
/
/CALL IS  JMS I X    /X CONTAINS READ OR WRITE
/         CORE       /ADDRESS FOR DATA
/         ERROR      /RETURN ADDRESS IN CASE OF ERROR
/         UNIT       /IN BITS 2-5,ZEROS ELSEWHERE
/         NUMBER     /OF BLOCKS, 0 FOR SEARCH ONLY
/         BLOCK      /INITIAL BLOCK ON TAPE
/
/NON-INTERUPT OPERATION, DEFINE DISM=NOP IN ASSEMBLY
/         PROGRAM IS HELD UP UNTIL OPERATION COMPLETE
/INTERUPT OPERATION, DEFINE DISM=JMP Z SCAT OR JMP I Z SCAT
/         AS EXPLAINED FOR DEC STANDARD SUBROUTINES
/         SET UP INTERUPT ROUTINE
/         INT,(SAVE AC, LK, CLEAR AC)
/             MMRS
/             RAL
/             SNL SMA (CLA)
/             SKP
/             JMP I Y
/             ...
/             ...
/         Y,  RETURN        /RETURN=WRITE+141
/         DONE (=READ) CAN BE TESTED FOR COMPLETION.
/
/TO SEARCH ONLY, REQUEST 0 BLOCKS, CORE IMMATERIAL
/THE 129TH WORD IS PROPERLY HANDLED.
/ALL BLOCKS (INCLUDING 0) CAN BE READ AND WRITTEN
/IN CASE OF ERROR RETURN, STATUS IS IN AC.
/
                                                             WRITE,0              /WRITE ENTRY
CLA
TAD WRITE            /GET ADDRESS OF LIST
JMS PICKUP           /GO PICKUP AND SEARCH
STL RTL              /SET AC=2,2+RDF=WRITE FORWARD BITS
JMP READ+4
READ,0               /READ ENTRY
CLA
TAD READ
JMS PICKUP
TAD RDF              /GET READ FORWARD BITS
WORK,MMLF            /SET FUNCTION
TAD NBLOCK
SNA CLA
JMP EXIT             /0 BLOCKS REQUESTED, EXIT
RLP,TAD CORE         /SET CORE ADDRESS
MMML
TAD CORE
TAD K0200
DCA CORE
TAD I CORE           /SAVE 129TH WORD
DCA SAVE
JMS DELAY            /WAIT FOR END OF BLOCK
TAD SAVE             /RESTORE 129TH WORD
DCA I CORE
ISZ NBLOCK           /COMPLETE?
JMP RLP              /NO!
EXIT,MMMF            /YES! STOP TAPE
JMS DELAY            /WAIT FOR TAPE TO STOP
CLA CMA              /SET DONE=-1
DCA DONE
MMCF
DISM                 /EXIT
JMP I Z 0
PICKUP,0             /PICKUP LIST
IOF
DCA Z 0
DCA DONE             /DONE=0
TAD I Z 0
DCA CORE             /GET CORE ADDRESS
TAD I CORE           /SET UP SAVE IN CASE OF SEARCH ERROR
DCA SAVE
ISZ Z 0
TAD I Z 0            /GET ERROR RETURN ADDRESS
DCA ERROR
ISZ Z 0
TAD I Z 0            /GET UNIT NUMBER
AND MASK
DCA UNIT
ISZ Z 0
TAD I Z 0            /GET NUMBER OF BLOCKS
CIA
DCA NBLOCK
ISZ Z 0
TAD I Z 0            /GET INITIAL BLOCK
CIA
DCA MRBLK
ISZ Z 0              /FIRST RETURN IS VIA Z 0
SEARCH,TAD ABLOCK    /SEARCH FOR BLOCK
MMML
TAD C8               /SET UP REVERSAL ERROR COUNTER
DCA COUNT
SFWD,TAD SRCHF       /SEARCH FORWARD
TAD UNIT
MMMM
JMS DELAY            /WAIT FOR SET-UP DELAY
FSC,DCA DIREC        /SET DIRECTION SWITCH
SCONT,JMS DELAY      /WAIT FOR BLOCK NUMBER
TAD BLOCK            /ACTUAL BLOCK
TAD MRBLK            /-REQUESTED BLOCK
SNA                  /ARE WE THERE?
JMP FOUND            /YES!
ISZ DIREC            /NO, WHAT DIRECTION?
JMP .+4              /FORWARD!
SMA CLA              /REVERSE, IS REVERSE CORRECT?
JMP RSC              /YES, LET SEARCH CONTINUE
JMP REVD             /NO, REVERSE DIRECTION
SPA CLA              /IS FORWARD CORRECT?
JMP FSC              /YES, LET SEARCH CONTINUE
REVD,ISZ COUNT       /REVERSE DIRECTION
SKP
JMP TILT+4           /ERROR, BLOCK CAN'T BE FOUND
TAD DIREC
SNA CLA              /REV=0,FWD=1, AT THIS TIME
JMP SFWD
SREV,TAD SRCHR       /SEARCH REVERSE
MMMF
JMS DELAY            /WAIT FOR SET-UP FLAG
RSC,CLA CMA          /DIRECTION SWITCH=-1
JMP SCONT-1
FOUND,ISZ DIREC      /BLOCK FOUND, DIRECTION?
JMP I PICKUP         /FORWARD,RETURN
JMS DELAY            /REVERSE,WAIT TO PASS OVER IT
JMP SFWD             /GO SEARCH FORWARD
DELAY,0              /WAIT FOR DT FLAG
MMCF                 /CLEAR FLAGS
DISM                 /NOP OR JUMP TO SCAT
RETURN,MMSF          /RETURN ON INTERUPT
JMP .-1
CLA CLL
MMSC
JMP I DELAY
TILT,MMRS            /END ZONE?
RTL
SPA CLA
JMP REVD             /YES, REVERSE DIRECTION
MMMF                 /NO, STOP TAPE
TAD SAVE             /RESTORE 129TH WORD
DCA I CORE
MMRS                 /GET STATUS
MMSF
JMP .-1
JMP I ERROR          /ERROR RETURN
/CONSTANTS AND VARIABLES
ABLOCK,BLOCK
SRCHF,21
SRCHR,31
RDF,22
K0200,200
C8,7770
BLOCK,0
CORE,0
UNIT,0
MRBLK,0
NBLOCK,0
DIREC,0
COUNT,0
SAVE,0
MASK,1700
ERROR=WRITE
DONE=READ
$
       