X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=sw%2Fadventure%2FUSR.RA;fp=sw%2Fadventure%2FUSR.RA;h=d31ea66bc71b24a43dd6a2e804d6de84ef615d69;hb=84b5715c66b026062d9c455da3509b814bc32b1b;hp=0000000000000000000000000000000000000000;hpb=9107854b0bc70913de9757805c976b7442d88178;p=pdp8.git diff --git a/sw/adventure/USR.RA b/sw/adventure/USR.RA new file mode 100644 index 0000000..d31ea66 --- /dev/null +++ b/sw/adventure/USR.RA @@ -0,0 +1,717 @@ +/ SUBROUTINE USR (UNIT, NAME, FUNCT, ERROR) +/ VERSION 01.18 + +/ WRITTEN BY: +/ ROBERT PHELPS +/ BEHAVIOR LAB +/ DEPT. RAD. BIOL. & BIOPHYSICS +/ UNIVERSITY OF ROCHESTER +/ ROCHESTER, NY 14642 +/ +/ THIS ROUTINE ALLOWS RUN-TIME DECLARATION OF FILES +/ IN D.E.C. FORTRAN IV FOR THE PDP-8. +/ +/ DESCRIPTION OF PARAMETERS: +/ +/ UNIT - LOGICAL UNIT NUMBER +/ ONLY NUMBERS 5 THRU 9 ARE ALLOWED. +/ FEWER LOGICAL UNITS MAY BE ALLOWED DEPENDING +/ ON CORE AVAILABILITY -- SEE PROGRAMMING NOTE +/ BELOW. +/ NAME - DEV:FILE.EX +/ STORED IN FORMAT 3A6 OR EQUIVALENT. +/ DEVICE ASSUMED TO BE DSK: IF NOT +/ EXPLICITLY STATED. THIS PARAMETER MAY +/ ALSO BE A HOLLERITH LITERAL. +/ NULL CHARACTERS ('@') AND SPACES +/ ARE IGNORED IN THIS FIELD. +/ FUNCT - FUNCTION: 2 - OPEN FILE FOR INPUT +/ 3 - OPEN FILE FOR OUTPUT +/ 4 - CLOSE OUTPUT FILE +/ THE OUTPUT FILE NAME GIVEN FOR A +/ MUST AGREE WITH THE CORRESPONDING +/ FILE NAME FOR THAT UNIT. CLOSING A FILE +/ WITH 0 BLOCKS OR AN INPUT (FUNCT=2) FILE WILL +/ DELETE THAT FILENAME FROM THE DIRECTORY. +/ ERROR - RETURN ERROR CONDITION +/ 0 - NO ERRORS. +/ 1 - ILLEGAL DEVICE +/ 2 - ILLEGAL FILE NAME +/ 3 - ILLEGAL UNIT NUMBER (CORE EXCEEDED!?) +/ 4 - ILLEGAL FUNCTION CODE +/ +/ USER ERRORS MAY TERMINATE EXECUTION UNLESS THE /E +/ OPTION WAS SPECIFIED TO FRTS. THE FOLLOWING USER +/ ERRORS FROM ARE DEFINED: +/ 0002 - THE USER HAS DEFINED A NON-RESIDENT +/ DEVICE HANDLER EXTERNAL TO . +/ +/ PROGRAMMING NOTE: EACH UNIT IS ASSIGNED 1000(8) LOCATIONS +/IN THE HIGHEST FIELD FOR BUFFER AND HANDLER (400 FOR ITS BUFFER +/AND 400 FOR ITS HANDLER). THESE LOCATIONS ARE +/NOT DYNAMICALLY ALLOCATED BUT ARE USED FOR DEVICE BUFFER AND +/HANDLERS ONLY IF THEY ARE NOT USED BY THE +/PROGRAM. TO USE CORE MOST EFFICIENTLY FOR LARGE +/PROGRAMS, USE THE HIGHEST ORDER UNIT NUMBERS POSSIBLE. THAT IS, +/USING UNIT 5 ALLOWS 1000(8) FEWER WORDS FOR SOURCE CODE THAN IF +/UNIT 6 WERE THE LOWEST UNIT NUMBER USED. +/ +/ RESTRICTIONS: BECAUSE LOADS NON-RESIDENT HANDLERS FROM +/THE TOP OF CORE DOWN, AND ALSO USES THAT AREA, THE USER IS NOT +/ALLOWED TO MAKE LOAD TIME +/I/O UNIT DECLARATIONS TO DEVICES WITH NON-RESIDENT +/HANDLERS EXTERNAL TO . TO DO SO WLL CAUSE A FATAL +/USER ERROR 2. IT IS RECOMMENDED, AND GENERALLY +/MORE CONVIENENT TO USE INTERNAL HANDLERS AND +/DECLARE ALL OTHER FILES AT EXECUTION TIME +/WITH CALLS TO THIS SUBROUTINE. +/THE USE OF INTERNAL HANDLERS, +/SYS:, AND DEVICES CO-RESIDENT WITH SYS: ARE LEGAL, +/EVEN IF DEFINED EXTERNAL TO THIS SUBROUTINE. +/ +/NOTE: THIS PROGRAM REQUIRES ONE PATCH BE MADE TO +/ BEFORE IT WILL RUN. IT IS DESCRIBED +/ BELOW: +/ +/MAXCOR=121 /THESE ARE LOCATIONS IN THE RESIDENT PART OF +/HGHLOC=123 / AND REQUIRE THE FOLLOWING PATCH BE PLACED + /IN FRTS SO THEY WILL BE SET PROPERLY. THE PATCH + /DELETES CODE WHICH INITIALIZES SYSTEMS WITH AN + /ANALEX PRINTER, SO IF YOU HAVE AN ANALEX ... WATCH OUT. + +/Note that MAXCOR and HGHLOC are 2 word variables which have been +/created for this routine on page 0 of FRTS. If FRTS +/is changed to use more page 0 locations, the patch +/will have to be changed as well. + +/ FIELD 1; *2475 +/12475 7300 CLA CLL /Note, CDF CIF 0 is pending +/12476 1311 TAD 12511 /Load address of VAR +/12477 3010 DCA 10010 /Store in auto index +/ 1023 TAD 10023 /Load value of MAX field +/ 3410 DCA I 10010 /As high order part of MAXCOR +/ 3410 DCA I 10010 /Zero low order part +/ 1025 TAD 10025 /Load highest avail. field +/ 3410 DCA I 10010 /Store high order word +/ 1026 TAD 10026 /load high address +/ 3410 DCA I 10010 /Store low order word of HGHLOC +/ 7000 NOP /? +/ 5766 JMP I 12566 /Start up FPP + +/12511 120 /ADDRESS-1 of MAXCOR + + EXTERN CGET + EXTERN CPUT + DSRN=4244 /Address of DSRN table in FRTS + + SECT USR + JA #ST + +/NOTE: MUCH OF THIS CODE WAS LIFTED FROM A FORTRAN +/ GENERATED ASSEMBLY LISTING. ACCEPT THIS AS +/ AN APOLOGY FOR THE LACK OF COMMENTS IN SOME SECTIONS. +/ +#XR, ORG .+10 + TEXT +USR + + +#RET, SETX #XR + SETB #BASE + JA .+3 +#BASE, ORG .+6 /BASE 0 AND 1 +UNIT, ORG .+3 /BASE 2 +FUNCT, ORG .+3 /BASE 3 +ERROR, ORG .+3 /BASE 4 +#DSK, TEXT +DSK@@@+ /DEFAULT DEVICE NAME +I, F 0.0 /BASE 6 +N, F 0.0 /BASE 7 + ORG #BASE+30 + FNOP + JA #RET + FNOP +#GOBAK, 0;0 + +PERFLG, F 0.0 /PERIOD FLAG +X, +#TMP, ORG .+3 +ONE, F 1.0 +TWO, F 2.0 +THREE, F 3.0 +FOUR, F 4.0 +SEVEN, F 7.0 +MUNIT, 0027;0;0 /Low unit: Set according to CORE avail. +NINE, F 9.0 +TEN, F 10.0 +ATEEN, F 18.0 +COLON, F 58.0 +PERIOD, F 46.0 +SPACE, F 32.0 +MAXCOR, 0; 7; 0 /RHM: Don't require the FRTS patch. +HGHLOC, 0; 7; 2000 /RHM: Hope memory used doesn't get larger. +/ ADVENT in the current implementation uses up thru 71000 at worst. +/ This hopefully allows room for extra 2-page handlers and the TD8E ROM. +#RTN, BASE #BASE + JA #GOBAK +#ST, STARTD + 0210 + FSTA #GOBAK,0 + 0200 + SETX #XR + SETB #BASE + LDX 0,1 + FSTA #BASE + FLDA% #BASE,1+ + FSTA UNIT + FLDA% #BASE,1+ + FSTA NAME + FLDA% #BASE,1+ + FSTA FUNCT + FLDA% #BASE,1+ + FSTA ERROR + +/ INITIALIZE PROGRAM + +SKIP, /JA SKIP2 AFTER FIRST ENTRY + +/ FIND OUT HOW MANY UNITS TO ALLOW + +/Note that the original scheme was rather bizzare, and for +/humerous purposes, I have left it here, commented out. +/This worked OK with the old FPP interpreter, since it zeroed +/the exponent with a STARTF. The FPP does not, and the +/EXPONENT is left indeterminate. This meant that sometimes +/you could use past 72400, and sometimes you couldn't. +/(Note, that S.B.'s version of FRTS has been changed +/so that the FPP interpreter works the same as the FPP.) + +/ FLDA MAXCOR /Load highest field number +/ FSUB HGHLOC /Subtract high location +/ FADD D2400 /1 FIELD LESS 5400 LOCS FOR 5 DEVICES + / NOTE: PG. 7600 RESERVED FOR OS/8 + / PG. 7400 USED FOR OS/8 USR CALL +/ JGE SKCONT /ROOM FOR 5 DEVICES? +/ FADD D15000 /Note, FAC= how many locations short +/ FMUL D1000 /HOW MANY 1000 WORD BLOCKS ARE THERE? +/ STARTF +/ FNORM +/ FMUL E30 /ALTHOUGH WE WERE WORKING WITH AN +/ /INTEGER ABOVE, THE FPP THOUGHT IT +/ /HAD A BINARY POINT TO THE RT. OF THE +/ /SIGN BIT. THIS INSTRUCTION EFFECTIVELY +/ /CHANGES THE NUMBER TO A REAL FPP INTEGER. +/ FSTA MUNIT /MINIMUM UNIT # ALLOWED +/D15000, 1;5000 +/D1000, 4;0 /0.001 +/E30, 30;2000;0 /1.E30(2) + +/The routine should really be modified to check which handlers +/are already loaded. This wouldn't be all that difficult, +/since the field 1 tables of handler residency are saved on +/SYS block 37, and restored each time USR is called. As long +/as a reset isn't performed, it should be easy to determine +/if a handler is already loaded. Then HGHLOC could be changed +/dynamically, as handlers were loaded. The core usage would then +/also be independent of the unit number used. + + FLDA MAXCOR /Load Max field # + FADD D7400 /Offset to highest useable address + FSUB HGHLOC /Compute locations available + LDX 11,1 /Load shift argument + ALN 1 /Divide by 1000 + FSTA MUNIT+1,0 /Store number of units + STARTF + FLDA TEN /Load MAX units+1 + FSUB MUNIT /Subtract number of units + FSTA MUNIT /Store new minimum unit + FSUB THREE /Limit min. to three + JGE SKCONT /Ok if greater than 2 + FLDA THREE /Just in case we need to avoid + FSTA MUNIT /field boundary problems + +SKCONT, STARTD + SETX MAXCOR+1 + XTA 0 /GET HIGHEST FIELD + FDIV D10X /PUT IT INTO BITS 6-8 OF LO ORDER WORD + SETX LHIFLD + ATX 0 /LOAD HIGHEST FIELD INTO LHIFLD + FADD DCDF /MAKE IT CDF HIFLD + SETX FD1 + ATX 0 /SET LOCATIONS USING IT + SETX FD2 + ATX 0 + FADD ONED /MAKE IT CIF HIFLD + SETX FI1 + ATX 0 + SETX #XR + +/ CHECK TO MAKE SURE USER DID NOT DECLARE +/ DEVICE WITH HANDLER EXTERNAL TO THESE ROUTINES. + + FLDA SKIPJA /SET INSTRUCTION SO THIS CODE + FSTA SKIP,0 / EXECUTES ONLY ONCE. +/ + FLDA SXDSRN /INITIALIZE SETX INSTRUCTION + FSTA SKCON2 + LDX -11,6 /SET COUNTER (MAX # DSRN ENTRIES) +SKCON2, SETX DSRN /STUFFED AND MODIFIED + XTA 0 /GET NEXT HANDLER ENTRY POINT + SETX #XR + FSUB D5200 + JLT SKCON3 /INTERNAL HANDLER, IT'S OK + FSUB D2400 + JGT SKCON3 /RESIDENT HANDLER (E.G. SYS:), IT'S OK TOO + LDX 2,0 /***SOME OTHER HANDLER***USER ERROR 2 +EXTERN #UE + TRAP3 #UE /USER ILLEGALLY DECLARED A FILE! +/ +SKCON3, FLDA NINED /INCREMENT TO NEXT DSRN ENTRY + FADDM SKCON2 + JXN SKCON2,6+ +/ +SKIP2, STARTF /***END OF INITILIZATIN CODE*** + LDX 1,7 + FCLA /INITIALIZE SOME VARIABLES... + FSTA PERFLG /NO PERIODS YET + FSTA FILE-0003,7 + FSTA FILE-0003,7+ + FLDA #DSK /SETUP DEFAULT DEVICE + FSTA DEV + FLDA ONE /FIRST CHARACTER IS # 1 + FSTA N + FLDA% UNIT /CHECK FOR LEGAL UNIT # + FSUB MUNIT + JSA #LT / IF (UNIT.LT.MUNIT.OR.UNIT.GT.9) GO TO 900 + FSTA #TMP+00 + FLDA% UNIT + FSUB NINE + JSA #GT + FADD #TMP+00 + JNE #900 + FLDA% FUNCT /CHECK FOR LEGAL FUNCTION CODE + FSUB TWO + EXTERN #LT + JSA #LT / IF (FUNCT.LT.2.OR.FUNCT.GT.4) GO TO 901 + FSTA #TMP+00 + FLDA% FUNCT + FSUB FOUR + EXTERN #GT + JSA #GT + FADD #TMP+00 + JNE #901 +/ +/ PUT DEV:FILE.EXT INTO CORRECT FORMAT FOR USR CALL +/ + FLDA ONE + FSTA I / DO 100 I=1,18 + +#G0002, JSR CGET / CALL CGET (NAME, I, X) + JA .+10 +NAME, JA . + JA I + JA X + FLDA X / IF (X.NE.COLON) GO TO 40 + FSUB COLON + JNE #40 + FLDA I /COLON MUST BE COLUMN 6 OR BEFORE + FSUB SEVEN /7 + JGE #DONE + FLDA FILE /COLON DEFINES DEVICE NAME + FSTA DEV + FCLA + FSTA FILE + FLDA ONE + FSTA N + JA #100 + +#40, FLDA X / IF (X.NE.PERIOD) GO TO 60 + FSUB PERIOD + JNE #60 + FLDA PERFLG /ONLY ONE PERIOD ALLOWED + JNE #DONE + FLDA SEVEN /SET TO DECODE EXTENSION + FSTA PERFLG + FSTA N + JA #100 + +#60, FLDA X + JEQ #100 /SKIP OVER NULL'S + FSUB SPACE + JEQ #100 /SKIP OVER SPACES + JSR CPUT / CALL CPUT (FILE, N, X) + JA .+10 + JA FILE + JA N + JA X + FLDA N / N=N+1 + FADD ONE + FSTA N + +#100, FLDA I / 100 CONTINUE + FADD ONE + FSTA I + FSUB ATEEN + JLE #G0002 + +#DONE, FLDA% FUNCT + FSUB FOUR + JNE #101 /FUNCTION = CLOSE ? + EXTERN #ENDF + FLDA% UNIT /YES - END FILE + TRAP3 #ENDF + +#101, SETX FUNCTX /USR XR TO PASS PARAMETERS + FLDA% FUNCT + ATX 0 + FLDA% UNIT + ATX 1 + + TRAP4 #USRSE /TRAP TO THE USR CALLING ROUTINE + + XTA 2 /GET ERRNO AND RETURN IT + FSTA% ERROR + JA #RTN +#900, FLDA THREE /ILLEGAL UNIT NUMBER!!! + FSTA% ERROR + JA #RTN + +#901, FLDA FOUR /ILLEGAL FUNCTION CODE!!! + FSTA% ERROR + JA #RTN +/ +SKIPJA, JA SKIP2 +DCDF, 0;CDF +ONED, 0;1 +D10X, 400;0 /0.1 +D10, 0;10 +SXDSRN, SETX DSRN +NINED, 0;11 +D5200, 0;5200 +D2400, 0;2400 +D7400, 0;7400 + +SECT8 #USRSE; 0 +/ +/THIS ROUTINE SETS UP, ON PAGE 7400 OF THE HIGHEST FIELD, A +/ROUTINE WHICH CALLS THE OS/8 USR (USER SERVICE ROUTINE). +/IT IS NECESSARY TO DO THIS BECAUSE THE FORTRAN IV LOADER +/MAY LOAD ANY ROUTINE IN THE RESERVED AREA FOR +/THE OS/8 USR (10000 - 11777). +/ +/ THIS PROGRAM ALSO REQUIRES +/ THAT 'HKEY' BE THE LOCATION IN AS DEFINED +/ BELOW: + +HKEY=2761 +DSRN=4244 /Address of DSRN table in FRTS + +/ +/IN CASE CLOSE FUNCTION, GET # BLOCKS WRITTEN +/ + TAD UNITX + CLL RTL /MULTIPLY BY 9 + RAL + TAD UNITX + TAD K6 /OFFSET TO CURRENT BLOCK + TAD LDSRN /START OF DSRN TABLE - 11 + DCA TEMQ + CDF 0 + TAD% TEMQ + DCA SB +/ +/MOVE USR CALLING ROUTINE TO DEFINED LOCATION +/ I.E. PROTECT LOCS 10000-11777 +/ + TAD K7400 /Target address + DCA TEMQ /Store for indirect reference + TAD #LUSR+1 /Origin address + DCA TEMQ2 /Store for indirect reference + TAD M200 /Number of words to move + DCA TEMQ3 /Store in a counter + TAD #LUSR /Load field word + AND K7 /Strip it + CLL RTL /Into right bits + RAL + TAD #CDF + DCA .+1 /Store the CDF +FUSR, HLT /Set field where USR loads + TAD% TEMQ2 /Load routine location +FD1, CDF 00 /Set HIGH field + DCA% TEMQ /Store location in high field + ISZ TEMQ /Bump the pointers + ISZ TEMQ2 + ISZ TEMQ3 /And the counters + JMP FUSR /Loop on it + +/SET FIELDS AND CALL IT + + RIF /GET CURRENT FIELD + TAD #CDF + DCA .+1 + HLT /Set this field +FI1, CIF 00 /Set high field + TAD FUNCTX /Load function number + JMS% K7400 /Call routine +SB, 0 /START BLOCK OF FILE OR LENGTH IF CLOSE +NOBLKS, 0 /LENGTH OF FILE +ENTPT, 0 /HANDLER ENTRY POINT + DCA ERRUSR /SAVE ERROR RETURN VALUE + +/SETUP TO MOVE DSRN TABLE APPROPRIATELY + + TAD UNITX + CLL RTL /MULTIPLY BY 9 + RAL + TAD UNITX + TAD LDSRN + DCA TEMQ +#CDF, CDF 0 + DCA% TEMQ /DISABLE FILE IN CASE CLOSE FUNCTION + CLA CLL CMA RTL /-3 => AC + TAD FUNCTX + SMA SZA CLA /CLOSE? + JMP USRSL5 /YES + +/MOVE HANDLER TO APROPRIATE BUFFER + + CLA CMA CLL RAL /-2 => AC + TAD UNITX + CLL RTR + RTR /UNIT 9 => AC=7000; UNIT 8 => AC=6000 + TAD M400 + DCA LHNDR /LOCATION FOR THIS UNIT'S HANDLER + TAD K5200 + DCA TEMQ2 + TAD M400 + DCA TEMQ3 +USRL4, CDF 0 + TAD% TEMQ2 +FD2, CDF 00 + DCA% LHNDR + ISZ TEMQ2 + ISZ LHNDR + ISZ TEMQ3 + JMP USRL4 + +/BUILD UP NEW DSRN TABLE FOR THIS UNIT + + CDF 0 + TAD ENTPT + DCA% TEMQ /ENTRY POINT + ISZ TEMQ + CLL CML RTL /2 => AC (FORMS CONTROL BIT) + TAD LHNDR + TAD M400 + TAD LHIFLD + DCA% TEMQ /HANDLER CODE WORD + TAD K7774 /*K* KLUDGE TO LET FRTS KNOW WHICH + AND% TEMQ / HANDLER IS IN CORE + DCA% #HKEY + ISZ TEMQ + TAD LHNDR + TAD LHIFLD + DCA% TEMQ /BUFFER ADDRESS & FIELD + ISZ TEMQ + TAD LHNDR + DCA% TEMQ /CHARACTER POINTER + ISZ TEMQ + CMA CLL RTL /-3 => AC + DCA% TEMQ /CHARACTER COUNTER + ISZ TEMQ + TAD SB + DCA% TEMQ /START BLOCK + ISZ TEMQ + DCA% TEMQ /RELATIVE BLOCK + ISZ TEMQ + TAD NOBLKS + DCA% TEMQ /LENGTH OF FILE + ISZ TEMQ + DCA% TEMQ /STATUS WORD + +USRSL5, CDF CIF 0 + JMP% #USRSE + + +K6, 6 +K7400, 7400 +M200, -200 +M400, -400 +K7, 7 +K5200, 5200 + +LDSRN, DSRN-11 /START LOCATION OF DSRN TABLE + +LHIFLD, 0 +TEMQ, 0 +TEMQ2, 0 +TEMQ3, 0 +LHNDR, 0 +FUNCTX, 0 /STUFFED BY RALF CODE +UNITX, 0 /STUFFED BY RALF CODE +ERRUSR, 0 /READ BY RALF CODE + +#LUSR, ADDR #USR +#HKEY, HKEY /LOCATION OF HKEY IN FRTS + / MUST AGREE WITH VERSION!! +K7774, 7774 +/ + ORG .+177&7600 +/USR CALLING SUBROUTINE FOR FORTRAN +/ +/ THIS ROUTINE IS MOVED TO PAGE 7400 OF THE HIGHEST +/ FIELD BEFORE EXECUTING TO AVOID BEING OVERWRITTEN BY THE USR +/ ROUTINE. NO FILE SPECIFICATIONS OTHER THAN INTERNAL +/ HANDLERS AND SYSTEM DEVICES MAY BE MADE EXTERNAL TO THESE +/ ROUTINES BECAUSE THE USE OF THIS ROUTINE WILL OVERWRITE +/ THE HANDLERS WHICH ARE STORED IN HIGH CORE. +/ +/ +#USR, 0 +/ +/ ENTER WITH FUNCTION CODE IN THE AC +/ 2 - LOOKUP (OPEN FOR INPUT) +/ 3 - ENTER (OPEN FOR OUTPUT) +/ 4 - CLOSE (CLOSE OUTPUT FILE) +/ +/ DEVICE AND FILE NAMES ARE STUFFED BY THE CALLING +/ PROGRAM BEFORE THIS SUBROUTINE IS CALLED. +/ +/ CALLING SEQUENCE: +/ JMS #USR +/ START BLOCK OF FILE (RETURNED FOR CODE 2 & 3) +/ # BLOCKS SUPPLIED IF CODE 4 +/ NUMBER OF BLOCKS IN FILE (RETURNED FOR CODE 2 & 3) +/ ENTRY POINT OF HANDLER AS READ INTO PAGE 5200 +/ +/ +/ AC ON EXIT CONTAINS ERROR CONDITION: +/ 0 - NO ERROR +/ 1 - ILLEGAL DEVICE +/ 2 - ILLEGAL FILE NAME +/ + DCA FUNCTY /SAVE FUNCTION CODE + TAD% #USR /GET # BLOCKS IN CASE CLOSE FUNCTION + DCA #BLKS + + RDF /SET INSTRUCTION FIELD FOR RETURN + TAD #CIF + DCA EXIT4 + CMA /MAKE IT CDF + TAD EXIT4 + DCA EXIT + DCA ERRNO /INITIALIZE ERROR RETURN VARIABLE + CMA + TAD #CIF /-1 IN AC MAKES IT CDF + RIF + DCA .+1 + HLT /SET DATA FIELD TO CURRENT FIELD + +/ ********SWAP CORE FOR USR CALL + +/Note, that it would be much simpler to read in the field +/one tables, and call USR at 17700. Let USR do the swapping. +/We must only set the correct bits in the JSW. + + IOF +#CIF, CIF 0 + JMS% K7607 /CALL SYSTEM HANDLER + 5210 / WRITE 17400-17777,10000-11777 + 7400 + 27 + HLT /DEVICE ERROR + + CIF 0 + JMS% K7607 /READ IN USR + 610 + 0 + 13 /From block 13 + HLT + + CIF 0 + JMS% K7607 /READ IN FIELD ONE TABLES + 210 + 7400 + 37 /From block 37 (where FRTS put it) + HLT + +/ ********PERFORM USR FUNCTIONS + + CIF 10 + JMS% K200 /RESET tables, so it looks like no handlers + 13 + 0 + + TAD K5201 /SET PAGE FOR HANDLER (allow 2 page handler) + DCA ENTRY + CIF 10 + JMS% K200 /FETCH + 1 +DEV, 0 /(STUFFED BY RALF ROUTINE) +DEVNO, 0 +ENTRY, 5201 + JMP ERR /ILLEGAL DEVICE + + TAD #LFILE /SET POINTER TO FILE + TAD KOFSET + DCA LFILE + TAD DEVNO /GET DEVICE NUMBER + CIF 10 + JMS% K200 /PERFORM FUNCTION +FUNCTY, 0 +SB2, +LFILE, 0 +#BLKS, 0 + JMP ERR2 /FILE ERROR + +/ ********RESTORE CORE + +EXIT2, CIF 0 + JMS% K7607 /SAVE FIELD ONE TABLES + 4210 /? Is this really necessary? + 7400 /Since they've already been saved? + 37 /by FRTS + HLT + + CIF 0 /USROUT function would do this + JMS% K7607 /Read in the Stuff we saved + 1210 + 7400 + 27 + HLT + + ION /Is this necessary? +EXIT, HLT + TAD SB2 /RETURN SB & #BLKS + DCA% #USR + ISZ #USR + TAD SB2 + SZA CLA /NON-FILE STRUCTURED DEVICE? + JMP .+3 + CMA /YES - SET MAX NUMBER OF BLOCKS + JMP .+3 + TAD #BLKS + CIA + DCA% #USR + ISZ #USR + TAD ENTRY + DCA% #USR + ISZ #USR + TAD ERRNO +EXIT4, HLT + JMP% #USR + + +K7607, 7607 /SYSTEM HANDLER ENTRY POINT +K200, 200 /USR ENTRY POINT +K5201, 5201 /PAGE FOR HANDLER (& TWO PAGES AVAILABLE) + +ERR2, CLA IAC /ILLEGAL FILE NAME +ERR, IAC /ILLEGAL DEVICE NAME + DCA ERRNO + JMP EXIT2 +ERRNO, 0 + +#LFILE, AND FILE /LOCATION OF FILE ON PAGE 7400 + /'AND' NEEDED TO TRICK ABSOLUTE REFERENCE + /CHECK IN RALF. +KOFSET, 7200 /OFFSET TO REAL EXECUTION ADDRESS +FILE, 0;0;0;0;0;0;0;0;0 +