148938164cb4028205c221e2939c45090833ee1e
[pdp8.git] / sw / f4 / extra / USR.RA
1 / SUBROUTINE USR (UNIT, NAME, FUNCT, ERROR)
2 / WRITTEN BY:
3 / ROBERT PHELPS
4 / BEHAVIOR LAB
5 / DEPT. RAD. BIOL. & BIOPHYSICS
6 / UNIVERSITY OF ROCHESTER
7 / ROCHESTER, NY 14642
8 /
9 / THIS ROUTINE ALLOWS RUN-TIME DECLARATION OF FILES
10 / IN D.E.C. FORTRAN IV FOR THE PDP-8.
11 /
12 / DESCRIPTION OF PARAMETERS:
13 /
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
18 / BELOW.
19 / NAME - DEV:FILE.EX
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
35 / 0 - NO ERRORS.
36 / 1 - ILLEGAL DEVICE
37 / 2 - ILLEGAL FILE NAME
38 / 3 - ILLEGAL UNIT NUMBER (CORE EXCEEDED!?)
39 / 4 - ILLEGAL FUNCTION CODE
40 /
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>.
46 /
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.
56 /
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.
69 /
70 /NOTE: THIS PROGRAM REQUIRES ONE PATCH BE MADE TO
71 / <FRTS> BEFORE IT WILL RUN. IT IS DESCRIBED
72 / BELOW:
73 /
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.
79
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.
84
85 / FIELD 1; *2475
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
96 / 7000 NOP /?
97 / 5766 JMP I 12566 /Start up FPP
98
99 /12511 120 /ADDRESS-1 of MAXCOR
100
101 EXTERN CGET
102 EXTERN CPUT
103 DSRN=4244 /Address of DSRN table in FRTS
104
105 SECT USR
106 JA #ST
107
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.
111 /
112 #XR, ORG .+10
113 TEXT +USR +
114
115 #RET, SETX #XR
116 SETB #BASE
117 JA .+3
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
123 I, F 0.0 /BASE 6
124 N, F 0.0 /BASE 7
125 ORG #BASE+30
126 FNOP
127 JA #RET
128 FNOP
129 #GOBAK, 0;0
130
131 PERFLG, F 0.0 /PERIOD FLAG
132 X,
133 #TMP, ORG .+3
134 ONE, F 1.0
135 TWO, F 2.0
136 THREE, F 3.0
137 FOUR, F 4.0
138 SEVEN, F 7.0
139 MUNIT, 0027;0;0 /Low unit: Set according to CORE avail.
140 NINE, F 9.0
141 TEN, F 10.0
142 ATEEN, F 18.0
143 COLON, F 58.0
144 PERIOD, F 46.0
145 SPACE, F 32.0
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.
150 #RTN, BASE #BASE
151 JA #GOBAK
152 #ST, STARTD
153 0210
154 FSTA #GOBAK,0
155 0200
156 SETX #XR
157 SETB #BASE
158 LDX 0,1
159 FSTA #BASE
160 FLDA% #BASE,1+
161 FSTA UNIT
162 FLDA% #BASE,1+
163 FSTA NAME
164 FLDA% #BASE,1+
165 FSTA FUNCT
166 FLDA% #BASE,1+
167 FSTA ERROR
168
169 / INITIALIZE PROGRAM
170
171 SKIP, /JA SKIP2 AFTER FIRST ENTRY
172
173 / FIND OUT HOW MANY UNITS TO ALLOW
174
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.)
183
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?
192 / STARTF
193 / FNORM
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
200 /D15000, 1;5000
201 /D1000, 4;0 /0.001
202 /E30, 30;2000;0 /1.E30(2)
203
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.
212
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
219 STARTF
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
227
228 SKCONT, STARTD
229 SETX MAXCOR
230 XTA 0 /GET HIGHEST FIELD
231 FDIV D10X /PUT IT INTO BITS 6-8 OF LO ORDER WORD
232 SETX LHIFLD
233 ATX 0 /LOAD HIGHEST FIELD INTO LHIFLD
234 FADD DCDF /MAKE IT CDF HIFLD
235 SETX FD1
236 ATX 0 /SET LOCATIONS USING IT
237 SETX FD2
238 ATX 0
239 FADD ONED /MAKE IT CIF HIFLD
240 SETX FI1
241 ATX 0
242 SETX #XR
243
244 / CHECK TO MAKE SURE USER DID NOT DECLARE
245 / DEVICE WITH HANDLER EXTERNAL TO THESE ROUTINES.
246
247 FLDA SKIPJA /SET INSTRUCTION SO THIS CODE
248 FSTA SKIP,0 / EXECUTES ONLY ONCE.
249 /
250 FLDA SXDSRN /INITIALIZE SETX INSTRUCTION
251 FSTA SKCON2
252 LDX -11,6 /SET COUNTER (MAX # DSRN ENTRIES)
253 SKCON2, SETX DSRN /STUFFED AND MODIFIED
254 XTA 0 /GET NEXT HANDLER ENTRY POINT
255 SETX #XR
256 FSUB D5200
257 JLT SKCON3 /INTERNAL HANDLER, IT'S OK
258 FSUB D2400
259 JGT SKCON3 /RESIDENT HANDLER (E.G. SYS:), IT'S OK TOO
260 LDX 2,0 /***SOME OTHER HANDLER***USER ERROR 2
261 EXTERN #UE
262 TRAP3 #UE /USER ILLEGALLY DECLARED A FILE!
263 /
264 SKCON3, FLDA NINED /INCREMENT TO NEXT DSRN ENTRY
265 FADDM SKCON2
266 JXN SKCON2,6+
267 /
268 SKIP2, STARTF /***END OF INITILIZATIN CODE***
269 LDX 1,7
270 FCLA /INITIALIZE SOME VARIABLES...
271 FSTA PERFLG /NO PERIODS YET
272 FSTA FILE-0003,7
273 FSTA FILE-0003,7+
274 FLDA #DSK /SETUP DEFAULT DEVICE
275 FSTA DEV
276 FLDA ONE /FIRST CHARACTER IS # 1
277 FSTA N
278 FLDA% UNIT /CHECK FOR LEGAL UNIT #
279 FSUB MUNIT
280 JSA #LT / IF (UNIT.LT.MUNIT.OR.UNIT.GT.9) GO TO 900
281 FSTA #TMP+00
282 FLDA% UNIT
283 FSUB NINE
284 JSA #GT
285 FADD #TMP+00
286 JNE #900
287 FLDA% FUNCT /CHECK FOR LEGAL FUNCTION CODE
288 FSUB TWO
289 EXTERN #LT
290 JSA #LT / IF (FUNCT.LT.2.OR.FUNCT.GT.4) GO TO 901
291 FSTA #TMP+00
292 FLDA% FUNCT
293 FSUB FOUR
294 EXTERN #GT
295 JSA #GT
296 FADD #TMP+00
297 JNE #901
298 /
299 / PUT DEV:FILE.EXT INTO CORRECT FORMAT FOR USR CALL
300 /
301 FLDA ONE
302 FSTA I / DO 100 I=1,18
303
304 #G0002, JSR CGET / CALL CGET (NAME, I, X)
305 JA .+10
306 NAME, JA .
307 JA I
308 JA X
309 FLDA X / IF (X.NE.COLON) GO TO 40
310 FSUB COLON
311 JNE #40
312 FLDA I /COLON MUST BE COLUMN 6 OR BEFORE
313 FSUB SEVEN /7
314 JGE #DONE
315 FLDA FILE /COLON DEFINES DEVICE NAME
316 FSTA DEV
317 FCLA
318 FSTA FILE
319 FLDA ONE
320 FSTA N
321 JA #100
322
323 #40, FLDA X / IF (X.NE.PERIOD) GO TO 60
324 FSUB PERIOD
325 JNE #60
326 FLDA PERFLG /ONLY ONE PERIOD ALLOWED
327 JNE #DONE
328 FLDA SEVEN /SET TO DECODE EXTENSION
329 FSTA PERFLG
330 FSTA N
331 JA #100
332
333 #60, FLDA X
334 JEQ #100 /SKIP OVER NULL'S
335 FSUB SPACE
336 JEQ #100 /SKIP OVER SPACES
337 JSR CPUT / CALL CPUT (FILE, N, X)
338 JA .+10
339 JA FILE
340 JA N
341 JA X
342 FLDA N / N=N+1
343 FADD ONE
344 FSTA N
345
346 #100, FLDA I / 100 CONTINUE
347 FADD ONE
348 FSTA I
349 FSUB ATEEN
350 JLE #G0002
351
352 #DONE, FLDA% FUNCT
353 FSUB FOUR
354 JNE #101 /FUNCTION = CLOSE ?
355 EXTERN #ENDF
356 FLDA% UNIT /YES - END FILE
357 TRAP3 #ENDF
358
359 #101, SETX FUNCTX /USR XR TO PASS PARAMETERS
360 FLDA% FUNCT
361 ATX 0
362 FLDA% UNIT
363 ATX 1
364
365 TRAP4 #USRSE /TRAP TO THE USR CALLING ROUTINE
366
367 XTA 2 /GET ERRNO AND RETURN IT
368 FSTA% ERROR
369 JA #RTN
370 #900, FLDA THREE /ILLEGAL UNIT NUMBER!!!
371 FSTA% ERROR
372 JA #RTN
373
374 #901, FLDA FOUR /ILLEGAL FUNCTION CODE!!!
375 FSTA% ERROR
376 JA #RTN
377 /
378 SKIPJA, JA SKIP2
379 DCDF, 0;CDF
380 ONED, 0;1
381 D10X, 400;0 /0.1
382 D10, 0;10
383 SXDSRN, SETX DSRN
384 NINED, 0;11
385 D5200, 0;5200
386 D2400, 0;2400
387 D7400, 0;7400
388
389 SECT8 #USRSE; 0
390 /
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).
396 /
397 / THIS PROGRAM ALSO REQUIRES
398 / THAT 'HKEY' BE THE LOCATION IN <FRTS> AS DEFINED
399 / BELOW:
400
401 HKEY=2761
402 DSRN=4244 /Address of DSRN table in FRTS
403
404 /
405 /IN CASE CLOSE FUNCTION, GET # BLOCKS WRITTEN
406 /
407 TAD UNITX
408 CLL RTL /MULTIPLY BY 9
409 RAL
410 TAD UNITX
411 TAD K6 /OFFSET TO CURRENT BLOCK
412 TAD LDSRN /START OF DSRN TABLE - 11
413 DCA TEMQ
414 CDF 0
415 TAD% TEMQ
416 DCA SB
417 /
418 /MOVE USR CALLING ROUTINE TO DEFINED LOCATION
419 / I.E. PROTECT LOCS 10000-11777
420 /
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
428 AND K7 /Strip it
429 CLL RTL /Into right bits
430 RAL
431 TAD #CDF
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
438 ISZ TEMQ2
439 ISZ TEMQ3 /And the counters
440 JMP FUSR /Loop on it
441
442 /SET FIELDS AND CALL IT
443
444 RIF /GET CURRENT FIELD
445 TAD #CDF
446 DCA .+1
447 HLT /Set this 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
455
456 /SETUP TO MOVE DSRN TABLE APPROPRIATELY
457
458 TAD UNITX
459 CLL RTL /MULTIPLY BY 9
460 RAL
461 TAD UNITX
462 TAD LDSRN
463 DCA TEMQ
464 #CDF, CDF 0
465 DCA% TEMQ /DISABLE FILE IN CASE CLOSE FUNCTION
466 CLA CLL CMA RTL /-3 => AC
467 TAD FUNCTX
468 SMA SZA CLA /CLOSE?
469 JMP USRSL5 /YES
470
471 /MOVE HANDLER TO APROPRIATE BUFFER
472
473 CLA CMA CLL RAL /-2 => AC
474 TAD UNITX
475 CLL RTR
476 RTR /UNIT 9 => AC=7000; UNIT 8 => AC=6000
477 TAD M400
478 DCA LHNDR /LOCATION FOR THIS UNIT'S HANDLER
479 TAD K5200
480 DCA TEMQ2
481 TAD M400
482 DCA TEMQ3
483 USRL4, CDF 0
484 TAD% TEMQ2
485 FD2, CDF 00
486 DCA% LHNDR
487 ISZ TEMQ2
488 ISZ LHNDR
489 ISZ TEMQ3
490 JMP USRL4
491
492 /BUILD UP NEW DSRN TABLE FOR THIS UNIT
493
494 CDF 0
495 TAD ENTPT
496 DCA% TEMQ /ENTRY POINT
497 ISZ TEMQ
498 CLL CML RTL /2 => AC (FORMS CONTROL BIT)
499 TAD LHNDR
500 TAD M400
501 TAD LHIFLD
502 DCA% TEMQ /HANDLER CODE WORD
503 TAD K7774 /*K* KLUDGE TO LET FRTS KNOW WHICH
504 AND% TEMQ / HANDLER IS IN CORE
505 DCA% #HKEY
506 ISZ TEMQ
507 TAD LHNDR
508 TAD LHIFLD
509 DCA% TEMQ /BUFFER ADDRESS & FIELD
510 ISZ TEMQ
511 TAD LHNDR
512 DCA% TEMQ /CHARACTER POINTER
513 ISZ TEMQ
514 CMA CLL RTL /-3 => AC
515 DCA% TEMQ /CHARACTER COUNTER
516 ISZ TEMQ
517 TAD SB
518 DCA% TEMQ /START BLOCK
519 ISZ TEMQ
520 DCA% TEMQ /RELATIVE BLOCK
521 ISZ TEMQ
522 TAD NOBLKS
523 DCA% TEMQ /LENGTH OF FILE
524 ISZ TEMQ
525 DCA% TEMQ /STATUS WORD
526
527 USRSL5, CDF CIF 0
528 JMP% #USRSE
529
530
531 K6, 6
532 K7400, 7400
533 M200, -200
534 M400, -400
535 K7, 7
536 K5200, 5200
537
538 LDSRN, DSRN-11 /START LOCATION OF DSRN TABLE
539
540 LHIFLD, 0
541 TEMQ, 0
542 TEMQ2, 0
543 TEMQ3, 0
544 LHNDR, 0
545 FUNCTX, 0 /STUFFED BY RALF CODE
546 UNITX, 0 /STUFFED BY RALF CODE
547 ERRUSR, 0 /READ BY RALF CODE
548
549 #LUSR, ADDR #USR
550 #HKEY, HKEY /LOCATION OF HKEY IN FRTS
551 / MUST AGREE WITH VERSION!!
552 K7774, 7774
553 /
554 ORG .+177&7600
555 /USR CALLING SUBROUTINE FOR FORTRAN
556 /
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.
563 /
564 /
565 #USR, 0
566 /
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)
571 /
572 / DEVICE AND FILE NAMES ARE STUFFED BY THE CALLING
573 / PROGRAM BEFORE THIS SUBROUTINE IS CALLED.
574 /
575 / CALLING SEQUENCE:
576 / JMS #USR
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
581 / <RETURN>
582 /
583 / AC ON EXIT CONTAINS ERROR CONDITION:
584 / 0 - NO ERROR
585 / 1 - ILLEGAL DEVICE
586 / 2 - ILLEGAL FILE NAME
587 /
588 DCA FUNCTY /SAVE FUNCTION CODE
589 TAD% #USR /GET # BLOCKS IN CASE CLOSE FUNCTION
590 DCA #BLKS
591
592 RDF /SET INSTRUCTION FIELD FOR RETURN
593 TAD #CIF
594 DCA EXIT4
595 CMA /MAKE IT CDF
596 TAD EXIT4
597 DCA EXIT
598 DCA ERRNO /INITIALIZE ERROR RETURN VARIABLE
599 CMA
600 TAD #CIF /-1 IN AC MAKES IT CDF
601 RIF
602 DCA .+1
603 HLT /SET DATA FIELD TO CURRENT FIELD
604
605 / ********SWAP CORE FOR USR CALL
606
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.
610
611 IOF
612 #CIF, CIF 0
613 JMS% K7607 /CALL SYSTEM HANDLER
614 5210 / WRITE 17400-17777,10000-11777
615 7400
616 27
617 HLT /DEVICE ERROR
618
619 CIF 0
620 JMS% K7607 /READ IN USR
621 610
622 0
623 13 /From block 13
624 HLT
625
626 CIF 0
627 JMS% K7607 /READ IN FIELD ONE TABLES
628 210
629 7400
630 37 /From block 37 (where FRTS put it)
631 HLT
632
633 / ********PERFORM USR FUNCTIONS
634
635 CIF 10
636 JMS% K200 /RESET tables, so it looks like no handlers
637 13
638 0
639
640 TAD K5201 /SET PAGE FOR HANDLER (allow 2 page handler)
641 DCA ENTRY
642 CIF 10
643 JMS% K200 /FETCH
644 1
645 DEV, 0 /(STUFFED BY RALF ROUTINE)
646 DEVNO, 0
647 ENTRY, 5201
648 JMP ERR /ILLEGAL DEVICE
649
650 TAD #LFILE /SET POINTER TO FILE
651 TAD KOFSET
652 DCA LFILE
653 TAD DEVNO /GET DEVICE NUMBER
654 CIF 10
655 JMS% K200 /PERFORM FUNCTION
656 FUNCTY, 0
657 SB2,
658 LFILE, 0
659 #BLKS, 0
660 JMP ERR2 /FILE ERROR
661
662 / ********RESTORE CORE
663
664 EXIT2, CIF 0
665 JMS% K7607 /SAVE FIELD ONE TABLES
666 4210 /? Is this really necessary?
667 7400 /Since they've already been saved?
668 37 /by FRTS
669 HLT
670
671 CIF 0 /USROUT function would do this
672 JMS% K7607 /Read in the Stuff we saved
673 1210
674 7400
675 27
676 HLT
677
678 ION /Is this necessary?
679 EXIT, HLT
680 TAD SB2 /RETURN SB & #BLKS
681 DCA% #USR
682 ISZ #USR
683 TAD SB2
684 SZA CLA /NON-FILE STRUCTURED DEVICE?
685 JMP .+3
686 CMA /YES - SET MAX NUMBER OF BLOCKS
687 JMP .+3
688 TAD #BLKS
689 CIA
690 DCA% #USR
691 ISZ #USR
692 TAD ENTRY
693 DCA% #USR
694 ISZ #USR
695 TAD ERRNO
696 EXIT4, HLT
697 JMP% #USR
698
699
700 K7607, 7607 /SYSTEM HANDLER ENTRY POINT
701 K200, 200 /USR ENTRY POINT
702 K5201, 5201 /PAGE FOR HANDLER (& TWO PAGES AVAILABLE)
703
704 ERR2, CLA IAC /ILLEGAL FILE NAME
705 ERR, IAC /ILLEGAL DEVICE NAME
706 DCA ERRNO
707 JMP EXIT2
708 ERRNO, 0
709
710 #LFILE, AND FILE /LOCATION OF FILE ON PAGE 7400
711 /'AND' NEEDED TO TRICK ABSOLUTE REFERENCE
712 /CHECK IN RALF.
713 KOFSET, 7200 /OFFSET TO REAL EXECUTION ADDRESS
714 FILE, 0;0;0;0;0;0;0;0;0
715