/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 / / 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 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 *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 $