1 / SUBROUTINE USR (UNIT, NAME, FUNCT, ERROR)
5 / DEPT. RAD. BIOL. & BIOPHYSICS
6 / UNIVERSITY OF ROCHESTER
9 / THIS ROUTINE ALLOWS RUN-TIME DECLARATION OF FILES
10 / IN D.E.C. FORTRAN IV FOR THE PDP-8.
12 / DESCRIPTION OF PARAMETERS:
14 / UNIT - LOGICAL UNIT NUMBER
15 / ONLY NUMBERS 5 THRU 9 ARE ALLOWED.
16 / FEWER LOGICAL UNITS MAY BE ALLOWED DEPENDING
17 / ON CORE AVAILABILITY -- SEE PROGRAMMING NOTE
20 / STORED IN FORMAT 3A6 OR EQUIVALENT.
21 / DEVICE ASSUMED TO BE DSK: IF NOT
22 / EXPLICITLY STATED. THIS PARAMETER MAY
23 / ALSO BE A HOLLERITH LITERAL.
24 / NULL CHARACTERS ('@') AND SPACES
25 / ARE IGNORED IN THIS FIELD.
26 / FUNCT - FUNCTION: 2 - OPEN FILE FOR INPUT
27 / 3 - OPEN FILE FOR OUTPUT
28 / 4 - CLOSE OUTPUT FILE
29 / THE OUTPUT FILE NAME GIVEN FOR A <CLOSE>
30 / MUST AGREE WITH THE CORRESPONDING <OPEN>
31 / FILE NAME FOR THAT UNIT. CLOSING A FILE
32 / WITH 0 BLOCKS OR AN INPUT (FUNCT=2) FILE WILL
33 / DELETE THAT FILENAME FROM THE DIRECTORY.
34 / ERROR - RETURN ERROR CONDITION
37 / 2 - ILLEGAL FILE NAME
38 / 3 - ILLEGAL UNIT NUMBER (CORE EXCEEDED!?)
39 / 4 - ILLEGAL FUNCTION CODE
41 / USER ERRORS MAY TERMINATE EXECUTION UNLESS THE /E
42 / OPTION WAS SPECIFIED TO FRTS. THE FOLLOWING USER
43 / ERRORS FROM <USR> ARE DEFINED:
44 / 0002 - THE USER HAS DEFINED A NON-RESIDENT
45 / DEVICE HANDLER EXTERNAL TO <USR>.
47 / PROGRAMMING NOTE: EACH UNIT IS ASSIGNED 1000(8) LOCATIONS
48 /IN THE HIGHEST FIELD FOR BUFFER AND HANDLER (400 FOR ITS BUFFER
49 /AND 400 FOR ITS HANDLER). THESE LOCATIONS ARE
50 /NOT DYNAMICALLY ALLOCATED BUT ARE USED FOR DEVICE BUFFER AND
51 /HANDLERS ONLY IF THEY ARE NOT USED BY THE
52 /PROGRAM. TO USE CORE MOST EFFICIENTLY FOR LARGE
53 /PROGRAMS, USE THE HIGHEST ORDER UNIT NUMBERS POSSIBLE. THAT IS,
54 /USING UNIT 5 ALLOWS 1000(8) FEWER WORDS FOR SOURCE CODE THAN IF
55 /UNIT 6 WERE THE LOWEST UNIT NUMBER USED.
57 / RESTRICTIONS: BECAUSE <FRTS> LOADS NON-RESIDENT HANDLERS FROM
58 /THE TOP OF CORE DOWN, AND <USR> ALSO USES THAT AREA, THE USER IS NOT
59 /ALLOWED TO MAKE LOAD TIME
60 /I/O UNIT DECLARATIONS TO DEVICES WITH NON-RESIDENT
61 /HANDLERS EXTERNAL TO <USR>. TO DO SO WLL CAUSE A FATAL
62 /USER ERROR 2. IT IS RECOMMENDED, AND GENERALLY
63 /MORE CONVIENENT TO USE INTERNAL HANDLERS AND
64 /DECLARE ALL OTHER FILES AT EXECUTION TIME
65 /WITH CALLS TO THIS SUBROUTINE.
66 /THE USE OF <FRTS> INTERNAL HANDLERS,
67 /SYS:, AND DEVICES CO-RESIDENT WITH SYS: ARE LEGAL,
68 /EVEN IF DEFINED EXTERNAL TO THIS SUBROUTINE.
70 /NOTE: THIS PROGRAM REQUIRES ONE PATCH BE MADE TO
71 / <FRTS> BEFORE IT WILL RUN. IT IS DESCRIBED
74 /MAXCOR=121 /THESE ARE LOCATIONS IN THE RESIDENT PART OF
75 /HGHLOC=123 /<FRTS> AND REQUIRE THE FOLLOWING PATCH BE PLACED
76 /IN FRTS SO THEY WILL BE SET PROPERLY. THE PATCH
77 /DELETES CODE WHICH INITIALIZES SYSTEMS WITH AN
78 /ANALEX PRINTER, SO IF YOU HAVE AN ANALEX ... WATCH OUT.
80 /Note that MAXCOR and HGHLOC are 2 word variables which have been
81 /created for this routine on page 0 of FRTS. If FRTS
82 /is changed to use more page 0 locations, the patch
83 /will have to be changed as well.
86 /12475 7300 CLA CLL /Note, CDF CIF 0 is pending
87 /12476 1311 TAD 12511 /Load address of VAR
88 /12477 3010 DCA 10010 /Store in auto index
89 / 1023 TAD 10023 /Load value of MAX field
90 / 3410 DCA I 10010 /As high order part of MAXCOR
91 / 3410 DCA I 10010 /Zero low order part
92 / 1025 TAD 10025 /Load highest avail. field
93 / 3410 DCA I 10010 /Store high order word
94 / 1026 TAD 10026 /load high address
95 / 3410 DCA I 10010 /Store low order word of HGHLOC
97 / 5766 JMP I 12566 /Start up FPP
99 /12511 120 /ADDRESS-1 of MAXCOR
103 DSRN=4244 /Address of DSRN table in FRTS
108 /NOTE: MUCH OF THIS CODE WAS LIFTED FROM A FORTRAN
109 / GENERATED ASSEMBLY LISTING. ACCEPT THIS AS
110 / AN APOLOGY FOR THE LACK OF COMMENTS IN SOME SECTIONS.
118 #BASE, ORG .+6 /BASE 0 AND 1
119 UNIT, ORG .+3 /BASE 2
120 FUNCT, ORG .+3 /BASE 3
121 ERROR, ORG .+3 /BASE 4
122 #DSK, TEXT +DSK@@@+ /DEFAULT DEVICE NAME
131 PERFLG, F 0.0 /PERIOD FLAG
139 MUNIT, 0027;0;0 /Low unit: Set according to CORE avail.
146 MAXCOR, 3; 0 /RHM: Don't require the FRTS patch.
147 HGHLOC, 7; 3400 /RHM: Hope memory used doesn't get larger.
148 / ADVENT in the current implementation uses up thru 73000 at worst.
149 / This hopefully allows room for extra 2-page handlers and the TD8E ROM.
171 SKIP, /JA SKIP2 AFTER FIRST ENTRY
173 / FIND OUT HOW MANY UNITS TO ALLOW
175 /Note that the original scheme was rather bizzare, and for
176 /humerous purposes, I have left it here, commented out.
177 /This worked OK with the old FPP interpreter, since it zeroed
178 /the exponent with a STARTF. The FPP does not, and the
179 /EXPONENT is left indeterminate. This meant that sometimes
180 /you could use past 72400, and sometimes you couldn't.
181 /(Note, that S.B.'s version of FRTS has been changed
182 /so that the FPP interpreter works the same as the FPP.)
184 / FLDA MAXCOR /Load highest field number
185 / FSUB HGHLOC /Subtract high location
186 / FADD D2400 /1 FIELD LESS 5400 LOCS FOR 5 DEVICES
187 / NOTE: PG. 7600 RESERVED FOR OS/8
188 / PG. 7400 USED FOR OS/8 USR CALL
189 / JGE SKCONT /ROOM FOR 5 DEVICES?
190 / FADD D15000 /Note, FAC= how many locations short
191 / FMUL D1000 /HOW MANY 1000 WORD BLOCKS ARE THERE?
194 / FMUL E30 /ALTHOUGH WE WERE WORKING WITH AN
195 / /INTEGER ABOVE, THE FPP THOUGHT IT
196 / /HAD A BINARY POINT TO THE RT. OF THE
197 / /SIGN BIT. THIS INSTRUCTION EFFECTIVELY
198 / /CHANGES THE NUMBER TO A REAL FPP INTEGER.
199 / FSTA MUNIT /MINIMUM UNIT # ALLOWED
202 /E30, 30;2000;0 /1.E30(2)
204 /The routine should really be modified to check which handlers
205 /are already loaded. This wouldn't be all that difficult,
206 /since the field 1 tables of handler residency are saved on
207 /SYS block 37, and restored each time USR is called. As long
208 /as a reset isn't performed, it should be easy to determine
209 /if a handler is already loaded. Then HGHLOC could be changed
210 /dynamically, as handlers were loaded. The core usage would then
211 /also be independent of the unit number used.
213 FLDA MAXCOR /Load Max field #
214 FADD D7400 /Offset to highest useable address
215 FSUB HGHLOC /Compute locations available
216 LDX 11,1 /Load shift argument
217 ALN 1 /Divide by 1000
218 FSTA MUNIT+1,0 /Store number of units
220 FLDA TEN /Load MAX units+1
221 FSUB MUNIT /Subtract number of units
222 FSTA MUNIT /Store new minimum unit
223 FSUB THREE /Limit min. to three
224 JGE SKCONT /Ok if greater than 2
225 FLDA THREE /Just in case we need to avoid
226 FSTA MUNIT /field boundary problems
230 XTA 0 /GET HIGHEST FIELD
231 FDIV D10X /PUT IT INTO BITS 6-8 OF LO ORDER WORD
233 ATX 0 /LOAD HIGHEST FIELD INTO LHIFLD
234 FADD DCDF /MAKE IT CDF HIFLD
236 ATX 0 /SET LOCATIONS USING IT
239 FADD ONED /MAKE IT CIF HIFLD
244 / CHECK TO MAKE SURE USER DID NOT DECLARE
245 / DEVICE WITH HANDLER EXTERNAL TO THESE ROUTINES.
247 FLDA SKIPJA /SET INSTRUCTION SO THIS CODE
248 FSTA SKIP,0 / EXECUTES ONLY ONCE.
250 FLDA SXDSRN /INITIALIZE SETX INSTRUCTION
252 LDX -11,6 /SET COUNTER (MAX # DSRN ENTRIES)
253 SKCON2, SETX DSRN /STUFFED AND MODIFIED
254 XTA 0 /GET NEXT HANDLER ENTRY POINT
257 JLT SKCON3 /INTERNAL HANDLER, IT'S OK
259 JGT SKCON3 /RESIDENT HANDLER (E.G. SYS:), IT'S OK TOO
260 LDX 2,0 /***SOME OTHER HANDLER***USER ERROR 2
262 TRAP3 #UE /USER ILLEGALLY DECLARED A FILE!
264 SKCON3, FLDA NINED /INCREMENT TO NEXT DSRN ENTRY
268 SKIP2, STARTF /***END OF INITILIZATIN CODE***
270 FCLA /INITIALIZE SOME VARIABLES...
271 FSTA PERFLG /NO PERIODS YET
274 FLDA #DSK /SETUP DEFAULT DEVICE
276 FLDA ONE /FIRST CHARACTER IS # 1
278 FLDA% UNIT /CHECK FOR LEGAL UNIT #
280 JSA #LT / IF (UNIT.LT.MUNIT.OR.UNIT.GT.9) GO TO 900
287 FLDA% FUNCT /CHECK FOR LEGAL FUNCTION CODE
290 JSA #LT / IF (FUNCT.LT.2.OR.FUNCT.GT.4) GO TO 901
299 / PUT DEV:FILE.EXT INTO CORRECT FORMAT FOR USR CALL
302 FSTA I / DO 100 I=1,18
304 #G0002, JSR CGET / CALL CGET (NAME, I, X)
309 FLDA X / IF (X.NE.COLON) GO TO 40
312 FLDA I /COLON MUST BE COLUMN 6 OR BEFORE
315 FLDA FILE /COLON DEFINES DEVICE NAME
323 #40, FLDA X / IF (X.NE.PERIOD) GO TO 60
326 FLDA PERFLG /ONLY ONE PERIOD ALLOWED
328 FLDA SEVEN /SET TO DECODE EXTENSION
334 JEQ #100 /SKIP OVER NULL'S
336 JEQ #100 /SKIP OVER SPACES
337 JSR CPUT / CALL CPUT (FILE, N, X)
346 #100, FLDA I / 100 CONTINUE
354 JNE #101 /FUNCTION = CLOSE ?
356 FLDA% UNIT /YES - END FILE
359 #101, SETX FUNCTX /USR XR TO PASS PARAMETERS
365 TRAP4 #USRSE /TRAP TO THE USR CALLING ROUTINE
367 XTA 2 /GET ERRNO AND RETURN IT
370 #900, FLDA THREE /ILLEGAL UNIT NUMBER!!!
374 #901, FLDA FOUR /ILLEGAL FUNCTION CODE!!!
391 /THIS ROUTINE SETS UP, ON PAGE 7400 OF THE HIGHEST FIELD, A
392 /ROUTINE WHICH CALLS THE OS/8 USR (USER SERVICE ROUTINE).
393 /IT IS NECESSARY TO DO THIS BECAUSE THE FORTRAN IV LOADER
394 /MAY LOAD ANY ROUTINE IN THE RESERVED AREA FOR
395 /THE OS/8 USR (10000 - 11777).
397 / THIS PROGRAM ALSO REQUIRES
398 / THAT 'HKEY' BE THE LOCATION IN <FRTS> AS DEFINED
402 DSRN=4244 /Address of DSRN table in FRTS
405 /IN CASE CLOSE FUNCTION, GET # BLOCKS WRITTEN
408 CLL RTL /MULTIPLY BY 9
411 TAD K6 /OFFSET TO CURRENT BLOCK
412 TAD LDSRN /START OF DSRN TABLE - 11
418 /MOVE USR CALLING ROUTINE TO DEFINED LOCATION
419 / I.E. PROTECT LOCS 10000-11777
421 TAD K7400 /Target address
422 DCA TEMQ /Store for indirect reference
423 TAD #LUSR+1 /Origin address
424 DCA TEMQ2 /Store for indirect reference
425 TAD M200 /Number of words to move
426 DCA TEMQ3 /Store in a counter
427 TAD #LUSR /Load field word
429 CLL RTL /Into right bits
432 DCA .+1 /Store the CDF
433 FUSR, HLT /Set field where USR loads
434 TAD% TEMQ2 /Load routine location
435 FD1, CDF 00 /Set HIGH field
436 DCA% TEMQ /Store location in high field
437 ISZ TEMQ /Bump the pointers
439 ISZ TEMQ3 /And the counters
442 /SET FIELDS AND CALL IT
444 RIF /GET CURRENT FIELD
448 FI1, CIF 00 /Set high field
449 TAD FUNCTX /Load function number
450 JMS% K7400 /Call routine
451 SB, 0 /START BLOCK OF FILE OR LENGTH IF CLOSE
452 NOBLKS, 0 /LENGTH OF FILE
453 ENTPT, 0 /HANDLER ENTRY POINT
454 DCA ERRUSR /SAVE ERROR RETURN VALUE
456 /SETUP TO MOVE DSRN TABLE APPROPRIATELY
459 CLL RTL /MULTIPLY BY 9
465 DCA% TEMQ /DISABLE FILE IN CASE CLOSE FUNCTION
466 CLA CLL CMA RTL /-3 => AC
471 /MOVE HANDLER TO APROPRIATE BUFFER
473 CLA CMA CLL RAL /-2 => AC
476 RTR /UNIT 9 => AC=7000; UNIT 8 => AC=6000
478 DCA LHNDR /LOCATION FOR THIS UNIT'S HANDLER
492 /BUILD UP NEW DSRN TABLE FOR THIS UNIT
496 DCA% TEMQ /ENTRY POINT
498 CLL CML RTL /2 => AC (FORMS CONTROL BIT)
502 DCA% TEMQ /HANDLER CODE WORD
503 TAD K7774 /*K* KLUDGE TO LET FRTS KNOW WHICH
504 AND% TEMQ / HANDLER IS IN CORE
509 DCA% TEMQ /BUFFER ADDRESS & FIELD
512 DCA% TEMQ /CHARACTER POINTER
514 CMA CLL RTL /-3 => AC
515 DCA% TEMQ /CHARACTER COUNTER
518 DCA% TEMQ /START BLOCK
520 DCA% TEMQ /RELATIVE BLOCK
523 DCA% TEMQ /LENGTH OF FILE
525 DCA% TEMQ /STATUS WORD
538 LDSRN, DSRN-11 /START LOCATION OF DSRN TABLE
545 FUNCTX, 0 /STUFFED BY RALF CODE
546 UNITX, 0 /STUFFED BY RALF CODE
547 ERRUSR, 0 /READ BY RALF CODE
550 #HKEY, HKEY /LOCATION OF HKEY IN FRTS
551 / MUST AGREE WITH VERSION!!
555 /USR CALLING SUBROUTINE FOR FORTRAN
557 / THIS ROUTINE IS MOVED TO PAGE 7400 OF THE HIGHEST
558 / FIELD BEFORE EXECUTING TO AVOID BEING OVERWRITTEN BY THE USR
559 / ROUTINE. NO FILE SPECIFICATIONS OTHER THAN INTERNAL
560 / HANDLERS AND SYSTEM DEVICES MAY BE MADE EXTERNAL TO THESE
561 / ROUTINES BECAUSE THE USE OF THIS ROUTINE WILL OVERWRITE
562 / THE HANDLERS WHICH ARE STORED IN HIGH CORE.
567 / ENTER WITH FUNCTION CODE IN THE AC
568 / 2 - LOOKUP (OPEN FOR INPUT)
569 / 3 - ENTER (OPEN FOR OUTPUT)
570 / 4 - CLOSE (CLOSE OUTPUT FILE)
572 / DEVICE AND FILE NAMES ARE STUFFED BY THE CALLING
573 / PROGRAM BEFORE THIS SUBROUTINE IS CALLED.
577 / START BLOCK OF FILE (RETURNED FOR CODE 2 & 3)
578 / # BLOCKS SUPPLIED IF CODE 4
579 / NUMBER OF BLOCKS IN FILE (RETURNED FOR CODE 2 & 3)
580 / ENTRY POINT OF HANDLER AS READ INTO PAGE 5200
583 / AC ON EXIT CONTAINS ERROR CONDITION:
586 / 2 - ILLEGAL FILE NAME
588 DCA FUNCTY /SAVE FUNCTION CODE
589 TAD% #USR /GET # BLOCKS IN CASE CLOSE FUNCTION
592 RDF /SET INSTRUCTION FIELD FOR RETURN
598 DCA ERRNO /INITIALIZE ERROR RETURN VARIABLE
600 TAD #CIF /-1 IN AC MAKES IT CDF
603 HLT /SET DATA FIELD TO CURRENT FIELD
605 / ********SWAP CORE FOR USR CALL
607 /Note, that it would be much simpler to read in the field
608 /one tables, and call USR at 17700. Let USR do the swapping.
609 /We must only set the correct bits in the JSW.
613 JMS% K7607 /CALL SYSTEM HANDLER
614 5210 / WRITE 17400-17777,10000-11777
620 JMS% K7607 /READ IN USR
627 JMS% K7607 /READ IN FIELD ONE TABLES
630 37 /From block 37 (where FRTS put it)
633 / ********PERFORM USR FUNCTIONS
636 JMS% K200 /RESET tables, so it looks like no handlers
640 TAD K5201 /SET PAGE FOR HANDLER (allow 2 page handler)
645 DEV, 0 /(STUFFED BY RALF ROUTINE)
648 JMP ERR /ILLEGAL DEVICE
650 TAD #LFILE /SET POINTER TO FILE
653 TAD DEVNO /GET DEVICE NUMBER
655 JMS% K200 /PERFORM FUNCTION
662 / ********RESTORE CORE
665 JMS% K7607 /SAVE FIELD ONE TABLES
666 4210 /? Is this really necessary?
667 7400 /Since they've already been saved?
671 CIF 0 /USROUT function would do this
672 JMS% K7607 /Read in the Stuff we saved
678 ION /Is this necessary?
680 TAD SB2 /RETURN SB & #BLKS
684 SZA CLA /NON-FILE STRUCTURED DEVICE?
686 CMA /YES - SET MAX NUMBER OF BLOCKS
700 K7607, 7607 /SYSTEM HANDLER ENTRY POINT
701 K200, 200 /USR ENTRY POINT
702 K5201, 5201 /PAGE FOR HANDLER (& TWO PAGES AVAILABLE)
704 ERR2, CLA IAC /ILLEGAL FILE NAME
705 ERR, IAC /ILLEGAL DEVICE NAME
710 #LFILE, AND FILE /LOCATION OF FILE ON PAGE 7400
711 /'AND' NEEDED TO TRICK ABSOLUTE REFERENCE
713 KOFSET, 7200 /OFFSET TO REAL EXECUTION ADDRESS
714 FILE, 0;0;0;0;0;0;0;0;0