Directory of image this file is from
This file as a plain text file
/TM8E HANDLER (TM8EZ.PA)
/
/ MODIFIED BY
/ R. W. PHELPS
/ BEHAVIOR LAB
/ UNIV. OF ROCHESTER
/ 10/76
/
LWCR=6701 /LOAD WORD COUNT REGISTER AND CLEAR AC
LCAR=6703 /LOAD CURRENT ADDRESS REGISTER AND CLEAR AC
LCMR=6705 /LOAD COMMAND REGISTER AND CLEAR AC
LFGR=6706 /LOAD FUNCTION REGISTER AND CLEAR AC
CLT=6712 /CLEAR TRANSPORT
RMSR=6714 /CLEAR AC AND READ MAIN STATUS REGISTER
SKEF=6721 /SKIP IF ERROR FLAG IS SET
SKJD=6723 /SKIP IF THE JOB IS DONE (MTTF IS SET)
SKTR=6724 /SKIP IF TAPE UNIT READY
MTAVERSION="P&77
XFIELD=30 /FIELD IN WHICH EXTENDED HANDLER GOES
/
/
/SPECIAL CODES USED WHEN PAGE COUNT=0 (CODES IN BITS 9-11 OF FN WORD)
/
/0 (CLOSE) WRITE 2 EOF'S; THEN BACKSPACE OVER ONE OF THEM
/1 REWIND
/2 SPACE FORWARD/REVERSE RECORDS
/ IF BIT 0 OF THE FUNCTION WORD IS A 0,
/ THIS CODE ADVANCES RECORDS.
/ THE NEGATIVE OF THE NUMBER OF RECORDS IS SPECIFIED IN ARG 3
/ IF BIT 0 OF THE FUNCTION WORD IS A 1,
/ THIS CODE BACKSPACES RECORDS.
/ THE NEGATIVE OF THE NUMBER OF RECORDS IS SPECIFIED AS ARG 3.
/ THIS COMMAND ALWAYS STOPS AFTER READING A FILE MARK.
/3 SPACE FORWARD/REVERSE FILES
/ IF BIT 0 OF THE FUNCTION WORD IS A 0
/ THEN THIS FUNCTION ADVANCE FILE MARKS
/ THE NEGATIVE OF THE NUMBER OF FILE MARKS IS SPECIFIED BY ARG3
/ THE TAPE IS LEFT POSITIONED AFTER THIS FILE MARK
/ BUT UNDER NO CIRCUMSTANCES DOES THE TAPE ADVANCE PAST
/ THE SECOND MARK OF TWO CONSECUTIVE FILE MARKS
/ IF BIT 0 OF THE FUNCTION WORD IS A 1,
/ THIS CODE BACKSPACES PAST FILE MARKS.
/ THE NEGATIVE OF THE NUMBER OF FILE MARKS IS SPECIFIED BY ARG 3.
/ THE TAPE IS LEFT POSITIONED BEFORE THE LAST FILE MARK,
/ SO THE USER PROBABLY WANTS TO DO A FORWARD RECORD NEXT.
/4 REWIND AND PUT OFF-LINE (UNLOAD)
/5 WRITE EOF; PHYSICALLY THE SAME AS FN 0
/6 PERFORM OPERATION WITH SPECIFIED BLOCKSIZE
/ THE NEGATIVE OF THE DESIRED BLOCKSIZE IS SPECIFIED AS ARG 3.
/ (BLOCKSIZE REFERS TO THE ACTUAL OS/8 BUFFER SIZE AND
/ MUST BE .LE. 5000(8) (7400(8) CHARACTERS).)
/7 CURRENTLY UNUSED
/
/
/BUILD DESCRIPTOR BLOCK
*0
-1 /1 ENTRY POINT
DEVICE TM8X;DEVICE MTA0;200;MTA0&177+4000;ZBLOCK 2
/
/NOTE: MOST OF FIELD 3 IS USED AND DESTROYED BY THE
/EXTENDED SEGMENT OF THIS HANDLER. USER PROGRAMS MAY
/USE THIS FIELD BUT NOT EXPECT ITS CONTENTS TO REMAIN
/UNDISTURBED. NOTE ALSO THAT FIELD 3 MUST, OF COURSE, EXIST.
/
/ ********** NOTE CAREFULLY! **********
/THE EXTENDED HANDLER TM8EEX MUST BE STORED ON SYSTEM
/BLOCK 66 FOR THIS HANDLER TO WORK. THAT BLOCK IS NORMALLY
/USED BY THE TD8E HANDLER.
/
/TM8EEX IS LOADED INTO THE APPROPRIATE PLACE WITH TM8ESU.SV
/WHICH CAN BE CALLED WITH THE "R" COMMAND OR AUTOMATICALLY
/BY THIS HANDLER.
/
/CALLING SEQUENCE FOR TM8EEX --
/
/ AC = 0 OR AC = -1
/ JMS TM8EEZ
/ FUNCTION WORD
/ BUFFER LOCATION
/ BLOCK NUMBER (USED FOR SPECIAL BUFFER SIZE)
/
/
/ IF WRITE AND AC=0 ---> DO NOTHING
/ IF WRITE AND AC=-1 ---> UNPACK
/ IF COUNT=0 AND CODE=6 ---> SPECIAL BUFFER SIZE
/ IF READ AND AC=0 ---> PACK
/ IF COUNT=0 AND CODE=6 ---> SPECIAL BUFFER SIZE
/ IF READ AND AC=-1 ---> CLEAR CORE
*200
/THE FIRST TWO LOCATIONS ARE TEMPORARIES
/AND NO LONGER MATTER RE: PARITY AND
/BLOCK 0 BEHAVIOR OF THE HANDLER.
0 /(UNUSED)
SETBFR, 0 /CALL BUFFER PACK/UNPACK
CIF XFIELD
JMS I TM8EEX
MTFUN, 0 /FUNCTION
NBUFF, 0 /CORE
NBLOK, 0
JMP I SETBFR
PARITY, 433 /CONTENTS OF COMMAND REGISTER
STOP,
P7600, 7600
JMS SETBFR /PACK BUFFER
TAD SECOND
SNA /SECOND HALF OF BUFFER TO DO?
JMP MTEXIT-1 /NO
DCA MTFUN /YES - SET FUNCTION
DCA SECOND
JMP CKWRIT /GO DO IT
/
ISZ MTHX /BUMP FOR NORMAL EXIT
MTEXIT, HLT /CIF CDF TO USER'S FIELD
JMP I MTHX
/
/
PNEXT, 0 /CONTAINS FIRST LOC ON NEXT PAGE
TAD K3700
AND I MTHX /CHECK NUMBER OF BLOCKS
CLL RTL /L=1 IF .GE. 20; AC=0 IF .EQ. 20
SNA CLA
CLL /L=0 IF .LE. 20; AC=0
SZL
TAD K6077 /SET UP SECOND IF .GT. 20 BLOCKS
AND I MTHX
DCA SECOND /OTHERWISE IT BECOMES 0
CMA CML RTR /MASK OUT 20 BLOCKS OF .GT. 20 (L=1)
AND I MTHX
DCA MTFUN
ISZ MTHX /POINT TO BUFFER ADDRESS
TAD I MTHX /BUFFER ADDRESS
DCA NBUFF /AND STORE AWAY
ISZ MTHX /POINT TO BLOCK NUMBER
TAD I MTHX /GET BLOCK NUMBER
DCA NBLOK /STORE AWAY
ISZ MTHX /POINT TO ERROR RETURN
RDF /GET CALLING FIELD
TAD MTCDIF /CREATE CIF CDF TO USER'S FIELD
DCA MTEXIT /STORE AWAY WHERE WILL BE USEFUL LATER
MTCDIF, CIF CDF 0 /GO TO FIELD 0
JMS I SYSHND /READ IT INTO CORE
200+XFIELD
TAPBUF=400
TM8EEX, 0
66 /ABSOLUTE BLOCK FOR EXTENDED HANDLER
HLT /READ ERROR
CDF XFIELD
ISZ I TM8EEX /DOES BLOCK 66 HAVE THE RIGHT STUFF IN IT?
JMP GOSETUP /NO - ABORT AND SET IT UP
CDF 0
CKWRIT, CLA CMA /ZERO BUFFER FOR PIP IF READ
JMS SETBFR /WRITE - UNPACK BUFFER
TAD MTFUN
PGCHK, JMS I PNEXT /GO READ OR WRITE NEXT PAGE
/ MTH
/SET UP WC AND CA REGISTERS, LOAD FUNCTION AND GO
/CALLING SEQUENCE:
/ TAD (FNWORD
/ JMS MTH
/ BUFFER ADDRESS-1
/ -WORD COUNT
/ MASK FOR UNACCEPTABLE ERROR CONDITIONS
/ <NORMAL RETURN>
/ TAKES HANDLER ERROR RETURN ON ERRORS.
/ IF ERROR, AC HAS ERROR CODE FROM MAIN STATUS REGISTER
/ AC IS POSITIVE IF E.O.F. READ
MTH, 0 /MUST BE AT 1ST LOC AFTER CALL TO NEXT
DCA ERROR /SAVE FUNCTION TEMPORARILY
SKTR
JMP .-1
CLT /CLEAR THE WORLD
TAD PARITY
LCMR /LOAD COMMAND REGISTER
TAD I MTH /GET CURRENT ADDRESS
LCAR /LOAD IT
ISZ MTH /POINT TO WORD COUNT
TAD I MTH /GET WORD COUNT (TWO'S COMPLEMENT THEREOF)
LWCR /LOAD IT
ISZ MTH /POINT TO ERROR MASK
TAD ERROR /GET FUNCTION BACK
LFGR /GO BABY GO
JMS ERROR /CHECK FOR ERROR
SKJD /THROUGH?
JMP .-2 /NO
JMS ERROR /YES, ANY ERRORS?
E1, ISZ MTH
JMP I MTH /NORMAL RETURN
IFNZRO MTH-PGCHK-1 <MTHERR,XXX>
ERROR, 0
KRS /IS IT CTRL/C?
TAD M203
SNA CLA
JMP I P7600 /RETURN TO OS/8 KEYBOARD MONITOR
SKEF /SKIP ON ERROR
JMP I ERROR /RETURN, NO ERRORS
RMSR
AND I MTH /IS THIS AN ERROR TO IGNORE?
SNA
JMP E1 /YES (EOF DURING SKIP)
AND L100 /IS IT AN E.O.F.?
SZA CLA
JMP ENDFIL /HANDLE END OF FILES SPECIAL
RMSR
JMP MTEXIT /AND LEAVE WITH STATUS IN AC
/
ENDFIL, JMS SETBFR /NOW PACK IT
TAD SECOND
DCA MTFUN
CLA CMA
JMS SETBFR /FIRST ZERO THE REST OF THE BUFFER
JMS SETBFR /NOW PACK IT
JMP MTEXIT /TAKE SOFT ERROR RETURN
/
/
USR, 7700
K3700, 3700
K6077, 6077
M203, -203
SYSHND, 7607
NOFST, SUNAME-NEXT /OFFSET ON NEXT PAGE TO SUNAME
/
GOSETUP, CIF 10
CDF 0
TAD PNEXT /FIRST LOC ON NEXT PAGE
TAD NOFST /OFFSET TO SUNAME
DCA SECOND-1 /(MAKES CODE PAGE RELOCATABLE)
IAC
JMS I USR /LOOKUP THE FILE "TM8ESU.SV" WHICH SETS
2 / UP SYSTEM BLOCK 66
SUNAME
SECOND, 0 /USE THIS FOR TEMPORARY STORAGE
HLT /LOOKUP ERROR -- TM8ESU.SV NOT FOUND ON SYS:
TAD .-3 /GET THE FILE'S START BLOCK
DCA .+4 /IT'S WHERE TO CHAIN TO
CIF 10
JMS I USR
6 /NOW DO THE CHAIN
/
IFZERO .-MTHX-1&4000 <PERR,ZZXX>
*375
MTHX,
MTA0, MTAVERSION
L100, 100
JMS PNEXT /GET ADDRESS OF FIRST LOCATION ON NEXT PAGE
PAGE
*400
NEXT, 0
DCA RECNO /READ OR WRITE AND HOW MANY
TAD NEXT
TAD KSTOP
DCA NSTOP /ADDRESS OF RETURN ROUTINES
TAD NEXT
TAD KBLOK
DCA SIZE
TAD I SIZE
DCA SIZE
TAD (3673 /MASK TO IGNORE EOF ERROR
DCA EOF
TAD RECNO
CLL RAL /LINK SPECIFIES READ OR WRITE
AND L7600 /-(# OF BLOCKS)^200
SNA
JMP ZERO /0 PAGE COUNT!
DCA RECNO
SZL /READ OR WRITE?
STL CLA RTR /WRITE. +2000 TO CONVERT READ CODE TO WRITE CODE
TAD L2100 /READ (OR WRITE) & GO
DCA TEMP /SAVE THIS COMMAND
TAD MSIZE
DCA SIZE /OS/8 USES 256 WORD BLOCKS
TAD (3737 /IGNORE BLOCK SIZE ERRORS --
/ THUS SHORT BLOCKS ARE PADDED WITH
/ ZEROS AND LONG BLOCKS ARE TRUNCKATED.
DCA EOF /EOF IS LEGAL ERROR
TAD (TAPBUF-1
DCA BUFFER
RL1, TAD TEMP
JMS DO
TAD BUFFER /NEXT 400 WORDS
TAD PSIZE
DCA BUFFER
TAD RECNO /ANY MORE?
CLL CML
TAD (-400 /SUBTRACT WORDS READ FROM WORD COUNT
SNA SZL /IF NO OVERFLOW, WE'RE DONE
JMP I NSTOP /FINISH
DCA RECNO /MORE, LOOP
JMP RL1 /REJOIN PROCESSING
KSTOP, STOP-MTH /USED TO RELOCATE 'STOP'
KBLOK, NBLOK-MTH
COUNT, 0
TEMP, 0
EFL2, TAD L5100 /WRITE 2 EOF'S
JMS DO
TAD L5100 /WRITE AN EOF
JMS DO
JMP SPACE-1 /BACKSPACE OVER LAST EOF
DO, 0
JMS I NEXT /GO DO IT (CALL MTH)
BUFFER, 7777 /BUFFER LOCATION
SIZE, 0 /NEGATIVE OF BLOCK SIZE
EOF, 0
JMP I DO
L5100, 5100
RECNO, 0
NSTOP, 0
L7, 7
L2100, 2100
ZERO, TAD RECNO /RETRIEVE FN WORD (MUST PRESERVE LINK)
AND L7 /ISOLATE SPECIAL CODE
TAD PJUMP
DCA .+1
FN, HLT /BRANCH THROUGH JUMP TABLE
TABLE, JMP EFL2 /0 CLOSE. WRITE TWO EOF'S
JMP REW /1 REWIND
JMP SPACE /2 SPACE FORWARD/REVERSE RECORDS
JMP SEOF /3 SPACE FORWARD/REVERSE FILES
JMP UNLOAD /4 REWIND AND OFF-LINE
JMP EFL2 /5 WRITE EOF
JMP SPEC /6 READ OR WRITE WITH SPECIAL BLOCKSIZE
PJUMP, JMP TABLE
SEOF, RAR /LINK ON MEANS REVERSE
RTR
DCA FN
TAD SIZE /NEG. OF # BLOCKS OR FILES TO SKIP
DCA TEMP
STA
DCA SIZE
FILE, CLA IAC
FILE2, DCA COUNT /BECOMES NON-ZERO IF ANY DATA FOUND BEFORE
/ FILE MARK IS READ.
TAD FN
TAD L6100
JMS DO
RMSR
AND P100 /SPACE FORWARD TO FILE MARK
SNA CLA
JMP FILE
TAD FN
TAD COUNT
SZA CLA /WAS THERE ANY DATA?
JMP FILE3 /YES, CONTINUE
CLL CML /NO - EOT
SPACE, RAR /LINK ON MEANS REVERSE (READ BIT)
STL RAR
STL RAR
UNLOAD, TAD P100 /ADD IN 'GO' BIT
JMS DO
JMP I NSTOP
FILE3, ISZ TEMP
JMP FILE2 /CONTINUE?
JMP I NSTOP
L6100, 6100
P100, 100
L7600, 7600
MSIZE, -600 /BLOCK SIZE
PSIZE, 600
SPEC, SZL /LINK STILL CONTAINS READ/WRITE BIT
STL CLA RTR
TAD L2100
JMP UNLOAD+1
REW, TAD (1000
JMP UNLOAD
SUNAME, FILENAME TM8ESU.SV
PAGE
$