1 / SUBROUTINE USR (UNIT, NAME, FUNCT, ERROR)
7 / DEPT. RAD. BIOL. & BIOPHYSICS
8 / UNIVERSITY OF ROCHESTER
11 / THIS ROUTINE ALLOWS RUN-TIME DECLARATION OF FILES
12 / IN D.E.C. FORTRAN IV FOR THE PDP-8.
14 / DESCRIPTION OF PARAMETERS:
16 / UNIT - LOGICAL UNIT NUMBER
17 / ONLY NUMBERS 5 THRU 9 ARE ALLOWED.
18 / FEWER LOGICAL UNITS MAY BE ALLOWED DEPENDING
19 / ON CORE AVAILABILITY -- SEE PROGRAMMING NOTE
22 / STORED IN FORMAT 3A6 OR EQUIVALENT.
23 / DEVICE ASSUMED TO BE DSK: IF NOT
24 / EXPLICITLY STATED. THIS PARAMETER MAY
25 / ALSO BE A HOLLERITH LITERAL.
26 / NULL CHARACTERS ('@') AND SPACES
27 / ARE IGNORED IN THIS FIELD.
28 / FUNCT - FUNCTION: 2 - OPEN FILE FOR INPUT
29 / 3 - OPEN FILE FOR OUTPUT
30 / 4 - CLOSE OUTPUT FILE
31 / THE OUTPUT FILE NAME GIVEN FOR A <CLOSE>
32 / MUST AGREE WITH THE CORRESPONDING <OPEN>
33 / FILE NAME FOR THAT UNIT. CLOSING A FILE
34 / WITH 0 BLOCKS OR AN INPUT (FUNCT=2) FILE WILL
35 / DELETE THAT FILENAME FROM THE DIRECTORY.
36 / ERROR - RETURN ERROR CONDITION
39 / 2 - ILLEGAL FILE NAME
40 / 3 - ILLEGAL UNIT NUMBER (CORE EXCEEDED!?)
41 / 4 - ILLEGAL FUNCTION CODE
43 / USER ERRORS MAY TERMINATE EXECUTION UNLESS THE /E
44 / OPTION WAS SPECIFIED TO FRTS. THE FOLLOWING USER
45 / ERRORS FROM <USR> ARE DEFINED:
46 / 0002 - THE USER HAS DEFINED A NON-RESIDENT
47 / DEVICE HANDLER EXTERNAL TO <USR>.
49 / PROGRAMMING NOTE: EACH UNIT IS ASSIGNED 1000(8) LOCATIONS
50 /IN THE HIGHEST FIELD FOR BUFFER AND HANDLER (400 FOR ITS BUFFER
51 /AND 400 FOR ITS HANDLER). THESE LOCATIONS ARE
52 /NOT DYNAMICALLY ALLOCATED BUT ARE USED FOR DEVICE BUFFER AND
53 /HANDLERS ONLY IF THEY ARE NOT USED BY THE
54 /PROGRAM. TO USE CORE MOST EFFICIENTLY FOR LARGE
55 /PROGRAMS, USE THE HIGHEST ORDER UNIT NUMBERS POSSIBLE. THAT IS,
56 /USING UNIT 5 ALLOWS 1000(8) FEWER WORDS FOR SOURCE CODE THAN IF
57 /UNIT 6 WERE THE LOWEST UNIT NUMBER USED.
59 / RESTRICTIONS: BECAUSE <FRTS> LOADS NON-RESIDENT HANDLERS FROM
60 /THE TOP OF CORE DOWN, AND <USR> ALSO USES THAT AREA, THE USER IS NOT
61 /ALLOWED TO MAKE LOAD TIME
62 /I/O UNIT DECLARATIONS TO DEVICES WITH NON-RESIDENT
63 /HANDLERS EXTERNAL TO <USR>. TO DO SO WLL CAUSE A FATAL
64 /USER ERROR 2. IT IS RECOMMENDED, AND GENERALLY
65 /MORE CONVIENENT TO USE INTERNAL HANDLERS AND
66 /DECLARE ALL OTHER FILES AT EXECUTION TIME
67 /WITH CALLS TO THIS SUBROUTINE.
68 /THE USE OF <FRTS> INTERNAL HANDLERS,
69 /SYS:, AND DEVICES CO-RESIDENT WITH SYS: ARE LEGAL,
70 /EVEN IF DEFINED EXTERNAL TO THIS SUBROUTINE.
72 /NOTE: THIS PROGRAM REQUIRES ONE PATCH BE MADE TO
73 / <FRTS> BEFORE IT WILL RUN. IT IS DESCRIBED
76 /MAXCOR=121 /THESE ARE LOCATIONS IN THE RESIDENT PART OF
77 /HGHLOC=123 /<FRTS> AND REQUIRE THE FOLLOWING PATCH BE PLACED
78 /IN FRTS SO THEY WILL BE SET PROPERLY. THE PATCH
79 /DELETES CODE WHICH INITIALIZES SYSTEMS WITH AN
80 /ANALEX PRINTER, SO IF YOU HAVE AN ANALEX ... WATCH OUT.
82 /Note that MAXCOR and HGHLOC are 2 word variables which have been
83 /created for this routine on page 0 of FRTS. If FRTS
84 /is changed to use more page 0 locations, the patch
85 /will have to be changed as well.
88 /12475 7300 CLA CLL /Note, CDF CIF 0 is pending
89 /12476 1311 TAD 12511 /Load address of VAR
90 /12477 3010 DCA 10010 /Store in auto index
91 / 1023 TAD 10023 /Load value of MAX field
92 / 3410 DCA I 10010 /As high order part of MAXCOR
93 / 3410 DCA I 10010 /Zero low order part
94 / 1025 TAD 10025 /Load highest avail. field
95 / 3410 DCA I 10010 /Store high order word
96 / 1026 TAD 10026 /load high address
97 / 3410 DCA I 10010 /Store low order word of HGHLOC
99 / 5766 JMP I 12566 /Start up FPP
101 /12511 120 /ADDRESS-1 of MAXCOR
105 DSRN=4244 /Address of DSRN table in FRTS
110 /NOTE: MUCH OF THIS CODE WAS LIFTED FROM A FORTRAN
111 / GENERATED ASSEMBLY LISTING. ACCEPT THIS AS
112 / AN APOLOGY FOR THE LACK OF COMMENTS IN SOME SECTIONS.
120 #BASE, ORG .+6 /BASE 0 AND 1
121 UNIT, ORG .+3 /BASE 2
122 FUNCT, ORG .+3 /BASE 3
123 ERROR, ORG .+3 /BASE 4
124 #DSK, TEXT +DSK@@@+ /DEFAULT DEVICE NAME
133 PERFLG, F 0.0 /PERIOD FLAG
141 MUNIT, 0027;0;0 /Low unit: Set according to CORE avail.
148 MAXCOR, 7; 0 /RHM: Don't require the FRTS patch.
149 HGHLOC, 7; 3400 /RHM: Hope memory used doesn't get larger.
150 / ADVENT in the current implementation uses up thru 73000 at worst.
151 / This hopefully allows room for extra 2-page handlers and the TD8E ROM.
173 SKIP, /JA SKIP2 AFTER FIRST ENTRY
175 / FIND OUT HOW MANY UNITS TO ALLOW
177 /Note that the original scheme was rather bizzare, and for
178 /humerous purposes, I have left it here, commented out.
179 /This worked OK with the old FPP interpreter, since it zeroed
180 /the exponent with a STARTF. The FPP does not, and the
181 /EXPONENT is left indeterminate. This meant that sometimes
182 /you could use past 72400, and sometimes you couldn't.
183 /(Note, that S.B.'s version of FRTS has been changed
184 /so that the FPP interpreter works the same as the FPP.)
186 / FLDA MAXCOR /Load highest field number
187 / FSUB HGHLOC /Subtract high location
188 / FADD D2400 /1 FIELD LESS 5400 LOCS FOR 5 DEVICES
189 / NOTE: PG. 7600 RESERVED FOR OS/8
190 / PG. 7400 USED FOR OS/8 USR CALL
191 / JGE SKCONT /ROOM FOR 5 DEVICES?
192 / FADD D15000 /Note, FAC= how many locations short
193 / FMUL D1000 /HOW MANY 1000 WORD BLOCKS ARE THERE?
196 / FMUL E30 /ALTHOUGH WE WERE WORKING WITH AN
197 / /INTEGER ABOVE, THE FPP THOUGHT IT
198 / /HAD A BINARY POINT TO THE RT. OF THE
199 / /SIGN BIT. THIS INSTRUCTION EFFECTIVELY
200 / /CHANGES THE NUMBER TO A REAL FPP INTEGER.
201 / FSTA MUNIT /MINIMUM UNIT # ALLOWED
204 /E30, 30;2000;0 /1.E30(2)
206 /The routine should really be modified to check which handlers
207 /are already loaded. This wouldn't be all that difficult,
208 /since the field 1 tables of handler residency are saved on
209 /SYS block 37, and restored each time USR is called. As long
210 /as a reset isn't performed, it should be easy to determine
211 /if a handler is already loaded. Then HGHLOC could be changed
212 /dynamically, as handlers were loaded. The core usage would then
213 /also be independent of the unit number used.
215 FLDA MAXCOR /Load Max field #
216 FADD D7400 /Offset to highest useable address
217 FSUB HGHLOC /Compute locations available
218 LDX 11,1 /Load shift argument
219 ALN 1 /Divide by 1000
220 FSTA MUNIT+1,0 /Store number of units
222 FLDA TEN /Load MAX units+1
223 FSUB MUNIT /Subtract number of units
224 FSTA MUNIT /Store new minimum unit
225 FSUB THREE /Limit min. to three
226 JGE SKCONT /Ok if greater than 2
227 FLDA THREE /Just in case we need to avoid
228 FSTA MUNIT /field boundary problems
232 XTA 0 /GET HIGHEST FIELD
233 FDIV D10X /PUT IT INTO BITS 6-8 OF LO ORDER WORD
235 ATX 0 /LOAD HIGHEST FIELD INTO LHIFLD
236 FADD DCDF /MAKE IT CDF HIFLD
238 ATX 0 /SET LOCATIONS USING IT
241 FADD ONED /MAKE IT CIF HIFLD
246 / CHECK TO MAKE SURE USER DID NOT DECLARE
247 / DEVICE WITH HANDLER EXTERNAL TO THESE ROUTINES.
249 FLDA SKIPJA /SET INSTRUCTION SO THIS CODE
250 FSTA SKIP,0 / EXECUTES ONLY ONCE.
252 FLDA SXDSRN /INITIALIZE SETX INSTRUCTION
254 LDX -11,6 /SET COUNTER (MAX # DSRN ENTRIES)
255 SKCON2, SETX DSRN /STUFFED AND MODIFIED
256 XTA 0 /GET NEXT HANDLER ENTRY POINT
259 JLT SKCON3 /INTERNAL HANDLER, IT'S OK
261 JGT SKCON3 /RESIDENT HANDLER (E.G. SYS:), IT'S OK TOO
262 LDX 2,0 /***SOME OTHER HANDLER***USER ERROR 2
264 TRAP3 #UE /USER ILLEGALLY DECLARED A FILE!
266 SKCON3, FLDA NINED /INCREMENT TO NEXT DSRN ENTRY
270 SKIP2, STARTF /***END OF INITILIZATIN CODE***
272 FCLA /INITIALIZE SOME VARIABLES...
273 FSTA PERFLG /NO PERIODS YET
276 FLDA #DSK /SETUP DEFAULT DEVICE
278 FLDA ONE /FIRST CHARACTER IS # 1
280 FLDA% UNIT /CHECK FOR LEGAL UNIT #
282 JSA #LT / IF (UNIT.LT.MUNIT.OR.UNIT.GT.9) GO TO 900
289 FLDA% FUNCT /CHECK FOR LEGAL FUNCTION CODE
292 JSA #LT / IF (FUNCT.LT.2.OR.FUNCT.GT.4) GO TO 901
301 / PUT DEV:FILE.EXT INTO CORRECT FORMAT FOR USR CALL
304 FSTA I / DO 100 I=1,18
306 #G0002, JSR CGET / CALL CGET (NAME, I, X)
311 FLDA X / IF (X.NE.COLON) GO TO 40
314 FLDA I /COLON MUST BE COLUMN 6 OR BEFORE
317 FLDA FILE /COLON DEFINES DEVICE NAME
325 #40, FLDA X / IF (X.NE.PERIOD) GO TO 60
328 FLDA PERFLG /ONLY ONE PERIOD ALLOWED
330 FLDA SEVEN /SET TO DECODE EXTENSION
336 JEQ #100 /SKIP OVER NULL'S
338 JEQ #100 /SKIP OVER SPACES
339 JSR CPUT / CALL CPUT (FILE, N, X)
348 #100, FLDA I / 100 CONTINUE
356 JNE #101 /FUNCTION = CLOSE ?
358 FLDA% UNIT /YES - END FILE
361 #101, SETX FUNCTX /USR XR TO PASS PARAMETERS
367 TRAP4 #USRSE /TRAP TO THE USR CALLING ROUTINE
369 XTA 2 /GET ERRNO AND RETURN IT
372 #900, FLDA THREE /ILLEGAL UNIT NUMBER!!!
376 #901, FLDA FOUR /ILLEGAL FUNCTION CODE!!!
393 /THIS ROUTINE SETS UP, ON PAGE 7400 OF THE HIGHEST FIELD, A
394 /ROUTINE WHICH CALLS THE OS/8 USR (USER SERVICE ROUTINE).
395 /IT IS NECESSARY TO DO THIS BECAUSE THE FORTRAN IV LOADER
396 /MAY LOAD ANY ROUTINE IN THE RESERVED AREA FOR
397 /THE OS/8 USR (10000 - 11777).
399 / THIS PROGRAM ALSO REQUIRES
400 / THAT 'HKEY' BE THE LOCATION IN <FRTS> AS DEFINED
404 DSRN=4244 /Address of DSRN table in FRTS
407 /IN CASE CLOSE FUNCTION, GET # BLOCKS WRITTEN
410 CLL RTL /MULTIPLY BY 9
413 TAD K6 /OFFSET TO CURRENT BLOCK
414 TAD LDSRN /START OF DSRN TABLE - 11
420 /MOVE USR CALLING ROUTINE TO DEFINED LOCATION
421 / I.E. PROTECT LOCS 10000-11777
423 TAD K7400 /Target address
424 DCA TEMQ /Store for indirect reference
425 TAD #LUSR+1 /Origin address
426 DCA TEMQ2 /Store for indirect reference
427 TAD M200 /Number of words to move
428 DCA TEMQ3 /Store in a counter
429 TAD #LUSR /Load field word
431 CLL RTL /Into right bits
434 DCA .+1 /Store the CDF
435 FUSR, HLT /Set field where USR loads
436 TAD% TEMQ2 /Load routine location
437 FD1, CDF 00 /Set HIGH field
438 DCA% TEMQ /Store location in high field
439 ISZ TEMQ /Bump the pointers
441 ISZ TEMQ3 /And the counters
444 /SET FIELDS AND CALL IT
446 RIF /GET CURRENT FIELD
450 FI1, CIF 00 /Set high field
451 TAD FUNCTX /Load function number
452 JMS% K7400 /Call routine
453 SB, 0 /START BLOCK OF FILE OR LENGTH IF CLOSE
454 NOBLKS, 0 /LENGTH OF FILE
455 ENTPT, 0 /HANDLER ENTRY POINT
456 DCA ERRUSR /SAVE ERROR RETURN VALUE
458 /SETUP TO MOVE DSRN TABLE APPROPRIATELY
461 CLL RTL /MULTIPLY BY 9
467 DCA% TEMQ /DISABLE FILE IN CASE CLOSE FUNCTION
468 CLA CLL CMA RTL /-3 => AC
473 /MOVE HANDLER TO APROPRIATE BUFFER
475 CLA CMA CLL RAL /-2 => AC
478 RTR /UNIT 9 => AC=7000; UNIT 8 => AC=6000
480 DCA LHNDR /LOCATION FOR THIS UNIT'S HANDLER
494 /BUILD UP NEW DSRN TABLE FOR THIS UNIT
498 DCA% TEMQ /ENTRY POINT
500 CLL CML RTL /2 => AC (FORMS CONTROL BIT)
504 DCA% TEMQ /HANDLER CODE WORD
505 TAD K7774 /*K* KLUDGE TO LET FRTS KNOW WHICH
506 AND% TEMQ / HANDLER IS IN CORE
511 DCA% TEMQ /BUFFER ADDRESS & FIELD
514 DCA% TEMQ /CHARACTER POINTER
516 CMA CLL RTL /-3 => AC
517 DCA% TEMQ /CHARACTER COUNTER
520 DCA% TEMQ /START BLOCK
522 DCA% TEMQ /RELATIVE BLOCK
525 DCA% TEMQ /LENGTH OF FILE
527 DCA% TEMQ /STATUS WORD
540 LDSRN, DSRN-11 /START LOCATION OF DSRN TABLE
547 FUNCTX, 0 /STUFFED BY RALF CODE
548 UNITX, 0 /STUFFED BY RALF CODE
549 ERRUSR, 0 /READ BY RALF CODE
552 #HKEY, HKEY /LOCATION OF HKEY IN FRTS
553 / MUST AGREE WITH VERSION!!
557 /USR CALLING SUBROUTINE FOR FORTRAN
559 / THIS ROUTINE IS MOVED TO PAGE 7400 OF THE HIGHEST
560 / FIELD BEFORE EXECUTING TO AVOID BEING OVERWRITTEN BY THE USR
561 / ROUTINE. NO FILE SPECIFICATIONS OTHER THAN INTERNAL
562 / HANDLERS AND SYSTEM DEVICES MAY BE MADE EXTERNAL TO THESE
563 / ROUTINES BECAUSE THE USE OF THIS ROUTINE WILL OVERWRITE
564 / THE HANDLERS WHICH ARE STORED IN HIGH CORE.
569 / ENTER WITH FUNCTION CODE IN THE AC
570 / 2 - LOOKUP (OPEN FOR INPUT)
571 / 3 - ENTER (OPEN FOR OUTPUT)
572 / 4 - CLOSE (CLOSE OUTPUT FILE)
574 / DEVICE AND FILE NAMES ARE STUFFED BY THE CALLING
575 / PROGRAM BEFORE THIS SUBROUTINE IS CALLED.
579 / START BLOCK OF FILE (RETURNED FOR CODE 2 & 3)
580 / # BLOCKS SUPPLIED IF CODE 4
581 / NUMBER OF BLOCKS IN FILE (RETURNED FOR CODE 2 & 3)
582 / ENTRY POINT OF HANDLER AS READ INTO PAGE 5200
585 / AC ON EXIT CONTAINS ERROR CONDITION:
588 / 2 - ILLEGAL FILE NAME
590 DCA FUNCTY /SAVE FUNCTION CODE
591 TAD% #USR /GET # BLOCKS IN CASE CLOSE FUNCTION
594 RDF /SET INSTRUCTION FIELD FOR RETURN
600 DCA ERRNO /INITIALIZE ERROR RETURN VARIABLE
602 TAD #CIF /-1 IN AC MAKES IT CDF
605 HLT /SET DATA FIELD TO CURRENT FIELD
607 / ********SWAP CORE FOR USR CALL
609 /Note, that it would be much simpler to read in the field
610 /one tables, and call USR at 17700. Let USR do the swapping.
611 /We must only set the correct bits in the JSW.
615 JMS% K7607 /CALL SYSTEM HANDLER
616 5210 / WRITE 17400-17777,10000-11777
622 JMS% K7607 /READ IN USR
629 JMS% K7607 /READ IN FIELD ONE TABLES
632 37 /From block 37 (where FRTS put it)
635 / ********PERFORM USR FUNCTIONS
638 JMS% K200 /RESET tables, so it looks like no handlers
642 TAD K5201 /SET PAGE FOR HANDLER (allow 2 page handler)
647 DEV, 0 /(STUFFED BY RALF ROUTINE)
650 JMP ERR /ILLEGAL DEVICE
652 TAD #LFILE /SET POINTER TO FILE
655 TAD DEVNO /GET DEVICE NUMBER
657 JMS% K200 /PERFORM FUNCTION
664 / ********RESTORE CORE
667 JMS% K7607 /SAVE FIELD ONE TABLES
668 4210 /? Is this really necessary?
669 7400 /Since they've already been saved?
673 CIF 0 /USROUT function would do this
674 JMS% K7607 /Read in the Stuff we saved
680 ION /Is this necessary?
682 TAD SB2 /RETURN SB & #BLKS
686 SZA CLA /NON-FILE STRUCTURED DEVICE?
688 CMA /YES - SET MAX NUMBER OF BLOCKS
702 K7607, 7607 /SYSTEM HANDLER ENTRY POINT
703 K200, 200 /USR ENTRY POINT
704 K5201, 5201 /PAGE FOR HANDLER (& TWO PAGES AVAILABLE)
706 ERR2, CLA IAC /ILLEGAL FILE NAME
707 ERR, IAC /ILLEGAL DEVICE NAME
712 #LFILE, AND FILE /LOCATION OF FILE ON PAGE 7400
713 /'AND' NEEDED TO TRICK ABSOLUTE REFERENCE
715 KOFSET, 7200 /OFFSET TO REAL EXECUTION ADDRESS
716 FILE, 0;0;0;0;0;0;0;0;0