1
0
mirror of synced 2026-01-13 07:19:45 +00:00
2016-01-02 16:39:18 +00:00

3253 lines
80 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/FIP - UWM VERSION 25
/
/COPYRIGHT 1971, 1975 DIGITAL EQUIPMENT CORPORATION
/ MAYNARD, MASSACHUSETTS
/
/EXTENSIVELY MODIFIED AND CORRECTED BY
/ RICHARD BARTLEIN, 1974, 1976
/ UNIVERSITY OF WISCONSIN - MILWAUKEE
/HANDLES ALL NON RESIDENT FILE IOT'S
/RUNS IN EXEC MODE
*0
JMP I .+1
FIP0
RETBK1, RETBKS
LNK01, LNK0
ZDS1, DSWORD /POINTER TO 'FIND' LOCATION IN DIRECTORY
P0004= .
FIDEXP, FIPDEX /FIP DISC EXTENSION (SHIFTED 2 BITS)
C002= .
FILPRP, FILPRO
C0020= .
FIPFLD, 20 /FIELD WE ARE RUNNING IN
*10
INDEX, 0 /ONLY REGISTER AVAILABLE IN FIP FOR INDEXING
/CONSTANTS
P0003, 3
C0005, 5
C0006, 6
P0007, 7
C0010, 10
P0037, 37
P0077, 77
C0200, 200
IFNZRO WRDSEG-400 <GLITCH>
SEGSIZ=. /WRDSEG
C0400, 400
P0777, 777
P1000, 1000
P2000, 2000
C3777, 3777
P5400, 5400
C6603, 6603 /DMAR - DISC READ IOT
C6605, 6605 /DMAW - DISC WRITE IOT
C7000, 7000
C7400, 7400
C7700, 7700
P7770, -10
C7771, -7
C7774, -4
BUFSTA, 0 /BUFFER STATUS, 7777 IF FULL
BUFWRT, 0 /-1, IF BUFFER CHANGED
CORTBA, CORTBL-1
FANFLD, CORTBL-1+2 /PHANTOM FIELD ENTRY
FIBASE, SWDEX+JOBMAX /BASE ADDRESS OF ALLOCATABLE DISC STORAGE
FIUSPC, 0 /SAVED USER PC
FILINK, 0 /SAVED USER EAE MODE, LINK, GT, & SC
FIUSAC, 0 /SAVED USER AC
0 /SAVED USER MQ (IF ANY)
FIACCT, 0 /USER'S ACCOUNT NUMBER
FIJOB, 0 /JOB NUMBER FILE PHANTOM IS REPRESENTING
FIOPTR, 0 /POINTER TO FIELD 0 IOT
GDRETP, 0 /RETRIEVAL POINTER, SET BY GD0 ROUTINE
JOBA, JOB
JOBDAT, CJOBDA
OPNFLG, 0
SATSTA, 0 /SAT STATUS, 7777 IF CHANGED THIS RUN
TABSTA, 0 /TABLE STATUS, 7777 IF CHANGED THIS RUN
WNDREM, 0 /REMAINDER FROM DIVISION BY 7
/GLOBALS TO MONITOR DATA AREA
DEVTBA, DEVTBL
DEVEND, DEVTBE
/POINTERS TO FILE PHANTOM'S INTERNAL TABLES
ENTEND, /END OF ENTRY TABLE
UFDTBL, UTABLE /TABLE OF ALL ACCESSED UFD'S
UFDEND, /TOP OF UFD TABLE
RETTBL, RTABLE /TABLE OF RETRIEVAL INFORMATION FOR ALL ACCESSED UFD'S
ENTTBL, ENTABL-10 /TABLE REFLECTING STATE OF ALL POSSIBLE FILE NUMBERS
BUFFER, SEGBUF /BUFFER FOR DIRECTORY MANIPULATIONS
SATBOT, -SATSIZ /BOTTOM OF STORAGE ALLOCATION TABLE
DEVOVR,
JOBTBA, JOBTBL /END OF FIELD 1 DEVICE ASSIGNMENT TABLE
/SUBROUTINE POINTERS
BLDP1, BLDP /BUILD A POINTER TO RETTBL
BLT= JMS I . /BLOCK TRANSFER
BLT0
CHKACT= JMS I . /CHECK TYPE OF ACCOUNT NUMBER
CHKAC0
CHKPRV= JMS I . /CHECK FOR PRIVILEGE
CHKPV0
CHKSRC= JMS I . /CHECK SOURCE OF FIP CALL
CHKSR0
CL01, CL0 /CLOSE A FILE
CORE= JMS I . /SEARCH THE CORTBL
CORSRC
DE01, DE0 /GET A FREE DIRECTORY ENTRY
DS01, DS0 /DIRECTORY SEARCH
DTE01, DTE0
EBLD0, EBLD /BUILD 'ENTTBL' ENTRY ADDRESS FROM FILE #
ENS01, ENS0 /COUNT NUMBER OF FILE OPENINGS
FGETJT= JMS I . /FIND JOB STATUS-BLOCK WORD ADDRESS
FGETJ0
FIO01, FIPIO /COMMON DISC IO ROUTINE
GD01, GD0 /GET A FILE DIRECTORY ENTRY INTO CORE
GE01, GE0 /GET A DIRECTORY WORD INTO CORE
GETBLK= JMS I . /FETCH A FREE BLOCK
GETB
GETDDB= JMS I . /GET A DEVICE DATA-BLOCK
GETDB0
GETJTA= JMS I . /GET A JOB-STATUS WORD ADDRESS
GETJTB
GTBLO1, GTBLOK
IFN01, IFN0
REBOOT= JMS I . /INITIATE AUTOMATIC SYSTEM RESTART
RBOOT
REL01, REL00
RETBLK= JMS I . /RETURN A FREE-CORE BLOCK
RETB
SATL1, SATLOK /GET A FREE SEGMENT FROM SAT
SATR1, SATREL /RELEASE A SEGMENT IN SAT
SAVBUF= JMS I . /SET 'BUFFER CHANGED' SWITCH
SAVBF0
SCL01, SCL0 /CLEAR A DISC SEGMENT TO ZEROES
TF01, TF0 /FREE AN ENTRY ON UFD TABLE
UC01, UC0 /USER-OWNER FILE CHECK
UFO01, UFO0 /OPEN A UFD
UTS01, UTS0 /SEARCH UFD TABLE FOR PROJ,PROG NUMBER
WAIT= JMP I . /RESCHEDULE
WSCHED
WRT1, WRITE /MAKE SURE THE BUFFER IS EMPTY
FIEXIT, FIX0 /EXIT ROUTINE
LGI201, LGI20 /-1 TO USER AC
/UTILITY ROUTINES
UTPRNU, 0 /USED BY UTS0 ROUTINE TO HAVE THE PTR TO UFD TABLE WHILE SEARCHING
CFH, 0 /THIS LOCATION IS USED FOR TEMP STORAGE BY MANY ROUTINES
CFLD= 6221 /FIP IS IN FIELD 2 ALWAYS
BASWIN, WINBAS /FIELD 1 ADDRESS OF BASIC WINDOW
FIOSTK, 0 /STACK HOLDING IOT LINKAGE
0
0
0
0
0
0
0
FLPARB, 0 /TABLE FOR READ OR WRITE PARAMETER CONSTRUCTION
0
0
0
0
0
OVERLA
0
IFNZRO BILLNG <
LOGACT, -BILLNG /BILLING SYSTEM ACCOUNT NUMBER
>
*200
/FILE PHANTOM START
/FIP'S FIRST JOB IS TO PICK UP THE IOT WHICH IT IS TO PERFORM
/AND THE PARAMETERS WHICH GO ALONG WITH IT. (IF ANY) THESE
/ARE MOVED INTO AN 8-WORD BLOCK CALLED 'FIOSTK' THE FIRST REG-
/ISTER IN THIS BLOCK CONTAINS THE IOT. PARAMETERS FOLLOW
FIP0, CLA CLL
DCA SATSTA /CLEAR SAT STATUS
DCA TABSTA /CLEAR TABLE STATUS
DCA BUFWRT /CLEAR THE 'WRITE BUFFER' SWITCH
/
/***** NOTE!!! IF, FOR ANY REASON, SOME PROGRAM IN THE SYSTEM
/ WRITES INTO ANY UFD (INCLUDING THE MFD), THE FOLLOWING
/ BUFFER STATUS-CHECK 'ISZ' SHOULD BE NOP'ED OUT. THIS WILL
/ HELP PREVENT THE CASE WHERE FIP READS A BLOCK, THE PROGRAM
/ WRITES INTO IT, AND THEN FIP WRITES IT BACK OUT, THUS
/ CLOBBERING WHAT THE PROGRAM JUST WROTE OUT. NOTE THAT THIS
/ COULD HAPPEN IN REVERSE ALSO, THEREBY MESSING UP FIP.
/
/ NOTE ALSO THAT BY DISALLOWING FIP TO 'REMEMBER' WHAT'S IN
/ ITS BUFFER CURRENTLY DOES NOT COMPLETELY PROTECT AGAINST
/ THE ABOVE PROBLEM AND SHOULD NOT BE TAKEN LIGHTLY.
/***** ***** ***** ***** ***** ***** ***** ***** *****
ISZ BUFSTA /IS THERE ANYTHING IN THE BUFFER?
JMP .+4 /NO - JUST CLEAR THE SWITCH
TAD I RDCURA /YES - RE-SET THE ADDRESS BECAUSE IT
JMS I RD301 / MIGHT HAVE BEEN CLOBBERED AT LAST EXIT
CLA CMA /THEN RESET THE SWITCH
DCA BUFSTA
CDF
TAD I JOBA /GLOBAL TO "JOB"
AND P0037
SNA /IS EVERYTHING PROPER?
REBOOT /NO - ERROR *****
DCA FIJOB /SAVE IT
FGETJT /GET THE REGISTER SAVE-AREA ADDRESS
JOBREG
DCA .+4
CIF
BLT /SAVE THE USERS REGISTERS
DATFLD
FITPTR, 0
CFLD
FIUSPC
-5
CHKSRC /WHERE ARE WE COMING FROM?
CHKPRV /A PROGRAM - DOES IT HAVE PRIVILEGE?
JMS I FIPSFC /EITHER 'SI' OR NO PRIVILEGE - CLOSE SPECIAL FILES
FGETJT
JOBLNK /IOT REQUEST WORD
DCA FIOPTR /POINTER TO IOT LINKAGE
DATFLD /CDF FIELD 0
TAD I FIOPTR /PICK UP LINKAGE
AND C7400 /IS IT AN IOT? (IF IT IS, JOBDAT WILL HAVE BITS 0-3 CLEARED)
SNA CLA
JMP FIP2 /IS AN IOT, SO GO MOVE IT INTO FIOSTK (AC IS PARAMETER)
TAD I FIOPTR /IS A POINTER, PICK UP LINKAGE
DCA FIP6 /POINTER TO LINKAGE TABLE
CFLD
CIF
BLT /MOVE IOT PARAMETERS INTO FIOSTK
DATFLD
FIP6, 0
CFLD
FIOSTK /IOT LINKAGE BUFFER
-10
TAD FIOSTK
SPA CLA /WILL THE IOT PARAMETER BLOCK BE NEEDED TO RETURN PARS?
JMP FIP4 /YES, SO DON'T RETURN IT
TAD FIP6
JMS I RETBK1 /RETURN THE IOT PARAMETER BLOCK TO FREE CORE
CLA CLL
DATFLD
DCA I FIOPTR /CLEAR THE 'JOBLNK' POINTER
CFLD
/
/COMES HERE WHEN IOT AND ITS PARAMETERS ARE COMFORTABLY
/NESTLED IN FIOSTK
FIP4, TAD IOTABL
DCA FITPTR /TABLE POINTER
FIP5, ISZ FITPTR /PICK UP IOT FROM TABLE
TAD I FITPTR
SNA /END OF TABLE?
REBOOT /YES - ERROR *****
CIA /NO
TAD FIOSTK /IOT FROM USER
SZA CLA /DISPATCH?
JMP FIP5 /NO
TAD FITPTR /YES - GET THE DISPATCH ADDRESS
TAD IODSPA
DCA FITPTR
TAD I FITPTR
DCA FITPTR
TAD FIOSTK /DOES THIS IOT REQUIRE PARAMETERS TO BE
/RETURNED IN AN IOT PARAMETER BLOCK?
SMA CLA /...IF SO, USER AC CONTAINS A PTR. TO WHERE THEY WILL GO
DCA FIUSAC /CLEAR USER AC
JMP I FITPTR /DISPATCH
/COMES HERE FOR A "SHORT" IOT. SAVED AC IS ONLY PARAMETER
/PUT IT IN FIOSTK+1
FIP2, TAD I FIOPTR /PICK UP IOT
DCA FIOSTK /PLACE ON STACK
TAD FIUSAC /USER ACCUMULATOR
DCA FIOSTK+1 /SIMULATE LINKAGE
CFLD /CHANGE TO CURRENT FIELD
JMP FIP4
/
FIPSFC, PRVCLS
RDCURA, RDCURR /POINTER TO SEGMENT # IN BUFFER
RD301, RD30
IOTABL, . /TABLE OF USER FILE IOT'S
ASD /ASSIGN A DEVICE
REL /RELEASE A DEVICE
REN /RENAME A FILE
OPEN /OPEN A FILE
CLOS /CLOSE A FILE
RFILE /FILE READ (WINDOW MOVE)
PROT /FILE PROTECTION
WFILE /FILE WRITE (WINDOW MOVE)
XOPEN /OPEN A FILE WITH EXCLUSIVE USE
CPASS /CHANGE A USER'S PASSWORD
CRF /CREATE A FILE
EXT /EXTEND A FILE
RED /REDUCE A FILE
FINF /FILE INFORMATION
LIN
LOUT
BCLR /CLEAR ACCOUNT BILLING INFORMATION
0
IODSPA, IODISP-IOTABL-1
/ROUTINE TO GET A DIRECTORY ENTRY INTO CORE
/CALLING SEQUENCE:
/ TAD (INTERNAL FILE NUMBER)
/ JMS GD0
/ RETURN (BUFFER POINTER IN AC, 0=ERROR)
GD0, 0
JMS I EBLD0
DCA GDUFDP
TAD I GDUFDP /RELATIVE POSITION IN UFD TABLE
JMS I BLDP1
DCA GDRETP /POINTER TO UFD RETRIEVAL INFORMATION
ISZ GDUFDP
TAD I GDUFDP /PICK UP ENTRY ADDRESS WITHIN UFD
DCA GD1
TAD GDRETP
JMS I GE01 /GET ENTRY INTO CORE
GD1, 0
JMP I GD0
GDUFDP,
IFN0, 0
TAD FIOSTK+1
AND P0003
DCA FIOSTK+1
TAD FIOSTK+1 /RETURN THE FILE INDEX
JMP I IFN0
PAGE
/THIS HANDLES THE 'OPEN' & 'XOPEN' IOTS.
/THE 'XOPEN' WORKS EXACTLY LIKE THE NORMAL 'OPEN', EXCEPT
/THAT THE USER GAINS EXCLUSIVE USE OVER THE FILE IF HE
/IS ALLOWED TO WRITE IT. NO ONE ELSE MAY OPEN IT WHILE
/HE HAS IT EXCLUSIVELY.
/
/THERE ARE SEVERAL SPECIAL CASES WHICH ARE HANDLED:
/
/A USER NO LONGER NEEDS HIS ACCT # & PASSWORD TO OPEN HIS UFD.
/ALL HE NEEDS IS THE OWNER'S ACCT BE 0001 AND THE FIRST
/WORD OF THE NAME BE 0 OR HIS ACCT #. IF HIS IS A SYSTEM
/ACCOUNT, HE MAY OPEN ANY UFD (EXCEPT THE MFD) BY SETTING
/THE FIRST WORD OF THE NAME TO THE DESIRED ACCOUNT.
/
/EXCEPT WHEN OPENED BY THE SYSTEM MANAGER (0001), ALL UFD'S
/ARE WRITE-PROTECTED REGARDLESS OF THE PROTECTION CODE.
/THIS ALLOWS THESE BITS IN THE MFD TO BE USED FOR DISC QUOTAS.
/
/WHEN AN OPERATOR ACCOUNT TRIES TO OPEN A NON-EXISTENT
/UFD, HE IS RETURNED THE NUMBER OF THE NEXT UFD IN
/THE FOURTH WORD OF HIS OPEN PACKET.
/
/WHEN 'SI' OPENS A FILE FROM THE SYSTEM LIBRARY WHICH
/HAS THE ".SVP" EXTENSION, WE SET THE "JSPRIV" BIT IN
/THE USER'S JOB-STATUS WORD. THIS ALLOWS ONLY CERTAIN
/SYSTEM PROGRAMS TO USE THE "PEEK" IOT, THUS PREVENTING
/USERS FROM EXAMINING SYSTEM KEYBOARD BUFFERS AND
/STEALING PASSWORDS.
/
/A USER (OTHER THAN ACCOUNT 1 OR 7) CAN ONLY OPEN A FILE
/OWNED BY THE BILLING SYSTEM (ACCOUNT 7) IF HE IS RUNNING
/A PROGRAM WHICH ENABLES HIS 'JSPRIV' BIT. CHANGING THE
/PROGRAM (THUS CLEARING PRIVILEGE) DISALLOWS ANY FURTHER
/I-O TO A PRIVILEGED FILE AND FORCES THE FILE CLOSED AT THE
/NEXT CALL TO 'FIP'.
/
/THE SYSTEM MANAGER AND, IF CONFIGURED, THE BILLING SYSTEM
/ACCOUNT MAY OPEN ANY FILE IN THE SYSTEM AS IF THEY OWNED IT.
/NOTE THAT THIS IS ONLY NECESSARY FOR DELETING OTHER USERS'
/FILES WHEN BILLING OR REMOVING AN ACCOUNT NUMBER.
/
/THE SYSTEM LIBRARY FILE "BASIC" IS GIVEN ITS OWN PRIVATE
/RETRIEVAL WINDOW IN FIELD 1 ONLY IF IT IS WRITE-PROTECTED
/AND IT IS NOT TOO LARGE FOR THIS FIXED WINDOW.
/
/ANY NUMBER OF USERS MAY NOW READ-WRITE THE SAME FILE
/SIMULTANEOUSLY PROVIDING THAT NO ATTEMPTS ARE MADE
/TO EXTEND OR REDUCE THE FILE. OBVIOUSLY, PROGRAMS
/SHARING DATA FILES MUST USE SOME METHOD OF ENSURING
/GRACEFUL FILE HANDLING.
/
OPNACT= FIOSTK+6
OPNBUF= FIOSTK+7
/
XOPN0, CLA CLL CML RAR /SET THE 'EXCLUSIVE USE' BIT
OPN0, DCA XOPNSW
JMS I IFN01 /CHECK FOR A LEGAL FILE #
JMS I CL01 /CLOSE THE FILE IF ANY OPEN
TAD FIOSTK+2
SNA /IS IT ASSUMED TO BE THIS USER'S FILE?
TAD FIACCT /YES - FILL IT IN
DCA OPNACT
CLA CMA
TAD OPNACT
SZA CLA /IS IT A FILE-DIRECTORY?
JMP OPN2 /NO
/
/HE WANTS TO OPEN A DIRECTORY - WE CHECK TO SEE IF
/THE DIRECTORY HE WANTS IS HIS OR, IF NOT, IF HE
/IS THE MANAGER OR OTHER SYSTEM PERSONNEL OR THE
/BILLING SYSTEM ACCOUNT.
TAD FIOSTK+3
SNA /IS IT ASSUMED TO BE HIS OWN?
TAD FIACCT /YES - SET IT
DCA FIOSTK+3
TAD FIACCT
CIA
TAD FIOSTK+3
SNA CLA /IS IT HIS OWN UFD?
JMP OPN1 /YES
CLA CLL CMA RAL
TAD FIOSTK+3
SNA /IS IT THE LIBRARY UFD?
JMP OPN1 /YES - ANYONE CAN READ THAT
IAC
SNA CLA /NO - IS IT THE MFD?
JMP OPNER2 /YES - "PROTECTION VIOLATION"
CHKACT /IS THIS THE MANAGER OR BILLING SYSTEM?
JMP OPN1 /YES - THEY GET ANYTHING ELSE
TAD FIACCT
AND C7700
SZA CLA /IS THIS A SYSTEM OPERATOR OR MANAGER?
JMP OPNER2 /NO - "PROTECTION VIOLATION"
OPN1, CLA CMA /SET NON-ZERO FOR ONE-WORD SEARCH
OPN2, DCA OPNTYP / OF FILE-DIRECTORY
TAD FIOSTK+3
SNA CLA /IS IT A NULL FILENAME?
JMP OPNER1 /YES - "FILE NOT FOUND"
TAD OPNACT
JMS I UFO01 /OPEN THE OWNER'S UFD
JMP OPNER1 /NO SUCH USER - "FILE NOT FOUND"
TAD XOPNSW /ADD IN THE 'EXCLUSIVE USE' BIT (4000)
DCA XOPNSW / & SAVE FOR FIRST WORD OF 'ENTTBL' ENTRY
TAD XOPNSW
JMS I BLDP1 /GET THE 'RETTBL' ENTRY ADDRESS
DCA FIOSTK+2
TAD OPNTYP /NOW GET THE SEARCH-TYPE AND DO
JMS I DS01 / A 1- OR 3-WORD DIRECTORY SEARCH
FIOSTK+2
JMP OPNER0 /NO FIND - "FILE NOT FOUND"
TAD P0004
DCA OPNBUF /SAVE THE POINTER TO THE PROTECT-WORD
/
/HERE WE FIGURE OUT THE TYPE OF ACCOUNT THIS USER
/HAS & THEN SEE IF THE FILE IS PROTECTED AGAINST THAT
/TYPE OF ACCESS.
TAD OPNTYP
SZA CLA /WAS THIS AN OPEN OF A 'UFD'?
JMP OPN3 /YES - ONLY MANAGER #1 CAN WRITE THEM
JMS I OPNPRT /CALCULATE THE PROTECTION CHECK-MASK
DCA OPNFLG
TAD OPNFLG /'AND' THE PROTECTION-CODE TO THE LOW-
AND P0007 / ORDER 3 BITS OF THE MASK
AND I OPNBUF
SZA CLA /IS THE FILE READ PROTECTED?
JMP OPNER2 /YES - "PROTECTION VIOLATION"
TAD OPNFLG /NO - CHECK FOR 'WRITE-PROTECT'
CLL RAL
AND I OPNBUF
SNA CLA /IS IT WRITE-PROTECTED?
JMP OPN4 /NO
OPN3, TAD OPNTYP
TAD FIACCT
SNA CLA /IS THIS THE MANAGER #1 OPENING A UFD?
JMP OPN4 /YES - HE MUST BE ALLOWED TO WRITE IT
TAD XOPNSW
SPA CLA /DOES THE USER WANT EXCLUSIVE USE?
JMP OPNER2 /YES, TOO BAD - "PROTECTION VIOLATION"
TAD P0004 /NO - SET 'PROTECTED' BIT
OPN4, DCA OPNFLG
TAD OPNACT
TAD LOGACT
SNA CLA /WAS THIS AN ACCOUNT #7 (BILLING ACCOUNT) FILE?
CHKACT /YES - IS THIS A MERE ORDINARY USER?
JMP .+4 /NO
CHKPRV /YES - IS HE RUNNING WITH PRIVILEGE?
JMP OPNER2 /NO - ACCOUNT 7 FILES ARE SPECIAL - "PROTECTION VIOLATION"
ISZ OPNFLG /SET THE 'SPECIAL FILE' BIT IN THE CONTROL BLOCK
TAD I ZDS1 /GET THE SEARCH-FIND ADDRESS
DCA .+3
TAD FIOSTK+2
JMS I ENS01 /NOW CHECK FOR OTHER OPENINGS
OPNTYP, 0
SNA CLA /ANYONE ELSE HAVE IT OPEN?
JMP OPN5 /NO
CLA CLL CMA CML
TAD I OPNFND /YES - GET THE LAST 'FIND' ENTRY (IN 'ENTTBL')
DCA CFH
TAD I CFH
TAD XOPNSW
SPA SZL CLA /DOES SOMEONE ELSE HAVE 'EXCL. USE' OR DO WE WANT IT?
JMP OPNER3 /YES, TOO BAD - "ANOTHER USER HAS FILE"
OPN5, TAD FIOSTK+1 /WE HAVE THE FILE - NOW FILL IN THE
JMS I EBLD0 / 'ENTTBL' ENTRY
DCA CFH
TAD XOPNSW /FIRST THE 'UFDTBL' INDEX &
DCA I CFH / THE 'EXCLUSIVE USE' BIT
ISZ CFH
TAD I ZDS1 /THEN THE UFD ENTRY-ADDRESS
DCA I CFH
JMP I .+1 / AND GO DO THE BOOKKEEPING
OPN6
/COMES HERE TO RETURN VARIOUS ERROR STATUSES.
OPNER0, CHKSRC /IS THIS 'OPEN' FROM 'SI'?
TAD OPNTYP /NO - WAS IT A PROGRAMMATIC OPEN OF A 'UFD'?
SZA CLA /WAS THIS A DIRECTORY OPEN?
JMP I OPNR0A /YES - RETURN THE NEXT UFD NUMBER
/NO - JUST RETURN THE ERROR CODE
OPNER1, CLA CLL CML RAR /7000 = "FILE NOT FOUND"
OPNER2, CLL CML RAR /6000 = "PROTECTION VIOLATION"
SKP
OPNER3, TAD P1000 /4400 = "ANOTHER USER HAS FILE OPEN"
CLL CML RAR
OPNEXT, DCA FIUSAC /SET (OR CLEAR) HIS AC
DATFLD
TAD I FIOPTR
JMS I RETBK1 /RETURN THE PARAMETER BLOCK
JMP I FIEXIT /THEN EXIT FIP
/
OPNFND, ENSFND /LOC. OF LAST 'FIND' IN ENS0
OPNPRT, OPNPR0 /CALCULATE CHECK-MASK
OPNR0A, OPNR01
XOPNSW, 0
PAGE
/
/NOW WE CAN OPEN THE FILE - JUST BUILD THE FILE CONTROL-
/BLOCK AND THE SEGMENT RETRIEVAL WINDOW.
OPN6, CLA CMA
DCA TABSTA /REMEMBER TO SAVE THE TABLES
JMS I OPNPRV /CHECK TO SEE IF THE 'PRIVILEGE' BIT GETS SET
ISZ OPNBUF
TAD I OPNBUF /GET THE FILE SIZE (FOR BASIC CHECK)
DCA OPNSIZ
ISZ OPNBUF
ISZ OPNBUF
TAD I OPNBUF /GET THE RETRIEVAL WINDOW ADDRESS
DCA .+3
TAD FIOSTK+2
JMS I GE01 /NOW READ IN THE FIRST WINDOW
0
DCA OPNWND / AND SAVE ITS IN-CORE ADDRESS
TAD FIOSTK+1
TAD OPNJF0 /FIND THE FILE STATUS WORD
DCA .+2
FGETJT / & GET ITS ADDRESS
OPNPTR, 0
JMS I GTBLO1 /THEN GET A LINKED-BLOCK FOR FILE CONTROL
DCA OPNBUF / (POINTS TO WINDOW-ADDRESS)
CLA CLL CML RTL /GET THE PROTECTION-WORD LOCATION
TAD OPNBUF
DCA CFH
TAD OPNFLG / AND SET THE PROTECTION-WORD IN THE BLOCK
DCA I CFH / 0=READ/WRITE; 4=READ ONLY
/
/NOW WE CHECK TO SEE IF THIS IS BASIC AND SHOULD HAVE ITS
/OWN PRIVATE RETRIEVAL WINDOW.
TAD FIOSTK+3
TAD OPNBAS
SZA CLA / "BA"?
JMP OPN11 /NO
CLA CLL CMA RAL
TAD OPNACT
SNA CLA /IS IT FROM THE SYSTEM LIBRARY?
TAD FIOSTK+4 /YES
TAD OPNBAS+1
SNA CLA / "BASI"?
TAD FIOSTK+5
TAD OPNBAS+2
SNA CLA / "BASIC "?
TAD OPNFLG
SNA CLA /YES - CAN HE ALTER IT?
JMP OPN11 /YES - NO SPECIAL WINDOW
TAD OPNSIZ
TAD BASWIN
SMA CLA /NO - IS IT TOO LARGE?
JMP OPN10 /YES - INVALIDATE THE SPECIAL WINDOW
/
/HERE WE BUILD THE SPECIAL WINDOW FOR BASIC. NOTE THAT WHEN BASIC
/IS TOO LARGE FOR THE WINDOW, WE INVALIDATE IT. TO INSURE THAT
/THE SPECIAL WINDOW REFLECTS ANY CHANGES, WE ALWAYS REBUILD
/IT, SINCE WE (CURRENTLY) HAVE NO GRACEFUL WAY OF DETECTING
/A LONE USER CHANGING THE SIZE (SEVERAL USERS MAY NOW WRITE
/INTO A FILE SIMULTANEOUSLY).
CFLD
TAD BASWIN /NO - SET THE WINDOW POINTER
DCA OPNPTR
OPN7, TAD OPNWND / AND THE RETRIEVAL-BLOCK BUFFER-ADDRESS
DCA INDEX
TAD C7771
DCA CFH /SET THE SEGMENT/BLOCK COUNT (-7)
OPN8, TAD I INDEX /NOW GET A SEGMENT NUMBER
SNA /AT THE END OF THE SEGMENTS?
JMP OPN9 /YES
ISZ OPNPTR /NO - INCREMENT THE WINDOW POINTER
SKP
HLT /OOPS!! ERROR IN SIZE CHECK *****
DATFLD
DCA I OPNPTR /PLOP THE SEGMENT NUMBER INTO THE WINDOW
CFLD
ISZ CFH /INCREMENT COUNT
JMP OPN8 / & CONTINUE
TAD I OPNWND /GET THE NEXT BLOCK ADDRESS
SNA /ARE WE DONE?
JMP OPN9 /YES
DCA .+3 /NO - SET NEXT ENTRY ADDRESS
TAD FIOSTK+2
JMS I GE01 /NOW GET THE NEXT WINDOW IN CHAIN
OPNSIZ, 0
DCA OPNWND / & SAVE ITS CORE-ADDRESS
JMP OPN7 /OK - KEEP MOVING SEGMENT NUMBERS
OPN9, DATFLD
CLA CMA /ALL DONE - SET THE 'SET UP' SWITCH
DCA I BASWIN
SKP
DCA I OPNPTR /CLEAR THE REST OF THE SPECIAL WINDOW
ISZ OPNPTR
JMP .-2
TAD BASWIN /SET THE WINDOW ADDRESS IN THE
DCA I OPNBUF / FILE CONTROL-BLOCK
JMP OPN12 /NOW FINISH UP
/
/HERE WE FETCH A FREE-CORE BLOCK AND COPY THE FIRST WINDOW
/INTO IT.
OPN10, DCA I BASWIN /CLEAR THE BASIC WINDOW FLAG
OPN11, TAD OPNBUF /GET THE WINDOW-ADDRESS POINTER
JMS I GTBLO1 / & AND LINK A BLOCK TO IT
DCA OPNPRW
CFLD
CIF
BLT /NOW COPY OVER THE WINDOW
CFLD
OPNWND, 0 /SOURCE
DATFLD
OPNPRW, 0 /DESTINATION
-10 /WORD-COUNT
/
/ALL DONE - NOW JUST INCREMENT THE UFD-USAGE COUNT & EXIT.
OPN12, CFLD
CLA CMA
TAD I UTPRNU /INDICATE OUR UFD-USAGE
DCA I UTPRNU
JMP I .+1 /GO CLEAN UP & EXIT
OPNEXT
/
OPNJF0, JOBF0
OPNPRV, OPNPV0
OPNBAS, -4241 / (-) "BASIC " IN TSS/8 6-BIT
-6351
-4300
/
/SUBROUTINE TO CALCULATE THE PROTECTION CHECK-MASK. THIS
/IS BASED ON WHO THE FILE OWNER IS COMPARED TO WHO IS
/REQUESTING THE FILE.
OPNPR0, 0
TAD OPNACT
CIA
TAD FIACCT
SZA CLA /IS IT HIS OWN FILE?
CHKACT /NO - IS THIS A PRIVILEGED USER?
JMP OPNPR1 /YES - HE OWNS EVERYTHING
TAD OPNACT /NO - GET THE OWNER'S PROJECT
AND C7700
CIA
DCA OPNPRW
TAD FIACCT / AND THE REQUESTOR'S PROJECT
AND C7700
TAD OPNPRW
SNA CLA /DO THE PROJECT NUMBERS MATCH?
TAD P0003 /YES - MASK = 4
CLL IAC /NO - MASK = 1
SKP
OPNPR1, TAD C0010 /OWNS FILE - MASK = 10
JMP I OPNPR0 /RETURN WITH AC = MASK
PAGE
/ROUTINE TO CLOSE A FILE
CLS0, DCA CLSIFN /INTERNAL FILE NUMBER
TAD C7774
DCA CLCNTR /COUNTER FOR BIT SCAN
CLS1, TAD FIOSTK+1 /PICK UP BIT PATTERN
RAL
DCA FIOSTK+1
SNL /BIT SET FOR THIS FILE #?
JMP .+3
TAD CLSIFN /YES - GET THE FILE #
JMS CL0 / AND CLOSE IT
ISZ CLSIFN /NEXT FILE NUMBER
ISZ CLCNTR /DONE ALL FOUR?
JMP CLS1 /NO, KEEP AT IT
JMP I FIEXIT /THROUGH
CLSIFN, 0
CLCNTR, 0
/ROUTINE TO DO ACTUAL FILE CLOSE
CL0, 0
JMS I EBLD0
DCA ENR0 /SAVE THE 'ENTTBL' POINTER
TAD CFH
JMS I LNK01 /RETURNS WITH PTR. TO FILE CONTROL BLOCK FROM JOB STATUS BLOCK
SNA
JMP CL3 /FILE WAS NOT OPEN
DCA ENR1 /SAVE IT
DCA I CFH /CLEAR POINTER TO FILE CONTROL BLOCK---INDICATES FILE CLOSED
CFLD /SET DATA FIELD TO THIS FIELD
TAD ENR1 /POINTER TO PARAMETER BLOCK
JMS I RETBK1 /RETURN THE CONTROL-BLOCK
DCA ENR1
TAD ENR1 /GET THE RETRIEVAL-WINDOW ADDR.
CIA
TAD BASWIN
SNA CLA /IS IT THE SPECIAL BASIC WINDOW?
JMP .+3 /YES - DON'T FREE IT
TAD ENR1 /NO - RETURN IT TO FREE-CORE
JMS I RETBK1
CLA CLL CMA
TAD I ENR0 /RELATIVE POINTER TO UFD RETRIEVAL TABLE
CLL RAL / * 2 (AND ZAP 'EXCLUSIVE USE' BIT)
IAC
TAD UFDTBL
DCA CLUFDP /POINTER TO ACCESS COUNTER
DCA I ENR0 /CLEAR PTR. IN ENTTBL TO INDICATE FILE IS CLOSED
CLA CMA
DCA TABSTA /SET TABLE STATUS TO WRITE OUT
ISZ I CLUFDP /REMOVE THIS JOB FROM ACCESS COUNT IN UFDTBL
JMP I CL0
/THIS WAS THE ONLY GUY USING THIS UFD, SO CLOSE IT OUT
CLA CMA /NO ONE IS NOW ACCESSING THIS UFD
TAD CLUFDP
JMS I TF01 /FREE A TABLE ENTRY
JMP I CL0
CL3, CFLD
JMP I CL0
CLUFDP, 0
/FIND THE NUMBER OF PEOPLE ACCESSING THIS FILE
/SKIPS IF EXACTLY ONE USER IS
ENR0, 0
TAD FIOSTK+1
JMS I EBLD0
DCA ENR1 /PTR. INTO ENTTBL
ISZ ENR1
TAD I ENR1 /GET ADDRESS IN UFD
DCA ENR1
TAD GDRETP /RTABLE
JMS I ENS01 /HOW MANY PEOPLE HAVE THIS FILE OPEN?
ENR1, 0
CIA /RETURNS WITH # OF PEOPLE WHO HAVE THIS FILE OPEN
CMA
SNA CLA /IS THE PERSON TRYING TO CHANGE THE FILE THE
ISZ ENR0 /...ONLY ONE WHO HAS IT OPEN?
JMP I ENR0 /YES, SO SKIP
/CHANGE THE PROTECTION OF A FILE
PRT0, TAD FIOSTK+1 /PICK UP INTERNAL FILE NUMBER
RTR
RTR
RAR
AND P0003 /AND OFF PROTECTION BITS
DCA PRIFNU /INTERNAL FILE NUMBER
TAD PRIFNU
JMS I UC01 /CHECK TO SEE IF USER IS OWNER
JMP PRT1 /ERROR RETURN, USER IS NOT OWNER
TAD PRIFNU
JMS I GD01 /GET THIS DIRECTORY ENTRY INTO CORE
SNA
HLT /WHOOPS - ERROR *****
TAD P0004
DCA PRENTP /POINTER TO PROTECTION BITS OF THIS FILE
TAD C7637
AND FIOSTK+1 /PICK UP NEW PROTECTION BITS
DCA I PRENTP / AND SET INTO THE DIRECTORY ENTRY
SAVBUF /THEN RE-WRITE THE BUFFER
JMP I FIEXIT
PRT1, SZA CLA /ERROR
CLL CML RAR /6000 - "PROTECTION VIOLATION"
CLL CML RAR /4000 - "NO FILE OPEN"
DCA FIUSAC
JMP I FIEXIT
PRIFNU, 0
PRENTP, 0
C7637, 7637
/ROUTINE TO BUILD A RETRIEVAL POINTER FROM THE RELATIVE
/POSITION IN RETTBL (WHICH IS ALSO THE ENTTBL POINTER).
/CALLING SEQUENCE:
/ TAD (RELATIVE POSITION)
/ JMS I BLDP1
/ RETURN (POINTER IN AC)
BLDP, 0
AND C3777 /ZAP THE 'EXCLUSIVE USE' BIT
DCA CFH
CLA CMA
TAD CFH /POINTER = [(PTR - 1) * 8 + RETTBL]
CLL RAL; RTL
TAD RETTBL
JMP I BLDP /RETURN
/ROUTINE TO WRITE OUT THE SEGMENT-BUFFER IF NECESSARY.
WRITE, 0
ISZ BUFWRT /NEED IT BE SAVED?
JMP I WRITE /NO - JUST RETURN
TAD C6605 /YES - SET THE 'WRITE' IOT
DCA FLPARB
JMS I FIO01 /THEN DO THE I/O
HLT /ERROR ON WRITE - JUST CRASH *****
JMP I WRITE / OTHERWISE RETURN
/ROUTINE TO CHECK THIS USER'S ACCOUNT NUMBER AND
/SKIP IF HE IS A NORMAL USER; RETURN IS TO THE NEXT
/INSTRUCTION IF HE IS EITHER THE SYSTEM MANAGER
/(ACCOUNT NUMBER 0001) OR THE BILLING SYSTEM.
CHKAC0, 0
CLA CMA
TAD FIACCT
SNA CLA /IS IT THE SYSTEM MANAGER?
JMP I CHKAC0 /YES - SPECIAL EXIT
IFNZRO BILLNG <
TAD FIACCT
TAD LOGACT
SZA CLA /NO - IS IT THE BILLING SYSTEM?
>
ISZ CHKAC0 /NO - NORMAL EXIT
JMP I CHKAC0
PAGE
/ROUTINE TO MOVE THE RETRIEVAL WINDOW IN FIELD ZERO
WND0, TAD FIOSTK+2 /PICK UP INTERNAL FILE NUMBER
AND P0003 /AND OFF FIELD BITS
JMS I EBLD0
DCA WNENTP /POINTER TO RETRIEVAL INFORMATION POINTER
TAD I WNENTP
JMS I BLDP1 /GENERATE ABSOLUTE PTR. INTO RETTBL
DCA WNRETP /RETRIEVAL POINTER
TAD FIOSTK+7
DCA WNFCBP /PTR. TO THIS FILE'S FILE CONTROL BLOCK
TAD FIOSTK+5
DCA WND5 /LOW ORDER DISC ADDRESS
DCA WNDCNT /GET INTO CORE
STA
TAD SEGSIZ
AND FIOSTK+1 /GET HIGH ORDER FILE ADDRESS
DCA WNDIRP
TAD SEGSIZ /GET RID OF ADDRESS WITHIN SEGMENT
CIA
AND WND5
CLL RAL
TAD WNDIRP /WE NOW HAVE ALL THE NECESSARY BITS
RTL; RTL / SO SHIFT THEM AROUND
DCA WNSEGC /SAVE AS SEGMENT # TO GET
DATFLD /WNSEGC NOW HAS SEGMENT NUMBER TO GET
TAD I WNFCBP /PICK UP FIELD 0 WINDOW POINTER
DCA WNDPTR /PNTS TO FILE RETRIEVAL WINDOW FOR THIS FILE
ISZ WNFCBP
TAD I WNFCBP /PICK UP NUMBER OF CURRENT SEGMENT IN WINDOW
DCA WNCURS /CURRENT SEGMENT IN WINDOW
TAD WNSEGC /SEGMENT TO GET
JMS WND20 /DIVIDE BY 7 (IGNORE REMAINDER)
JMS WND30 /MULTIPLY BY 7
DCA WNSEGC /FIRST SEGMENT IN PROPER WINDOW
CLA CMA
TAD I WNDPTR /GET FIRST WORD OF FILE RETIEVAL WINDOW
SNA CLA / = 1?
JMP WND6 /INVALID WINDOW POINTER
TAD WNCURS /CURRENT SEGMENT AT TOP OF CURRENT CORE WINDOW
CLL CML CIA
/NOW SEE IF THE SEGMENT BEING SOUGHT IS ONE WHICH FOLLOWS
/THOSE WHICH ARE PRESENTLY IN THE CORE WINDOW. IF THE
/SOUGHT BLOCK DOES FOLLOW THE PRESENT ONE, WE CAN LOOK
/THROUGH THE RETRIEVAL INFORMATION BLOCKS STARTING AT THE ONE
/NOW IN CORE. OTHERWISE, WE MUST START AT THE VERY BEGINNING
/OF THE LIST OF FILE RETRIEVAL INFORMATION BLOCKS
TAD WNSEGC
SNA SZL
JMP WND6 /PREVIOUS BLOCK, SO MUST START AT BEGINNING OF STRING
JMS WND20 /DIVIDE BY 7
CIA
DCA WNDCNT /MOVE FORWARD THIS MANY WINDOWS
TAD WNDPTR
WND10, DCA WNDIRP
TAD I WNDIRP /PICK UP ADDRESS OF NEXT WINDOW
CFLD /CHANGE TO CURRENT FIELD
SNA
JMP WND13 /END OF STRING
DCA WND11
TAD WNRETP /POINTER TO UFD RETRIEVAL INFORMATION
JMS I GE01 /GET ENTRY INTO CORE
WND11, 0
ISZ WNDCNT /HAVE WE MOVED AHEAD ENOUGH BLOCKS?
JMP WND10 /NOT PROPER WINDOW, KEEP LOOKING
DCA WNDIRP
WND13, CIF
BLT
CFLD /SOURCE FIELD
WNDIRP, 0 /SOURCE
DATFLD /DESTINATION FIELD
WNDPTR, 0 /DESTINATION
-10 /(-) WORD COUNT
TAD WNDCNT /CORRECT FOR WINDOWS THAT WEREN'T THERE
JMS WND30 /MULTIPLY BY 7
TAD WNSEGC /SEGMENT NUMBER OF FIRST IN WINDOW
DATFLD
DCA I WNFCBP /FILE CONTROL BLOCK POINTER
JMP I .+1 /GO SET "JSIOTC" BEFORE EXITTING
INF6
WND6, CFLD /CHANGE TO CURRENT FIELD
CLA CLL
TAD WNSEGC /SEGMENT TO GET INTO IN CORE WINDOW
JMS WND20 /DIVIDE BY 7
CMA
DCA WNDCNT /WINDOW NUMBER TO GET INTO CORE
ISZ WNENTP
TAD I WNENTP /UFD ENTRY ADDRESS OF OPEN FILE
DCA WND5
TAD WNRETP /RETRIEVAL INFORMATION POINTER
JMS I GE01 /GET ENTRY INTO CORE
WND5, 0
TAD P0007
JMP WND10
/ROUTINE TO MULTIPLY A NUMBER BY 7
WND30, 0
DCA CFH
TAD CFH
CLL RAL
TAD CFH
CLL RAL
TAD CFH
JMP I WND30
WNFCBP, 0
WNENTP, 0
WNRETP, 0
WNDCNT, 0
WNSEGC, 0
WNCURS, 0
/ROUTINE TO DIVIDE A NUMBER BY 7.
/QUOTIENT IS RETURNED IN THE AC; REMAINDER
/IS LEFT IN 'WNDREM' ON PAGE ZERO.
WND20, 0
DCA WNDREM /SAVE THE NUMBER
DCA CFH /CLEAR THE QUOTIENT
TAD WNDREM
CLL CML
TAD C7771 /SUBTRACT 7
SZL /DID WE GO TOO FAR?
JMP .+3 /YES - ALL DONE
ISZ CFH /NO - INCREMENT THE QUOTIENT
JMP .-5 / & TRY ANOTHER SUBTRACTION
TAD P0007
DCA WNDREM /SAVE THE REMAINDER
TAD CFH /THEN RETURN WITH THE QUOTIENT
JMP I WND20
/ROUTINE TO CHECK THE SOURCE OF THE FIP CALL
/AND SKIP IF WE WERE CALLED BY 'SI'.
CHKSR0, 0
CLA
CDF
TAD I FANFLD /GET THE 'CORTBL' ENTRY
CFLD
AND FIPFIP
SNA CLA /'FIP' BIT SET?
ISZ CHKSR0 /NO - MUST BE FROM 'SI'
JMP I CHKSR0
/ROUTINE TO SET THE 'BUFFER CHANGED' SWITCH SO THAT THE
/SEGMENT BUFFER WILL BE WRITTEN BACK OUT BEFORE THE NEXT
/BLOCK IS READ OR WHEN FIP EXITS.
SAVBF0, 0
CLA CMA
DCA BUFWRT /'BUFFER CHANGED' = -1
JMP I SAVBF0
PAGE
/ROUTINE TO CREATE A NEW FILE
CRF0, TAD FIOSTK+1
SNA CLA /IS THE NAME REASONABLE?
JMP CRFER2 /NO - NO POINT CONTINUING
TAD FIACCT /GET USER'S ACCT #
JMS I UTS01 /SEARCH THE UFD TABLE
HLT /MUST BE AN ENTRY IF WE'RE LOGGED-IN *****
JMS I BLDP1 /BUILD A POINTER INTO RETTBL
DCA FIOSTK / FOR THE DIRECTORY-SEARCH
CRF1, CLA CMA
TAD FIACCT
SNA CLA /WILL THIS FILE BE A DIRECTORY?
CLA CMA /YES - THEN NEW ACCOUNT NUMBER MUST BE UNIQUE
JMS I DS01 /SEARCH THE DIRECTORY FOR THIS NAME
FIOSTK
JMP CRF2 /COULD NOT FIND THIS NAME, CONTINUE
DCA CRBUFP /FILE ALREADY EXISTS - SAVE POINTER
CLA CMA
TAD FIACCT
SNA CLA /ARE WE THE MANAGER (I.E. IS THIS A DIRECTORY)?
JMP CRFER3 /YES - WE WON'T AUTOMATICALLY DELETE
TAD I ZDS1 /GET ITS RELATIVE UFD-ENTRY LOCATION
DCA CRFSEG /UFD ADDRESS OF DIRECTORY ENTRY
TAD FIOSTK
JMS I ENS01 /SEARCH ENT TABLE FOR ACCESSES TO THIS FILE
CRFSEG, 0 /UFD ADDR. OF DIRECTORY ENTRY
SZA CLA /RETURNS WITH # OF ACCESSES TO THIS FILE
JMP CRFER5 /ERROR - FILE IS IN USE
/COMES HERE IF A FILE BY THIS NAME ALREADY EXISTS, BUT NOONE
/HAS OPENED IT
TAD CRFSEG
DCA I CRGD11 /SET DIRECTORY-ENTRY LOCATION FOR 'RED1'
TAD FIOSTK
DCA GDRETP / ALONG WITH THE 'RETTBL' ENTRY ADDRESS
TAD CRBUFP
TAD P0004 /GET THE PROTECTION-WORD LOCATION
DCA CRFENT
TAD I CRFENT
AND C0020
SZA CLA /IS THE FILE WRITE-PROTECTED AGAINST OWNER?
JMP CRFER3 /YES - SAY "PROTECTION VIOLATION"
TAD CRBUFP
JMS I RED11 /NO - DELETE THE FILE
JMP CRF1 / AND LOOK AGAIN FOR THE CHAIN END
/NOW ALL SET TO CREATE THE FILE. TO DO THIS, WE NEED TWO BLOCKS OF
/THE UFD--ONE FOR A NAME BLOCK AND THE SECOND FOR A FILE RETRIEVAL INFORMATION
/BLOCK. THESE BLOCKS ARE OBTAINED BY TWO CALLLS TO DE0. AFTER THE FIRST,
/A DUMMY 7777 IS PUT IN THE FOUND BLOCK TO PREVENT THE SECOND CALL
/TO DE0 FROM FINDING THE SAME BLOCK. IF BOTH BLOCKS CANNOT BE OBTAINED,
/THE CREATE CANNOT BE EXECUTED.
CRF2, SNA /WERE WE PASSED THE LAST LINK-ADDRESS?
TAD P0003 /NO - MUST BE EMPTY DIRECTORY
DCA CRFLNK /ADDR. OF LINK WORD OF LAST ENTRY IN UFD CHAIN
TAD FIOSTK /POINTER TO RETRIEVAL INFORMATION
JMS I DE01 /FIND AN EMPTY DIRECTORY ENTRY
JMP CRFER4+1 /ERROR - "USER DIRECTORY FULL"
DCA CRFENT
TAD CRFENT
JMS CRFGET /GET THE WORD INTO CORE
CLA CMA
DCA I CRBUFP /SIMULATE A USED ENTRY
TAD FIOSTK
JMS I DE01 /NOW FIND AN ENTRY FOR THE RETRIEVAL-BLOCK
JMP CRFER4 /NONE AVAILABLE - "DIRECTORY FULL"
DCA CRFRET
TAD CRFRET
JMS CRFGET /MAKE SURE THE ENTRY IS IN CORE
JMS I SATL1 /FIND A FREE SEGMENT IN THE SAT
SNA
JMP CRFER1 /NONE AVAILABLE - "DISC FULL"
/AT THIS POINT, WE HAVE A DISC SEGMENT AND TWO BLOCKS FROM THE
/UFD. THIS IS ALL THAT IS NEEDED, SO GO AHEAD AND EXECUTE THE CREATE
ISZ CRBUFP
DCA I CRBUFP /SAVE THE SEGMENT NUMBER IN THE RETRIEVAL BLOCK
TAD I CRBUFP
DCA CRFSEG /SAVE THE INDEX FOR CLEARING LATER
TAD CRFENT
JMS CRFGET /GET BACK THE DIRECTORY NAME-ENTRY
CLA CMA
TAD CRBUFP
DCA INDEX
TAD FIOSTK+1 /TRANSFER FILE NAME INTO DIRECTORY ENTRY
DCA I INDEX
TAD FIOSTK+2
DCA I INDEX
TAD FIOSTK+3
DCA I INDEX
DCA I INDEX /LEAVE A WORD FOR THE NEXT FORWARD LINK
TAD CRPROT
DCA I INDEX /SET THE INITIAL PROTECTION
CLA CLL IAC
DCA I INDEX /INITIAL FILE-SIZE IS 1 SEGMENT
CDF
TAD I DATEA /PICK UP TODAY'S DATE
CFLD
DCA I INDEX / & SAVE AS DATE OF CREATION
TAD CRFRET
DCA I INDEX /SET THE RETRIEVAL-BLOCK LOCATION
TAD CRFLNK
JMS CRFGET /GET THE DIRECTORY FORWARD-LINK INTO CORE
TAD CRFENT
DCA I CRBUFP / & SET THIS ENTRY'S ADDRESS
TAD CRFSEG
JMS I SCL01 /NOW ZERO THE INITIAL SEGMENT
JMP I FIEXIT / & EXIT
/CODE TO RETURN THE VARIOUS 'CREATE' ERROR STATUSES.
CRFER1, JMS CRFCLR /CLEAR THE 'DUMMY ENTRY' WORD
CLA CLL IAC /7400 - "DISC IS FULL"
CRFER2, CLL CML RTR /6400 - "INVALID FILE NAME"
CRFER3, CLL CML RAR /6000 - "PROTECTION VIOLATION"
JMP .+4
CRFER4, JMS CRFCLR /5000 - "USER DIRECTORY FULL"
TAD P1000
CRFER5, TAD P1000 /4400 - "ANOTHER USER HAS FILE OPEN"
CLL CML RAR
DCA FIUSAC /RETURN THE CODE IN HIS AC
JMP I FIEXIT
/ROUTINE TO CLEAR THE 'DUMMY ENTRY' WORD WE PLACE IN THE
/DIRECTORY ENTRY. WE HAVE TO DO THIS WHEN AN ERROR OCCURS.
CRFCLR, 0
TAD CRFENT
JMS CRFGET /GET THE ENTRY INTO CORE
DCA I CRBUFP / & CLEAR THE FIRST WORD
JMP I CRFCLR /THEN JUST RETURN
/ROUTINE TO READ IN A SEGMENT AND SET 'CRBUFP'. IT ALSO
/SETS THE 'BUFFER CHANGED' SWITCH.
CRFGET, 0
DCA .+3 /SET THE ENTRY-ADDRESS
TAD FIOSTK
JMS I GE01 /GET THE DIRECTORY WORD
CRBUFP, 0
DCA CRBUFP /SAVE THE BUFFER-ADDRESS
SAVBUF / AND SET THE 'SAVE BUFFER' SWITCH
JMP I CRFGET /THEN RETURN
CRFENT, 0
CRFLNK, 0
CRFRET, 0
CRGD11, GD1
CRPROT, 12 /INITIAL FILE PROTECTION-WORD
DATEA, DATE
RED11, RED1
PAGE
/ROUTINE TO EXTEND A FILE
EXT0, JMS EXT1 /MAKE SURE IT'S OKAY TO EXTEND THIS FILE
TAD P0007 /...EXT1 RETURNS WITH PTR. TO NAME BLOCK FOR THIS FILE
DCA EXBUFP /SET THE RETRIEVAL-CHAIN POINTER
/NOW TRACE THRU TO LAST RETRIEVAL INFORMATION BLOCK FOR THIS FILE
EXT4, TAD I EXBUFP
SNA /END OF CHAIN?
JMP EXT3 /YES
DCA EXWNDP /WINDOW POINTER
TAD EXWNDP
JMS EXGE0 /GET WINDOW INTO CORE
JMP EXT4 /KEEP LOOKING FOR END
EXT3, TAD FIOSTK+2 /NUMBER OF SEGMENTS TO ADD
CMA
DCA EXSEGC
DCA EXLAST /CLEAR THE 'NEW LINK' SWITCH
EXT5, ISZ EXBUFP
TAD I EXBUFP /PICK UP ENTRY IN WINDOW
SNA CLA /IS IT THE FIRST FREE ENTRY?
JMP EXT6 /YES - START EXTENDING
TAD EXBUFP
AND P0007
SZA CLA /NO - AT END OF BLOCK?
JMP EXT5 /NO - KEEP LOOKING
/
/NOW AT END OF LIST OF SEGMENTS MAKING UP THIS FILE
EXT6, ISZ EXSEGC /START EXTENDING
JMP EXT7 /GET ANOTHER SEGMENT
EXT20, TAD EXSEGC
CIA
DCA FIUSAC /NUMBER OF SEGMENTS WE FAILED TO FIND
TAD EXLAST /GET THE LAST WINDOW ADDRESS
SNA /IS IT LINKED TO NOTHINGNESS?
JMP EXT21 /NO - NO PROBLEM
JMS EXGE0 /YES - GET THE PREVIOUS BLOCK
DCA I EXBUFP / AND CLEAR ITS FORWARD LINK
SAVBUF /REMEMBER TO REWRITE THE BUFFER
EXT21, TAD FIOSTK+1 /NOW UPDATE THE DIRECTORY ENTRY
JMS I GD01 /GET DIRECTORY ENTRY INTO CORE
TAD C0005
/HAVE A NEW BLOCK FOR RETRIEVAL
DCA EXBUFP /POINTER TO SEGMENT COUNT
TAD FIOSTK+2 /NUMBER OF WORDS TO BE ADDED
TAD I EXBUFP /NUMBER ALREADY IN FILE
TAD EXSEGC /MINUS NUMBER WE FAILED TO GET
DCA I EXBUFP /UPDATE ENTRY
SAVBUF / AND SET 'BUFFER CHANGED' SWITCH
EXT8, DATFLD /SET DATA FIELD TO FIELD 1
TAD I EXFCBP
DCA EXPROP /POINTER TO RETRIEVAL WINDOW
IAC
DCA I EXPROP /INVALIDATE THE WINDOW
JMP I FIEXIT
EXT7, TAD EXBUFP
AND P0007
SZA CLA /DO WE NEED A NEW BLOCK?
JMP EXT12 /NO
TAD GDRETP /RETRIEVAL POINTER
JMS I DE01 /FIND AN EMPTY ENTRY
JMP EXT20 /PARTIALLY SATISFIED
DCA EXNFRE /FREE SEGMENT ADDRESS
TAD EXWNDP /CURRENT WINDOW POINTER
JMS EXGE0 /GET IT INTO CORE
TAD EXNFRE /NEXT FREE WINDOW
DCA I EXBUFP /LINK IT ONTO CHAIN
SAVBUF / AND SET 'CHANGED' SWITCH
TAD EXWNDP /SAVE PREVIOUS BLOCK LOCATION
DCA EXLAST / IN CASE WE RUN OUT OF DISC NOW
TAD EXNFRE
DCA EXWNDP /UPDATE CURRENT WINDOW POINTER
TAD EXWNDP
JMS EXGE0 /GET NEW WINDOW INTO CORE
ISZ EXBUFP /POINTER TO FIRST ENTRY OF WINDOW
EXT12, JMS I SATL1 /GET A FREE SEGMENT FROM SAT
SNA
JMP EXT20 /PARTIALLY SATISFIED
DCA I EXBUFP /SET THE SEGMENT # IN THE WINDOW
ISZ EXBUFP
SAVBUF /SET 'BUFFER CHANGED' SWITCH
DCA EXLAST / AND CLEAR 'NEW LINK' SWITCH
JMP EXT6 /FILL NEXT WORD
EXGE0, 0 /GET WORD OF THIS UFD INTO CORE
DCA .+3 /STORE THE WORD NUMBER
TAD GDRETP
JMS I GE01 /FETCH THE WORD
EXBUFP, 0
DCA EXBUFP /SET THE BUFFER POINTER
JMP I EXGE0
EXT30, TAD P1000 /4400 - "ANOTHER USER HAS FILE OPEN"
SKP
EXT10, CLL CML RAR /6000 - "PROTECTION VIOLATION"
CLL CML RAR /4000 - "NO FILE OPEN"
DCA FIUSAC
JMP I FIEXIT
EXFCBP, 0
EXLAST, 0
EXNFRE, 0
EXPROP, 0
EXSEGC, 0
EXWNDP, 0
/ROUTINE TO SET UP TO ALTER A FILE (BY EITHER EXTENDING IT OR
/REDUCING IT.) CHECK PROTECTION CODE TO SEE IF THIS IS ALLOWED. MAKE SURE
/NOONE ELSE HAS THIS FILE OPEN. JMP TO ERROR EXIT ON EITHER OF THESE CON-
/DITIONS. IF ALL IS OKAY, RETURN WITH PTR. TO UFD NAME BLOCK ENTRY
EXT1, 0
JMS I IFN01
JMS I LNK01 /GET PTR. TO APPROPRIATE FILE CONTROL BLOCK
SNA
JMP EXT10+1 /ERROR, FILE NOT OPEN
DCA EXFCBP /FILE CONTROL BLOCK POINTER
TAD FILPRP /GLOBAL TO "FILPRO"
TAD EXFCBP
DCA EXPROP /POINTER TO PROTECTION BIT IN FIELD 0
DATFLD /CDF FIELD 0
TAD I EXPROP /PICK UP PROTECTION BIT
CFLD /CHANGE TO CURRENT FIELD
AND P0004 /STRAIN OFF ANY EXTRANEOUS BITS
SZA CLA
JMP EXT10 /WRITE PROTECTED
TAD FIOSTK+1 /INTERNAL FILE NUMBER
JMS I GD01 /GET DIRECTORY ENTRY INTO CORE
DCA EXBUFP /POINTS TO WHERE UFD NAME BLOCK IS IN CORE
JMS I ENR01 /IS THIS THE ONLY USER WHO HAS THIS FILE OPEN?
JMP EXT30 /NO, SO ABORT AND RETURN ERROR CODE
TAD EXBUFP
JMP I EXT1
ENR01, ENR0
PAGE
/ROUTINE TO REDUCE A FILE
RED0, JMS I EXT11 /MAKE SURE IT'S OKAY TO REDUCE THIS FILE
DCA REBUFP /...IF OKAY, RETURNS WITH PTR. TO FILE NAME BLOCK
TAD REBUFP
TAD C0005
DCA RELINK /NOW POINTS TO NUMBER OF SEGMENTS PRESENTLY IN FILE
TAD FIOSTK+2 /SEGMENTS TO BE REMOVED
SNA /IS HE REDUCING IT AT ALL?
JMP I FIEXIT /NO - SAVE OURSELVES WORK & AVOID A BUG
SPA /IS IT NEGATIVE?
CLA CLL CMA RAR /REPLACE THE NEGATIVE # BY 3777.
CIA
TAD I RELINK
SMA SZA /DELETE THE FILE?
JMP RED6 /NO, REDUCE IT
CLA CLL /YES, WIPE IT OUT AND CLOSE
TAD REBUFP
JMS RED1 /WIPE OUT THE FILE NAME BLOCK FROM THE UFD
TAD FIOSTK+1 /INTERNAL FILE NUMBER
JMS I CL01 /CLOSE THIS FILE SINCE IT NO LONGER EXISTS
JMP I FIEXIT
RED6, DCA I RELINK /UPDATE SEGMENT COUNT
SAVBUF / & INDICATE BUFFER CHANGED
TAD I RELINK
DCA CFH
ISZ RELINK
ISZ RELINK
TAD I RELINK
DCA RELINK /POINTER TO FIRST WINDOW ON CHAIN
TAD CFH
JMS RED40 /WIPE OUT REST OF FILE
JMP I .+1 /THEN GO INVALIDATE THE RETRIEVAL WINDOW
EXT8
/ROUTINE TO DELETE A FILE
RED1, 0
DCA REBUFP /PTR. TO THE UFD ENTRY FOR THE FILE
TAD REBUFP
TAD P0003
DCA RELINK /LINK TO NEXT FILE NAME IN THIS UFD
TAD I RELINK
DCA RED3
TAD I REDGD1 /UFD ADDR. OF THIS DIRECTORY ENTRY
DCA RED4
TAD REBUFP
TAD P0007
DCA RELINK /NOW POINTS TO A RETRIEVAL BLOCK FOR THIS FILE
TAD I RELINK
DCA RELINK
RED2, DCA I REBUFP /CLEAR OUT FIRST WORD OF ENTRY
ISZ REBUFP
TAD REBUFP
AND P0007
SZA CLA /END OF CURRENT WINDOW?
JMP RED2 /NO, KEEP CLEARING
SAVBUF /YES - SET 'BUFFER CHANGED'
RED5, DCA .+3 /NOW SET THE ENTRY ADDRESS
TAD GDRETP
JMS I GE01 / AND GET A DIRECTORY ENTRY IN CORE
REDPTR, 0
TAD P0003 /GET TO THE LINK POINTER
DCA REDPTR
TAD I REDPTR /GET THE LINK TO THE NEXT ENTRY
CIA
TAD RED4
SNA CLA /IS IT THE ENTRY WE'RE DELETING?
JMP .+3 /YES
TAD I REDPTR /NO - GET ITS ADDRESS
JMP RED5 / AND KEEP SEARCHING
TAD RED3 /SET THE NEW LINK TO NEXT ENTRY
DCA I REDPTR / SO IT LINKS AROUND THE DELETED FILE
SAVBUF /SET 'BUFFER CHANGED'
JMS RED40 / AND GO DELETE THE FILE ITSELF
JMP I RED1
RED3, 0 /UFD ADDRESS OF NEXT ENTRY IN DIRECTORY CHAIN
RED4, 0 /UFD ADDRESS OF THIS DIRECTORY ENTRY
REDGD1, GD1
/ROUTINE TO REDUCE A FILE - ENTER WITH THE NUMBER OF
/SEGMENTS WHICH ARE TO REMAIN.
RED40, 0
DCA CFH
TAD GDRETP /RTABLE
DCA RERETP
TAD CFH /# OF SEGMENTS TO REMAIN
JMS I RED302 /ROUTINE TO DO ACTUAL REDUCTION
RELINK, 0 /RETRIEVAL CHAIN PTR
RERETP, 0 /UFD RETRIEVAL PTR.
JMP I RED40
EXT11, EXT1
RED302, RED30
REBUFP, 0
/SEARCH ENTTBL FOR OPENINGS TO FILE
/CALLING SEQUENCE:
/ TAD (RETRIEVAL POINTER)
/ JMS I ENS01
/ UFD ADDRESS OF DIRECTORY ENTRY
/ RETURN (COUNT OF ACCESSES IN AC)
ENS0, 0
JMS ENS3
CMA
DCA ENRETP / (-) RELATIVE POINTER
DCA ENACNT /CLEAR ACCESS COUNTER
TAD ENTTBL
DCA ENTPTR
ENS2, TAD I ENTPTR /GET THE UFD POINTER FOR THIS FILE
AND C3777 / ZAP THE 'EXCLUSIVE USE' BIT
TAD ENRETP / AND SUBTRACT THE ONE WE WANT
ISZ ENTPTR
SZA CLA /FILE IN SAME UFD?
JMP ENS1 /NO - KEEP LOOKING
TAD I ENTPTR
CIA
TAD I ENS0
SZA CLA /YES - SAME FILE LOCATION?
JMP ENS1 /NO
ISZ ENACNT /YES - INCREMENT ACCESS COUNT
TAD ENTPTR / AND SAVE 'FIND' LOCATION
DCA ENSFND
ENS1, ISZ ENTPTR
TAD ENTPTR
CIA
TAD ENTEND /END OF ENT TABLE
SZA CLA
JMP ENS2 /KEEP LOOKING
TAD ENACNT /PICK UP ACCUMULATED ACCESS COUNT
ISZ ENS0
JMP I ENS0
ENTPTR, 0
ENRETP, 0
ENACNT, 0
/CONVERT AN ABSOLUTE PTR INTO RETTBL TO A RELATIVE ENTRY NUMBER
ENSFND, /LOCATION OF LAST 'FIND' IN ENTTBL
ENS3, 0
CIA
TAD RETTBL /REL. PTR. TO ADDRESS WITHIN RETTBL
CIA
AND P7770
CLL RTR; RAR / DIVIDED BY 8
JMP I ENS3
PAGE
/ROUTINE TO PROVIDE FILE INFORMATION
INF0, JMS I IFN01 /GET INTERNAL FILE NUMBER IN FIOSTK+1
JMS I EBLD0
DCA CFH /RELATIVE POINTER TO UFD RETRIEVAL INFORMATION
DCA FIOSTK
DCA FIOSTK+2 /CLEAR OWNER JUST IN CASE
TAD I CFH /GET PTR. TO RETTBL OUT OF ENTTBL
SNA /DOES IT EXIST?
JMP INF5 /NO, SO FILE IS NOT OPEN
CIA
CLL CMA RAL / * 2 (AND ZAP 'EXCLUSIVE USE' BIT)
TAD UFDTBL
DCA INUFDP /POINTER TO USER PROJ,PROG NUMBER
RAR /GET BACK THE 'EXCLUSIVE USE' BIT
TAD FIOSTK+1 / AND SAVE IT WITH THE FILE #
DCA INF4
TAD I INUFDP
DCA FIOSTK+2 /SET THE OWNER'S ACCOUNT (ALSO FOR 'GD0')
TAD FIOSTK+1 /NOW GET THE INTERNAL FILE #
JMS I GD01 / AND GET THE FILE'S DIRECTORY ENTRY
CIA
CMA
DCA INDEX
TAD INF4 /SEND BACK THE 'EXCLUSIVE USE' BIT
DCA FIOSTK+1 / WITH THE FILE #
TAD I INDEX /NOW THE
DCA FIOSTK+3
TAD I INDEX / FILE
DCA FIOSTK+4
TAD I INDEX / NAME
DCA FIOSTK+5
ISZ INDEX
TAD I INDEX
DCA FIOSTK+6 /RETURN THE PROTECTION-WORD
TAD I INDEX
DCA FIOSTK+7 / AND THE SIZE
CLA CMA
TAD FIOSTK+2
SZA CLA /IS THIS FILE A DIRECTORY?
JMP INF5 /NO
DCA FIOSTK+4 /YES - CLEAR THE PASSWORD
TAD I INDEX / AND RETURN THE DATE-WORD (CPU TIME)
DCA FIOSTK+5 / (THE SIZE-WORD IS THE DEVICE-TIME)
INF5, DATFLD
TAD I FIOPTR /PICK UP JOBLNK WORD FROM JOB STATUS BLOCK
DCA INF4 /DESTINATION IN FIELD 0
CFLD /CHANGE TO PRESENT FIELD
CIF
BLT /MOVE FIOSTK INFORMATION INTO IOT PARAMETER BLOCK
CFLD /SOURCE FIELD
FIOSTK /SOURCE
DATFLD /DESTINATION FIELD 0
INF4, 0 /DESTINATION
-10 /WORD COUNT
TAD P0007 /GET THE NUMBER OF PARMS TO RETURN
INF6, CLL RTL; RTL; RAL
DCA INSPTR
TAD FILINK /GET THE LINK-SAVE WORD
AND C7037 / ZAP THE OLD COPY-COUNT
TAD INSPTR
DCA FILINK / AND SET THE NEW COUNT
CHKSRC /WERE WE CALLED FROM 'SI'?
SKP
JMP I FIEXIT /YES - CAN'T SET 'JSIOTC' OR SCHEDULER FOULS UP
DATFLD
TAD I JOBDAT /GLOBAL TO "JOBDAT"
IAC
DCA INSPTR /NOW POINTS TO STATUS WORD
TAD INIOTC /JSIOTC
CMA
AND I INSPTR /SET JSIOTC TO INDICATE THAT FIP
TAD INIOTC /...IS RETURNING INFORMATION IN THE IOT PAR. BLOCK
DCA I INSPTR
JMP I FIEXIT
C7037, 7037
INUFDP, 0
LGIDDB,
INSPTR, 0
INIOTC, JSIOTC
/LOGIN ROUTINE
LGI0, TAD RETTBL /MFD RETRIEVAL IS IN ENTRY 0
DCA FIOSTK+1
TAD FIOSTK+2
SNA CLA /IS THE ACCOUNT # AT ALL REASONABLE?
JMP LGI20 /NO - CAN'T LOG IN
TAD FIOSTK+3
SNA CLA /IS THE FIRST WORD OF THE PASSWORD ZERO?
TAD FIOSTK+4 /YES - THE 2ND WORD NON-ZERO FLAGS NO PASSWORD NEEDED
JMS I DS01 /SEARCH THE MFD (AC=0 TO INDICATE 3-WORD SEARCH)
FIOSTK+1
JMP LGI20 /COULD NOT FIND ENTRY IN MFD
CLA CLL / (ENTRY ADDRESS RETURNED IN AC)
TAD FIOSTK+2 /GET THE ACCOUNT NUMBER
JMS I UFO01 / AND OPEN THE UFD (I.E. FETCH RETRIEVAL INFO)
JMP LGI20 /COULD NOT FIND ROOM ON TABLE
CLA CMA
TAD I UTPRNU
DCA I UTPRNU /ACCOUNT FOR NEW ENTRY IN ACCESS COUNT
TAD FIJOB /NOW GET THE KEYBOARD NUMBER
TAD TTYTBA / FOR THIS JOB
DCA LGIDDB
DATFLD
TAD I LGIDDB
CLL RAL
TAD DEVTBA /FIND ITS DDB ADDRESS
DCA LGIDDB
TAD I LGIDDB /GET THE LOCATION OF THE
TAD P0003 / 'ASSIGNED TIME' WORD
DCA LGIDDB
CDF
TAD I CLK1A /NOW CALCULATE THE VALUE FOR
AND C7000
CLL RAL
DCA CFH
TAD I CLK2A
AND P0777
TAD CFH
RTL
RAL
DATFLD
DCA I LGIDDB /THEN SET THE CURRENT TIME IN THE DDB
JMP I .+1 /NOW WRITE OUT THE TABLES
TABOUT
LGI20, CLA CMA /COULD NOT LOGIN - RETURN WITH 7777
DCA FIUSAC /INDICATE INABILITY TO LOGIN
JMP I FIEXIT
CLK1A, CLK1
CLK2A, CLK2
TTYTBA, TTYTBL
PAGE
/ROUTINE TO PERFORM ACTUAL FILE REDUCTION
/CALLING SEQUENCE:
/ TAD (NUMBER OF SEGMENTS TO REMAIN)
/ JMS RED30
/ RETRIEVAL CHAIN POINTER
/ UFD RETRIEVAL POINTER
/ RETURN
DSCNTR,
RED30, 0
JMS I WND201 /DIVIDE BY 7
CMA
DCA REWNDC /WINDOW COUNT-- NUMBER OF WHOLE WINDOWS WHICH ARE TO REMAIN
TAD I RED30 /RETRIEVAL CHAIN POINTER
ISZ RED30
/NOW TRACE THRU THE LINKED LIST OF FILE INFORMATION
/RETRIEVAL BLOCKS UNTIL WE GET TO THE ONE IN WHICH THE
/NEW LAST SEGMENT IS
RED32, DCA RED31 /LINKAGE TO RETRIEVAL CHAIN
TAD I RED30 /PICK UP RETRIEVAL POINTER
JMS I GE01 /GET THIS WORD INTO CORE
DSENTP,
RED31, 0
DCA REBUFF
TAD I REBUFF /PICK UP LINK TO NEXT
DCA RELINC /SAVE LINK
TAD WNDREM
SZA CLA /DELETING ENTIRE WINDOW?
JMP RED37 /NO
CLA CLL CML RTL
TAD REWNDC
SZA CLA /YES - ARE WE ONE WINDOW FROM THE END YET?
JMP RED37 /NO
DCA I REBUFF /YES - CLEAR THE LINK TO IT
SAVBUF / AND SET 'BUFFER CHANGED'
RED37, TAD RELINC
ISZ REWNDC /AT END OF CHAIN?
JMP RED32 /NO, KEEP SAVING
DCA RELINC /SAVE LINC
DCA I REBUFF /YES, TERMINATE IT
SAVBUF / AND SET 'BUFFER CHANGED' SWITCH
/FOUND RETRIEVAL BLOCK IN WHICH TO CHOP OFF
/THE LIST OF SEGMENTS.
/START DELETING THE SEGMENT NUMBERS AND RETURNING
/THE ACTUAL DISC SEGMENTS TO THE POOL
TAD WNDREM
IAC /YES; GET POINTER TO FIRST SEGMENT TO BE DELETED
TAD REBUFF
DCA REBUFF /POINTER TO FIRST SEGMENT TO REMOVE
RED33, TAD I REBUFF /PICK UP THE SEGMENT NUMBER
SZA
JMS I SATR1 /RELEASE IT ON SAT
DCA I REBUFF /CLEAR THE CELL
ISZ REBUFF
TAD REBUFF
AND P0007
SZA CLA /END OF WINDOW?
JMP RED33 /NO, CONTINUE
TAD RELINC /YES, MOVE TO NEXT
SZA /END OF CHAIN?
JMP RED34 /NO, GET NEXT WINDOW
ISZ RED30 /YES, EXIT
JMP I RED30
RED34, DCA RED35
TAD I RED30
JMS I GE01 /GET NEXT WINDOW
DSKCNT,
RED35, 0
DCA REBUFF
TAD I REBUFF
DCA RELINC /SET UP LINK TO NEXT
DCA I REBUFF /WIPE OUT THIS LINK
SAVBUF / AND INDICATE 'BUFFER CHANGED'
ISZ REBUFF
JMP RED33 /KEEP WIPING OUT
REBUFF, 0
RELINC, 0
REWNDC, 0
WND201, WND20
/DIRECTORY SEARCH
/CALLING SEQUENCE:
/ CLA OR CMA (3 OR 1 WORD SEARCH)
/ JMS DS0
/ POINTER--------------->RETRIEVAL STACK POINTER
/ RETURN IF NOT FOUND NA
/ GOOD RETURN ME
/ (POINTER IN AC) XX
DS0, 0
SNA CLA /SKIP IF ONE WORD SEARCH
CLL CML RTL /THREE WORD COMPARE
CMA
DCA DSWDNR /MINUS NUMBER OF WORDS TO COMPARE
TAD I DS0 /PICK UP POINTER TO RETRIEVAL INFORMATION
DCA DSRETS
ISZ DS0
TAD DSMAX /SET UP COUNTER ON # ENTRIES CHECKED
DCA DSKCNT
DCA DSNEXT /CLEAR OUR NEXT-HIGHEST
DS1, DCA DSWORD
TAD I DSRETS /GET PTR. TO RETRIEVAL INFORMATION BLOCK
JMS I GE01 /GET THE ENTRY INTO CORE
DSWORD, 0 /WORD NUMBER--I.E. THE ADDR. WITHIN THE DIRECTORY
SNA /DID WE GET THE ENTRY?
HLT /NO, BUT THERE WAS A POINTER TO IT - ERROR *****
DCA DSENTP /STORE POINTER TO ENTRY
TAD DSWDNR /NUMBER OF WORDS TO COMPARE
DCA DSCNTR
TAD DSRETS
DCA DSOBJT /POINTER TO OBJECT NAME
TAD DSENTP
DCA DSENT /POINTER TO NAME IN BUFFER
DS2, TAD I DSENT
ISZ DSENT
CIA
ISZ DSOBJT
TAD I DSOBJT
SZA CLA
JMP DS3 /NOT FOUND
ISZ DSCNTR
JMP DS2 /LOOK AT NEXT WORD OF NAME
/WE FOUND IT - JUST RETURN THE POINTER
ISZ DS0 /FOUND THE ENTRY
TAD DSENTP /PICK UP POINTER
JMP I DS0 / & RETURN
/THIS ENTRY IS NOT THE ONE WE'RE LOOKING FOR, SO WE MUST
/GO LOOK AT THE NEXT ONE. UPDATE OUR 'NEXT UFD' WORD
/AND THEN PICK UP THE LINK TO THE NEXT ENTRY.
DS3, ISZ DSKCNT /BAD DIRECTORY?
SKP /NOT YET
HLT /LOOPING LINKS - ERROR *****
TAD I DSENTP /GET THE LAST ENTRY
CLL CML CIA
TAD I DSOBJT
SNL CLA /GREATER THAN THE ONE WE WANT?
JMP DS5 /NO
TAD DSNEXT
SNA /YES - DO WE HAVE A NEXT YET?
JMP DS4 /NO - JUST TAKE THIS ONE
CLL CML CIA
TAD I DSENTP
SNL CLA /SMALLER THAN OUR PREVIOUS 'NEXT'?
JMP DS5 /NO
DS4, TAD I DSENTP /YES - SAVE THIS ONE INSTEAD
DCA DSNEXT
DS5, TAD P0003 /CREATE POINTER TO NEXT ENTRY
TAD DSENTP
DCA DSCNTR
TAD I DSCNTR
SZA /IS THIS THE END OF THE DIRECTORY CHAIN?
JMP DS1 /NO, SO CONTINUE SEARCH
TAD P0003
TAD DSWORD /YES - RETURN ADDRESS OF LAST LINK-WORD
JMP I DS0
DSENT, 0
DSMAX, -161 / - (MAX # OF FILES USER CAN OWN + 1)
DSNEXT, 0
DSOBJT= REBUFF
DSRETS= RELINC
DSWDNR= REWNDC
PAGE
/ROUTINE TO LOOK IN THE SAT FOR A FREE SEGMENT
/CALLING SEQUENCE:
/ JMS SATLOK
/ RETURN (SEGMENT NUMBER IN AC, 0=NONE AVAILABLE)
SATLOK, 0
TAD SATTBL /SET THE POINTER INTO THE TABLE
DCA SATPNT
TAD I SATCNT /# OF AVAILABLE DISC SEGMENTS
SNA /ARE THERE ANY?
JMP I SATLOK /NO, SO SCREW IT
CIA
CMA
DCA I SATCNT /DECREMENT SATCNT
DCA SATCT2
CLA CMA
DCA SATSTA /SET SAT STATUS TO WRITE OUT
/LOOK FOR A WORD IN SAT TABLE WITH A ZERO BIT IN IT
SAT1, TAD I SATPNT /GET A WORD FROM SAT TABLE
CMA
SZA CLA /ARE ALL BITS SET TO ONE?
JMP SAT2 /NO, SO WE'VE FOUND A SEGMENT
ISZ SATPNT /WAS THIS THE LAST WORD IN THE SAT TABLE?
JMP SAT1 /NO, SO KEEP LOOKING
HLT /YES, BUT WE SUPPOSEDLY HAD A SLOT *****
DCA I SATCNT / (IF SYSTEM IS CONTINUED, WE'LL FIX THE COUNT)
JMP I SATLOK
/WE FOUND A SAT WORD WITH A ZERO BIT. NOW FIND THAT BIT
SAT2, CLL CML RAR /4000 INTO ACC.
DCA SATMSK
ISZ SATCT2 /INCREMENT THE BIT POSITION COUNT
TAD I SATPNT /GET WORD FROM SAT TABLE
AND SATMSK /IS THE BIT CORRESPONDING TO THE ONE IN SATMSK SET?
SNA
JMP SAT3 /NO, SO WE FOUND THE ZERO BIT
RAR /MOVE MASK BIT ONE TO THE RIGHT
JMP SAT2+1 /...AND LOOK AT THE NEXT BIT
/FOUND THE BIT WITHIN THE WORD - SATCNT INDICATES WHICH ONE IT IS
SAT3, TAD SATMSK
TAD I SATPNT /SET THE BIT IN SATTBL TO INDICATE
DCA I SATPNT / THAT THIS SEGMENT IS ALLOCATED
TAD SATPNT
TAD SATFIX
DCA SATMSK
/
/NOW CALCULATE THE NUMBER OF THE DISC SEGMENT
/WHICH CORRESPONDS TO THIS BIT IN THE SAT TABLE
TAD SATMSK /THE WORD-NUMBER
CLL RAL
TAD SATMSK
RTL / TIMES 12
TAD SATCT2 / PLUS THE BIT POSITION
JMP I SATLOK /EXIT WITH DISC SEGMENT NUMBER IN ACC.
SATFIX, SATSIZ-2
SATPNT, 0
SATCNT, -SATSIZ+1
SATEMP,
SATCT2, 0
SATMSK, 0
SATTBL, -SATSIZ+2
/ROUTINE TO RELEASE A SEGMENT IN SAT
/CALLING SEQUENCE:
/ TAD (SEGMENT NUMBER)
/ JMS SATREL
SATREL, 0
SNA /REASONABLE SEGMENT NUMBER?
HLT /NO - ERROR *****
DCA SATEMP /SEGMENT NUMBER
CLA CLL CMA CML
DCA SATSTA /MARK SAT STATUS AS HAVING BEEN CHANGED
TAD SATEMP
TAD SEGMAX
SZA SNL CLA /LEGAL SEGMENT NUMBER?
HLT /NO - ERROR *****
DCA SATPNT
/
/NOW DIVIDE SEGMENT NUMBER BY 12 DECIMAL
/QUOTIENT INDICATES WHICH WORD IN SAT TABLE CORRESPONDS
/TO THIS DISC SEGMENT. REMAINDER INDICATES WHICH BIT IN
/THAT WORD
CLA CMA /SUBTRACT 1 SO SEGMENT TABLE STARTS AT 0
SATRL1, TAD SATEMP
SMA /IS SEGMENT # > 3777?
JMP SATRL2 /NO
TAD CM3770 /YES - SUBTRACT 3770 FROM IT
DCA SATEMP
TAD SATPNT /THEN PUSH THE POINTER BY 3770 SEGMENTS
TAD C0252 / WHICH IS 252 WORDS
DCA SATPNT
JMP SATRL1 /THEN CHECK AGAIN
/NOW FIND THE WORD-ADDRESS OF THIS BIT NUMBER.
ISZ SATPNT
SATRL2, TAD C7764 /-14
SMA /IS THIS THE WORD?
JMP .-3 /NO - ADVANCE THE POINTER & SUBTRACT AGAIN
DCA SATEMP /YES - SAVE THE BIT-POSITION
TAD SATPNT
TAD SATTBL /GET THE WORD-ADDRESS
DCA SATPNT
CLL CML
RAL
ISZ SATEMP /SET UP A MASK CORRESPONDING TO PROPER BIT
JMP .-2
AND I SATPNT
SNA /IS THIS SEGMENT REALLY ASSIGNED?
HLT /NO - ERROR *****
CMA
AND I SATPNT /CLEAR SAT TABLE BIT
DCA I SATPNT / THE SEGMENT IS NOW AVAILABLE
ISZ I SATCNT /UPDATE THE AVAILABLE SEGMENTS COUNT
JMP I SATREL
C0252, 252 / [3770 BITS / 14 BITS PER WORD (OCTAL)]
C7764, -14
CM3770, -3770
SEGMAX, -DSKSIZ+JOBMAX+SWDEX^20+1 / (-) LARGEST SEGMENT NUMBER
/ROUTINE TO FETCH A LINKED-BLOCK (USED BY 'OPEN').
GTBLOK, 0
DCA GTB1
CFLD
TAD GTB1
CIF
GETBLK
JMP I GTBERR /NO BLOCK AVAILABLE - SAY "PROTECTION VIOLATION"
DATFLD
TAD I GTB1
JMP I GTBLOK
GTBERR, OPNER2
GTB1, 0
/DISPATCH TABLE FOR IOTS
IODISP, ASD1
REL0
REN0
OPN0
CLS0
WND0
PRT0
WND0
XOPN0
CPASS0
CRF0
EXT0
RED0
INF0
LGI0
LGO0
BCLR0
PAGE
/ROUTINE TO GET A DIRECTORY WORD INTO CORE
/CALLING SEQUENCE:
/ TAD (POINTER TO RETRIEVAL INFORMATION)
/ JMS GE0
/ WORD NUMBER
/ RETURN (BUFFER POINTER IN AC, 0 IF NON-EXISTENT)
GE0, 0
DCA GERETP /STORE RETRIEVAL INFORMATION POINTER
TAD I GE0
AND K7400 /FIND UFD SEGMENT #
CLL RTL; RTL; RAL
TAD GERETP
DCA GERETP
TAD I GERETP /GET THE PHYSICAL SEGMENT #
SNA
JMP GE3
DCA RDTEMP
/FILE READ ROUTINE, CHECKS TO SEE IF BUFFER IS FULL.
/IF SO, IS IT THE SEGMENT WE ARE TRYING TO READ?
/IF YES, LEAVE, IF NO, WRITE OUT THE BUFFER
/BEFORE READING THE PROPER SEGMENT.
ISZ BUFSTA /ANYTHING IN BUFFER?
JMP RD0 /NO, READ
TAD RDCURR /YES, SAME AS SEGMENT WE ARE LOOKING FOR
CIA
TAD RDTEMP
SNA CLA /IS THIS THE SEGMENT WE WANT?
JMP RD3 /YES - SEGMENT ALREADY IN CORE
JMS I WRT1 /NO - WRITE IT OUT IF NECESSARY
RD0, TAD RDTEMP
JMS RD30 /SET UP PARAMETERS FOR A READ OPERATION
JMS I FIO01 /PERFORM THE READ
JMP I FIEXIT /ERROR ON READ
RD3, CLA CMA
DCA BUFSTA /SET BUFFER STATUS TO FULL
TAD C0377
AND I GE0 /ADDRESS WITHIN SEGMENT
TAD BUFFER /CREATE A POINTER
GE3, ISZ GE0
JMP I GE0 /RETURN
GERETP, 0
RDTEMP, 0
RDCURR, 0
K7400, 7400
C0377, 0377
/ROUTINE TO ZERO A DISC SEGMENT. WE DON'T ACTUALLY WRITE
/OUT ZEROES, ALL WE DO IS ZERO THE CORE-BUFFER AND SET
/THINGS UP SO IT WILL BE WRITTEN OUT THE NEXT TIME A BLOCK
/IS NEEDED OR WHEN FIP EXITS.
SCL0, 0
DCA SCLSEG /SAVE THE SEGMENT NUMBER
JMS I WRT1 /WRITE OUT THE BUFFER IF NECESSARY
TAD MSEGSZ
DCA CFH /SET THE BUFFER LENGTH
TAD BUFFER
DCA SCLPTR / AND THE BUFFER POINTER
SCL1, DCA I SCLPTR /NOW CLEAR THE BUFFER TO ZEROES
ISZ SCLPTR
ISZ CFH
JMP SCL1
TAD SCLSEG
JMS RD30 /SET UP THE READ PARAMETERS
CLA CMA / AND JUST INDICATE THE BUFFER IS FULL
DCA BUFSTA
SAVBUF /ALSO SET 'BUFFER CHANGED'
JMP I SCL0 /THEN JUST RETURN
MSEGSZ, -WRDSEG
SCLPTR= RDTEMP
SCLSEG= RDCURR
/ROUTINE TO SET UP FOR A READ
/ENTER WITH SEGMENT NUMBER. THIS IS CONVERTED
/TO A PHYSICAL DISC ADDRESS
RD30, 0
DCA RDCURR /SAVE AS CURRENT BUFFERED SEGMENT
CLA CMA
TAD RDCURR
CLL RTR
RTR
DCA RDTEMP
TAD RDTEMP
RAR
AND K7400
DCA FLPARB+5
TAD RDTEMP
AND C0377
TAD FIBASE
CLL RTL
DCA FLPARB+1
CFLD /CHANGE TO CURRENT FIELD
TAD K7400
DCA FLPARB+3 /WORD COUNT (ONE BUFFER)
CLA CMA
TAD BUFFER
DCA FLPARB+4 /CORE ADDRESS
TAD C6603 /READ IOT
DCA FLPARB
JMP I RD30
/ACTUAL IO ROUTINE
/SET UP ALL IO PARAMETERS IN "FLPARB", AND JMS FIPIO
FIPIO, 0
TAD FIPFLD
RAR
DCA FLPARB+2 /='S FIELD WE'RE IN TIMES 4
CFLD /CHANGE TO CURRENT FIELD IF NECESSARY
TAD FIRETP /POINTER TO FIORET
DCA 1 /RETURN ADDRESS - SET TO RETURN BELOW WHEN FIP IS RESTARTED
TAD FIO3 /GET FIPBLK
DATFLD
DCA I FIUTBA
CFLD
CIF
BLT /MOVE DISC TRANSFER PARMS INTO DSUTBL BLOCK
CFLD
FLPARB
DATFLD /DESTINATION FIELD
FIO3, FIPBLK /DESTINATION
-10 /WORD COUNT
CIF CDF
ISZ I DSBSYA /GLOBAL TO "DSBUSY"
WAIT
JMP I OVER /GO TO FIELD 0, LOCATION "OVERLA+5"
/MONITOR RETURNS CONTROL HERE AFTER COMPLETING THE TRANSFER
FIORET, CLA /RETURNS FROM DISC IO COME HERE
TAD C0200 /RESET THE FIP STARTING ADDRESS
DCA 1 /... TO 0200
FGETJT
JOBSTS
DATFLD
DCA FIPTR1
TAD I FIPTR1 /PICK UP "JOBSTS"
CFLD /CHANGE TO CURRENT FIELD
AND P0007 /CHECK ERROR BITS
SZA
JMP FIO6 /SOME KIND OF ERROR OCCURRED
ISZ FIPIO /NO ERROR, NORMAL RETURN
JMP I FIPIO
FIO6, TAD C7773 /-5, DISC ERROR CODE
SZA CLA
ISZ FIPIO /ERROR WAS NOT CAUSED BY DISC TRANSFER
JMP I FIPIO /EXIT WITHOUT SKIPPING TO INDICATE DISC TRANSFER ERROR
C7773, -5
DSBSYA, DSBUSY
FIPTR1, 0
FIUTBA, DSUTBL+4+4
FIRETP, FIORET
OVER, OVRLA1
PAGE
/ROUTINE TO CHECK WHETHER THE FILE A USER
/IS ATTEMPTING TO ACCESS IS HIS.
/CALLING SEQUENCE:
/ TAD (INTERNAL FILE NUMBER)
/ JMS UC0
/ ERROR RETURN (AC=0 IF FILE NOT OPEN)
/ NORMAL RETURN
UC0, 0
JMS I EBLD0
DCA UCENTP
TAD I UCENTP /PICK UP 'ENTTBL' ENTRY FOR THIS FILE
SNA
JMP I UC0 /FILE NOT OPEN
CIA
CMA
CLL RAL / * 2 (AND ZAP 'EXCLUSIVE USE' BIT)
TAD UFDTBL
DCA UCUFDP /POINTER TO OPEN UFD TABLE
CLA CMA
TAD I UCUFDP
SNA CLA /IS THIS A DIRECTORY?
JMP UC1 /YES - ONLY OWNER GETS IT (NOT BILLING SYSTEM)
CHKACT /NO - IS THIS A PRIVILEGED USER?
JMP UC2 /YES - HE GETS ANYTHING ELSE
UC1, TAD FIACCT /GET HIS ACCOUNT NUMBER
CIA
TAD I UCUFDP
SNA /DOES HE OWN THIS?
UC2, ISZ UC0 /YES - FIX RETURN ADDRESS
JMP I UC0
UCUFDP, 0
/THIS HANDLES THE 'LOGOUT' IOT - IF THE AC IS SET TO THE
/USER'S JOB NUMBER, WE LOG HIM OUT; IF THE AC IS 0, WE RETURN
/THE NUMBER OF ADDITIONAL USERS LOGGED-IN UNDER HIS ACCOUNT.
LGO0, TAD FIOSTK+1 /DID HE SET HIS AC= TO HIS JOB #?
CIA
TAD FIJOB
SZA CLA
JMP I LGO1A /NO - SEE IF HE WANTS COUNT OF OTHER USERS
JMS I LNS01 /YES - FIRST RELEASE ALL HIS DEVICES
JMP .+3
JMS I REL01
JMP .-3 /KEEP GOING
JMS I CL01 /CLOSE FILE 0
IAC
JMS I CL01 /CLOSE FILE1
CLL CML RTL
JMS I CL01 /CLOSE FILE 2
TAD P0003
JMS I CL01 /CLOSE FILE3
TAD FIACCT /GET USER'S ACCOUNT NUMBER
DCA LGOPRM+1 /DELIVER TO CALLING SEQUENCE FOR SEARCH
CLA CMA
JMS I DS01 /FIND MFD ENTRY; 1 WORD SEARCH
LGOPRM
HLT /ERROR - MASTER DIRECTORY MAY BE LOST *****
TAD C0006
DCA LGOPTR /POINTER TO CP TIME COUNTER
TAD I ZDS1 /PICK UP THE RELATIVE UFD-LOCATION
DCA LGOENT / FOR CHECKING IF REDUCTION IS POSSIBLE
FGETJT
JOBRTM /JOB RUN TIME IN STATUS
DCA FIOSTK+6 /POINTS TO LOW ORDER RUN TIME
FGETJT
JOBRTH
DCA FIOSTK+7 / AND HIGH-ORDER
DATFLD
TAD I FIOSTK+6
AND C7700 /USE HIGH PART OF LOW-ORDER TIME
CLL RAL
DCA FIOSTK+6
TAD I FIOSTK+7
CFLD /BACK TO THIS FIELD
AND P0077
TAD FIOSTK+6 /NOW COMBINE THE TWO
RTL
RTL
RTL
TAD I LGOPTR /UPDATE RUNTIME (CPU TIME : DATE WORD)
SZL /DID IT JUST OVERFLOW?
CLA CMA /YES - FORCE IT TO THE MAXIMUM
DCA I LGOPTR
SAVBUF / & SET 'BUFFER CHANGED' SWITCH
ISZ LGOPTR /NOW GET TO THE RETRIEVAL-BLOCK POINTER
TAD I LGOPTR
DCA LGORET / & SAVE IT FOR POSSIBLE UFD REDUCTION
TAD FIACCT
JMS I UTS01 /FIND OUR ACCOUNT NUMBER IN 'UFDTBL'
HLT /ERROR - NO 'UFDTBL' ENTRY FOR US *****
JMS I BLDP1 /CALCULATE THE 'ENTTBL' ENTRY LOCATION
DCA LGOPTR / IN CASE WE'RE THE LAST USER OF THIS UFD
ISZ I UTPRNU /DECREMENT THE ACCESS-COUNT FOR THIS UFD
JMP LGO3
TAD RETTBL /LAST USER ACCESSING THIS UFD
JMS I ENS01 /FIND THE NUMBER OF USERS READING IT
UCENTP,
LGOENT, 0
SZA CLA /DOES ANYONE HAVE IT OPEN AS A FILE?
JMP LGO2 /YES - WE COULDN'T REDUCE IT NOW
TAD LGOPTR
JMS I GE01 /NO - GET THE INITIAL LINK-WORD IN THE UFD
3
DCA LGOENT
TAD I LGOENT
SZA CLA /IS THE UFD COMPLETELY EMPTY?
JMP LGO2 /NO - CAN'T REDUCE IT THEN
CLA CLL IAC
JMS I RED301 /NOW REDUCE THE UFD TO ONE SEGMENT
LGORET, 0
RTABLE / (FIRST RETTBL ENTRY IS ALWAYS MFD)
LGO2, CLA CMA
TAD UTPRNU
JMS I TF01 /NOW FREE THE 'UFDTBL' ENTRY
LGO3, CLA
TAD LGO4A /KLUDGE FIEXIT TO RETURN TO LGO4
DCA I LGKLUJ
TABOUT, CLA CMA
DCA TABSTA /FORCE TABLES OUT
JMP I FIEXIT
LGKLUJ, FIX500
LGOPRM, RTABLE /2-WORD PARAMETER BLOCK FOR 'DS01'
LGOPTR, 0
LGO1A, LGO1
LGO4A, LGO4
LNS01, LNS0
RED301, RED30
/ROUTINE TO RETURN A BLOCK TO FREE-CORE.
RETBKS, 0
CFLD
CIF
RETBLK /JUST LINK TO FIELD 0
JMP I RETBKS / AND RETURN
/ROUTINE TO RETURN A LINKED LIST OF FREE-CORE BLOCKS.
RETBLS, 0
SNA /AT END OF CHAIN?
JMP I RETBLS /YES - RETURN
JMS RETBKS /NO - RELEASE THE BLOCK
JMP .-3
PAGE
/ROUTINE TO OPEN A UFD & LEAVE ZERO ACCESS COUNT
/CALLING SEQUENCE:
/ TAD (PROJ,PROG NUMBER)
/ JMS UFO0
/ ERROR RETURN
/ NORMAL RETURN (POSITION ON TABLE IN AC)
UFO0, 0
DCA UFORET /SAVE THE ACCOUNT NUMBER
TAD UFORET
JMS I UTS01 /SEARCH THE TABLE
SKP CLA /NOT FOUND - BUILD NEW ENTRY
JMP UFOEXT /GOT IT - JUST EXIT
TAD UFORET
JMS UFO6 /GET THE RETRIEVAL INFO. FOR THIS UFD
JMP UFO5 /NO LUCK - TAKE ERROR EXIT
DCA UOBUFP /POINTER TO RETRIEVAL INFORMATION
TAD UFDTBL
DCA UOUFDP /UFD TABLE POINTER
/SEARCH FOR A FREE SLOT IN UFDTBL
UFO3, TAD I UOUFDP
SNA CLA
JMP UFO2 /FOUND A FREE SLOT ON THE TABLE
ISZ UOUFDP
TAD I UOUFDP
SNA CLA /IS IT REALLY EMPTY?
JMP UFO10 /YES - CLEAN UP
/NO IT IS OCCUPIED
ISZ UOUFDP
TAD UOUFDP
CIA
TAD UFDEND
SZA CLA /HAVE WE SEARCHED THE WHOLE TABLE?
JMP UFO3 /LOOK AT NEXT SLOT
UFO5, CLA CLL
JMP I UFO0 /NO ROOM ON TABLE
/COMES HERE WITH UOUFDP POINTING TO A FREE SLOT IN UFDTBL
UFO10, CLA CMA
TAD UOUFDP /BACK UP THE POINTER
DCA UOUFDP
UFO2, TAD UFORET+1
DCA I UOUFDP /PUT PROJ,PROG NUMBER ON TABLE
ISZ UOUFDP
DCA I UOUFDP /ACCOUNT FOR THIS ACCESS
CLA CMA
TAD UFDTBL
CIA
TAD UOUFDP
CLL RAR
DCA UFO1 /RELATIVE POSITION ON TABLE
TAD UFO1
JMS I BLDP1 /GENERATE A PTR. INTO RETTBL
DCA UFORET /RETRIEVAL POINTER
TAD C7771
DCA CFH /COUNTER FOR TRANSFER TO TABLE
/NOW MOVE RETRIEVAL INFORMATION FOR THIS GUY'S
/UFD INTO RETTBL
UFO4, ISZ UOBUFP
TAD I UOBUFP
DCA I UFORET
ISZ UFORET
ISZ CFH /ENTIRE RETRIEVAL BLOCK TRANSFERRED?
JMP UFO4 /NO, KEEP IT UP
TAD UFO1 /YES - PICK UP RELATIVE POSITION
UFOEXT, ISZ UFO0 /PREPARE FOR NORMAL RETURN
JMP I UFO0
UFORET, 0
0
UOUFDP=UTPRNU
/ROUTINE TO READ IN THE RETRIEVAL INFORMATION FOR THE
/UFD BELONGING TO THE ACCOUNT NUMBER PASSED IN THE AC.
UOBUFP,
UFO6, 0
DCA UFORET+1 /SET UP CALLING SEQUENCE FOR MFD SEARCH
TAD RETTBL
DCA UFORET
CMA
JMS I DS01 /ONE WORD MASTER FILE DIRECTORY SEARCH FOR PROJ,PROG MATCH
UFORET
JMP I UFO6 /COULD NOT FIND UFD ENTRY
TAD P0007
DCA UFORET /POINTER TO UFD RETRIEVAL INFORMATION
TAD I UFORET
DCA UFO1
TAD RETTBL /GET POINTER TO RETRIEVAL INFO FOR THE MFD
JMS I GE01 /GET RETRIEVAL INFORMATION INTO CORE
UFO1, 0
ISZ UFO6
JMP I UFO6
/ROUTINE TO ASSIGN A DEVICE
ASD1, TAD FIOSTK+1
JMS I DTE01 /IS THIS DEVICE ASSIGNED TO THIS JOB?
ASD2, 0 /SET BY DTE01 TO POINT TO PROPER ENTRY IN DEVTBL
SKP
JMP ASD5 /YES
TAD I ASD2 /GET THE DDB ADDRESS
SNA /IS THERE A DDB?
JMP ASD3 /NO - OKAY TO ASSIGN IT
/
/COMES HERE IF ONE JOB ATTEMPTS TO ASSIGN AN ALREADY ASSIGNED DEVICE
IAC
DCA CFH /NOW POINTS TO JOB # (OR LOC 0, IF ILLEGAL)
TAD I CFH
SNA /JOB NUMBER THERE?
CMA /NO - RETURN 7777
DCA FIUSAC /RETURN THE OWNER'S JOB NUMBER
JMP ASD4 /EXIT
/
/COMES HERE IF OKAY TO MAKE THIS ASSIGNMENT
ASD3, TAD FIOSTK+1
SMA /IS THE DEVICE BEING ASSIGNED A TELETYPE?
JMP I LGI201 /YES - THAT'S NOT ALLOWED
TAD ASDCHK
SPA CLA /IS HE TRYING TO GET THE RK05?
JMP .+3 /NO
CHKPRV /YES - DOES HE HAVE PRIVILEGE?
JMP I LGI201 /NO - ERROR
CFLD /CHANGE TO CURRENT FIELD
TAD ASD2
CIF
GETDDB /GET A BLOCK FROM THE FREE LIST AND LINK IT INTO DEVTBL
JMP I LGI201 /NO BLOCK - JUST RETURN A BAD STATUS
DATFLD
TAD I ASD2 /PICK DDB ADDRESS FROM DEVTBL
DCA CFH /SAVE IT
TAD FIOSTK+1
AND P0037
DCA I CFH /SET TO REFLECT THE DEVICE NUMBER
ISZ CFH
TAD FIJOB
DCA I CFH / AND STORE THE JOB NUMBER
ASD4, CFLD
JMP I FIEXIT /THEN JUST EXIT
/
/USER ALREADY OWNS THE DEVICE - IF IT'S THE HSR, JUST CLEAR THE BUFFER.
ASD5, TAD FIOSTK+1
CLL RAL
SZA CLA /HSR?
JMP ASD4 /NO - JUST EXIT
TAD I ASD2 /GET THE DDB POINTER
CIF
JMS I ASDCLR /CLEAR THE BUFFER
JMP ASD4
ASDCHK, -4030 /RK05 DRIVE 0 ASSIGN CODE
ASDCLR, SICLR
PAGE
/EXIT ROUTINE
/COMES HERE WHEN FIP HAS COMPLETED ITS TASK
/FIRST, SEE IF ANY INTERNAL FILE HAVE BEEN CHANGED
/THOSE THAT HAVE CHANGED MUST BE WRITTEN BACK OUT TO DISC
FIX0, CFLD
CLA
JMS I WRT1 /MAKE SURE THE BUFFER IS EMPTY
ISZ TABSTA /CHECK TABLE STATUS
JMP FIX1 /NOTHING CHANGED IN TABLES
TAD FIPTBS /BOTTOM OF TABLE AREA
JMP FIX2 /SAVE TABLES BEFORE EXIT
FIX1, ISZ SATSTA /CHECK SAT STATUS
JMP FIX20 /NOTHING TO BE SAVED, EXIT
TAD SATBOT /BOTTOM OF SAT
FIX2, JMS FIX40
TAD FIDEXP /GLOBAL TO "FIPDEX"
DCA FLPARB+1 /MEMORY FIELD
TAD C6605
DCA FLPARB /WRITE IOT
JMS I FIO01 /PERFORM THE WRITE
HLT /ERROR ON WRITE, FATAL
/ALL DISC TABLES ARE NOW UP TO DATE
FIX20, FGETJT
JOBSTS
DCA FIOPTR
DATFLD
TAD I FIOPTR
AND FISIOT /CLEAR 'FIP IOT' BIT
DCA I FIOPTR
CFLD
FGETJT /RESTORE USER REGISTERS
JOBREG
DCA FIX21
CIF
BLT
CFLD
FIUSPC
DATFLD
FIX21, 0
-5
JMP I .+1
FIX500, FIX50 /CHANGED TO 'LGO4' DURING LOGOUT PROCESSING
FIX50, CFLD
TAD I SEGCNT
CDF
DCA I FIXCNT /STORE # FREE SEGMENTS IN FIELD 0
CHKSRC /WHO CALLED US?
JMP FIX30 /A USER - JUST CLEAR THE ENTRY
TAD C6603 /'SI' - SET UP TO READ IT IN
DCA FLPARB
DCA FLPARB+1 /SI IS IN THE TRACK 0 OF THE DISC
JMS FIX40
JMS I FIO01 /RETURN WILL BE TO SI
/FIP WAS CALLED BY A USER - JUST CLEAR THE 'CORTBL' ENTRY
FIX30, CDF
TAD I FANFLD /A USER - GET THE 'CORTBL' ENTRY
AND FIPCLR / AND CLEAR THE JOB NUMBER & LOCK BIT
DCA I FANFLD
JMP I .+1 /NOW GO CHECK FOR OTHER 'FIPJOB'S
FIXSCH
/ROUTINE TO SET UP THE PARAMETERS IN 'FLPARB'.
FIX40, 0
DCA FLPARB+3 /SET (-) WORD-COUNT
TAD FLPARB+3
DCA FLPARB+5 /SET DISC ADDRESS
CLA CMA
TAD FLPARB+5
DCA FLPARB+4 /SET CORE ADDRESS - 1
JMP I FIX40
FIPCLR, FSWP+NOTRUN+FIP+SI
FIPFIP= C0400
FIPTBS, ENTABL /LOWEST TABLE IN FIP
FISIOT, -JSIOT-1
FIXCNT, NFSEGS /VALUE FOR RESIDENT 'SEGS'
SEGCNT, -SATSIZ+1 /POINTER TO # FREE SEGMENTS
/ROUTINE TO DETERMINE IF A DEVICE IS ASSIGNED TO THIS JOB
/CALLING SEQUENCE:
/ TAD (DEVICE NUMBER)
/ JMS DTE0
/ RETURN (DEVICE NOT ASSIGNED TO THIS JOB)
/ RETURN (DEVICE ASSIGNED)
DTE0, 0
SPA /IS IT A TTY?
JMP .+4 /NO
CLL RAL /YES - GET THE DEVTBL ENTRY-ADDRESS
TAD DEVTBA
JMP DTE1
AND P0077 /EXTRACT THE DEVICE NUMBER
TAD DEVEND / & FIND THE DEVTBL ENTRY
DTE1, DCA DTE2 /POINTER TO DEVTBL ENTRY
TAD DTE2
CIA
TAD DEVOVR
SMA CLA /IS IT A LEGAL DEVICE NUMBER?
JMP .+3 /YES
TAD DTEBAD
DCA DTE2 /NO - FUDGE SO JOB=0 (CHANGED TO 7777)
TAD DTE2
CFLD
DCA I DTE0 /PASS BACK THE DEVTBL POINTER
ISZ DTE0
DATFLD
TAD I DTE2 /GET THE DDB ADDRESS
SNA /IS THERE A DDB?
JMP I DTE0 /NO - DEVICE NOT ASSIGNED TO ANYONE
DCA DTE2
ISZ DTE2
TAD I DTE2
AND P0077 /EXTRACT JOB NUMBER
CIA
TAD FIJOB /NUMBER OF CURRENT JOB
SNA CLA
ISZ DTE0 /"ASSIGNED" RETURN
JMP I DTE0 /NOT OWNED BY THIS JOB
DTEBAD, JOBTBL-1
/ROUTINE TO FREE AN ENTRY ON THE UFD TABLE
/CALLING SEQUENCE:
/ TAD (POSITION ON UFDTBL)
/ JMS TF0
/ RETURN
DTE2,
TF0, 0
DCA TFUFDP /POSITION ON TABLE
DCA I TFUFDP /CLEAR OWNERS PROJ,PROG NUMBER
TAD UFDTBL /BEGINNING OF TABLE
CIA
TAD TFUFDP
CLL RAR /RELATIVE POSITION ON TABLE
IAC
JMS I BLDP1 /BUILD A PTR. TO ENTTBL
DCA TFUFDP /POINTER TO RETRIEVAL INFORMATION
TAD P7770 /SET # WORDS PER ENTTBL ENTRY
DCA TFCNTR
TF1, DCA I TFUFDP /ZERO OUT THE ENTRY
ISZ TFUFDP
ISZ TFCNTR
JMP TF1
JMP I TF0
/ROUTINE TO GET THE FILE CONTROL-BLOCK FOR THE
/FILE WHOSE INTERNAL FILE NUMBER IS IN THE AC.
TFUFDP,
LNK0, 0 /GET FILE LINKAGE
TAD LNKF
DCA LNK1
FGETJT
TFCNTR,
LNK1, 0
DCA CFH
DATFLD
TAD I CFH /PTR TO FILE CONTROL BLOCK
JMP I LNK0
LNKF, JOBF0
PAGE
/ROUTINE TO FIND AN EMPTY DIRECTORY ENTRY; THE UFD
/IS EXTENDED IF NECESSARY.
/CALL: TAD (POINTER TO UFD RETRIEVAL INFORMATION)
/ JMS DE0
/ BAD RETURN (NO FREE ENTRY OR NO DISC FOR UFD)
/ NORMAL RETURN (POINTER TO ENTRY IN AC)
DE0, 0
DCA DERETP /SAVE THE RETRIEVAL POINTER
DCA DEBEGG /CLEAR THE 'FROM BEGINNING' SWITCH
TAD DERETP
DCA INDEX
/
/IN ORDER TO SAVE DISC I/O, WE START THE SEARCH FROM THE
/MIDDLE OF THE UFD IF WE ALREADY HAVE ONE OF ITS SEGMENTS
/IN OUR SEGMENT BUFFER. IF WE DON'T FIND AN ENTRY FROM THE
/MIDDLE, WE RE-CHECK THE UFD FROM THE BEGINNING; IF WE STILL
/DON'T FIND AN ENTRY, WE EXTEND THE UFD.
DE1, TAD SEGSIZ
DCA DEWORD /SET INITIAL ADDRESS TO SECOND SEGMENT IN UFD
TAD I INDEX /GET THE NEXT SEGMENT INDEX IN THE UFD
SNA /IS THERE A NEXT?
JMP DE2 /NO - WE SEARCH FROM THE TOP
CIA
TAD I DECURR
SNA CLA /YES - IS IT OUR BUFFERED SEGMENT?
JMP DE4 /YES - START SEARCH FROM WHERE WE ARE
TAD DEWORD /NO - UPDATE OUR ADDRESS BY ONE SEGMENT
JMP DE1 / & CONTINUE CHECKING
/
/THE BUFFERED SEGMENT IS NOT ANY OF THIS UFD'S OR WE COULDN'T
/FIND A FREE ENTRY STARTING FROM THE MIDDLE OF THE UFD,
/SO WE SEARCH THE UFD FROM THE BEGINNING.
DE2, CLA CMA
DCA DEBEGG /SET THE 'FROM BEGINNING' SWITCH
DE3, TAD C0010
DCA DEWORD /SET THE NEW READ ADDRESS
DE4, TAD DERETP
JMS I GE01 /GET THE NEXT ENTRY
DEWORD, 0
SNA /WAS IT WITHIN THE UFD?
JMP DE6 /NO - GO TRY TO EXTEND IT
DCA CFH /YES - SAVE ITS CORE LOCATION
TAD I CFH /GET THE FIRST ENTRY-WORD
SZA CLA /IS IT CLEAR?
JMP DE5 /NO - TRY THE NEXT
ISZ CFH
TAD I CFH /YES - CHECK THE SECOND WORD
SZA CLA /IS THAT OK ALSO?
JMP DE5 /NO
TAD DEWORD /YES - WE HAVE AN EMPTY ENTRY
ISZ DE0 / SO SKIP TO INDICATE IT
JMP I DE0 / AND RETURN WITH ITS LOCATION IN THE AC
DE5, TAD DEWORD /NOT THIS ENTRY - UPDATE THE ADDRESS
JMP DE3 / AND CONTINUE SEARCH
/
/WE'VE RUN PAST THE END OF THE UFD - WE MAY HAVE TO EXTEND IT.
DE6, ISZ DEBEGG /WAS THIS SEARCH FROM THE FRONT OF THE UFD?
JMP DE2 /NO - SEARCH AGAIN, THIS TIME FROM THE FRONT
TAD DERETP
DCA DEPTR /YES - FIND THE NEXT SEGMENT SLOT
TAD C7771
DCA CFH /SET THE COUNTER (7 SEGMENTS MAXIMUM PER UFD)
DE7, TAD I DEPTR /GET THE NEXT SEGMENT POINTER
SNA CLA /IS THERE A NEXT?
JMP DE8 /NO - WE HAVE ROOM FOR A SEGMENT
ISZ DEPTR /YES - INCREMENT THE POINTER
ISZ CFH
JMP DE7 / & TRY AGAIN
JMP I DE0 /CAN'T EXTEND THE UFD - TAKE ERROR EXIT
/
/WE HAVE ROOM FOR ANOTHER SEGMENT - GET ONE FROM SAT.
DE8, JMS I SATL1 /FIND A FREE SEGMENT
SNA /WAS ONE AVAILABLE?
JMP I DE0 /NO - TAKE ERROR EXIT
DCA I DEPTR /YES - SAVE IT IN THE RETRIEVAL TABLE
TAD DERETP
JMS I ENS31 /GET THE RELATIVE ENTRY NUMBER
CLL RAL
TAD UFDTBL / & THE POINTER INTO 'UFDTBL'
DCA CFH
TAD I CFH /GET THE OWNER'S ACCOUNT NUMBER
JMS I UFO61 / & FETCH THE UFD RETRIEVAL BLOCK
HLT /ACCOUNT NOT FOUND - ERROR *****
DCA CFH /SAVE THE BUFFER POINTER
ISZ CFH
TAD I CFH /GET THE SEGMENT NUMBERS
SZA CLA /IS THIS THE END OF THE POINTERS?
JMP .-3 /NO - KEEP LOOKING
TAD I DEPTR /YES - SET OUR NEW SEGMENT NUMBER
DCA I CFH / INTO THE RETRIEVAL BLOCK
SAVBUF /NOW SET THE SWITCH TO WRITE BACK THE BUFFER
CLA CMA
DCA TABSTA / AND INDICATE THE TABLES HAVE BEEN CHANGED
TAD I DEPTR
JMS I SCL01 /FINALLY WE ZERO THE NEW UFD SEGMENT
JMP DE4 / AND THEN FINISH OUR SEARCH
DECURR, RDCURR
DEPTR, 0
DERETP, 0
ENS31, ENS3
UFO61, UFO6
/ROUTINE TO SEARCH UFD TABLE FOR PROJ,PROG NUMBER
/CALLING SEQUENCE:
/ TAD (PROJ,PROG NUMBER)
/ JMS UTS0
/ NOT FOUND RETURN
/ NORMAL RETURN (RETRIEVAL POSITION IN AC)
DEBEGG,
UTS0, 0
DCA UTPR1 /PROJ,PROG NUMBER
TAD UFDTBL /PTR. TO HEAD OF UFDTBL
DCA UTUPTR
UTS1, TAD UFDEND /END OF UFD TABLE
CIA
TAD UTUPTR
SNA CLA
JMP I UTS0 /COULD NOT FIND PROJ,PROG NUMBER ON TABLE
TAD I UTUPTR
CIA
TAD UTPR1
SNA CLA
JMP UTS3 /FOUND ENTRY, GET POINTER
ISZ UTUPTR /STEP UP ONE SLOT
ISZ UTUPTR
JMP UTS1 /LOOK IN THE NEXT ENTRY
UTS3, TAD UFDTBL
CIA
TAD UTUPTR
CLL RAR /RELATIVE POSITION ON TABLE
IAC /THE RELATIVE POSITION
ISZ UTPRNU /UTPRNU POINTS TO ACCESS COUNT OF THIS PROJ, PROG #
ISZ UTS0
JMP I UTS0
UTUPTR= UTPRNU
/ROUTINE TO FIND THE ADDRESS OF A WORD IN THE
/JOB STATUS BLOCKS FOR THIS JOB.
UTPR1,
FGETJ0, 0
DATFLD
TAD I JOBDAT
SNA CLA /IS EVERYTHING PROPER?
REBOOT /NO - ERROR *****
CFLD
TAD I FGETJ0 /GET THE RELATIVE WORD NUMBER
DCA .+4
TAD JOBDAT /NOW GET THE ADDRESS OF A 'JOBTBL' POINTER
CIF
GETJTA / AND LET THE FIELD 0 ROUTINE DO THE WORK
0
ISZ FGETJ0
JMP I FGETJ0 /THEN JUST RETURN; AC=ADDRESS
/ROUTINE TO INITIATE AN AUTOMATIC SYSTEM RESTART.
/
RBOOT, 0
IOF
CLA
TAD RBOOT
CIF
JMP I .+1 /OFF TO FIELD 0 WITH ERROR ADDRESS IN THE AC
RELOAD
PAGE
/THIS HANDLES THE 'REL' IOT - RELEASE A DEVICE.
REL0, TAD FIOSTK+1 /GET THE DEVICE NUMBER
SPA /IS IT A TTY?
JMS REL00 /NO - GO AHEAD AND RELEASE IT
JMP I FIEXIT
/ROUTINE WHICH ACTUALLY RELEASES THE DEVICE.
REL00, 0
JMS I DTE01 /IS THIS DEVICE ASSIGNED TO THIS USER?
RELDVT, 0 /SET BY DTE0 TO POINT TO DEVTBL ENTRY FOR THIS DEVICE
JMP REL8 /NO - TAKE ERROR EXIT IF SI
TAD I RELDVT
DCA RELBLK /SAVE ADDRESS OF DDB
TAD RELBLK
TAD P0003 /POSITION OF TIME IN DDB
DCA RELASD
TAD I RELASD /GET TIME ASSIGNED
CIA
DCA RELASD /-TIME ASSIGNED
CDF
TAD I RELCK1 /GET TIME NOW
AND C7000 /JUST SIGNIFICANT PART OF LOW-ORDER
CLL RAL
DCA RELNOW
TAD I RELCK2
CFLD /BACK TO THIS FIELD
AND P0777 / AND INSIGNIFICANT PART OR HIGH ORDER
TAD RELNOW /TIME AT RELEASE
RTL
RAL
TAD RELASD /-TIME AT ASSIGNMENT (13-BIT SUBTRACT)
SNL /GONE THROUGH MIDNIGHT?
TAD RELCON /YES - ADD FUDGE FACTOR
SNA /ANYTHING TO RECORD?
JMP REL1 /NO
DCA RELASD /YES - SAVE IT
TAD FIACCT
DCA RELRTB+1 /NOW BUILD THE PACKET FOR 'DS0'
CLA CMA
JMS I DS01 /FIND THE MASTER DIRECTORY ENTRY
RELRTB
HLT /MFD IS LOST *****
TAD C0005
DCA CFH /NOW POINTS TO DEVICE TIME WORD
CLA CLL
TAD RELASD
TAD I CFH /ADD IN THE NEW TIME
SZL /DID IT OVERFLOW?
CLA CMA /YES - FORCE IT TO ITS LARGEST
DCA I CFH
SAVBUF /REMEMBER TO WRITE BACK THE BLOCK
REL1, DATFLD
CLA CLL CML
TAD RELDVT
TAD RELDTA
SPA /IS IT THE DTA, OR RK05
RAR /NO - MUST BE HSR, ?, CDR, OR CHARACTER DEVICE
SNL /IS IT A CHARACTER OUTPUT DEVICE?
JMP REL6 /NO - MUST BE KEYBOARD, HSR, ?, CDR, R2, OR X DEVICE
TAD RELREG
REL2, DCA RELBLK /POINTS TO ENTRY IN 'OUTREG' (OR 0 FOR KEYBOARD OUTPUT)
CLA CMA
TAD I RELDVT
DCA INDEX /POINTS TO WORD 0 OF DDB
TAD I INDEX
SPA CLA /IS THE TTY IN ^S MODE?
JMP REL3 /YES - FLUSH IT OUT
DCA I INDEX /CLEAR THE JOB NUMBER
ISZ INDEX
ISZ INDEX
TAD I INDEX
SZA CLA /IS THE FILL-POINTER ZERO?
JMP REL4 /NO - LET 'CONOUT' RELEASE THE BLOCK
TAD RELBLK
SZA CLA /ASSIGNABLE DEVICE?
JMP REL5 /YES
REL3, TAD I RELDVT
CIF
JMS I RELCLR /FLUSH THE DEVICE BUFFER
DATFLD
TAD I RELDVT
JMS I RETBK1 / AND RELEASE THE BLOCK
CLA
DATFLD
DCA I RELDVT /THEN CLEAR THE DEVTBL ENTRY
REL4, CFLD
JMP I REL00 / AND RETURN
REL5, CIF 20 / (JUST INHIBIT INTERRUPTS WHEN CHECKING OUTREG)
TAD I RELBLK
CLL RAL
SNA /IS AN INTERRUPT EXPECTED OR A CHARACTER BUFFERED?
JMP REL3 /NO - JUST CLEAR OUT THE DDB
SPA /YES - IS AN INTERRUPT PENDING?
CLL CML /YES - INSURE DEVICE SERVICING
RAR
DCA I RELBLK / AND RESTORE THE WORD
JMP REL4
REL6, SMA CLA /IS IT A KEYBOARD OR THE HSR?
JMP REL7
TAD RELBLK
CIF
JMS I RELCLR /YES - CLEAR THE BUFFER
REL7, TAD RELBLK
JMS I RETBK1 /RETURN THE FREE-BLOCK
CLA
DATFLD
DCA I RELDVT / AND CLEAR THE DEVTBL ENTRY
TAD DEVEND
CIA
TAD RELDVT
SMA CLA /IS THIS A KEYBOARD?
JMP REL4 /NO - JUST RETURN
ISZ RELDVT /YES - SET THE POINTER TO THE OUTPUT SIDE
JMP REL2 / AND RUN IT ALL AGAIN
/DEVICE RELEASED IS NOT OWNED BY THIS USER.
REL8, CHKSRC /IS HE USING A KEYBOARD COMMAND?
JMP I REL00 /NO - JUST RETURN
JMP I LGI201 /YES - TELL 'SI' HE BLEW IT
RELASD, 0
RELBLK, 0
RELRTB, RTABLE /TWO-WORD PACKET FOR 'DS0'
RELNOW, 0
RELCK1, CLK1
RELCK2, CLK2
RELCLR, SICLR
RC1= INCLK1%1000
RELCON, INCLK2^10+RC1 /FUDGE FOR MIDNIGHT OVERFLOW
RELDTA, -DEVTBE-20
RELREG, DEVTBE+20-DEVTBL%2+OUTREG / = OUTREG+NULINE+CONTTY+10
PAGE
/RENAME ROUTINE
REN0, JMS I IFN01
JMS I UC01 /DOES HE OWN THE FILE?
JMP REN1 /NO - ERROR
TAD FIOSTK+1 /YES - SAVE THE INTERNAL FILE #
DCA FIOSTK
TAD I RENUCP /GET THE OWNER'S ACCOUNT NUMBER
DCA REPRTP
TAD I REPRTP
JMS I UTS01 / AND FIND THE 'UFDTBL' ENTRY
HLT /BAD - IF THE FILE'S OPEN, THERE MUST BE ONE *****
JMS I BLDP1 /GET THE 'RETTBL' ENTRY ADDRESS
DCA FIOSTK+1
CLA CMA
TAD I REPRTP /CHECK THE OWNER'S ACCOUNT
SNA CLA /IS IT A DIRECTORY (I.E. OWNED BY ACCT # 1)?
CLA CMA /YES - THE FIRST WORD (ACCOUNT) MUST BE UNIQUE
JMS I DS01 /NOW CHECK IF THE NAME ALREADY EXISTS
FIOSTK+1
SKP CLA /NOPE - OK TO RENAME
JMP REN2 /YES - "INVALID FILE NAME"
TAD FIOSTK
JMS I GD01 /GET THIS DIRECTORY ENTRY INTO CORE
DCA REENTP / AND SAVE THE POINTER
TAD REENTP
TAD P0004
DCA REPRTP /POINTER TO PROTECTION BITS
TAD I REPRTP /PICK UP PROTECTION BITS
AND C0020
SZA CLA /WRITE-PROTECTED AGAINST OWNER?
JMP REN1+1 /YES - "PROTECTION VIOLATION"
TAD FIOSTK+2 /TRANSFER NEW NAME TO DIRECTORY
SNA /IS IT A NULL NAME?
JMP REN2 /YES, DON'T RENAME
DCA I REENTP
ISZ REENTP
TAD FIOSTK+3
DCA I REENTP
ISZ REENTP
TAD FIOSTK+4
DCA I REENTP
SAVBUF /SET 'BUFFER CHANGED' SWITCH
JMP I FIEXIT /EXIT FROM FILE PHANTOM
REN1, SZA CLA /WHICH ERROR?
CPERR2, CLL CML RAR /6000 - PROTECTION VIOLATION
CLL CML RAR /4000 - NO FILE OPEN
DCA FIUSAC
JMP I FIEXIT
REN2, CLA CLL CML RTR /6400 - INVALID FILE NAME
JMP REN1+1
REENTP, 0
RENUCP, UCUFDP
REPRTP, 0
/THIS HANDLES THE 'CPASS' IOT - CHANGE PASSWORD.
/IF THE SYSTEM MANAGER PASSES THE INCORRECT CURRENT
/PASSWORD, HE IS SIMPLY RETURNED AN ERROR CODE;
/IF ANYONE ELSE PASSES US AN INCORRECT CURRENT
/PASSWORD, THEY ARE AUTOMATICALLY LOGGED-OUT.
CPASS0, TAD FIOSTK+1
SNA CLA /RATIONAL ACCOUNT NUMBER?
JMP CPERR2 /NO - RETURN ERROR CODE
CLA CMA
TAD FIACCT
SNA CLA /IS THIS THE MANAGER?
JMP CPASS1 /YES
TAD FIACCT
CIA
TAD FIOSTK+1
SZA CLA /NO - IS THIS HIS OWN PASSWORD?
JMP CPERR2 /NO - JUST SAY "PROTECTION VIOLATION"
CPASS1, TAD RETTBL
DCA FIOSTK /MFD IS ALWAYS FIRST ENTRY
JMS I DS01 /SEARCH FOR ACCT & PASSWORD IN MFD
FIOSTK
JMP CPERR1 /NOT THERE - ERROR!
DCA INDEX /SAVE THE ENTRY CORE-ADDRESS
CLA CMA
TAD FIACCT
SNA CLA /IS THIS THE MANAGER (#1)?
JMP CPASS2 /YES - HE CAN CHANGE ANYONE'S PASSWORD
TAD INDEX /NO - GET THE UFD PROTECTION
TAD P0004
DCA CFH
TAD I CFH
AND CPBIT /CHECK THE 'CHANGE PASSWORD DISABLE' BIT
SZA CLA /CAN HE CHANGE HIS OWN PASSWORD?
JMP CPERR2 /NO - "PROTECTION VIOLATION"
CPASS2, TAD FIOSTK+4 /YES - SET THE NEW PASSWORD
DCA I INDEX
TAD FIOSTK+5
DCA I INDEX
SAVBUF /SET THE 'BUFFER CHANGED' SWITCH
JMP I FIEXIT / AND EXIT
CPERR1, CLA CMA
TAD FIACCT
SNA CLA /IS THIS THE MANAGER?
JMP CPERR2 /YES - JUST RETURN ERROR CODE
TAD CPLOUT /NO - SET UP THE 'LOGOUT' PARMS
DCA FIOSTK
TAD FIJOB
DCA FIOSTK+1
JMP I .+1 /THEN LOG HIM OUT
LGO0
CPBIT, 2000 /BIT IN UFD PROTECTION - IF SET, PROHIBITS CPASS
CPLOUT, LOUT
/THIS HANDLES THE 'BCLR' IOT - THIS ALLOWS THE SYSTEM MANAGER
/AND THE BILLING SYSTEM TO CLEAR THE BILLING INFORMATION IN
/THE MFD TO ZEROES. BY USING AN IOT FOR THIS, WE AVOID THE
/NEED FOR ANY USER PROGRAM TO WRITE INTO THE MFD OR ANY UFD
/DIRECTLY (THUS AVOIDING ANY CONFLICT WITH FIP). WE THEREFORE
/NORMALLY SET THE PROTECTION CODES TO PREVENT ANYONE FROM
/WRITING ANY UFD.
BCLR0, CHKACT /IS THIS A PRIVILEGED ACCOUNT?
SKP /YES
JMP CPERR2 /NO - SAY "PROTECTION VIOLATION"
TAD FIOSTK+1
SNA CLA /DID HE PASS US AN ACCOUNT NUMBER?
JMP REN2 /NO - BOO, HISS!!
TAD RETTBL /YES - THE MFD IS ALWAYS THE FIRST ENTRY
DCA FIOSTK
CLA CMA /NOW DO A ONE-WORD SEARCH FOR THE ACCOUNT
JMS I DS01
FIOSTK
JMP REN2 /NO FIND - ERROR!!
TAD P0004
DCA INDEX /SET THE POINTER TO THE INFORMATION
DCA I INDEX / AND ZERO THE DEVICE TIME
DCA I INDEX / AND THE CPU TIME
SAVBUF /NOW SET THE 'BUFFER CHANGED' SWITCH
JMP I FIEXIT / AND EXIT
/ROUTINE TO CALCULATE A POINTER INTO 'ENTTBL'.
/AC = [JOB * 4 + FILEID] * 2 + 'ENTTBL'
EBLD, 0
DCA CFH
TAD FIJOB
CLL RTL
TAD CFH
RAL
TAD ENTTBL
JMP I EBLD
PAGE
/COMPLETION OF LOGOUT ROUTINE
/REMOVES JOB FROM PERMANENT MONITOR TABLES
/MUST BE DONE LAST, SINCE WE NEED THE JOB STATUS BLOCKS
/TO INDICATE ANY ERRORS IN THE FIP I/O
LGO4, TAD LGO500 /RESTORE THE FIP EXIT
CFLD
DCA I LGOFIX
TAD FIJOB /SEE IF HE OWNS ANY CORE FIELDS
CIF
CORE /SEARCH CORE TABLE FOR HIM
SI+FIP+CJOB
JMP LGO5 /NO; NOTHING TO RELEASE
AND P0007 /YES; RELEASE THE FIELD
TAD CORTBA
DCA CFH /POINTS TO ENTRY IN CORTBL
CDF
DCA I CFH /ZERO THE ENTRY
LGO5, TAD FIJOB /RETURN STATUS BLOCKS
TAD JOBTBA /START OF JOB TABLE (END OF DEVTBL)
DCA LGO6 /POINTS TO JOB TABLE ENTRY
DATFLD
TAD I LGO6 /GET ADDRESS OF JOB STATUS
JMS I LGOBLS /RETURN STATUS
DATFLD
DCA I JOBDAT /CLEAR JOBDAT
DCA I LGO6 /CLEAR POINTER IN 'JOBTBL'
TAD FIJOB
TAD LGOCLK
DCA LGO6
DCA I LGO6 /CLEAR ANY 'CLKTBL' ENTRY
CDF
DCA I JOBA /CLEAR JOB (SO SAVJOB WON'T SAVE US)
DCA FIJOB / AND AVOID MISTAKING US FOR LOGGED-IN
JMP I .+1 /AND NOW GO DO FIX50
LGO500, FIX50
LGOBLS, RETBLS
LGOCLK, CLKTBL
LGOFIX, FIX500
LGO6, 0
/
/ROUTINE TO HANDLE THE LOGOUT IOT WHEN THE PASSED AC = 0.
/WE COUNT UP THE NUMBER OF ADDITIONAL USERS ON THIS ACCOUNT.
LGO1, TAD FIOSTK+1 /LOGOUT WITH AC = 0?
SZA CLA
JMP I LGI201 /NO, SO IT'S AN ERROR
TAD LGOMAX /YES - COUNT # OF OTHER USERS
DCA LGOCNT / OF HIS ACCOUNT #
TAD DEVOVR /ADDRESS OF JOBTBL
DCA JOBDAT /INITIALIZE 'JOBDAT' TO LOOK AT ALL JOBS
DCA FIUSAC /ZERO 'FIND' COUNTER
LGOLP, ISZ JOBDAT
DATFLD
TAD I JOBDAT
CFLD
SNA CLA /IS THE JOB SLOT IN USE?
JMP LGOLPE /NO - ON TO THE NEXT
FGETJT /GET LOCATION OF USER'S ACCOUNT NUMBER
JOBACT
DCA CFH
DATFLD
TAD I CFH /PICK UP THE ACCOUNT NUMBER
CFLD
CIA
TAD FIACCT
SNA CLA /SAME AS OURS?
ISZ FIUSAC /YES - INCREMENT COUNT
LGOLPE, ISZ LGOCNT
JMP LGOLP /CONTINUE
CLA CMA
TAD FIUSAC /NOW DISCOUNT OUR OWN JOB
DCA FIUSAC
TAD LGODAT /THEN RESTORE JOBDAT
DCA JOBDAT
JMP I FIEXIT
LGOCNT, 0
LGODAT, CJOBDA
LGOMAX, -JOBMAX
/ROUTINE TO CLOSE ANY SPECIAL (ACCOUNT 7) FILES LEFT OPEN.
PRVCLS, 0
TAD C7774
DCA PCNUM /SET FOR 4 FILES
PRVCL1, TAD PCNUM
TAD P0004
JMS I LNK01 /GET THE FILE CONTROL-BLOCK
SNA
JMP PRVCL2
TAD FILPRP
DCA CFH /NOW POINTS TO THE PROTECTION & PRIVILEGE WORD
TAD I CFH
CLL RAR
SNL CLA /IS THIS A PRIVILEGED FILE?
JMP PRVCL2 /NO
TAD PCNUM
TAD P0004
JMS I CL01 /YES - CLOSE IT
PRVCL2, ISZ PCNUM
JMP PRVCL1
JMP I PRVCLS
/
PCNUM= LGOCNT
/
/ROUTINE TO GET THE NUMBER OF A DEVICE ATTACHED TO THIS JOB
/CALLING SEQUENCE:
/ JMS LNS0
/ RETURN IF NONE AVAILABLE
/ NORMAL RETURN (LINE NUMBER IN AC)
LNS0, 0
TAD DEVTBA /GLOBAL TO "DEVTBL"
DCA CFH
DATFLD /CDF FIELD 0
LNS4, TAD I CFH /PICK UP POINTER TO DDB
SNA
JMP LNS2 /DEVICE UNASSIGNED
IAC
DCA LNS3 /POINTER TO SECOND WORD OF DDB
TAD I LNS3
AND P0037 /PICK OFF THE JOB NUMBER OF OWNER
CIA
TAD FIJOB /NUMBER OF CURRENT JOB
SNA CLA
JMP LNS5 /THIS DEVICE IS OURS
LNS2, ISZ CFH
TAD CFH
CMA
TAD DEVOVR /GLOBAL TO "JOBTBL"
SZA CLA
JMP LNS4 /CONTINUE LOOKING DOWN TABLE
LNS7, CFLD /MAKE SURE WE ARE IN THIS FIELD
JMP I LNS0 /FOUND NO DEVICES
LNS5, TAD DEVEND
CIA
TAD CFH
SMA
JMP LNS6
TAD LNS10
CLL RAR
LNS8, ISZ LNS0
JMP LNS7
LNS6, TAD C4000
JMP LNS8
C4000, 4000
LNS10, DEVTBE-DEVTBL
LNS3= LGOCNT
PAGE
/HERE WE CHECK FOR OTHER JOBS NEEDING 'FIP' TO TRY AND
/MINIMIZE THE NUMBER OF TIMES FIP NEEDS TO BE SWAPPED IN.
FIXSCH, TAD FIXJMX
SNA CLA /HAVE WE ALREADY EXHAUSTED OUR PRIORITY RIGHTS?
JMP FIXOUT /YES
TAD FIJOB
TAD JOBTBA
DCA INDEX
DATFLD
FIXSC1, TAD INDEX
TAD FIXSTE
SZA CLA /REACHED END OF THE JOBTBL?
JMP .+3
TAD JOBTBA /YES - RESET THE POINTER AT THE BEGINNING
DCA INDEX
TAD I INDEX
SNA /IS THERE A JOB IN THIS SLOT?
JMP FIXSC2 /NO
IAC
DCA CFH /YES - SET POINTER TO STR0 (JOBSTS)
TAD I CFH
AND FIXSJS
SNA CLA /IS THE JOB WAITING FOR 'FIP'?
JMP FIXSC2 /NO
TAD JOBTBA
CIA
TAD INDEX /YES - GET HIS JOB NUMBER
JMP FIXOUT / AND EXIT (SETTING 'FIPJOB')
FIXSC2, ISZ FIXJMX
JMP FIXSC1
/ALL DONE - SET (OR CLEAR) 'FIPJOB' IN FIELD 0 AND EXIT.
FIXOUT, CIF CDF
DCA I FIPJBA
WAIT
FIPJBA, FIPJOB
FIXJMX, -JOBMAX /GETS CLOBBERED, BUT RESET EVERY TIME FIP IS RELOADED
FIXSJS, JSIOT
FIXSTE, -JOBTBL-JOBMAX
/ROUTINE TO CHECK THE USERS 'PRIVILEGE' FLAG AND SKIP IF SET.
CHKPV0, 0
FGETJT /GET HIS STR0 LOCATION
JOBSTS
DCA CFH
DATFLD
TAD I CFH
AND CHKJSP
SZA CLA /IS HE PRIVILEGED NOW?
ISZ CHKPV0 /YES - SKIP ON RETURN
CFLD
JMP I CHKPV0
/SUBROUTINE TO CHECK THE FILE EXTENSION AND POSSIBLY
/SET THE PRIVILEGE BIT FOR THIS JOB.
OPNPV0, 0
TAD I OPNBUF /GET THE FILE PROTECTION CODE
AND C7700
TAD OPNSVP
SZA CLA /IS EXTENSION .SVP (34)?
JMP I OPNPV0 /NO - JUST RETURN
CLA CLL CMA RAL
TAD OPNACT
SNA CLA /IS THE FILE FROM THE SYSTEM LIBRARY?
CHKSRC /YES - WHO CALLED US?
JMP I OPNPV0 /A USER - CAN'T SET 'PRIVILEGE'
FGETJT /'SI' - GET THE JOB STATUS-WORD
JOBSTS
DCA CFH
DATFLD
TAD OPNJSP
CMA
AND I CFH /CLEAR THE 'PRIVILEGE' BIT
TAD OPNJSP / AND THEN SET IT
DCA I CFH
CFLD
JMP I OPNPV0 /THEN JUST RETURN
OPNSVP, -3400 /.SVP FILE EXTENSION
CHKJSP,
OPNJSP, JSPRIV
/WE GET HERE WHEN THE 'UFD' HE TRIED TO OPEN DIDN'T
/EXIST. WE GIVE HIM THE NUMBER OF THE NEXT 'UFD'.
OPNR01, DATFLD
TAD I FIOPTR /GET THE PARAMETER BLOCK
DCA OPNBUF
TAD C7000
DCA I OPNBUF /SET THE FINAL AC CONTENTS
TAD OPNBUF
TAD P0004
DCA OPNBUF
CFLD
TAD I OPNNXT /GET THE NEXT ACCOUNT
DATFLD
DCA I OPNBUF
TAD P0004 /GET THE NUMBER OF PARAMETERS
JMP I .+1 / TO RETURN TO THE USER
INF6
OPNNXT, DSNEXT /WORD IN 'DS0'
IFZERO .-5200&4000 <GLITCH>
*5200
SEGBUF, /SEGMENT-SIZE BUFFER
*WRDSEG+SEGBUF
ENTABL, /4 2-WORD ENTRIES PER JOB
*JOBMAX^10+ENTABL
UTABLE, /A 2-WORD ENTRY FOR EACH UFD ACCESSED
*JOBMAX^4+UTABLE
RTABLE, /1 8-WORD ENTRY FOR EACH 'UTABLE' ENTRY
*JOBMAX^20+RTABLE
FIPTOP, /END OF FIP TABLES (EXCEPT 'SAT')
IFZERO FIPTOP+SATSIZ&4000 <GLITCH>
*-SATSIZ /START OF DISC ALLOCATION TABLE
///// $$$$$
$$$$$