File: USR.LS of Disk: V50/Source/Source-Listing-FORTRAN-2
(Source file text)
RALF V50A 24-JUL-20 PAGE 1 / 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 <CLOSE> / MUST AGREE WITH THE CORRESPONDING <OPEN> / 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 <USR> ARE DEFINED: / 0002 - THE USER HAS DEFINED A NON-RESIDENT / DEVICE HANDLER EXTERNAL TO <USR>. / / 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 RALF V50A 24-JUL-20 PAGE 1-1 /UNIT 6 WERE THE LOWEST UNIT NUMBER USED. / / RESTRICTIONS: BECAUSE <FRTS> LOADS NON-RESIDENT HANDLERS FROM /THE TOP OF CORE DOWN, AND <USR> 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 <USR>. 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 <FRTS> 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 / <FRTS> BEFORE IT WILL RUN. IT IS DESCRIBED / BELOW: / /MAXCOR=121 /THESE ARE LOCATIONS IN THE RESIDENT PART OF /HGHLOC=123 /<FRTS> 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 00000 1030 JA #ST 00001 0141 /NOTE: MUCH OF THIS CODE WAS LIFTED FROM A FORTRAN / GENERATED ASSEMBLY LISTING. ACCEPT THIS AS RALF V50A 24-JUL-20 PAGE 1-2 / AN APOLOGY FOR THE LACK OF COMMENTS IN SOME SECTIONS. / #XR, ORG .+10 00012 2523 TEXT +USR + 00013 2240 00014 4000 00015 1100 #RET, SETX #XR 00016 0002 00017 1110 SETB #BASE 00020 0023 00021 1030 JA .+3 00022 0024 #BASE, ORG .+6 /BASE 0 AND 1 UNIT, ORG .+3 /BASE 2 FUNCT, ORG .+3 /BASE 3 ERROR, ORG .+3 /BASE 4 00042 0423 #DSK, TEXT +DSK@@@+ /DEFAULT DEVICE NAME 00043 1300 00044 0000 00045 0000 I, F 0.0 /BASE 6 00046 0000 00047 0000 00050 0000 N, F 0.0 /BASE 7 00051 0000 00052 0000 ORG #BASE+30 00053 0040 FNOP 00054 1030 JA #RET 00055 0015 00056 0040 FNOP 00057 0000 #GOBAK, 0;0 00060 0000 00061 0000 PERFLG, F 0.0 /PERIOD FLAG 00062 0000 00063 0000 X, #TMP, ORG .+3 00067 0001 ONE, F 1.0 00070 2000 00071 0000 00072 0002 TWO, F 2.0 00073 2000 00074 0000 00075 0002 THREE, F 3.0 00076 3000 00077 0000 00100 0003 FOUR, F 4.0 00101 2000 00102 0000 00103 0003 SEVEN, F 7.0 00104 3400 00105 0000 00106 0027 MUNIT, 0027;0;0 /Low unit: Set according to CORE avail. 00107 0000 RALF V50A 24-JUL-20 PAGE 1-3 00110 0000 00111 0004 NINE, F 9.0 00112 2200 00113 0000 00114 0004 TEN, F 10.0 00115 2400 00116 0000 00117 0005 ATEEN, F 18.0 00120 2200 00121 0000 00122 0006 COLON, F 58.0 00123 3500 00124 0000 00125 0006 PERIOD, F 46.0 00126 2700 00127 0000 00130 0006 SPACE, F 32.0 00131 2000 00132 0000 00133 0007 MAXCOR, 7; 0 /RHM: Don't require the FRTS patch. 00134 0000 00135 0007 HGHLOC, 7; 3400 /RHM: Hope memory used doesn't get larger. 00136 3400 / ADVENT in the current implementation uses up thru 73000 at worst. / This hopefully allows room for extra 2-page handlers and the TD8E ROM. #RTN, BASE #BASE 00137 1030 JA #GOBAK 00140 0057 00141 0006 #ST, STARTD 00142 0210 0210 00143 6400 FSTA #GOBAK,0 00144 0057 00145 0200 0200 00146 1100 SETX #XR 00147 0002 00150 1110 SETB #BASE 00151 0023 00152 0101 LDX 0,1 00153 0000 00154 6200 FSTA #BASE 00155 0710 FLDA% #BASE,1+ 00156 6202 FSTA UNIT 00157 0710 FLDA% #BASE,1+ 00160 6400 FSTA NAME 00161 0355 00162 0710 FLDA% #BASE,1+ 00163 6203 FSTA FUNCT 00164 0710 FLDA% #BASE,1+ 00165 6204 FSTA ERROR / INITIALIZE PROGRAM SKIP, /JA SKIP2 AFTER FIRST ENTRY / FIND OUT HOW MANY UNITS TO ALLOW RALF V50A 24-JUL-20 PAGE 1-4 /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. 00166 0230 FLDA MAXCOR /Load Max field # 00167 1400 FADD D7400 /Offset to highest useable address 00170 0530 00171 2230 FSUB HGHLOC /Compute locations available 00172 0101 LDX 11,1 /Load shift argument 00173 0011 00174 0011 ALN 1 /Divide by 1000 00175 6400 FSTA MUNIT+1,0 /Store number of units 00176 0107 00177 0005 STARTF 00200 0223 FLDA TEN /Load MAX units+1 00201 2221 FSUB MUNIT /Subtract number of units 00202 6221 FSTA MUNIT /Store new minimum unit 00203 2216 FSUB THREE /Limit min. to three 00204 1010 JGE SKCONT /Ok if greater than 2 00205 0210 00206 0216 FLDA THREE /Just in case we need to avoid 00207 6221 FSTA MUNIT /field boundary problems RALF V50A 24-JUL-20 PAGE 1-5 00210 0006 SKCONT, STARTD 00211 1100 SETX MAXCOR 00212 0133 00213 0030 XTA 0 /GET HIGHEST FIELD 00214 3400 FDIV D10X /PUT IT INTO BITS 6-8 OF LO ORDER WORD 00215 0514 00216 1100 SETX LHIFLD 00217 0161 00220 0020 ATX 0 /LOAD HIGHEST FIELD INTO LHIFLD 00221 1400 FADD DCDF /MAKE IT CDF HIFLD 00222 0510 00223 1100 SETX FD1 00224 0031 00225 0020 ATX 0 /SET LOCATIONS USING IT 00226 1100 SETX FD2 00227 0102 00230 0020 ATX 0 00231 1400 FADD ONED /MAKE IT CIF HIFLD 00232 0512 00233 1100 SETX FI1 00234 0043 00235 0020 ATX 0 00236 1100 SETX #XR 00237 0002 / CHECK TO MAKE SURE USER DID NOT DECLARE / DEVICE WITH HANDLER EXTERNAL TO THESE ROUTINES. 00240 0400 FLDA SKIPJA /SET INSTRUCTION SO THIS CODE 00241 0506 00242 6400 FSTA SKIP,0 / EXECUTES ONLY ONCE. 00243 0166 / 00244 0400 FLDA SXDSRN /INITIALIZE SETX INSTRUCTION 00245 0520 00246 6400 FSTA SKCON2 00247 0252 00250 0106 LDX -11,6 /SET COUNTER (MAX # DSRN ENTRIES) 00251 7767 00252 1100' SKCON2, SETX DSRN /STUFFED AND MODIFIED 00253 4244 00254 0030 XTA 0 /GET NEXT HANDLER ENTRY POINT 00255 1100 SETX #XR 00256 0002 00257 2400 FSUB D5200 00260 0524 00261 1050 JLT SKCON3 /INTERNAL HANDLER, IT'S OK 00262 0273 00263 2400 FSUB D2400 00264 0526 00265 1060 JGT SKCON3 /RESIDENT HANDLER (E.G. SYS:), IT'S OK TOO 00266 0273 00267 0100 LDX 2,0 /***SOME OTHER HANDLER***USER ERROR 2 00270 0002 EXTERN #UE RALF V50A 24-JUL-20 PAGE 1-6 00271 3000 TRAP3 #UE /USER ILLEGALLY DECLARED A FILE! 00272 0000 / 00273 0400 SKCON3, FLDA NINED /INCREMENT TO NEXT DSRN ENTRY 00274 0522 00275 5400 FADDM SKCON2 00276 0252 00277 2160 JXN SKCON2,6+ 00300 0252 / 00301 0005 SKIP2, STARTF /***END OF INITILIZATIN CODE*** 00302 0107 LDX 1,7 00303 0001 00304 0002 FCLA /INITIALIZE SOME VARIABLES... 00305 6212 FSTA PERFLG /NO PERIODS YET 00306 6470 FSTA FILE-0003,7 00307 0341 00310 6570 FSTA FILE-0003,7+ 00311 0341 00312 0205 FLDA #DSK /SETUP DEFAULT DEVICE 00313 6400 FSTA DEV 00314 0254 00315 0214 FLDA ONE /FIRST CHARACTER IS # 1 00316 6207 FSTA N 00317 0602 FLDA% UNIT /CHECK FOR LEGAL UNIT # 00320 2221 FSUB MUNIT 00321 1120 JSA #LT / IF (UNIT.LT.MUNIT.OR.UNIT.GT.9) GO TO 900 00322 0000 00323 6213 FSTA #TMP+00 00324 0602 FLDA% UNIT 00325 2222 FSUB NINE 00326 1120 JSA #GT 00327 0000 00330 1213 FADD #TMP+00 00331 1040 JNE #900 00332 0476 00333 0603 FLDA% FUNCT /CHECK FOR LEGAL FUNCTION CODE 00334 2215 FSUB TWO EXTERN #LT 00335 1120 JSA #LT / IF (FUNCT.LT.2.OR.FUNCT.GT.4) GO TO 901 00336 0000 00337 6213 FSTA #TMP+00 00340 0603 FLDA% FUNCT 00341 2217 FSUB FOUR EXTERN #GT 00342 1120 JSA #GT 00343 0000 00344 1213 FADD #TMP+00 00345 1040 JNE #901 00346 0502 / / PUT DEV:FILE.EXT INTO CORRECT FORMAT FOR USR CALL / 00347 0214 FLDA ONE 00350 6206 FSTA I / DO 100 I=1,18 RALF V50A 24-JUL-20 PAGE 1-7 00351 1130 #G0002, JSR CGET / CALL CGET (NAME, I, X) 00352 0000 00353 1030 JA .+10 00354 0363 00355 1030 NAME, JA . 00356 0355 00357 1030 JA I 00360 0045 00361 1030 JA X 00362 0064 00363 0213 FLDA X / IF (X.NE.COLON) GO TO 40 00364 2225 FSUB COLON 00365 1040 JNE #40 00366 0406 00367 0206 FLDA I /COLON MUST BE COLUMN 6 OR BEFORE 00370 2220 FSUB SEVEN /7 00371 1010 JGE #DONE 00372 0453 00373 0400 FLDA FILE /COLON DEFINES DEVICE NAME 00374 0344 00375 6400 FSTA DEV 00376 0254 00377 0002 FCLA 00400 6400 FSTA FILE 00401 0344 00402 0214 FLDA ONE 00403 6207 FSTA N 00404 1030 JA #100 00405 0445 00406 0213 #40, FLDA X / IF (X.NE.PERIOD) GO TO 60 00407 2226 FSUB PERIOD 00410 1040 JNE #60 00411 0422 00412 0212 FLDA PERFLG /ONLY ONE PERIOD ALLOWED 00413 1040 JNE #DONE 00414 0453 00415 0220 FLDA SEVEN /SET TO DECODE EXTENSION 00416 6212 FSTA PERFLG 00417 6207 FSTA N 00420 1030 JA #100 00421 0445 00422 0213 #60, FLDA X 00423 1000 JEQ #100 /SKIP OVER NULL'S 00424 0445 00425 2227 FSUB SPACE 00426 1000 JEQ #100 /SKIP OVER SPACES 00427 0445 00430 1130 JSR CPUT / CALL CPUT (FILE, N, X) 00431 0000 00432 1030 JA .+10 00433 0442 00434 1030 JA FILE 00435 0344 00436 1030 JA N RALF V50A 24-JUL-20 PAGE 1-8 00437 0050 00440 1030 JA X 00441 0064 00442 0207 FLDA N / N=N+1 00443 1214 FADD ONE 00444 6207 FSTA N 00445 0206 #100, FLDA I / 100 CONTINUE 00446 1214 FADD ONE 00447 6206 FSTA I 00450 2224 FSUB ATEEN 00451 1020 JLE #G0002 00452 0351 00453 0603 #DONE, FLDA% FUNCT 00454 2217 FSUB FOUR 00455 1040 JNE #101 /FUNCTION = CLOSE ? 00456 0462 EXTERN #ENDF 00457 0602 FLDA% UNIT /YES - END FILE 00460 3000 TRAP3 #ENDF 00461 0000 00462 1100 #101, SETX FUNCTX /USR XR TO PASS PARAMETERS 00463 0166 00464 0603 FLDA% FUNCT 00465 0020 ATX 0 00466 0602 FLDA% UNIT 00467 0021 ATX 1 00470 4000 TRAP4 #USRSE /TRAP TO THE USR CALLING ROUTINE 00471 0000 00472 0032 XTA 2 /GET ERRNO AND RETURN IT 00473 6604 FSTA% ERROR 00474 1030 JA #RTN 00475 0137 00476 0216 #900, FLDA THREE /ILLEGAL UNIT NUMBER!!! 00477 6604 FSTA% ERROR 00500 1030 JA #RTN 00501 0137 00502 0217 #901, FLDA FOUR /ILLEGAL FUNCTION CODE!!! 00503 6604 FSTA% ERROR 00504 1030 JA #RTN 00505 0137 / 00506 1030 SKIPJA, JA SKIP2 00507 0301 00510 0000 DCDF, 0;CDF 00511 6201 00512 0000 ONED, 0;1 00513 0001 00514 0400 D10X, 400;0 /0.1 00515 0000 00516 0000 D10, 0;10 RALF V50A 24-JUL-20 PAGE 1-9 00517 0010 00520 1100' SXDSRN, SETX DSRN 00521 4244 00522 0000 NINED, 0;11 00523 0011 00524 0000 D5200, 0;5200 00525 5200 00526 0000 D2400, 0;2400 00527 2400 00530 0000 D7400, 0;7400 00531 7400 SECT8 #USRSE; 0 00000 0000 / /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 <FRTS> AS DEFINED / BELOW: HKEY=2761 DSRN=4244 /Address of DSRN table in FRTS / /IN CASE CLOSE FUNCTION, GET # BLOCKS WRITTEN / 00001 1367 TAD UNITX 00002 7106 CLL RTL /MULTIPLY BY 9 00003 7004 RAL 00004 1367 TAD UNITX 00005 1352 TAD K6 /OFFSET TO CURRENT BLOCK 00006 1360 TAD LDSRN /START OF DSRN TABLE - 11 00007 3362 DCA TEMQ 00010 6201 CDF 0 00011 1762 TAD% TEMQ 00012 3246 DCA SB / /MOVE USR CALLING ROUTINE TO DEFINED LOCATION / I.E. PROTECT LOCS 10000-11777 / 00013 1353 TAD K7400 /Target address 00014 3362 DCA TEMQ /Store for indirect reference 00015 1372 TAD #LUSR+1 /Origin address 00016 3363 DCA TEMQ2 /Store for indirect reference 00017 1354 TAD M200 /Number of words to move 00020 3364 DCA TEMQ3 /Store in a counter 00021 1371 TAD #LUSR /Load field word 00022 0356 AND K7 /Strip it 00023 7106 CLL RTL /Into right bits 00024 7004 RAL 00025 1260 TAD #CDF RALF V50A 24-JUL-20 PAGE 1-10 00026 3227 DCA .+1 /Store the CDF 00027 7402 FUSR, HLT /Set field where USR loads 00030 1763 TAD% TEMQ2 /Load routine location 00031 6201 FD1, CDF 00 /Set HIGH field 00032 3762 DCA% TEMQ /Store location in high field 00033 2362 ISZ TEMQ /Bump the pointers 00034 2363 ISZ TEMQ2 00035 2364 ISZ TEMQ3 /And the counters 00036 5227 JMP FUSR /Loop on it /SET FIELDS AND CALL IT 00037 6224 RIF /GET CURRENT FIELD 00040 1260 TAD #CDF 00041 3242 DCA .+1 00042 7402 HLT /Set this field 00043 6202 FI1, CIF 00 /Set high field 00044 1366 TAD FUNCTX /Load function number 00045 4753 JMS% K7400 /Call routine 00046 0000 SB, 0 /START BLOCK OF FILE OR LENGTH IF CLOSE 00047 0000 NOBLKS, 0 /LENGTH OF FILE 00050 0000 ENTPT, 0 /HANDLER ENTRY POINT 00051 3370 DCA ERRUSR /SAVE ERROR RETURN VALUE /SETUP TO MOVE DSRN TABLE APPROPRIATELY 00052 1367 TAD UNITX 00053 7106 CLL RTL /MULTIPLY BY 9 00054 7004 RAL 00055 1367 TAD UNITX 00056 1360 TAD LDSRN 00057 3362 DCA TEMQ 00060 6201 #CDF, CDF 0 00061 3762 DCA% TEMQ /DISABLE FILE IN CASE CLOSE FUNCTION 00062 7346 CLA CLL CMA RTL /-3 => AC 00063 1366 TAD FUNCTX 00064 7740 SMA SZA CLA /CLOSE? 00065 5350 JMP USRSL5 /YES /MOVE HANDLER TO APROPRIATE BUFFER 00066 7344 CLA CMA CLL RAL /-2 => AC 00067 1367 TAD UNITX 00070 7112 CLL RTR 00071 7012 RTR /UNIT 9 => AC=7000; UNIT 8 => AC=6000 00072 1355 TAD M400 00073 3365 DCA LHNDR /LOCATION FOR THIS UNIT'S HANDLER 00074 1357 TAD K5200 00075 3363 DCA TEMQ2 00076 1355 TAD M400 00077 3364 DCA TEMQ3 00100 6201 USRL4, CDF 0 00101 1763 TAD% TEMQ2 00102 6201 FD2, CDF 00 00103 3765 DCA% LHNDR 00104 2363 ISZ TEMQ2 RALF V50A 24-JUL-20 PAGE 1-11 00105 2365 ISZ LHNDR 00106 2364 ISZ TEMQ3 00107 5300 JMP USRL4 /BUILD UP NEW DSRN TABLE FOR THIS UNIT 00110 6201 CDF 0 00111 1250 TAD ENTPT 00112 3762 DCA% TEMQ /ENTRY POINT 00113 2362 ISZ TEMQ 00114 7126 CLL CML RTL /2 => AC (FORMS CONTROL BIT) 00115 1365 TAD LHNDR 00116 1355 TAD M400 00117 1361 TAD LHIFLD 00120 3762 DCA% TEMQ /HANDLER CODE WORD 00121 1374 TAD K7774 /*K* KLUDGE TO LET FRTS KNOW WHICH 00122 0762 AND% TEMQ / HANDLER IS IN CORE 00123 3773 DCA% #HKEY 00124 2362 ISZ TEMQ 00125 1365 TAD LHNDR 00126 1361 TAD LHIFLD 00127 3762 DCA% TEMQ /BUFFER ADDRESS & FIELD 00130 2362 ISZ TEMQ 00131 1365 TAD LHNDR 00132 3762 DCA% TEMQ /CHARACTER POINTER 00133 2362 ISZ TEMQ 00134 7146 CMA CLL RTL /-3 => AC 00135 3762 DCA% TEMQ /CHARACTER COUNTER 00136 2362 ISZ TEMQ 00137 1246 TAD SB 00140 3762 DCA% TEMQ /START BLOCK 00141 2362 ISZ TEMQ 00142 3762 DCA% TEMQ /RELATIVE BLOCK 00143 2362 ISZ TEMQ 00144 1247 TAD NOBLKS 00145 3762 DCA% TEMQ /LENGTH OF FILE 00146 2362 ISZ TEMQ 00147 3762 DCA% TEMQ /STATUS WORD 00150 6203 USRSL5, CDF CIF 0 00151 5600 JMP% #USRSE 00152 0006 K6, 6 00153 7400 K7400, 7400 00154 7600 M200, -200 00155 7400 M400, -400 00156 0007 K7, 7 00157 5200 K5200, 5200 00160 4233 LDSRN, DSRN-11 /START LOCATION OF DSRN TABLE 00161 0000 LHIFLD, 0 00162 0000 TEMQ, 0 00163 0000 TEMQ2, 0 00164 0000 TEMQ3, 0 RALF V50A 24-JUL-20 PAGE 1-12 00165 0000 LHNDR, 0 00166 0000 FUNCTX, 0 /STUFFED BY RALF CODE 00167 0000 UNITX, 0 /STUFFED BY RALF CODE 00170 0000 ERRUSR, 0 /READ BY RALF CODE 00171 0000 #LUSR, ADDR #USR 00172 0200 00173 2761 #HKEY, HKEY /LOCATION OF HKEY IN FRTS / MUST AGREE WITH VERSION!! 00174 7774 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. / / 00200 0000 #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 / <RETURN> / / AC ON EXIT CONTAINS ERROR CONDITION: / 0 - NO ERROR / 1 - ILLEGAL DEVICE / 2 - ILLEGAL FILE NAME / 00201 3266 DCA FUNCTY /SAVE FUNCTION CODE 00202 1600 TAD% #USR /GET # BLOCKS IN CASE CLOSE FUNCTION 00203 3270 DCA #BLKS 00204 6214 RDF /SET INSTRUCTION FIELD FOR RETURN 00205 1221 TAD #CIF 00206 3330 DCA EXIT4 00207 7040 CMA /MAKE IT CDF 00210 1330 TAD EXIT4 00211 3307 DCA EXIT 00212 3341 DCA ERRNO /INITIALIZE ERROR RETURN VARIABLE RALF V50A 24-JUL-20 PAGE 1-13 00213 7040 CMA 00214 1221 TAD #CIF /-1 IN AC MAKES IT CDF 00215 6224 RIF 00216 3217 DCA .+1 00217 7402 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. 00220 6002 IOF 00221 6202 #CIF, CIF 0 00222 4732 JMS% K7607 /CALL SYSTEM HANDLER 00223 5210 5210 / WRITE 17400-17777,10000-11777 00224 7400 7400 00225 0027 27 00226 7402 HLT /DEVICE ERROR 00227 6202 CIF 0 00230 4732 JMS% K7607 /READ IN USR 00231 0610 610 00232 0000 0 00233 0013 13 /From block 13 00234 7402 HLT 00235 6202 CIF 0 00236 4732 JMS% K7607 /READ IN FIELD ONE TABLES 00237 0210 210 00240 7400 7400 00241 0037 37 /From block 37 (where FRTS put it) 00242 7402 HLT / ********PERFORM USR FUNCTIONS 00243 6212 CIF 10 00244 4733 JMS% K200 /RESET tables, so it looks like no handlers 00245 0013 13 00246 0000 0 00247 1334 TAD K5201 /SET PAGE FOR HANDLER (allow 2 page handler) 00250 3256 DCA ENTRY 00251 6212 CIF 10 00252 4733 JMS% K200 /FETCH 00253 0001 1 00254 0000 DEV, 0 /(STUFFED BY RALF ROUTINE) 00255 0000 DEVNO, 0 00256 5201 ENTRY, 5201 00257 5336 JMP ERR /ILLEGAL DEVICE 00260 1342 TAD #LFILE /SET POINTER TO FILE 00261 1343 TAD KOFSET 00262 3267 DCA LFILE 00263 1255 TAD DEVNO /GET DEVICE NUMBER 00264 6212 CIF 10 RALF V50A 24-JUL-20 PAGE 1-14 00265 4733 JMS% K200 /PERFORM FUNCTION 00266 0000 FUNCTY, 0 SB2, 00267 0000 LFILE, 0 00270 0000 #BLKS, 0 00271 5335 JMP ERR2 /FILE ERROR / ********RESTORE CORE 00272 6202 EXIT2, CIF 0 00273 4732 JMS% K7607 /SAVE FIELD ONE TABLES 00274 4210 4210 /? Is this really necessary? 00275 7400 7400 /Since they've already been saved? 00276 0037 37 /by FRTS 00277 7402 HLT 00300 6202 CIF 0 /USROUT function would do this 00301 4732 JMS% K7607 /Read in the Stuff we saved 00302 1210 1210 00303 7400 7400 00304 0027 27 00305 7402 HLT 00306 6001 ION /Is this necessary? 00307 7402 EXIT, HLT 00310 1267 TAD SB2 /RETURN SB & #BLKS 00311 3600 DCA% #USR 00312 2200 ISZ #USR 00313 1267 TAD SB2 00314 7640 SZA CLA /NON-FILE STRUCTURED DEVICE? 00315 5320 JMP .+3 00316 7040 CMA /YES - SET MAX NUMBER OF BLOCKS 00317 5322 JMP .+3 00320 1270 TAD #BLKS 00321 7041 CIA 00322 3600 DCA% #USR 00323 2200 ISZ #USR 00324 1256 TAD ENTRY 00325 3600 DCA% #USR 00326 2200 ISZ #USR 00327 1341 TAD ERRNO 00330 7402 EXIT4, HLT 00331 5600 JMP% #USR 00332 7607 K7607, 7607 /SYSTEM HANDLER ENTRY POINT 00333 0200 K200, 200 /USR ENTRY POINT 00334 5201 K5201, 5201 /PAGE FOR HANDLER (& TWO PAGES AVAILABLE) 00335 7201 ERR2, CLA IAC /ILLEGAL FILE NAME 00336 7001 ERR, IAC /ILLEGAL DEVICE NAME 00337 3341 DCA ERRNO 00340 5272 JMP EXIT2 00341 0000 ERRNO, 0 00342 0344 #LFILE, AND FILE /LOCATION OF FILE ON PAGE 7400 RALF V50A 24-JUL-20 PAGE 1-15 /'AND' NEEDED TO TRICK ABSOLUTE REFERENCE /CHECK IN RALF. 00343 7200 KOFSET, 7200 /OFFSET TO REAL EXECUTION ADDRESS 00344 0000 FILE, 0;0;0;0;0;0;0;0;0 00345 0000 00346 0000 00347 0000 00350 0000 00351 0000 00352 0000 00353 0000 00354 0000 RALF V50A 24-JUL-20 PAGE 1-16 NO ERRORS 112 SYMBOLS, 2 ABS REFS # C 00000 #BASE 00023 #BLKS 00270 #CDF 00060 #CIF 00221 #DONE 00453 #DSK 00042 #ENDF X 00000 #GOBAK 00057 #GT X 00000 #G0002 00351 #HKEY 00173 #LFILE 00342 #LT X 00000 #LUSR 00171 #MAIN S 00000 #RET 00015 #RTN 00137 #ST 00141 #TMP 00064 #UE X 00000 #USR 00200 #USRSE 8 00355 #XR 00002 #100 00445 #101 00462 #40 00406 #60 00422 #900 00476 #901 00502 ATEEN 00117 CGET X 00000 COLON 00122 CPUT X 00000 DCDF 00510 DEV 00254 DEVNO 00255 DSRN 04244 D10 00516 D10X 00514 D2400 00526 D5200 00524 D7400 00530 ENTPT 00050 ENTRY 00256 ERR 00336 ERRNO 00341 ERROR 00037 ERRUSR 00170 ERR2 00335 EXIT 00307 EXIT2 00272 EXIT4 00330 FD1 00031 FD2 00102 FILE 00344 FI1 00043 FOUR 00100 FUNCT 00034 FUNCTX 00166 FUNCTY 00266 FUSR 00027 HGHLOC 00135 HKEY 02761 I 00045 KOFSET 00343 K200 00333 K5200 00157 K5201 00334 K6 00152 K7 00156 K7400 00153 K7607 00332 K7774 00174 LDSRN 00160 LFILE 00267 LHIFLD 00161 LHNDR 00165 MAXCOR 00133 MUNIT 00106 M200 00154 M400 00155 N 00050 NAME 00355 NINE 00111 NINED 00522 NOBLKS 00047 ONE 00067 ONED 00512 PERFLG 00061 PERIOD 00125 SB 00046 SB2 00267 SEVEN 00103 SKCONT 00210 SKCON2 00252 SKCON3 00273 SKIP 00166 SKIPJA 00506 SKIP2 00301 SPACE 00130 SXDSRN 00520 TEMQ 00162 TEMQ2 00163 TEMQ3 00164 TEN 00114 THREE 00075 TWO 00072 UNIT 00031 UNITX 00167 USR S 00532 USRL4 00100 USRSL5 00150 X 00064