PFILMGR CSY/ F01 P€1_%NAM FILMGR_'DECK-ID F01 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*1 7 0 0_!F I L E_!M A N A G E R_!V E R S I O N_!1 . 0_^1*_]_^1*_]_^1_%EQU RPLSR(10) REQUEST PRIORITY LEVEL FOR SPACE REQUESTS 68*1512_^1*_]_^1*_*CONTENTS_^1*_-1. R€€EQUEST ENTRIES_^1*_-2. REQUEST SUPERVISOR AND SUBROUTINES_^1*_-3. COMMON SUBROUTINES_^1*_1A. ABSPAR - ABSOLUTIZE PARAMETER_^1*_1B. CKCFIS - CHECK IF FIS IS IN CORE_^1*_1C. CKPROT - CHECK IF REQUEST IS PROTECTED_^1*_1D. CKUADR - CHECK UNPROTECTED ADDRESS LEGALITY_^1*_1E. GETSPC - GET ALLOCATABLE SPACE_^1*_1F. MMREAD - MASS MEMORY READ_^1*_1G. MMWRIT - MASS MEMORY WRITE€€_^1_%EJT_]_^1*_*ENTRY POINTS_^1*_1REQUEST ENTRIES (INCLUDING FMPFLG PRESET AND FMRERR)_^1_%ENT DEFFIL_'REQUEST ENTRY - DEFINE FILE_^1_%ENT RELFIL_'REQUEST ENTRY - RELEASE FILE_^1_%ENT DEFIDX_'REQUEST ENTRY - DEFINE FILE INDEXED_^1_%ENT LOKFIL_'REQUEST ENTRY - LOCK FILE_^1_%ENT UNLFIL_'REQUEST ENTRY - UNLOCK FILE_^1_%ENT STOSEQ_'REQUEST ENTRY - STORE SEQUENTIAL_^1_%ENT STODIR€€_'REQUEST ENTRY - STORE DIRECT_^1_%ENT STOIDX_'REQUEST ENTRY - STORE INDEXED_^1_%ENT RTVSEQ_'REQUEST ENTRY - RETRIEVE SEQUENTIAL_^1_%ENT RTVDIR_'REQUEST ENTRY - RETRIEVE DIRECT_^1_%ENT RTVIDX_'REQUEST ENTRY - RETRIEVE INDEXED_^1_%ENT RTVIDO_'REQUEST ENTRY - RETRIEVE INDEXED-ORDERED_^1_%ENT FMPFLG_'FILE MANAGER PROTECT FILE FLAG VIA PRESET_^1_%ENT FMRERR_'FILE MANAGER REQUEST€€ ERROR ENTRY_^1_%SPC 1_^1*_1COMMON SUBROUTINES_^1_%ENT ABSPAR_'ABSOLUTIZE PARAMETER_^1_%ENT CKCFIS_'CHECK IF FIS IS IN CORE_^1_%ENT CKPROT_'CHECK IF REQUEST IS PROTECTED_^1_%ENT CKUADR_'CHECK UNPROTECTED ADDRESS LEGALITY_^1_%ENT GETSPC_'GET ALLOCATABLE SPACE_^1_%ENT MMREAD_'MASS MEMORY READ_^1_%ENT MMWRIT_'MASS MEMORY WRITE_^1_%SPC 1_^1*_1RELEASE ALLOCATABLE CORE SPACE (RA€€CSPC) PARAMETERS_^1_%ENT FILREQ_'EXECUTE NEXT FILE REQUEST_^1_%ENT ACTREQ_'ACTIVE REQUEST FLAG_^1_%ENT ARQPRO_'ADDRESS OF CURRENT (OR LAST) REQUEST PROCESSOR_^1_%ENT RPTABL_'REQUEST PROCESSOR TABLE_^1_%ENT FILNBR_'FILE NUMBER OF CURRENT FILE REQUEST_^1_%SPC 1_^1*_1FILE MANAGER GLOBAL PARAMETERS_^1_%ENT FSTLOC_'FIS STARTING THREAD LOC (ZERO, IF NO CORE FIS)_^1_%ENT FIDLOC_'F€€IS DIRECTORY LOCATION (ZERO, IF NOT IN CORE)_^1_%ENT RPTINT_'REQUEST PROCESSOR TIMEOUT INTERVAL_^1_%ENT FDTINT_'FILE/DIRECTORY TIMEOUT INTERVAL_^1_%ENT NWFISD_'NUMBER OF WORDS IN FIS DIRECTORY (N*96)_^1_%ENT NWFISB_'NUMBER OF WORDS IN A FIS BLOCK (N*96)_^1_%ENT LOKTBL_'LOCK FILE TABLE_^1_%ENT LOKNOE_'LOCK FILE TABLE NUMBER OF ENTRIES_^1_%ENT LOKNEU_'LOCK FILE TABLE NO. OF EN€€TRIES USED_^1_%EJT_]_^1*_*EXTERNALS_^1*_1STARTING SECTORS OF REQUEST PROCESSORS_^1_%EXT FMRP01_'STARTING SECTOR OF DEFFIL_^1_%EXT FMRP02_'STARTING SECTOR OF RELFIL_^1_%EXT FMRP03_'STARTING SECTOR OF DEFIDX_^1_%EXT FMRP04_'STARTING SECTOR OF LOKFIL_^1_%EXT FMRP05_'STARTING SECTOR OF UNLFIL_^1_%EXT FMRP06_'STARTING SECTOR OF STOSEQ_^1_%EXT FMRP07_'STARTING SECTOR OF STODIR_^1_€€%EXT FMRP08_'STARTING SECTOR OF STOIDX_^1_%EXT FMRP09_'STARTING SECTOR OF RTVSEQ_^1_%EXT FMRP10_'STARTING SECTOR OF RTVDIR_^1_%EXT FMRP11_'STARTING SECTOR OF RTVIDX_^1_%EXT FMRP12_'STARTING SECTOR OF RTVIDO_^1_%EXT FMREND_'ENDING SECTOR OF REQUEST PROCESSORS_^1_%SPC 1_^1*_1EXTERNALLY CALLED PROGRAMS_^1*_81 CARD DELETED_674*1655_^1_%EXT RACSPC_'RELEASE ALLOCATABLE CORE SPACE€€_^1*_81 CARD DELETED_674*1655_^1_%SPC 1_^1*_1J02 PARAMETERS LOCATIONS FOR PROTECT PROC. IN TRVEC_^1_%EXT LOCF_)LOCATION OF F (J02 ENTRY)_^1_%EXT LPTRS_(LOCATION OF PTRS (PARAMETER ADDRESS)_^1_%SPC 1_^1*_1PARAMETERS TO PREVENT SWAPS ON UNPROTECTED FILE REGS._^1_%EXT UNPIO_(UNPROTECTED I/O IN PROGRESS FLAG (IN TRVEC)_^1_%EXT SWAPCK_'DECREMENT UNPIO, IF =0, CHECK SWAP (IN DRCORE€€)_^1*_/JOB CANCEL FLAG (IN TRVEC)_^1_%EXT JBCNFG_^1_%SPC 1_^1*_1FILE MANAGER SYSDAT PARAMETERS_^1_%EXT FISLU_(LOGICAL UNIT OF FIS DIRECTORY AND FIS BLOCKS_^1_%EXT MAXMMA_'MAXIMUM NO. OF MASS MEMORY ATTEMPTS ON ERROR_^1_%EXT RPTPER_'REQUEST PROCESSOR TIMEOUT PERIOD_^1_%EXT FDTPER_'FILE/DIRECTORY TIMEOUT PERIOD_^1_%EXT FIDSEC_'FIS FIRECTORY SECTOR ADDRESS_^1_%EXT TMRTYP_'TIME€€R VERSION FLAG_!0 = NO TIMER_"74*1655_^1_%EXT SYFAIL_'SITE FAIL LOCATED IN SYSDAT ($18FF)_^1_%SPC 1_^1*_*FILE MANAGER PARAMETER IN SEARCH FIS (SRHFIS)_^1_%EXT FIBSIZ_'FIS BLOCK SIZE IN WORDS (N*96)_^1_'SPC 1_^1*_1FILE MANAGER PARAMETER IN RSPCV4_+74*1655_^1_%EXT RSAFLG_'RACSPC ACTIVE FLAG_274*1655_^1*_1PART 0/PART 1 BOUNDARY_^1_%EXT END0V4_'LAST LOCATION IN PART 0_^1_%EJT_]_^€€1*_*EQUIVALENCES_^1*_1COMMUNICATION REGION CONSTANTS_^1_%EQU ZERO(2)_%ZERO CONSTANT_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU ZROMSK($13)_!ZERO MASK TABLE_^1_%EQU ONEBIT($23)_!ONE BIT TABLE_^1_%EQU ZROBIT($33)_!ZERO BIT TABLE_^1_%EQU AVOLR($BA)_"ADDRESS OF VOLATILE RELEASE_^1_%EQU AVOLA($BB)_"ADDRESS OF VOLATILE ASSIGN_^1_%EQU ADISP($EA)_"ADDRESS OF DISPATCHER_^1_%EQU PL($€€EF)_%PRIORITY LEVEL_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR REQUEST ENTRY_^1_%SPC 1_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16€€)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1_%SPC 1_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTR€€Y ADDRESS (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST€€ FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUM€€FRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1*_1KIS DIRECTORY HEADER_^1_%EQU KIDCLK(0)_#KIS DIRECTORY CLOCK_^1_%EQU NUMKIB(1)_#NUMBER OF KIS BLOCKS_^1_%EQU KIBFSA(2)_#FIRST SECTOR ADDRESS OF KIS BLOCKS_^1_%EQU KIBLSA(3€€)_#LAST SECTOR ADDRESS OF KIS BLOCKS_^1_%EJT_]_^1*_]_^1*_1FIS DIRECTORY AND BLOCK SIZES_^1_%EQU FIDSIZ(1*WRDSEC) FIS DIRECTORY SIZE IN WORDS_^1_%SPC 1_^1*_1REQUEST BUFFER INDEXES_^1_%EQU RBATHR(0)_#REQUEST BUFFER ADDRESS THREAD_^1_%EQU RTNADR(1)_#RETURN ADDRESS OF CALLER_^1_%EQU QREG(2)_%Q REGISTER_^1_%EQU IREG(3)_%I REGISTER_^1_%EQU APL(4)_'ADDRESS OF PARAMETER LIST_^1_%E€€QU RPLIDX(5)_#REQUEST PRIORITY LEVEL AND ENTRY INDEX_^1_%SPC 1_^1*_1REQUEST PROCESSOR TABLE INDEXES_^1_%EQU RPSSEC(1)_#REQUEST PROCESSOR STARTING SECTOR_^1_%EQU RPSADR(2)_#REQUEST PROCESSOR STARTING CORE ADDRESS_^1_%EQU RPLGTH(2)_#REQUEST PROCESSOR LENGTH_^1_%EQU RPTREM(3)_#REQUEST PROCESSOR TIME REMAINING_^1_%SPC 1_^1*_1VOLATILE ENTRY INDEXES_^1_%EQU VQ(0)_(Q-REGISTER_^1_%€€EQU VA(1)_(A-REGISTER_^1_%EQU VI(2)_(I-REGISTER_^1_%EQU VARE(3)_%ADDRESS OF REQUEST ENTRY_^1_%EQU VAPL(4)_%ADDRESS OF PARAMETER LIST_^1_%EQU NVWRDS(5)_#NUMBER OF VOLATILE WORDS USED_^1_%SPC 1_^1*_1MISCELLANEOUS_^1_%EQU HUPLVL(2)_#HIGHEST UNPROTECTED LEVEL_^1_%EQU INS($A00)_#ENA INSTRUCTION FOR PARAM. LENGTH **MSOS 4.1**_^1_%EQU D($4000)_$D-BIT FOR MONITOR REQUESTS_'**MSOS €€4.1**_^1_%EJT_]_^1*_]_^1*_1NUMBER OF PARAMETERS IN REQUESTS_^1_%EQU NPDF(5)_%NUMBER OF PARAMETERS IN DEFINE FILE_^1_%EQU NPRF(3)_%NUMBER OF PARAMETERS IN RELEASE FILE_^1_%EQU NPDI(6)_%NUMBER OF PARAMETERS IN DEFINE FILE INDEXED_^1_%EQU NPLF(4)_%NUMBER OF PARAMETERS IN LOCK FILE_^1_%EQU NPUF(4)_%NUMBER OF PARAMETERS IN UNLOCK FILE_^1_%EQU NPSS(6)_%NUMBER OF PARAMETERS IN STORE€€ SEQUENTIAL_^1_%EQU NPSD(6)_%NUMBER OF PARAMETERS IN STORE DIRECT_^1_%EQU NPSI(7)_%NUMBER OF PARAMETERS IN STORE INDEXED_^1_%EQU NPRS(7)_%NUMBER OF PARAMETERS IN RETRIEVE SEQUENTIAL_^1_%EQU NPRD(7)_%NUMBER OF PARAMETERS IN RETRIEVE DIRECT_^1_%EQU NPRI(8)_%NUMBER OF PARAMETERS IN RETRIEVE INDEXED_^1_%EQU NPRO(8)_%NUMBER OF PARAMETERS IN RETRIEVE INDEXED-ORDER_^1*_]_^1_%EQU NU€€MRPE(12)_"NUMBER OF REQUEST PROCESSOR ENTRIES_^1_%EJT_]_^1*_*FILE MANAGER REQUEST ENTRIES_^1_%SPC 2_^1REQENT EQU REQENT(*)_^1*_]_^1*_]_^1DEFFIL 000 000_'1. DEFINE FILE_^1_%IIN 0_,*** NOTE- THIS MUST BE THE FIRST ENTRY ***_^1_%ADC INS+NPDF-1_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1RELFIL 000 000_'2. RELEASE FILE_^1_%IIN 0_^1_%ADC INS+NPRF-1_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1DEFIDX 000 00€€0_'3. DEFINE FILE INDEXED_^1_%IIN 0_^1_%ADC INS+NPDI-1_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1LOKFIL 000 000_'4. LOCK FILE_^1_%IIN 0_^1_%ADC INS+NPLF-1_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1UNLFIL 000 000_'5. UNLOCK FILE_^1_%IIN 0_^1_%ADC INS+NPUF-1_^1_%RTJ* REQSUP_^1_%EJT_]_^1STOSEQ 000 000_'6. STORE SEQUENTIAL_^1_%IIN 0_^1_%ADC INS+NPSS-1_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1STODIR 000 000_'€€7. STORE DIRECT_^1_%IIN 0_^1_%ADC INS+NPSD-1_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1STOIDX 000 000_'8. STORE INDEXED_^1_%IIN 0_^1_%ADC INS+NPSI-1_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1RTVSEQ 000 000_'9. RETRIEVE SEQUENTIAL_^1_%IIN 0_,*** NOTE- THIS MUST BE THE THIRD FROM ***_^1_%ADC INS+NPRS-1_"***_%THE LAST REQUEST ENTRY_%***_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1RTVDIR 000 000_%10. RETRIEVE DIR€€ECT_^1_%IIN 0_,*** NOTE- THIS MUST BE THE SECOND FROM ***_^1_%ADC INS+NPRD-1_"***_%THE LAST REQUEST ENTRY_%***_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1RTVIDX 000 000_%11. RETRIEVE INDEXED_^1_%IIN 0_,*** NOTE- THIS MUST BE THE NEXT (FIRST)***_^1_%ADC INS+NPRI-1_"***_%FROM THE LAST REQUEST ENTRY ***_^1_%RTJ* REQSUP_^1*_]_^1*_]_^1RTVIDO 000 000_%12. RETRIEVE INDEXED-ORDERED_^1_%IIN 0_,€€*** NOTE- THIS MUST BE THE LAST_'***_^1_%ADC INS+NPRO-1_"***_%REQUEST ENTRY_/***_^1_%RTJ* REQSUP_^1_%EJT_]_^1*_*FILE MANAGER REQUEST SUPERVISOR_^1*_]_^1*_1SAVE REGISTERS AND GET REQUEST BUFFER ADDRESS INTO Q_^1*_1A = INDEX TO REQUEST INDICATOR ADR IN PARAMETER LIST_^1REQSUP 000 000_"INTERRUPTS HAVE BEEN INHIBITED TO PREVENT MULTI-ENTRY_^1_%RTJ- (AVOLA)_%SAVE Q, A, I REGISTERS IN €€VOLATILE_^1_%ADC NVWRDS_^1*_]_^1_%LDQ- PL_+CHECK IF CALLER IS UNPROTECTED_^1_%INQ -HUPLVL-1_^1_%SQP SAVADR_^1_%RAO UNPIO_(YES, SET I/O IN PROGRESS FLAG TO PREVENT SWAP_^1*_]_^1SAVADR LDQ* REQSUP_'SAVE ADDRESS OF REQUEST ENTRY IN VOLATILE_^1_%STQ- VARE,I_^1_%INQ -4_^1_%EIN 0_^1_%LDQ- (ZERO),Q_$SAVE ADDRESS OF PARAMETER LIST IN VOLATILE_^1_%STQ- VAPL,I_^1_%AAQ Q_,Q = ADDRESS O€€F REQUEST INDICATOR_^1_%RTJ* (AABSPR)_$ABSOLUTIZE THE REQUEST INDICATOR ADDRESS_^1_%RTJ* (ACUADR)_$CHECK IF ILLEGAL UNPROTECTED ADDRESS_^1_%INQ -1_+Q = ADDRESS OF REQUEST BUFFER ADDRESS_^1_%RTJ* (AABSPR)_$ABSOLUTIZE THE REQUEST BUFFER ADDRESS_^1_%RTJ* (ACUADR)_$CHECK IF ILLEGAL UNPROTECTED ADDRESS_^1_%EJT_]_^1*_*SAVE THE REQUEST PARAMETERS_^1_%LLS 16_+OK, Q = REQUEST BUFFER ADDRE€€SS_^1_%INA 2_^1_%STA- RTNADR,Q_$SAVE RETURN ADDRESS_^1_%TRQ A_S68*1512_^1_%INA 11_R68*1512_^1_%RTJ* (ACUADR)_$CHECK LAST REQBUF WORD_068*1512_^1_%LDA- (ZERO),I_^1_%STA- QREG,Q_'SAVE Q REGISTER_^1_%LDA- VI,I_^1_%STA- IREG,Q_'SAVE I REGISTER_^1_%LDA- VAPL,I_^1_%STA- APL,Q_(SAVE ADDRESS OF PARAMETER LIST_^1_%LDA- VARE,I_^1_%SUB =XREQENT_$COMPUTE THE REQUEST ENTRY INDEX_^1_%ALS 2_€€,SAVE IN BITS 4 THRU 15 OF RPLIDX_^1_%EOR- PL_^1_%STA- RPLIDX,Q_$SAVE PRIORITY LEVEL IN BITS 0 THRU 3 OF RPLIDX_^1_%STQ- (ZERO),I_$Q = REQUEST BUFFER ADDRESS_^1_%IIN 0_^1_%RTJ- (AVOLR)_%RETURN VOLATILE SPACE_^1_%SPC 2_^1*_*CHECK IF REQUEST SHOULD BE QUEUED OR PROCESSED_^1_%SPC 2_^1CHKREQ LDA* ACTREQ_'IS THERE AN ACTIVE REQUEST IN PROGRESS_^1_%SAN QUEUE_*YES, PLACE REQUEST ON WA€€ITING REQUEST QUEUE_^1*_]_^1*_8FILE MANAGER NOT BUSY_^1_%ENA -1_+TEMPORIARLY SET ACTIVE REQUEST FLAG_^1_%STQ* RQBADR_'SAVE REQ BUF ADDRESS FOR CHECK AT QUE8064*1408_^1_%EIN 0_^1_%STA* ACTREQ_^1*_8CHECK IF REQUEST CAN BE EXECUTED NOW_^1*_9OR NEEDS TO BE QUEUED BECAUSE OF A_^1_%RTJ XQTCHK_(LOCK RELATED CONDITION_^1_%SAN QUEUE_(NO, QUEUE THE REQUEST UNTIL IT CAN_^1*_9BE EXECUTED_€€^1*_]_^1_%STQ* ACTREQ_'SET FILE MANAGER ACTIVE_^1_%JMP* CHKRPC_'PROCESS THE REQUEST_^1_%SPC 1_S64*1408_^1AABSPR ADC ABSPAR_'ADDRESS OF ABSOLUTIZE PARAMETER_^1ACUADR ADC CKUADR_'ADDRESS OF CHECK IF ILLEGAL UNPROTECTED ADR_^1_%EJT_]_^1*_*QUEUE THE REQUEST BY LEVEL (FIRST-IN, FIRST-OUT WITHIN IT)_^1_%SPC 1_^1QUEUE STQ- I_,Q = I = REQUEST BUFFER ADDRESS_^1QUE10 LDQ =XWATREQ_$SEA€€RCH FOR INSERTION POINT_^1_%STQ* RUTFLG_'RESET THE REQUEST UNTHREADED FLAG_^1_%STQ* RQDFLG_'SET THE REQUEST QUEUED FLAG_^1*_]_^1QUE20 STQ- (I)_*SAVE LAST POINTER_^1_%EIN 0_^1_%LDQ- (ZERO),Q_$GET NEXT THREADED REQUEST BUFFER_^1_%SQZ QUE30_(END OF QUEUE, THREAD REQUEST THERE_^1*_]_^1_%ENA $F_+IS REQUEST,S PRIORITY GREATER THAN THE_^1_%AND- RPLIDX,Q_%PRIORITY OF THE NEXT WAITING R€€EQUEST._^1_%SUB- PL_^1_%SAM QUE30_(YES, THREAD IT_^1*_]_^1_%IIN 0_,CHECK IF INTERRUPTED BY A REQUEST_^1_%LDA* RUTFLG_'BEING UNTHREADED._^1_%SAZ QUE50_*YES, RESTART SEARCH (REQUEST MAY BE GONE)_^1_%JMP* QUE20_*NO, CONTINUE SEARCH_^1*_]_^1QUE30 TRQ A_,INSERTION POINT FOUND_^1_%LDQ- (I)_*Q = LAST POINTER_^1_%STA- (I)_*STORE LAST POINTER INTO REQUEST BUFFER_^1*_]_^1QUE40 IIN 0_€€,CHECK IF INTERRUPTED BY A REQUEST_^1_%LDA* RUTFLG_'BEING UNTHREADED._^1_%SAN QUE60_^1QUE50 JMP* QUE10_(YES, RESTART SEARCH (REQUEST BEING CHECKED OR_^1*_8LAST REQUEST MAY BE UNTHREADED AND DESTROYED)_^1*_]_^1QUE60 LDA- (ZERO),Q_$CHECK IF (LAST POINTER) EQUALS NEXT POINTER_^1_%EOR- (I)_,(MAY HAVE BEEN INTERRUPTED BY HIGHER QUEUE)_^1_%SAZ QUE70_^1_%EIN 0_^1_%LDQ- (ZERO),Q_$NO, €€CHECK NEXT REQBUF UNTIL (LSTPTR) = NXTPTR_^1_%JMP* QUE40_^1*_]_^1QUE70 LDA- I_,STORE POINTER TO REQUEST BUFFER INTO (LSTPTR)_^1_%STA- (ZERO),Q_'(REQUEST NOW COMPLETELY THREADED)_^1*_]_^1_%LDA* ACTREQ_'CHECK IF NO REQUEST IS ACTIVE (A REQUEST_^1_%SAN QUE80_*MAY HAVE BEEN UNTHREADED)._^1_%ENA -1_+YES, TEMPORARILY SET ACTIVE REQUEST FLAG_^1_%STA* ACTREQ_^1_%JMP* QUE95_(FAKE A COMPL€€ETE REQUEST_/64*1408_^1_%EJT_V64*1408_^1QUE80 EOR- ZROBIT_'CHECK IF ACTREQ SET TO -1_-66*1408_^1_%SAN QUE85_(NO_D66*1408_^1*_] 64*1408_^1_%LDA- I_,CHECK IF THIS REQUEST IS THE ONE_%64*1408_^1_%EOR* RQBADR_'ASSOCIATED WITH -1 SETTING OF ACTREQ_!64*1408_^1_%SAZ QUE90_O64*1408_^1QUE85 JMP- (ADISP)_M64*1408_^1*_] 64*1408_^1QUE90 STA* RQBADR_'THIS REQUEST ASSOCIATED WITH ACTREQ =€€-164*1408_^1QUE95 EIN 0_,CLEAR RQBADR FAKE A COMPLETED REQUEST 64*1408_^1_%JMP* FILREQ_N64*1408_^1_%EJT_V64*1408_^1*_*F I L E_!M A N A G E R_!G L O B A L_!P A R A M E T E R S_^1_%SPC 2_^1*_1REQUEST PROCESSOR TABLE LOCATED AFTER RTVCHK PROGRAM_^1*_]_^1FMPFLG ADC 0_,FILE MANAGER PROTECT FILE FLAG VIA PRESET_^1*_]_^1WATREQ ADC 0_,START OF WAITING REQUEST QUEUE_^1*_]_^1ACTREQ ADC€€ 0_,ACTIVE REQUEST FLAG (CONTAINS A RBA IF BUSY)_^1*_]_^1FSTLOC ADC 0_,FIS STARTING THREAD LOC (ZERO, IF NO CORE FIS)_^1*_]_^1FIDLOC ADC 0_,FIS DIRECTORY LOCATION (ZERO, IF NOT IN CORE)_^1*_]_^1RPTINT ADC RPTPER_'REQUEST PROCESSOR TIMEOUT INTERVAL_^1*_]_^1FDTINT ADC FDTPER_'FILE/DIRECTORY TIMEOUT INTERVAL_^1*_]_^1NWFISD ADC FIDSIZ_'NUMBER OF WORDS IN FIS DIRECTORY (N*96)_^1*_€€]_^1NWFISB ADC FIBSIZ_'NUMBER OF WORDS IN A FIS BLOCK (N*96)_^1_%SPC 3_^1*_82 CARDS DELETED_574*1655_^1RUTFLG ADC 0_,REQUEST UNTHREADED FLAG (ZERO IF SET)_^1RQBADR ADC 0_,TEMPORY STORAGE OF REQBUF ADDRESS_$64*1408_^1SCHCOD ADC D+$1200_%SCHEDULER REQUEST CODE_^1RQDFLG ADC 0_,REQUEST QUEUED FLAG_^1_%EJT_]_^1*_*CHECK IF REQUEST PROCESSOR IS IN CORE_^1_%SPC 2_^1CHKRPC LDA- RPLID€€X,Q_$GET INDEX TO REQUEST PROCESSOR TABLE_^1_%ARS 4_^1_%INA -1_+CHECK IF DEFINE FILE REQUEST_^1_%SAZ GETRPI_)NO_^1*_]_^1_%LDQ FIDSEC_'CHECK IF FIS DIRECTORY DEFINED YET_^1_%SQN GETRPI_^1_%LDA- ONEBIT+0_$NO, FILE NOT DEFINED, RETURN WITH ERROR_^1_%JMP* FMRERR_)(FM SPACE NOT DEFINED TIL FIS DIR ALLOCATED)_^1*_]_^1GETRPI MUI- ONEMSK+1_$MULTIPLY BY 3 (NO. ITEMS IN EACH ENTRY)_^1_%€€ADD =XRPTABL-1_^1_%STA- I_,SAVE REQUEST PROCESSOR TABLE INDEX - 1 IN I_^1*_]_^1_%IIN 0_^1_%LDA- RPTREM,I_$IF TIME REMAINING IS ZERO, IT IS NOT IN CORE_^1_%SAZ NOTINC_)REQUEST PROCESSOR NOT IN CORE_^1_%JMP* SETTIM_)REQUEST PROCESSOR IS IN CORE_^1*_]_^1NOTINC SET A_,SET CURRENT FILE NUMBER TO $FFFF_#71*1630_^1_%STA (FNUMBR)_^1_%LDA- RPSSEC,I_'SET STARTING SECTOR_^1_%STA* RPSEC_^€€1*_]_^1_%LDA- RPLGTH,I_$CHECK IF REQUEST PROCESSOR LENGTH SET_^1_%SAN SETNWS_)YES (NOT THE FIRST TIME)_^1*_]_^1_%LDA- RPSSEC+3,I_"FIND NUMBER OF WORDS IN REQUEST PROCESSOR_^1_%SUB- RPSSEC,I_^1_%MUI =XWRDSEC_^1SETNWS STA* RPNW_^1*_]_^1_%RTJ GETSPC_'GET SPACE FOR REQUEST PROCESSOR_^1_%STQ* RPSA_+SET REQUEST PROCESSOR STARTING ADDRESS_^1_%STQ* RELRP+2_(SET REQUEST PROCESSOR RELEASE€€ ADR (IF ERROR)_^1_%EJT_]_^1*_*READ IN REQUEST PROCESSOR_^1_%SPC 2_^1_%RTJ MMREAD_'READ IN REQUEST PROCESSOR_^1RPSA_!NUM 0_.1. REQUEST PROCESSOR STARTING ADDRESS_^1RPNW_!NUM 0_.2. REQUEST PROCESSOR NUMBER OF WORDS_^1RPLU_!NUM $8C2_+3. LIBRARY UNIT_563*1386_^1_%NUM 0_.4. REQUEST PROCESSOR INDEX_^1RPSEC NUM 0_.5. REQUEST PROCESSOR SECTOR_^1_%SQP SETADR_^1_%SPC 2_^1RELRP RE€€LEAS 0_$*****MM ERROR, RELEASE THE REQUEST PROCESSOR SPACE_^1_%LDA- ONEBIT+7_$RETURN TO CALLER WITH ERROR_^1_%SPC 2_^1FMRERR EOR- ONEBIT+15_#FILE MANAGER REQUEST ERROR ENTRY_^1_%STA* FMEXIT_^1_%LDQ* ACTREQ_^1_%LDQ- RTNADR,Q_$INCLUDE BIT 15 WITH ERROR CODE AND STORE IT_^1_%INQ -1_^1_%RTJ ABSPAR_^1_%TRA Q_^1_%LDA* FMEXIT_^1_%STA- (ZERO),Q_^1_%JMP* FILREQ_'RETURN TO CALLER, CHECK €€NEXT FILE REQUEST_^1_%EJT_]_^1*_*EXECUTE REQUEST PROCESSOR_^1_%SPC 2_^1SETADR LDA* RPSA_)I = REQUEST PROCESSOR TABLE INDEX - 1_^1_%STA- RPSADR,I_$SAVE REQUEST PROCESSOR STARTING ADDRESS_^1_%IIN 0_Q74*1655_^1*_]_^1SETTIM LDA* RPTINT_'RESET REQUEST PROCESSOR TIME REMAINING_^1_%STA- RPTREM,I_L66*1448_^1*_] 66*1448_^1_%LDA- RPSADR,I_$ADJUST REQUEST PROCESSOR STARTING_$66*1448_^1_%IN€€A 1_,ADDRESS(SKIP OVER PROC. LENGTH)_'66*1448_^1*_] 66*1448_^1_%LDQ* ARQPRO_'CHECK IF FIRST REQUEST AFTER AUTOLOAD 66*1448_^1*_] 66*1448_^1_%EIN 0_S66*1448_^1_%STA* ARQPRO_'STORE START ADDRESS_366*1448_^1*_] 66*1448_^1_%SQN EXECRP_'SKIP IF NOT FIRST_566*1448_^1_%LDA* (VFLAG)_%CHECK IF SYSTEM HAS A TIMER_%**MSOS 4.1**_^1_%SAZ EXECRP_'NO_B74*1655_^1_%INA -6_+CHECK FOR PSEUDO€€ TIMER_^1_%SAZ EXECRP_'YES_^1_%RTJ- (AMONI)_%INIT. RELEASE ALLOCATABLE CORE PROGRAM 66*1448_^1_%ADC D+$1203_K74*1655_^1_%ADC RACSPC_N66*1448_^1*_] 66*1448_^1EXECRP LDQ* ACTREQ_'Q=REQUEST BUFFER ADDRESS_.66*1448_^1_%LDQ- APL,Q_(Q = ADDRESS OF PARAMETER LIST_^1_%SPC 2_^1_%RTJ+ 0_,TRANSFER TO REQUEST PROCESSOR_^1ARQPRO EQU ARQPRO(*-1)_!ADR OF CURRENT (OR LAST) REQUEST PROCESSOR_€€^1*_]_^1_%RAO* ARQPRO_'INCREMENT TO INDICATE LAST ONE HAS COMPLETED_^1_%EJT_]_^1*_*FIND NEXT ALLOWABLE FILE REQUEST (IF ANY) BY PRIORITY_^1_%SPC 2_^1FILREQ CLR A_^1_%STA* RQDFLG_'CLEAR THE REQUEST QUEUED FLAG_^1_%LDQ =XWATREQ_$GET NEXT FILE REQUEST_^1SRHQUE STQ* LSTPTR_'SEARCH QUEUE_^1_%LDQ- (ZERO),Q_^1_%SQZ CHKQUE_'END OF QUEUE (NO REQUESTS)_^1*_]_^1*_8CHECK IF REQUEST CAN BE €€EXECUTED NOW_^1*_9OR NEEDS TO BE QUEUED BECAUSE OF A_^1_%RTJ* XQTCHK_(LOCK RELATED CONDITION_^1*_]_^1_%SAZ SETFLG_'NO, UNTHREAD THE REQUEST_^1*_]_^1_%JMP* SRHQUE_'THIS IS A RETRIEVE REQUEST ATTEMPTING_^1*_9TO LOCK AN ALREADY LOCKED FILE WITH_^1*_9A DIFFERENT COMBINATION OR A RETRIEVE_^1*_9REQUEST ATTEMPTING TO LOCK AN UN-_^1*_9LOCKED FILE BUT NO UNUSED FILE LOCK_^1*_9TABLE ENTRY S€€PACES ARE AVAILABLE OR_^1*_9IT IS A LOCK FILE REQUEST ATTEMPTING_^1*_9TO LOCK AN UNLOCKED FILE BUT NO UN-_^1*_9USED FILE LOCK TABLE ENTRY SPACES ARE_^1*_9AVAILABLE. LEAVE QUEUED. GET NEXT._^1*_9TO LOCK AN ALREADY LOCKED FILE WITH A DIFFER-_^1*_9ENT COMBINATION. LEAVE QUEUED, GET NEXT ONE._^1CHKQUE IIN 0_^1_%LDA* RQDFLG_'CHECK IF INTERRUPTED BY A REQUEST_^1_%SAZ SETFLG_'NO, RETUR€€N TO CALLER_^1_%EIN 0_^1_%JMP* FILREQ_'SEARCH QUEUE AGAIN_^1_%SPC 2_^1SETFLG LDA* ACTREQ_'SET ACTREQ FOR NEXT REQUEST (IF ANY)_^1_%STA- I_,I = REQUEST BUFFER ADDRESS OF FINISHED REQUEST_^1_%EIN 0_^1_%STQ* ACTREQ_^1_%SQZ CHKRSC_'NO NEW REQUEST_674*1655_^1*_8CHECK IF RACSPC SCHEDULING REQUIRED 74*1655_^1_%ENA $F_+FORM SCHEDULER CALL_^1_%AND- RPLIDX,Q_^1_%EOR* SCHCOD_^1_%STA* SC€€HCDE_^1_%SPC 2_^1_%RTJ- (AMONI)_%SCHEDULE NEW REQUEST TO BE UNTHREADED_^1SCHCDE ADC 0_^1_%ADC UNTHRD_^1_%SPC 2_Q74*1655_^1*_8CHECK IF RACSPC NEEDS TO BE SCHEDULED74*1655_^1_%SPC 1_Q74*1655_^1CHKRSC LDA* (VFLAG)_%CHECK IF SYSTEM HAS A TIMER_%**MSOS 4.1**_^1_%SAZ CHKRS_(NO_^1_%INA -6_^1_%SAN RETURN_'YES, GO RETURN TO CALLER_,74*1655_^1*_]74*1655_^1CHKRS SET A_,SET CURRENT F€€ILE NUM TO $FFFF TO_^1_%STA* (FNUMBR)_$ALLOW RELEASE OF FIS AND KIS DIRECTOR74*1655_^1_%IIN 0_Q74*1655_^1_%LDA* (RSFLAG)_$CHECK IF RACSPC CURRENTLY BUSY_%74*1655_^1_%RAO* (RSFLAG)_$BUMP RACSPC SCHEDULING FLAG_)74*1655_^1_%EIN 0_Q74*1655_^1_%SAN RETURN_'SKIP IF RACSPC CURRENTLY ACTIVE_$74*1655_^1*_]74*1655_^1_%RTJ- (AMONI)_%SCHEDULE RELEASE ALLOCATABLE_(74*1655_^1_%ADC D+$1203_%€€SPACE PROGRAM_774*1655_^1_%ADC RACSPC_L74*1655_^1_%EJT_]_^1*_*RETURN TO CALLER AND UNTHREAD NEXT FILE REQUEST_^1_%SPC 2_^1RETURN LDQ- I_,RETURN TO CALLER (Q = RBA OF FINISHED REQUEST)_^1_%INQ 1_^1_%SQZ DSPEXT_^1_%INQ -1_^1_%SQN CHKUNP_^1DSPEXT JMP- (ADISP)_%NO CALLER, ENTRY ONLY TO CHECK A QUEUE CHANGE_^1*_]_^1CHKUNP ENA HUPLVL_'CHECK IF CALLER UNPROTECTED_^1_%SUB- PL_^1_%SA€€M RESTOR_^1_%LDA JBCNFG_'CHECK IF JOB HAS BEEN KILLED_^1_%SAZ CKUN1_(SKIP IF NOT_^1_%RTJ SWAPCK_'RESET UNPIO + CHECK IF SWAP IS DESIRED_^1_%JMP- (ADISP)_%EXIT TO DISPATCHER_^1CKUN1 EQU CKUN1(*)_^1_%LDA- RTNADR,Q_L68*1512_^1_%RTJ CKUADR_'ASSURE RETURN ADDRESS IS IN UNPROTECTED68*1512_^1_%RTJ SWAPCK_'YES, RESET UNPIO + CHECK IF SWAP IS DESIRED_^1*_]_^1RESTOR LDA- IREG,Q_'REST€€ORE I AND Q REGISTERS_^1_%STA- I_^1_%LDA- RTNADR,Q_^1_%LDQ- QREG,Q_^1_%IIN 0_^1_%STA* FMEXIT_'SET RETURN_^1_%EIN 0_^1_%JMP* (FMEXIT)_$RETURN TO CALLER_^1*_]_^1FNUMBR ADC FILNBR_L74*1655_^1RSFLAG ADC RSAFLG_'RACSPC ACTIVE FLAG_274*1655_^1VFLAG ADC TMRTYP_'SYSTEM TIMER VERSION FLAG_+74*1655_^1FMEXIT ADC 0_,FILE MANAGER REQUEST EXIT_+74*1655_^1LSTPTR ADC 0_,LAST POINTER TO A R€€EQUEST BUFFER_#74*1655_^1*_]_^1UNTHRD STQ- I_,UNTHREAD NEXT REQUEST TO BE PROCESSED_^1_%LDQ* LSTPTR_^1*_]_^1UNT10 IIN 0_,CHECK IF (LAST POINTER) EQUALS NEXT POINTER_^1_%LDA- (ZERO),Q_'(MAY HAVE BEEN INTERRUPTED BY QUEUE REQUEST)_^1_%EOR- I_^1_%SAZ UNT20_^1_%EIN 0_^1_%LDQ- (ZERO),Q_$NO, CHECK NEXT REQBUF UNTIL (LSTPTR) = NXTPTR_^1_%JMP* UNT10_^1*_]_^1UNT20 STA RUTFLG_'SET REQU€€EST UNTHREADED FLAG_)74*1655_^1_%LDA- (I)_^1_%STA- (ZERO),Q_$UNTHREAD THE REQUEST_^1_%LDQ- I_.STORE (NEXT POINTER) INTO (LAST POINTER)_^1_%EIN 0_^1_%JMP CHKRPC_'PROCESS NEXT REQ.(Q=REQ BUFF ADDR)_!74*1655_^1_%EJT_]_^1*_*CHECK IF THE REQUEST IS EXECUTABLE NOW._^1*_*THE REQUEST IS NOT EXECUTABLE IF_^1*_,1. THE REQUEST IS A LOCK FILE REQUEST, ITS FILE_^1*_/IS NOT CURRENTLY LOCKED AN€€D THE LOCK FILE TABLE_^1*_/DOES NOT HAVE ROOM FOR AN ADDITIONAL ENTRY._^1*_,2. THE REQUEST IS A RETRIEVE/LOCK REQUEST, ITS_^1*_/FILE IS CURRENTLY LOCKED AND THE COMBINATIONS_^1*_/ARE DIFFERENT._^1*_,3. THE REQUEST IS A RETRIEVE/LOCK REQUEST, ITS_^1*_/FILE IS NOT CURRENTLY LOCKED AND THE LOCK FILE_^1*_/TABLE DOES NOT HAVE ROOM FOR AN ADDITIONAL_^1*_/ENTRY_^1XQTCHK 000 000_^1_%STQ- €€I_-(SAVE REQUEST BUFFER ADDRESS IN I-REGISTER)_^1_%LDQ- APL,Q_(Q = ADDRESS OF PARAMETER LIST_^1_%RTJ ABSPAR_'ABSOLUTIZE ADDRESS OF FILE NUMBER_^1_%TRA Q_^1_%LDQ- (ZERO),Q_^1_%STQ* CFILNO_)SAVE CURRENT FILE NUMBER_^1*_]_^1_%RTJ CKPROT_'CHECK IF CALLER UNPROTECTED_^1_%SAZ TREXIT_'UNPROTECTED REQUEST CANNOT LOCK FILE_^1_%LDA- RPLIDX,I_$CHECK IF REQUEST IS A RETRIEVE REQUEST_^1_%AR€€S 4_^1_%INA -NUMRPE+3_^1_%STA* SAVETP_'SAVE INDICATOR (POS IF A RETRIEVE)_^1_%SAP GETCOM_'YES_^1_%INA 5_,CHECK IF REQUEST IS A LOCK FILE REQ_^1_%SAZ GETCOM_'YES_^1TREXIT CLR A_^1_%JMP* XCEXIT_'NO, EXIT WITH A = 0_^1*_]_^1GETCOM LDQ- APL,I_(CHECK IF REQUEST HAS A COMBINATION_^1_%INQ 1_^1_%ARS 1_^1_%AAQ Q_,Q = ADDRESS OF REQUEST,S FILE COMBINATION_^1_%RTJ* ABSPAR_'ABSOLUTIZE €€THIS ADDRESS_^1_%TRA Q_^1_%LDA- (ZERO),Q_$A = REQUEST,S FILE COMBINATION_^1_%AND- ONEMSK+14_^1_%SAN SAVCOM_'SKIP IF YES_^1_%JMP* XCEXIT_'NO COMBINATION, EXIT WITH A = 0_^1*_]_^1SAVCOM STA* RFLCOM_'SAVE REQUEST, FILE COMBINATION_^1_%LDQ* LOKNEU_'CHECK IF FILE IS CURRENTLY LOCKED_^1_%SQN MAYBE_(CHECK IF POSSIBLY YES_^1_%JMP* DOXQT_^1*_]_^1MAYBE LDQ =XLOKNOE_^1_%QLS 1_^1CKSLOT I€€NQ -2_+SEARCH FILE LOCK TABLE FOR SAME FILE_^1_%SQM NOTLOK_'SKIP OUT IF SEARCH EXHAUSTED_^1_%LDA* LOKTBL,Q_$CHECK IF CURRENT ENTRY HAS FN_^1_%SAZ REPEAT_'SKIP IF NO_^1_%SUB* CFILNO_'CHECK IF FN,S ARE IDENTICAL_^1_%SAZ CHKCOM_'YES_^1REPEAT JMP* CKSLOT_^1*_]_^1CHKCOM ADQ =XLOKTBL_$SET Q TO ABS ADDR OF ENTRY_^1_%LDA- 1,Q_^1_%SUB* RFLCOM_'CHECK IF FILE COMBS ARE IDENTICAL_^1_%SAZ €€ XCEXIT_'YES, EXIT WITH A = 0 (REQT CAN BE_^1*_9EXECUTED)_^1_%LDA* SAVETP_'CHECK IF REQUEST IS A RETRIEVE_^1_%SAP DOQUEU_'YES, REQT IS A RETREQ_^1_%JMP* DOXQT_(EXIT WITH A = 0 TO EXECUTE REQUEST_^1*_9LOCK FILE REQUEST_^1*_]_^1NOTLOK LDA* LOKNEU_'FILE IS NOT CURRENTLY LOCKED. CHECK_^1_%SUB =XLOKNOE_%IF FILE LOCK TABLE HAS ROOM FOR NEW_^1_%SAZ DOQUEU_(ENTRY - SKIP IF NO_^1DOXQT €€ CLR A_^1_%JMP* XCEXIT_'EXIT WITH A = 0 TO EXECUTE REQUEST_^1DOQUEU ENA 1_,EXIT WITH A = 1 TO QUEUE REQUEST_^1XCEXIT LDQ- I_,RESTORE REQUEST BUFFER ADDRESS IN Q_^1_%JMP* (XQTCHK)_%AND EXIT_^1_%SPC 1_^1RFLCOM ADC 0_,SAVE REQUEST,S FILE COMBINATION_^1CFILNO ADC 0_,CURRENT FILE NUMBER BEING CHECKED_^1SAVETP NUM 0_,SAVED REQUEST TYPE FLAG_^1_%SPC 2_^1_%EQU LOKNOE(15)_"NUMBER OF€€ ENTRIES_^1LOKNEU NUM 0_,NUMBER OF ENTRIES USED_^1LOKTBL BZS LOKTBL(2*LOKNOE)_!FILE LOCK TABLE_^1_%EJT_]_^1*_8REQUEST PROCESSOR TABLE_^1_%SPC 1_^1RPTABL EQU RPTABL(*)_^1_%ADC FMRP01_'STARTING SECTOR OF DEFFIL_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF DEFFIL_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR DEFFIL_^1*_]_^1_%ADC FMRP02_'STARTING SECTOR OF RELFIL_^1_%AD€€C 0_,START ADR OR LENGTH (IF NOT IN CORE) OF RELFIL_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR RELFIL_^1*_]_^1_%ADC FMRP03_'STARTING SECTOR OF DEFIDX_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF DEFIDX_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR DEFIDX_^1*_]_^1_%ADC FMRP04_'STARTING SECTOR OF LOKFIL_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF LOKFIL_^1_€€%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR LOKFIL_^1*_]_^1_%ADC FMRP05_'STARTING SECTOR OF UNLFIL_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF UNLFIL_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR UNLFIL_^1*_]_^1_%ADC FMRP06_'STARTING SECTOR OF STOSEQ_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF STOSEQ_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR STOSEQ_^1*€€_]_^1_%ADC FMRP07_'STARTING SECTOR OF STODIR_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF STODIR_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR STODIR_^1*_]_^1_%ADC FMRP08_'STARTING SECTOR OF STOIDX_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF STOIDX_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR STOIDX_^1*_]_^1_%ADC FMRP09_'STARTING SECTOR OF RTVSEQ_^1_%ADC 0€€_,START ADR OR LENGTH (IF NOT IN CORE) OF RTVSEQ_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR RTVSEQ_^1*_]_^1_%ADC FMRP10_'STARTING SECTOR OF RTVDIR_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF RTVDIR_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR RTVDIR_^1*_]_^1_%ADC FMRP11_'STARTING SECTOR OF RTVIDX_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF RTVIDX_^1_%ADC€€ 0_,TIME REMAINING FOR REQUEST PROCESSOR RTVIDX_^1*_]_^1_%ADC FMRP12_'STARTING SECTOR OF RTVIDO_^1_%ADC 0_,START ADR OR LENGTH (IF NOT IN CORE) OF RTVIDO_^1_%ADC 0_,TIME REMAINING FOR REQUEST PROCESSOR RTVIDO_^1*_]_^1_%ADC FMREND_'ENDING SECTOR OF REQUEST PROCESSORS_^1_%EJT_]_^1*_*A B S O L U T I Z E_!P A R A M E T E R_^1_%SPC 2_^1ABSPAR 000 000_*Q = POINTER TO PARAMETER ADD€€RESS_^1_%IIN 0_^1*_83 CARDS DELETED_^1_%TRQ A_N**MSOS 4.1**_^1_%SUB =XEND0V4_$IS THE REQUEST FROM PART 1_^1_%INA -1_^1_%SAM AP30_)NO_?**MSOS 4.1**_^1_%LDA- (ZERO),Q_$REQUEST FROM PART 1, ABSOLUTE ADDRESSING ONLY_^1_%JMP* APEXIT_^1*_]_^1*_81 CARD DELETED_^1*_]_^1AP30_!LDA- (ZERO),Q_$REQUEST FROM PART 0, A = ABS/REL PARAMETER ADR_^1_%SAP APEXIT_^1_%AAQ A_,ABSOLUTIZE RELATIVE P€€ARAMETER ADDRESS_^1_%AND- ONEMSK+14_^1APEXIT EIN 0_^1_%JMP* (ABSPAR)_$A = ABSOLUTE PARAMETER ADDRESS_^1_%EJT_]_^1*_*C H E C K_!I F_!F I S_!I S_!I N_!C O R E_^1_%SPC 2_^1CKCFIS 000 000_*Q = FILE NUMBER (SAVE IT)_^1_%IIN 0_^1_%STQ* FILNBR_^1_%LDQ =XFSTLOC_$Q = START OF CORE FIS THREAD_^1*_]_^1CNXFIS LDQ- (ZERO),Q_$CHECK IF THERE IS A NEXT FIS_^1_%SQN CHKCLK_^1_%EIN 0_,NO MORE,€€ FILE FIS NOT IN CORE_^1_%SET A_^1_%JMP* (CKCFIS)_$EXIT WITH A = -0_^1*_]_^1CHKCLK RAO- FILCLK,Q_$INCREMENT FIS CLOCK TO PREVENT ITS RELEASE_^1_%EIN 0_^1_%LDA- FILENO,Q_$CHECK FIS FILE NUMBER_^1_%SUB* FILNBR_^1_%SAZ FISFND_'FIS FOUND_^1*_]_^1_%LDA- FILCLK,Q_$RESTORE CLOCK VALUE_^1_%INA -1_^1_%IIN 0_^1_%SAZ CKNFIS_'DONT RESTORE CLOCK TO ZERO_^1_%STA- FILCLK,Q_^1CKNFIS JMP* CNX€€FIS_'CHECK NEXT FIS_^1*_]_^1FISFND LDA FDTINT_'FIS FOUND, RESET CLOCK TO TIME INTERVAL_^1_%STA- FILCLK,Q_^1_%JMP* (CKCFIS)_$EXIT WITH A = POSITIVE_^1_%SPC 2_^1FILNBR NUM 0_,FILE NUMBER OF CURRENT REQUEST_^1_%EJT_]_^1*_*C H E C K_!I F_!R E Q U E S T_!P R O T E C T E D_^1_%SPC 2_^1CKPROT 000 000_^1_%IIN 0_^1_%ENA HUPLVL_^1_%SUB- PL_^1_%SAM CP10_)A = NEGATIVE, IF REQUEST PROTE€€CTED_^1*_]_^1_%LDA FMPFLG_'A = POSTIVE, IF REQUEST HAS SET FMPFLG_^1CP10_!EIN 0_,A = ZERO,_#IF REQUEST UNPROTECTED_^1_%JMP* (CKPROT)_^1_%EJT_]_^1*_*C H E C K_!U N P R O T E C T E D_!A D D R E S S_^1_%SPC 2_^1CKUADR 000 000_*A = ADDRESS TO BE CHECKED_^1_%IIN 0_,Q = POINTER TO ADDRESS OR ZERO_^1_%STA* ADRESS_^1_%RTJ* CKPROT_'CHECK IF CALLER UNPROTECTED_^1_%IIN 0_^1_%SAM CKEXI€€T_)NO, EXIT WITH ADDRESS_^1_%LDA- $F7_*CHECK BOTTOM END_^1_%RTJ* CMPR16_^1_%SAP UNPERR_^1_%LDA- $F6_*CHECK TOP END_^1_%INA -1_^1_%RTJ* CMPR16_^1_%SAM UNPERR_^1CKEXIT LDA* ADRESS_'ADDRESS VALID, EXIT_^1_%EIN 0_^1_%JMP* (CKUADR)_^1_%EJT_]_^1*_*PROCESS UNPROTECTED ADDRESS ERROR_^1*_]_^1UNPERR SQZ RERROR_'UNPROTECTED ADDRESS ERROR_^1_%TRQ A_^1_%LDQ LPTRS_(ILLEGAL REQUEST BUFFER €€AND / OR INDICATOR_^1_%STA- (ZERO),Q_^1_%RTJ- (AVOLR)_%RELEASE VOLATILE_^1_%EIN 0_^1_%RTJ SWAPCK_'RESET UNPIO AND CHECK IF SWAP DESIRED_^1_%LDQ LOCF_)HANDLE AS A (J02,XXXX) ERROR_^1_%JMP- (ZERO),Q_^1_%SPC 2_^1RERROR EIN 0_,REQUEST ERROR, ILLEGAL PARAMETER, SET BIT 14_^1_%LDA- ONEBIT+14_^1_%JMP FMRERR_'RETURN TO USER_^1_%SPC 2_^1CMPR16 000 000_*COMPARE UNP. BOUND WITH A 16 B€€IT ADDRESS_^1_%EOR* ADRESS_*CHECK IF SIGNS ARE THE SAME_^1_%SAP CMP010_+(YES)_^1_%LDA* ADRESS_^1_%JMP* (CMPR16)_$A .GE. 0 IF UNP. BOUND HIGHER_^1*_]_^1CMP010 EOR* ADRESS_'SUBTRACT ADDRESS FROM UNP. BOUND_^1_%SUB* ADRESS_^1_%JMP* (CMPR16)_$A .GE. 0 IF UNP. BOUND HIGHER_^1_%SPC 2_^1ADRESS NUM 0_,ADDRESS TO BE CHECKED_^1_%EJT_]_^1*_*G E T_!C O R E_!A L L O C A T A B L E_!S P A C E_€€^1_%SPC 2_^1*_8ROUTINE WILL REQUEST N WORDS OF SPACE_^1*_8INPUT N IN A-REGISTER_^1*_8RETURNS ADDRESS OF ALLOCATED SPACE IN Q_^1*_8IF Q IS NEGATIVE, ALLOCATION ERROR_^1GETSPC 000 000_^1_%STA* RQ+5_)STORE NUMBER OF WORDS IN SPACE REQUEST_^1*_]_^1_%LDA- I_,SAVE I-REGISTER_^1_%STA* ISAVE_^1*_]_^1_%ENA -$F_^1_%AND* RQ+1_^1_%EOR- PL_+PROG PRIORITY_^1_%STA* RQ+1_^1*_]_^1RQ_#RTJ- (AMONI€€)_%GET SPACE_^1_%ADC D+$1400+$10*RPLSR_C68*1512_^1_%ADC CP_^1_%ADC 0_^1_%ADC 0_^1_%ADC 0_^1_%JMP- (ADISP)_^1_%SPC 2_^1CP_#SQP GSEXIT_^1_%RTJ+ SYFAIL_'ALLOCATION SETUP ERROR - HANG_^1*_]_^1GSEXIT LDA* ISAVE_(RESTORE I- REGISTER AND EXIT_^1_%STA- I_^1_%JMP* (GETSPC)_^1_%EJT_]_^1*_*M A S S_!M E M O R Y_!R E A D_!S U B R O U T I N E_^1*_]_^1*_1READ FROM MASS MEMORY (SA,NW,LU,IN€€DEX,SECTOR)_^1MMREAD 000 000_^1_%LDA- ONEBIT+9-4_"A = READ REQUEST CODE ($200)_^1_%LDQ* MMREAD_'SAVE ENTRY IN THE WRITE SUBROUTINE_^1_%JMP* REDWRT_'TRANSFER TO COMMON READ/WRITE ENTRY_^1_%SPC 1_^1*_*M A S S_!M E M O R Y_!W R I T E_!S U B R O U T I N E_^1*_]_^1*_1WRITE FROM MASS MEMORY (SA,NW,LU,INDEX,SECTOR)_^1MMWRIT 000 000_^1_%LDA- ONEBIT+10-4_!A = WRITE REQUEST CODE ($400)_^1€€_%LDQ* MMWRIT_^1_%SPC 1_^1*_*COMMON READ/WRITE ENTRY_^1REDWRT EOR- PL_+FORM REQUEST WORD WITH READ/WRITE REQUEST CODE_^1_%ALS 4_^1_%EOR- PL_,(USE PRIORITY LEVEL FOR RP AND CP)_^1_%EOR- ONEBIT+14_#PUT IN D BIT._^1_%STA* RW_^1*_]_^1_%LDA- I_,SAVE I-REGISTER_^1_%STA* ISAVE_^1_%STQ- I_,Q = ADDRESS OF FIRST PARAMETER_^1_%INQ 5_^1_%STQ* MMWRIT_'SETUP RETURN_^1*_]_^1_%LDQ- (ZERO),I_$GE€€T PARAMETERS AND STORE INTO MONITOR REQUEST_^1_%STQ* SA_+STORE STARTING ADDRESS_^1_%LDQ- 1,I_^1_%STQ* NW_+STORE NUMBER OF WORDS_^1_%LDQ- 2,I_^1_%STQ* LU_+STORE LOGICAL UNIT_^1*_]_^1_%ENA WRDSEC_'COMPUTE MSB/LSB MASS MEMORY ADDRESS_^1_%MUI- 4,I_,(GET SECTOR)_^1_%LLS 1_^1_%ALS 15_^1_%ADD- 3,I_*ADD INDEX USING DOUBLE PRECISION_^1_%SAP STOMMA_^1_%INQ 1_^1_%AND- ONEMSK+14_^1STOMMA €€STQ* MSB_*STORE MSB AND LSB WORD ADDRESSES_^1_%STA* LSB_^1_%EJT_]_^1*_*EXECUTE THE MASS MEMORY TRANSFER_^1*_]_^1_%LDA =XMAXMMA_$SET MAXIMUM NO. OF MASS MEMORY ERROR ATTEMPTS_^1_%STA* IOCNTR_^1*_]_^1MMTRAN RTJ- (AMONI)_%READ/WRITE MONITOR CALL_^1RW_#ADC 0_.1. REQUEST WORD_^1_%ADC MMCOMP_)2. COMPLETION ADDRESS_^1_%ADC 0_.3. THREAD_^1LU_#ADC 0_.4. LOGICAL UNIT_^1NW_#ADC 0_.5. NU€€MBER OF WORDS_^1SA_#ADC 0_.6. STARTING ADDRESS_^1MSB_"ADC 0_.7. MOST SIGNIFICANT BITS OF MM ADDRESS_^1LSB_"ADC 0_.8. LEASTSIGNIFICANT BITS OF MM ADDRESS_^1_%JMP- (ADISP)_^1_%SPC 2_^1MMCOMP SQP MMEXIT_'MASS MEMORY COMPLETE, CHECK FOR ERROR_^1_%LDQ* IOCNTR_'READ/WRITE ERROR, DECREMENT COUNT_^1_%INQ -1_+CHECK IF DONE_^1_%STQ* IOCNTR_^1_%SQM MMEXIT_!*****MM ERROR,EXIT WITH Q NEG€ ATIVE_^1_%JMP* MMTRAN_'GO TRY AGAIN_^1_%SPC 2_^1MMEXIT LDA* ISAVE_(MASS MEMORY EXIT, RESTORE I AND RETURN_^1_%STA- I_^1_%JMP* (MMWRIT)_^1_%SPC 2_^1ISAVE NUM 0_,SAVE I-REGISTER_^1IOCNTR NUM 0_,NUMBER OF TRIES TO REPEAT FAILED I/O REQUEST_^1_%SPC 5_^1_%END_]_^__ PRSPCV4 CSY/ F02 P€1_%NAM RSPCV4_'DECK-ID F02 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*R E L E A S E_!A L L O C A T A B L E_!C O R E_!S P A C E_^1*_]_^1_%EQU RSCPL(3)_$RELEASE ALLOC. SPACE COMP. PRIORITY LVL68*1511_^1_%EQU RSRPL(10)_#RELEASE ALLOC. S€€PACE REQT. PRIORITY LVL68*1511_^1*_]_^1*_*ENTRY POINTS_^1*_81 CARD DELETED_674*1785_^1_%EQU D($4000)_$D-BIT FOR MONITOR REQUESTS_'**MSOS 4.1**_^1_%ENT FSLMMA_'MM ADR OF FILE SPACE LIST ON AUTOLOAD IMAGE_^1_%ENT RACSPC_'RELEASE ALLOCATABLE CORE SPACE_%74*1785_^1_%ENT RSAFLG_'RACSPC ACTIVE FLAG_274*1785_^1*_]_^1*_*EXTERNALS_^1_%EXT FILREQ_'EXECUTE NEXT FILE REQUEST (FILMGR)_^1_%€€EXT ACTREQ_'ACTIVE REQUEST FLAG IN REQUEST SUPERVISOR_^1_%EXT ARQPRO_'ADDRESS OF CURRENT (OR LAST) REQUEST PROCESSOR_^1_%EXT RPTABL_'REQUEST PROCESSOR TABLE_^1_%EXT FILNBR_'FILE NUMBER OF CURRENT REQUEST_^1*_]_^1_%EXT FSTLOC_'FIS STARTING THREAD LOC (IF ZERO, NO CORE FIS)_^1_%EXT TMRTYP_'TIMER VERSION FLAG_!0 = NO TIMER_"74*1785_^1_%EXT FIDLOC_'FIS DIRECTORY LOCATION (IF ZER€€O, NO CORE FIS)_^1_%EXT FDTINT_'FILE/DIRECTORY TIMEOUT INTERVAL_^1*_]_^1_%EXT FSLIST_'START OF FILE SPACE LIST_^1_%EXT FSLLTH_'FILE SPACE LIST LENGTH_^1_%EXT FSLEND_'END OF FILE SPACE LIST_^1_%EXT FISLU_(L.U. OF FIS DIRECTORY AND FIS BLOCKS_!63*1348_^1_%EJT_]_^1*_*EQUIVALENCES_^1*_81 CARD DELETED_668*1511_^1_%EQU TIMPER(0)_#TIME PERIOD FOR RESCHEDULING RELSPC_^1_%EQU TUNITS(€€1)_#TIME UNITS FOR RESCHEDULING RELSPC_^1_%EQU FIDCLK(1)_#FIS DIRECTORY CLOCK INDEX_^1_%EQU NUMRPE(12)_"NUMBER OF REQUEST PROCESSOR ENTRIES_^1*_]_^1*_1COMMUNICATION REGION CONSTANTS_^1_%EQU ZERO(2)_%LOCATION CONTAINING ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU ZROMSK($13)_!ZERO MASK TABLE_^1_%EQU ONEBIT($23)_!ONE BIT TABLE_^1_%EQU ZROBIT($33)_!ZERO BIT TABLE_^1_%EQU A€€DISP($EA)_"ADDRESS OF DISPATCHER_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR REQUEST ENTRY_^1*_]_^1*_1REQUEST PROCESSOR TABLE INDEXES_^1_%EQU RPSADR(2)_#REQUEST PROCESSOR STARTING CORE ADDRESS_^1_%EQU RPLGTH(2)_#REQUEST PROCESSOR LENGTH_^1_%EQU RPTREM(3)_#REQUEST PROCESSOR TIME REMAINING_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN F€€ILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1€€_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CO€€DE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU €€KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGI€€CAL UNITS_^1_%EJT_]_^1*_*RELEASE REQUEST PROCESSOR SUBROUTINE SPACE, IF NOT USED_^1*_]_^1*_86 CARDS DELETED_574*1785_^1RACSPC LDQ =XRPTABL_$SET I TO ADDRESS OF REQUEST PROCESSOR TABLE_^1_%STQ- I_^1_%ENQ 3*NUMRPE-1_"Q = LENGTH OF THE REQUEST PROCESSOR TABLE_^1*_]_^1CHKRPS INQ -3_+CHECK THE NEXT REQUEST PROCESSOR SUBROUTINE_^1_%IIN 0_^1_%LDA- RPTREM,B_$IS THE REMAINING TIME ZERO_€€^1_%SAZ DONERP_)YES, REQUEST PROCESSOR NOT IN CORE_^1*_]_^1_%INA -1_-NO, REQUEST PROCESSOR IN CORE_^1_%STA- RPTREM,B_$DECREMENT REMAINING TIME, CHECK IF ZERO_^1_%SAN DONRPS_)NO, LEAVE REQUEST PROCESSOR IN CORE_^1*_]_^1_%LDA- RPSADR,B_'YES, GET STARTING ADDRESS OF REQ PROCESSOR_^1_%STA* RLSRPS+2_^1_%INA 1_^1_%EOR* (ADRRPA)_$IS THIS THE CURRENT ACTIVE REQUEST PROCESSOR_^1_%SAN €€ RELRPS_(NO, RELEASE THE REQUEST PROCESSOR SUBROUTINE_^1*_]_^1_%RAO- RPTREM,B_$REQUEST PROCESSOR IN USE, DO NOT RELEASE_^1DONERP JMP* DONRPS_^1*_]_^1*_]_^1RELRPS LDA* (RLSRPS+2)_"SETUP THE REQUEST PROCESSOR LENGTH_^1_%STA- RPLGTH,B_^1*_]_^1RLSRPS RELEAS 0_*RELEASE THE REQUEST PROCESSOR SUBROUTINE_^1*_83 CARDS DELETED_574*1785_^1*_]_^1DONRPS EIN 0_,CHECK IF DONE CHECKING REQUEST PR€€OCESSOR SUBS._^1_%SQM CHKFID_)YES, CHECK FIS DIRECTORY_^1_%JMP* CHKRPS_)NO , CHECK NEXT ONE_^1_%EJT_]_^1*_*RELEASE FILE INFORMATION SEGMENT DIRECTORY, IF NOT USED_^1*_]_^1CHKFID IIN 0_,CHECK IF FIS DIRECTORY IN CORE_^1_%LDQ* (AFDLOC)_^1_%SQZ CKCFIS_)NO, CHECK CORE FIS,S_^1*_]_^1_%LDA- FIDCLK,Q_$DECREMENT FIS DIRECTORY CLOCK_^1_%INA -1_^1_%STA- FIDCLK,Q_$CHECK IF FIS DIRECTORY C€€LOCK IS ZERO_^1_%SAN CKCFIS_)NO, CHECK CORE FIS,S_^1*_]_^1_%STA* (AFDLOC)_'YES, GET STARTING FIS DIRECTORY LOCATION_^1_%STQ* RELFID+2_^1*_]_^1*_]_^1RELFID RELEAS 0_*RELEASE FIS DIRECTORY_^1*_83 CARDS DELETED_574*1785_^1_%EJT_]_^1*_*CHECK IF ALL CORE FIS,S HAVE BEEN CHECKED_^1*_]_^1CKCFIS LDQ* AFSTLO_'CHECK CORE FIS,S_^1*_]_^1CNXFIS EIN 0_,CHECK NEXT FIS_^1_%STQ* LSTPTR_^1_%LDQ- (€€ZERO),Q_$SAVE LAST FIS POINTER AND GET NEXT ONE_^1_%SQN CINUSE_^1_%JMP SAVFSL_'CHECK IF FILE SPACE LIST IS TO BE SAVED_^1*_]_^1CINUSE IIN 0_,CHECK IF FILE NUMBER CURRENTLY IN USE_^1_%LDA- FILENO,Q_^1_%EOR FILNBR_^1_%SAN CHKKID_^1_%LDA* (ADRARQ)_$YES, CHECK IF FILE MANAGER BUSY_^1_%SAZ CHKKID_^1_%JMP* CNXFIS_'YES, DONT COUNT DOWN CLOCK ON CURRENT FIS_^1_%EJT_]_^1*_*CHECK THE K€€IS DIRECTORY OF THE CORE FIS_^1*_]_^1CHKKID STQ- I_,I = ADDRESS OF CORE FIS_^1_%STQ* FISPTR_^1_%LDQ- ADRKID,Q_$IS KIS DIRECTORY IN CORE_^1_%SQN DCRKID_)YES, DECREMENT KIS DIRECTORY CLOCK_^1_%JMP* CHKFIS_)NO, CHECK CORRESPONDING FIS_^1*_]_^1DCRKID LDA- (ZERO),Q_$DECREMENT KIS DIRECTORY CLOCK_^1_%INA -1_^1_%STA- (ZERO),Q_$IS CLOCK ZERO_^1_%SAZ CHGKID_)YES, CHECK IF KIS DIRECTORY €€CHANGED_^1_%LDA- FILCLK,I_'NO, DECREMENT FIS CLOCK_^1_%INA -1_+DONT RELEASE FIS BEFORE ITS KIS DIRECTORY_^1_%SAZ CNTFIS_^1_%STA- FILCLK,I_^1*_]_^1CNTFIS LDQ- I_,CHECK NEXT FIS (RESTORE CORE FIS ADDRESS IN Q)_^1_%JMP* CNXFIS_^1*_]_^1CHGKID STQ* RKID10+2_$CHECK IF KIS DIRECTORY CHANGED_^1_%ENA 2_.(SET KIS DIRECTORY RELEASE ADDRESS)_^1_%AND- IDXCHG,I_^1_%SAN CLRKID_)YES, CLEAR KI€€S DIRECTORY CHANGED BIT_^1_%JMP* RELKID_)NO, RELEASE KIS DIRECTORY_^1*_]_^1CLRKID LDA- IDXCHG,I_$CLEAR KIS DIRECTORY CHANGED BIT_^1_%AND- ZROBIT+1_^1_%EIN 0_^1_%STA- IDXCHG,I_^1_%STQ* SAKID_(WRITE CHANGED KIS DIRECTORY ONTO MASS MEMORY_^1_%ENA WRDSEC_^1_%MUI- KIDSIZ,I_^1_%STA* NWKID_(SET STARTING ADDRESS, NUMBER OF WORDS,_^1_%LDA- FISFLG,I_^1_%ARS 7_,LOGICAL UNIT, AND SECTOR OF€€ KIS DIRECTORY._^1_%AND- ONEMSK+6_^1_%STA* LUKID_^1_%LDA- KIDSEC,I_^1_%STA* SECKID_^1_%EJT_]_^1*_*WRITE OUT KIS DIRECTORY AND RELEASE IF NOT USED_^1*_]_^1_%RTJ- (AMONI)_%WRITE OUT CHANGED KIS DIRECTORY_^1_%ADC D+$C00+$10*RSRPL+RSCPL_#1.REQUEST WORD_+68*1511_^1_%ADC CKDMME_)2. COMPLETION ADDRESS_^1_%ADC 0_.3. THREAD_^1LUKID ADC 0_.4. LOGICAL UNIT_^1NWKID ADC 0_.5. NUMBER OF W€€ORDS_^1SAKID ADC 0_.6. STARTING ADDRESS_^1_%ADC 0_.7. NOT USED_^1SECKID ADC 0_.8. SECTOR ADDRESS_^1_%JMP- (ADISP)_^1*_] 63*1348_^1FISPTR NUM 0_,CURRENT FIS POINTER_^1LSTPTR NUM 0_,LAST CORE FIS POINTER_^1ADRARQ ADC ACTREQ_'ACTIVE REQUEST FLAG_^1ADRRPA ADC ARQPRO_'ADDRESS OF CURRENT (OR LAST) REQUEST PROCESSOR_^1AFSTLO ADC FSTLOC_'FIS STARTING THREAD LOCATION_^1AFDLOC ADC €€ FIDLOC_'FIS DIRECTORY LOCATION_^1AFDINT ADC FDTINT_'FILE/DIRECTORY TIMEOUT INTERVAL_^1AFSLEN ADC FSLEND_'END OF FILE SPACE LIST_^1*_85 CARDS DELETED_574*1785_^1CKDMME IIN 0_,CHECK FOR KIS DIRECTORY MASS MEMORY ERROR_^1_%TRQ A_^1_%LDQ* FISPTR_'I = CORE FIS ADDRESS_^1_%STQ- I_^1_%LDQ- ADRKID,Q_$Q= KIS DIRECTORY ADDRESS_^1_%SAP CKDCLK_^1*_]_^1_%LDA* (AFDINT) *****MASS MEMORY ERR€€OR, DONT RELEASE FROM CORE_^1_%STA- (ZERO),Q_$RESET CLOCK IN HOPE THAT NEXT TIME WILL BE OK_^1_%LDA- IDXCHG,I_$RESET KIS DIRECTORY CHANGE BIT_(63*1348_^1_%AND- ZROBIT+1_L63*1348_^1_%EOR- ONEBIT+1_L63*1348_^1_%STA- IDXCHG,I_L63*1348_^1*_]_^1CKDCLK LDA- (ZERO),Q_$CHECK IF KIS DIRECTORY HAS CHANGED_^1_%SAZ RELKID_'NO, RELEASE THE CURRENT FIS,S KIS DIRECTORY_^1_%JMP* CNTFIS_'YES, DONT€€ RELEASE, CHECK NEXT FIS_^1*_]_^1RELKID STA- ADRKID,I_$MARK KIS DIRECTORY NOT IN CORE AND RELEASE IT_^1RKID10 RELEAS 0_^1*_83 CARDS DELETED_574*1785_^1_%EJT_]_^1*_*CHECK NEXT FILE INFORMATION SEGMENT_^1*_]_^1CHKFIS IIN 0_,DECREMENT FIS CLOCK_^1_%LDQ- I_^1_%LDA- FILCLK,Q_^1_%INA -1_^1_%STA- FILCLK,Q_$IS CLOCK ZERO_^1_%SAZ CHGFIS_)YES, CHECK IF FIS HAS CHANGED_^1_%JMP* CNXFIS_)NO,€€ CHECK NEXT FIS ON THREAD_^1*_]_^1CHGFIS STQ* RELFIS+2_$CHECK IF FIS HAS CHANGED_^1_%ENA 1_.(SET FIS RELEASE ADDRESS)_^1_%AND- IDXCHG,Q_^1_%SAN CLRFIS_'YES, CLEAR FIS CHANGED BIT_^1_%JMP* UNTFIS_'NO, UNTHREAD FIS_^1*_]_^1CLRFIS LDA- IDXCHG,Q_$CLEAR FIS CHANGED BIT_^1_%AND- ZROBIT_^1_%EIN 0_^1_%STA- IDXCHG,Q_^1_%ARS 7_,WRITE CHANGED FIS ONTO MASS MEMORY_^1_%AND- ONEMSK+8_^1_%ST€€A* LSBFIS_'SAVE FIS INDEX_^1_%LDA- SECFIS,Q_$SET STARTING ADDRESS_263*1348_^1_%INQ FH_^1_%STQ* SAFIS_^1*_]_^1_%MUI =XWRDSEC_^1_%LLS 1_^1_%ALS 15_+CONVERT FIS SECTOR AND INDEX TO MSB, LSB_^1_%ADD* LSBFIS_^1_%SAP STOLSB_^1_%INQ 1_^1_%AND- ONEMSK+14_^1STOLSB STA* LSBFIS_^1_%STQ* MSBFIS_^1_%EJT_]_^1*_*WRITE OUT FIS AND RELEASE IF NOT USED_^1*_]_^1*_*WRITE OUT CHANGED FIS_^1_%RTJ-€€ (AMONI)_%WRITE OUT CHANGED FIS_^1_%ADC D+$400+$10*RSRPL+RSCPL_#1.REQUEST WORD_+68*1511_^1_%ADC CKFMME_)2. COMPLETION ADDRESS_^1_%ADC 0_.3. THREAD_^1_%ADC FISLU_*4. LOGICAL UNIT_563*1348_^1_%ADC FISSIZ_)5. NUMBER OF WORDS_^1SAFIS ADC 0_.6. STARTING ADDRESS_^1MSBFIS ADC 0_.7. MOST SIGNIFICANT BITS_^1LSBFIS ADC 0_.8. LEAST SIGNIFICANT BITS_^1_%JMP- (ADISP)_^1*_]_^1CKFMME II€€N 0_,CHECK FOR FIS MASS MEMORY ERROR_^1_%LDA* FISPTR_'I = CORE FIS ADDRESS_^1_%STA- I_^1_%SQM RESET_"*****MASS MEMORY ERROR, DONT RELEASE CORE_!63*1348_^1*_]_^1_%LDA- FILCLK,I_$CHECK IF THE FIS CLOCK HAS CHANGED_^1_%SAN CKNFIS_)YES, DONT RELEASE, CHECK NEXT FIS_^1_%JMP* UNTFIS_'UNTHREAD AND RELEASE FIS_^1RESET LDA- IDXCHG,I_$RESET FIS CHANGED BIT_163*1348_^1_%AND- ZROBIT_N63*13€€48_^1_%EOR- ONEBIT_N63*1348_^1_%STA- IDXCHG,I_^1_%RAO* RSAFLG_^1*_81 CARD DELETED_^1*_]_^1_%LDA* (AFDINT)_$MM ERROR OR FILE LOCKED, DONT RELEASE_^1_%STA- FILCLK,I_$RESET CLOCK IN HOPE THAT NEXT TIME WILL BE OK_^1CKNFIS JMP* CNTFIS_'CHECK NEXT FIS_^1_%EJT_V63*1348_^1*_*UNTHREAD THE CORE FIS FROM THREAD_^1UNTFIS LDQ* LSTPTR_'Q = POINTER TO LAST FIS_^1*_]_^1FNDFIS IIN 0_,FIND NEW LAS€€T FIS POINTER IF INTERRUPTED_^1_%LDA- (ZERO),Q_^1_%EOR- I_^1_%SAZ RMVFIS_'FOUND, REMOVE FIS_^1_%EIN 0_^1_%LDQ- (ZERO),Q_^1_%JMP* FNDFIS_'CONTINUE SEARCH_^1*_]_^1RMVFIS LDA- (I)_*REMOVE FIS_^1_%STA- (ZERO),Q_^1*_]_^1RELFIS RELEAS 0_*RELEASE CORE FIS_^1*_83 CARDS DELETED_574*1785_^1_%JMP CNXFIS_'CHECK IF AT END OF CORE FIS THREAD_^1_%EJT_]_^1*_*SAVE FILE SPACE LIST, IF CONDITIONS €€ARE MET_^1*_]_^1SAVFSL IIN 0_^1_%LDA* (AFSTLO)_$CHECK IF ANY FIS,S IN CORE_^1_%SAN RESCH_*YES_^1_%LDA* (ADRARQ)_$CHECK IF FILE MANAGER ACTIVE_^1_%SAN RESCH_*YES_^1_%LDA* (AFSLEN)_$CHECK IF FILE SPACE LIST HAS CHANGED_^1_%SAZ FSLCHG_)YES_^1RESCH JMP* RESCHK_'NO, RESCHEDULE RELEASE SPACE_*78*1922_^1*_]_^1FSLCHG SET A_,FILE SPACE LIST HAS CHANGED, WRITE ON MM IMAGE_^1_%STA* (ADR€€ARQ)_'SET FILE MANAGER ACTIVE TEMPORARILY_^1*_]_^1_%RTJ- (AMONI)_%WRITE FILE SPACE LIST TO MM IMAGE_^1_%ADC D+$400+$10*RSRPL+RSCPL_>68*1511_^1_%ADC CKWMME_^1_%ADC 0_^1_%ADC $8C2_^1_%ADC FSLLTH_^1_%ADC FSLIST_^1FSLMMA ADC 0_^1_%ADC 0_^1_%JMP- (ADISP)_^1*_]_^1CKWMME SQM SCHDFM_!*****MASS MEMORY ERROR, EXIT WITHOUT SAVING FSLIST_^1*_]_^1_%SET A_,RESET FILE SPACE LIST CHANGE €€FLAG_^1_%STA* (AFSLEN)_^1*_]_^1SCHDFM RTJ- (AMONI)_%REACTIVATE THE FILE MANAGER_^1_%ADC D+$1200+RSCPL_G68*1511_^1_%ADC FILREQ_^1_%SPC 2_Q74*1785_^1*_8CHECK IF RACSPC MUST BE RESCHEDULED 74*1785_^1*_]74*1785_^1RESCHK LDA+ TMRTYP_'CHECK IF SYSTEM HAS A TIMER_%**MSOS 4.1**_^1_%SAZ RSCHK_(NO_^1_%INA -6_^1_%SAN RESCHD_'YES_A74*1785_^1_%SPC 1_Q74*1785_^1*_8CHECK IF NECESSARY TO C€€YCLE THRU AGIN74*1785_^1RSCHK IIN 0_^1_%LDA* RSAFLG_L74*1785_^1_%INA -1_P74*1785_^1_%STA* RSAFLG_L74*1785_^1_%EIN 0_Q74*1785_^1_%SAZ EXIT_N74*1785_^1_%JMP RACSPC_'CYCLE THRU RACSPC AGAIN_-74*1785_^1_%EJT_]_^1*_*EXIT FROM RELEASE SPACE PROGRAM_^1*_]_^1*_81 CARD DELETED_674*1785_^1*_*RESCHEDULE RELEASE SPACE PROGRAM AND EXIT_^1RESCHD RTJ- (AMONI)_^1_%ADC $1000+TUNITS*$10+RSCPL€˜+D_<78*1925_^1_%ADC RACSPC_^1_%ADC TIMPER_^1EXIT_!JMP- (ADISP)_K74*1785_^1_%SPC 2_Q74*4785_^1RSAFLG NUM 0_,RACSPC ACTIVE FLAG_274*4785_^1_%END_]_^__˜PSRHFIS CSY/ F03 P€1_%NAM SRHFIS_'DECK-ID F03 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_8SEARCH FIS ON MM FOR FILE NO._^1*_8INPUT IS FILE NUMBER_^1*_]74*1786_^1*_*PROG CHECKS IF INPUT FILE NUMBER IS THE SAME_%74*1786_^1*_*AS THE FILE NUMBER OF THE LAST FIS RET€€RIEVED_%74*1786_^1*_*BY SRHFIS. IF SO, DIRECTLY READS IN FIS_*74*1786_^1*_*BLOCK WITHOUT HAVING TO SEARCH MASS MEMORY._'74*1786_^1*_]_^1*_8PROG CHECKS TO SEE IF FIS DIRECTORY IN CORE_^1*_8IF NOT,ALLOCATES SPACE AND READS IN_^1*_]_^1*_8GENERATE SCATTER CODE AND LOOK TO SEE IF_^1*_8INDEX DEFINED_^1*_]_^1*_8IF YES, READ FIS BLOCK INTO PROGRAM BUFFER_^1*_8AND SEARCH_!FOR FILE NO. CONT€€INE DOWN THREAD_^1*_8UNTIL FOUND. THEN ALLOCATE SPACE FOR CORE FIS_^1*_8THREAD INTO OTHER CORE FIS AND BUILD THIS_^1*_8CORE FIS_^1*_]_^1*_8RETURNS_^1*_8IF FOUND, A IS ZERO_^1*_8Q CONTAINS ADDRESS OF CORE FIS JUST BUILT_^1*_]_^1*_8IF NOT FOUND, A IS NON-ZERO AND CONTAINS_^1*_9SCATTER INDEX(9-15) AND FIS BLOCK INDEX(0-8)_^1*_9INTO FIS DIRECTORY._^1*_8Q CONTAINS FIS BLOCK POINTER IN F€€IS DIRECTORY_^1_%EJT_]_^1*_*ENTRY POINTS_^1_%ENT SRHFIS_'SEARCH FOR FIS ON MASS MEMORY (FIS BLOCKS)_^1_%ENT FILBLK_'FILE BLOCK FOR FIS BLOCKS AND FRB BLOCKS_^1_%ENT NWFBLK_'NUMBER OF WORDS IN FILE BLOCK_^1_%ENT FIBSIZ_'FIS BLOCK SIZE IN WORDS (N*96)_^1_%SPC 2_^1*_*EXTERNALS_^1_%EXT FISLU_(LOGICAL UNIT OF FIS DIRECTORY AND BLOCKS_^1_%EXT FIDSEC_'FIS DIRECTORY SECTOR ADDRESS_^€€1_%EXT LOKTBL_'FILE LOCK TABLE_^1_%EXT LOKNOE_'FILE LOCK TABLE NUMBER OF ENTRIES_^1_%EXT LOKNEU_'FILE LOCK TABLE NO. OF ENTRIES USED_^1*_]_^1_%EXT FSTLOC_'FIS CORE BLOCK THREAD POINTER_^1_%EXT FIDLOC_'CORE LOC OF FIS DIRECTORY_^1_%EXT FDTINT_'TIME OUT PERIOD FOR CORE BLOCK DATA_^1_%EXT NWFISD_'NUMBER OF WORDS IN FIS DIRECTORY_^1_%EXT NWFISB_'NUMBER OF WORDS IN FIS BLOCK_^1*€€_]_^1_%EXT FMRERR_'FILE MANAGER REQUEST ERROR ENTRY_^1_%EXT GETSPC_'SPACE REQUEST SUB_^1_%EXT MMREAD_'MASS STORAGE READ SUB_^1_%EJT_]_^1*_*EQUIVALENCES_^1*_1COMMUNICATION REGION CONSTANTS_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU ONEBIT($23)_!ONE BIT TABLE_^1_%EQU DISP($EA)_#DISPATCHER ADDRESS_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER€€ SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT €€INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU €€ IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECT€€OR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS €€(BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1*_1FIS BLOCK SIZE IN WORDS_^1_%EQU FIBSIZ(3*WRDSEC)_^1_%EQU NWFBLK(FIBSIZ)_^1_%EJT_]_^1*_*SEARCH FOR FIS ON MASS MEMORY (FIS BLOCKS)_^1*_]_^1SRHFIS 000 000_^1_%STQ FN_+FILE NO._<74*1786_^1_%TRQ A_Q74*1786_^1_%SUB PREFN_(CHECK IF SAME AS LAST RETRIEVED_$74*1786_^1_%SAN SF05_)NO_B74*1786_^1_%JMP SETUP_(YE€€S, GO SETUP TO READ FIS, S FIB_#74*1786_^1*_]74*1786_^1SF05_!LDA (AFDSEC)_$SETUP FIS DIRECTORY SECTOR_*74*1786_^1_%STA* FDSC_N74*1786_^1_%LDA (ANWFIB)_$SETUP NUMBER OF WORDS IN FIS BLOCK_!74*1786_^1_%STA* NWFB_^1*_]_^1_%IIN 0_,CHECK IF FIS DIRECTORY IN CORE_^1_%LDQ (AFIDLO)_^1_%SQZ SF10_^1_%JMP* SF120_*YES, RESET CLOCK_^1*_]_^1SF10_!LDA (ANWFID)_^1_%STA* NWFD_)SETUP NUMBER OF€€ WORDS IN FIS DIRECTORY_^1*_]_^1_%RTJ (AGETSP)_$GET SPACE FOR FIS DIRECTORY_^1_%STQ* FIDL_^1_%STQ* MMERR1+2_'(SET FOR RELEASE IF MASS MEMORY ERROR)_^1*_]_^1_%RTJ (AMMRED)_$READ IN FIS DIRECTORY_^1FIDL_!ADC 0_^1NWFD_!NUM 0_^1_%ADC FISLU_^1_%NUM 0_^1FDSC_!NUM 0_^1_%SQP SF110_^1_%SPC 2_^1MMERR1 RELEAS 0_$*****MASS MEMORY ERROR(RELEASE FIS DIRECTORY SPACE)_^1*_]_^1MMERR2 LDA- €€ONEBIT+7_$SET BIT 7 AND RETURN TO CALLER_^1_%JMP FMRERR_^1*_]_^1SF110 IIN 0_,SET FIDLOC TO INDICATE FIS DIRECTORY IN CORE_^1_%LDQ* FIDL_^1_%STQ* (AFIDLO)_^1*_]_^1SF120 LDA* (AFDTIN)_$SET (OR RESET) FILE DIRECTORY CLOCK_^1_%EIN 0_^1_%STA- 1,Q_^1_%EJT_]_^1_%ENA -2_+GENERATE SCATTER CODE_^1_%ADD* (ANWFID)_^1_%ARS 1_^1_%STA* TEMP_)SCATTER INDEX = 2*REM((FN-1)/((NWFISD-2)/2))+2_^€€1_%CLR Q_^1_%LDA* FN_^1_%INA -1_^1_%DVI* TEMP_^1_%QLS 1_^1_%INQ 2_^1_%STQ* INDEX_(SAVE SCATTER INDEX_^1_%ADQ* (AFIDLO)_^1_%LDA- 1,Q_*GET INDEX AND SAVE IT_^1_%STA* TEMP_^1_%LDA* INDEX_(SET SCATTER INDEX(9-15) AND FIB INDEX(0-8)_^1_%ALS 9_^1_%EOR* TEMP_^1_%STA* INDEX_^1_%LDA- (ZERO),Q_$GET FIS BLOCK SECTOR POINTER_^1_%STA* POINTR_'SAVE IT_^1_%SAN RDAGN_^1_%JMP* NOFILE_'NO FIS €€FOR THIS SCATTER CODE_^1*_]_^1RDAGN STA* FIB_*STORE FIS BLOCK SECTOR POINTER_^1_%RTJ* (AMMRED)_$READ IN FIS BLOCK_^1_%ADC FIBLOC_^1NWFB_!NUM 0_^1_%ADC FISLU_^1_%NUM 0_^1FIB_"ADC 0_^1_%SQP SF310_^1_%JMP* MMERR2_!*****MASS MEMORY ERROR_^1*_]_^1SF310 LDQ* TEMP_)BLOCK IN CORE_^1_%LDA* FIBLOC+FILENO-FH,Q_^1_%SUB* FN_+CHECK IF FILE NUMBER MATCHES_^1_%SAZ SF400_*YES, FIS FOUND_^1€€*_]_^1_%LDA* FIBLOC+IXNFIS-FH,Q_^1_%AND- ONEMSK+8_$GET INDEX WITHIN FIS BLOCK_^1_%STA* TEMP_)CHECK IF NO NEXT POINTER TO MORE FIS,S_^1_%LDA* FIBLOC+SANFIS-FH,Q_^1_%SAN SF330_^1_%JMP* NOFILE_'NO NEXT FIS, FILE NOT FOUND_^1*_]_^1SF330 SUB* FIB_*NEXT FIS IN SAME FIS BLOCK_^1_%SAN SF340_^1_%JMP* SF310_(YES, CHECK IT_^1*_]_^1SF340 ADD* FIB_*SAVE NEW SECTOR OF FIS AND GET IT_^1_%JMP*€€ RDAGN_^1_%EJT_]_^1*_]_^1SF400 LDA- I_,FOUND FIS, SAVE I REGISTER_^1_%STA* ISAVE_^1_%STQ- I_,I = ADDRESS OF FIS IN CORE FIS BLOCK_^1_%STQ* PREADR_'SAVE ALSO IN PREADR_174*1786_^1_%ENA FH+FISSIZ_^1_%RTJ* (AGETSP)_$GET SPACE FOR CORE FIS_^1*_]_^1_%LDA* FIB_*SET SECTOR AND INDEX IN CORE FIS_^1_%STA- SECFIS,Q_^1_%LDA- I_^1_%ALS 7_^1_%STA- IDXCHG,Q_^1_%CLR A_,CLEAR KIS DIRECT. ADR A€€ND LOKADR_^1_%STA- ADRKID,Q_^1_%STA- LOKADR,Q_^1_%LDA* (AFDTIN)_$SET FILE CLOCK_^1_%STA- FILCLK,Q_^1*_]_^1_%STQ* POINTR_'SAVE CORE FIS POINTER_^1_%INQ FH_^1_%STQ* TEMP_^1_%ENQ FISSIZ_^1SF410 INQ -1_^1_%LDA* FIBLOC,B_$MOVE MM BLOCK TO CORE FIS BLOCK_^1_%STA* (TEMP),Q_^1_%SQZ SF420_^1_%JMP* SF410_^1*_]_^1SF420 LDQ* POINTR_'THREAD FIS ONTO CORE FIS THREAD_^1_%IIN 0_^1_%LDA* (AF€€STLO)_^1_%STA- (ZERO),Q_^1_%EIN 0_^1_%STQ* (AFSTLO)_^1_%STQ* FISADR_'SAVE FIS ADDRESS FOR RESTORE_^1*_]_^1*_8CHECK IF FILE LOCK TABLE HAS ENTRY_^1*_9FOR THIS FILE_^1_%LDA LOKNEU_'ANY ENTRIES IN USE_^1_%SAN SF430_(SKIP TO SEARH FOR CURRENT FILE NUMBER_^1_%JMP* SF460_^1*_]_^1SF430 LDQ =XLOKNOE_^1_%QLS 1_^1SF440 INQ -2_^1_%SQM SF460_(SKIP IF TABLE SEARCH FAILED_^1_%LDA* (ADRL€€OK),Q_"CHECK IF FILE NUMBERS IDENTICAL_^1_%SUB* FN_^1_%SAZ SF450_(SKIP IF YES_^1_%JMP* SF440_^1*_]_^1SF450 ADQ* ADRLOK_'COMPUTE ABSOLUTE ADDRESS OF ENTRY_^1_%TRQ A_^1_%LDQ* FISADR_^1_%STA- LOKADR,Q_$STORE ADDRESS IN FIS HEADER_^1*_]_^1SF460 LDQ* FISADR_'RESTORE Q REGISTER TO FIS ADDRESS_^1_%LDA* ISAVE_(RESTORE I REGISTER_^1_%STA- I_^1_%LDA* FN_+SAVE THIS FILE NUMBER_/74*1786_^1€€_%STA* PREFN_M74*1786_^1_%LDA* FIB_*SAVE THIS FIB ADDRESS_/74*1786_^1_%STA* PREFIB_L74*1786_^1_%CLR A_,FILE FOUND (EXIT WITH A=0, Q=CORE FIS ADR)_^1_%JMP* NOFILE+2_^1_%SPC 2_^1NOFILE LDA* INDEX_(A = SCATTER(9-15) AND FIB(0-8) INDEXES IN FISD_^1_%LDQ* POINTR_'Q = FIS BLOCK SECTOR POINTER IN FIS DIRECTORY_^1_%JMP (SRHFIS)_J74*1786_^1_%EJT_]_^1*_]_^1FN_#NUM 0_0FILE NO._^1TEMP_!NUM€€ 0_^1ISAVE NUM 0_^1INDEX NUM 0_^1POINTR NUM 0_^1*_]_^1AFSTLO ADC FSTLOC_^1AFIDLO ADC FIDLOC_^1AFDTIN ADC FDTINT_^1AFDSEC ADC FIDSEC_^1ANWFID ADC NWFISD_^1ANWFIB ADC NWFISB_^1AGETSP ADC GETSPC_^1AMMRED ADC MMREAD_^1ADRLOK ADC LOKTBL_^1FISADR NUM 0_,SAVED FIS ADDRESS_^1PREFIB NUM 0_Q74*1786_^1PREFN NUM 0_Q74*1786_^1PREADR NUM 0_Q74*1786_^1_%SPC 2_Q74*1786_^1*_*CU€€RRENT FILE NUMBER IS SAME AS PREVIOUS._*74*1786_^1*_*SETUP TO DIRECTLY READ IN FIB._474*1786_^1SETUP LDA* PREADR_'RESET ADRESS OF FIS IN CORE FIS BLOCK74*1786_^1_%STA* TEMP_N74*1786_^1_%LDA* PREFIB_'SET A TO FIB MM ADDRESS_-74*1786_^1_%JMP RDAGN_(GO READ FIB CONTAINING FIS_*74*1786_^1_%SPC 2_Q74*1786_^1*_]_^1FILBLK EQU FILBLK(*)_#FILE BLOCK_^1FIDLOC BZS FIBLOC(FIBSIZ) FIS BLO€CK BUFFER_^1*_]_^1_%END_]_^__ PDPSUDO CSY/ F04 P€1_%NAM DPSUDO_'DECK-ID F04 FILE MANAGER_)SUMMARY-110_^1*_$BACKGROUND FILE MANAGER PSEUDO MAG TAPE DRIVER_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_]_^1*PSTPD1 ADC $5200+LPSDO_!00 SCHEDULER CALL_^1*_%ADC IPSUDO_%01_!INITIATOR ADDRESS_^1*_$NUM 0_,02 INTERNAL TEMP STORAGE MOT€€ION CODE_^1*_$NUM 0_,03 INTERNAL TEMP STORAGE ITERATION_^1*_$NUM 0_,04 INTERNAL TEMP STORAGE WRITCK,RTVBLK_^1*_%NUM 0_,05 LOGICAL UNIT_^1*_%NUM 0_,06 PARAMETER LIST ADDRESS_^1*PWES1 NUM 0_,07 EQUIPMENT CODE - NONE_^1*_%NUM $A46_)08 REQUEST STATUS_^1*_%NUM 0_,09 DRIVER STATUS_^1*_%NUM 0_,10 CURRENT LOCATION_^1*_%NUM 0_,11 LAST LOCATION PLUS ONE_^1*_%NUM 1_,12 DE€€VICE STATUS_^1*_%ADC LPSUDO_'13 DRIVER LENGTH IF MASS MEMORY_^1*_%ADC SPSUDO_'14 NAME ASSOCIATED WITH SECTOR NUMBER_^1*_%NUM 0_,15 RETURN AND TEMP STORAGE_^1*_%NUM 0_,16 FILE NUMBER_^1*_%NUM 0_,17 TEMP FOR MOTION REQ PROCESSOR_^1*_%NUM 0_,18 TEMP FOR MOTION REQ PROCESSOR_^1*_%BZS (12)_)19 REQUEST BUFFER - REQBUF_^1*_%NUM 0_,31 BLOCK POINTER - BLKPTR_^1*_%BZS (30)_)€€32 POINTER BLOCK - PTRBLK_^1*PSDRQ1 NUM 0_,62 *_^1*_%NUM $5400_(63 *_^1*_%NUM 0_,64 * AREA TO BE STUFFED WITH_^1*_%ADC PWES1_(65 * FILE MANAGER AND DISK REQUESTS_^1*_%BZS (6)_*66 *_^1*_%NUM $1400_(72 *_^1*_%RTJ* (PSDRQ1)_$73 *_^1*_%ADC 0_,74 INPUT BUFFER ADDRESS_^1*_%ADC PSTPD2_'75 PHYSTB THREAD_^1_%SPC 2_^1*_$*_%*_%*_%*_%*_%*_%*_%*_^1*_$THIS DRIVER SIMULATES MAGN€€ETIC TAPE IN ORDER TO AMKE_"*_^1*_$FILES WHICH ARE SET UP THROUGH THE JOB PROCESSOR_'*_^1*_$AVAILABLE FOR STORING COSY SOURCE, RELOCATABLE BINARY_!*_^1*_$PROGRAMS, INSTALLATION TAPE IMAGES, ETC._/*_^1*_]*_^1*_$USE OF THIS DRIVER DEPENDS ON THE PRESENCE OF THE 1700 *_^1*_$FILE MANAGER._J*_^1*_$*_%*_%*_%*_%*_%*_%*_%*_^1_%SPC 3_^1_%EQU BUFLNG(192)_!LENGTH OF INTERMEDIATE BUFFER_^1_€€%SPC 2_^1_%ENT IPSUDO_I**MSOS 4.1**_^1_%SPC 2_^1*_$EQUATES FOR ADDRESSING THE PHYSICAL DEVICE TABLE_'*_^1_%SPC 1_^1_%EQU EDCN(2)_%DRIVER CONTINUATOR ADDR_^1_%EQU REQIND(EDCN) NO CONTINUATOR, USE FOR ERROR IND._^1_%EQU EDPGM(3)_$DRIVER TIMEOUT ERROR ROUTINE_^1_%EQU ELU(5)_'LOGICAL UNIT ASSIGNED TO DEVICE_^1_%EQU EPTR(6)_%CALL PARAMETER LIST LOC._^1_%EQU EWES(7)_%SAVE LAST€€ FILE NUM_^1_%EQU EREQST(8)_#REQUEST STATUS_^1_%EQU ESTAT1(9)_#STATUS WORD 1_^1_%EQU ECCOR(10)_#LOCATION OF BUFFER TO OUTPUT_^1_%EQU ELSTWD(11)_"RECORD LENGTH_^1_%EQU ESTAT2(12)_"HARDWARE STATUS_^1_%EQU RETURN(15)_"RETURN ADDR. FROM NFNR, MAKQ, NCMPRQ_^1_%EQU FILNUM(16)_"FILE NUMBER--FILLED BY ** PROC._^1_%EQU RECPTR(17)_"POINTER TO RECORD BEING STORED_^1_%EQU REQBUF(19)_"€€REQUEST PROCESSING BUFFER_^1_%EQU BLKPTR(31)_"INDEX TO RECORD POINTER BLOCK_^1_%EQU PTRBLK(32)_"RECORD POINTER BLOCK_^1_%EQU REQUST(63)_"REQUEST TO FILE MANAGER_^1_%EQU BUFADR(74)_"ADDRESS OF INTERMED. BUFFER_^1_%EQU LINK(75)_$LINK PHYSTABS TOGETHER_^1_%SPC 3_^1*_$EQUATES FOR LOCORE MASKS_?*_^1_%SPC 1_^1_%EQU LPMSK(2)_^1_%EQU NZERO($12)_^1_%EQU ONEBIT($23)_^1_%EQU ZROBIT€€($33)_^1_%EQU ZERO($22)_^1_%SPC 3_^1*_$EQUATES FOR PROCESSOR CELLS_<*_^1_%EQU FNR($B5)_$FIND NEXT REQUEST ROUTINE_^1_%EQU COMPRQ($B6)_!COMPLETE REQUEST ROUTINE_^1_%EQU DISP($EA)_#DISPATCHER_^1_%EQU MONI($F4)_^1_%EQU LEVEL($EF)_^1_%SPC 3_^1*_$EXTERNALS_N*_^1_%SPC 1_^1_%EXT DEFFIL_^1_%EXT MAKEQ_^1_%EXT ALTDEV_^1_%EXT JLLUV4_^1_%EXT MAS300_^1_%EXT LOG_*ERROR LOGGING ENT€€RY_.**MSOS 4.1**_^1_%EJT_]_^1*_$ENTRY FOR MASS MEMORY RESIDENT DRIVER_(*_^1_%SPC 3_^1START STQ- I_N**MSOS 4.1**_^1_%LDQ =XIPSUDO-START_A**MSOS 4.1**_^1_%AAQ Q_N**MSOS 4.1**_^1_%STQ- 1,I_*FILL IN INITIATOR ADDRESS_(**MSOS 4.1**_^1_%JMP* IPSUDO+1_G**MSOS 4.1**_^1IPSUDO STQ- I_,INITIATOR_8**MSOS 4.1**_^1_%RTJ* HERE_)COMPUTE LOCATION_1**MSOS 4.1**_^1HERE_!NUM 0_N**MSOS 4.1**_^1_%L€€DA* HERE_)MAY BE CORE RESIDENT_-**MSOS 4.1**_^1_%ADD =XPTBFV4-HERE *ADDRESS OF I/O BUFFER TO PDT_#**MSOS 4.1**_^1_%STA- BUFADR,I_$ADDRESS OF I/O BUFFER TO PHYSTAB **MSOS 4.1**_^1_%JMP PSDTV4_'CONTROL GIVEN TO FWA BY_***MSOS 4.1**_^1*_8MASS MEMORY EXECUTIVE_,**MSOS 4.1**_^1_%EJT_]_^1*_$*_%*_%*_%*_%*_%*_%*_^1*_$THIS SECTION SIMULATES MOTION REQUESTS._(*_^1*_$ALL MOTION FUNCTIONS A€€RE THE SAME AS FOR MAG_"*_^1*_$TAPE EXCEPT UNLOAD WHICH ACTS LIKE A REWIND_#*_^1*_$FUNCTION._F*_^1*_$*_%*_%*_%*_%*_%*_%*_^1MOT100 LDA- NZERO+10_^1_%EOR- LPMSK+7_^1_%AND- ESTAT1,I_$CLEAR BITS INDICATING REWIND OR_^1_%STA- ESTAT1,I_$BACKSPACE FILE OR RECORD_^1_%LDA* MCOD_)MOTION CODE_^1_%CLR Q_^1_%LLS 4_^1_%JMP* MOT110_^1MOTION LDQ- EPTR,I_^1_%LDQ- 4,Q_*PICK UP MOTION CODES WORD_^1€€_%CLR A_^1_%STA* MCOD_)MOTION CODE_^1_%LRS 12_+MOTION CODE IN Q_^1_%SQM 2_,IS IT REPEATED MOTION_^1MOT110 STA* MCOD_)NO, STORE REMAINING CODE_^1_%ENA $10_*SET NUMBER OF TIMES TO ONE_^1_%ARS 4_^1_%SQP 1_^1_%INQ $7_+MASK OFF MOTION CODE_^1_%AND- LPMSK+12_$AND NUMBER OF TIMES_^1_%JMP* REQTBL,Q_$BRANCH TO APPRIPRIATE PROCESSOR_^1CMPLET CLR A_^1_%STA- ECCOR,I_^1_%STA- ELSTWD,I_^€€1_%JMP NCOMP_^1REQTBL JMP* CMPLET_'MOTION CODE IS ZERO, REQUEST COMPLETE_^1_%JMP* BSPR_)BACKSPACE RECORD(S)_^1_%JMP* WEF_*WRITE END OF FILE(S)_^1_%JMP* REW_*REWIND TAPE (NO. TIMES IGNORED)_^1_%JMP* UNL_*UNLOAD TAPE (NO. TIMES IGNORED)_^1_%JMP* ADVF_)ADVANCE FILE(S)_^1_%JMP* BSVF_)BACKSPACE OVER FILE(S)_^1_%JMP* ADVR_)ADVANCE RECORD(S)_^1ADVF_!JMP ADF_^1ADVR_!JMP ADR_^1BSVF_!JMP*€€ BSF_^1MCOD_!NUM 0_,SAVED MOTION CODE_^1_%EJT_]_^1*_$UNLOAD AND REWIND SIMULATION_;*_^1_%SPC 3_^1UNL_"CLR Q_,NO MORE MOTION CODES IN THIS_^1_%STQ* MCOD_)REQUEST WILL BE PROCESSED_^1REW_"LDA- ESTAT1,I_$SET BIT TO INDICATE_^1_%EOR- ONEBIT+7_$REWIND OR UNLOAD_^1_%STA- ESTAT1,I_^1_%LDA- ESTAT2,I_$IF TAPE IS ALREADY AT LOAD POINT_^1_%AND- ONEBIT+10_^1_%SAZ 1_^1_%JMP* REW200_'DO NOT €€ATTEMPT REWIND--SET STATUS,EXIT_^1REW50 RTJ OPPRBK_'PUT OUT LAST PTRBLK_^1REW200 LDA- ESTAT2,I_$IF MOTION WAS UNLOAD BUSY HAS_^1_%AND- ONEBIT+15_#MASK WRITE RING_^1_%ADD =N$401_'SET LOAD POINT, READY_^1_%STA- ESTAT2,I_^1_%LDA- ESTAT1,I_$WAS THIS REWIND REQ._^1_%AND- ONEBIT+7_^1_%SAN 2_,YES_^1_%JMP NOWRT_(NO, MUST BE A NEW FILE_^1WEF100 JMP* MOT100_'GO GET NEXT MOTION CODE_^1_%€€EJT_]_^1*_$WRITE END OF FILE_F*_^1_%SPC 3_^1WEF_"STA- 3,I_*SAVE ITERATION_^1_%RTJ WRITCK_'CHECK CONDITIONS FOR WRITE_^1WEF20 LDQ- BLKPTR,I_$BUMP POINTER TO PTRBLK_^1_%INQ 2_^1_%STQ- BLKPTR,I_^1_%SET A_,MINUS ZERO AS RECORD DISK ADDR._^1_%STA- PTRBLK,B_$INDICATES END OF FILE_^1_%STA- PTRBLK+1,B_^1_%LDA- 3,I_*GET ITERATION COUNT_^1_%INA -1_^1_%SAZ 1_,YES_^1_%JMP* WEF_*CONTINUE€€ WRITING EOF_^1_%JMP* BSP160_'GO SET STATUS BITS FOR EOF_^1_%EJT_]_^1*_$BACKSPACE RECORD_G*_^1_%SPC 3_^1BSPR_!TRA Q_,Q TEMPY_^1_%LDA- ESTAT1,I_$SET BIT TO INDICATE_^1_%EOR- ONEBIT+8_$BACKSPACE RECORD_^1_%STA- ESTAT1,I_^1BACKER STQ- 3,I_*SAVE ITERATION COUNT_^1_%LDA- ESTAT2,I_^1_%AND- ONEBIT+10_#MASK LOAD POINT_^1_%SAZ 1_^1_%JMP* MOT100_'AT LOAD POINT_^1_%LDQ- BLKPTR,I_$GET CURRE€€NT INDEX_^1_%SQN BACKUP_'MORE THIS BLOCK_^1_%RTJ* RTVBLK_'RETRIEVE PREVIOUS BLOCK_^1_%SAN MORE_)THERE WAS A PREVIOUS BLOCK_^1_%JMP* REW200_'AT LOAD POINT, GO SET STATUS_^1MORE_!ENQ 26_^1BACKUP INQ -2_+BACK UP INDEX_^1_%STQ- BLKPTR,I_$SAVE IT_^1_%LDQ- PTRBLK+2,B_"GET POINTER OF RECORD JUST BKSP OVER_^1_%LDA- ESTAT1,I_^1_%AND- ONEBIT+8_$MASK BACKSPACE RECORD_^1_%SAN 1_,RECORDS B€€ACK_^1_%TCQ Q_,FILES BACK, SO COMP FOR TEST_^1_%SQP YUP_*RECORD-NOT-FILE,OR FILES-AND-FILE--BUMP COUNT_^1_%SAN 1_,RECORD IS FILE_^1_%JMP* BACKER+1_$RECORD NOT FILE_^1BSP160 JMP* ADF125_'YES, GO SET EOF STATUS_^1YUP_"LDQ- 3,I_*NOT EOF, GET ITERATION COUNT_^1_%INQ -1_^1_%SQZ 1_,DONE_^1_%JMP* BACKER_'MORE, CONTINUE BACKSPACE_^1_%SAN 1_,RECORDS_^1_%JMP* ADF125_'FILES, SET EOF STA€€TUS_^1_%LDA- ESTAT2,I_^1_%AND* ADF130_'MASK NON-PERMANENT BITS OFF STATUS_^1_%INA $12_*SET EOP STATUS AND BUSY_^1_%STA- ESTAT2,I_^1BSP200 JMP* MOT100_'DO NEXT MOTION_^1_%SPC 5_^1*_$SUBROUTINE TO READ NEXT (FORWARD/BACKWARD) POINTER BLOCK_^1_%SPC 3_^1RTVBLK NOP 0_^1_%LDQ* RTVBLK_^1_%STQ- 4,I_*SAVE RETURN, 4 BECAUSE OPPRBK CALLED_^1_%LDQ- BLKPTR,I_$GET CURRENT INDEX_^1_%LDA- ESTA€€T2,I_$DEVICE STATUS_^1_%AND- ONEBIT+14_#MASK READ/WRITE BIT_^1_%SAN 1_,WRITING_^1_%JMP* READNG_'READING_^1_%LDA- PTRBLK,B_$GET SECTOR_^1_%STA* SECSAV_'SAVE IT_^1_%LDA- PTRBLK+1,B_"WORD RELATIVE TO SECTOR_^1_%STA* WRDSAV_'SAVE IT_^1_%STQ* PTRSAV_'SAVE POINTER_^1_%RTJ OPPRBK_'OUT PTRBLK, SWICHING MODES TO READ_^1_%LDA- ZROBIT+14_^1_%AND- ESTAT2,I_$STATUS TO READ MODE_^1_%STA- ESTAT€€2,I_$NEW STATUS_^1_%LDQ =N0_*RESTORE INDEX_^1PTRSAV EQU PTRSAV(*-1)_^1_%LDA =N0_*RESTORE_^1WRDSAV EQU WRDSAV(*-1)_^1_%STA- PTRBLK+1,B_"WORD_^1_%LDA =N0_^1SECSAV EQU SECSAV(*-1)_^1_%STA- PTRBLK,B_$SECTOR_^1READNG LDA- PTRBLK+1,B_"GET WORD_^1_%STA- RECPTR+1,I_"*********** WHEN READING_^1_%LDA- PTRBLK,B_$GET SEC_!* RECPTR CONTAIN CURRENT PTRBLK_^1_%STA- RECPTR,I_$*********** ADD€€RESS MASS MEMORY_^1_%SAN 1_^1_%JMP* RTVEXT_^1_%LDQ- I_^1_%INQ BLKPTR_'CALCULATE LOCATION CONTAINING_^1_%STQ- REQUST+6,I_^1_%INQ RECPTR-BLKPTR ADDRESS OF MASS MEMORY ADDRESS_^1_%LDA RCRD_)READ REQUEST CODE_^1_%RTJ SETREQ_'SET UP REQUEST_^1_%RTJ- REQUST-1,I_^1RTV50 NOP 0_,EXECUTE REQUEST_^1_%LDA* RTV50_(FIND PHYSTB LOCATION_^1_%INA -BUFADR_^1_%STA- I_^1_%SQP RTVEXT_'NO ERROR€€ ON READ_^1_%JMP ALARM_(ERROR, REPORT IT_^1RTVEXT EQU RTVEXT(*)_^1_%LDQ- 4,I_^1_%JMP- (ZERO),Q_^1_%EJT_]_^1*_$BACKSPACE OVER FILE MARKS_>*_^1_%SPC 3_^1BSF_"TRA Q_,ITERATION TO Q_^1_%LDA- ESTAT1,I_$SET BIT TO INDICATE_^1_%EOR- ONEBIT+9_$BACKSPACE FILE_^1_%STA- ESTAT1,I_^1_%JMP* BACKER_'GO USE BSPR TO LOOK FOR FILES BACK_^1_%EJT_]_^1*_$ADVANCE FORWARD OVER FILE MARKS_8*_^1_%SPC €€3_^1ADF_"STA- ELSTWD,I_$SAVE NO. OF REPETITIONS_^1_%LDQ- BLKPTR,I_^1_%LDA- ESTAT2,I_^1_%AND- ONEBIT+10_#IS TAPE AT LOAD POINT_^1_%SAZ ADF30_^1_%RTJ* RTVBL1_'YES, BRING IN FIRST PTRBLK_^1_%TRQ A_,REQIND TO A_^1_%CLR Q_^1_%SAP ADF30_^1_%JMP* ADF150_'END OF TAPE_^1ADF20 STA- ELSTWD,I_$SAVE NO. OF REPETITIONS_^1ADF30 INQ -26_*AT END OF PTRBLK_^1_%SQP 1_^1_%JMP* ADF100_'NO, CHEC€€K NEXT POINTER_^1_%INQ 28_+YES, READ IN NEXT PTRBLK_^1_%STQ- BLKPTR,I_^1_%RTJ* RTVBLK_^1_%SAN 1_^1_%JMP* ADF150_'YES, END OF TAPE_^1_%ENQ -26_*NO, CONTINUE SCAN FOR EOF_^1ADF100 INQ 28_^1_%LDA- PTRBLK,B_^1_%SAZ ADF150_'END OF TAPE_^1_%SAM ADF120_'NEGATIVE RECORD PTR IMPLIES EOF_^1_%JMP* ADF30_(NOT EOF, CHECK NEXT POINTER_^1ADF120 LDA- ELSTWD,I_$EOF, HAVE WE SKIPPED ENOUGH_^1_€€%INA -1_+FILES_^1_%SAZ 1_^1_%JMP* ADF20_(NO, CONTINUE SCAN FOR FILES_^1_%STQ- BLKPTR,I_$PUT PTR TO NEXT REC. AFTER EOF_^1ADF125 LDA- ESTAT2,I_$YES, MASK NON-PERMANENT STATUS_^1_%AND =N$C401_%MASK PERM STATUS_^1ADF130 EQU ADF130(*-1)_^1_%EOR- ONEBIT+11_#SET EOF,_^1ADF140 INA $32_*ALARM, EOF STATUS_^1_%STA- ESTAT2,I_^1ADF145 JMP* BSP200_'GO PROCESS NEXT MOTION CODE_^1ADF150 LDA-€€ ESTAT2,I_^1_%AND =N$C001_%MASK WRITE RING,MODE, READY_^1_%EOR- ONEBIT+9_^1_%JMP* ADF140_'GO SET ALARM+EOP_^1_%EJT_]_^1*_$ADVANCE FORWARD A GIVEN NUMBER OF RECORDS_.*_^1_%SPC 3_^1ADR_"STA- 3,I_*SAVE ITERATIONS_^1_%LDA- ESTAT2,I_$IS TAPE AT LOAD POINT_^1_%AND- ONEBIT+10_#NO, CONTINUE_^1_%SAZ ADR05_(NOT LOAD POINT_^1_%RTJ* RTVBL1_'YES, MUST GET 1ST PTRBLK_^1_%SQP ADR05_(NO F.M. E€€RROR_^1_%JMP* ADR150_'NO FILE DEFINED, END OF TAPE_^1ADR05 EQU ADR05(*)_^1_%LDQ- BLKPTR,I_$GET CURRENT INDEX_^1ADR10 INQ -26_^1_%SQM ADR60_(STILL IN THIS BLOCK_^1_%INQ 28_^1_%STQ- BLKPTR,I_$SAVE IT_^1_%RTJ RTVBLK_'GET NEXT BLOCK_^1_%ENQ 0_^1_%STQ- BLKPTR,I_$INITIALIZE_^1_%SAZ ADR150_'END OF TAPE, NO NEXT BLOCK_^1_%JMP* ADR10_^1ADR60 INQ 28_^1_%LDA- PTRBLK,B_$GET SECTOR_^€€1_%SAZ ADR150_'NO DATA, END OF TAPE_^1_%STQ- BLKPTR,I_$DATA HERE, UPDATE INDEX_^1_%SAP ADR100_'NOT END OF FILE_^1_%JMP* ADF125_'END OF FILE_^1ADR100 LDA- 3,I_*GET COUNT_^1_%INA -1_+DECREMENT_^1_%STA- 3,I_*SAVE IT_^1_%SAZ ADRDON_^1_%JMP* ADR10_(MORE_^1ADR150 JMP* ADF150_'SET END OF TAPE_^1ADRDON JMP* ADF145_'DO NEXT NOTION_^1_%EJT_]_^1*_$SUBROUTINE TO RETRIEVE FIRST POINTER BLOC€€K_-*_^1_%SPC 3_^1RTVBL1 NOP 0_,THE FIRST POINTER BLOCK MUST BE OBTAINED_^1_%LDA* RTVBL1_'SAVE RETURN_^1_%STA- RETURN,I_^1_%LDA- ESTAT2,I_^1_%AND- ZROBIT+14_#READ MODE_^1_%STA- ESTAT2,I_^1_%LDA* AFLMGR_'CALCULATE ENTRY FOR_^1_%INA $20_*RTVSEQ IN FILE MANAGER_^1_%STA- REQUST+1,I_^1_%LDA* RTJ_^1_%STA- REQUST,I_$STUFF RTJ INSTRUCTION_^1_%LDA* NOP_^1_%STA- REQUST+9,I_^1_%CLR A_^1_%S€€TA- RECPTR,I_$REC POINTER = 0_^1_%STA- RECPTR+1,I_^1*_81 CARD DELETED_^1_%INA $1F_*STUFF LENGTH_^1_%STA- BLKPTR,I_^1_%INA $22-$1F_^1_%STA- REQUST+3,I_"FILE COMBINATION = 0_^1_%LDA- I_^1_%INA EWES_^1_%STA- REQUST+2,I_"FILE NUMBER_^1_%INA REQIND-EWES_^1_%STA- REQUST+8,I_"REQUST INDICATOR_^1_%INA RECPTR-REQIND_^1_%STA- REQUST+4,I_"RECORD POINTER_^1_%INA BLKPTR-RECPTR_^1_%STA- RE€€QUST+5,I_"BUFFER ADDR._^1_%STA- REQUST+6,I_"ALSO LENGTH_^1_%INA REQBUF-PTRBLK+1_^1_%STA- REQUST+7,I_"ADDR OF REQUST BUFFER_^1_%LDA- ONEBIT+15_#PART1 FLAG TO FILE MANAGER_^1_%RTJ- REQUST-1,I_^1_%NOP 0_^1_%CLR A_^1_%STA- BLKPTR,I_^1_%LDQ- REQIND,I_^1_%SQM STLLP_(STILL LOAD POINT_^1_%LDA- ESTAT2,I_^1_%AND- ZROBIT+10_#RESET LOAD POINT_^1_%STA- ESTAT2,I_^1STLLP EQU STLLP(*)_^1_%LD€€A- RETURN,I_^1_%STA* RTVBL1_'RESTORE RETURN_^1_%JMP* (RTVBL1)_^1_%EJT_]_^1AFLMGR ADC DEFFIL_^1RTJ_"NUM $5400_^1DATBUF NUM 0_^1DISBUF NUM 0_^1_%SPC 5_^1*_$SET UP A SEQUETIAL STORE REQUEST IN THE PHYSICAL DEVICE *_^1*_$TABLE OF THIS LOGICAL UNIT_=*_^1_%SPC 3_^1SQSTR NOP 0_^1_%LDQ* SQSTR_^1_%LDA* AFLMGR_'CALCULATE ENTRY FOR_^1_%INA $14_*STOSEQ IN FILE MANAGER_^1_%STA- REQUST+€€1,I_^1_%LDA* RTJ_^1_%STA- REQUST,I_$STUFF RETURN JUMP_^1_%LDA* NOP_^1_%STA- REQUST+8,I_^1_%STA- REQUST+9,I_^1_%LDA- I_^1_%INA EWES_^1_%STA- REQUST+2,I_"AND FILE NUMBER LOCATION_^1_%INA REQBUF-EWES_^1_%STA- REQUST+6,I_^1_%INA REQIND-REQBUF_^1_%STA- REQUST+7,I_^1_%JMP- (ZERO),Q_^1_%EJT_]_^1*_$CHECK ALL CONDITIONS REQUIRED FOR WRITING_^1_%SPC 3_^1WRITCK NUM 0_,ENTRY_^1_%LDA* WRIT€€CK_'SAVE ENTRY_^1_%STA- 4,I_^1_%LDA- ESTAT2,I_$GET DEVICE STATUS, WRITE RING ?_^1_%SAM WRT50_(YES, PROCEDE_^1WRT20 ENA $10_*NO, SET EOP_^1_%EOR- ESTAT2,I_$IN HARDWARE STATUS WORD_^1_%STA- ESTAT2,I_^1_%ENA 13_+ERROR CODE FOR NO WRITE RING_^1_%JMP SETCOD_'TO ERROR EXIT_^1WRT50 LDA- ESTAT2,I_^1_%AND- ONEBIT+10_#IS TAPE AT LOAD POINT_^1_%SAN 1_^1_%JMP* WRT100_'NO, CONTINUE WITH €€WRITE_^1_%CLR A_,YES, CLEAR OUT PTRBLK_^1_%STA- PTRBLK,I_$ZERO THIS BLOCK ADDRESS_^1_%STA- PTRBLK+28,I_!ZERO NEXT BLOCK ADDRESS_^1_%STA- RECPTR,I_$ZERO LAST BLOCK ADDRESS_^1_%ENQ 9_,SET UP RELEASE OF FILE_^1_%LDA =N$B00_'NOP_^1_%EQU NOP(*-1)_^1WRT70 EQU WRT70(*)_^1_%STA- REQUST,B_^1_%INQ -1_^1_%SQM 1_^1_%JMP* WRT70_^1_%LDA* RTJ_^1_%STA- REQUST,I_^1_%LDA* AFLMGR_'CALCULATE E€€NTRY FOR_^1_%INA 4_,RELEASE FILE IN FILE MANAGER_^1_%STA- REQUST+1,I_^1_%LDA- I_^1_%INA EWES_^1_%STA- REQUST+2,I_^1_%INA REQBUF-EWES_^1_%STA- REQUST+3,I_^1_%INA REQIND-REQBUF_^1_%STA- REQUST+4,I_^1_%LDA- ONEBIT+15_#SET UP ABSOLUTE PARAMETER FLAG_^1_%RTJ- REQUST-1,I_"GO RELEASE FILE_^1WRT80 NOP 0_^1_%LDA* AFLMGR_'SET UP DEFINE FILE REQUEST_^1_%STA- REQUST+1,I_^1_%LDA- REQUST+4€€,I_^1_%STA- REQUST+6,I_^1_%LDA- REQUST+3,I_^1_%STA- REQUST+5,I_^1_%LDA* LU_^1_%STA- REQUST+4,I_^1_%LDA- REQUST-1,I_^1_%ADD =XMAXLTH-WRT80_^1_%STA- REQUST+3,I_^1_%LDA- ONEBIT+15_#SET UP ABSOLUTE PARAMETER FLAG_^1_%RTJ- REQUST-1,I_^1_%NOP 0_^1_%ENA 26_+FAKE FULL BLOCK_^1_%STA- BLKPTR,I_^1WRT100 LDA- ESTAT2,I_^1_%AND- ONEBIT+14_#MASK MODE_^1_%SAN WRT105_'WRITING_^1_%LDA- ONEBIT+14€€_#WERE READING_^1_%ADD- ESTAT2,I_$SET WRITE_^1_%STA- ESTAT2,I_^1WRT105 LDA- BLKPTR,I_$GET CURRENT INDEX_^1_%INA -26_*IS PTRBLK FULL_^1_%SAM 1_,NOT FULL_^1_%RTJ* OPPRBK_'YES, GO OUTPUT PTRBLK_^1_%LDQ- 4,I_^1_%JMP- (ZERO),Q_$RETURN_^1_%EJT_]_^1*_$WRITE REQUEST PROCESSOR_^1_%SPC 3_^1WRITE RTJ* WRITCK_'CHECK WRITING CONDITIONS_^1_%RTJ* SQSTR_(SET UP SEQUENTIAL STORE_^1*_8RESTORE IT€€_^1_%INA ELSTWD-REQIND_^1_%STA- REQUST+5,I_"RECORD LENGTH_^1_%LDA- BUFADR,I_^1_%INA -1_^1_%STA- REQUST+4,I_"SET UP BUFFER LOCATION_^1_%LDA- I_^1_%INA PTRBLK_^1_%RAO- BLKPTR,I_$UPDATE PTRBLK INDEX_^1_%RAO- BLKPTR,I_^1_%ADD- BLKPTR,I_$AND LOCATION TO RETURN DISK WORD_^1_%STA- REQUST+3,I_"ADDRESS OF RECORD_^1_%LDQ- ELSTWD,I_^1_%INQ -1_^1_%LDA- BUFADR,I_^1_%STA* DISBUF_^1_%LDA- ECC€€OR,I_^1_%STA* DATBUF_^1WRT125 INQ -1_+NO WORDS TO WRITE_^1_%LDA* (DATBUF),Q_^1_%STA* (DISBUF),Q_^1_%SQZ 1_^1_%JMP* WRT125_^1_%LDA- ONEBIT+15_#SET UP ABSOLUTE PARAMETER FLAG_^1_%RTJ- REQUST-1,I_^1_%NUM 0_^1_%LDQ- REQUST+4,I_"CALCULATE ACTUAL NO OF WORDS_^1_%LDA- (ZERO),Q_$TRANSFERRED_^1_%LDQ- ECCOR,I_^1_%AAQ A_^1_%INA -1_^1_%STA- ECCOR,I_^1_%LDA- ELSTWD,I_$CALCULATE LAST WORD_^€€1_%INA -1_++1 THAT SHOULD HAVE_^1_%AAQ A_,BEEN WRITTEN_^1_%STA- ELSTWD,I_^1_%LDA- REQIND,I_$WAS REQUST REJECTED_^1_%SAP 2_,NO_^1_%JMP REJECT_'YES, GENERATE ERROR INDICATORS_^1_%ENA $1A_*SET DATA, EOP, BUSY_^1_%EOR- ESTAT2,I_^1_%AND- ZROBIT+10_#NOT AT LOAD POINT_^1_%STA- ESTAT2,I_^1_%JMP NCOMP_(NORMAL COMPLETION_^1RCRD_!NUM $4200_^1RCWT_!NUM $4400_^1LU_#ADC JLLUV4_^1REQ_"RT€€J- (MONI)_^1DISPAT JMP- (DISP)_^1_%EJT_]_^1*_$*_%*_%*_%*_%*_%*_%*_^1*_$SUBROUTINE FOR WRITING OUT POINTER BLOCKS_^1*_$*_%*_%*_%*_%*_%*_%*_^1_%SPC 3_^1OPPRBK NOP 0_^1_%LDA* OPPRBK_'SAVE RETURN_^1_%STA- RETURN,I_^1_%LDA- ESTAT2,I_^1_%ALS 1_^1_%SAM OPB10_(WRITING_^1_%JMP* (OPPRBK)_$READ MODE, NO OUTPUT, RETURN_^1OPB10 LDA- PTRBLK+28,I_!GET NEXT BLOCK ADDRESS_^1_%SAZ 1_^1_%JMP* O€€PB150_'GO REWRITE BLOCK ON MM_^1_%ENQ 31_^1_%STQ PTBFV4-1_$SAVE LENGTH_^1_%CLR A_^1OPB15 INQ -1_^1_%STA PTBFV4,Q_$CLEAR OUT A FAKE PTRBLK_^1_%SQZ 1_,DONE_^1_%JMP* OPB15_(CONTINUE LOOP_^1_%LDA- RECPTR,I_$CURRENT IS LAST OF NEXT_^1_%STA PTBFV4_^1_%LDA- RECPTR+1,I_^1_%STA PTBFV4+1_^1OPB50 RTJ SQSTR_^1_%INA PTRBLK+28-REQIND_!WHERE TO STORE REC POINTER_^1_%STA- REQUST+3,I_^1€€_%LDA- BUFADR,I_^1_%INA -1_+ADDRESS OF SEQ. STORE BUFFER_^1_%STA- REQUST+4,I_^1_%STA- REQUST+5,I_^1_%LDA- ONEBIT+15_#SET UP ABSOLUTE PARAMETER FLAG_^1_%RTJ- REQUST-1,I_"EXECUTE REQUEST_^1_%NOP 0_^1OPB150 LDA- RECPTR,I_$ADDRESS OF THIS BLOCK_^1_%SAN 1_,NE. 0 SIGNIFIES IS DEFINED, SO WRITE MM_^1_%JMP* OPB205_'NOT DEFINED, IS FIRST, GO WRAP UP_^1_%LDQ =XPTRBLK+2,I BUFFER START_^€€1_%STQ- REQUST+6,I_^1_%INQ RECPTR-PTRBLK-2_^1_%LDA* RCWT_^1_%RTJ* SETREQ_^1_%LDA- REQUST+8,I_"ADJUST WORD ADDR. TO LAST TWO_^1_%SOV 0_^1_%INA 3_,BIAS ADDRESS TO START AT DATA POINTERS_^1_%SNO OPB160_^1_%RAO- REQUST+7,I_^1_%AND- LPMSK+15_^1OPB160 STA- REQUST+8,I_^1_%ENA 28_+LENGTH OF XFER_^1_%STA- REQUST+5,I_^1_%RTJ- REQUST-1,I_"EXECUTE WRITE OF BLOCK_^1OPB200 NOP 0_^1_%LDA* O€€PB200_'FIND PHYSTB_^1_%INA -BUFADR_^1_%STA- I_^1_%SQP 2_^1JLARM JMP ALARM_^1OPB205 LDA- RECPTR,I_$THIS_^1_%STA- PTRBLK,I_$TO LAST_^1_%LDA- RECPTR+1,I_^1_%STA- PTRBLK+1,I_"NEXT_^1_%LDA- PTRBLK+28,I MAKE ADDRESS OF NEXT = THIS_^1_%STA- RECPTR,I_$IN RECORD POINTER_^1_%LDA- PTRBLK+29,I_^1_%STA- RECPTR+1,I_^1OPB210 ENQ 27_^1_%CLR A_^1OPB220 STA- PTRBLK+2,B_"CLEAR OUT REMAINDER OF €€PTRBLK_^1_%INQ -1_^1_%SQM 1_^1_%JMP* OPB220_^1_%ENA 0_^1_%STA- BLKPTR,I_$RESET INDEX TO POINTER BLOCK_^1_%LDQ- RETURN,I_^1_%JMP- (ZERO),Q_^1MAXLTH ADC BUFLNG+1_#MAXIMUM RECORD LENGTH = LENGTH OF INTERMEDIATE_^1*_8BUFFER + 1_^1_%EJT_]_^1*_$*_%*_%*_%*_%*_%*_%*_^1*_$SUBROUTINE TO SET UP DISK READ OR WRITE REQUEST*_^1*_U*_^1*_$ENTERED WITH REQUEST CODE IN A AND POINTER_$*_^1*_$TO D€€ISK ADDRESS IN Q._:*_^1*_$STARTING LOCATION MUST BE SET UP IN THE CALLING *_^1*_$SEQUENCE._F*_^1*_$*_%*_%*_%*_%*_%*_%*_^1_%SPC 3_^1SETREQ NOP 0_,SET UP DISK READ OR WRITE_^1_%ARS 4_^1_%ADD- LEVEL_(USE CURRENT PRIORITY LEVEL_^1_%ALS 4_,FOR BOTH REQUEST AND_^1_%ADD- LEVEL_(COMPLETION_^1_%STA- REQUST+1,I_^1_%LDA- 1,Q_^1_%STA- REQUST+8,I_^1_%LDA- (ZERO),Q_^1_%MUI =X96_^1_%LLS 1_^€€1_%ALS 15_^1_%STQ- REQUST+7,I_^1_%LDQ* SETREQ_^1_%SOV 0_^1_%ADD- REQUST+8,I_^1_%SNO 1_^1_%RAO- REQUST+7,I_^1_%AND- LPMSK+15_^1_%STA- REQUST+8,I_^1_%LDA* REQ_^1_%STA- REQUST,I_^1_%LDA- I_^1_%INA REQUST+10_#SET UP COMP ADDR_^1_%STA- REQUST+2,I_^1_%CLR A_^1_%STA- REQUST+3,I_"THREAD WORD_^1_%INA 31_^1_%STA- REQUST+5,I_"LENGTH_^1_%LDA* (LU)_)LOGICAL UNIT_^1_%STA- REQUST+4,I_^1_%LD€€A* DISPAT_^1_%STA- REQUST+9,I_^1_%JMP- (ZERO),Q_$RETURN_^1_%SPC 10_^1*_$CHECK FOR MORE REQUESTS TO BE ON OTHER PSEUDO TAPE_$*_^1*_$LOGICAL UNITS_J*_^1_%SPC 3_^1BUSY_!NUM 0_^1NXTFIL LDQ- LINK,I_'JOB PROCESSOR FILE_^1_%TRQ A_^1_%SUB* BUSY_)YES, HAVE ALL TABLES BEEN LOOKED AT_^1_%SAZ CLRBSY_'YES, EXIT_^1_%LDA- 8,I_*REQUEST STATUS_^1_%SAM LOKNXT_'I/O IN PROGRESS_^1_%STQ- I_N**MSO€€S 4.1**_^1_%JMP* NTBSY_J**MSOS 4.1**_^1LOKNXT STQ- I_N**MSOS 4.1**_^1_%JMP* NXTFIL_^1CLRBSY CLR A_^1_%STA* BUSY_^1_%JMP+ MAS300_'RELEASE CORE BUFFER_.**MSOS 4.1**_^1_%EJT_]_^1*_$ENTRY TO DRIVER--UNTHREAD NEXT REQUEST AND ROUTE IT TO *_^1*_$THE CORRECT SECTION FOR PROCESSING_5*_^1_%SPC 3_^1PSDTV4 LDA* BUSY_)IS DRIVER BUSY_3**MSOS 4.1**_^1_%SAZ NOTBSY_'NO_^1_%JMP- (DISP)_'YES, GO€€ AWAY_^1NOTBSY LDQ- I_,GET PDT ADDRESS_2**MSOS 4.1**_^1_%STQ* BUSY_)SET DRIVER BUSY_2**MSOS 4.1**_^1NTBSY LDA- FILNUM,Q_G**MSOS 4.1**_^1_%AND- LPMSK+15_^1_%SUB- EWES,I_'NEW FILE BEING PROCESSED_^1_%SAN NEWFIL_'NO_^1_%JMP* NOTNEW_^1NEWFIL LDA- ESTAT1,I_$WAS OTHER FILE BEING WRITTEN_^1_%AND- ONEBIT_'WRITTEN INTO_^1_%SAZ NOWRT_(NO_^1_%LDA- BLKPTR,I_$YES, WAS IT BOUND OFF_^1_%SAZ N€€OWRT_(YES_^1_%JMP REW50_(NO, PUT OUT LAST PTR BLOCK_^1NOWRT LDA- FILNUM,I_$UPDATE FILE NO. TO BE_^1_%STA- EWES,I_'USED_^1_%CLR A_^1_%STA- BLKPTR,I_^1NOTNEW RTJ- (FNR)_(FIND NEXT REQUEST THIS FILE_^1_%JMP* NXTFIL_'NONE_^1_%LDA- I_^1_%STA* BUSY_)SET DRIVER BUSY_^1_%LDA- FILNUM,I_$IS THERE A FILE FOR THIS LU_^1_%SAN PROCED_'YES, PROCEDE_^1_%ENA 28_+NO, GO PUT OUT ERROR_^1_%JMP S€€ETCOD_^1PROCED LDA =N$C401_%W. RING, MODE, LOAD POINT READY_^1_%AND- ESTAT2,I_$BITSIN STATUS WORD_^1_%INA 2_,SET BUSY STATUS_^1_%STA- ESTAT2,I_^1_%LDQ- EPTR,I_'IS THIS A MOTION REQ_^1_%LDA- (ZERO),Q_^1_%ARS 9_^1_%AND- LPMSK+5_^1_%INA -14_^1_%SAN 2_^1_%JMP MOTION_'YES_^1_%LDA- ELSTWD,I_^1_%STA- 3,I_*SAVE ELSTWD FOR LATTER_^1_%SUB- ECCOR,I_^1_%INA 1_^1_%SAM PR50_)MORE THAN 32€€K WORDS REQUESTED_^1_%STA- ELSTWD,I_^1_%SUB* MAXLTH_'IS NO. WORDS REQD..GT.INTERMED. BUF. LENGTH_^1_%SAM PR100_(NO_^1PR50_!LDA* MAXLTH_'YES, SET TO INTERMED. BUF LENGTH_^1_%STA- ELSTWD,I_^1PR100 LDA- ESTAT1,I_^1_%AND- ONEBIT_'READ REQUEST_^1_%SAZ 2_^1_%JMP WRITE_(NO_^1_%EJT_]_^1*_$READ REQUEST PROCESSOR_A*_^1_%SPC 3_^1_%LDA- ESTAT2,I_$IS TAPE AT LOAD POINT_^1_%AND- ONEBIT+10_^€€1_%SAN 1_^1_%JMP* RD100_(NO_^1_%RTJ RTVBL1_'YES, SET UP REQUST TO FETCH 1ST PTRBLK_^1_%LDA- REQIND,I_$RETURN FROM REQUEST_^1_%SAP 2_,REQUEST REJECTED_^1_%JMP REJECT_'YES_^1_%AND- ONEBIT+3_$NO, CHECK FOR 'END OF TAPE'_^1_%SAZ RD90_)NO, PROCEDE WITH READ_^1RD60_!LDA =N$220_'END OF TAPE,ALARM_^1_%JMP* EOFEOT_^1RD90_!ENQ 0_,SET PTRBLK INDEX BACK_^1_%STQ- BLKPTR,I_^1_%LDA- ESTAT2€€,I_^1_%AND- ZROBIT+14_#DEFINE READ MODE, BIT 14 = 0_^1_%STA- ESTAT2,I_^1_%LDA- I_,RESET RECORD LENGTH_^1_%INA ELSTWD_'POINTER_^1_%STA- REQUST+6,I_^1RD100 LDQ- BLKPTR,I_$END OF PTRBLK_^1_%INQ -26_^1_%SQM 1_^1_%JMP* RD160_(YES_^1_%INQ 28_+NO, CONTINUE WITH READ_^1_%LDA- PTRBLK,B_^1_%SAN 1_,SOME DATA_^1_%JMP* RD60_)END OF TAPE_^1_%STQ- BLKPTR,I_$UPDATE INDEX_^1_%SAP 1_,NOT EOF€€_^1_%JMP* EOF_*END OF FILE_^1_%LDQ =XPTRBLK,B_"FORM ADDRESS OF MM_^1_%LDA- BUFADR,I_^1_%INA -1_^1_%STA- REQUST+6,I_^1_%LDA RCRD_^1_%RTJ SETREQ_^1_%LDQ- ELSTWD,I_^1_%STQ- REQUST+5,I_^1_%RTJ- REQUST-1,I_^1RD150 NOP 0_^1_%LDA* RD150_^1_%INA -BUFADR_^1_%STA- I_^1_%SQP 1_^1_%JMP* JALARM_^1_%JMP* RD200_^1_%SPC 3_^1RD160 ENQ 28_^1_%STQ- BLKPTR,I_$INDEX TO NEXT BLOCK ADDRESS_^1_€€%RTJ RTVBLK_^1_%ENQ 0_^1_%STQ- BLKPTR,I_$INITIALIZE INDEX_^1_%SAN RD180_(END OF PSEUDO TAPE_^1_%JMP* RD60_)YES_^1RD180 JMP* RD90_)NO, CONTINUE WITH READ_^1RD200 LDQ- BUFADR,I_^1_%INQ -1_^1_%LDA- (ZERO),Q_$FM WORD CNT+2_761*1286_^1_%INA -1_P61*1286_^1_%SUB- ELSTWD,I_$USERS WORD CNT+1_461*1286_^1_%SAP RD213_(SKIP IF LONG READ_361*1286_^1_%LDQ- (ZERO),Q_$SHORT READ_:61*1286_^1€€_%JMP* RD214_M61*1286_^1RD213 LDA- ELSTWD,I_$USERS WORD CNT+1_461*1286_^1_%STA- (ZERO),Q_J61*1286_^1_%TRA Q_Q61*1286_^1*_81 CARD DELETED_^1RD214 INQ -1_P61*1286_^1RD215 INQ -1_+TRANSFER RECORD FROM INPUT BUFF._^1_%LDA- ECCOR,I_^1_%STA* DATBF2_^1_%LDA- BUFADR,I_^1_%STA* DISBF2_^1_%LDA* (DISBF2),Q_^1_%STA* (DATBF2),Q_^1_%SQZ 1_^1_%JMP* RD215_^1_%LDQ- BUFADR,I_^1_%INQ -1_^1_%L€€DA- (ZERO),Q_^1_%INA -1_^1_%LDQ- ECCOR,I_^1_%AAQ A_^1_%STA- ECCOR,I_^1_%LDA- 3,I_^1_%STA- ELSTWD,I_$DETERMINE SHORT READ._^1_%CLR A_^1_%JMP* NOEOF_^1EOF_"ENA $20_*ALARM_^1_%EOR- ONEBIT+11_$SET EOF STATUS._^1EOFEOT LDQ- EREQST,I_$SET ERROR BIT (14)._^1_%ADQ- ONEBIT+14_^1_%STQ- EREQST,I_^1_%RAO- ECCOR,I_%SET 1 WORD TRANSFER._^1_%LDQ- 3,I_*GET SAVED ELSTWD_^1_%STQ- ELSTWD,I_^1NOEO€€F INA $1A_^1_%EOR- ESTAT2,I_$AS HARDWARE STATUS_^1_%STA- ESTAT2,I_$NEW STATUS_^1NCOMP RTJ MAKEQ_(SET UP ERROR CODE FIELD_^1_%RTJ- (COMPRQ)_$COMPLETE THE REQUEST_^1_%JMP NOTNEW_'GO FIND NEXT REQUEST_^1REJECT LDA- REQIND,I_$WAS THERE A DISK READ/WRITE_^1_%AND- ONEBIT+7_$ERROR_^1_%SAZ 1_,NO_^1JALARM JMP* ALARM_(YES, GO SET ALARM STATUS_^1_%LDA- REQIND,I_$IS FILE RUNNING OUT OF S€€PACE_^1_%AND- ONEBIT+8_^1_%SAZ RJT100_^1_%ENA $30_*SET ALARM, EOP,_^1_%EOR- ONEBIT+9_$AND END OF TAPE STATUS_^1_%EOR- ESTAT2,I_^1_%STA- ESTAT2,I_^1_%ENA 26_+ERROR CODE FOR OUT OF FILE SPACE_^1_%JMP* SETCOD_^1DISBF2 NUM 0_^1DATBF2 NUM 0_^1RJT100 EQU RJT100(*)_^1_%SPC 3_^1ALARM ENA $30_*END OF OP, ALARM_^1_%EOR- ESTAT2,I_$TO HARDWARE STATUS_^1_%STA- ESTAT2,I_^1_%ENA 2_,ALARM €€CODE_^1SETCOD LDQ- ELU,I_^1_%ALS 10_^1_%LLS 6_^1_%STQ* PTBFV4_'SAVE CODE TEMPY_^1_%LDA- EREQST,I_^1_%EOR- ONEBIT+14_#SET BIT 14 OF REQUEST STATUS WORD_^1_%STA- EREQST,I_^1_%RTJ MAKEQ_(GO SET Q BITS_^1_%LDA- (ZERO),I_^1_%STA* SET1_^1_%LDQ* PTBFV4_^1_%RTJ+ LOG_*LOG DEVICE ERROR_1**MSOS 4.1**_^1_%RTJ- (MONI)_'SCHEDULE ALT DEVICE HANDLER_^1SET1_!ADC $1200_^1_%ADC ALTDEV_^1_%JMP N€<XTFIL_^1_%NUM 0_^1PTBFV4 BZS PTBFV4(BUFLNG)_^1_%END_]_^__ <PDEFFIL CSY/ F I L E M A N A G E R F05 P€1_%NAM DEFFIL_'DECK-ID F05 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_$CALL DEFFIL(FILNUM,MAXRL,LU,REQBUF,REQIND)_^1*_]_^1*_]_^1_%EXT FSTLOC_'FIS STARTING THREAD LOC (ZERO, IF NO CORE FIS)_^1_%EXT FIDLOC_'FIS DIRECTORY LOCATION (ZERO, IF NO€€T IN CORE)_^1_%EXT FDTINT_'FILE/DIRECTORY TIMEOUT INTERVAL_^1_%EXT NWFISD_'NUMBER OF WORDS IN FIS DIRECTORY (N*96)_^1_%EXT NWFISB_'NUMBER OF WORDS IN A FIS BLOCK (N*96)_^1_%EXT FISLU_(FIS LOGICAL UNIT_^1_%EXT ADRFMS_'BEGINNING SECTOR OF FILE SPACE ON LIB UNIT_^1_%EXT FIDSEC_'FIS DIRECTORY,S SECTOR ADDRESS_^1_%EXT FIBLSA_'SECTOR ADDRESS OF THE LAST FIS BLOCK_^1_%EXT FIBNIX_'€€INDEX TO THE NEXT AVAILABLE LOCATION IN FIBLSA_^1_%EXT FSLIST_'START OF FILE SPACE LIST_^1_%EXT FSLMMA_'MM ADR OF FILE SPACE LIST ON AUTOLOAD IMAGE_^1_%EXT LOG1A_(MONITOR LOGICAL UNIT TABLE OF PHYSTBS_^1_%EXT FILBLK_'FILE BLOCK FOR FIS BLOCKS AND FRB BLOCKS_^1*_]_^1_%EXT ABSPAR_'ABSOLUTIZE PARAMETER_^1_%EXT CKCFIS_'CHECK IF FIS IS IN CORE_^1_%EXT CKPROT_'CHECK IF REQUEST IS €€PROTECTED_^1_%EXT GETSPC_'GET ALLOCATABLE SPACE_^1_%EXT MMREAD_'MASS MEMORY READ_^1_%EXT MMWRIT_'MASS MEMORY WRITE_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1*_]_^1_%EXT* FILSPC_'GET FILE SPACE_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_]_^1_%EQU ZERO(2)_%ZERO CONSTANT_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU ZROMSK($13)_!ZERO MASK TABLE_^1_%EQU ONEBIT($23)_!O€€NE BIT TABLE_^1_%EQU ZROBIT($33)_!ZERO BIT TABLE_^1*_]_^1*_*EQUS USED TO FIND SECTOR ADDRESS OF THE CORE IMAGE_^1_%EQU ADRECT($E9)_!ADDRESS OF THE EXTENDED CORE TABLE_^1_%EQU SACIMG(4)_#INDEX INTO EXT CORE TABLE TO ADR OF CORE IMAGE_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER O€€F WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SEC€€TOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU€€ FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(F€€H+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1_%EJT_]_^1*_$CALL DEFFIL(FILNUM,MA€€XRL,LU,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(REQUEST PROCESSOR LENGTH_^1_%SPC 2_^1DEFFIL 000 000_*DEFINE FILE_^1_%STQ- I_,SAVE ADDRESS OF PARAMETER LIST_^1*_]_^1_%ENQ 5_^1DF10_!INQ -1_+GET EACH PARAMETER AND STORE IT_^1_%STQ FILNUM_L71*1592_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ DF20_^1_%JMP* DF10_^1*_]_^1DF20_!STQ* NEWFIB_'CLEAR NEW FIS BLOC€€K FLAG_^1*_]_^1_%LDQ* (MAXRL)_%CHECK IF MAXIMUM RECORD LENGTH WITHIN LIMITS_^1_%SQZ DF25_^1_%SQM DF25_^1_%INQ FRBHDR+WRDSEC-1_^1_%SQM DF30_^1*_]_^1_%LDQ* (LU)_)CHECK IF LOGICAL POSITIVE_^1DF25_!SQZ DF30_^1_%SQM DF30_^1_%TCQ A_,CHECK IF GREATER THAN MAX. NO. OF LUS_^1_%ADD* (ALOG1A)_^1_%SAM DF30_^1_%LDQ* (ALOG1A),Q_^1_%LDA- 8,Q_*CHECK IF LOGICAL UNIT IS A MASS MEMORY DEVICE€€_^1_%ALS 5_^1_%AND- ONEMSK+2_^1_%INA -2_^1_%SAN DF30_^1*_]_^1_%LDQ* (FILNUM)_$CHECK IF FILE NUMBER POSITIVE_^1_%SQZ DF30_^1_%SQP DF40_^1*_]_^1DF30_!LDA- ONEBIT+14_#ERROR (ZERO OR NEGATIVE)_^1*_]_^1BIT15 EOR- ONEBIT+15_#ERROR EXIT (SET BIT 15)_^1_%JMP* GETOUT_^1_%EJT_]_^1*_]_^1DF40_!LDA FIDSEC_'CHECK IF FIRST ENTRY EVER INTO DEFFIL_^1_%SAN DF50_+NO_^1*_]_^1_%STA* (AFIBLS)_$C€€LEAR LAST SECTOR ADDRESS OF FIS BLOCK_^1_%RTJ INITAL_'INITIALIZE FILE MANAGER_^1*_]_^1DF50_!RTJ CKCFIS_'CHECK IF FIS IN CORE_^1_%SAP DF60_+(YES, CHECK IF RELEASED)_^1*_]_^1_%LDQ* (FILNUM)_$CHECK IF FIS EXISTS_^1_%RTJ SRHFIS_^1_%SAN NOFIS_(NO FIS FOR THIS FILE NUMBER_^1*_]_^1DF60_!LDA- FISFLG,Q_$CHECK IF FIS HAS BEEN RELEASED_^1_%SAP DF70_^1_%LDA- ONEBIT+0_$NO, FILE ALREADY DE€€FINED_^1_%JMP* BIT15_(EXIT WITH ERROR_^1*_]_^1DF70_!RTJ SETFIS_'SET UP RELEASED FIS TO BE RE-DEFINED_^1_%LDA- IDXCHG,I_$SET FIS CHANGED BIT_^1_%AND- ZROBIT_^1_%EOR- ONEBIT_^1_%STA- IDXCHG,I_^1*_]_^1OKEXIT CLR A_,NORMAL EXIT_^1*_]_^1GETOUT STA* (REQIND)_$SET REQUEST INDICATOR_^1_%JMP* (DEFFIL)_$EXIT_^1_%EJT_]_^1*_]_^1NOFIS STQ* POINTR_'SAVE FIS BLOCK POINTER IN FIS DIRECTORY_^1_%€€STA* INDEX_(SAVE SCATTER INDEX(9-15) AND FIB INDEX(0-8)_^1*_]_^1_%LDQ* (AFIBLS)_$CHECK IF NO FIS BLOCKS_^1_%SQZ SETFLG_^1_%LDA* (ANWFIB)_$CHECK IF LAST FIB BLOCK FILLED_^1_%SUB* (AFIBNX)_^1_%INA -FISSIZ-1_^1_%SAM SETFLG_^1_%LDA* (AFIBNX)_$PUT NEW FIS IN AN UNFILLED FIS BLOCK_^1_%JMP* BLDFIS_^1*_]_^1SETFLG RAO* NEWFIB_'SET NEW FIS BLOCK FLAG_^1_%LDA* AFISLU_^1_%LDQ* (ANWFIB)_$GET€€ SPACE FOR NEW FIS BLOCK_^1_%RTJ FILSPC_^1_%SAZ BLDFIB_^1_%SAM FSERR_^1_%JMP* MMERR_"*****MASS MEMORY ERROR_^1*_]_^1FSERR LDA- ONEBIT+8 *****NO MORE FILE SPACE ERROR_^1_%JMP* BIT15_^1*_]_^1*_]_^1BLDFIB ENA 1_,RESET NEXT INDEX INTO FIS BLOCK_^1BLDFIS STA* FBNSAV_'SAVE FIBNIX AND FIBLSA_^1_%STQ* FBLSAV_^1*_]_^1_%ENA FH+FISSIZ_#GET SPACE FOR CORE FIS_^1_%RTJ* (AGETSP)_^1*_]_^1_%€€LDA* FBLSAV_'SET SECTOR OF FIS_^1_%STA- SECFIS,Q_^1_%LDA* FBNSAV_^1_%ALS 7_^1_%STA- IDXCHG,Q_$SET INDEX OF FIS_^1_%CLR A_^1_%STA- ADRKID,Q_$CLEAR KIS DIRECTORY ADDRESS_^1_%STA- LOKADR,Q_$CLEAR LOCK ENTRY ADDR_^1_%STA- FILCLK,Q_$CLEAR CLOCK (FOR THREAD WORD OF A NEW FIB)_^1_%LDA* POINTR_^1_%STA- SANFIS,Q_$SET SECTOR OF NEXT FIS_^1_%LDA* INDEX_^1_%AND- ONEMSK+8_^1_%STA- IXNFIS,Q_$S€€ET INDEX OF NEXT FIS_^1*_]_^1_%RTJ SETFIS_'SET UP REST OF FIS_^1_%EJT_]_^1*_]_^1_%LDA* FBLSAV_'STORE SECTOR/INDEX IN WRITE CALL_^1_%STA* PME_^1_%LDA* FBNSAV_^1_%SUB* NEWFIB_^1_%STA* PMD_^1*_]_^1_%LDA- I_^1_%INA FH_^1_%SUB* NEWFIB_'DECREMENT CORE ADDRESS IF NEW FIS BLOCK_^1_%STA* PMA_^1_%ENA FISSIZ_^1_%ADD* NEWFIB_'INCREMENT NUMBER OF WORDS IF NEW FIS BLOCK_^1_%STA* PMB_^1_%RTJ €€MMWRIT_'WRITE NEW FIS_771*1592_^1PMA_"NUM 0_^1PMB_"NUM 0_^1AFISLU ADC FISLU_^1PMD_"NUM 0_^1PME_"NUM 0_^1_%SQM MMERR_"*****MASS MEMORY ERROR_^1_%JMP* CKNFIB_^1_%SPC 2_^1*_***************FILE SPACE SHOULD BE RETURNED ON MM ERROR_^1MMERR LDA- ONEBIT+7_$MASS MEMORY ERROR, SET BIT 7 AND EXIT_^1_%JMP* BIT15_^1_%EJT_]_^1*_]_^1POINTR NUM 0_,FIS BLOCK POINTER_^1INDEX NUM 0_,SCATT€€ER INDEX(0-8) AND FIS BLOCK INDEX(9-15)_^1NEWFIB NUM 0_,NEW FIS BLOCK FLAG_^1FBLSAV NUM 0_,SAVE FIBLSA_^1FBNSAV NUM 0_,SAVE FIBNIX_^1*_]_^1FILNUM NUM 0_,FILE NUMBER_^1MAXRL NUM 0_,MAXIMUM RECORD LENGTH_^1LU_#NUM 0_,LOGICAL UNIT_^1REQBUF NUM 0_,REQUEST BUFFER_^1REQIND NUM 0_,REQUEST INDICATOR_^1*_]_^1AFSTLO ADC FSTLOC_^1AFIDLO ADC FIDLOC_^1AFDTIN ADC FDTINT_^1ANWFIB ADC €€ NWFISB_^1AFIBLS ADC FIBLSA_^1AFIBNX ADC FIBNIX_^1ALOG1A ADC LOG1A_^1*_]_^1AGETSP ADC GETSPC_^1_%EJT_]_^1*_]_^1CKNFIB LDA* NEWFIB_'CHECK IF NEW FIS BLOCK_^1_%SAZ UPDTFD_)NO, UPDATE FIS DIRECTORY_^1*_]_^1_%LDA* (AFIBLS)_$THREAD THE NEW FIS_^1_%SAZ UPDTFD_'DONT WRITE THREAD TO MM, IF FIRST FIS BLOCK_^1_%STA* PAR5_^1_%LDQ* PMA_^1_%LDA* FBLSAV_^1_%STA- (ZERO),Q_$STORE POINTER TO €€NEW FIS BLOCK_^1_%STQ* PAR1_)SETUP ADDRESS OF THREAD WORD_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE THREAD TO NEW FIS BLOCK_^1PAR1_!NUM 0_^1PAR2_!NUM 1_^1_%ADC FISLU_^1_%NUM 0_^1PAR5_!NUM 0_^1_%SQP UPDTFD_^1_%JMP* MMER_#*****MASS MEMORY ERROR_^1*_]_^1UPDTFD IIN 0_^1_%LDA* (AFDSEC)_$SETUP FIS DIRECTORY STARTING SECTOR_^1_%STA* FDSC1_^1_%STA* FDSC2_^1_%LDA* (ANWFID)_$SETUP NUMBER OF WORD€€S IN FIS DIRECTORY_^1_%STA* NWFD1_^1_%STA* NWFD2_^1*_]_^1_%LDQ* (AFIDLO)_$CHECK IF FIS DIRECTORY IN CORE_^1_%SQZ NOTINC_'NO_B71*1592_^1_%JMP* SETCLK_'YES_A71*1592_^1*_]71*1592_^1NOTINC RTJ* (AGETSP)_$GET SPACE FOR FIS DIRECTORY_)71*1592_^1_%STQ* P1_+SAVE ADDRESS OF FIS DIRECTORY_^1_%STQ* RELFID+2_$STORE ADDRESS FOR POSSIBLE RELEASE_!71*1592_^1_%EJT_]_^1*_]_^1_%RTJ* (AMMRED)_$READ €€IN FIS DIRECTORY_^1P1_#NUM 0_^1NWFD1 NUM 0_^1_%ADC FISLU_^1_%NUM 0_^1FDSC1 NUM 0_^1_%SQP SETADR_^1RELFID RELEAS 0_*RELEASE SPACE USED BY FID_+71*1592_^1MMER_!JMP* MMERR_"*****MASS MEMORY ERROR_^1*_]_^1SETADR IIN 0_,SET FIS DIRECTORY ADDRESS_^1_%LDQ* P1_^1_%STQ* (AFIDLO)_^1*_]_^1SETCLK LDA* (AFDTIN)_$SET FIS DIRECTORY CLOCK_^1_%STA- 1,Q_^1_%STQ* P2_+SETUP FIS DIRECTORY LOCA€€TION FOR WRITE_^1_%EIN 0_^1*_]_^1_%LDA* INDEX_(THREAD FIS INTO FIS DIRECTORY_^1_%ALS 7_^1_%AND- ONEMSK+6_^1_%AAQ Q_^1_%LDA* FBLSAV_'STORE FIBLSA INTO FIS DIRECTORY_^1_%STA- (ZERO),Q_^1_%LDA* FBNSAV_'STORE FIBNIX INTO FIS DIRECTORY_^1_%STA- 1,Q_^1*_]_^1_%LDA* (AFIBLS)_$CHECK IF FIRST FIS_^1_%SAN WRTFD_^1_%LDA* FBLSAV_'YES, SET POINTER IN FID TO FIRST FIS BLOCK_^1_%LDQ* (AFIDLO)_€€^1_%STA- (ZERO),Q_^1*_]_^1WRTFD RTJ* (AMMWRT)_$WRITE FIS DIRECTORY_^1P2_#NUM 0_^1NWFD2 NUM 0_^1_%ADC FISLU_^1_%NUM 0_^1FDSC2 NUM 0_^1_%SQP STOFIB_^1_%JMP* MMERR_"*****MASS MEMORY ERROR_^1_%EJT_]_^1*_]_^1STOFIB LDA* FBLSAV_'STORE NEW FIS BLOCK SECTOR (IF CHANGED)_^1_%STA* (AFIBLS)_^1_%LDA* FBNSAV_'INCREMENT NEXT INDEX IN FIS BLOCK_^1_%INA FISSIZ_^1_%STA* (AFIBNX)_^1*_]_^1_€€%LDQ* AFSLMA_'UPDATE FIDSEC,FIBLSA,FIBNIX ON AUTOLOAD IMAGE_^1_%LDA- 1,Q_^1_%LDQ- (ZERO),Q_$GET MM ADDRESS OF FILE SPACE LIST_^1_%INA -3_^1_%SAP COMPSI_'SUBTRACT A THREE BY DOUBLE PRECISION TO_^1_%AND- ONEBIT+15_#COMPUTE MASS MEMORY ADDRESS OF FIDSEC_^1_%INQ -1_^1*_]_^1COMPSI ALS 1_,COMPUTE SECTOR/INDEX FROM MASS MEMORY ADDRESS_^1_%LRS 1_^1_%DVI* WPS_^1_%STA* IMGSEC_^1_%STQ* I€€MGIDX_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE OUT UPDATED FIDSEC, FIBLSA, FIBNIX_^1AFDSEC ADC FIDSEC_^1_%ADC 3_^1_%ADC $8C2_^1IMGIDX ADC 0_^1IMGSEC ADC 0_^1*_]_^1_%SQP SCLOCK_^1_%JMP* MMERR_"*****MASS MEMORY ERROR_^1*_]_^1SCLOCK LDQ- I_,SET FIS CLOCK_^1_%LDA* (AFDTIN)_^1_%STA- FILCLK,Q_^1*_]_^1_%IIN 0_^1_%LDA* (AFSTLO)_$PUT NEW FIS ON CORE FIS THREAD_^1_%STA- (ZERO),Q_^1_%STQ* (AFSTL€€O)_^1_%EIN 0_^1_%JMP OKEXIT_'NORMAL EXIT_^1_%EJT_]_^1*_]_^1AMMWRT ADC MMWRIT_^1AMMRED ADC MMREAD_^1*_]_^1AFSLST ADC FSLIST_^1ANWFID ADC NWFISD_^1_%EJT_]_^1*_*SET UP FIS_^1*_]_^1SETFIS 000 000_^1_%STQ- I_,I = CORE FIS ADDRESS_^1_%CLR Q_^1_%LDA* (MAXRL)_%GET NUMBER OF SECTORS FOR FILE RECORD BLOCK_^1_%INA FRBHDR+WRDSEC-1_^1_%DVI* WPS_+FRBSIZ = (FRBHDR + MAXRL + WRDSEC - 1)/W€€RDSEC_^1_%STA- FRBSIZ,I_$STORE FRB SIZE AND CLEAR FIS INDICATORS_^1*_]_^1_%LDQ FILNUM_'SET FILE NUMBER_571*1592_^1_%LDA- (ZERO),Q_J71*1592_^1_%STA- FILENO,I_^1*_]_^1_%RTJ CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SAZ SF10_+NO_^1_%LDA- ONEBIT+14_%YES, SET PROTECTED BIT_^1SF10_!LDQ LU_+PUT IN LOGICAL UNIT_171*1592_^1_%EOR- (ZERO),Q_J71*1592_^1_%EOR- ONEBIT+15_#SET THE DEFINED BIT_^1€€_%STA- FISFLG,I_^1*_]_^1_%CLR A_^1_%ENQ NUMFRB-FRBFSA+1_^1SF20_!INQ -1_^1_%STA- FRBFSA,B_$CLEAR FRBFSA, NRLFRB, FRBLSA,_^1_%SQZ SF30_/FRBNIX, KIDSEC, KIDSIZ, KIBSIZ,_^1_%JMP* SF20_/KEYLTH, NUMEKV, FIFORL, NUMFRB._^1*_]_^1SF30_!JMP* (SETFIS)_$RETURN_^1_%SPC 3_^1WPS_"ADC WRDSEC_'NUMBER OF WORDS PER SECTOR_^1LUELTH NUM 0_,LOGICAL UNIT ENTRY LENGTH_^1_%EJT_]_^1*_*INITIALIZE FILE€€ MANAGER_^1*_]_^1INITAL 000 000_^1*_]_^1_%ENA WRDSEC_'GET SECTOR ADDRESS OF CORE IMAGE_^1_%ENQ SACIMG_^1_%MUI- (ADRECT),Q_^1*_]_^1_%LLS 1_^1_%ALS 15_^1_%SPC 2_^1*_*SAVE FILE SPACE LIST MM ADDRESS IN CORE AND MASS MEMORY_^1*_]_^1SAVMMA STQ* FSLMSB_'SAVE MM ADDRESS OF START OF CORE IMAGE_^1_%STA* FSLLSB_^1*_]_^1_%ADD* AFSLST_'ADD FILE SPACE LIST ADDRESS_^1_%SAP STOFSL_^1_%INQ €€ 1_^1_%AND- ONEMSK+14_^1STOFSL STQ* (AFSLMA)_$STORE FILE SPACE LIST MASS MEMORY ADDRESS_^1_%LDQ* AFSLMA_^1_%STA- 1,Q_^1*_]_^1_%LDQ* FSLMSB_'GET MM ADDRESS OF MSB,LSB TO WRITE FSLIST_^1_%LDA* FSLLSB_^1_%ADD* AFSLMA_^1_%SAP COMPUT_^1_%INQ 1_^1_%AND- ONEMSK+14_^1*_]_^1COMPUT ALS 1_,COMPUTE SECTOR/INDEX FROM MASS MEMORY ADDRESS_^1_%LRS 1_^1_%DVI* WPS_^1_%STA* FSLLSB_^1_%STQ* FSLMSB€€_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE MSB,LSB TO WRITE FILE SPACE LIST_^1AFSLMA ADC FSLMMA_^1_%ADC 2_^1_%ADC $8C2_^1FSLMSB ADC 0_^1FSLLSB ADC 0_^1_%SQP INIFST_^1_%JMP* MMERR1_!*****MASS MEMORY ERROR_^1*_]_^1AFBNIX ADC FIBNIX_^1_%EJT_]_^1*_*INITIALIZE FILE SPACE THREAD_^1*_]_^1INIFST LDQ* AFSLST_^1GETNLU STQ- I_,GET NEXT LOGICAL UNIT ENTRY_^1_%LDA- (ZERO),Q_^1_%INA 0_,ARE THERE AN€€Y MORE_^1_%SAN PROLUE_^1*_]_^1_%CLR A_,NO MORE, RESET FIBNIX TO ZERO_^1_%STA* (AFBNIX)_^1_%JMP* CREATE_^1*_]_^1PROLUE CLR Q_,PROCESS LOGICAL UNIT ENTRY_^1_%LLS 9_^1_%STQ* LUELTH_'SAVE LOGICAL UNIT ENTRY LENGTH_^1_%ALS 7_^1_%STA* LOGLU_(SAVE LOGICAL UNIT_^1*_]_^1_%LDQ* SECTOR_^1_%LDA ADRFMS_'SET SECTOR TO BEGINNING SECTOR LIB UNIT IF 1ST_^1_%SQZ SETSEC_^1_%LDA- 1,I_*SET START€€ SECTOR TO INITIAL VALUE, IF NOT 1ST_^1SETSEC STA* SECTOR_^1_%STA- 1,I_*SETUP STARTING SECTOR OF FILE SPACE POOL_^1*_]_^1_%LDA- 3,I_*SET AVAILABLE NUMBER OF SECTORS TO TOTAL_^1_%STA- 2,I_^1_%STA* (AFBNIX)_$SETUP TO INITIALIZE THIS FILE SPACE THREAD_^1*_]_^1_%LDQ* LUELTH_^1_%INQ -4_^1_%CLR A_^1CLRSBA SQZ WRTFST_'CLEAR SECTOR BLOCK ADDRESS IN EACH THREAD_^1_%INQ -2_^1_%STA- 4,B_^€€1_%JMP* CLRSBA_^1*_]_^1WRTFST RTJ* (AMMWRT)_$WRITE OUT FILE SPACE THREAD_^1AFIDSC ADC FIDSEC_^1_%NUM 3_^1LOGLU NUM 0_^1_%NUM 0_^1SECTOR NUM 0_^1_%SQP INCLUE_^1_%JMP* MMERR1_!*****MASS MEMORY ERROR_^1*_]_^1INCLUE LDQ- I_,INCREMENT TO NEXT LOGICAL UNIT ENTRY_^1_%ADQ* LUELTH_^1_%JMP* GETNLU_^1_%EJT_]_^1*_*CREATE FIS DIRECTORY_^1*_]_^1CREATE CLR A_^1_%LDQ* (ANWFID)_^1_%STQ* NWF€€D3_(SETUP NUMBER OF WORDS IN FIS DIRECTORY_^1*_]_^1CLRFID INQ -1_+CLEAR INITIAL FIS DIRECTORY_^1_%STA* (AFLBLK),Q_^1_%SQZ GETFID_^1_%JMP* CLRFID_^1*_]_^1GETFID LDA* FISDLU_'GET FIS DIRECTORY SPACE_^1_%LDQ* (ANWFID)_^1_%RTJ FILSPC_'ALLOCATE SPACE FOR FIS DIRECTORY_^1_%SAZ SETDS_^1_%SAP MMERR1_!*****MASS MEMORY ERROR_^1_%JMP FSERR_"*****NO MORE FILE SPACE ERROR_^1*_]_^1SETDS S€.TQ* (AFIDSC)_$SET FIS DIRECTORY SECTOR_^1_%STQ* FDSC3_^1_%RTJ MMWRIT_'WRITE INITIAL FIS DIRECTORY_^1AFLBLK ADC FILBLK_^1NWFD3 NUM 0_^1FISDLU ADC FISLU_^1_%NUM 0_^1FDSC3 NUM 0_^1_%SQP INIEXT_^1*_]_^1MMERR1 JMP MMERR_"*****MASS MEMORY ERROR_^1*_]_^1INIEXT JMP* (INITAL)_^1_%SPC 5_^1_%END_]_^__.PFILSPC CSY/ F06 P€1_%NAM FILSPC_'DECK-ID F06 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*I S S U E_!F I L E_!S P A C E_^1*_]_^1_%ENT FILSPC_'ISSUE FILE SPACE SUBROUTINE_^1*_]_^1_%EXT MMREAD_'MASS MEMORY READ SUBROUTINE_^1_%EXT MMWRIT_'MASS MEMORY WRIT€€E SUBROUTINE_^1_%EXT FSLIST_'FILE SPACE LIST ADDRESS_^1_%EXT FSLEND_'END OF FILE SPACE LIST_^1*_]_^1_%EQU ZERO(2)_%LOCATION CONTAINING ZERO_^1_%EQU ONEBIT($23)_!ONEBIT TABLE_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1_%SPC 2_^1*_$FORMAT OF FILE SPACE LIST_^1*_'A. THE FILE SPACE LIST HAS N LU ENTRIES, TERMINATED BY -0_^1*_31._!LOGICAL UNIT ENTRY 1_^1*_32._!LOGICAL UNIT E€€NTRY 2_^1*_3._+._^1*_3._+._^1*_3._+._^1*_3N._!LOGICAL UNIT ENTRY N_^1*_1N+1._)NUM -0 OR +0_^1*_]_^1*_]_^1*_'B. A LOGICAL UNIT ENTRY HAS M THREADS OF SECTOR BLOCKS_^1*_,WORD_"0_!LU ENTRY LENGTH (BITS 7-15), LU (BITS 0-6)_^1*_,WORD_"1_!BEGINNING SECTOR ADDRESS OF FILE SPACE POOL_^1*_,WORD_"2_!TOTAL NUMBER OF AVAILABLE SECTORS_^1*_,WORD_"3_!TOTAL NUMBER OF SECTORS IN THIS FILE SPACE_€€^1*_,WORD_"4_!SECTOR ADDRESS(1) HAVING NUMBER OF SECTOR(1)_^1*_,WORD_"5_!NUMBER OF SECTORS(1)_^1*_,WORD_"6_!SECTOR ADDRESS(2) HAVING NUMBER OF SECTORS(2)_^1*_,WORD_"7_!NUMBER OF SECTORS(2)_^1*_3._+._^1*_3._+._^1*_3._+._^1*_,WORD 2M+1_!SECTOR ADDRESS(M) HAVING NUMBER OF SECTORS(M)_^1*_,WORD 2M+2_!NUMBER OF SECTORS(M)_^1*_]_^1*_]_^1*_'C. EACH SECTOR BLOCK(I) HAS THE FOLLOWING FORMAT_€€^1*_,WORD_"0_!SECTOR ADDRESS OF NEXT BLOCK (0=NONE)_^1*_]_^1*_]_^1*_'D. EACH SECTOR BLOCK (WHICH IS IN ASCENDING SECTOR SIZE_^1*_*ORDER) IN THE FILE SPACE POOL HAS THE FOLLOWING FORMAT_^1*_,WORD_"0_!SECTOR ADDRESS OF NEXT EQUAL BLOCK (0=NONE)_^1*_,WORD_"1_!SECTOR ADDRESS OF NEXT GREATER BLOCK (0=NONE)_^1*_,WORD_"2_!NUMBER OF SECTORS IN THE CURRENT BLOCK_^1_%EJT_]_^1*_*ISSUE FILE SP€€ACE SUBROUTINE_^1*_]_^1*_]_^1FILSPC 000 000_*A = LOGICAL UNIT OF WHERE TO OBTAIN FILE SPACE_^1_%STA RLU_*Q = NUMBER OF SECTORS (B15=1) OR WORDS (B15=0)_^1_%STA WLU_*SAVE LU IN THE READ/WRITE LOGICAL UNITS_^1*_]_^1_%TRQ A_,CHECK IF NUMBER OF SECTORS OR WORDS_^1_%CLR Q_^1_%LLS 1_^1_%ALS 15_^1_%SQN STORNS_'SECTORS, STORE IT_^1*_]_^1_%INA WRDSEC-1_$WORDS, CONVERT TO SECTORS_^1€€_%DVI =XWRDSEC_^1STORNS STA* NUMSEC_'STORE NUMBER OF SECTORS_^1_%STA* SECBLK_'SET SECBLK = NUMSEC FOR FSPOOL SUBROUTINE_^1*_]_^1*_]_^1_%LDA- I_,SAVE THE I-REGISTER_^1_%STA* ISAVE_^1_%EJT_]_^1*_*FIND LOGICAL UNIT ENTRY AND NUMBER OF SECTORS (IF ANY)_^1*_]_^1_%LDQ =XFSLIST_^1FINDLU STQ- I_,FIND GIVEN LU ON FILE SPACE LIST_^1_%LDA- (ZERO),Q_^1_%INA 0_,CHECK FOR + OR - ZERO_^1_%SAN €€ CHKLU_^1_%SET A_^1_%JMP* FSEXIT_'NO MORE LOGICAL UNITS, EXIT WITH A = -0_^1*_]_^1CHKLU ENQ 0_,SEPARATE LU ENTRY LENGTH AND LU_^1_%LLS 9_/Q = LUELTH_^1_%ALS 7_/A = LU_^1_%EOR* RLU_^1_%SAZ FINDNS_'LOGICAL UNIT FOUND, FIND GIVEN NUMSEC_^1_%ADQ- I_^1_%JMP* FINDLU_'LOGICAL UNIT NOT FOUND, CONTINUE SEARCH_^1*_]_^1*_]_^1FINDNS STQ* LUELTH_'FIND GIVEN NUMBER OF SECTORS (SAVE LUELTH€€)_^1_%ENQ 1_^1_%STQ* RNW_*SET NUMBER OF WORDS TO READ TO ONE_^1*_]_^1_%ENQ 2_^1CHKNNS INQ 2_,CHECK WITH NEXT NUMBER OF SECTORS IN LU ENTRY_^1_%TRQ A_^1_%SUB* LUELTH_^1_%SAP GETSPC_'NO MORE, GET SPACE FROM FILE SPACE POOL OF LU_^1*_]_^1_%LDA- 1,B_*CHECK NUMBER OF SECTORS_^1_%EOR* NUMSEC_^1_%SAZ CHKNOS_'NUMBER OF SECTORS FOUND, CHECK IF NO SPACE_^1_%JMP* CHKNNS_'NUMBER OF SECTO€€RS NOT FOUND, CONTINUE SEARCH_^1*_]_^1CHKNOS ADQ- I_,CHECK IF THERE IS NO SPACE FOR THIS NUMSEC_^1_%LDA- (ZERO),Q_^1_%SAZ GETSPC_'NO SPACE, GET SPACE FROM FILE SPACE POOL OF LU_^1*_]_^1_%STA* BEGSEC_'SAVE BEGINNING SECTOR ADDRESS OF ISSUED SPACE,_^1_%RTJ* READMM_'UNTHREAD ISSUED FILE SPACE AND EXIT._^1_%JMP* DCRNAS_^1_%EJT_]_^1*_*GET FILE SPACE FROM THE FILE SPACE POOL_^1*_]_^1GET€€SPC ENA 3_,SET NUMBER OF WORDS TO READ TO THREE_^1_%STA* RNW_^1_%RTJ* FSPOOL_'SEARCH FOR A BLOCK .GE. NUMSEC_^1_%SAP TAKSPC_^1_%JMP* FSEXIT_'NO BLOCK LARGE ENOUGH, EXIT WITH A = -0_^1*_]_^1TAKSPC LDQ* CSACNS_'TAKE FILE SPACE OFF THREAD_^1_%STQ* BEGSEC_)(SAVE BEGINNING SECTOR ADDRESS OF BLOCK)_^1_%ADQ* NUMSEC_^1_%STQ* LOSSEC_'SAVE STARTING SECTOR OF LEFTOVER SECTORS_^1*_]_^1_%STA*€€ SECBLK_'SAVE EXCESS (CNS-NUMSEC), IF ANY_^1_%ENQ 1_^1_%STQ* WNW_*SETUP TO STORE ONE WORD ON WORD 1 OF SECTOR_^1_%STQ* WBI_^1_%ADQ* RBL_*Q = ADDRESS OF NSAGNS_^1_%LDA* NSACNS_'CHECK IF ANY OTHER BLOCKS OF THE SAME SIZE_^1_%SAZ CHKSTR_'NO, *STORE NSAGNS_#IN SECTOR LSALNS(1)_"*_^1*_]_^1_%RAO* WNW_^1_%RTJ* WRITMM_'YES,*STORE NSAGNS/CNS IN SECTOR NSACNS(1/2) *_^1_%ENA 1_,AND *STORE€€ NSACNS_#IN SECTOR LSALNS(1)_"*_^1_%STA* WNW_^1_%LDQ* RBL_*Q = ADDRESS OF NSACNS_^1*_]_^1CHKSTR LDA* LSALNS_'CHECK IF START OF THREAD_^1_%SAN NOTSOT_^1_%LDA- (ZERO),Q_$YES, STORE IN LU ENTRY RATHER THAN MASS MEMORY_^1_%STA- 1,I_^1_%JMP* CHKEQU_^1*_]_^1NOTSOT RTJ* WRITMM_'NO, RESTORE THREAD ON MASS MEMORY_^1*_]_^1*_]_^1CHKEQU LDA* SECBLK_'CHECK IF LENGTH OF BLOCK EQUALS NUMSEC_^1_%€€SAN SRCHLK_^1_%JMP* DCRNAS_'YES, EXIT WITH BEGINNING SECTOR ADDRESS_^1_%EJT_]_^1*_*THREAD LEFTOVER SECTORS IN FILE SPACE POOL_^1*_]_^1SRCHLK RTJ* FSPOOL_'SEARCH FOR LINK TO INSERT (THREE CASES...)_^1_%LDQ* CSACNS_%1. ALL BLOCKS LESS THAN LEFTOVER SECTORS,_^1_%STQ* NSACNS_.(0,CSACNS=0,SECBLK) INTO BUFFER._^1_%SAZ THREAD_%2. A BLOCK EQUALS THE LEFTOVER SECTORS,_^1*_?(CSACNS,NSAGNS,€€SECBLK=CNS) INTO BUFFER._^1_%STQ* NSAGNS_%3. A BLOCK IS MORE THAN THE LEFTOVER SECTORS,_^1_%LDA* SECBLK_.(0,CSACNS,SECBLK) INTO BUFFER._^1_%STA* CNS_^1_%CLR A_^1_%STA* NSACNS_^1*_]_^1THREAD STA* WBI_*THREAD LEFTOVER SECTORS ONTO FILE SPACE POOL_^1_%ENA 3_^1_%STA* WNW_^1_%LDQ* RBL_*Q = ADDRESS OF START OF BUFFER (NSACNS)_^1_%LDA* LOSSEC_'A = SECTOR LOSSEC_^1_%RTJ* WRITMM_+*STORE B€€UFFER_#IN SECTOR LOSSEC(0/1/2)*_^1*_]_^1_%ENA 1_,SETUP TO STORE ONE WORD ON WORD 1 OF SECTOR_^1_%STA* WNW_^1_%STA* WBI_^1_%LDQ* RBL_^1_%INQ LOSSEC-NSACNS Q = ADDRESS OF LOSSEC_^1_%LDA* LSALNS_'A = SECTOR LSALNS_^1_%SAN NOTBOT_'CHECK IF BEGINNING OF THREAD_^1*_]_^1_%LDA- (ZERO),Q_$YES, STORE IN LU ENTRY RATHER THAN MASS MEMORY_^1_%STA- 1,I_+AND EXIT WITH BEGINNING SECTOR ADDRESS.€€_^1_%JMP* DCRNAS_^1*_]_^1NOTBOT RTJ* WRITMM_'NO, *STORE LOSSEC_#IN SECTOR LSALNS(1)_"*_^1*_]_^1*_]_^1DCRNAS LDA- 2,I_*DECREMENT NUMBER OF AVAILABLE SECTORS_^1_%SUB* NUMSEC_^1_%STA- 2,I_^1_%CLR A_,A = 0 (FILE SPACE ISSUED)_^1_%STA FSLEND_'SET FILE SPACE LIST CHANGE FLAG_^1*_]_^1*_]_^1FSEXIT LDQ* ISAVE_(RESTORE I-REGISTER_^1_%STQ- I_^1_%LDQ* BEGSEC_'Q = BEGINNING SECTOR ADDRESS (I€€F A=0)_^1_%JMP* (FILSPC)_$EXIT_^1_%EJT_]_^1*_*FILE SPACE PARAMETERS_^1*_]_^1*_]_^1LSALNS NUM 0_$LAST SECTOR ADDRESS WITH A LESSER NUMBER OF SECTORS_^1*_]_^1CSACNS NUM 0_$CURRENT SECTOR ADDRESS WITH CURRENT NUMBER OF SECTORS_^1*_]_^1*_]_^1*_*NEXT THREE WORDS MUST BE IN ORDER_^1NSACNS NUM 0_!1. NEXT SECTOR ADDRESS WITH CURRENT NUMBER OF SECTORS_^1*_]_^1NSAGNS NUM 0_!2. NEXT SECTO€€R ADDRESS WITH GREATER NUMBER OF SECTORS_^1*_]_^1CNS_"NUM 0_!3. CURRENT NUMBER OF SECTORS IN FILE SPACE BLOCK_^1*_]_^1*_]_^1*_]_^1LOSSEC NUM 0_$STARTING SECTOR OF LEFTOVER SECTOR(S)_^1*_]_^1BEGSEC NUM 0_$BEGINNING SECTOR ADDRESS OF ISSUED FILE SPACE BLOCK_^1*_]_^1NUMSEC NUM 0_$NUMBER OF SECTORS_^1*_]_^1SECBLK NUM 0_$SECTOR BLOCK (ISSUED AND LEFTOVER)_^1*_]_^1ISAVE NUM 0_$I-R€€EGISTER SAVE LOCATION_^1*_]_^1LUELTH NUM 0_$LOGICAL UNIT ENTRY LENGTH (BITS 7-15 OF FIRST WORD)_^1_%EJT_]_^1*_*READ/WRITE MASS MEMORY OF FILE SPACE_^1*_]_^1*_]_^1*_1READ MASS MEMORY_^1READMM 000 000_^1_%STQ* RBL_*Q = BEGINNING LOCATION FOR READ_^1_%STA* RBS_*A = BEGINNING SECTOR_!FOR READ_^1*_]_^1_%RTJ MMREAD_^1RBL_"NUM 0_,STARTING ADDRESS_^1RNW_"NUM 0_,NUMBER OF WORDS_^1RLU_"€€NUM 0_,LOGICAL UNIT_^1_%NUM 0_^1RBS_"NUM 0_,STARTING SECTOR ADDRESS_^1*_]_^1_%SQM MMERR_"*****MASS MEMORY ERROR_^1_%JMP* (READMM)_$EXIT_^1_%SPC 3_^1*_1WRITE MASS MEMORY_^1WRITMM 000 000_^1_%STQ* WBL_*Q = BEGINNING LOCATION FOR WRITE_^1_%STA* WBS_*A = BEGINNING SECTOR_!FOR WRITE_^1*_]_^1_%RTJ MMWRIT_^1WBL_"NUM 0_,STARTING ADDRESS_^1WNW_"NUM 0_,NUMBER OF WORDS_^1WLU_"NUM 0_€€,LOGICAL UNIT_^1WBI_"NUM 0_,BEGINNING SECTOR INDEX_^1WBS_"NUM 0_,STARTING SECTOR ADDRESS_^1*_]_^1_%SQM MMERR_"*****MASS MEMORY ERROR_^1_%JMP* (WRITMM)_$EXIT_^1_%SPC 2_^1MMERR ENA +1_%*****MASS MEMORY ERROR, EXIT WITH A = +1_^1_%JMP* FSEXIT_^1_%EJT_]_^1*_*SEARCH FILE SPACE POOL_^1*_]_^1*_]_^1FSPOOL 000 000_^1_%LDA- 1,I_*INITIALIZE NSAGNS AND LSALNS_^1_%STA* NSAGNS_^1_%CLR A_€€^1*_]_^1SEARCH STA* LSALNS_'SEARCH NEXT BLOCK OF SECTORS_^1_%LDA* NSAGNS_^1_%STA* CSACNS_'CHECK IF NO MORE BLOCKS LEFT_^1_%SAZ NOFIND_(NO MORE LEFT, THUS NO BLOCK .GE. SECBLK_^1*_]_^1_%RTJ* HERE_)FIND ABSOLUTE ADDRESS OF NSACNS_^1HERE_!000 000_^1_%LDQ* HERE_^1_%INQ -HERE+NSACNS Q = ADDRESS OF NSACNS_^1*_8A = CURRENT SECTOR ADDRESS OF FILE SPACE BLOCK_^1_%RTJ* READMM_+*READ SECT€hOR CSACNS INTO NSACNS/NSAGNS/CNS_^1*_]_^1_%LDA* CNS_*CHECK IF LENGTH OF BLOCK (CNS) .GE. SECBLK_^1_%SUB* SECBLK_^1_%SAP FSPEXT_(YES, EXIT WITH LEFTOVER SECTORS IN A_^1*_]_^1_%LDA* CSACNS_(NO, CONTINUE SEARCH_^1_%JMP* SEARCH_^1*_]_^1*_]_^1NOFIND SET A_,NO BLOCK FOUND .GE. SECBLK (EXIT WITH A = -0)_^1*_]_^1FSPEXT JMP* (FSPOOL)_$EXIT_^1_%SPC 2_^1_%END_]_^__ hPRPEND CSY/ F07 P>1_%NAM RPEND_(DECK-ID F07 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1_%ENT RPEND_(REQUEST RPOCESSOR END_^1*_]_^1_%EQU RPEND(*)_$REQUEST RPOCESSOR END_^1*_]_^1_%END_]_^__ >PRELFIL CSY/ F08 P€1_%NAM RELFIL_'DECK-ID F08 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_8RELEASE FILE_^1*_]_^1*_*CALL RELFIL(FILNUM,REQBUF,REQIND)_^1*_]_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU MASK($23)_#ONE BIT TABLE_^1_€€%EQU NZERO($12)_"ZERO MASK TABLE_^1_%EQU PRI($EF)_$PRIORITY LEVEL_^1_%EQU ADISP($EA)_"ADDRESS OF DISPATCHER_^1_%EQU AMONI($F4)_"ADDRESS OF REQUEST ENTRY_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOC€€K HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#K€€IS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) N€€UMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU €€FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1*_1KIS DIRECTORY HEADER_^1_%EQU KIDCLK(0)_#KIS DIRECTORY CLOCK_^1_%EQU NUMKIB(1)_#NUMBER OF KIS BLOCKS_^1€€_%EQU KIBFSA(2)_#FIRST SECTOR ADDRESS OF KIS BLOCKS_^1_%EQU KIBLSA(3)_#LAST SECTOR ADDRESS OF KIS BLOCKS_^1_$EJT_]_^1*_]_^1*_*EXTERNALS_^1*_]_^1_%EXT FISLU_(FIS DIRECTORY AND BLOCK LOGICAL UNIT_^1_%EXT ABSPAR_'GETS ABSOLUTE ADDRESSES_^1_%EXT CKCFIS_'CHECKS CORE FIS_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT GETSPC_'GET SPACE_^1_%EXT MMREAD_'MASS MEMORY READ_^1_%EXT€€ MMWRIT_'MASS MEMORY WRITE_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1*_]_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1*_]_^1*_*ENTRY POINTS IN RELSPC_^1_%EXT* RELSPC_'RETURN RELEASED FILE SPACE ENTRY_^1_%EXT* STRSEC_'STARTING SECTOR OF FIRST BLOCK OF FILE SPACE_^1_%EXT* ENDSEC_'ENDING_!SECTOR OF LAST BLOCK OF FILE SPACE_^1_%EXT* NUMBLK_'NUMBER OF BLOCKS TO BE RETURNED_^1_%EJT_]_€€^1*_*CALL RELFIL(FILNUM,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(REQUEST PROCESSOR END_^1_%SPC 2_^1RELFIL 000 000_*RELEASE FILE_^1_%STQ- I_^1*_]_^1_%ENQ 3_^1FR010 INQ -1_^1_%STQ* FILNUM_'PICK UP ARG ADDRESSES_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ FR020_^1_%JMP* FR010_^1*_]_^1FR020 LDQ* (FILNUM)_^1_%SQZ FR030_^1_%SQP FR100_^1FR030 LDA- MASK+€€14_%ERROR FILE NO. 0 OR NEG_^1*_]_^1FR040 EOR- MASK+15_%ERROR EXIT_^1*_]_^1FR080 STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (RELFIL)_$RETURN_^1_%EJT_]_^1*_]_^1FR100 RTJ CKCFIS_'SEARCH CORE FIS_^1_%SAP FR110_^1*_]_^1_%LDQ* (FILNUM)_^1_%RTJ SRHFIS_'SEARCH MM FIS_^1_%SAN FR120_(FILE NOT DEFINED - ERROR_^1*_]_^1FR110 STQ- I_^1_%LDA- FISFLG,Q_$IS FILE RELEASED_^1_%SAM FR130_^1FR120 €€LDA- MASK+0_'FILE RELEASED (OR NOT DEFINED) - ERROR_^1_%JMP* FR040_^1*_]_^1FR130 LDA- LOKADR,Q_$Q HAS ADDRESS OF FIS IN CORE_^1_%SAZ FR140_^1_%LDA- MASK+1_'FILE LOCKED - ERROR_^1_%JMP* FR040_^1*_]_^1FR140 LDA- FISFLG,Q_$CHECK IF FILE PROTECTED_^1_%AND- MASK+14_^1_%SAZ FR150_^1_%RTJ CKPROT_'CHECK IF REQUEST IS PROTECTED_^1_%SAN FR150_^1_%LDA- MASK+13_%FILE DEFINED PROTECTED_^1€€_%JMP* FR040_(CANT RELEASE FROM BACKGROUND_^1_%EJT_]_^1*_]_^1FR150 LDA- FISFLG,Q_$RELEASE FILE_^1_%AND- ONEMSK+14_^1_%STA- FISFLG,Q_^1*_]_^1_%LDA- IDXCHG,Q_^1_%ARS 7_^1_%AND- ONEMSK+8_^1_%STA* INDEX_(STORE MASS MEMORY INDEX_^1*_]_^1_%INQ FH_+SETUP START OF FIS BUFFER_^1_%STQ* FISB_^1*_]_^1_%LDA- SECFIS,I_$STORE MASS MEMORY SECTOR_^1_%STA* SECTOR_^1*_]_^1FR180 RTJ MMWRIT_'WRITE€€ OUT RELEASED FIS_^1FISB_!NUM 0_^1_%ADC FISSIZ_^1_%ADC FISLU_^1INDEX NUM 0_^1SECTOR NUM 0_^1_%SQP FR200_^1*_]_^1FR190 LDA- MASK+7_!*****MASS MEMORY ERROR_^1_%JMP* FR040_(EXIT WITH BIT 7 SET_^1_%EJT_]_^1*_]_^1FILNUM NUM 0_^1REQBUF NUM 0_^1REQIND NUM 0_^1*_]_^1NUMB_!NUM 0_^1_%EJT_]_^1*_8RELEASE KIS DIRECTORY AND ITS KIS BLOCKS_^1*_]_^1FR200 LDA- KIDSEC,I_$CHECK IF INDEXE€€D DIRECTORIES EXIST_^1_%SAN RELKIS_^1_%JMP* RELFRB_'NO, RELEASE FILE RECORD BLOCKS_^1*_]_^1RELKIS STA* KDSEC_(SAVE KEY INFO SEGMENT DIRECTORY SECTOR_^1_%LDA- FISFLG,I_^1_%ARS 7_,GET KIS LOGICAL UNIT_^1_%AND- ONEMSK+6_^1_%STA* KIDLU_^1*_]_^1_%ENA WRDSEC_'SETUP KIS DIRECTORY LENGTH_^1_%MUI- KIDSIZ,I_^1_%STA* KDLTH_^1*_]_^1_%LDQ- ADRKID,I_$CHECK IF KIS DIRECTORY IN CORE_^1_%SQZ GE€€TKID_^1_%STQ* KDLOC_^1_%JMP* RELKIB_^1_%SPC 2_^1*_8GET SPACE AND READ IN KIS DIRECTORY_^1GETKID RTJ GETSPC_^1_%STQ* KDLOC_(SET KIS DIRECTORY STARTING ADDRESS_^1_%STQ- ADRKID,I_^1*_]_^1_%RTJ MMREAD_^1KDLOC ADC 0_,STARTING LOCATION_^1KDLTH ADC 0_,LENGTH_^1KIDLU ADC 0_,LOGICAL UNIT_^1_%ADC 0_,NOT USED_^1KDSEC ADC 0_,STARTING SECTOR_^1*_]_^1_%SQP FR300_^1_%JMP* FR190_"****€€*MASS MEMORY ERROR_^1*_]_^1FR300 LDQ* KDLOC_(Q = KIS DIRECTORY LOCATION_^1_%ENA 1_^1_%STA- (ZERO),Q_$SET KIS DIRECTORY CLOCK NON-ZERO_^1_%EJT_]_^1*_8RELEASE KEY INFORMATION SEGMENT BLOCKS_^1*_]_^1RELKIB LDA- NUMKIB,Q_$NUMBER OF BLOCKS TO BE RELEASED_^1_%STA* NUMB_^1_%LDA- KIBFSA,Q_$FIRST SECTOR OF LAST BLOCK TO BE RELEASED_^1_%SAZ RELKID_)(NO KIS BLOCKS)_^1_%LDQ- KIBLSA,Q_$FIRST€€ SECTOR OF FIRST BLOCK TO BE RELEASED_^1_%RTJ* PRESTR_^1_%LDQ* KIDLU_(Q = LOGICAL UNIT OF KIS_^1_%LDA- KIBSIZ,I_$A = NO. SECTORS IN EACH KIS BLOCK_^1_%RTJ RELSPC_^1_%SPC 2_^1*_8RELEASE KEY INFORMATION SEGMENT DIRECTORY_^1RELKID ENA 1_,NUMBER BLOCKS TO BE RELEASED = 1_^1_%STA* NUMB_^1_%LDA* KDSEC_(FIRST SECTOR OF LAST BLOCK TO BE RELEASED_^1_%TRA Q_,EQUALS FIRST SECTOR OF FIRST €€BLOCK_^1_%RTJ* PRESTR_^1_%LDQ* KIDLU_(Q = LOGICAL UNIT OF KIS_^1_%LDA- KIDSIZ,I_$A = NO. SECTORS IN BLOCK_^1_%RTJ RELSPC_^1_%EJT_]_^1*_*RELEASE FILE RECORD BLOCKS_^1*_]_^1RELFRB LDA- NUMFRB,I_$NUMBER OF BLOCKS TO BE RELEASED_^1_%STA* NUMB_^1_%LDA- FRBFSA,I_$FIRST SECTOR OF LAST BLOCK TO BE RELEASED_^1_%SAZ RSTFIS_)(NO FRBS)_^1_%LDQ- FRBLSA,I_$FIRST SECTOR OF FIRST BLOCK TO BE REL€€EASED_^1_%RTJ* PRESTR_^1_%LDA- FISFLG,I_^1_%AND- ONEMSK+6_^1_%TRA Q_,Q = LOGICAL UNIT OF FRBS_^1_%LDA- FRBSIZ,I_$A = NO. SECTORS IN BLOCK_^1_%AND- ONEMSK+8_^1_%RTJ RELSPC_^1_%SPC 2_^1*_*RESET FIS SO IT CAN BE RELEASED BY RACSPC PROGRAM_^1RSTFIS CLR A_^1_%STA- IDXCHG,I_$CLEAR FIS/KID CHANGE BITS AND FILE NUMBER_^1_%STA- FILENO,I_^1_%JMP FR080_(DONE_^1_%SPC 2_^1*_*PRESTORE SOME€ PARAMETERS FOR RELSPC_^1PRESTR NOP 0_^1_%STA ENDSEC_^1_%STQ STRSEC_^1_%LDA* NUMB_^1_%STA NUMBLK_^1_%JMP* (PRESTR)_^1_%SPC 5_^1_%END_]_^__ PRELSPC CSY/ F09 P€1_%NAM RELSPC_'DECK-ID F09 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*R E T U R N S P A C E F O R_!R E L E A S E_!F I L E_^1*_]_^1*_]_^1_%ENT RELSPC_'RETURN FILE SPACE SUBROUTINE_^1_%ENT STRSEC_'STARTING SECTOR ADDRESS OF RETURNED €€SPACE_^1_%ENT ENDSEC_'ENDING_!SECTOR ADDRESS OF RETURNED SPACE_^1_%ENT NUMBLK_'NUMBER OF BLOCKS TO BE RETURNED_^1*_]_^1_%EXT MMREAD_'MASS MEMORY READ_^1_%EXT MMWRIT_'MASS MEMORY WRITE_^1_%EXT FSLIST_'FILE SPACE LIST ADDRESS_^1_%EXT FSLEND_'END OF FILE SPACE LIST_^1*_]_^1_%EQU ZERO(2)_%LOCATION CONTAINING ZERO_^1_%EQU ONEBIT($23)_!ONEBIT TABLE_^1_%EQU ADISP($EA)_"ADDRESS OF€€ DISPATCHER_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1_%EQU PL($EF)_%PRIORITY LEVEL_3**MSOS 4.1**_^1_%EJT_]_^1*_]_^1*_$FORMAT OF FILE SPACE LIST_^1*_'A. THE FILE SPACE LIST HAS N LU ENTRIES, TERMINATED BY -0_^1*_31._!LOGICAL UNIT ENTRY 1_^1*_32._!LOGICAL UNIT ENTRY 2_^1*_3._+._^1*_3._+._^1*_3._+._^1*_3N._!LOGICAL UNIT ENTRY N_^1*_1N+1._)NUM -0 OR +0_^1*_]_^1*_]_^1*_'B. A LOGICAL €€UNIT ENTRY HAS M THREADS OF SECTOR BLOCKS_^1*_,WORD_"0_!LU ENTRY LENGTH (BITS 7-15), LU (BITS 0-6)_^1*_,WORD_"1_!BEGINNING SECTOR ADDRESS OF FILE SPACE POOL_^1*_,WORD_"2_!TOTAL NUMBER OF AVAILABLE SECTORS_^1*_,WORD_"3_!TOTAL NUMBER OF SECTORS IN THIS FILE SPACE_^1*_,WORD_"4_!SECTOR ADDRESS(1) HAVING NUMBER OF SECTOR(1)_^1*_,WORD_"5_!NUMBER OF SECTORS(1)_^1*_,WORD_"6_!SECTOR ADDRESS€€(2) HAVING NUMBER OF SECTORS(2)_^1*_,WORD_"7_!NUMBER OF SECTORS(2)_^1*_3._+._^1*_3._+._^1*_3._+._^1*_,WORD 2M+1_!SECTOR ADDRESS(M) HAVING NUMBER OF SECTORS(M)_^1*_,WORD 2M+2_!NUMBER OF SECTORS(M)_^1*_]_^1*_]_^1*_'C. EACH SECTOR BLOCK(I) HAS THE FOLLOWING FORMAT_^1*_,WORD_"0_!SECTOR ADDRESS OF NEXT BLOCK (0=NONE)_^1*_]_^1*_]_^1*_'D. EACH SECTOR BLOCK (WHICH IS IN ASCENDING SECTOR SI€€ZE_^1*_*ORDER) IN THE FILE SPACE POOL HAS THE FOLLOWING FORMAT_^1*_,WORD_"0_!SECTOR ADDRESS OF NEXT EQUAL BLOCK (0=NONE)_^1*_,WORD_"1_!SECTOR ADDRESS OF NEXT GREATER BLOCK (0=NONE)_^1*_,WORD_"2_!NUMBER OF SECTORS IN THE CURRENT BLOCK_^1_%EJT_]_^1*_*RETURN FILE SPACE SUBROUTINE_^1*_]_^1*_]_^1RELSPC 0_"0_,STRSEC,ENDSEC AND NUMBLK SET UP BEFORE ENTRY_^1_%STQ* RLU_*Q = LOGICAL UNIT OF €€WHERE TO RETURN FILE SPACE_^1_%STQ WLU_^1_%STA* NUMSEC_'A= NUMBER OF SECTORS TO RETURN_^1*_]_^1_%LDA- I_,SAVE I REGISTER_^1_%STA* ISAVE_^1*_]_^1_%LDQ =XFSLIST_^1FINDLU STQ- I_,FIND GIVEN LU ON FILE SPACE LIST_^1_%LDA- (ZERO),Q_^1_%ENQ 0_,SEPARATE LU ENTRY LENGTH AND LU_^1_%LLS 9_/Q = LUELTH_^1_%ALS 7_/A = LU_^1_%EOR* RLU_^1_%SAZ FINDNS_'LOGICAL UNIT FOUND, FIND GIVEN NUMSEC_^€€1_%ADQ- I_^1_%JMP* FINDLU_'LOGICAL UNIT NOT FOUND, CONTINUE SEARCH_^1*_]_^1*_]_^1FINDNS STA* WBI_*CLEAR WBI_=66*1445_^1_%STQ* LUELTH_'FIND GIVEN NUMBER OF SECTORS_*66*1445_^1_%ENQ 2_^1*_]_^1CHKNNS INQ 2_,CHECK WITH NEXT NUMBER OF SECTORS IN LU ENTRY_^1_%TRQ A_^1_%SUB* LUELTH_^1_%SAP RTNFSP_'NO MORE, RETURN SPACE TO FILE SPACE POOL OF LU_^1*_]_^1_%LDA- 1,B_*CHECK NUMBER OF SECTO€€RS_^1_%EOR* NUMSEC_^1_%SAZ RTNSST_'NUMSEC FOUND, RETURN SPACE TO SECTOR THREAD_^1_%JMP* CHKNNS_'NUMBER OF SECTORS NOT FOUND, CONTINUE SEARCH_^1*_]_^1*_]_^1RTNSST ADQ- I_,RETURN SPACE TO ITS SECTOR THREAD_^1_%LDA* ENDSEC_^1_%RTJ* WRITMM_-*STORE 1ST POINTER ONTO SECTOR ENDSEC_^1*_]_^1_%LDA* STRSEC_'SET FIRST SECTOR POINTER TO SECTOR STRSEC_^1_%STA* (WBL)_^1_%JMP* RSEXIT_'EXIT_^1_%EJ€€LSALNS_'SEARCH NEXT BLOCK OF SECTORS_^1_%LDA* NSAGNS_^1_%STA* CSACNS_'CHECK IF NO MORE BLOCKS LEFT_^1_%SAZ NOMORE_(NO MORE LEFT, THUS NO BLOCK .GE. NUMSEC_^1*_]_^1*_84 CARDS DELETED_^1*_8A = CURRENT SECTOR ADDRESS OF FILE SPACE BLOCK_^1_%RTJ* READMM_+*READ SECTOR CSACNS INTO NSACNS/NSAGNS/CNS_^1*_]_^1_%LDA* CNS_*CHECK IF LENGTH OF BLOCK (CNS) .GE. NUMSEC_^1_%SUB* NUMSEC_^1_%SAP C€€HKEBS_'YES, CHECK FOR AN EQUAL BLOCK OF SECTORS_^1*_]_^1_%LDA* CSACNS_(NO, CONTINUE SEARCH_^1_%JMP* SEARCH_^1*_]_^1NOMORE SET A_,NO BLOCK FOUND .GE. NUMSEC_^1_%EJT_]_^1*_*RETURN SPACE TO THE FILE SPACE POOL OF ITS LOGICAL UNIT_^1*_]_^1CHKEBS LDQ* CSACNS_'CHECK FOR AN EQUAL BLOCK OF SECTORS_^1_%SAZ THREAD_)A BLOCK EQUALS THE RETURNED SPACE,_^1*_?(CSACNS,NSAGNS,NUMSEC=CNS) INTO BUF€€FER._^1_%STQ* NSAGNS_)ALL BLOCKS LESS THAN THE RETURNED SPACE,_^1_%LDA* NUMSEC_.(0,CSACNS=0,NUMSEC) INTO BUFFER._^1_%STA* CNS_,A BLOCK IS MORE THAN THE THE RETURNED SPACE,_^1*_?(0,CSACNS,NUMSEC) INTO BUFFER._^1*_]_^1_%LDA* STRSEC_'CHECK IF ONE BLOCK IS BEING RETURNED_^1_%EOR* ENDSEC_^1_%SAN THRED1_^1*_]_^1_%STA* NSACNS_'YES, CLEAR NSACNS_566*1445_^1_%ENA 3_,SET NUMBER OF WORDS TO€€ WRITE TO 3_^1_%CLR Q_,SET Q = ADDRESS OF NSACNS_^1_%JMP* THRED2_^1*_]_^1THREAD LDQ* RBL_Q66*1445_^1_%INQ CSACNS-NSACNS Q= ADDRESS OF CSACNS_^1_%LDA* ENDSEC_'A = SECTOR ENDSEC_^1_%RTJ* WRITMM_+*STORE CSACNS_#IN SECTOR ENDSEC(0)_"*_^1*_]_^1THRED1 ENA 1_^1_%STA* WBI_^1_%ENA 2_^1_%ENQ NSAGNS-NSACNS SET Q = ADDRESS OF NSAGNS_^1*_]_^1THRED2 STA* WNW_^1_%ADQ* RBL_^1_%LDA* STRSEC_'A €€= SECTOR STRSEC_^1_%RTJ* WRITMM_+*STORE NSAGNS/CNS IN SECTOR STRSEC(1/2) *_^1*_]_^1_%ENA 1_,SETUP TO STORE ONE WORD ON WORD 1 OF SECTOR_^1_%STA* WNW_^1_%STA* WBI_^1_%LDQ* RBL_^1_%INQ STRSEC-NSACNS Q = ADDRESS OF STRSEC_^1_%LDA* LSALNS_'A = SECTOR LSALNS_^1_%SAN NOTBOT_'CHECK IF BEGINNING OF THREAD_^1*_]_^1_%LDA- (ZERO),Q_$YES, STORE IN LU ENTRY RATHER THAN MASS MEMORY_^1_%STA* €€(FSPADR)_^1_%JMP* RSEXIT_'EXIT_^1*_]_^1NOTBOT RTJ* WRITMM_'NO, *STORE STRSEC_#IN SECTOR LSALNS(1)_"*_^1_%EJT_]_^1*_*RETURN SPACE EXIT_^1RSEXIT CLR A_,SET FILE SPACE LIST CHANGE FLAG_^1_%STA FSLEND_^1_%LDA* NUMSEC_'INCREMENT NUMBER OF AVAILABLE SECTORS_^1_%MUI* NUMBLK_^1_%ADD- 2,I_^1_%STA- 2,I_^1_%LDA* ISAVE_(RESTORE I REGISTER_^1_%STA- I_^1_%JMP* (RELSPC)_$RETURN_^1_%EJT_]_^1*_*F€€ILE SPACE PARAMETERS_^1*_]_^1*_]_^1LSALNS NUM 0_$LAST SECTOR ADDRESS WITH A LESSER NUMBER OF SECTORS_^1*_]_^1CSACNS NUM 0_$CURRENT SECTOR ADDRESS WITH CURRENT NUMBER OF SECTORS_^1*_]_^1*_]_^1*_*NEXT THREE WORDS MUST BE IN ORDER_^1NSACNS NUM 0_!1. NEXT SECTOR ADDRESS WITH CURRENT NUMBER OF SECTORS_^1*_]_^1NSAGNS NUM 0_!2. NEXT SECTOR ADDRESS WITH GREATER NUMBER OF SECTORS_^1*_]_€€^1CNS_"NUM 0_!3. CURRENT NUMBER OF SECTORS IN FILE SPACE BLOCK_^1*_]_^1*_]_^1*_]_^1STRSEC NUM 0_,SECTOR ADR OF FIRST(START)BLOCK OF RTN SPACE_^1*_]_^1ENDSEC NUM 0_,SECTOR ADR OF LAST(END)BLOCK OF RTN SPACE_^1*_]_^1NUMSEC NUM 0_$NUMBER OF SECTORS PER BLOCK_^1*_]_^1NUMBLK NUM 0_$NUMBER OF BLOCKS TO BE RELEASED_^1*_]_^1LUELTH NUM 0_$LOGICAL UNIT ENTRY LENGTH (BITS 7-15 OF FIRST €€WORD)_^1*_]_^1FSPADR NUM 0_$FILE SPACE POOL ADDRESS OF LU ENTRY_^1*_]_^1ISAVE NUM 0_$SAVE FOR I REGISTER_^1_%EJT_]_^1*_*READ/WRITE MASS MEMORY OF FILE SPACE_^1*_]_^1*_]_^1*_1READ MASS MEMORY_^1READMM 000 000_^1*_81 CARD DELETED_^1_%STA* RBS_*A = BEGINNING SECTOR_!FOR READ_^1*_]_^1_%RTJ MMREAD_^1RBL_"NUM 0_,STARTING LOCATION_^1_%NUM 3_,NUMBER OF WORDS_^1RLU_"NUM 0_,LOGICAL U€€NIT_^1_%NUM 0_,INDICATE SECTOR ADDRESSING_^1RBS_"NUM 0_,STARTING SECTOR_^1*_]_^1_%SQP RMMEXT_'CHECK IF MASS MEMORY ERROR_^1_%RTJ* MMERR *****MM ERROR, PRINT MESSAGE_,**MSOS 4.1**_^1RMMEXT JMP* (READMM)_$EXIT_^1_%SPC 3_^1*_1WRITE MASS MEMORY_^1WRITMM 000 000_^1_%STQ* WBL_*Q = BEGINNING LOCATION FOR WRITE_^1_%STA* WBS_*A = BEGINNING SECTOR_!FOR WRITE_^1*_]_^1_%RTJ MMWRIT_^1WBL€€_"NUM 0_,STARTING LOCATION_^1WNW_"NUM 1_,NUMBER OF WORDS_^1WLU_"NUM 0_,LOGICAL UNIT_^1WBI_"NUM 0_,BEGINNING SECTOR INDEX_^1WBS_"NUM 0_,STARTING SECTOR_^1*_]_^1WRTCMP SQP WMMEXT_'CHECK IF MASS MEMORY ERROR_^1_%RTJ* MMERR *****MM ERROR, PRINT MESSAGE_,**MSOS 4.1**_^1WMMEXT JMP* (WRITMM)_$EXIT_^1_%SPC 2_^1*_1MASS MEMORY ERROR MESSAGE_/**MSOS 4.1**_^1MMERR 000 000_L**MSOS 4.1€€**_^1_%LDA- PL_M**MSOS 4.1**_^1_%ALS 4_N**MSOS 4.1**_^1_%EOR- PL_+CONSTRUCT FWRITE REQUEST_)**MSOS 4.1**_^1_%EOR* REQCOD_I**MSOS 4.1**_^1_%STA* REQ_L**MSOS 4.1**_^1_%RTJ* ABS_L**MSOS 4.1**_^1ABS_"NOP 0_N**MSOS 4.1**_^1_%LDA* ABS_*CALCULATE THE ABSOLUTE_+**MSOS 4.1**_^1_%ADD* OFF1_)ADDRESSES FOR THE MONITOR CALL_"**MSOS 4.1**_^1_%STA* COM_L**MSOS 4.1**_^1_%ADD* OFF2_K**MSOS 4.1**_€€^1_%STA* MSG_L**MSOS 4.1**_^1_%LDA- I_N**MSOS 4.1**_^1_%STA* ISVERR_I**MSOS 4.1**_^1*_Z**MSOS 4.1**_^1_%RTJ- (AMONI)_%PRINT ERROR MESSAGE_.**MSOS 4.1**_^1REQ_"ADC 0_N**MSOS 4.1**_^1COM_"ADC 0_N**MSOS 4.1**_^1_%ADC 0_N**MSOS 4.1**_^1_%ADC $18FC_(SYSTEM COMMENT DEVICE_,**MSOS 4.1**_^1_%ADC LMSG_K**MSOS 4.1**_^1MSG_"ADC 0_N**MSOS 4.1**_^1_%JMP- (ADISP)_H**MSOS 4.1**_^1*_Z**MSOS €€4.1**_^1CP_#LDA* ISVERR_I**MSOS 4.1**_^1_%STA- I_N**MSOS 4.1**_^1_%JMP* (MMERR)_H**MSOS 4.1**_^1*_Z**MSOS 4.1**_^1REQCOD ADC $4C00_(FORMATTED WRITE REQUEST_***MSOS 4.1**_^1OFF1_!ADC CP-ABS_I**MSOS 4.1**_^1OFF2_!ADC ERRMSG-CP_F**MSOS 4.1**_^1ISVERR NUM 0_N**MSOS 4.1**_^1*_Z**MSOS 4.1**_^1ERRMSG ALF $,F.M. ERROR 1$_@**MSOS 4.1**_^1_%EQU LMSG(*-ERRMSG)_A**MSOS 4.1**_^1_%SPC 2_^€1_%END_]_^__ PDEFIDX CSY/ F10 P€1_%NAM DEFIDX_'DECK-ID F10 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_$CALL DEFIDX(FILNUM,NUMEKV,KEYLGH,LU,REQBUF,REQIND)_^1*_]_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU ZROMSK($13)_!ZERO MASK TABLE€€_^1_%EQU MASK($23)_#ONE BIT TABLE_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQ€€U WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FIL€€E CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH€€+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRB€€SIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1*_1KIS DIRECTORY HEADER_^1_%EQU KIDCLK(0)_#KIS DIRECTORY CLOCK_^1_%EQU NUMKIB(1)_#NUMBER OF KIS BLOCKS_^1_%EQU KIBFSA(2)_#FIRST SECTOR ADDRESS OF KIS BLOCKS_^1_%EQU KIBLSA(3)_#LAST SECTOR ADDRESS OF KIS BLOCKS_^1_%EJT_]_^1*_€€*EXTERNALS_^1*_]_^1_%EXT FDTINT_'FILE/DIRECTORY TIMEOUT INTERVAL_^1_%EXT LOG1A_(MONITOR LOGICAL UNIT TABLE OF PHYSTBS_^1*_]_^1_%EXT ABSPAR_'GETS ABSOLUTE ADDRESSES_^1_%EXT CKCFIS_'CHECKS CORE FIS_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT GETSPC_'GET CORE SPACE_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1*_]_^1_%EXT* SQRTFM_'FILE MANAGER SQUARE ROOT_^1_%EXT* FILSP€€C_'MM SPACE ALLOCATOR_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_$CALL DEFIDX(FILNUM,NUMEKV,KEYLGH,LU,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(REQUEST PROCESSOR LENGTH_^1_%SPC 2_^1DEFIDX 000 000_*DEFINE FILE INDEXED_^1_%STQ- I_^1*_]_^1_%ENQ 6_,PICK UP ARGUMENT ADDRESSES_^1DX010 INQ -1_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%S€€QZ DX020_^1_%JMP* DX010_^1*_]_^1DX020 LDQ* (FILNUM)_$CHECK FILE NUMBER_^1_%SQZ DX030_^1_%SQP DX100_^1DX030 LDA- MASK+14_%ILLEGAL FILE NUMBER_^1*_]_^1DX040 EOR- MASK+15_%ERROR EXIT_^1*_]_^1DX080 STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (DEFIDX)_$RETURN_^1_%SPC 3_^1DX100 RTJ CKCFIS_'CHECK FIS IN CORE_^1_%SAP DX110_^1*_]_^1_%LDQ* (FILNUM)_$NOT IN CORE_^1_%RTJ SRHFIS_'CHECK MM_^€€1_%SAN DX120_^1*_]_^1DX110 STQ- I_,I = CORE FIS ADDRESS_^1_%LDA- FISFLG,Q_$IS FILE RELEASED_^1_%SAM DX130_^1DX120 LDA- MASK+0_'RELEASED OR NO SUCH FILE - ERROR_^1_%JMP* DX040_^1_%EJT_]_^1*_]_^1DX130 LDA- KIDSEC,Q_$HAS FILE BEEN DEF INDEXED_^1_%SAN DX150_^1*_]_^1_%LDA- FISFLG,Q_$CHECK IF FILE PROTECTED_^1_%AND- MASK+14_^1_%SAZ DX140_^1_%RTJ CKPROT_'CHECK IF REQUEST IS PROTEC€€TED_^1_%SAN DX140_^1_%LDA- MASK+13_%FILE PROT - ERROR_^1_%JMP* DX040_^1*_]_^1DX140 LDA- FRBFSA,Q_$DOES FILE HAVE RECORDS_^1_%SAZ DX160_^1DX150 LDA- MASK+11_%ERROR -CANT HAVE DATA BEFORE DEFINING_^1_%JMP* DX040_^1*_]_^1DX160 LDA* (KEYLGH)_$CHECK IF KEY LENGTH NOT ZERO_^1_%LDQ- ONEMSK+5_^1_%LAQ Q_^1_%SQZ DX180_(KEY LENGTH ZERO, ERROR_^1_%ALS 1_^1_%SAP DX170_(NOT INDEXED/ORDE€€RED_^1_%INQ -1_^1_%SQZ DX170_^1_%LDA- MASK+12_%KEY LENGTH NOT ONE ON INDEXED/ORDERED_^1_%JMP* DX040_^1*_]_^1DX170 ALS 1_,CHECK IF FIFO OPTION SELECTED_^1_%SAP DX175_^1_%AND- MASK+1_'YES, THEN INDEXED/LINKED MUST ALSO BE SELECTED_^1_%SAZ DX190_(ERROR, SET BIT 14_^1*_]_^1DX175 LDQ* (LU)_)CHECK IF LOGICAL UNIT POSITIVE_^1DX180 SQZ DX190_^1_%SQM DX190_^1_%TCQ A_,CHECK IF GR€€EATER THAN MAX. NO. OF LUS_^1_%ADD* (ALOG1A)_^1_%SAM DX190_^1_%LDQ* (ALOG1A),Q_^1_%LDA- 8,Q_*CHECK IF LOGICAL UNIT IS A MASS MEMORY DEVICE_^1_%ALS 5_^1_%AND- ONEMSK+2_^1_%INA -2_^1_%SAN DX190_^1*_]_^1_%LDA* (NEKV)_'CHECK IF NUMBER OF EXPECTED KEY VALUES IS POS._^1_%SAZ DX190_^1_%SAP DX200_^1DX190 JMP* DX030_(ILLEGAL PARAMETER, SET BIT 14_^1_%EJT_]_^1*_]_^1DX200 RTJ SQRTFM_€€'GET SQUARE ROOT_^1_%STA* SRNEKV_'SAVE SQRT OF NUMBER OF EXPECTED KEY VALUES_^1*_]_^1_%INA KIDHDR+WRDSEC-1_^1_%CLR Q_,GET NUMBER OF SECTORS FOR KIS DIRECTORY_^1_%DVI* WPS_*KIDSIZ = (KIDHDR+SRNEKV+WRDSEC-1)/WRDSEC_^1_%STA- KIDSIZ,I_^1*_]_^1_%EOR- MASK+15_%SET SIGN BIT_^1_%TRA Q_^1_%LDA* (LU)_^1_%RTJ FILSPC_^1_%SAZ DX220_^1_%TRA Q_^1_%LDA- MASK+7_!*****MASS MEMORY ERROR_^1_%SQP€€ DX210_^1*_]_^1_%LDA- MASK+8_!*****NO MORE FILE SPACE ERROR_^1DX210 JMP* DX040_^1*_]_^1DX220 STQ- KIDSEC,I_$Q CONTAINS SECTOR NO. STORE IN FIS_^1*_]_^1_%LDA* (LU)_)STORE KIS LOGICAL UNIT IN FIS_^1_%ALS 7_^1_%EOR- FISFLG,I_^1_%STA- FISFLG,I_^1*_]_^1_%ENA WRDSEC_'COMPUTE NUMBER OF WORDS IN KIS DIRECTORY_^1_%MUI- KIDSIZ,I_^1_%STA* KIDWDS_^1*_]_^1_%RTJ GETSPC_'GET SPACE FOR KIS€€ DIRECTORY_^1_%STQ* KIDLOC_^1*_]_^1_%LDQ* KIDWDS_'CLEAR KIS DIRECTORY INITIALLY_^1_%CLR A_^1DX230 INQ -1_^1_%STA* (KIDLOC),Q_^1_%SQZ DX240_^1_%JMP* DX230_^1_%EJT_]_^1*_]_^1FILNUM NUM 0_$1_$CARDS ORDERED_^1NEKV_!NUM 0_$2_^1KEYLGH NUM 0_$3_^1LU_#NUM 0_$4_^1REQBUF NUM 0_$5_^1REQIND NUM 0_$6_^1*_]_^1SRNEKV NUM 0_^1KIDLOC NUM 0_^1KIDWDS NUM 0_^1WPS_"ADC WRDSEC_^1ALOG1A ADC€€ LOG1A_^1_%EJT_]_^1*_]_^1DX240 LDA* (NEKV)_'SAVE NUMBER OF EXPECTED KEY VALUES_^1_%STA- NUMEKV,I_^1*_]_^1_%LDA* (KEYLGH)_$SAVE LINKED, ORDERED, AND FIFO INDICATORS_^1_%AND- ZROMSK+12_^1_%EOR- FRBSIZ,I_$INCLUDE FRB SIZE_^1_%STA- FISIND,I_^1_%TRA Q_^1*_]_^1_%LDA* (KEYLGH)_$SAVE KEY LENGTH_^1_%AND- ONEMSK+5_^1_%STA- KEYLTH,I_^1*_]_^1_%INA 2_,KIBSIZ = ((KIBHDR+(2(1+FIFO)+KEYLTH)*SR€€NEKV_^1_%QLS 2_7+WRDSEC-1)/WRDSEC)_^1_%SQP DX250_^1_%INA 2_,FIFO SELECTED, ADD TWO MORE POINTER WORDS_^1DX250 MUI* SRNEKV_^1_%INA KIBHDR+WRDSEC-1_^1_%DVI* WPS_^1_%STA- KIBSIZ,I_^1*_]_^1_%LDA FDTINT_'SET KIS DIRECTORY CLOCK_^1_%STA* (KIDLOC)_^1*_]_^1_%ENA -3_+SET FIS AND KIS DIRECTORY CHANGE BITS_^1_%AND- IDXCHG,I_^1_%INA 3_^1_%STA- IDXCHG,I_^1_%LDA* KIDLOC_'THREAD KIS DIREC€fTORY ONTO ITS FIS_^1_%STA- ADRKID,I_^1_%CLR A_^1_%JMP DX080_(EXIT NORMALLY_^1_%SPC 2_^1_%END_]_^__ fPSQRTFM CSY/ F11 P€1_%NAM SQRTFM_'DECK-ID F11 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1_%ENT SQRTFM_'FILE MANAGER SQUARE ROOT ROUTINE_^1*_]_^1SQRTFM 000 000_^1_%STA* X_,SAVE X (INPUT NUMBER TO BE SQUARE ROOTED)_^1*_]_^1ITERAT STA* YI_+Y(0) = X_^1_%CLR €8Q_^1_%LDA* X_^1_%DVI* YI_+USE NEWTON-RHAPSON METHOD_^1_%SUB* YI_^1_%ARS 1_,Y(I+1) = Y(I) + 1/2(X/Y(I)-Y(I))_^1_%INA 0_^1_%SAZ SREXIT_^1_%ADD* YI_^1_%JMP* ITERAT_'DO NEXT ITERATION_^1*_]_^1SREXIT LDA* YI_+EXIT WITH SQUARE ROOT IN A_^1_%JMP* (SQRTFM)_^1_%SPC 2_^1X_$NUM 0_^1YI_#NUM 0_^1_%SPC 2_^1_%END_]_^__8PLOKFIL CSY/ F12 P€1_%NAM LOKFIL_'DECK-ID F12 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*CALL LOKFIL(FILNUM,FILCOM,REQBUF,REQIND)_^1*_]_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU MASK($23)_#ONE BIT TABLE_^1*_]_^1*_1HEA€€DER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^€€1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO €€NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU€€ KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%€€EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1_%EXT ABSPAR_'GETS ABSOLUTE ADDRESSES_^1_%EXT CKCFIS_'CHECKS CORE FIS_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1_%EXT LOKTBL_'LOCK FILE TABLE_^1_%EXT LOKNOE_'LOCK FILE TABLE NUMBER OF ENTRIES_^1_%EXT LOKNEU_'LOCK FILE TABLE€€ NO. OF ENTRIES USED_^1*_]_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_*CALL LOKFIL(FILNUM,FILCOM,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(REQUEST PROCESSOR LENGTH_^1_%SPC 2_^1LOKFIL 000 000_*LOCK FILE_^1_%STQ- I_^1*_]_^1_%ENQ 4_,PICK UP ADDRESSES OF ARGUMENTS_^1LF010 INQ -1_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ LF020_^1€€_%JMP* LF010_^1*_]_^1LF020 LDQ* (FILNUM)_$CHECK FN GE 1_^1_%SQZ LF030_^1_%SQP LF100_^1LF030 LDA- MASK+14_%ILLEGAL FILE NUMBER_^1*_]_^1LF040 EOR- MASK+15_%ERROR EXIT_^1*_]_^1LF080 STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (LOKFIL)_^1_%EJT_]_^1*_]_^1LF100 RTJ CKCFIS_'CHECK IF FIS IS IN CORE_^1_%SAP LF110_^1*_]_^1_%LDQ* (FILNUM)_^1_%RTJ SRHFIS_'SEARCH FIS ON MM -NOT IN CORE_^1_%S€€AN LF120_^1*_]_^1LF110 LDA- FISFLG,Q_$CHECK IF RELEASED_^1_%SAM LF130_^1LF120 LDA- MASK+0_'RELEASED OR NOT DEFINED, ERROR_^1_%JMP* LF040_^1*_]_^1LF130 STQ* FISADR_'SAVE FIS ADDRESS_^1_%LDQ- LOKADR,Q_$CHECK IF FILE LOCKED_^1_%SQZ LF150_(SKIP IF NO_^1_%LDA- 1,Q_^1_%AND- ONEMSK+14_#PICKUP COMBINATION FROM LOCK TABLE_^1_%SUB* (FILCOM)_$CHECK IF COMBINATIONS ARE IDENTICAL_^1_%SAZ €€ LF135_(SKIP IF YES_^1_%LDA- MASK+1_'ALREADY LOCKED WITH DIFFERENT COMB._^1_%JMP* LF040_^1LF135 JMP* LF180_^1*_]_^1LF150 RTJ CKPROT_'DONT LOCK IF REQUEST UNPROTECTED_^1_%SAN LF160_^1_%LDA- MASK+13_%UNPROTECTED PROGRAM CAN NOT LOCK A FILE_^1_%JMP* LF040_^1*_]_^1LF160 LDA* (FILCOM)_$CHECK NEW COMBINATION_^1_%AND- ONEMSK+14_^1_%SAN LF170_^1_%JMP* LF190_(IGNORE IF ZERO_^1*_]_^1LF€€170 STA* TEMSAV_'SAVE IT_^1*_]_^1*_]_^1_%RAO LOKNEU_'BUMP NO. OF ENTRIES IN USE_^1_%LDQ* ADLKNO_'SEARCH FOR EMPTY SLOT IN TABLE_^1_%QLS 1_^1LF174 INQ -2_^1_%LDA* (ADRLOK),Q_^1_%SAZ LF176_(SKIP IF SLOT FOUND_^1_%JMP* LF174_^1*_]_^1LF176 ADQ* ADRLOK_'SET Q TO ABSOLUTE ADDRESS OF ENT_^1_%LDA* TEMSAV_'STORE COMBINATION AND FILE NO. IN_^1_%STA- 1,Q_,LOCK TABLE_^1_%LDA* (FILNUM)_^€€1_%STA- (ZERO),Q_^1_%TRQ A_^1_%LDQ* FISADR_^1_%STA- LOKADR,Q_$STORE ENTRY ADDRESS IN FIS HEADER_^1*_]_^1LF180 LDA- MASK+1_'SET FILE LOCKED BIT AND RETURN_(63*1355_^1LF190 JMP* LF080_^1TEMSAV NUM 0_,SAVED COMB. WORD FOR LOCK TABLE_^1FISADR NUM 0_,SAVED FIS CORE ADDRESS_^1ADRLOK ADC LOKTBL_'FILE LOCK TABLE_^1ADLKNO ADC LOKNOE_'FILE LOCK TABLE NUMBER OF ENTRIES_^1_%SPC 2_^1_%S€zPC 2_^1FILNUM NUM 0_,1_!CARDS ORDERED_^1FILCOM NUM 0_,2_^1REQBUF NUM 0_,3_^1REQIND NUM 0_,4_^1_%SPC 2_^1_%END_]_^__ zPUNLFIL CSY/ F13 P€1_%NAM UNLFIL_'DECK-ID F13 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*CALL UNLFIL(FILNUM,FILCOM,REQBUF,REQIND)_^1*_]_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU MASK($23)_#ONE BIT TABLE_^1*_]_^1*_1HEA€€DER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^€€1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO €€NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU€€ KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%€€EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1_%EXT ABSPAR_'GETS ABSOLUTE ADDRESSES_^1_%EXT CKCFIS_'CHECKS CORE FIS_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1_%EXT LOKNEU_'FILE LOCK TABLE NUMBER OF ENTRIES_^1*_]_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_*CALL U€€NLFIL(FILNUM,FILCOM,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(REQUEST PROCESSOR LENGTH_^1_%SPC 2_^1UNLFIL 000 000_*UNLOCK FILE_^1_%STQ- I_^1*_]_^1_%ENQ 4_,PICK UP ADDRESSES OF ARGUMENTS_^1UN010 INQ -1_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ UN020_^1_%JMP* UN010_^1*_]_^1UN020 LDQ* (FILNUM)_$CHECK FN GE 1_^1_%SQZ UN030_^1_%SQP UN€€100_^1UN030 LDA- MASK+14_%ILLEGAL FILE NUMBER_^1*_]_^1UN040 EOR- MASK+15_%ERROR EXIT_^1*_]_^1UN080 STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (UNLFIL)_^1_%EJT_]_^1*_]_^1UN100 RTJ CKCFIS_'FIS MUST BE IN CORE_^1_%SAP UN110_^1*_]_^1_%LDQ* (FILNUM)_^1_%RTJ SRHFIS_'SEARCH FIS ON MM -NOT IN CORE_^1_%SAN UN120_^1*_]_^1UN110 LDA- FISFLG,Q_$CHECK IF RELEASED_^1_%SAM UN130_^1UN120 LDA- M€€ASK+0_'RELEASED OR NOT DEFINED, ERROR_^1_%JMP* UN040_^1*_]_^1UN130 RTJ CKPROT_(CHECK IF REQUEST IS UNPROTECTED_^1_%SAN UN140_^1_%LDA- MASK+13_%UNPROTECTED REQUEST CAN NOT UNLOCK FILES_^1_%JMP* UN040_^1*_]_^1UN140 STQ* FISADR_'SAVE FIS CORE ADDRESS_^1_%LDQ- LOKADR,Q_$CHECK IF FILE LOCKED_^1_%SQN UN150_^1_%LDA- MASK+1_'NOT LOCKED_^1_%JMP* UN040_^1*_]_^1UN150 LDA- 1,Q_*PICKUP COM€€BINATION_^1_%EOR* (FILCOM)_^1_%AND- ONEMSK+14_^1_%SAZ UN160_^1_%LDA- MASK+10_%WRONG COMBINATION -ERROR_^1_%JMP* UN040_^1*_]_^1UN160 STA- (ZERO),Q_$UNLOCK FILE - REMOVE LOCK TABLE_^1_%STA- 1,Q_+ENTRY AND CLEAR FIS WORD_^1_%LDQ* FISADR_^1_%STA- LOKADR,Q_^1_%LDQ* (ADLKUN)_$DECREMENT NO. OF USED ENTRIES_^1_%INQ -1_^1_%STQ* (ADLKUN)_^1_%JMP* UN080_^1_%SPC 2_^1FISADR NUM 0_,SAVED FI€ΔS ADDRESS_^1ADLKUN ADC LOKNEU_'FILE LOCK TABLE NO. OF ENTRIES_^1*_]_^1_%SPC 2_^1FILNUM NUM 0_,1_!CARDS ORDERED_^1FILCOM NUM 0_,2_^1REQBUF NUM 0_,3_^1REQIND NUM 0_,4_^1_%SPC 2_^1_%END_]_^__ ΔPSTOSEQ CSY/ F14 P€1_%NAM STOSEQ_'DECK-ID F14 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*CALL STOSEQ(FILNUM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1*_]_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU MASK($23)_#ONE BIT TABLE_€€^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER €€SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDRESS (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) S€€ECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE REC€€ORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZ€€E (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1_%EXT ABSPAR_'ABSOLUTIZES APL_^1_%EXT CKCFIS_'CHECKS CORE FOR FISB_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT CKUADR_'CHECK LEGALITY OF UNPROTECTED ADDRESS_^1_%EXT MMWRIT_'MM WRITE SUB_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1*_]_^1_%EXT* FI€€LSPC_'MM SPACE ALLOCATOR SUB_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_*CALL STOSEQ(FILNUM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(LENGTH OF REQUEST PROCESSOR_^1_%SPC 2_^1STOSEQ 000 000_*STORE SEQUENTIAL_^1_%STQ- I_^1*_]_^1_%ENQ 6_,GET ABSOLUTE ADDRESSES OF ALL PARAMETERS_^1SS010 INQ -1_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM€€_^1_%STA* FILNUM,Q_^1_%SQZ SS020_^1_%JMP* SS010_^1*_]_^1SS020 LDQ* (FILNUM)_$GET FILE NUMBER_^1_%SQZ SS030_^1_%SQP SS100_^1SS030 LDA- MASK+14_%FILE NO ERROR SET BIT 14_^1*_]_^1SS040 EOR- MASK+15_%ERROR EXIT_^1*_]_^1SS080 STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (STOSEQ)_^1_%EJT_]_^1*_]_^1SS100 RTJ CKCFIS_'CHECK IF FIS IN CORE_^1_%SAP SS110_^1*_]_^1_%LDQ* (FILNUM)_$NOT IN CORE €€CHECK MM_^1_%RTJ SRHFIS_^1_%SAN SS120_(FILE NOT DEFINED_^1*_]_^1SS110 STQ- I_,I = FIS CORE ADDRESS_^1_%LDA- FISFLG,Q_$CHECK RELEASE STATUS_^1_%SAM SS130_^1SS120 LDA- MASK+0_'ERROR FILE NOT DEFINED_^1_%JMP* SS040_(SET BIT 0_^1*_]_^1SS130 LDA- KIDSEC,Q_$CHECK IF FILE INDEXED_^1_%SAZ SS140_^1_%LDA- MASK+11_%FILE DEFINED INDEXED CANT STORE SEQUENTIAL_^1_%JMP* SS040_^1*_]_^1SS140€€ LDA- FISFLG,Q_$CHECK IF FILE PROTECTED_^1_%AND- MASK+14_^1_%SAZ SS150_^1_%RTJ CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SAN SS150_^1_%LDA- MASK+13_%FILE PROTECTED AND UNPROTECTED STORE ATTEMPT_^1_%JMP* SS040_(REJECT CALL_^1*_]_^1SS150 LDA- FRBSIZ,Q_$GET FILE RECORD BLOCK SIZE_^1_%AND- ONEMSK+8_^1_%MUI* WPS_^1_%STA* NWFRB_^1_%INA -FRBHDR_^1_%SUB* (RECLTH)_$CHECK IF MAXIMUN RECOR€€D LENGTH EXCEEDED_^1_%SAP SS200_^1_%LDA- MASK+2_'RECORD LENGTH GREATER THAN MAXIMUM LENGTH_^1_%JMP* SS040_(SET BIT 2 OF INDICATOR WORD_^1_%EJT_]_^1*_]_^1SS200 CLR Q_,CHECK IF FIRST RECORD POINTER ADDRESS LEGAL_^1_%LDA* RECPTR_^1_%RTJ* (ACUADR)_^1_%INA 1_,CHECK IF SECOND RECORD POINTER ADDRESS LEGAL_^1_%RTJ* (ACUADR)_^1*_]_^1_%LDA* RECBUF_'CHECK IF FIRST WORD OF RECORD BUFFER LE€€GAL_^1_%RTJ* (ACUADR)_^1*_]_^1_%LDA* (RECLTH)_$CHECK IF RECORD LENGTH POSITIVE AND NON-ZERO_^1_%SAZ SS220_^1_%SAP SS230_^1SS220 JMP* SS030_(NO, ILLEGAL PARAMETER_^1*_]_^1SS230 STA* (RECBUF)_$SET RECORD COUNT IN FIRST WORD OF BUFFER_^1_%STA* NW1_^1_%INA FRBHDR_^1_%STA* NW2_*SETUP NEW FRB CALL, IF NEEDED_^1*_]_^1_%LDA* RECBUF_'STORE BUFFER ADDRESS_^1_%STA* CA1_^1_%INA -FRBHDR_^€€1_%STA* CA2_*SETUP NEW FRB CALL, IF NEEDED_^1_%STA* CA3_^1*_]_^1_%LDA- FISFLG,I_^1_%AND- ONEMSK+6_$GET LOGICAL UNIT_^1_%STA* LU1_^1_%STA* LU2_^1_%STA* LU3_^1*_]_^1_%LDA- FRBFSA,I_$CHECK IF NEW FRB_^1_%SAZ SS240_^1_%LDA* NWFRB_^1_%SUB- FRBNIX,I_^1_%SUB* (RECLTH)_^1_%SAP SS300_^1SS240 JMP* SS400_(NEED NEW FRB BLOCK_^1_%EJT_]_^1*_]_^1FILNUM ADC 0_^1RECPTR ADC 0_^1RECBUF ADC 0_^1€€RECLTH ADC 0_^1REQBUF ADC 0_^1REQIND ADC 0_^1SAVE1 NUM 0_^1SAVE2 NUM 0_^1SAVE3 NUM 0_^1NWFRB NUM 0_^1WPS_"ADC WRDSEC_^1ACUADR ADC CKUADR_^1AMMWRT ADC MMWRIT_^1_%EJT_]_^1*_*STORE RECORD IN LAST RECORD BLOCK_^1SS300 LDQ- FRBLSA,I_$ENOUGH ROOM IN THIS FRB BLOCK_^1_%LDA- FRBNIX,I_^1_%STQ* FRBSC1_'STORE SECTOR/INDEX_^1_%STA* FRBID1_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE OUT RECOR€€D IN CURRENT FILE RECORD BLOCK_^1CA1_"ADC 0_^1NW1_"ADC 0_^1LU1_"NUM 0_^1FRBID1 NUM 0_^1FRBSC1 NUM 0_^1_%SQP SS320_^1_%JMP* MMERR_"*****MASS MEMORY ERROR_^1*_]_^1SS320 LDA* (RECLTH)_$STORE NEW INDEX IN FRBNIX_^1_%ADD- FRBNIX,I_^1_%STA- FRBNIX,I_^1_%RAO- NRLFRB,I_$INCREMENT NUMBER RECORDS IN LAST FRB BLOCK_^1*_]_^1_%LDQ* FRBSC1_'STORE RECORD POINTER AND SET CHANGE BIT_^1_%LDA*€€ FRBID1_^1_%JMP* SS500_^1_%EJT_]_^1*_8REQUIRE NEW BLOCK_^1SS400 LDQ* NWFRB_^1_%LDA* LU1_^1_%RTJ FILSPC_'ROUTINE WILL GET MM_^1_%SAZ SS410_^1_%SAM SS405_^1_%JMP* MMERR_"*****MASS MEMORY ERROR_^1SS405 LDA- MASK+8_!*****NO MORE FILE SPACE ERROR_^1_%JMP* SS040_^1*_]_^1SS410 STQ* SA2_*HAVE MM STORE SEC ADD OF THIS BLOCK_^1_%LDQ* CA2_^1_%LDA- (ZERO),Q_^1_%STA* SAVE1_"SAVE USERS COR€€E_^1_%LDA- 1,Q_^1_%STA* SAVE2_^1_%LDA- 2,Q_^1_%STA* SAVE3_^1_%LDA- FRBLSA,I_$SET BACKWARD FRB POINTER_^1_%STA- (ZERO),Q_^1_%CLR A_,CLEAR FORWARD FRB POINTER AND_^1_%STA- 1,Q_*NUMBER OF RECORDS IN THIS FRB_^1_%STA- 2,Q_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE FIRST RECORD IN NEW FILE RECORD BLOCK_^1CA2_"ADC 0_^1NW2_"ADC 0_^1LU2_"NUM 0_^1_%NUM 0_^1SA2_"ADC 0_^1_%SQP SS420_^1_%JMP* SS430€€_"*****MASS MEMORY ERROR_^1*_]_^1SS420 LDQ* CA3_*SETUP FORWARD POINTER AND NUMREC ON LAST FRB_^1_%LDA* SA2_^1_%STA- (ZERO),Q_^1_%LDA- NRLFRB,I_^1_%STA- 1,Q_^1_%LDQ- FRBLSA,I_$CHECK IF FIRST FRB_^1_%SQZ SS430_*YES, DONT WRITE FORWARD POINTER_^1_%ENA 1_^1_%STQ* FRBSC3_'STORE SECTOR/INDEX_^1_%STA* FRBID3_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE THREAD FROM LAST FRB TO NEW FRB_^1CA3_"ADC 0_^€€1_%ADC FRBHDR-1_$WRITE NUMBER RECORDS AND POINTER TO NEXT FRB_^1LU3_"NUM 0_^1FRBID3 NUM 0_^1FRBSC3 NUM 0_^1_%EJT_]_^1*_]_^1SS430 LDA* SAVE1_(RESTORE USERS CODE_^1_%STA* (CA2)_^1_%RAO* CA2_^1_%LDA* SAVE2_^1_%STA* (CA2)_^1_%RAO* CA2_^1_%LDA* SAVE3_^1_%STA* (CA2)_^1_%SQP SS450_^1*_]_^1*_***************FILE SPACE SHOULD BE RETURNED ON MM ERROR_^1MMERR LDA- MASK+7_!*****MASS MEMO€€RY ERROR_^1_%JMP SS040_^1*_]_^1SS450 LDA* NW2_*SETUP NEXT LAST FRB INDEX_^1_%STA- FRBNIX,I_^1_%ENA 1_,SETUP NUMBER OF RECORDS IN NEXT LAST FRB_^1_%STA- NRLFRB,I_^1_%LDQ* SA2_*SETUP NEW LAST FRB_^1_%STQ- FRBLSA,I_^1_%RAO- NUMFRB,I_$INCREMENT NUMBER OF FRB,S_^1*_]_^1_%LDA- FRBFSA,I_$IS IT THE FIRST RECORD IN THE FILE_^1_%SAN SS460_^1_%STQ- FRBFSA,I_$YES, MAKE FIRST AND LAST FRB,S€z EQUAL_^1*_]_^1SS460 ENA FRBHDR_'Q/A = SECTOR/INDEX_^1_%EJT_]_^1*_]_^1SS500 STQ* (RECPTR)_$STORE RECORD POINTER_^1_%LDQ* RECPTR_^1_%STA- 1,Q_^1*_]_^1_%ENA -1_+SET FIS CHANGE BIT_^1_%AND- IDXCHG,I_^1_%EOR- MASK_^1_%STA- IDXCHG,I_^1*_]_^1_%LDA- LOKADR,I_$CHECK IF FILE LOCKED_^1_%SAZ SS510_^1_%LDA- MASK+1_'FILE LOCKED_^1*_]_^1SS510 JMP SS080_(EXIT_^1_%SPC 2_^1_%END_]_^__zPSTODIR CSY/ F15 P€1_%NAM STODIR_'DECK-ID F15 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_$CALL STODIR(FILNUM,FILCOM,RECPTR,RECBUF,REQBUF,REQIND)_^1*_]_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU MASK($23)_#ONE BIT TABLE_€€^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER €€SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECT€€OR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD€€ BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (€€BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1_%EJT_]_^1*_*EXTERNALS_^1_%EXT ADRFMS_'BEGINNING SECTOR OF FILE SPACE ON LIB UNIT_^1_%EXT BEGLU1_'BEGINNING OF FILE SPACE ON UNIT 1_^1_%EXT BEGLU2_'BEGINNING OF FILE SPACE ON UNIT 2_^1_%EXT BEGLU3_'BEGINNING OF FILE SPACE ON UNIT 3_^1_%EXT BEGLU4_'BEGINNING OF FILE€€ SPACE ON UNIT 4_^1_%EXT BEGLU5_'BEGINNING OF FILE SPACE ON UNIT 5_^1_%EXT BEGLU6_'BEGINNING OF FILE SPACE ON UNIT 6_^1_%EXT BEGLU7_'BEGINNING OF FILE SPACE ON UNIT 7_^1_%EXT BEGLU8_'BEGINNING OF FILE SPACE ON UNIT 8_^1_%EXT FSLIST_'START OF FILE SPACE LIST_^1_%EXT ABSPAR_'GETS ABSOLUTE ADDRESSES_^1_%EXT CKCFIS_'CHECKS CORE FIS_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_€€%EXT MMREAD_'MM READ_^1_%EXT MMWRIT_'MM WRITE_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1_%EXT LOKNEU_'FILE LOCK TABLE NO. OF ENTRIES USED_^1*_]_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_$CALL STODIR(FILNUM,FILCOM,RECPTR,RECBUF,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(LENGTH OF REQUEST PROCESSOR_^1_%SPC 2_^1STODIR 000 000_*STORE DIRECT_^1_%STQ- I_,PICK UP ABSOL€€UTE ADDRESS OF ARGUMENTS_^1*_]_^1_%ENQ 6_^1DS010 INQ -1_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ DS020_^1_%JMP* DS010_^1*_]_^1DS020 LDQ* (FILNUM)_$CHECK VALID FILE NO._^1_%SQZ DS030_^1_%SQP DS100_^1DS030 LDA- MASK+14_^1*_]_^1DS040 EOR- MASK+15_%ERROR EXIT_^1*_]_^1DS080 STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (STODIR)_^1_%EJT_]_^1*_]€€_^1DS100 RTJ CKCFIS_'CHECK FIS IN CORE_^1_%SAP DS110_^1*_]_^1_%LDQ* (FILNUM)_$NOT THERE - CHECK MM_^1_%RTJ SRHFIS_^1_%SAN DS120_(FILE NOT DEFINED_^1*_]_^1DS110 STQ- I_,I = CORE FIS_^1_%LDA- FISFLG,Q_$IS FILE RELEASED_^1_%SAM DS130_^1DS120 LDA- MASK+0_'FILE RELEASED (OR NOT DEFINED)_^1_%JMP* DS040_^1*_]_^1DS130 RTJ CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SAN DS140_^1_%LDA-€€ MASK+13_%UNPROTECTED CALLER (NOT ALLOWED)_^1_%JMP* DS040_^1*_]_^1DS140 LDA- LOKADR,Q_$IS FILE LOCKED_^1_%SAN DS150_^1_%LDA- MASK+1_'FILE NOT LOCKED_^1_%JMP* DS040_(ERROR_^1*_]_^1DS150 LDA* (FILCOM)_$CHECK FILE COMBINATION_^1_%AND- ONEMSK+14_^1_%SAZ DS180_^1_%LDQ- LOKADR,Q_^1_%LDQ- 1,Q_*PICKUP COMBINATION OF LOCK_^1_%EAQ A_,OR THE TWO COMBINATIONS_^1_%LDQ- I_,RELOAD Q WITH FIS€€ ADDRESS_^1_%SAZ DS200_^1DS180 LDA- MASK+10_%NO OR WRONG FILE COMBINATION FROM CALLER_^1_%JMP* DS040_^1_%EJT_]_^1*_]_^1DS200 LDA* RECBUF_'SET UP WRITE_^1_%STA* RECBFR_^1_%LDA* (RECBUF)_^1_%SAP DS201_^1_%JMP* DS030_(RECORD LENGTH IN BUFFER IS NEGATIVE_^1*_]_^1DS201 STA* RECLGH_^1_%LDA- FISFLG,Q_^1_%AND- ONEMSK+6_^1_%STA* FRBLU1_^1_%LDQ* RECPTR_'STORE MASS MEMORY ADDRESSES_^1_%L€€DA- 1,Q_^1_%LDQ- (ZERO),Q_^1_%STQ* FRBSC1_^1_%STA* FRBID1_^1*_]_^1_%LDA ADRFMS_'SET LOW LIMIT FOR LIBRARY UNIT_^1_%STA* ADFMS_^1_%RTJ* DS201A_^1DS201A NUM 0_^1_%LDA* DS201A_^1_%INA ADFMS-DS201A_^1_%STA* IBGFMS_^1_%LDQ =XFSLIST_^1DS202 LDA* (IBGFMS)_$SET LOW LIMIT FOR LOGICAL UNIT ENTRY_^1_%STA* LOWLMT_^1_%LDA- (ZERO),Q_$FIND RECORD'S LOGICAL UNIT ENTRY_^1_%AND- ONEMSK+6_^1_%EO€€R* FRBLU1_^1_%SAZ DS203_(LOGICAL UNIT ENTRY FOUND, CHECK LIMITS_^1_%RAO* IBGFMS_^1_%LDA- (ZERO),Q_$GET LU ENTRY LENGTH AND CHECK NEXT LU ENTRY_^1_%ARS 7_^1_%AND- ONEMSK+8_^1_%AAQ Q_^1_%JMP* DS202_^1*_]_^1DS203 LDA* FRBSC1_'CHECK IF OUTSIDE OF LIMITS_^1_%SAM OUTLIM_)(YES, ITS NEGATIVE)_^1_%SUB* LOWLMT_^1_%SAM OUTLIM_'BELOW LOW LIMIT_^1_%SUB- 3,Q_*CHECK IF WITHIN HIGH LIMIT_^1_€€%SAP OUTLIM_'ABOVE HIGH LIMIT_^1*_]_^1_%LDA* FRBID1_'CHECK FRB INDEX_^1_%SAM OUTLIM_'ERROR, INDEX IS NEGATIVE_^1_%ENA WRDSEC_^1_%MUI- FRBSIZ,I_$CHECK IF INDEX GREATER THAN FRB SIZE_^1_%SUB* FRBID1_^1_%SAP DS205_(RECORD POINTER IS OKAY,STORE RECORD_^1*_]_^1OUTLIM LDA- MASK+9_!*****RECORD POINTER OUT OF LIMITS_^1_%JMP* DS040_*SET BIT 9 AND GO TO ERROR EXIT_^1_%EJT_]_^1*_*WRITE OU€€T THE RECORD_^1DS205 RTJ* (AMMWRT)_$WRITE OUT RECORD_^1RECBFR NUM 0_^1RECLGH NUM 0_^1FRBLU1 NUM 0_^1FRBID1 NUM 0_^1FRBSC1 NUM 0_^1*_]_^1_%SQP DS209_^1MMERR LDA- MASK+7_!*****MASS MEMORY ERROR_^1_%JMP* DS040_^1_%SPC 2_^1*_*STORE DIRECT PARAMETERS_^1*_]_^1FILNUM NUM 0_^1FILCOM NUM 0_^1RECPTR NUM 0_^1RECBUF NUM 0_^1REQBUF NUM 0_^1REQIND NUM 0_^1*_]_^1LOWLMT NUM 0_^1LUE€€LTH NUM 0_^1_%SPC 5_^1DS209 CLR A_,CHECK FILE COMBINATION FOR UNLOCK OPTION_^1_%LDQ* (FILCOM)_^1_%SQP DS220_^1_%LDQ- LOKADR,I_$UNLOCK FILE, REMOVE ENTRY FROM LOCK_^1_%STA- (ZERO),Q_%FILE TABLE, CLEAR LOKADR WORD OF_^1_%STA- 1,Q_+FIS HEADER AND DECREMENT NO. OF_^1_%STA- LOKADR,I_%USED ENTRIES_^1_%LDQ* (ADLKUN)_^1_%INQ -1_^1_%STQ* (ADLKUN)_^1DS220 JMP* DS080_^1*_]_^1ADLKUN ADC€0 LOKNEU_'FILE LOCK TABLE NO. OF ENTRIES USED_^1_%SPC 2_^1_%SPC 2_^1AMMWRT ADC MMWRIT_^1IBGFMS NUM 0_^1*_8FILE MANAGER SPACE TABLE_^1ADFMS ADC 0_^1_%ADC BEGLU1_^1_%ADC BEGLU2_^1_%ADC BEGLU3_^1_%ADC BEGLU4_^1_%ADC BEGLU5_^1_%ADC BEGLU6_^1_%ADC BEGLU7_^1_%ADC BEGLU8_^1_%SPC 2_^1_%END_]_^__ 0PHASHCD CSY/ F16 P€1_%NAM HASHCD_'DECK-ID F16 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1_%ENT HASHCD_^1_%SPC 2_^1_%EQU ONEMSK(3)_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU K€€IDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFOR€€MATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) F€€ILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE€€_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1_%EJT_]_^1*_*FIN€pD SCATTER (HASH) CODE_^1*_]_^1HASHCD 000 000_^1_%STA* KEYADR_'SAVE BASE ADDRESS OF KEY VALUE BUFFER_^1_%CLR A_^1_%LDQ- KEYLTH,I_^1*_]_^1HASHLP INQ -1_+ADD KEY VALUE WORDS TOGETHER_^1_%ADD* (KEYADR),Q_^1_%SQZ HASHEX_^1_%JMP* HASHLP_^1*_]_^1HASHEX AND- ONEMSK+14_^1_%JMP* (HASHCD)_$EXIT WITH POSITVE HASH CODE IN A_^1_%SPC 2_^1KEYADR NUM 0_^1_%SPC 2_^1_%END_]_^__pPGETKID CSY/ F17 P€1_%NAM GETKID_'DECK-ID F17 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*EQUIVALENCES_^1*_1COMMUNICATION REGION_^1_%EQU ZERO(2)_%ZERO CONSTANT_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU ZROMSK($13)_!ZERO MASK TABLE_^1_%EQU ONEBIT($23)_€€!ONE BIT TABLE_^1_%EQU ZROBIT($33)_!ZERO BIT TABLE_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS €€MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDR (IF 0, NOT LOCKED)_^1_%EQ€€U FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^€€1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BL€€OCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1_%EJT_V63*1350_^1*_*EXTERNALS_^1_%EXT FMRERR_'FILE MANAGER REQUEST ERROR ENTRY_^1_%EXT FDTINT_'TIME OUT CLOCK FOR KIS DIRECTORY_^1_%EXT GETSPC_'SPACE REQUEST PROCESSOR. NUMBER WORDS IN A_^1_%EXT MMREAD_'READ FROM €€MASS MEMORY_^1*_]_^1*_*ENTRY POINT_^1_%ENT GETKID_'GET KEY INFORMATION SYSTEM DIRECTORY_^1_%EJT_]_^1GETKID 000 000_^1_%IIN 000_*INHIBIT INTERRUPTS_463*1350_^1_%LDQ- ADRKID,I_$GET ADDRESS OF KIS DIRECTORY IN FIS_^1_%SQZ READKD_'KIS DIRECTORY NOT IN CORE--READ IT IN_^1_%JMP* GKEXIT_'RETURN WITH KIS DIRECTORY ADDRESS IN Q_^1*_]_^1READKD ENA WRDSEC_'GET SIZE OF KIS DIRECTORY IN WO€€RDS_^1_%MUI- KIDSIZ,I_^1_%STA* PAR2_)NUMBER WORDS TO BE READ--KIS DIRECTORY LENGTH_^1_%RTJ GETSPC_'REQUEST KIDSIZ * WRDSEC WORDS OF SPACE_^1_%STQ* PAR1_)STARTING ADDRESS OF BUFFER_^1_%STQ* RELKID+2_$STORE ADDRESS FOR POSSIBLE RELEASE_#69*1593_^1*_]_^1_%LDA- FISFLG,I_$GET FISFLG WORD IN CORE FIS_^1_%ARS 7_^1_%AND- ONEMSK+6_$GET L.U. IN BITS 0-6. ONEMSK+6 HOLDS $7F_^1_%STA* PAR3_)€€LOGICAL UNIT_^1*_]_^1_%LDA- KIDSEC,I_$SECTOR NUMBER OF KIS DIRECTORY_^1_%STA* PAR5_^1*_]_^1_%RTJ MMREAD_'READ IN KIS DIRECTORY FROM MASS MEMORY_^1PAR1_!NUM 0_,BUFFER BASE ADDRESS ALLOCATED BY GETSPC_^1PAR2_!NUM 0_,NUMBER OF WORDS TO READ_^1PAR3_!NUM 0_,LOGICAL UNIT_^1_%NUM 0_^1PAR5_!NUM 0_,SECTOR NUMBER OF KIS DIRECTORY_^1_%SQP KIDADR_^1RELKID RELEAS 0_)RELEASE SPACE USED B€dY KID_-69*1593_^1_%LDA- ONEBIT+7 *****MASS MEMORY ERROR_^1_%JMP FMRERR_^1KIDADR LDQ* PAR1_)STARTING ADDRESS OF KIS DIRECTORY_^1_%STQ- ADRKID,I_$STARTING ADDR OF KIS DIRECTORY INTO CORE FIS_^1*_]_^1GKEXIT LDA FDTINT_'SET TIME OUT INTERVAL FOR KIS DIRECTORY_^1_%STA- (ZERO),Q_^1_%EIN 000_*ENABLE INTERRUPTS_563*1350_^1_%JMP* (GETKID)_!RETURN_^1_%END_]_^__dPRTVSEQ CSY/ F18 P€1_%NAM RTVSEQ_'DECK-ID F18 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_$CALL RTVSEQ(FILNUM,FILCOM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1*_]_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU MASK($23)_#ONE BIT€€ TABLE_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WOR€€DS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDRESS (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU IXNFIS(F€€H+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST F€€ILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BL€€OCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1*_2INDEXES INTO REQUEST BUFFER TABLE_^1_%EQU PREFRB(6)_#POINTER TO PREVIOUS FILE RECORD BLOCK_^1_%EQU NXTFRB(7)_#POINTER TO NEXT FILE RECORD BLOCK_^1_%EQU RECCNT(8)_$RECORD COUNT IN THIS FILE RECORD BLOCK_^1_%EQU CURFRB(9)_#POINTER TO CURRENT LAST FR€€B_^1_%EQU CURCNT(10)_"CURRENT NUMBER OF RECORDS IN CURRENT LAST FRB_^1_%EQU LRCSIZ(11)_"LAST RECORD SIZE IN WORDS_^1_%EJT_]_^1*_2EXTERNALS_^1_%EXT ABSPAR_'GETS ABSOLUTE ADDRESSES_^1_%EXT CKCFIS_'CHECKS CORE FIS_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT CKUADR_'CHECK LEGALITY OF UNPROTECTED ADDRESS_^1_%EXT MMREAD_'MM READ_^1_%EXT MMWRIT_'MM WRITE_^1_%EXT SRHFIS_'SE€€ARCH FOR FIS IN FIS BLOCKS_^1_%EXT FILBLK_'FILE BLOCK FOR RETRIEVING RECORD,S FRB_^1_%EXT NWFBLK_'NUMBER OF WORDS IN FILE BLOCK_^1_%EXT LOKNOE_'LOCK FILE TABLE NUMBER OF ENTRIES_^1_%EXT LOKNEU_'LOCK FILE TABLE NO. OF ENTRIES USED_^1_%EXT LOKTBL_'LOCK FILE TABLE_^1*_]_^1_%EXT* RTNSPC_'RETURN SPACE_^1_%EXT* STRSEC_'STARTING SECTOR OF SPACE TO BE RETURNED_^1_%EXT* RPEND_(REQUEST €€PROCESSOR END_^1_%EJT_]_^1*_$CALL RTVSEQ(FILNUM,FILCOM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(LENGTH OF REQUEST PROCESSOR_^1_%SPC 2_^1RTVSEQ 000 000_*RETRIEVE SEQUENTIAL_^1_%STQ- I_^1*_]_^1_%ENQ 7_^1T010_!INQ -1_+LOOP TO PICK UP ADDRESS OF CALL PARAMETERS_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ T020_^1_%JMP* €€T010_^1*_]_^1T020_!LDQ* (FILNUM)_$CHECK FOR VALID FILE NO._^1_%SQZ T030_^1_%SQP T100_^1T030_!LDA- MASK+14_^1*_]_^1T040_!EOR- MASK+15_%ERROR EXIT_^1*_]_^1T080_!STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (RTVSEQ)_^1_%EJT_]_^1*_]_^1T100_!RTJ CKCFIS_'SEE IF FIS IN CORE_^1_%SAP T110_^1*_]_^1_%LDQ* (FILNUM)_$NOT IN CORE CHECK MM_^1_%RTJ SRHFIS_^1_%SAN T120_^1*_]_^1T110_!STQ- I_,SAVE CORE €€FIS ADDRESS_^1_%LDA- FISFLG,Q_^1_%SAM T130_^1T120_!LDA- MASK+0_'RELEASED OR NOT DEFINED_^1_%JMP* T040_^1*_]_^1T130_!LDA* (FILCOM)_$CHECK IF REMOVING RECORD_^1_%SAM T140_^1_%JMP* T200_^1*_]_^1T140_!LDQ- LOKADR,Q_$CHECK IF FILE LOCKED_^1_%SQZ T160_^1_%AND- ONEMSK+14_#IF LOCKING AND FILE LOCKED, FILCOM_^1*_9= LOCK COMBINATION_^1_%SAN T160_^1_%LDA- MASK+1_'ERROR TRYING TO REMOVE FR€€OM LOCKED FILE W/0 CM_^1_%JMP* T040_^1*_]_^1T160_!LDA- KIDSEC,I_^1_%SAZ T170_^1_%LDA- MASK+11_%CANT REMOVE FROM INDEXED FILE_^1_%JMP* T040_)ERROR_^1*_]_^1T170_!LDA- FISFLG,I_$CHECK IF FILE PROTECTED_^1_%AND- MASK+14_^1_%SAZ T200_^1_%RTJ* (ACPROT)_$CHECK IF REQUEST PROTECTED_^1_%SAN T200_^1_%LDA- MASK+13_%UNPROT CALL CANT REMOVE FROM PROT FILE_^1_%JMP* T040_^1_%EJT_]_^1*_]_^1T200€€_!CLR Q_,CHECK IF FIRST RECORD POINTER ADDRESS LEGAL_^1_%LDA* RECPTR_^1_%RTJ* (ACUADR)_^1_%INA 1_,CHECK IF SECOND RECORD POINTER ADDRESS LEGAL_^1_%RTJ* (ACUADR)_^1*_]_^1_%LDA* (RECLTH)_$CHECK RECLTH FOR ZERO OR NEGATIVE_^1_%SAZ T210_^1_%SAP T220_^1T210_!JMP* T030_)RECORD SIZE ILLEGAL_^1*_]_^1T220_!STA RECLGH_'SETUP NUMBER OF WORDS IN RECORD LENGTH 63*1351_^1*_]_^1_%LDA* RECBUF€€_'CHECK LEGALITY OF UNPROTECTED (IF IT IS) ADR_^1_%STA RECBFR_N63*1351_^1_%RTJ* (ACUADR)_$OK, IF IT RETURNS_^1*_]_^1_%ADD* (RECLTH)_$CHECK IF THE END OF THE RECORD BUFFER OK_^1_%INA -1_^1_%RTJ* (ACUADR)_$OK, IF IT RETURNS_^1*_]_^1_%LDA- FISFLG,I_$SETUP LOGICAL UNIT_^1_%AND- ONEMSK+6_^1_%STA* LU0_^1_%STA* FRBLU1_^1_%STA FRBLU2_^1_%STA FRBLU_^1_%EJT_]_^1*_]_^1T300_!LDA* (RECPTR)_€€$CHECK IF FIRST SEQUENTIAL READ_^1_%SAN T320_^1_%LDQ- FRBFSA,I_$FIRST TIME, CHECK IF FILE EMPTY_^1_%SQZ T315_+EMPTY, RETURN END OF FILE FLAG_^1_%TRQ A_,CHECK IF FIRST FRB EQUALS LAST FRB_^1_%EOR- FRBLSA,I_^1_%SAN T335_+NO, GET FIRST RECORD_^1_%LDA- NRLFRB,I_$CHECK IF NO RECORDS IN FIRST FRB_^1_%SAN T335_)RECORDS EXIST, GET FIRST ONE_^1T315_!JMP* T350_)FILE IS EMPTY, RETURN END€€-OF-FILE INDICATION_^1*_]_^1T320_!LDQ* REQBUF_'CHECK RECORD COUNT_^1_%LDA- RECCNT,Q_^1_%SAZ T330_^1_%JMP* T400_)GET NEXT RECORD FROM FILE RECORD BLOCK_^1*_]_^1T330_!LDQ- NXTFRB,Q_$CHECK IF NO NEXT FILE RECORD BLOCK_^1_%SQZ T340_+NO MORE_^1T335_!ENA FRBHDR_'GET FIRST RECORD OF NEW FILE RECORD BLOCK_^1_%JMP* T405_^1*_]_^1T340_!LDQ* REQBUF_'ALL RECORDS READ, CHECK IF ANY MORE ADDED€€_^1_%LDA- FRBLSA,I_^1_%SUB- CURFRB,Q_^1_%SAN T360_)ONE OR MORE FILE RECORD BLOCKS HAS BEEN ADDED_^1*_]_^1_%LDA- NRLFRB,I_^1_%SUB- CURCNT,Q_^1_%SAM T350_^1_%SAZ T350_^1_%JMP* T390_)MORE RECORDS ADDED IN LAST FILE RECORD BLOCK_^1*_]_^1T350_!LDA- MASK+3_'ALL RECORDS READ, RETURN END-OF-FILE FLAG_^1_%JMP T720_+(DONT LOCK FILE ON EOF)_-63*1351_^1T360_!LDA- CURFRB,Q_$SET SECTOR ADDRE€€SS OF PREVIOUS LAST FRB_^1_%STA* SA0_^1_%INQ PREFRB_'SETUP ADDRESS OF PREFRB, NXTFRB, AND RECCNT_^1_%STQ* CA0_^1*_]_^1_%RTJ MMREAD_'READ LAST FRB HEADER INTO PREFRB/NXTFRB/RECCNT_^1CA0_"NUM 0_^1_%ADC FRBHDR_^1LU0_"NUM 0_^1_%NUM 0_^1SA0_"NUM 0_^1_%SQP T380_^1*_]_^1MMERR LDA- MASK+7_!*****MASS MEMORY ERROR_^1_%JMP* T040_^1_%EJT_]_^1*_]_^1ACPROT ADC CKPROT_^1ACUADR ADC CKUA€€DR_^1WPS_"ADC WRDSEC_^1ANWBLK ADC NWFBLK_N63*1351_^1*_]_^1FILNUM ADC 0_,1_#THESE CARDS MUST BE IN ORDER OF_^1FILCOM ADC 0_,2_#CALLING SEQUENCE_^1RECPTR ADC 0_,3_^1RECBUF ADC 0_,4_^1RECLTH ADC 0_,5_^1REQBUF ADC 0_,6_^1REQIND ADC 0_,7_!STOP_^1_%SPC 5_^1*_*SETUP WHEN MORE RECORDS ADDED AFTER PREVIOUS LAST FRB_^1T380_!LDQ* REQBUF_'ARE THERE ANY MORE RECORDS IN THIS FRB_^1_%LD€€A- RECCNT,Q_^1_%SUB- CURCNT,Q_^1_%SAM T385_^1_%SAN T390_^1T385_!JMP* T330_)NO,GET THE NEXT RECORD FROM THE NEXT FRB_^1*_]_^1T390_!STA- RECCNT,Q_$SET NUMBER OF RECORDS TO BE READ IN THIS FRB_^1_%ADD- CURCNT,Q_^1_%STA- CURCNT,Q_$SET CURRENT RECORD COUNT IN THIS FRB_^1_%EJT_]_^1*_*READ IN RECORD FROM FILE RECORD BLOCK_^1*_]_^1T400_!LDA- LRCSIZ,Q_$READ NEXT RECORD IN THIS FRB_^1_%LDQ*€€ RECPTR_^1_%ADD- 1,Q_^1_%LDQ- (ZERO),Q_^1*_]_^1T405_!STA* FRBID1_'SETUP SECTOR/INDEX FOR READ AND REMOVE_^1_%STQ* FRBSC1_^1_%STQ FRBSC2_N63*1351_^1_%STA FRBID2_N63*1351_^1*_] 63*1351_^1_%LDA- FRBSIZ,I_$GET NUMBER OF WORDS IN FILE RECORD BLK.63*1351_^1_%AND- ONEMSK+8_L63*1351_^1_%MUI* WPS_Q63*1351_^1_%TRA Q_,CHECK IF FRB SIZE .GT. FILE BLOCK SIZE 63*1351_^1_%SUB* ANWBLK_N63*1351€€_^1_%SAM T408_)NO, USE FILE RECORD BLOCK SIZE_(63*1351_^1_%LDQ* ANWBLK_'YES, USE FILE BLOCK SIZE_.63*1351_^1T408_!STQ NWFB_P63*1351_^1_%STQ* NWFB1_O63*1351_^1*_] 63*1351_^1_%LDA* ANWBLK_'CHECK IF RECORD WILL FIT IN FILE BLOCK 63*1351_^1_%SUB* FRBID1_^1_%SUB* RECLGH_^1*_]_^1_%LDQ* FRBID1_'CHECK IF FIRST RECORD OF A FRB_^1_%INQ -FRBHDR_^1_%SQZ T410_)YES, READ IN FILE RECORD BLOC€€K_^1*_]_^1_%LDQ* (FILCOM)_$CHECK IF RECORD IS TO BE REMOVED_^1_%SQM T410_+YES, READ IN FILE RECORD BLOCK_^1_%SAM T415_)NO REMOVE AND WONT FIT IN FILE BLOCK_^1_%EJT_V63*1351_^1T410_!STA* IFBFLG_'READ IN FILE RECORD BLOCK INTO FILE BLOCK_^1_%LDA* FRBSC1_^1_%LDQ* AMMRED_^1_%RTJ* ACCFRB_^1_%LDQ AFLBLK_^1_%ADQ* FRBID1_^1_%LDA* IFBFLG_'CHECK IF RECORD IN FILE RECORD BLOCK_^1_%SAP T41€€8_,YES_^1_%ADD* RECLGH_^1_%INA -1_+SET IN-FILE-BLOCK FLAG IF FIRST WORD IS IN_^1_%SAM T430_^1_%STA* IFBFLG_^1_%INA 1_^1_%SUB- (ZERO),Q_$CHECK IF ACTUAL RECORD IN FILE RECORD BLOCK_^1T415_!SAM T430_,NO, READ IN RECORD BY ITSELF_^1*_]_^1T418_!STQ* FRBLU1_'RECORD IN FILE RECORD BLOCK_^1_%LDQ* RECLGH_^1T420_!INQ -1_+TRANSFER RECORD TO USER,S RECORD BUFFER_^1_%LDA* (FRBLU1),Q_^1_%S€€TA* (RECBFR),Q_^1_%SQZ T500_^1_%JMP* T420_^1*_81 CARD DELETED_663*1351_^1*_*RETRIEVE THE RECORD BY ITSELF_^1*_]_^1T430_!RTJ* (AMMRED)_$READ THE RECORD IN BY ITSELF_^1RECBFR NUM 0_^1RECLGH NUM 0_^1FRBLU1 NUM 0_^1FRBID1 NUM 0_^1FRBSC1 NUM 0_^1*_]_^1_%SQP T500_^1MMER_!JMP* MMERR_"*****MASS MEMORY ERROR_^1*_82 CARDS DELETED_563*1351_^1_%EJT_]_^1*_*SETUP RETRIEVE SEQUENTIAL PARAM€€ETERS_^1*_]_^1T500_!LDA* FRBID1_'CHECK IF AN INITIAL READ FROM AN FRB_^1_%INA -FRBHDR_^1_%SAN T505_^1*_]_^1_%LDQ* AFLBLK_'YES, SAVE CONTROL WORDS_^1_%LDA- 1,Q_^1_%STA* FRBLU1_'SAVE POINTER TO NEXT FRB TEMPORARILY_^1_%LDA- 2,Q_^1_%LDQ* REQBUF_'SAVE NUMBER OF RECORDS IN THIS FRB_^1_%STA- RECCNT,Q_^1_%LDA* FRBLU1_'SAVE POINTER TO NEXT FRB_^1_%STA- NXTFRB,Q_^1_%SAN T510_)CHECK IF LA€€ST FILE RECORD BLOCK_^1*_]_^1_%LDA- FRBLSA,I_$YES, SET CURRENT LAST FRB TO LAST FRB_^1_%STA- CURFRB,Q_^1_%LDA- NRLFRB,I_$SET CURRENT COUNT IN CURRENT LAST FRB = NRLFRB_^1_%STA- CURCNT,Q_^1_%STA- RECCNT,Q_$INITIALIZE RECORD COUNT TO RECORDS IN LAST FRB_^1T505_!SAN T510_^1_%JMP* T350_)NO RECORDS IN LAST FRB, END OF FILE_^1*_]_^1T510_!LDQ* FRBSC1_'STORE RECORD POINTER_^1_%LDA* FRBID1€€_^1_%STQ* (RECPTR)_^1_%LDQ* RECPTR_^1_%STA- 1,Q_^1_%EJT_]_^1*_*DECREMENT RECORD COUNT AND CHECK FOR A REMOVE_^1*_]_^1_%LDQ* REQBUF_'SAVE RECORD SIZE_^1_%LDA* (RECBUF)_^1_%AND- ONEMSK+14_^1_%SAN T520_^1_%LDA- FIFORL,I_$RL=0, SPECIAL RECORD/ USE FIFO RECORD LENGTH_^1T520_!STA- LRCSIZ,Q_^1*_]_^1_%LDA* (RECBUF)_$CHECK IF RECORD ALREADY REMOVED_^1_%INA -1_^1_%SAM T525_)YES, SET BIT 5€€ AND EXIT_^1_%LDA- RECCNT,Q_^1_%INA -1_+DECREMENT RECORD COUNT_^1_%STA- RECCNT,Q_^1*_]_^1_%LDA* (FILCOM)_$CHECK IF REMOVING RECORD_^1_%SAP T523_+NO_^1_%LDA- CURCNT,Q_^1_%INA -1_+DECREMENT CURRENT COUNT OF NUMREC IN LAST FRB_^1_%STA- CURCNT,Q_^1*_]_^1T523_!LDA* (RECBUF)_$CHECK IF SPECIAL FIFO RECORD ($8000)_!63*1351_^1_%SAP T530_+NO, CONTINUE PROCESSING_^1*_]_^1T525_!LDA- MASK+5€€_'RECORD REMOVED, SET BIT 5 AND EXIT_^1T527_!JMP T720_^1*_]_^1T530_!LDQ* (FILCOM)_$CHECK IF RECORD IS TO BE REMOVED_^1_%SQM RMVREC_^1_%JMP* T700_)NO, SETUP INDICATOR AND EXIT_^1*_] 63*1351_^1NWFB1 NUM 0_,NUMBER OF WORDS IN FILE BLOCK_)63*1351_^1IFBFLG NUM 0_,IN-FILE-BLOCK FLAG (POSITIVE IF IT IS) 63*1351_^1_%EJT_]_^1*_*REMOVE THE RECORD_^1*_81 CARD DELETED_663*1351_^1RMVREC L€€DQ* AFLBLK_'REMOVE THE RECORD_^1_%LDA- 2,Q_*CHECK IF RECORD IS IN LAST FRB_^1_%SAN T620_+NO_^1*_]_^1_%ENA -1_+RECORD IN LAST FRB_^1_%AND- IDXCHG,I_^1_%INA 1_,SET FIS CHANGED BIT_^1_%STA- IDXCHG,I_^1_%LDA- NRLFRB,I_$DECREMENT NUMBER OF RECORDS IN LAST FRB_^1_%INA -1_^1_%STA- NRLFRB,I_$IS THERE MORE THAN ONE RECORD IN THE LAST FRB_^1_%SAN T630_+YES, THEN JUST REMOVE THE RECORD_^€€1_%LDQ REQBUF_'NO MORE RECORDS IN LAST FRB_+63*1351_^1_%ENA FRBHDR_'DONT RETURN LAST FRB_^1_%STA- FRBNIX,I_'(RESET FRB INDEX TO BEGINNING OF LAST FRB)_^1_%SUB* FRBID1_^1_%STA- LRCSIZ,Q_$SETUP FOR REENTRY IF MORE RECORDS ADDED_^1_%JMP* T700_^1*_]_^1T620_!INA -1_+DECREMENT NUMBER OF RECORDS IN FRB_^1_%STA- 2,Q_^1_%SAN T630_^1_%LDA- 1,Q_*SETUP NEXT FRB (IF RQT THINKS THIS LAST ONE€€)_^1_%LDQ REQBUF_^1_%STA- NXTFRB,Q_^1_%JMP* RTNFRB_'RETURN THE FRB_^1*_]_^1T630_!LDA* (RECBFR)_$SET REMOVE BIT IN RECORD_^1_%EOR- MASK+15_^1_%LDQ* IFBFLG_'CHECK IF RECORD IN FILE BLOCK_^1_%SQM T640_)NO, REMOVE RECORD BY ITSELF_^1_%LDQ* FRBID2_^1_%STA* (AFLBLK),Q_"RECORD IS IN FILE BLOCK, REMOVE IT WHEN FRB IS_^1_%JMP* T650_)WRITTEN BACK TO DECREMENT NUMBER OF RECORDS_^1*_]_^1T640€€_!STA* (AMMRED)_$REMOVE RECORD BY ITSELF_^1_%RTJ* (AMMWRT)_^1AMMRED ADC MMREAD_^1_%NUM 1_^1FRBLU2 NUM 0_^1FRBID2 NUM 0_^1FRBSC2 NUM 0_^1_%SQP T650_^1_%JMP* MMER_#*****MASS MEMORY ERROR_^1*_]_^1T650_!LDA* FRBSC2_'WRITE FRB TO DECREMENT NUMBER OF RECORDS_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1_%JMP* T700_)SET UP REQUEST INDICATOR AND EXIT_^1_%EJT_]_^1*_*ACCESS THE RECORD,S FILE RECO€€RD BLOCK_^1*_]_^1ACCFRB 000 000_^1_%STA* FRBSEC_'A = FILE RECORD BLOCK SECTOR_^1_%STQ* RORW+1_'Q = READ OR WRITE ADDRESS_^1*_]_^1RORW_!RTJ+ 0000_)READ IN FRB_^1AFLBLK ADC FILBLK_'ADDRESS OF FILE BLOCK_^1NWFB_!ADC 0_,NUMBER OF WORDS IN FILE BLOCK_)63*1351_^1FRBLU NUM 0_,LOGICAL UNIT OF FRB_^1FRBIDX NUM 0_^1FRBSEC NUM 0_,STARTING SECTOR OF FRB_^1*_]_^1_%CLR A_,RESET FRB INDEX€€ TO ZERO_^1_%STA* FRBIDX_^1*_82 CARDS DELETED_563*1351_^1*_]_^1_%SQM MME_^1_%JMP* (ACCFRB)_$RETURN_^1*_]_^1MME_"JMP* MMER_#*****MASS MEMORY ERROR_^1_%SPC 3_^1AMMWRT ADC MMWRIT_^1_%EJT_]_^1*_*RETURN THE RECORD,S FILE RECORD BLOCK_^1*_]_^1RTNFRB ENA -1_+SET F IS CHANGED BIT_^1_%AND- IDXCHG,I_^1_%INA 1_^1_%STA- IDXCHG,I_^1_%LDQ* AFLBLK_'CHECK IF THE FIRST FRB IS BEING RETURNED_^1€€_%ENA 1_Q82*2366_^1_%STA* NWFB_)(SETUP TO WRITE ONE WORD THREADS)_"82*2366_^1_%LDA* FRBSC2_^1_%EOR- FRBFSA,I_^1_%SAN RFRB10_^1*_]_^1_%LDA- 1,Q_*SET NEW FIRST FRB TO NEXT FRB_^1_%STA- FRBFSA,I_^1_%JMP* RFRB20_'WRITE BACKWARD FRB THREAD ON NEW FIRST FRB_^1*_]_^1RFRB10 LDA- (ZERO),Q_$WRITE FORWARD FRB THREAD ON LAST FRB_^1_%LDQ- 1,Q_^1_%STQ* (AFLBLK)_^1_%RAO* FRBIDX_^1*_82 CARDS DEL€€ETED_563*1351_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1*_]_^1_%LDA* (AFLBLK)_$WRITE BACKWARD FRB THREAD ON NEXT FRB_^1_%LDQ* FRBSEC_^1_%STQ* (AFLBLK)_^1RFRB20 LDQ* AMMWRT_N63*1351_^1_%RTJ* ACCFRB_N63*1351_^1*_] 63*1351_^1*_*RESET NUMBER OF WORDS TO ACCESS IN FILE BLOCK_'63*1351_^1_%LDA* NWFB1_O63*1351_^1_%STA* NWFB_P63*1351_^1_%LDA* FRBSC2_'SET UP STARTING SECTOR OF RECORD,S FRB_^1_%STA €€ STRSEC_^1_%LDQ* FRBLU_(Q = LOGICAL UNIT OF FRB_^1_%LDA- FRBSIZ,I_^1_%AND- ONEMSK+8_$A = NUMBER OF SECTORS IN FRB_^1_%RTJ RTNSPC_'RETURN THE RECORD,S FILE RECORD BLOCK_^1*_]_^1_%LDA- NUMFRB,I_$DECREMENT NUMBER OF FILE RECORD BLOCKS_^1_%INA -1_^1_%STA- NUMFRB,I_^1_%EJT_]_^1*_*SETUP INDICATOR AND EXIT_^1*_]_^1T700_!RTJ CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SAZ T704_)SKIP IF UNPR€€OTECTED AND FMPFLG NOT SET_^1_%LDA (FILCOM)_$CHECK IF FILE IS TO BE LOCKED_^1_%AND- ONEMSK+14_^1_%TRA Q_^1_%SAZ T704_)SKIP IF NO_^1_%LDA- LOKADR,I_$CHECK IF FILE ALREADY LOCKED_^1_%SAZ T706_)NO, LOCK FILE_^1T704_!JMP* T710_^1*_]_^1T706_!STQ- LOKADR,I_$SAVE FILE COMB. IN LOKADR (TEMP)_^1_%RAO LOKNEU_'BUMP NO OF IN USE ENTRIES_^1_%LDQ =XLOKNOE_$SEARCH FOR EMPTY SLOT IN LOCK TAB€€LE_^1_%QLS 1_^1T708_!INQ -2_^1_%LDA* (ADRLOK),Q_^1_%SAZ T709_)SKIP IF SLOT FOUND_^1_%JMP* T708_^1*_]_^1T709_!ADQ* ADRLOK_'SET Q TO ABSOLUTE ADDRESS OF ENTRY_^1_%LDA- LOKADR,I_$PICKUP COMBINATION_^1_%STQ- LOKADR,I_$STORE ABS ADDRESS OF ENTRY_^1_%STA- 1,Q_*STORE COMB. AND FILE NO. IN ENTRY_^1_%LDA (FILNUM)_^1_%STA- (ZERO),Q_^1*_]_^1T710_!LDA (RECBFR)_$CHECK IF A SHORT READ_^1_%A€ND- ONEMSK+14_^1_%TCA Q_^1_%CLR A_^1_%ADQ RECLGH_^1_%SQP T720_^1_%EOR- MASK+2_'YES, SET BIT 2_^1*_]_^1T720_!LDQ- LOKADR,I_$CHECK IF FILE LOCKED_^1_%SQZ T730_^1_%EOR- MASK+1_'YES, SET BIT 1_^1T730_!JMP T080_^1_%SPC 3_^1ADRLOK ADC LOKTBL_'LOCK FILE TABLE_^1_%SPC 2_^1_%END_]_^__ PRTNSPC CSY/ F19 P€1_%NAM RTNSPC_'DECK-ID F19 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_*R E T U R N_!F I L E_!S P A C E_^1*_]_^1*_]_^1_%ENT RTNSPC_'RETURN FILE SPACE SUBROUTINE_^1_%ENT STRSEC_'STARTING SECTOR ADDRESS OF RETURNED SPACE_^1*_]_^1_%EXT M€€MREAD_'MASS MEMORY READ_^1_%EXT MMWRIT_'MASS MEMORY WRITE_^1_%EXT FSLIST_'FILE SPACE LIST ADDRESS_^1_%EXT FSLEND_'END OF FILE SPACE LIST_^1*_]_^1_%EQU ZERO(2)_%LOCATION CONTAINING ZERO_^1_%EQU ONEBIT($23)_!ONEBIT TABLE_^1_%EQU ADISP($EA)_"ADDRESS OF DISPATCHER_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1_%EQU PL($EF)_%PRIORITY LEVEL_3**MSOS 4.1**_^1_%EJT_]_^1*_]_^1*_$FORMAT OF€€ FILE SPACE LIST_^1*_'A. THE FILE SPACE LIST HAS N LU ENTRIES, TERMINATED BY -0_^1*_31._!LOGICAL UNIT ENTRY 1_^1*_32._!LOGICAL UNIT ENTRY 2_^1*_3._+._^1*_3._+._^1*_3._+._^1*_3N._!LOGICAL UNIT ENTRY N_^1*_1N+1._)NUM -0 OR +0_^1*_]_^1*_]_^1*_'B. A LOGICAL UNIT ENTRY HAS M THREADS OF SECTOR BLOCKS_^1*_,WORD_"0_!LU ENTRY LENGTH (BITS 7-15), LU (BITS 0-6)_^1*_,WORD_"1_!BEGINNING SECTOR€€ ADDRESS OF FILE SPACE POOL_^1*_,WORD_"2_!TOTAL NUMBER OF AVAILABLE SECTORS_^1*_,WORD_"3_!TOTAL NUMBER OF SECTORS IN THIS FILE SPACE_^1*_,WORD_"4_!SECTOR ADDRESS(1) HAVING NUMBER OF SECTOR(1)_^1*_,WORD_"5_!NUMBER OF SECTORS(1)_^1*_,WORD_"6_!SECTOR ADDRESS(2) HAVING NUMBER OF SECTORS(2)_^1*_,WORD_"7_!NUMBER OF SECTORS(2)_^1*_3._+._^1*_3._+._^1*_3._+._^1*_,WORD 2M+1_!SECTOR ADDRESS(M€€) HAVING NUMBER OF SECTORS(M)_^1*_,WORD 2M+2_!NUMBER OF SECTORS(M)_^1*_]_^1*_]_^1*_'C. EACH SECTOR BLOCK(I) HAS THE FOLLOWING FORMAT_^1*_,WORD_"0_!SECTOR ADDRESS OF NEXT BLOCK (0=NONE)_^1*_]_^1*_]_^1*_'D. EACH SECTOR BLOCK (WHICH IS IN ASCENDING SECTOR SIZE_^1*_*ORDER) IN THE FILE SPACE POOL HAS THE FOLLOWING FORMAT_^1*_,WORD_"0_!SECTOR ADDRESS OF NEXT EQUAL BLOCK (0=NONE)_^1*_,WOR€€D_"1_!SECTOR ADDRESS OF NEXT GREATER BLOCK (0=NONE)_^1*_,WORD_"2_!NUMBER OF SECTORS IN THE CURRENT BLOCK_^1_%EJT_]_^1*_*RETURN FILE SPACE SUBROUTINE_^1*_]_^1*_]_^1RTNSPC 000 000_*STRSEC MUST BE SETUP BEFORE ENTRY_^1_%STQ* RLU_*Q = LOGICAL UNIT OF WHERE TO RETURN FILE SPACE_^1_%STQ* WLU_^1_%STA* NUMSEC_'A= NUMBER OF SECTORS TO RETURN_^1*_]_^1_%LDA- I_,SAVE I REGISTER_^1_%STA* ISAVE€€_^1*_]_^1_%LDQ =XFSLIST_^1FINDLU STQ- I_,FIND GIVEN LU ON FILE SPACE LIST_^1_%LDA- (ZERO),Q_^1_%ENQ 0_,SEPARATE LU ENTRY LENGTH AND LU_^1_%LLS 9_/Q = LUELTH_^1_%ALS 7_/A = LU_^1_%EOR* RLU_^1_%SAZ FINDNS_'LOGICAL UNIT FOUND, FIND GIVEN NUMSEC_^1_%ADQ- I_^1_%JMP* FINDLU_'LOGICAL UNIT NOT FOUND, CONTINUE SEARCH_^1*_]_^1*_]_^1FINDNS STA* WBI_*CLEAR WBI_=66*1446_^1_%STQ* LUELTH_'FI€€ND GIVEN NUMBER OF SECTORS_*66*1446_^1_%ENQ 2_^1*_]_^1CHKNNS INQ 2_,CHECK WITH NEXT NUMBER OF SECTORS IN LU ENTRY_^1_%TRQ A_^1_%SUB* LUELTH_^1_%SAP RTNFSP_'NO MORE, RETURN SPACE TO FILE SPACE POOL OF LU_^1*_]_^1_%LDA- 1,B_*CHECK NUMBER OF SECTORS_^1_%EOR* NUMSEC_^1_%SAZ RTNSST_'NUMSEC FOUND, RETURN SPACE TO SECTOR THREAD_^1_%JMP* CHKNNS_'NUMBER OF SECTORS NOT FOUND, CONTINUE S€€EARCH_^1*_]_^1*_]_^1RTNSST ADQ- I_,RETURN SPACE TO ITS SECTOR THREAD_^1_%LDA* STRSEC_^1_%RTJ* WRITMM_-*STORE 1ST POINTER ONTO SECTOR STRSEC*_^1*_]_^1_%LDA* STRSEC_'SET FIRST SECTOR POINTER TO SECTOR STRSEC_^1_%STA* (WBL)_^1_%JMP* RSEXIT_'EXIT_^1_%EJT_]_^1*_*SEARCH FOR PLACE TO INSERT RETURNED SPACE_^1*_]_^1RTNFSP LDQ- I_,SAVE ADDRESS OF FILE SPACE POOL_^1_%INQ 1_^1_%STQ* FSPADR_^1€€_%LDA- (ZERO),Q_$SEARCH FILE SPACE POOL_^1_%STA* NSAGNS_^1_%RTJ* HERE_)FIND ABSOLUTE ADDRESS OF NSACNS_^1HERE_!0_"0_^1_%LDQ* HERE_^1_%INQ -HERE+NSACNS Q = ADDRESS OF NSACNS_^1_%STQ* RBL_^1_%CLR A_,INITIALIZE NSAGNS AND LSALNS_^1*_]_^1SEARCH STA* LSALNS_'SEARCH NEXT BLOCK OF SECTORS_^1_%LDA* NSAGNS_^1_%STA* CSACNS_'CHECK IF NO MORE BLOCKS LEFT_^1_%SAZ NOMORE_(NO MORE LEFT, THUS €€NO BLOCK .GE. NUMSEC_^1*_]_^1*_84 CARDS DELETED_^1*_8A = CURRENT SECTOR ADDRESS OF FILE SPACE BLOCK_^1_%RTJ* READMM_+*READ SECTOR CSACNS INTO NSACNS/NSAGNS/CNS_^1*_]_^1_%LDA* CNS_*CHECK IF LENGTH OF BLOCK (CNS) .GE. NUMSEC_^1_%SUB* NUMSEC_^1_%SAP CHKEBS_'YES, CHECK FOR AN EQUAL BLOCK OF SECTORS_^1*_]_^1_%LDA* CSACNS_(NO, CONTINUE SEARCH_^1_%JMP* SEARCH_^1*_]_^1NOMORE SET A_,NO BL€€OCK FOUND .GE. NUMSEC_^1_%EJT_]_^1*_*RETURN SPACE TO THE FILE SPACE POOL OF ITS LOGICAL UNIT_^1*_]_^1CHKEBS LDQ* CSACNS_'CHECK FOR AN EQUAL BLOCK OF SECTORS_^1_%STQ* NSACNS_^1_%SAZ THREAD_)A BLOCK EQUALS THE RETURNED SPACE,_^1*_?(CSACNS,NSAGNS,NUMSEC=CNS) INTO BUFFER._^1_%STQ* NSAGNS_)ALL BLOCKS LESS THAN THE RETURNED SPACE,_^1_%LDA* NUMSEC_.(0,CSACNS=0,NUMSEC) INTO BUFFER._^1_%ST€€A* CNS_*OR_^1_%CLR A_.A BLOCK IS MORE THAN THE RETURNED SPACE,_^1_%STA* NSACNS_.(0,CSACNS,NUMSEC) INTO BUFFER._^1*_]_^1THREAD ENA 3_,THREAD LEFTOVER SECTORS ONTO FILE POOL 66*1446_^1_%STA* WNW_^1_%LDQ* RBL_*Q = ADDRESS OF START OF BUFFER (NSACNS)_^1_%LDA* STRSEC_'A = SECTOR STRSEC_^1_%RTJ* WRITMM_+*STORE BUFFER_#IN SECTOR STRSEC(0/1/2)*_^1*_]_^1_%ENA 1_,SETUP TO STORE ONE WORD O€€N WORD 1 OF SECTOR_^1_%STA* WNW_^1_%STA* WBI_^1_%LDQ* RBL_^1_%INQ STRSEC-NSACNS Q = ADDRESS OF STRSEC_^1_%LDA* LSALNS_'A = SECTOR LSALNS_^1_%SAN NOTBOT_'CHECK IF BEGINNING OF THREAD_^1*_]_^1_%LDA- (ZERO),Q_$YES, STORE IN LU ENTRY RATHER THAN MASS MEMORY_^1_%STA* (FSPADR)_^1_%JMP* RSEXIT_'EXIT_^1*_]_^1NOTBOT RTJ* WRITMM_'NO, *STORE STRSEC_#IN SECTOR LSALNS(1)_"*_^1*_]_^1*_]_^1RSEX€€IT CLR A_,SET FILE SPACE LIST CHANGE FLAG_^1_%STA FSLEND_^1_%LDA- 2,I_*INCREMENT NUMBER OF AVAILABLE SECTORS_^1_%ADD* NUMSEC_^1_%STA- 2,I_^1_%LDA* ISAVE_(RESTORE I REGISTER_^1_%STA- I_^1_%JMP* (RTNSPC)_$RETURN_^1_%EJT_]_^1*_*FILE SPACE PARAMETERS_^1*_]_^1*_]_^1LSALNS NUM 0_$LAST SECTOR ADDRESS WITH A LESSER NUMBER OF SECTORS_^1*_]_^1CSACNS NUM 0_$CURRENT SECTOR ADDRESS WITH CUR€€RENT NUMBER OF SECTORS_^1*_]_^1*_]_^1*_*NEXT THREE WORDS MUST BE IN ORDER_^1NSACNS NUM 0_!1. NEXT SECTOR ADDRESS WITH CURRENT NUMBER OF SECTORS_^1*_]_^1NSAGNS NUM 0_!2. NEXT SECTOR ADDRESS WITH GREATER NUMBER OF SECTORS_^1*_]_^1CNS_"NUM 0_!3. CURRENT NUMBER OF SECTORS IN FILE SPACE BLOCK_^1*_]_^1*_]_^1*_]_^1STRSEC NUM 0_$STARTING SECTOR ADDRESS OF RETURNED SPACE_^1*_]_^1NUMSEC €€NUM 0_$NUMBER OF SECTORS_^1*_]_^1LUELTH NUM 0_$LOGICAL UNIT ENTRY LENGTH (BITS 7-15 OF FIRST WORD)_^1*_]_^1FSPADR NUM 0_$FILE SPACE POOL ADDRESS OF LU ENTRY_^1*_]_^1ISAVE NUM 0_$SAVE FOR I REGISTER_^1_%EJT_]_^1*_*READ/WRITE MASS MEMORY OF FILE SPACE_^1*_]_^1*_]_^1*_1READ MASS MEMORY_^1READMM 000 000_^1*_81 CARD DELETED_^1_%STA* RBS_*A = BEGINNING SECTOR_!FOR READ_^1*_]_^1_%RT€€J MMREAD_^1RBL_"NUM 0_,STARTING LOCATION_^1_%NUM 3_,NUMBER OF WORDS_^1RLU_"NUM 0_,LOGICAL UNIT_^1_%NUM 0_,INDICATE SECTOR ADDRESSING_^1RBS_"NUM 0_,STARTING SECTOR_^1*_]_^1_%SQP RMMEXT_'CHECK IF MASS MEMORY ERROR_^1_%RTJ* MMERR *****MM ERROR, PRINT MESSAGE_,**MSOS 4.1**_^1RMMEXT JMP* (READMM)_$EXIT_^1_%SPC 3_^1*_1WRITE MASS MEMORY_^1WRITMM 000 000_^1_%STQ* WBL_*Q = BEGINNI€€NG LOCATION FOR WRITE_^1_%STA* WBS_*A = BEGINNING SECTOR_!FOR WRITE_^1*_]_^1_%RTJ MMWRIT_^1WBL_"NUM 0_,STARTING LOCATION_^1WNW_"NUM 1_,NUMBER OF WORDS_^1WLU_"NUM 0_,LOGICAL UNIT_^1WBI_"NUM 0_,BEGINNING SECTOR INDEX_^1WBS_"NUM 0_,STARTING SECTOR_^1*_]_^1WRTCMP SQP WMMEXT_'CHECK IF MASS MEMORY ERROR_^1_%RTJ* MMERR *****MM ERROR, PRINT MESSAGE_,**MSOS 4.1**_^1WMMEXT JMP* (WRIT€€MM)_$EXIT_^1_%SPC 2_^1*_1MASS MEMORY ERROR MESSAGE_/**MSOS 4.1**_^1MMERR 000 000_L**MSOS 4.1**_^1_%LDA- PL_M**MSOS 4.1**_^1_%ALS 4_N**MSOS 4.1**_^1_%EOR- PL_+CONSTRUCT FWRITE REQUEST_)**MSOS 4.1**_^1_%EOR* REQCOD_I**MSOS 4.1**_^1_%STA* REQ_L**MSOS 4.1**_^1_%RTJ* ABS_L**MSOS 4.1**_^1ABS_"NOP 0_N**MSOS 4.1**_^1_%LDA* ABS_*CALCULATE THE ABSOLUTE_+**MSOS 4.1**_^1_%ADD* OFF1_)ADDRE€€SSES FOR THE MONITOR CALL_"**MSOS 4.1**_^1_%STA* COM_L**MSOS 4.1**_^1_%ADD* OFF2_K**MSOS 4.1**_^1_%STA* MSG_L**MSOS 4.1**_^1_%LDA- I_N**MSOS 4.1**_^1_%STA* ISVERR_I**MSOS 4.1**_^1*_Z**MSOS 4.1**_^1_%RTJ- (AMONI)_%PRINT ERROR MESSAGE_.**MSOS 4.1**_^1REQ_"ADC 0_N**MSOS 4.1**_^1COM_"ADC 0_N**MSOS 4.1**_^1_%ADC 0_N**MSOS 4.1**_^1_%ADC $18FC_(SYSTEM COMMENT DEVICE_,**MSOS 4.1**_^1_%€€ADC LMSG_K**MSOS 4.1**_^1MSG_"ADC 0_N**MSOS 4.1**_^1_%JMP- (ADISP)_H**MSOS 4.1**_^1*_Z**MSOS 4.1**_^1CP_#LDA* ISVERR_I**MSOS 4.1**_^1_%STA- I_N**MSOS 4.1**_^1_%JMP* (MMERR)_H**MSOS 4.1**_^1*_Z**MSOS 4.1**_^1REQCOD ADC $4C00_(FORMATTED WRITE REQUEST_***MSOS 4.1**_^1OFF1_!ADC CP-ABS_I**MSOS 4.1**_^1OFF2_!ADC ERRMSG-CP_F**MSOS 4.1**_^1ISVERR NUM 0_N**MSOS 4.1**_^1*_Z**MSOS 4.1**€l_^1ERRMSG ALF $,F.M. ERROR 1$_@**MSOS 4.1**_^1_%EQU LMSG(*-ERRMSG)_A**MSOS 4.1**_^1_%SPC 2_^1_%END_]_^__ lPSTOIDX CSY/ F20 P€1_%NAM STOIDX_'DECK-ID F20 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_)CALL STOIDX(FILNUM,KEYVAL,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1_%SPC 2_^1*_*EXTERNALS_^1_%EXT ABSPAR_'ABSOLUTIZES APL_^1_%EXT CKCFIS_'CHECKS CORE FOR FISB_^1_%EX€€T CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT CKUADR_'CHECK LEGALITY OF UNPROTECTED ADDRESS_^1_%EXT GETSPC_'GET ALLOCATABLE CORE SPACE_^1_%EXT MMREAD_'MASS MEMORY READ_^1_%EXT MMWRIT_'MASS MEMORY WRITE_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1*_]_^1_%EXT* GETKID_'GET KIS DIRECTORY_^1_%EXT* HASHCD_'GENERATE HASH (SCATTER) CODE_^1_%EXT* FILSPC_'MM SPACE ALLOCATOR SUB_^1_%E€€XT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_*EQUIVALENCES_^1*_1COMMUNICATION REGION_^1_%EQU ZERO(2)_%ZERO CONSTANT_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU ZROMSK($13)_!ZERO MASK TABLE_^1_%EQU ONEBIT($23)_!ONE BIT TABLE_^1_%EQU ZROBIT($33)_!ZERO BIT TABLE_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUM€€BER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU XTRHDR(1)_#NUMBER OF WORDS IN EXTRA FIFO RECORD_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE€€ FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDRESS (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT €€FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KID€€SEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU €€FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1*_1KIS DIRECTORY HEADER_^1_%EQU KIDCLK(0)_#KIS DIRECTORY CLOCK_^1_%EQU NUMKIB(1)_#NUMBER OF KIS BLOCKS_^1_%EQU KIBFSA(2)_#FIRST SECTOR ADDRESS OF KIS BLOCKS_^1_%EQU KIBLSA(3)_#LAST SECTOR ADDRESS OF KIS BLOCKS_^1_%EJT_]_^1*_)CALL STOIDX(FILNUM,KEYVAL,RECPTR,RECBUF,RECLTH,REQBUF€€,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(LENGTH OF REQUEST PROCESSOR_^1_%SPC 2_^1STOIDX 000 000_*STORE INDEXED_^1_%STQ- I_^1*_]_^1_%ENQ 7_,GET ABSOLUTE ADDRESSES OF ALL PARAMETERS_^1SI010 INQ -1_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ SI020_^1_%JMP* SI010_^1*_]_^1SI020 LDQ* (FILNUM)_$GET FILE NUMBER_^1_%SQZ SI030_^1_%SQP SI100_^1SI03€€0 LDA- ONEBIT+14_#FILE NO ERROR SET BIT 14_^1*_]_^1SI040 EOR- ONEBIT+15_#ERROR EXIT_^1_%STA* (REQIND)_^1_%JMP* (STOIDX)_^1_%SPC 2_^1*_]_^1SI100 RTJ CKCFIS_'CHECK IF FIS IN CORE_^1_%SAP SI110_^1*_]_^1_%LDQ* (FILNUM)_$NOT IN CORE CHECK MM_^1_%RTJ SRHFIS_^1_%SAN SI120_(FILE NOT DEFINED_^1*_]_^1SI110 STQ- I_,I = FIS CORE ADDRESS_^1_%LDA- FISFLG,Q_$CHECK RELEASE STATUS_^1_%SAM €€ SI130_^1SI120 LDA- ONEBIT+0_$ERROR FILE NOT DEFINED_^1_%JMP* SI040_(SET BIT 0_^1_%EJT_]_^1*_*CHECK REQUEST FOR ERRORS_^1SI130 LDA- KIDSEC,Q_$CHECK IF FILE INDEXED_^1_%SAN SI140_^1_%LDA- ONEBIT+11_#FILE NOT DEFINED AS INDEXED_^1_%JMP* SI040_^1*_]_^1SI140 LDA- FISFLG,Q_$CHECK IF FILE PROTECTED_^1_%AND- ONEBIT+14_^1_%SAZ SI150_^1_%RTJ CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SAN €€ SI150_^1_%LDA- ONEBIT+13_#FILE PROTECTED AND UNPROTECTED STORE ATTEMPT_^1_%JMP* SI040_(REJECT CALL_^1*_]_^1SI150 CLR Q_,CHECK PARAMETERS ADDRESSES, IF UNPROTECTED_^1_%LDA* RECPTR_^1_%RTJ* (ACUADR)_$IF CALLER UNPROTECTED, CHECK RECORD PTR ADR_^1_%INA 1_^1_%RTJ* (ACUADR)_^1*_]_^1_%LDA* RECBUF_'SAVE RECORD BUFFER ADDRESS_^1_%STA RECBFR_^1_%RTJ* (ACUADR)_$CHECK FIRST WORD ADDRESS €€OF RECORD BUFFER_^1*_]_^1_%LDA* (RECLTH)_$CHECK IF RECORD LENGTH POSITIVE AND NON-ZERO_^1_%STA RECLGH_^1_%SAZ SI160_^1_%SAM SI160_^1_%LDQ- FISIND,I_$CHECK IF INDEXED/LINKED_^1_%SQP SI170_^1_%INA -3_+YES, RECORD MUST BE .GE. 3_^1_%SAP SI170_^1SI160 JMP* SI030_(NO, ILLEGAL PARAMETER_^1*_]_^1SI170 LDA- FISFLG,I_$SAVE KIS LOGICAL UNIT_^1_%ARS 7_^1_%AND- ONEMSK+6_^1_%STA* KIBLU€€_^1*_]_^1_%LDA- FRBSIZ,I_$GET FILE RECORD BLOCK SIZE_^1_%AND- ONEMSK+8_^1_%STA FRBSZ_(SAVE FILE RECORD BLOCK SECTOR SIZE_^1_%MUI =XWRDSEC_^1_%STA* NWFRB_(SAVE NUMBER OF WORDS IN FRB_^1_%INA -FRBHDR_^1_%SUB* (RECLTH)_$CHECK IF MAXIMUN RECORD LENGTH EXCEEDED_^1_%SAM SI215_(YES, ERROR_<63*1349_^1_%EJT_]_^1*_*GET INDICATORS AND SPACE FOR KIS BLOCK_^1*_]_^1_%LDA- FISIND,I_$SETUP IND€€EXED INDICATORS_^1_%ALS 1_^1_%STA* IDXOFG_'SET INDEXED/ORDERED FLAG IF INDEXED/ORDERED_^1_%ALS 3_^1_%AND- ONEBIT+1_$SET FIFO FLAG IF FIRST-IN, FIRST-OUT SELECTED_^1_%STA* FIFOFG_^1_%SAZ SI230_)NOT FIFO_^1*_]_^1_%LDA- FIFORL,I_$CHECK IF FIRST INTO FIFO FILE_^1_%SAN SI210_^1_%LDA* (RECLTH)_$YES, SET FIFO RECORD LENGTH_^1_%STA- FIFORL,I_^1*_]_^1SI210 STA RECLGH_'RESET LENGTH FOR€€ STORE_063*1349_^1_%SUB* (RECLTH)_$CHECK IF RECORD LENGTH .LE. FIXED LEN. 63*1349_^1SI215 SAM SI220_(NO. NOTE ERROR_763*1349_^1_%JMP* SI230_O63*1349_^1SI220 LDA- ONEBIT+2_$RECORD LENGTH TOO LONG OR DIFFERENT(IF FIFO)_^1_%JMP* SI040_^1*_]_^1SI230 ENA WRDSEC_'GET NUMBER OF WORDS IN KIS BLOCK_^1_%MUI- KIBSIZ,I_^1_%STA* NWKIB_^1_%STA NWKB_^1*_]_^1_%INA 5_,(FOR ORDERED FIFO KIS €€BLOCK OVERFLOW)_^1_%RTJ GETSPC_'GET SPACE FOR KIS BLOCK_^1_%STQ* KIBLOC_^1_%EJT_]_^1*_*FIND HASH INDEX INTO KIS DIRECTORY TO GET KIS BLOCK SECTOR_^1*_]_^1_%ENA WRDSEC_'GET NUMBER OF WORD IN KIS DIRECTORY - HEADER_^1_%MUI- KIDSIZ,I_^1_%INA -KIDHDR_^1_%STA* NWKID_^1*_]_^1_%LDA* IDXOFG_'CHECK IF INDEXED-ORDERED_^1_%SAM SI240_^1*_]_^1_%LDA* KEYVAL_'NO, GET HASH CODE_^1_%RTJ HASHCD€€_)A = KEY VALUE ADDRESS_^1_%DVI* NWKID_^1_%JMP* SI270_(SAVE KIS DIRECTORY INDEX AND CONTINUE_^1_%SPC 2_^1SI240 LDA* (KEYVAL)_$INDEXED/ORDERED, CHECK KEY VALUE_^1_%SAP SI250_^1_%CLR A_,NEGATIVE, USE INDEX ZERO_^1*_]_^1SI250 SUB- NUMEKV,I_^1_%SAM SI260_^1_%ENA -1_+TOO LARGE, USE LARGEST INDEX_^1*_]_^1SI260 ADD- NUMEKV,I_^1_%MUI* NWKID_(INDEX = (KEYVAL*NWKID)/NUMEKV_^1_%DVI- N€€UMEKV,I_^1_%TRA Q_^1*_]_^1SI270 INQ KIDHDR_'SAVE INDEX INTO KIS DIRECTORY_^1_%STQ* KIDIDX_^1_%JMP* SRHKIS_'SEARCH FOR KIS_^1_%EJT_]_^1*_*STORE INDEXED PARAMETERS_^1*_]_^1FILNUM ADC 0_,FILE NUMBER ADDRESS_^1KEYVAL ADC 0_,KEY VALUE ADDRESS_^1RECPTR ADC 0_,RECORD POINTER ADDRESS_^1RECBUF ADC 0_,RECORD BUFFER ADRESS_^1RECLTH ADC 0_,RECORD LENGTH ADDRESS_^1REQBUF ADC 0_,REQUEST€€ BUFFER ADDRESS_^1REQIND ADC 0_,REQUEST INDICATOR ADDRESS_^1*_]_^1NWFRB NUM 0_,NUMBER OF WORDS IN FILE RECORD BLOCK_^1IDXOFG NUM 0_,INDEXED/ORDERED FLAG_^1FIFOFG NUM 0_,INDEXED/LINKED FIRST-IN, FIRST-OUT FLAG_^1NWKID NUM 0_,NUMBER OF WORDS IN KIS DIRECTORY_^1KIDIDX NUM 0_,KIS DIRECTORY INDEX_^1*_]_^1ACUADR ADC CKUADR_'CHECK IF AN UNPROTECTED ADDRESS_^1_%EJT_]_^1*_*READ IN €€KIS BLOCK_^1*_]_^1REDKIB 000 000_^1_%STA* KIBSEC_'SAVE KIS BLOCK SECTOR_^1*_]_^1_%RTJ MMREAD_'READ IN NEXT KIS BLOCK_^1KIBLOC NUM 0_,KIS BLOCK ADDRESS_^1NWKIB NUM 0_,NUMBER OF WORDS IN KIS BLOCK_^1KIBLU NUM 0_,KIS LOGICAL UNIT_^1_%NUM 0_^1KIBSEC NUM 0_,KIS BLOCK SECTOR_^1*_]_^1_%SQM MMERR_"*****MASS MEMORY ERROR_^1_%JMP* (REDKIB)_$EXIT_^1_%SPC 5_^1MMERR LDA- ONEBIT+7 **€€***MASS MEMORY ERROR_^1*_]_^1RQERR EOR- ONEBIT+15_#REQUEST ERROR, SET BIT 15_^1*_]_^1RQEXIT STA* (REQIND)_$REQUEST EXIT_^1_%RTJ- (AMONI)_%SET REQUEST INDICATOR AND RELEASE KIS BLOCK_^1_%NUM $1800_^1RELKIB NUM 0_^1*_]_^1_%JMP (STOIDX)_$EXIT_^1_%EJT_]_^1*_*SEARCH FOR KIS IN KIS BLOCK(S)_^1*_]_^1SRHKIS ENA 2_,SEARCH FOR KIS ON KIS BLOCK(S)_^1_%ADD* FIFOFG_^1_%STA* PNTLTH_'SAVE PO€€INTER LENGTH (2 OR 4)_^1_%STA PNTLGH_^1_%ADD- KEYLTH,I_^1_%STA* KISLTH_'SAVE KIS LENGTH_^1_%STA KISLGH_^1*_]_^1_%LDA* KIBLOC_'SAVE KIS BLOCK FOR RELEASING SPACE_^1_%STA* RELKIB_^1_%INA KIBHDR_^1_%ADD* PNTLTH_'SAVE FIRST KIS BLOCK KEY POINTER_^1_%STA* KIB1KP_^1*_]_^1_%RTJ GETKID_'GET THE KIS DIRECTORY_^1_%STQ* KIDLOC_^1_%LDA* (KIDIDX),Q_"GET AND SAVE KIS BLOCK POINTER_^1_%STA* K€€IBSEC_^1_%SAN GNXKIB_'GET KIS BLOCK (IF IT EXISTS)_^1*_]_^1_%ENQ 0_)...CASE A (NO KIS BLOCK EXISTS FOR THIS KEY)_^1_%JMP* SAVCAS_^1_%EJT_]_^1*_*SEARCH NEXT KIS BLOCK_^1*_]_^1GNXKIB RTJ* REDKIB_'GET NEXT KIS BLOCK_^1*_]_^1_%LDA* KIB1KP_'RESET KEY POINTER_^1_%STA* KEYPTR_^1_%LDQ* KIBLOC_'CHECK NEXT KIS BLOCK_^1_%LDA- 2,Q_^1_%STA* NUMKIS_'SAVE NUMBER OF KIS,S IN BLOCK_^1*_]_^1CNXKIS€€ INA -1_+CHECK NEXT KIS, DECREMENT KIS COUNT_^1_%STA* KISCNT_^1_%SAM CHKOVF_'NO MORE KIS,S, CHECK IF OVERFLOW BLOCKS_^1*_]_^1_%LDQ- KEYLTH,I_^1CNXWRD INQ -1_+CHECK NEXT WORD OF KEY_^1_%LDA* (KEYVAL),Q_^1_%SUB* (KEYPTR),Q_^1_%SAM CHKORD_'KEY VALUE .LT. KIS KEY VALUE, CHECK ORDERED_^1_%SAN GNXKIS_^1_%SQZ SRHEXT_'KEY FOUND, EXIT Q = 0_^1_%JMP* CNXWRD_^1*_]_^1CHKORD LDQ* IDXOFG_'€€CHECK IF INDEXED/ORDERED_^1_%SQM SRHEXT_)YES, KEY NOT FOUND AND NOT MAX, EXIT Q .LT.0_^1*_]_^1GNXKIS LDA* KISCNT_'CHECK IF ALL KIS,S IN THIS BLOCK CHECKED_^1_%LDQ* KEYPTR_^1_%ADQ* KISLTH_'INCREMENT POINTER_^1_%STQ* KEYPTR_^1_%JMP* CNXKIS_'CONTINUE SEARCH_^1*_]_^1CHKOVF LDQ* KIBLOC_'YES, CHECK IF AN OVERFLOW KIS BLOCK EXISTS_^1_%LDA- 1,Q_^1_%SAZ SRHEXT_)NO, KIS NOT FOUND, EXIT Q €€.GT. 0_^1_%JMP* GNXKIB_)YES, GET NEXT KIS OVERFLOW BLOCK_^1_%EJT_]_^1*_*SET KIS BLOCK CASE INDEX_^1*_]_^1SRHEXT LDA* KEYPTR_'SEARCH EXIT_^1_%SUB* PNTLTH_^1_%STA* KISPTR_'SET KIS POINTER FROM ITS KEY POINTER_^1_%STA KISPNT_^1_%SQN CKFULL_'KIS NOT FOUND, CHECK IF KIS BLOCK FULL_^1*_]_^1_%ENQ 1_)...CASE B (KIS EXISTS), CHECK IF INDEXED/LINKED_^1_%LDA- FISIND,I_^1_%SAM SAVCAS_)YES,€€ ITS OK_^1*_]_^1_%LDA- ONEBIT+4_'NO, ERROR (RECORD ALREADY EXISTS)_^1_%JMP* RQERR_(REQUEST ERROR_^1*_]_^1CKFULL STQ* KIBCIX_'SAVE KIS BLOCK SEARCH INDICATOR_^1_%LDA* NUMKIS_^1_%INA 1_^1_%MUI* KISLTH_'CHECK IF KIS BLOCK FULL_^1_%INA KIBHDR_^1_%TCA A_^1_%ADD* NWKIB_^1*_]_^1_%ENQ 3_^1_%SAP SAVCAS_#...CASE D (NO KIS, KIS WILL FIT IN THIS KIS BLK)_^1*_]_^1_%ENQ 4_^1_%LDA* KIBCIX_#€€...CASE E (NO KIS, OVERFLOW, KIS TO NEW NEXT KIB)_^1_%SAP SAVCAS_^1*_]_^1_%ENQ 5_)...CASE F (NO KIS, OVERFLOW, KIS IN THIS KIS BLK)_^1*_]_^1SAVCAS LDA- ONEBIT,Q_$SAVE KIB CASE INDEX_^1_%STA* KIBCIX_'(KIB CASES A,B,C,D,E,F = 1,2,4,8,$10,$20)_^1_%STA KIBCAS_'(NOTE---NO CASE C IS NEEDED ANYMORE)_^1_%JMP* SI400_^1_%EJT_]_^1*_*STORE INDEXED PARAMETERS_^1*_]_^1PNTLTH NUM 0_,KIS POINT€€ER LENGTH_^1KISLTH NUM 0_,KIS LENGTH_^1KIB1KP NUM 0_,POINTER TO FIRST KIS KEY IN KIS BLOCK_^1KIDLOC NUM 0_,KIS DIRECTORY LOCATION_^1KEYPTR NUM 0_,KIS KEY POINTER_^1NUMKIS NUM 0_,NUMBER OF KIS IN KIS BLOCK_^1KISCNT NUM 0_,KIS COUNT OF KIS,S SEARCHED IN A KIS BLOCK_^1KISPTR NUM 0_,KIS POINTER_^1KIBCIX NUM 0_,KIS BLOCK CASE INDEX_^1*_]_^1RECLGH ADC 0_,RECORD LENGTH_^1FRBCIX N€€UM 0_,FILE RECORD BLOCK CASE INDEX_^1RECBFR ADC 0_,RECORD BUFFER ADDRESS_^1_%EJT_]_^1*_*CHECK FOR WHICH FRB CASE AND SET FRB CASE INDEX_^1*_]_^1SI400 LDA- FRBFSA,I_$CHECK IF NO FILE RECORD BLOCKS_^1_%SAZ SI405_*YES_^1*_]_^1_%LDA* NWFRB_(COMPUTE A=NWFRB-FRBNIX-RECLGH_^1_%SUB- FRBNIX,I_^1SI405 SUB* RECLGH_^1*_]_^1_%LDQ* FIFOFG_'CHECK IF INDEXED/LINKED FIFO_^1_%SQN SI420_*YES_^1€€*_]_^1_%LDQ- ONEBIT+1_$CASE 1--NOT INDEXED/LINKED FIFO,_^1_%SAP SI410_.--ROOM IN LAST FRB._^1*_]_^1_%LDQ- ONEBIT+2_$CASE 2--NOT INDEXED/LINKED FIFO,_^1SI410 JMP* SI490_.--NOT ENOUGH ROOM IN LAST FRB._^1*_]_^1SI420 LDQ* KIBCIX_'CHECK IF KIS EXISTS (CASE B)_^1_%INQ -2_^1_%SQZ SI430_*YES_^1_%JMP* SI470_*NO_^1*_]_^1SI430 LDQ* KISPTR_'CHECK IF ROOM IN FRB (A.GT.0)_^1_%SAM SI450_*€€NO_^1*_]_^1_%LDA- 2,Q_^1_%SUB- FRBLSA,I_$CHECK IF LAST RECORD OF THIS KEY IS_^1_%SAN SI440_(LAST RECORD OF THE FILE_^1_%LDA- 3,Q_^1_%ADD* RECLGH_^1_%SUB- FRBNIX,I_^1*_]_^1_%LDQ- ONEBIT+3_$CASE 3--IND/LINK FIFO, KIS, ROOM IN LAST FRB,_^1_%SAZ SI445_.--LAST RECORD OF THIS KEY IS LAST RCRD._^1*_]_^1SI440 LDQ- ONEBIT+4_$CASE 4--IND/LINK FIFO, KIS, ROOM IN LAST FRB,_^1SI445 JMP* SI4€€90_.--LAST RECORD OF THIS KEY NOT LAST ONE._^1_%EJT_]_^1*_*CONTINUE CHECKING FOR WHICH FRB CASE AND SET FRB CASE INDEX_^1*_]_^1SI450 LDA- 2,Q_*CHECK IF LAST RECORD OF THIS KEY IS_^1_%SUB- FRBLSA,I_$FIRST RECORD OF LAST FRB._^1_%SAN SI460_^1_%LDA- 3,Q_^1_%INA -FRBHDR_^1*_]_^1_%LDQ- ONEBIT+5_$CASE 5--IND/LINK FIFO,KIS,NO ROOM IN LAST FRB,_^1_%SAZ SI465_.--LAST KEY REC=FIRST RECOR€€D OF LAST FRB._^1*_]_^1SI460 LDQ- ONEBIT+6_$CASE 6--IND/LINK FIFO,KIS,NO ROOM IN LAST FRB,_^1SI465 JMP* SI490_.--LAST KEY REC NOT 1ST REC OF LAST FRB._^1*_]_^1SI470 SAM SI480_(CHECK IF ROOM IN FRB (A.GT.0)_^1_%SUB* RECLGH_)YES, CHECK IF ROOM FOR 2 RECORDS IN LAST FRB_^1*_]_^1_%LDQ- ONEBIT+7_$CASE 7--IND/LINK FIFO,NO KIS,ROOM IN LAST FRB,_^1_%SAP SI475_.--ROOM FOR BOTH RECORDS €€IN LAST FRB._^1*_]_^1_%LDQ- ONEBIT+8_$CASE 8--IND/LINK FIFO,NO KIS,ROOM IN LAST FRB,_^1SI475 JMP* SI490_.--NOT ROOM FOR BOTH RECORDS IN LAST FRB._^1*_]_^1SI480 ADD- FRBNIX,I_$CHECK IF ROOM FOR BOTH RECORDS IN ONE FRB_^1_%SUB* RECLGH_^1_%INA -FRBHDR_^1*_]_^1_%LDQ- ONEBIT+9_$CASE 9--IND/LINK FIFO,NO KIS,NO ROOM LAST FRB,_^1_%SAP SI490_.--ROOM FOR BOTH RECORDS IN ONE FRB._^1*_]_^1€€_%LDQ- ONEBIT+10_#CASE10--IND/LINK FIFO,NO KIS,NO ROOM 74*1791_^1*_8LAST FRB,_;74*1791_^1*_>--NOT ENUF ROOM FOR BOTH RECORDS IN FRB._^1*_]_^1SI490 STQ* FRBCIX_'SAVE FILE RECORD BLOCK CASE INDEX_^1_%STQ FRBCAS_^1_%EJT_]_^1*_*SETUP MASS MEMORY PARAMETERS FOR WRITING RECORD_^1*_]_^1_%LDQ* RECBFR_'GET RECORD BUFFER ADDRESS_^1_%STQ CA4_^1_%INQ -FRBHDR+1_^1_%STQ* CA3_*STORE RECORD BU€€FFER ADDRESS - 2_^1_%INQ -1_^1_%STQ* CA2_*STORE RECORD BUFFER ADDRESS - 3_^1_%ADQ* RECLGH_^1_%STQ* CA1_*STORE EXTRA RECORD - 3_^1_%INQ FRBHDR_^1_%STQ XTRREC_'SAVE ADDRESS OF EXTRA RECORD_^1*_]_^1_%ENQ FRBHDR+XTRHDR SET 4 WORDS FOR FRB HEADER AND EXTRA RECORD_^1_%STQ* NW1_^1*_]_^1_%LDQ* RECLGH_'STORE RECORD LENGTH INTO FIRST WORD OF BUFFER_^1_%STQ* (RECBFR)_^1_%STQ RECLNG_'SAVE€€ RECORD LENGTH_^1*_]_^1_%LDA* FRBCIX_^1_%AND =N$288_^1_%SAZ SI530_^1_%INQ XTRHDR_^1SI530 STQ* NW4_*SAVE RECORD LENGTH (+1 FOR CASES 3, 7, 9)_^1_%INQ FRBHDR_^1_%STQ* NW2_*SAVE RECORD LENGTH+3 (+1 FOR CASES 3, 7, 9)_^1*_]_^1_%LDA- FISFLG,I_$GET LOGICAL UNIT FOR FRB_^1_%AND- ONEMSK+6_^1_%STA* LU1_^1_%STA* LU2_^1_%STA* LU3_^1_%STA* LU4_^1_%RTJ SETUP_(SETUP FOR WRITING RECORD TO M€€ASS MEMORY_^1_%EJT_]_^1*_*WRITE EXTRA FIFO RECORD (AND ITS FRB HEADER IF IT STARTS A_^1*_*NEW FRB) WHEN IT DOESNT IMMEDIATELY FOLLOW ACTUAL RECORD_^1*_]_^1_%CLR A_,CLEAR INDEXES FOR WRITES 1 AND 2_^1_%STA* FRBID1_^1_%STA* FRBID2_^1*_]_^1_%LDA* FRBCIX_'CHECK IF WRITING EXTRA RECORD FOR_^1_%AND =N$570_'CASES 4, 5, 6, 8, 10._^1_%ALS 11_^1_%SAN SI540_^1_%CLR Q_^1_%JMP* SI560_(NO, €€CONTINUE PROCESSING_^1*_]_^1SI540 LDQ NXTLSA_'CHECK IF CASE 4_^1_%SAP SI550_(NO, WRITE EXTRA RECORD PLUS NEXT LAST FRB HDR_^1*_]_^1_%ENA XTRHDR_'CASE 4, SET 1 WORD OF EXTRA RECORD_^1_%STA* NW1_^1_%LDA- ONEBIT+15_#SET FIRST WORD OF EXTRA RECORD TO $8000_^1_%STA* (CA1)_^1_%LDQ- FRBLSA,I_$GET SECTOR/INDEX TO WRITE EXTRA RECORD ONLY_^1_%LDA- FRBNIX,I_^1_%STA* FRBID1_^1SI550 STQ* F€€RBSC1_^1*_]_^1_%RTJ (AMMWRT)_$WRITE EXTRA RECORD FOR_.74*1792_^1*_8CASES 4, 5, 6, 8, 10_074*1792_^1CA1_"NUM 0_.(WRITE ALSO NEXT LAST FRB HDR, EXCEPT CASE4)_^1NW1_"NUM 0_^1LU1_"NUM 0_^1FRBID1 NUM 0_^1FRBSC1 NUM 0_^1*_]_^1SI560 LDA TEMP1_O63*1387_^1_%STA* (CA1)_(RESTORE XTRREC-3, XTRREC-2, AND XTRREC-1_^1_%RAO* CA1_^1_%LDA TEMP2_M74*1792_^1_%STA* (CA1)_^1_%RAO* CA1_^1_%LDA €€TEMP3_^1_%STA* (CA1)_^1*_]_^1_%SQP SI600_^1_%JMP* SI700_"*****MASS MEMORY ERROR_^1_%EJT_]_^1*_*WRITE RECORD (AND EXTRA FIFO RECORD IF IT IMMEDIATELY FOLLOW_^1*_*RECORD) AND ITS NEW FRB HEADER WHEN THEY ARE ADJACENT_^1*_]_^1SI600 LDA FRBCAS_'CHECK FOR CASES 2,9,10_^1_%AND =N$604_^1_%SAN SI610_^1_%JMP* SI640_(NO, GO TO NEXT DECISION CHECK._^1*_]_^1SI610 LLS 21_+CHECK FOR CASE €€10 (RECORD NEEDS ALL NEXT FRB)_^1_%LDA* NXTLSA_)CASE 2, WRITE RECORD AND NEXT LAST FRB HDR._^1_%SQP SI620_*CASE 9, WRITE BOTH RECORDS AND NEXT LAST HDR_^1_%SUB* FRBSZ_*CASE 10, WRITE REC AND NEXT PENULTIMATE HDR._^1SI620 STA* FRBSC2_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE RECORD AND ITS FRB HEADR FOR 2, 9, 10_^1CA2_"NUM 0_^1NW2_"NUM 0_^1LU2_"NUM 0_^1FRBID2 NUM 0_^1FRBSC2 NUM 0_^1*_]_€€^1_%SQP SI630_^1_%JMP* SI700_"*****MASS MEMORY ERROR_^1*_]_^1SI630 LDQ* CA3_*SET RECBFR-2, RECBFR-1 TO NXTLSA, NRLFRB FOR_^1_%LDA* FRBSC2_'CASES 2/9 (TO NXTLSA-FRBSZ,NRLFRB FOR CASE 10)_^1_%STA- (ZERO),Q_$(NEXT PENULTIMATE FRB HDR FOR CASES 2/9)_^1_%LDA- NRLFRB,I_$(NEXT SECOND- FROM- LAST FRB HDR FOR CASE 10)_^1_%STA- 1,Q_^1_%EJT_]_^1*_*WRITE FRB HEADER IN LAST FRB WHEN A NEW LAS€€T FRB HAS BEEN_^1*_*ALLOCATED, AND ALSO THE RECORD IF IT IS FIRST IN LAST FRB_^1*_]_^1SI640 LDA* FRBCAS_'CHECK FOR CASES 2, 5, 6, 8, 9, 10_^1_%AND =N$764_^1_%SAZ SI647_(NO, GO TO NEXT DECISION POINT_^1*_]_^1_%ENQ 2_,SET NW3 = 2, UNLESS CASE 5_^1_%ALS 10_^1_%SAP SI645_^1_%ADQ* NW4_*CASE 5, SET NW3 = RECLTH + 2_^1SI645 STQ* NW3_^1*_]_^1_%LDA- FRBLSA,I_$CHECK IF NO FILE RECORD €€BLOCK ASSIGNED YET_^1SI647 SAZ SI650_*NONE, DONT WRITE FRB HEADER_^1_%ENQ 1_^1_%STA* FRBSC3_^1_%STQ* FRBID3_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE FRB HEADER TO LAST FRB._^1CA3_"NUM 0_^1NW3_"NUM 0_^1LU3_"NUM 0_^1FRBID3 NUM 0_^1FRBSC3 NUM 0_^1*_]_^1_%SQP SI650_^1_%JMP* SI700_"*****MASS MEMORY ERROR_^1_%EJT_]_^1*_*WRITE RECORD (AND EXTRA FIFO RECORD IF IT IMMEDIATELY FOLLOW_^1*_*REC€€ORD) WHEN IT ISNT AT START OF LAST OR NEW LAST FRB_^1*_]_^1SI650 LDA =N$182_'CHECK FOR CASES 1, 7, 8_^1_%AND* FRBCAS_^1_%SAN SI660_^1_%LDQ KISPTR_^1_%LDA- 3,Q_*NO, SECOND KIS POINTER POINTS TO RECORD_^1_%LDQ- 2,Q_^1_%JMP* SI670_^1*_]_^1SI660 LDQ- FRBLSA,I_$YES, RECORD IS NEXT RECORD IN NEXT LAST FRB_^1_%LDA- FRBNIX,I_^1_%STQ* FRBSC2_'SAVE RECORD POINTER IN SECTOR/INDEX FORM_^1€€_%STA* FRBID2_^1*_]_^1SI670 STQ* FRBSC4_'SAVE SECTOR/INDEX IN WRITE CALL_^1_%STA* FRBID4_^1*_]_^1_%CLR Q_^1_%LDA* FRBCAS_'CHECK FOR CASES 1, 3, 4, 6, 7, 8._^1_%AND =N$1DA_^1_%SAZ SI700_(NO, RESTORE USER,S CODE_^1*_]_^1_%RTJ* (AMMWRT)_$WRITE OUT RECORD FOR CASES 1, 3, 4, 6, 7, 8._^1CA4_"NUM 0_,(PLUS EXTRA RECORD FOR CASES 3 AND 7)_^1NW4_"NUM 0_^1LU4_"NUM 0_^1FRBID4 NUM 0_^1F€€RBSC4 NUM 0_^1_%EJT_]_^1*_*RESTORE USER CODE AND SET FRB VARIABLES_^1*_]_^1SI700 LDA* SAVE1_(RESTORE RECBFR-3, RECBFR-2, AND RECBFR-1_^1_%STA* (CA2)_^1_%RAO* CA2_^1_%LDA* SAVE2_^1_%STA* (CA2)_^1_%RAO* CA2_^1_%LDA* SAVE3_^1_%STA* (CA2)_^1*_]_^1_%LDA* HOLD_)RESTORE XTRREC = RECBFR + RECLGH_^1_%STA* (XTRREC)_^1_%SQP SI710_^1*_]_^1_%JMP MMERR_"*****MASS MEMORY ERROR_^1*_]_^1SI710 €€LDA* NXTNIX_'INCREMENT LAST FRB INDEX PAST RECORD_^1_%ADD* RECLNG_^1_%STA- FRBNIX,I_^1*_]_^1_%LDA* NXTNR_(INCREMENT NUMBER OF RECORDS IN LAST FRB_^1_%INA 1_^1_%STA- NRLFRB,I_^1*_]_^1_%LDA* NXTLSA_'STORE NEXT LAST FRB (IF CHANGED)_^1_%STA- FRBLSA,I_^1*_]_^1_%LDQ- FRBFSA,I_$CHECK IF FIRST FRB_^1_%SQN SI720_^1_%STA- FRBFSA,I_'YES, SET FIRST FRB_^1*_]_^1SI720 LDA =N$0764_%CHECK IF €€NEW FRB ADDED_063*1387_^1_%AND* FRBCAS_N63*1387_^1_%SAZ SI730_(SKIP IF NO_<63*1387_^1_%RAO- NUMFRB,I_L63*1387_^1_%AND- ONEBIT+10_#CHECK IF CASE 10_^1_%SAZ SI730_^1_%RAO- NUMFRB,I_$YES, INCREMENT NUMBER OF FRB,S AGAIN_^1_%LDA- FRBFSA,I_$CHECK IF FIRST FRB_^1_%SUB- FRBLSA,I_^1_%SAN SI730_(SKIP IF NO_^1_%LDA- FRBFSA,I_$RESET FIRST FRB TO CORRECT ADDRESS_!74*1792_^1_%SUB* FRBSZ_M74*€€1792_^1_%STA- FRBFSA,I_J74*1792_^1*_]_^1SI730 ENA -1_^1_%AND- IDXCHG,I_^1_%INA 1_,SET FIS CHANGE BIT_^1_%STA- IDXCHG,I_^1*_]_^1_%LDQ* NXTLSA_'CONTINE WITH SECTOR/INDEX_^1_%LDA* NXTNIX_^1_%JMP* SI800_^1_%EJT_]_^1*_*STORE INDEXED PARAMETERS_^1*_]_^1AMMWRT ADC MMWRIT_'MASS MEMORY WRITE ADDRESS_^1*_]_^1NXTLSA NUM 0_,NEXT LAST FRB SECTOR ADDRESS_^1NXTNR NUM 0_,NEXT NUMBER OF RECO€€RDS IN NEXT LAST FRB_^1NXTNIX NUM 0_,NEXT INDEX INTO NEXT LAST FRB_^1FRBSZ NUM 0_,FILE RECORD BLOCK SIZE, IN SECTORS_^1*_]_^1SAVE1 NUM 0_,SAVE RECORD BUFFER - 3_^1SAVE2 NUM 0_,SAVE RECORD BUFFER - 2_^1SAVE3 NUM 0_,SAVE RECORD BUFFER - 1_^1TEMP1 NUM 0_,SAVE EXTRA RECORD BUFFER - 3_^1TEMP2 NUM 0_,SAVE EXTRA RECORD BUFFER - 2_^1TEMP3 NUM 0_,SAVE EXTRA RECORD BUFFER - 1_€€^1HOLD_!NUM 0_,SAVE EXTRA RECORD BUFFER + 0_^1*_]_^1FRBCAS NUM 0_,FILE RECORD BLOCK CASE INDEX_^1XTRREC NUM 0_,EXTRA RECORD ADDRESS (USED FOR FIFO FILES)_^1RECLNG NUM 0_,RECORD LENGTH_^1_%EJT_]_^1*_*SETUP FOR WRITING RECORD TO MASS MEMORY_^1*_]_^1SETUP 000 000_^1_%LDA- FRBLSA,I_$SAVE LAST SECTOR ADDRESS, NUMBER OF_^1_%STA* NXTLSA_)RECORDS, AND INDEX INTO LAST FRB._^1_%LDA- NR€€LFRB,I_^1_%STA* NXTNR_^1_%LDQ- FRBNIX,I_^1*_]_^1_%LDA* FRBCAS_'CHECK FOR CASES 2,5,6,8,9,10 WHICH NEED SPACE_^1_%AND =N$764_^1_%SAN SU010_^1_%JMP* SU050_)NO, GO TO NEXT DECISION CHECK_^1*_]_^1SU010 LDQ* FRBSZ_)YES, CHECK FOR CASE 10_^1_%AND- ONEBIT+10_^1_%SAZ SU020_^1_%QLS 1_-CASE 10, GET TWO FILE RECORD BLOCKS_^1*_]_^1SU020 ADQ- ONEBIT+15_#GET FILE SPACE FOR NEW FILE RECORD €€BLOCK_^1_%LDA* LU4_^1_%RTJ FSPACE_^1*_]_^1_%LDA* FRBCAS_'CHECK FOR CASE 10_^1_%AND- ONEBIT+10_^1_%SAZ SU040_^1_%ADQ* FRBSZ_)CASE 10, ADJUST TO SECOND FRB_^1SU040 STQ* NXTLSA_'SET SECTOR ADDRESS OF NEXT LAST FRB_^1*_]_^1_%CLR A_,CLEAR NUMBER OF RECORDS IN NEXT LAST FRB_^1_%STA* NXTNR_^1_%ENQ FRBHDR_'SET INDEX INTO NEXT LAST FRB_^1*_]_^1SU050 LDA* FRBCAS_'CHECK FOR CASES 7 AND €€9_^1_%AND =N$280_^1_%SAZ SU060_^1_%RAO* NXTNR_)YES, INCREMENT NUMBER OF RECORDS AND INDEX_^1_%ADQ* RECLNG_*DUE TO A RECORD BEING STORED_^1*_]_^1SU060 STQ* NXTNIX_'SET NEXT INDEX INTO NEXT LAST FRB_^1_%EJT_]_^1*_)SETUP INDEXED/LINKED POINTER AND RETURN_^1*_]_^1_%LDA FIFOFG_'CHECK IF INDEXED/LINKED FIFO_^1_%SAN SU066_^1*_]_^1_%LDA- FISIND,I_$N/,CHECK IF INDEXED/LINKED LIFO_^1_%S€€AM SU062_^1_%JMP* SU070_(NO,GO TO NEXT DECISION CHECK_^1*_]_^1SU062 CLR Q_,INDEXED/LINKED LIFO,CHECK IF KIS EXISTS_^1_%ENA 2_^1_%AND KIBCAS_^1_%SAN SU064_(YES_^1*_]_^1_%JMP* SU068_(NO KIS EXISTS,CLEAR INDEXED/LINKED POINTER_^1*_]_^1SU064 LDQ KISPNT_'SET INDEXED/LINKED POINTER TO KIS POINTER_^1_%LDA- 1,Q_^1_%LDQ- (ZERO),Q_^1_%JMP* SU068_^1*_]_^1SU066 LDQ* NXTLSA_'INDEED/LIN€€KED FIFO_^1_%LDA* NXTNIX_'SET INDEX/LINKED PTR TO NEXT (EXTRA) RECORD_^1*_]_^1SU068 STQ* TEMP1_^1_%LDQ RECBFR_^1_%STA- 2,Q_*STORE INDEXED/LINKED POINTER INTO RECORD_^1_%LDA* TEMP1_^1_%STA- 1,Q_^1_%EJT_]_^1*_*SAVE AND SETUP BUFFER VARIABLES_^1*_81 CARD DELETED_663*1349_^1SU070 LDQ CA2_*SAVE RECBFR-3,RECBFR-2,AND RECBFR-1_^1_%LDA- (ZERO),Q_^1_%STA* SAVE1_^1_%LDA- 1,Q_^1_%STA* SAV€€E2_^1_%LDA- 2,Q_^1_%STA* SAVE3_^1_%LDA- FRBLSA,I_$SET RECBFR-3 TO FRBLSA_^1_%STA- (ZERO),Q_^1_%CLR A_,CLEAR RECBFR-2, RECBFR-1 FOR CASES 2 AND 9_^1_%STA- 2,Q_,(NEXT LAST FRB HEADER)_^1_%LDA* FRBCAS_^1_%AND =N$560_^1_%SAZ SU090_^1_%ARS 8_,SET RECBFR-2, RECBFR-1, TO NXTLSA, NRLFRB FOR_^1_%SAZ SU075_(CASES 5 AND 6 (NEXT PENULTIMATE FRB HEADER)_^1_%ARS 2_,SET RECBFR-2, RECBFR-1 T€€O NXTLSA,1 FOR CASE 10_^1_%SAN SU080_*(NEXT PENULTIMATE FRB HEADER)_^1_%ENA 1_,SET RECBFR-2, RECBFR-1 TO NXTLSA, NRLFRB+1 FOR_^1SU075 ADD- NRLFRB,I_$CASE 8 (NEXT PENULTIMATE FRB HEADER)_^1SU080 STA- 2,Q_^1_%LDA* NXTLSA_^1SU090 STA- 1,Q_^1*_]_^1_%LDQ CA1_*SAVE XTRREC-3, XTRREC-2, AND XTRREC-1_^1_%LDA- (ZERO),Q_^1_%STA* TEMP1_^1_%LDA- 1,Q_^1_%STA* TEMP2_^1_%LDA- 2,Q_^1_%STA* TE€€MP3_^1_%CLR A_,CLEAR FORWARD FRB POINTER AND NO. OF RECORDS_^1_%STA- 1,Q_^1_%STA- 2,Q_^1_%LDA- FRBLSA,I_$SETUP BACKWARD FRB POINTER TO FRBLSA_^1_%STA- (ZERO),Q_^1_%LDA* FRBCAS_'CHECK IF CASE 10_^1_%ALS 5_^1_%SAP SU095_^1_%LDA* NXTLSA_'CASE 10, SET TO NXTLSA - FRBSZ_^1_%SUB* FRBSZ_^1_%STA- (ZERO),Q_^1*_]_^1SU095 LDA* (XTRREC)_$SAVE XTRREC = RECBFR + RECLGH_^1_%STA* HOLD_^1_%LDA-€€ ONEBIT+15_#SET XTRREC TO $8000_^1_%STA* (XTRREC)_^1_%JMP* (SETUP)_%RETURN_^1_%EJT_]_^1*_*WRITE KIS BLOCK (SETUP KIS AND RECORD POINTERS)_^1*_]_^1SI800 STQ* KISSAV_'SAVE LIFO KIS POINTER TO RECORD_^1_%STA* KISSAV+1_^1_%STQ* KISSAV+2_$SAVE FIFO KIS POINTER TO EXTRA RECORD_^1_%STA* KISSAV+3_^1*_]_^1_%LDQ FIFOFG_'CHECK IF INDEXED/LINKED FIFO_^1_%SQZ SI804_*NO_^1*_]_^1_%LDA FRBID2_€€'INDEXED/LINKED FIFO_^1_%SAN SI802_(CHECK IF BEGINNING OF A FILE RECORD BLOCK_^1_%ENA FRBHDR_)YES_^1*_]_^1SI802 LDQ FRBSC2_'SAVE FIFO KIS POINTER TO RECORD (IF 1ST TIME)P_^1_%STQ* KISSAV_^1_%STA* KISSAV+1_^1*_]_^1_%LDQ* KIBCAS_^1_%INQ -2_+CHECK IF KIS EXISTS (NOT THE 1ST TIME)_^1_%SQZ SI806_*YES_^1*_]_^1SI804 LDQ* KISSAV_'KIS DOES NOT EXIST (FIRST TIME)_^1_%JMP* SI808_^1*_]_€€^1SI806 LDQ* KISPNT_'KIS EXISTS_^1_%LDA- (ZERO),Q_^1_%STA* KISSAV_'SAVE FIFO KIS POINTER TO FIRST RECORD_^1_%LDA- 1,Q_^1_%STA* KISSAV+1_^1_%LDA- 3,Q_^1_%LDQ- 2,Q_^1*_]_^1SI808 STQ (RECPTR)_^1_%LDQ RECPTR_'STORE RECORD POINTER INTO USER,S PARAMETER_^1_%STA- 1,Q_^1_%EJT_]_^1*_*ALLOCATE FILE SPACE FOR KIS BLOCK, IF NEEDED_^1*_]_^1_%LDA KIBLOC_'SAVE KIS BLOCK LOCATION_^1_%STA* KBL€€OC_^1_%STA* KBLOC2_^1*_]_^1_%LDA KIBSEC_'SAVE KIS BLOCK SECTOR_^1_%STA* KBSEC_^1*_]_^1_%LDA KIBLU_(SAVE KIS LOGICAL UNIT_^1_%STA* KBLU_^1_%STA* KBLU2_^1*_]_^1_%LDA KEYVAL_'SAVE KEY VALUE ADDRESS_^1_%STA* KEYSAV_^1*_]_^1SI810 ENA $11_*CHECK IF CASE A OR E_^1_%AND* KIBCAS_^1_%LDQ* NWKB_^1_%SAZ SI830_(NO, GO TO NEXT DECISION CHECK_^1*_]_^1_%LDA* KBLU_)CASE A OR E/ GET FILE SPACE€€_^1_%RTJ* FSPACE_^1*_]_^1_%LDA* KBSEC_(SAVE LAST KIS BLOCK SECTOR_^1_%STA* SECSAV_^1_%STQ* KBSEC_(SAVE NEXT LAST KIS BLOCK SECTOR_^1*_]_^1_%LDQ KIDLOC_'SETUP KIS BLOCK HEADER_^1_%LDA- KIBLSA,Q_^1_%LDQ* KBLOC_(STORE BACKWARD KIB POINTER_^1_%STA- (ZERO),Q_^1_%CLR A_,CLEAR KIB OVERFLOW POINTER AND NO. OF KIS,S_^1_%STA- 1,Q_^1_%STA- 2,Q_^1_%INQ KIBHDR_'SET KIS POINTER TO FIRST KIS_^€€1_%STQ* KISPNT_^1_%EJT_]_^1*_*PUT KIS POINTER(S) AND KEY VALUE INTO KIS BLOCK_^1*_]_^1SI830 LDA* KISPNT_'COMPUTE KIS KEY POINTER_^1_%ADD* PNTLGH_^1_%STA* KEYPNT_^1_%ADD- KEYLTH,I_$COMPUTE NEXT KIS POINTER_^1_%STA* KISNPR_^1*_]_^1_%LDQ* KBLOC_(COMPUTE KIS OVERFLOW POINTER_^1_%LDA- 2,Q_^1_%MUI* KISLGH_^1_%INA KIBHDR_^1_%ADD* KBLOC_^1_%STA* KISOPR_^1_%SUB* KISPNT_^1_%TRA Q_^1*_]_^1€€_%ENA $28_*CHECK IF CASE D OR F_^1_%AND* KIBCAS_^1_%SAZ SI850_(NO, GO TO NEXT DECISION CHECK_^1*_]_^1SI840 INQ -1_+CASE D OR F_^1_%SQM SI850_^1_%LDA* (KISPNT),Q_"MOVE KIS,S DOWN WITHIN KIS BLOCK (IF NEEDED)_^1_%STA* (KISNPR),Q_^1_%JMP* SI840_^1*_]_^1SI850 ENA $19_*CHECK IF CASE A, D, OR E_^1_%AND* KIBCAS_^1_%SAZ SI860_(NO, CONTINUE_^1_%LDQ* KBLOC_^1_%RAO- 2,Q_*CASE A, D, OR€€ E/ INCREMENT NUMBER OF KIS,S_^1*_]_^1SI860 LDQ* PNTLGH_'STORE KIS POINTERS INTO KIS_^1SI870 INQ -1_^1_%LDA* KISSAV,Q_^1_%STA* (KISPNT),Q_^1_%SQZ SI880_^1_%JMP* SI870_^1*_]_^1SI880 LDQ- KEYLTH,I_$STORE KIS KEY VALUE INTO KIS_^1SI890 INQ -1_^1_%LDA* (KEYSAV),Q_^1_%STA* (KEYPNT),Q_^1_%SQZ SI900_^1_%JMP* SI890_^1_%EJT_]_^1*_*STORE INDEXED PARAMETERS_^1*_]_^1KIBCAS NUM 0_,KIS €€BLOCK CASE INDEX_^1KISPNT NUM 0_,KIS POINTER_^1KEYSAV NUM 0_,KEY ADDRESS SAVE_^1PNTLGH NUM 0_,KIS POINTER LENGTH_^1KEYPNT NUM 0_,KIS KEY POINTER_^1KISNPR NUM 0_,NEXT KIS POINTER IN KIS BLOCK_^1KISLGH NUM 0_,KIS LENGTH_^1KISOPR NUM 0_,POINTER TO OVERFLOWED KIS_^1KISSAV NUM 0,0,0,0,0_#OVERFLOWED KIS SAVE (MAX/2 PTRS AND KEY VALUE)_^1_%EJT_]_^1*_*WRITE OUT KIS BLOCK AND THREAD€€ ON LAST KIS BLOCK (IF NEEDED)_^1*_]_^1SI900 RTJ* (MMWRTA)_$WRITE OUT KIS BLOCK_^1KBLOC NUM 0_,KIS BLOCK LOCATION_^1NWKB_!NUM 0_,NUMBER OF WORDS IN KIS BLOCK_^1KBLU_!NUM 0_,KIS LOGICAL UNIT_^1_%NUM 0_^1KBSEC NUM 0_,KIS BLOCK SECTOR ADDRESS_^1*_]_^1_%SQM SI910_"*****MASS MEMORY ERROR_^1*_]_^1_%ENA $10_*CHECK IF CASE E_^1_%AND* KIBCAS_^1_%SAZ SI920_(NO, GO TO NEXT DECISION€€ CHECK_^1_%SPC 3_^1_%LDA* KBSEC_(CASE E_^1_%STA* (KBLOC)_^1_%RTJ* (MMWRTA)_$WRITE THREAD WORD INTO LAST KIS BLOCK_^1KBLOC2 NUM 0_,KIS BLOCK LOCATION_^1_%NUM 1_,THREAD WORD TO NEXT KIS BLOCK_^1KBLU2 NUM 0_,KIS LOGICAL UNIT_^1_%NUM 1_,WORD NUMBER ONE ONE LAST KIB_^1SECSAV NUM 0_,LAST KIS BLOCK SECTOR ADDRESS_^1*_]_^1_%SQP SI920_^1*_]_^1SI910 JMP MMERR_"*****MASS MEMORY ERRO€€R_^1_%EJT_]_^1*_*MOVE ALL KIS,S WITH LARGER KEY VALUES DOWN IN KIB(IF CASE F)_^1*_]_^1SI920 ENA $20_*CHECK IF CASE F_^1_%AND* KIBCAS_^1_%SAN SI930_^1_%JMP* SI980_(NO, GO TO NEXT DECISION CHECK_^1*_]_^1SI930 LDQ* KISLGH_'CASE F_^1SI940 INQ -1_^1_%LDA* (KISOPR),Q_"STORE OVERFLOWED KIS INTO SAVE AREA_^1_%STA* KISSAV,Q_^1_%SQZ SI950_^1_%JMP* SI940_^1*_]_^1SI950 RTJ* HERE_)SETUP€€ KEY VALUE,S ADDRESS_^1HERE_!000 000_^1_%LDA* HERE_^1_%INA KISSAV-HERE_^1_%ADD* PNTLGH_^1_%STA* KEYSAV_^1_%LDA* KBLOC_(SET KEY POINTER TO FIRST KIS_^1_%INA KIBHDR_^1_%STA* KISPNT_^1*_]_^1_%LDQ* KBLOC_(CHECK IF MORE KIS OVERFLOW BLOCKS_^1_%LDA- 1,Q_^1_%ENQ $10_^1_%SAZ SI960_(NO, PROCESS AS CASE E_^1*_]_^1_%STA* KBSEC_(YES, SAVE ITS SECTOR ADDRESS_^1_%RTJ REDKIB_'READ IN NEXT K€€IS OVERFLOW BLOCK_^1_%LDQ* KBLOC_(CHECK IF THIS OVERFLOW BLOCK IS FULL_^1_%LDA- 2,Q_^1_%INA 1_^1_%MUI* KISLGH_^1_%INA KIBHDR_^1_%TCA A_^1_%ADD* NWKB_^1_%SAM SI970_(YES, CONTINUE AS CASE F_^1_%ENQ 8_,NO, PROCESS AS CASE D_^1SI960 STQ* KIBCAS_^1*_]_^1SI970 JMP* SI810_(CONTINUE AS CASE D, E, OR F_^1_%EJT_]_^1*_*GET FILE SPACE_^1*_]_^1FSPACE 000 000_^1_%RTJ FILSPC_^1_%SAM FSE€€RR_^1_%SAN MMER_^1_%JMP* (FSPACE)_$EXIT WITH FILE SPACE (STARTING SECTOR IN Q)_^1*_]_^1FSERR LDA- ONEBIT+8 *****NO MORE FILE SPACE LEFT_^1_%JMP RQERR_^1*_]_^1MMER_!JMP* SI910_"*****MASS MEMORY ERROR_^1_%SPC 5_^1MMWRTA ADC MMWRIT_'MASS MEMORY WRITE ADDRESS_^1_%EJT_]_^1*_*SET KIS DIRECTORY AND RETURN TO CALLER_^1*_]_^1SI980 ENA $11_*CHECK IF CASE A OR E_^1_%AND* KIBCAS_^1_%SAZ€€ SI985_(NO, RETURN_^1*_]_^1_%LDA- IDXCHG,I_$SET KIS DIIRECTORY CHANGED BIT_^1_%AND- ZROBIT+1_^1_%EOR- ONEBIT+1_^1_%STA- IDXCHG,I_^1*_]_^1_%LDQ KIDLOC_'INCREMENT NUMBER OF KIS BLOCKS_^1_%RAO- NUMKIB,Q_^1_%LDA* KBSEC_(STORE NEW LAST KIS BLOCK_^1_%STA- KIBLSA,Q_^1*_]_^1_%ENA 1_,CHECK IF CASE A_^1_%AND* KIBCAS_^1SI985 SAZ SI990_(NO, RETURN_^1*_]_^1_%LDA* KBSEC_(STORE KIB SECTOR AD€€DRESS IN KIS DIRECTORY_^1_%STA (KIDIDX),Q_^1_%LDA- KIBFSA,Q_$CHECK IF FIRST KIS BLOCK_^1_%SAN SI990_^1_%LDA* KBSEC_(YES, SAVE FIRST KIS BLOCK SECTOR ADDRESS_^1_%STA- KIBFSA,Q_^1*_]_^1SI990 LDA- LOKADR,I_$CHECK IF FILE LOCKED_^1_%SAZ SI995_^1_%LDA- ONEBIT+1_$FILE LOCKED_^1*_]_^1SI995 LDQ* KIBCAS_'CHECK IF MORE RECORDS WITH THE SAME KEY VALUE_^1_%INQ -2_^1_%SQN SI997_^1_%EOR- €^ONEBIT+4_'YES, SET BIT 4_^1*_]_^1SI997 JMP RQEXIT_'RETURN TO CALLER_^1_%SPC 2_^1_%END_]_^__^PRTVDIR CSY/ F21 P€1_%NAM RTVDIR_'DECK-ID F21 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1*_$CALL RTVDIR(FILNUM,FILCOM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1*_]_^1_%EQU ZERO(2)_%LOCATION OF ZERO_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU MASK($23)_#ONE BI€€T TABLE_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WO€€RDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDRESS (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIX(€€FH+00) SECTOR ADDRESS TO NEXT FIS(SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST F€€ILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BL€€OCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1_%EJT_]_^1*_*EXTERNALS_^1*_]_^1_%EXT ABSPAR_'GETS ABSOLUTE ADDRESSES_^1_%EXT CKCFIS_'CHECKS CORE FIS_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT CKUADR_'CHECK LEGALITY OF UNPROTECTED ADDRESS_^1_%EXT MMREAD_'MM READ_^1_%EXT MMWRIT_'MM WRITE_^1_%EXT€€ SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1_%EXT FILBLK_'FILE BLOCK FOR RETRIEVING RECORD,S FRB_^1_%EXT NWFBLK_'NUMBER OF WORDS IN FILE BLOCK_^1_%EXT LOKNOE_'LOCK FILE TABLE NUMBER OF ENTRIES_^1_%EXT LOKNEU_'LOCK FILE TABLE NO. OF ENTRIES USED_^1_%EXT LOKTBL_'LOCK FILE TABLE_^1*_]_^1_%EXT* RTNSPC_'RETURN SPACE_^1_%EXT* STRSEC_'STARTING SECTOR OF SPACE TO BE RETURNED_^1_%EXT* RPE€€ND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_$CALL RTVDIR(FILNUM,FILCOM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(LENGTH OF REQUEST PROCESSOR_^1_%SPC 2_^1RTVDIR 000 000_*RETRIEVE DIRECT_^1_%STQ- I_^1*_]_^1_%ENQ 7_,PICK UP ABSOLUTE ADDRESSES OF PARAMETERS_^1DR010 INQ -1_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ DR020_€€^1_%JMP* DR010_^1*_]_^1DR020 LDQ* (FILNUM)_$CHECK VALID FILE NO._^1_%SQZ DR030_^1_%SQP DR100_^1DR030 LDA- MASK+14_^1*_]_^1DR040 EOR- MASK+15_%ERROR EXIT_^1*_]_^1DR080 STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (RTVDIR)_^1_%EJT_]_^1*_]_^1DR100 RTJ CKCFIS_'CHECK FIS IN CORE_^1_%SAP DR110_^1*_]_^1_%LDQ* (FILNUM)_^1_%RTJ SRHFIS_'NOT IN CORE CHECK MM_^1_%SAN DR120_(FILE NOT DEFINED€€_^1*_]_^1DR110 STQ- I_,I = ADDRESS OF FIS IN CORE_^1_%LDA- FISFLG,Q_$CHECK FILE RELEASED_^1_%SAM DR130_^1DR120 LDA- MASK+0_'RELEASED OR NOT DEFINED_^1_%JMP* DR040_^1*_]_^1DR130 LDA* (FILCOM)_$IS REMOVE REQUESTED_^1_%SAM DR140_^1_%JMP* DR200_^1*_]_^1DR140 LDQ- LOKADR,Q_$REMOVE REQUESTED, IS FILE LOCKED_^1_%SQZ DR160_^1_%AND- ONEMSK+14_#FILE LOCKED, CHECK CALLER,S FILE COMBINA€€TION_^1_%SAN DR160_(IT EXISTS, THEREFORE FILCOM = LOCK_^1*_9COMBINATION_^1_%LDA- MASK+1_'FILE LOCKED,USER TRYING TO REMOVE WO FILE COM_^1_%JMP* DR040_^1*_]_^1DR160 LDA- KIDSEC,I_$IS FILE INDEXED_^1_%SAZ DR170_^1_%LDA- MASK+11_%CANT REMOVE FROM INDEXED FILE_^1_%JMP* DR040_^1*_]_^1DR170 LDA- FISFLG,I_$IS FILE DEFINED PROTECTED_^1_%AND- MASK+14_^1_%SAZ DR200_^1_%RTJ* (ACPROT)_$CH€€ECK IF REQUEST PROTECTED_^1_%SAN DR200_^1_%LDA- MASK+13_%UNPROTECTED USER CANT REMOVE FROM PROT FILE_^1_%JMP* DR040_^1_%EJT_]_^1*_]_^1DR200 LDA* (RECLTH)_$CHECK LENGTH_^1_%SAZ DR210_^1_%SAP DR220_^1DR210 JMP* DR030_(ERROR_^1*_]_^1DR220 STA* RECLGH_'STORE RECORD LENGTH_^1_%LDA* RECBUF_'STORE RECORD BUFFER ADDRESS_^1_%STA* RECBFR_^1_%CLR Q_,CHECK LEGALITY OF UNPROTECTED (IF IT€€ IS) ADR_^1_%RTJ* (ACUADR)_$OK, IF IT RETURNS_^1*_]_^1_%ADD* (RECLTH)_$CHECK END OF RECORD BUFFER_^1_%INA -1_^1_%RTJ* (ACUADR)_$OK, IF IT RETURNS_^1*_]_^1_%LDA* (RECPTR)_^1_%STA* FRBSC1_'SECTOR ADDRESS OF RECORD ON MASS MEMORY_^1_%STA* FRBSC2_^1_%LDQ* RECPTR_^1_%LDA- 1,Q_^1_%STA* FRBID1_'INDEX ADDRESS OF RECORD ON MASS MEMORY_^1_%STA* FRBID2_^1*_]_^1_%LDA- FISFLG,I_^1_%AND- ONEMS€€K+6_^1_%STA* FRBLU_^1_%STA* FRBLU1_^1_%STA* FRBLU2_^1*_] 63*1352_^1_%LDA- FRBSIZ,I_$GET NUMBER OF WORDS IN FILE RECORD BLK.63*1352_^1_%AND- ONEMSK+8_L63*1352_^1_%MUI* WPS_Q63*1352_^1_%TRA Q_,CHECK IF FRB SIZE .GT. FILE BLOCK SIZE 63*1352_^1_%SUB* ANWBLK_N63*1352_^1_%SAM T408_)NO, USE FILE RECORD BLOCK SIZE_(63*1352_^1_%LDQ* ANWBLK_'YES, USE FILE BLOCK SIZE_.63*1352_^1T408_!STQ* €€NWFB_P63*1352_^1_%STQ* NWFB1_O63*1352_^1_%EJT_V63*1352_^1*_*RETRIEVE THE RECORD_A63*1352_^1_%LDA* ANWBLK_'CHECK IF RECORD WILL FIT IN FILE BLOCK 63*1352_^1_%SUB* FRBID1_^1_%SUB* RECLGH_^1*_]_^1_%LDQ* (FILCOM)_$CHECK IF RECORD IS TO BE REMOVED_^1_%SQM DR310_*YES, READ IN FILE RECORD BLOCK_^1_%SAM DR315_(NO REMOVE AND WONT FIT IN FILE BLOCK_^1*_]_^1DR310 STA* IFBFLG_'READ IN FILE €€RECORD BLOCK INTO FILE BLOCK_^1_%LDA* FRBSC1_^1_%LDQ* AMMRED_^1_%RTJ* ACCFRB_^1_%LDQ* AFLBLK_^1_%ADQ* FRBID1_^1_%LDA* IFBFLG_'CHECK IF RECORD IN FILE RECORD BLOCK_^1_%SAP DR318_+YES_^1_%ADD* RECLGH_^1_%INA -1_+SET IN-FILE-BLOCK FLAG IF FIRST WORD IS IN_^1_%SAM DR330_^1_%STA* IFBFLG_^1_%INA 1_^1_%SUB- (ZERO),Q_$CHECK IF ACTUAL RECORD IN FILE RECORD BLOCK_^1DR315 SAM DR330_+NO,€€ READ IN RECORD BY ITSELF_^1*_]_^1DR318 STQ* FRBLU1_'RECORD IN FILE RECORD BLOCK_^1_%LDQ* RECLGH_^1DR320 INQ -1_+TRANSFER RECORD TO USER,S RECORD BUFFER_^1_%LDA* (FRBLU1),Q_^1_%STA* (RECBFR),Q_^1_%SQZ DR340_^1_%JMP* DR320_^1*_]_^1DR330 RTJ* (AMMRED)_$READ THE RECORD IN BY ITSELF_^1RECBFR NUM 0_^1RECLGH NUM 0_^1FRBLU1 NUM 0_^1FRBID1 NUM 0_^1FRBSC1 NUM 0_^1DR340 SQP CHKRM€€V_^1*_]_^1MMERR LDA- MASK+7_!*****MASS MEMORY ERROR_^1_%JMP* DR040_^1_%EJT_]_^1*_]_^1FILNUM NUM 0_^1FILCOM NUM 0_^1RECPTR NUM 0_^1RECBUF NUM 0_^1RECLTH NUM 0_^1REQBUF NUM 0_^1REQIND NUM 0_^1TEMP_!NUM 0_^1FISADD NUM 0_^1AMMWRT ADC MMWRIT_^1ACPROT ADC CKPROT_^1ACUADR ADC CKUADR_^1*_]_^1IFBFLG NUM 0_,IN-FILE-BLOCK FLAG (POSITIVE IF IT IS)_^1_%EJT_]_^1*_*REMOVE THE RETRIE€€VED RECORD_^1*_81 CARD DELETED_663*1352_^1CHKRMV LDA* (RECBUF)_$CHECK IF RECORD HAS BEEN REMOVED_^1_%SAP CHKREM_^1_%LDA- MASK+5_'YES,SET BIT 5 AND EXIT_^1_%JMP* DR040_^1*_]_^1CHKREM LDA* (FILCOM)_$CHECK IF RECORD IS TO BE REMOVED_^1_%SAM RMVREC_^1_%JMP* DR500_(NO, EXIT_^1*_]_^1RMVREC LDQ* AFLBLK_'REMOVE THE RECORD_^1_%LDA- 2,Q_*CHECK IF RECORD IS IN LAST FRB_^1_%SAN DR400_*NO_^1€€_%ENA -1_+RECORD IN LAST FRB_^1_%AND- IDXCHG,I_^1_%INA 1_,SET FIS CHANGED BIT_^1_%STA- IDXCHG,I_^1_%LDA- NRLFRB,I_$DECREMENT NUMBER OF RECORDS IN LAST FRB_^1_%INA -1_^1_%STA- NRLFRB,I_$IS THERE MORE THAN ONE RECORD IN THE LAST FRB_^1_%SAN DR410_*YES, THEN JUST REMOVE THE RECORD_^1_%ENA FRBHDR_'NO MORE RECORDS IN LAST FRB,_^1_%STA- FRBNIX,I_'RESET FRB INDEX TO BEGINNING OF FRB_€€^1_%JMP* DR500_((DONT RETURN LAST FRB)_^1*_]_^1DR400 INA -1_+DECREMENT NUMBER OF RECORDS IN FRB_^1_%STA- 2,Q_^1_%SAN DR410_^1_%JMP* RTNFRB_'NO MORE RECORDS IN FRB, RETURN FRB_^1*_]_^1DR410 LDA* (RECBFR)_$SET REMOVE BIT IN RECORD_^1_%EOR- MASK+15_^1_%LDQ* IFBFLG_'CHECK IF RECORD IN FILE BLOCK_^1_%SQM DR420_(NO, REMOVE RECORD BY ITSELF_^1_%LDQ* FRBID2_^1_%STA* (AFLBLK),Q_"RECORD€€ IS IN FILE BLOCK, REMOVE IT WHEN FRB IS_^1_%JMP* DR430_(WRITTEN BACK TO DECREMENT NUMBER OF RECORDS_^1*_]_^1DR420 STA* (AMMRED)_$REMOVE RECORD BY ITSELF_^1_%RTJ* (AMMWRT)_^1AMMRED ADC MMREAD_^1_%NUM 1_^1FRBLU2 NUM 0_^1FRBID2 NUM 0_^1FRBSC2 NUM 0_^1_%SQP DR430_^1_%JMP* MMERR_"*****MASS MEMORY ERROR_^1*_]_^1DR430 LDA* FRBSC2_'WRITE FRB TO DECREMENT NUMBER OF RECORDS_^1_%LDQ*€€ AMMWRT_^1_%RTJ* ACCFRB_^1_%JMP* DR500_(SET UP REQUEST INDICATOR AND EXIT_^1_%EJT_]_^1*_*ACCESS THE RECORD,S FILE RECORD BLOCK_^1*_]_^1ACCFRB 000 000_^1_%STA* FRBSEC_'A = FILE RECORD BLOCK SECTOR_^1_%STQ* RORW+1_'Q = READ OR WRITE ADDRESS_^1*_]_^1RORW_!RTJ+ 0000_)READ IN FRB_^1AFLBLK ADC FILBLK_'ADDRESS OF FILE BLOCK_^1NWFB_!ADC 0_,NUMBER OF WORDS IN FILE BLOCK_)63*1352_^1FRBLU €€ NUM 0_,LOGICAL UNIT OF FRB_^1FRBIDX NUM 0_^1FRBSEC NUM 0_,STARTING SECTOR OF FRB_^1*_]_^1_%CLR A_,RESET FRB INDEX TO ZERO_^1_%STA* FRBIDX_^1*_82 CARDS DELETED_563*1352_^1*_]_^1_%SQM MMER_#*****MASS MEMORY ERROR_^1_%JMP* (ACCFRB)_$RETURN_^1*_]_^1MMER_!JMP* MMERR_^1*_] 63*1352_^1ANWBLK ADC NWFBLK_N63*1352_^1WPS_"ADC WRDSEC_N63*1352_^1NWFB1 NUM 0_,NUMBER OF WORDS IN FILE BL€€OCK_)63*1352_^1_%EJT_]_^1*_*RETURN THE RECORD,S FILE RECORD BLOCK_^1*_]_^1RTNFRB ENA -1_,SET FIS CHANGED BIT_^1_%AND- IDXCHG,I_^1_%INA 1_^1_%STA- IDXCHG,I_^1_%LDQ* AFLBLK_'CHECK IF THE FIRST FRB IS BEING RETURNED_^1_%ENA 1_S63*1352_^1_%STA* NWFB_)(SETUP TO WRITE ONE WORD THREADS)_$63*1352_^1_%LDA* FRBSC2_^1_%EOR- FRBFSA,I_^1_%SAN RFRB10_^1*_]_^1_%LDA- 1,Q_*SET NEW FIRST FRB TO N€€EXT FRB_^1_%STA- FRBFSA,I_^1_%JMP* RFRB20_'WRITE BACKWARD FRB THREAD ON NEW FIRST FRB_^1*_]_^1RFRB10 LDA- (ZERO),Q_$WRITE FORWARD FRB THREAD ON LAST FRB_^1_%LDQ- 1,Q_^1_%STQ* (AFLBLK)_^1_%RAO* FRBIDX_^1*_82 CARDS DELETED_563*1352_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1*_]_^1_%LDA* (AFLBLK)_$WRITE BACKWARD FRB THREAD ON NEXT FRB_^1_%LDQ* FRBSEC_^1_%STQ* (AFLBLK)_^1RFRB20 LDQ* AMMWRT_N63*€€1352_^1_%RTJ* ACCFRB_N63*1352_^1*_] 63*1352_^1*_*RESET NUMBER OF WORDS TO ACCESS IN FILE BLOCK_'63*1352_^1_%LDA* NWFB1_O63*1352_^1_%STA* NWFB_P63*1352_^1_%LDA* FRBSC2_'SET UP STARTING SECTOR OF RECORD,S FRB_^1_%STA STRSEC_^1_%LDQ* FRBLU_(Q = LOGICAL UNIT OF FRB_^1_%LDA- FRBSIZ,I_^1_%AND- ONEMSK+8_$A = NUMBER OF SECTORS IN FRB_^1_%RTJ RTNSPC_'RETURN THE RECORD,S FILE RECORD BLOCK€€_^1*_]_^1_%LDA- NUMFRB,I_$DECREMENT NUMBER OF FILE RECORD BLOCKS_^1_%INA -1_^1_%STA- NUMFRB,I_^1_%EJT_]_^1*_*SET INDICATOR AND EXIT_^1*_]_^1DR500 RTJ* (ACPROT)_$CHECK IF REQUEST PROTECTED_^1_%SAZ DR504_(SKIP IF UNPROTECTED AND FMPFLG NOT SET_^1_%LDA (FILCOM)_$CHECK IF FILE IS TO BE LOCKED_^1_%AND- ONEMSK+14_^1_%TRA Q_^1_%SAZ DR504_(SKIP IF NO_^1_%LDA- LOKADR,I_$CHECK IF FILE €€ALREADY LOCKED_^1_%SAZ DR506_(NO, LOCK THE FILE_^1DR504 JMP* DR510_^1*_]_^1DR506 STQ- LOKADR,I_$SAVE FILE COMB. IN LOKADR (TEMP)_^1_%RAO LOKNEU_'BUMP NO. OF IN USE ENTRIES_^1_%LDQ =XLOKNOE_$SEARCH FOR EMPTY SLOT IN LOCK TABLE_^1_%QLS 1_^1DR508 INQ -2_^1_%LDA* (ADRLOK),Q_^1_%SAZ DR509_(SKIP IF SLOT FOUND_^1_%JMP* DR508_^1*_]_^1DR509 ADQ* ADRLOK_'SET Q TO ABSOLUTE ADDRESS O€€F ENTRY_^1_%LDA- LOKADR,I_$PICKUP COMBINATION_^1_%STQ- LOKADR,I_$STORE ABS ADDRESS OF ENTRY_^1_%STA- 1,Q_*STORE COMB. AND FILE NO. IN ENTRY_^1_%LDA (FILNUM)_^1_%STA- (ZERO),Q_^1*_]_^1DR510 LDA (RECBFR)_$CHECK IF SHORT READ_^1_%AND- ONEMSK+14_^1_%TCA Q_^1_%CLR A_^1_%ADQ RECLGH_^1_%SQP DR520_^1_%EOR- MASK+2_'YES, SET BIT 2_^1*_]_^1DR520 LDQ- LOKADR,I_$CHECK IF FILE LOCKED_^1_€–%SQZ DR530_^1_%EOR- MASK+1_'YES, SET BIT 1_^1*_]_^1DR530 JMP DR080_(EXIT_^1_%SPC 2_^1ADRLOK ADC LOKTBL_'LOCK FILE TABLE_^1_%SPC 2_^1_%END_]_^__ –PRTVIDX CSY/ F22 P€1_%NAM RTVIDX_'DECK-ID F22 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1* CALL RTVIDX(FILNUM,KEYVAL,FILCOM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1_%SPC 2_^1*_*EXTERNALS_^1_%EXT ABSPAR_'ABSOLUTIZES APL_^1_%EXT CKCFIS_'CHECKS CORE FOR FISB€€_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT CKUADR_'CHECK LEGALITY OF UNPROTECTED ADDRESS_^1_%EXT GETSPC_'GET ALLOCATABLE CORE SPACE_^1_%EXT MMREAD_'MASS MEMORY READ_^1_%EXT MMWRIT_'MASS MEMORY WRITE_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1_%EXT FILBLK_'FILE BLOCK FOR RETRIEVING RECORD,S FRB_^1_%EXT NWFBLK_'NUMBER OF WORDS IN FILE BLOCK_^1_%EXT LOKNOE_'LOCK €€FILE TABLE NUMBER OF ENTRIES_^1_%EXT LOKNEU_'LOCK FILE TABLE NO. OF ENTRIES USED_^1_%EXT LOKTBL_'LOCK FILE TABLE_^1*_]_^1_%EXT* RTNSPC_'RETURN SPACE_^1_%EXT* STRSEC_'STARTING SECTOR OF SPACE TO BE RETURNED_^1_%EXT* GETKID_'GET KIS DIRECTORY_^1_%EXT* HASHCD_'GENERATE HASH (SCATTER) CODE_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_*EQUIVALENCES_^1*_1COMMUNICATION REGION_^1_€€%EQU ZERO(2)_%ZERO CONSTANT_^1_%EQU ONEMSK(3)_#ONE MASK TABLE_^1_%EQU ZROMSK($13)_!ZERO MASK TABLE_^1_%EQU ONEBIT($23)_!ONE BIT TABLE_^1_%EQU ZROBIT($33)_!ZERO BIT TABLE_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECT€€ORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2€€)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDRESS (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FI€€RST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^€€1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY VALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1*_1REQUEST BUFFER INDEXES_^1_%EQU NXTPT1(8)_#€€NEXT LINKED RECORD POINTER 1_^1_%EQU NXTPT2(9)_#NEXT LINKED RECORD POINTER 2_^1_%EQU EOLPT1(10)_"END OF LINK POINTER 1_^1_%EQU EOLPT2(11)_"END OF LINK POINTER 2_^1_%EJT_]_^1* CALL RTVIDX(FILNUM,KEYVAL,FILCOM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(LENGTH OF REQUEST PROCESSOR_^1_%SPC 2_^1RTVIDX 000 000_^1_%STQ- I_^1*_]_^1_%ENQ 8_^1T010_!INQ -1_+LOOP TO€€ PICK UP ADDRESS OF CALL PARAMETERS_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ T020_^1_%JMP* T010_^1*_]_^1T020_!LDQ* (FILNUM)_$CHECK FOR VALID FILE NO._^1_%SQZ T030_^1_%SQP T100_^1T030_!LDA- ONEBIT+14_^1*_]_^1T040_!EOR- ONEBIT+15_#ERROR EXIT_^1*_]_^1T050_!STA* (REQIND)_$NORMAL EXIT_^1_%JMP* (RTVIDX)_^1_%SPC 2_^1*_]_^1T100_!RTJ CKCFIS_'€€SEE IF FIS IN CORE_^1_%SAP T110_^1*_]_^1_%LDQ* (FILNUM)_$NOT IN CORE CHECK MM_^1_%RTJ SRHFIS_^1_%SAN T120_^1*_]_^1T110_!STQ- I_,SAVE CORE FIS ADDRESS_^1_%LDA- FISFLG,Q_^1_%SAM T130_^1T120_!LDA- ONEBIT_'RELEASED OR NOT DEFINED_^1_%JMP* T040_^1_%EJT_]_^1*_*CHECK REQUEST FOR ERRORS_^1*_]_^1T130_!LDA- KIDSEC,Q_$CHECK IF FILE IS INDEXED_^1_%SAN T140_^1_%LDA- ONEBIT+11_#ERROR, NOT A€€N INDEXED FILE_^1_%JMP* T040_^1*_]_^1T140_!LDA* (FILCOM)_$CHECK IF REMOVING RECORD_^1_%SAP T160_+NO_^1_%LDQ- LOKADR,Q_$CHECK IF FILE LOCKED_^1_%SQZ T150_^1_%AND- ONEMSK+14_#IF LOCKING AND FILE LOCKED, FILCOM =_^1_%SAN T150_*FILES COMBINATION_^1_%LDA- ONEBIT+1_$ERROR TRYING TO REMOVE FROM LOCKED FILE W/0 CM_^1_%JMP* T040_^1*_]_^1T150_!LDA- FISFLG,I_$CHECK IF FILE PROTECTED_^1_%AN€€D- ONEBIT+14_^1_%SAZ T160_^1_%RTJ* (ACPROT)_$CHECK IF REQUEST PROTECTED_^1_%SAN T160_^1_%LDA- ONEBIT+13_#UNPROT CALL CANT REMOVE FROM PROT FILE_^1_%JMP* T040_)ERROR_^1*_]_^1T160_!LDA* (RECLTH)_$CHECK RECLTH FOR ZERO OR NEGATIVE_^1_%SAZ T170_^1_%SAM T170_^1_%LDQ- FISIND,I_$CHECK IF INDEXED/LINKED_^1_%SQP T180_+NO_^1_%INA -3_-YES, RECORD LENGTH MUST BE .GE.3_^1_%SAP T180_^1T17€€0_!JMP* T030_)RECORD SIZE ILLEGAL_^1*_]_^1T180_!CLR Q_,CLEAR KIS BLOCK LOCATION_^1_%STQ* KIBLOC_^1_%LDA* RECPTR_'CHECK IF FIRST RECORD POINTER ADDRESS LEGAL_^1_%RTJ* (ACUADR)_^1_%INA 1_,CHECK IF SECOND RECORD POINTER ADDRESS LEGAL_^1_%RTJ* (ACUADR)_^1*_]_^1_%LDA* RECBUF_'CHECK LEGALITY OF UNPROTECTED (IF IT IS) ADR_^1_%RTJ* (ACUADR)_$OK, IF IT RETURNS_^1*_]_^1_%ADD* (RECLTH)_$CHE€€CK IF THE END OF THE RECORD BUFFER OK_^1_%INA -1_^1_%RTJ* (ACUADR)_$OK, IF IT RETURNS_^1*_]_^1_%LDA- NRLFRB,I_$CHECK IF THERE ARE ANY RECORDS IN FILE 63*1353_^1_%SAN T200_P63*1353_^1_%LDA- FRBFSA,I_L63*1353_^1_%SUB- FRBLSA,I_L63*1353_^1_%SAN T200_^1_%JMP* NOPTR_(NO, SET BIT 5 AND EXIT_^1*_81 CARD DELETED_663*1353_^1*_*CHECK IF FIRST ENTRY, GET KIS DIRECTORY AND KIS BLOCK SPACE_^€€1*_]_^1T200_!LDQ- FISIND,I_$SET FIFO FLAG, IF FIRST-IN, FIRST-OUT SELECTED_^1_%LRS 28_-(IF SET, FIFOFG = 2)_^1_%AND- ONEBIT+1_^1_%STA* FIFOFG_^1*_]_^1_%SQP T220_)NOT INDEXED LINKED, SET FIRST TIME ENTRY_^1_%LDA* (RECPTR)_$CHECK IF FIRST TIME ENTRY FOR LINKED CALL_^1_%SAZ T220_+YES, SET FIRST TIME ENTRY_^1*_]_^1_%LDQ* REQBUF_'CHECK IF RE-ENTRY AFTER REACHING END OF LINK_^1_%LDA- €€EOLPT1,Q_^1_%SAP T210_^1_%JMP* NOREC_(YES, SET BIT 5 (NO MORE RECORDS ON LINK)_^1*_]_^1T210_!LDA- EOLPT2,Q_$CHECK IF REMOVE(S) MAKE LINKED CALL 1ST TIME_^1_%TCA A_.YES, IF (EOLPT2) IS MINUS ZERO_^1*_]_^1T220_!STA* RRLFLG_'SET REPEAT RETRIEVE LINKED FLAG (POS IF FIRST)_^1_%SAP T230_^1_%INQ NXTPT1_'REPEATED RETRIEVE LINKED CALL, GET NEXT RECORD_^1_%JMP SETRTV_N63*1353_^1*_]_^1T2€€30_!ENA WRDSEC_'FIRST TIME ENTRY OF THIS CALL_^1_%MUI- KIDSIZ,I_^1_%INA -KIDHDR_%GET NUMBER OF WORDS IN KIS DIRECTORY - HEADER_^1_%STA* NWKID_^1*_]_^1_%RTJ GETKID_'GET KIS DIRECTORY_^1_%STQ* KIDLOC_'SAVE KIS DIRECTORY LOCATION_^1*_]_^1_%ENA WRDSEC_'GET NUMBER OF WORDS IN KIS BLOCK_^1_%MUI- KIBSIZ,I_^1_%STA* NWKIB_^1*_]_^1_%RTJ GETSPC_'GET SPACE FOR KIS BLOCK_^1_%STQ* KIBLOC_^1€€_%STQ KBLOC_(SAVE KIS BLOCK ADDRESS TO RELEASE_^1_%EJT_]_^1*_*FIND HASH INDEX INTO KIS DIRECTORY TO GET KIS BLOCK SECTOR_^1*_]_^1_%LDA- FISIND,I_$CHECK IF INDEXED-ORDERED_^1_%ALS 1_^1_%SAM T240_^1*_]_^1_%LDA* KEYVAL_'NO, GET HASH CODE_^1_%RTJ HASHCD_)A = KEY VALUE ADDRESS_^1_%DVI* NWKID_^1_%JMP* T270_)SAVE KIS DIRECTORY INDEX AND CONTINUE_^1_%SPC 2_^1T240_!LDA* (KEYVAL)_$INDEX€€ED/ORDERED, CHECK KEY VALUE_^1_%SAP T250_^1_%CLR A_,NEGATIVE, USE INDEX ZERO_^1*_]_^1T250_!SUB- NUMEKV,I_^1_%SAM T260_^1_%ENA -1_+TOO LARGE, USE LARGEST INDEX_^1*_]_^1T260_!ADD- NUMEKV,I_^1_%MUI* NWKID_(INDEX = (KEYVAL*NWKID)/NEKV_^1_%DVI- NUMEKV,I_^1_%TRA Q_^1*_]_^1T270_!INQ KIDHDR_'GET KIS BLOCK POINTER_^1_%LDQ* (KIDLOC),Q_^1_%SQZ NOPTR_^1_%JMP* SRHKIS_'SEARCH FOR KEY INFO€€RMATION SEGMENT_^1*_]_^1NOPTR JMP* NOREC_(NO KIS BLOCK POINTER, SET BIT 5 AND EXIT_^1_%EJT_]_^1*_*STORE INDEXED PARAMETERS_^1*_]_^1FILNUM ADC 0_,FILE NUMBER ADDRESS_^1KEYVAL ADC 0_,KEY VALUE ADDRESS_^1FILCOM ADC 0_,FILE COMBINATION_^1RECPTR ADC 0_,RECORD POINTER ADDRESS_^1RECBUF ADC 0_,RECORD BUFFER ADRESS_^1RECLTH ADC 0_,RECORD LENGTH ADDRESS_^1REQBUF ADC 0_,REQUEST BUFFER€€ ADDRESS_^1REQIND ADC 0_,REQUEST INDICATOR ADDRESS_^1*_]_^1KIDLOC NUM 0_,KIS DIRECTORY LOCATION_^1FIFOFG NUM 0_,INDEXED/LINKED FIRST-IN, FIRST-OUT FLAG_^1RRLFLG NUM 0_,REPEAT RETRIEVE LINK FLAG (NEG IF REPEATED)_^1NWKID NUM 0_,NUMBER OF WORDS IN KIS DIRECTORY_^1*_]_^1ACUADR ADC CKUADR_'CHECK IF AN UNPROTECTED ADDRESS_^1ACPROT ADC CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SPC €€5_^1*_*ACCESS (READ OR WRITE) THE KIS BLOCK_^1*_]_^1ACCKIB 000 000_^1_%STA* REDWRT+1_$SETUP READ OR WRITE REQUEST_^1*_]_^1REDWRT RTJ+ 0000_)READ OR WRITE KIS BLOCK_^1KIBLOC NUM 0_,KIS BLOCK ADDRESS_^1NWKIB NUM 0_,NUMBER OF WORDS IN KIS BLOCK_^1KIBLU NUM 0_,KIS LOGICAL UNIT_^1_%NUM 0_^1KIBSEC NUM 0_,KIS BLOCK SECTOR_^1*_]_^1_%SQM MMER1_"*****MASS MEMORY ERROR_^1_%JMP* (ACCK€€IB)_$EXIT_^1*_]_^1MMER1 JMP MMERR_O63*1353_^1_%EJT_]_^1*_*SEARCH FOR KIS IN KIS BLOCK(S)_^1*_81 CARD DELETED_563*1353_^1SRHKIS ENA 2_,SEARCH FOR KIS ON KIS BLOCK(S)_^1_%ADD* FIFOFG_^1_%STA PNTLTH_'SAVE POINTER LENGTH (2 OR 4)_*63*1353_^1_%ADD- KEYLTH,I_^1_%STA KISLTH_'SAVE KIS LENGTH_763*1353_^1_%LDA* KIBLOC_^1_%INA KIBHDR_^1_%ADD* PNTLTH_'SAVE FIRST KIS BLOCK KEY POINTER_^1_€€%STA* KIB1KP_^1_%LDA- FISFLG,I_$SETUP KIS LOGICAL UNIT_^1_%ARS 7_^1_%AND- ONEMSK+6_^1_%STA* KIBLU_^1*_]_^1GNXKIB STQ* KIBSEC_'READ IN NEXT KIS BLOCK_^1_%LDA =XMMREAD_^1_%RTJ* ACCKIB_^1_%LDA* KIB1KP_'RESET KEY POINTER_^1_%STA* KEYPTR_^1_%LDQ* KIBLOC_'CHECK NEXT KIS BLOCK_^1_%LDA- 2,Q_^1*_]_^1CNXKIS INA -1_+CHECK NEXT KIS, DECREMENT KIS COUNT_^1_%STA* KISCNT_^1_%LDQ- KEYLTH,I_^1_%€€SAM CHKOVF_'NO MORE KIS,S (CHECK IF ANY OVF BLOCKS)_^1*_]_^1CNXWRD INQ -1_+CHECK NEXT WORD OF KEY_^1_%LDA* (KEYVAL),Q_^1_%SUB* (KEYPTR),Q_^1_%SAM CHKORD_'KEY VALUE .LT. KIS KEY VALUE, CHECK ORDERED_^1_%SAN GNXKIS_^1_%SQZ GETPTR_'KEY FOUND, GET KIS RECORD POINTER_^1_%JMP* CNXWRD_^1*_]_^1CHKORD LDQ- FISIND,I_$CHECK IF INDEXED/ORDERED_^1_%QLS 1_^1_%SQM NOREC_*YES, KEY NOT FOUND€€_^1*_]_^1GNXKIS LDA* KISCNT_'NOT THIS KEY VALUE, CHECK AGAINST NEXT ONE_^1_%LDQ* KEYPTR_^1_%ADQ* KISLTH_'INCREMENT KEY POINTER_^1_%STQ* KEYPTR_^1_%JMP* CNXKIS_'CONTINUE SEARCH_^1*_]_^1CHKOVF LDQ* KIBLOC_'YES, CHECK IF AN OVERFLOW KIS BLOCK EXISTS_^1_%LDQ- 1,Q_^1_%SQZ NOREC_*NO, KIS NOT FOUND_^1_%JMP* GNXKIB_)YES, GET NEXT KIS OVERFLOW BLOCK_^1*_81 CARD DELETED_663*1353_^1*_*NO RE€€CORD ERROR EXIT_^1*_]_^1NOREC LDA- ONEBIT+5_$NO KIS (THUS NO RECORD), SET BIT 5 AND EXIT_^1_%JMP* RQERR_^1_%SPC 2_^1*_*GET KIS RECORD POINTER AND SAVE END OF LINK POINTER_^1*_]_^1GETPTR LDA* KEYPTR_'GET THE KIS RECORD POINTER_^1_%SUB* PNTLTH_^1_%STA* KISPTR_^1_%TRA Q_^1*_]_^1_%LDA* REQBUF_'SETUP TO SAVE THE END OF LINK POINTER_^1_%INA EOLPT1_^1_%STA* EOLFLG_^1_%LDA* FIFOFG_'FOR€€ LIFO LINKED, SET END OF LINK = 0_^1_%STA* (EOLFLG)_^1_%SAZ STOEOL_^1_%LDA- 2,Q_*FOR FIFO LINKED, SET END OF LINK_^1_%STA* (EOLFLG)_'TO CURRENT EXTRA (LAST) RECORD_^1_%LDA- 3,Q_^1STOEOL RAO* EOLFLG_^1_%STA* (EOLFLG)_^1_%SPC 2_^1*_*SETUP TO RETRIEVE THE RECORD_^1*_]_^1SETRTV LDA* RECBUF_'SETUP RECORD BUFFER_^1_%STA RECBFR_N63*1353_^1_%INA 1_,SETUP TO LINK PREVIOUS WITH NEXT, IF €€A REMOVE_^1_%STA* RECBW1_^1*_]_^1_%LDA* (RECLTH)_$SETUP RECORD LENGTH_^1_%STA RECLGH_N63*1353_^1*_]_^1_%RTJ* SETUP_(SETUP AND RETRIEVE THE RECORD_^1_%EJT_]_^1*_*IF END OF LINK, SET FLAG / CHECK IF RECORD IS TO BE REMOVED_^1*_]_^1_%LDA- FISIND,I_$SET END OF LINK FLAG_^1_%AND- ONEBIT+15_^1_%ALS 5_^1_%STA* EOLFLG_'SET FLAG IF INDEXED LINKED_^1_%SAZ T510_)CLEAR FLAG IF NOT INDEXED L€€INKED_^1*_]_^1_%LDQ* RECBW1_'CHECK NEXT POINTER AGAINST END-OF-LINK POINTER_^1_%LDA- 1,Q_^1_%LDQ* REQBUF_^1_%STA- NXTPT2,Q_$(SAVE NEXT POINTER 2)_^1_%LDA* (RECBW1)_^1_%STA- NXTPT1,Q_$(SAVE NEXT POINTER 1)_^1_%EOR- EOLPT1,Q_^1_%SAN T510_)NOT END OF LINK_^1_%LDA- NXTPT2,Q_^1_%EOR- EOLPT2,Q_^1_%SAN T510_)NOT END OF LINK_^1_%STA* EOLFLG_^1_%SET A_,END OF LINKED REACHED, SET FLAGS_^1€€_%STA- EOLPT1,Q_^1*_]_^1T510_!LDQ* (FILCOM)_$CHECK IF RECORD IS TO BE REMOVED_^1_%SQM T530_^1_%JMP T700_)NO, REMOVE, SET INDICATOR WORD AND EXIT_^1*_]_^1T530_!STQ* NUMWRD_'SET LINK EMPTY FLAG NEGATIVE_^1_%LDA* RRLFLG_'CHECK IF FIRST TIME ENTRY_^1_%SAM T540_^1_%JMP* CHKEOL_)YES_^1*_]_^1T540_!LDQ* RECPTR_'NOT FIRST TIME, REMOVE RECORD FROM LINK_^1_%LDA- 1,Q_^1_%LDQ- (ZERO),Q_^1_%I€€NA 1_^1_%STQ* FRBSC2_^1_%STA* FRBID2_^1*_]_^1*_*CHECK IF TWO POINTER WORDS ARE IN FILE BLOCK_(63*1353_^1_%LDQ RECPTR_N63*1353_^1_%LDA- (ZERO),Q_L63*1353_^1_%SUB* FRBSC1_N63*1353_^1_%SAN T550_)NOT IN FILE BLOCK_563*1353_^1_%LDA NWFB_P63*1353_^1_%SUB- 1,Q_Q63*1353_^1_%INA -3_R63*1353_^1_%SAM T550_)NOT IN FILE BLOCK_563*1353_^1_%EJT_V63*1353_^1_%LDQ AFLBLK_'UNTHREAD REMOVED REC€€ORD IN FILE BLOCK 63*1353_^1_%ADQ* FRBID2_N63*1353_^1_%LDA* (RECBW1)_L63*1353_^1_%STA- (ZERO),Q_L63*1353_^1_%RAO* RECBW1_N63*1353_^1_%LDA* (RECBW1)_L63*1353_^1_%STA- 1,Q_Q63*1353_^1_%JMP REMREC_N63*1353_^1*_] 63*1353_^1T550_!RTJ (AMMWRT)_$REMOVE RECORD FROM THE LINK_+63*1353_^1RECBW1 NUM 0_,POINTER TO NEXT RECORD_^1_%NUM 2_,TWO WORDS/POINTER_^1FRBLU2 NUM 0_,LU_^1FRBID2 NUM €€0_^1FRBSC2 NUM 0_,LINK PONTER AREA (WORD 1/2) OF LAST RECORD_^1*_]_^1_%SQM MMERR_"*****MASS MEMORY ERROR_^1_%JMP REMREC_'REMOVE THE UNLINKED RECORD_,63*1353_^1_%EJT_]_^1*_*STORE INDEXED PARAMETERS_<63*1353_^1*_] 63*1353_^1PNTLTH NUM 0_,KIS POINTER LENGTH (2=LIFO, 4=FIFO)_"63*1353_^1KISLTH NUM 0_,KIS LENGTH_<63*1353_^1KIB1KP NUM 0_,KIS BLOCK FIRST KEY POINTER_+63*1353_^1KEYPT€€R NUM 0_,CURRENT KIS BLOCK KEY POINTER_)63*1353_^1KISCNT NUM 0_,CURRENT KIS COUNT_563*1353_^1KISPTR NUM 0_,KIS POINTER_;63*1353_^1EOLFLG NUM 0_,END OF LINK POINTER AND INDICATOR_$63*1353_^1KISNPR NUM 0_,POINTER TO NEXT KIS_363*1353_^1NUMWRD NUM 0_,NUMBER OF WORDS TO MOVE_/63*1353_^1_%EJT_V63*1353_^1*_*REQUEST EXIT (INCLUDING ERROR EXITS)_^1_%SPC 2_^1*_*MASS MEMORY ERROR (SET€€ BIT 7)_^1MMERR LDA- ONEBIT+7_^1_%SPC 2_^1*_*REQUEST ERROR (SET BIT 15)_^1RQERR EOR- ONEBIT+15_^1_%SPC 2_^1*_*REQUEST EXIT_^1RQEXIT LDQ KIBLOC_'CHECK IF KIS BLOCK ALLOCATED_*63*1353_^1_%SQZ EXIT_+NO_^1_%RTJ- (AMONI)_%RELEASE KIS BLOCK_^1_%NUM $1800_^1KBLOC NUM 0_^1*_]_^1EXIT_!JMP T050_)STORE INDICATOR AND EXIT_^1_%EJT_]_^1*_812 CARDS DELETED_463*1353_^1*_*SETUP FOR RETRIE€€VING THE RECORD_^1*_]_^1SETUP 000 000_^1_%LDA- FISFLG,I_$SETUP FILE RECORD BLOCK LOGICAL UNIT_^1_%AND- ONEMSK+6_^1_%STA* FRBLU_^1_%STA* FRBLU1_^1_%STA* FRBLU2_^1_%STA FRBLU3_^1_%LDA- 1,Q_^1_%LDQ- (ZERO),Q_$SETUP MASS MEMORY ADDRESS OF THE RECORD_^1_%STA* FRBID1_^1_%STQ* FRBSC1_^1_%STA FRBID3_^1_%STQ FRBSC3_^1*_]_^1_%LDA- FRBSIZ,I_$GET NUMBER OF WORDS IN FILE RECORD BLOCK_^1_%A€€ND- ONEMSK+8_^1_%MUI* WPS_^1_%TRA Q_-CHECK IF FRB SIZE .GT. FILE BLOCK SIZE_^1_%SUB* ANWBLK_^1_%SAM SU05_)NO, USE FILE RECORD BLOCK SIZE_^1_%LDQ* ANWBLK_'YES, USE FILE BLOCK SIZE_^1SU05_!STQ* NWFB_^1_%STQ* NWFB1_^1_%EJT_]_^1*_*CHECK IF RECORD WILL FIT IN FILE RECORD BLOCK_^1*_]_^1_%LDA* ANWBLK_'CHECK IF RECORD WILL FIT IN FILE BLOCK_^1_%SUB* FRBID1_^1_%SUB* RECLGH_^1*_]_^1_%LDQ (€€FILCOM)_$CHECK IF RECORD IS TO BE REMOVED_^1_%SQM SU10_+YES, READ IN FILE RECORD BLOCK_^1_%SAM SU15_)NO REMOVE AND WONT FIT IN FILE BLOCK_^1*_]_^1SU10_!STA* IFBFLG_'READ IN FILE RECORD BLOCK INTO FILE BLOCK_^1_%LDA* FRBSC1_^1_%LDQ* AMMRED_^1_%RTJ* ACCFRB_^1_%LDQ* AFLBLK_^1_%ADQ* FRBID1_^1_%LDA* IFBFLG_'CHECK IF RECORD IN FILE RECORD BLOCK_^1_%SAP SU18_,YES_^1_%ADD* RECLGH_^1_%IN€€A -1_+SET IN-FILE-BLOCK FLAG IF FIRST WORD IS IN_^1_%SAM SU30_^1_%STA* IFBFLG_^1_%INA 1_^1_%SUB- (ZERO),Q_$CHECK IF ACTUAL RECORD IN FILE RECORD BLOCK_^1SU15_!SAM SU30_,NO, READ IN RECORD BY ITSELF_^1*_]_^1SU18_!STQ* FRBLU1_'RECORD IN FILE RECORD BLOCK_^1_%LDQ* RECLGH_^1SU20_!INQ -1_+TRANSFER RECORD TO USER,S RECORD BUFFER_^1_%LDA* (FRBLU1),Q_^1_%STA* (RECBFR),Q_^1_%SQZ SUEXI€€T_^1_%JMP* SU20_^1*_]_^1*_*RETRIEVE THE RECORD BY ITSELF_^1SU30_!RTJ* (AMMRED)_$READ THE RECORD IN BY ITSELF_^1RECBFR NUM 0_^1RECLGH NUM 0_^1FRBLU1 NUM 0_^1FRBID1 NUM 0_^1FRBSC1 NUM 0_^1_%SQP SUEXIT_^1MMER_!JMP* MMERR_"*****MASS MEMORY ERROR_^1SUEXIT JMP* (SETUP)_%RETURN_^1_%EJT_]_^1*_*DELETE KIS FOM KIS BLOCK IF AT END OF LINK_^1*_]_^1CHKEOL LDA* EOLFLG_'CHECK IF AT THE END €€OF THE LINK_^1_%SAZ DELKIS_'YES, DELETE KIS_^1_%LDQ* RECBFR_^1_%LDA- 2,Q_*PUT NEXT LINKED POINTER INTO KIS_^1_%LDQ- 1,Q_^1_%STQ* (KISPTR)_^1_%LDQ* KISPTR_^1_%STA- 1,Q_^1_%LDQ REQBUF_'SET FLAG TO FIRST TIME BECAUSE OF REMOVE_^1_%SET A_^1_%STA- EOLPT2,Q_^1_%JMP* WRTKIS_'WRITE OUT KIS BLOCK AND REMOVE RECORD_^1*_]_^1DELKIS LDA* KISPTR_'DELETE KIS FROM KIS BLOCK_^1_%ADD* KISLTH_^1_%€€STA* KISNPR_^1_%LDQ* KBLOC_(DECREMENT THE NUMBER OF KIS,S IN BLOCK_^1_%LDA- 2,Q_^1_%INA -1_^1_%STA- 2,Q_^1_%INA 1_,COMPUTE NUMBER OF WORDS TO MOVE_^1_%MUI* KISLTH_^1_%INA KIBHDR_^1_%ADD* KBLOC_^1_%SUB* KISNPR_^1_%STA* NUMWRD_^1*_]_^1_%CLR Q_,DELETE KIS BY MOVING UP KIS,S_^1MOVKIS TRQ A_^1_%SUB* NUMWRD_'ALL DONE_^1_%SAP WRTKIS_)YES_^1_%LDA* (KISNPR),Q_^1_%STA* (KISPTR),Q_^1_%I€€NQ 1_^1_%JMP* MOVKIS_^1*_]_^1WRTKIS LDA* AMMWRT_'WRITE CHANGED KIS BLOCK TO MASS MEMORY_^1_%RTJ ACCKIB_^1REMREC JMP* RMVREC_^1_%SPC 3_^1AMMWRT ADC MMWRIT_'ADDRESS OF MASS MEMORY WRITE ROUTINE_^1WPS_"ADC WRDSEC_'NUMBER OF WORDS PER SECTOR_^1ANWBLK ADC NWFBLK_'NUMBER OF WORDS IN FILE BLOCK_^1IFBFLG NUM 0_,IN-FILE-BLOCK FLAG (POSITIVE IF RECORD IS)_^1NWFB1 NUM 0_,NUMBER OF WO€€RDS IN FILE BLOCK_^1_%EJT_]_^1*_*ACCESS THE RECORD,S FILE RECORD BLOCK_^1*_]_^1ACCFRB 000 000_^1_%STA* FRBSEC_'A = FILE RECORD BLOCK SECTOR_^1_%STQ* RORW+1_'Q = READ OR WRITE ADDRESS_^1*_]_^1RORW_!RTJ+ 0000_)READ IN FRB_^1AFLBLK ADC FILBLK_'ADDRESS OF FILE BLOCK_^1NWFB_!NUM 0_,NUMBER OF WORDS TO BE ACCESSED_^1FRBLU NUM 0_,LOGICAL UNIT OF FRB_^1FRBIDX NUM 0_^1FRBSEC NUM 0_,ST€€ARTING SECTOR OF FRB_^1*_]_^1_%CLR A_,RESET FRB INDEX TO ZERO_^1_%STA* FRBIDX_^1*_]_^1_%SQP ACCEXT_^1_%JMP* MMER_#*****MASS MEMORY ERROR_^1*_]_^1ACCEXT JMP* (ACCFRB)_$RETURN_^1_%EJT_]_^1*_*REMOVE THE RETRIEVED RECORD_^1RMVREC LDA FIFOFG_'SET REMOVE FIFO RECORD FLAG TO 2, IF INDEXED/_^1_%LDQ NUMWRD_)LINKED FIFO AND CURRENT LINK EMPTY_!63*1353_^1_%SQP T620_^1*_]_^1T610_!CLR A_,€€CLEAR REMOVE-FIFO-RECORD FLAG_^1T620_!STA* RFRFLG_^1_%LDQ* AFLBLK_^1_%LDA- 2,Q_*CHECK IF RECORD IS IN LAST FRB_^1_%SAN T625_+NO_^1_%ENA -1_+RECORD IN LAST FRB_^1_%AND- IDXCHG,I_^1_%INA 1_,SET FIS CHANGED BIT_^1_%STA- IDXCHG,I_^1_%LDA- NRLFRB,I_$DECREMENT NUMBER OF RECORDS IN LAST FRB_^1_%INA -1_^1_%STA- NRLFRB,I_$IS THERE MORE THAN ONE RECORD IN THE LAST FRB_^1_%SAN T630_+YES,€€ THEN JUST REMOVE THE RECORD_^1_%ENA FRBHDR_'NO MORE RECORDS IN LAST FRB,_^1_%STA- FRBNIX,I_'RESET FRB INDEX TO BEGINNING OF FRB_^1_%JMP* T700_)(DONT RETURN LAST FRB)_^1*_]_^1T625_!INA -1_+DECREMENT NUMBER OF RECORDS IN FRB_^1_%STA- 2,Q_^1_%SAN T630_^1_%JMP* RTNFRB_'NO MORE RECORDS IN FRB, RETURN FRB_^1*_]_^1T630_!LDA* (RECBFR)_$SET REMOVE BIT IN RECORD_^1_%EOR- ONEBIT+15_^1_%LD€€Q* IFBFLG_'CHECK IF RECORD IN FILE BLOCK_^1_%SQM T640_)NO, REMOVE RECORD BY ITSELF_^1_%LDQ* FRBID3_^1_%STA* (AFLBLK),Q_"RECORD IS IN FILE BLOCK, REMOVE IT WHEN FRB IS_^1_%JMP* T650_)WRITTEN BACK TO DECREMENT NUMBER OF RECORDS_^1*_]_^1T640_!STA* (AMMRED)_$REMOVE RECORD BY ITSELF_^1_%RTJ* (AMMWRT)_^1AMMRED ADC MMREAD_^1_%NUM 1_^1FRBLU3 NUM 0_^1FRBID3 NUM 0_^1FRBSC3 NUM 0_^1_%SQ€€P T650_^1_%JMP* MMER_#*****MASS MEMORY ERROR_^1*_]_^1T650_!LDA* RFRFLG_'DOES EXTRA FIFO RECORD HAVE TO BE DELETED_^1_%SAN T660_^1_%LDA* FRBSC3_'NO, WRITE FRB TO DECREMENT NUMBER OF RECORDS_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1_%JMP* T700_)SET UP REQUEST INDICATOR AND EXIT_^1_%EJT_]_^1*_*SETUP TO DELETE EXTRA INDEXED/LINKED FIFO RECORD_^1*_]_^1T660_!LDQ* RECBFR_'SETUP TO DELETE EXTRA€€ FIFO RECORD_^1_%LDA- 1,Q_^1_%STA* FRBSC3_'GET FRB SECTOR/INDEX TO EXTRA RECORD_^1_%LDA- 2,Q_^1_%STA* FRBID3_^1_%LDA* ANWBLK_^1_%SUB- 2,Q_*DOES (OR WILL) EXTRA RECORD FIT IN FILE BLOCK_^1_%INA -1_^1_%STA* IFBFLG_'IF IT CAN, IN-FILE-BLOCK FLAG IS POSITIVE_^1*_]_^1_%LDQ* RFRFLG_'CHECK IF RECORD,S FRB WAS RETURNED_^1_%SQM T680_+YES, DONT WRITE RECORD,S FRB_^1_%SAM T670_)IF EXTRA RE€€CORD NOT IN BLOCK, READ IT IN_^1*_]_^1_%LDA* FRBSC3_'CHECK IF EXTRA RECORD IN SAME BLOCK AS RECORD_^1_%EOR* FRBSC1_^1_%SAZ T690_)YES, SKIP READING ITS FRB IN_^1*_]_^1T670_!LDA* FRBSC1_'WRITE OUT RECORD,S FRB_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1*_]_^1T680_!LDA* FRBSC3_'READ IN EXTRA RECORD,S FRB_^1_%LDQ* AMMRED_^1_%RTJ* ACCFRB_^1*_]_^1T690_!JMP* T610_)REMOVE EXTRA FIFO RECORD IN LIKE€€ MANNER_^1_%SPC 3_^1RFRFLG NUM 0_,REMOVE-FIFO-RECORD FLAG (NON-ZERO, IF SET)_^1_%EJT_]_^1*_*RETURN THE RECORD,S FILE RECORD BLOCK_^1*_]_^1RTNFRB ENA -1_^1_%AND- IDXCHG,I_^1_%INA 1_^1_%STA- IDXCHG,I_^1_%LDQ* AFLBLK_^1_%ENA 1_^1_%STA* NWFB_+(SETUP TO WRITE ONE WORD THREADS)_^1_%LDA* FRBSC3_^1_%EOR- FRBFSA,I_^1_%SAN RFRB10_^1*_]_^1_%LDA- 1,Q_*SET NEW FIRST FRB TO NEXT FRB_^1_%ST€€A- FRBFSA,I_^1_%JMP* RFRB20_'WRITE BACKWARD FRB THREAD ON NEW FIRST FRB_^1*_]_^1RFRB10 LDA- (ZERO),Q_$WRITE FORWARD FRB THREAD ON LAST FRB_^1_%LDQ- 1,Q_^1_%STQ* (AFLBLK)_^1_%RAO* FRBIDX_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1*_]_^1_%LDA* (AFLBLK)_$WRITE BACKWARD FRB THREAD ON NEXT FRB_^1_%LDQ* FRBSEC_^1_%STQ* (AFLBLK)_^1RFRB20 LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1*_]_^1_%LDA* NWFB1_(RESET NUMB€€ER OF WORDS TO ACCESS IN FILBLK_^1_%STA* NWFB_^1_%LDA* FRBSC3_'SET UP STARTING SECTOR OF RECORD,S FRB_^1_%STA STRSEC_^1_%LDQ* FRBLU3_'Q = LOGICAL UNIT OF FRB_^1_%LDA- FRBSIZ,I_^1_%AND- ONEMSK+8_$A = NUMBER OF SECTORS IN FRB_^1_%RTJ RTNSPC_'RETURN THE RECORD,S FILE RECORD BLOCK_^1*_]_^1_%LDA- NUMFRB,I_$DECREMENT NUMBER OF FILE RECORD BLOCKS_^1_%INA -1_^1_%STA- NUMFRB,I_^1*_]_^1_%€€LDA* RFRFLG_'CHECK IF EXTRA FIFO RECORD IS TO BE REMOVED_^1_%SAZ T700_+NO_^1_%SET A_.YES, SET REMOVE-FIFO-RECORD FLAG NEGATIVE_^1_%STA* RFRFLG_^1_%JMP* T660_)PROCESS REMOVAL OF EXTRA FIFO RECORD_^1_%EJT_]_^1*_*SETUP INDICATOR WORD AND EXIT_^1*_]_^1T700_!LDA (FILCOM)_^1_%SAM T705_)SKIP IF RECORD WAS DELETED_^1_%LDQ RECPTR_'SET RECORD POINTER INTO USER,S PARAM._^1_%LDA FRBSC1_^€€1_%STA- (ZERO),Q_^1_%LDA FRBID1_^1_%STA- 1,Q_^1*_]_^1T705_!RTJ CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SAZ T710_)SKIP IF UNPROTECTED AND FMPFLG NOT SET_^1_%LDA (FILCOM)_$CHECK IF FILE IS TO BE LOCKED_^1_%AND- ONEMSK+14_^1_%TRA Q_^1_%SAZ T710_)SKIP IF NO_^1_%LDA- LOKADR,I_$CHECK IF FILE ALREADY LOCKED_^1_%SAZ T712_)NO, LOCK FILE_^1T710_!JMP* T718_^1*_]_^1T712_!STQ- LOKADR,I_$S€€AVE FILE COMB. IN LOKADR (TEMP)_^1_%RAO LOKNEU_'BUMP NO. OF IN USE ENTRIES_^1_%LDQ =XLOKNOE_$SEARCH FOR EMPTY SLOT IN LOCK TABLE_^1_%QLS 1_^1T714_!INQ -2_^1_%LDA* (ADRLOK),Q_^1_%SAZ T716_)SKIP IF SLOT FOUND_^1_%JMP* T714_^1*_]_^1T716_!ADQ* ADRLOK_'SET Q TO ABSOLUTE ADDRESS OF ENTRY_^1_%LDA- LOKADR,I_$PICKUP COMBINATION_^1_%STQ- LOKADR,I_$STORE ABS ADDRESS OF ENTRY_^1_%STA- 1,Q€€_*STORE COMB. AND FILE NO. IN ENTRY_^1_%LDA (FILNUM)_^1_%STA- (ZERO),Q_^1*_]_^1T718_!LDA EOLFLG_'SET NOT END OF LINK INDICATION (BIT 4)_^1*_8IF SO_^1_%LDQ (RECBFR)_^1_%TCQ Q_,CHECK IF A SHORT READ_^1_%ADQ RECLGH_^1_%SQP T720_^1_%EOR- ONEBIT+2_$YES, SET BIT 2_^1*_]_^1T720_!LDQ- LOKADR,I_$CHECK IF FILE LOCKED_^1_%SQZ T730_^1_%EOR- ONEBIT+1_$YES, SET BIT 1_^1*_]_^1T730_!JMP RQ€TEXIT_'EXIT_^1_%SPC 3_^1ADRLOK ADC LOKTBL_'LOCK FILE TABLE_^1_%SPC 2_^1_%END_]_^__TPRTVIDO CSY/ F23 P€1_%NAM RTVIDO_'DECK-ID F23 FILE MANAGER_)SUMMARY-110_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_]_^1* CALL RTVIDO(FILNUM,KEYVAL,FILCOM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1_%SPC 2_^1*_*EXTERNALS_^1_%EXT ABSPAR_'ABSOLUTIZES APL_^1_%EXT CKCFIS_'CHECKS CORE FOR FISB€€_^1_%EXT CKPROT_'CHECK IF REQUEST PROTECTED_^1_%EXT CKUADR_'CHECK LEGALITY OF UNPROTECTED ADDRESS_^1_%EXT GETSPC_'GET ALLOCATABLE CORE SPACE_^1_%EXT MMREAD_'MASS MEMORY READ_^1_%EXT MMWRIT_'MASS MEMORY WRITE_^1_%EXT SRHFIS_'SEARCH FOR FIS IN FIS BLOCKS_^1_%EXT FILBLK_'FILE BLOCK FOR RETRIEVING RECORD,S FRB_^1_%EXT NWFBLK_'NUMBER OF WORDS IN FILE BLOCK_^1_%EXT LOKNOE_'LOCK €€FILE TABLE NUMBER OF ENTRIES_^1_%EXT LOKNEU_'LOCK FILE TABLE NO. OF ENTRIES USED_^1_%EXT LOKTBL_'LOCK FILE TABLE_^1*_]_^1_%EXT* RTNSPC_'RETURN SPACE_^1_%EXT* STRSEC_'STARTING SECTOR OF SPACE TO BE RETURNED_^1_%EXT* GETKID_'GET KIS DIRECTORY_^1_%EXT* RPEND_(REQUEST PROCESSOR END_^1_%EJT_]_^1*_*EQUIVALENCES_^1*_1COMMUNICATION REGION_^1_%EQU ZERO(2)_%ZERO CONSTANT_^1_%EQU ONEMSK(3€€)_#ONE MASK TABLE_^1_%EQU ZROMSK($13)_!ZERO MASK TABLE_^1_%EQU ONEBIT($23)_!ONE BIT TABLE_^1_%EQU ZROBIT($33)_!ZERO BIT TABLE_^1_%EQU AMONI($F4)_"ADDRESS OF MONITOR_^1*_]_^1*_1HEADER LENGTHS / FIS SIZE / WORDS PER SECTOR_^1_%EQU FRBHDR(3)_#NUMBER OF WORDS IN FILE RECORD BLOCK HEADER_^1_%EQU KIDHDR(4)_#NUMBER OF WORDS IN KIS DIRECTORY HEADER_^1_%EQU KIBHDR(3)_#NUMBER OF WORDS€€ IN KIS BLOCK HEADER_^1_%EQU FH(6)_(NUMBER OF WORDS IN CORE FIS HEADER_^1_%EQU FISSIZ(16)_"NUMBER OF WORDS IN MASS MEMORY FIS_^1_%EQU WRDSEC(96)_"NUMBER OF WORDS PER SECTOR_^1*_]_^1*_1CORE FILE INFORMATION SEGMENT INDEXES_^1_%EQU ANCFIS(0)_#THREAD TO NEXT CORE FIS_^1_%EQU SECFIS(1)_#FILE INFORMATION SEGMENT SECTOR_^1_%EQU IDXCHG(2)_#FIS INDEX AND FIS/KID CHANGE BITS_^1_%EQU €€ADRKID(3)_#KIS DIRECTORY ADDRESS (IF ZERO, NOT IN CORE)_^1_%EQU LOKADR(4)_#LOCK ENTRY ADDRESS (IF 0, NOT LOCKED)_^1_%EQU FILCLK(5)_#FILE CLOCK_^1_%EQU SANFIS(FH+00) SECTOR ADDRESS TO NEXT FIS (SAME HASH CODE)_^1_%EQU IXNFIS(FH+01) SECTOR INDEX_!TO NEXT FIS (SAME HASH CODE)_^1_%EQU FILENO(FH+02) FILE NUMBER_^1_%EQU FRBFSA(FH+03) FIRST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU €€NRLFRB(FH+04) NUMBER OF RECORDS IN LAST FILE RECORD BLOCK_^1_%EQU FRBLSA(FH+05) LAST FILE RECORD BLOCK SECTOR ADDRESS_^1_%EQU FRBNIX(FH+06) NEXT INDEX IN LAST FILE RECORD BLOCK_^1_%EQU KIDSEC(FH+07) KIS DIRECTORY SECTOR_^1_%EQU KIDSIZ(FH+08) KIS DIRECTORY SIZE_^1_%EQU KIBSIZ(FH+09) KIS BLOCK SIZE_^1_%EQU KEYLTH(FH+10) KEY LENGTH_^1_%EQU NUMEKV(FH+11) NUMBER OF EXPECTED KEY V€€ALUES_^1_%EQU FIFORL(FH+12) FIXED RECORD LENGTH FOR INDEXED LINKED FIFO_^1_%EQU NUMFRB(FH+13) NUMBER OF FILE RECORD BLOCKS_^1_%EQU FRBSIZ(FH+14) FILE RECORD BLOCK SIZE (BITS 0-8)_^1_%EQU FISIND(FH+14) FIS INDICATORS (BITS 13-15)_^1_%EQU FISFLG(FH+15) FIS FLAGS AND LOGICAL UNITS_^1*_]_^1*_1REQUEST BUFFER INDEXES_^1_%EQU CURIDX(6)_#CURRENT KIS DIRECTORY INDEX_^1_%EQU CURKIB(7)€€_#CURRENT KIS BLOCK SECTOR_^1_%EQU NXTPT1(8)_#NEXT LINKED RECORD POINTER 1_^1_%EQU NXTPT2(9)_#NEXT LINKED RECORD POINTER 2_^1_%EQU EOLPT1(10)_"END OF LINK POINTER 1_^1_%EQU EOLPT2(11)_"END OF LINK POINTER 2_^1_%EJT_]_^1* CALL RTVIDO(FILNUM,KEYVAL,FILCOM,RECPTR,RECBUF,RECLTH,REQBUF,REQIND)_^1_%SPC 2_^1_%ADC* RPEND_(LENGTH OF REQUEST PROCESSOR_^1_%SPC 2_^1RTVIDO 000 000_^1_%S€€TQ- I_^1*_]_^1_%ENQ 8_^1T010_!INQ -1_+LOOP TO PICK UP ADDRESS OF CALL PARAMETERS_^1_%STQ* FILNUM_^1_%ADQ- I_^1_%RTJ ABSPAR_^1_%LDQ* FILNUM_^1_%STA* FILNUM,Q_^1_%SQZ T020_^1_%JMP* T010_^1*_]_^1T020_!LDQ* (FILNUM)_$CHECK FOR VALID FILE NO._^1_%SQZ T030_^1_%SQP T100_^1T030_!LDA- ONEBIT+14_^1*_]_^1T040_!EOR- ONEBIT+15_#ERROR EXIT_^1*_]_^1T050_!STA* (REQIND)_$NORMAL EXIT_^1_%JMP* €€(RTVIDO)_^1_%SPC 2_^1*_]_^1T100_!RTJ CKCFIS_'SEE IF FIS IN CORE_^1_%SAP T110_^1*_]_^1_%LDQ* (FILNUM)_$NOT IN CORE CHECK MM_^1_%RTJ SRHFIS_^1_%SAN T120_^1*_]_^1T110_!STQ- I_,SAVE CORE FIS ADDRESS_^1_%LDA- FISFLG,Q_^1_%SAM T130_^1T120_!LDA- ONEBIT_'RELEASED OR NOT DEFINED_^1_%JMP* T040_^1_%EJT_]_^1*_*CHECK REQUEST FOR ERRORS_^1*_]_^1T130_!LDQ- FISIND,Q_$CHECK IF FILE IS INDEXED€€ ORDERED_^1_%QLS 1_^1_%LDA- ONEBIT+11_^1_%SQP T140_)ERROR, NOT AN INDEXED ORDERED FILE_^1*_]_^1_%LDA* (FILCOM)_$CHECK IF REMOVING RECORD_^1_%SAP T160_+NO_^1_%LDQ- LOKADR,Q_$CHECK IF FILE LOCKED_^1_%SQZ T150_^1_%AND- ONEMSK+14_#IF LOCKING AND FILE LOCKED, FILCOM =_^1_%SAN T150_*FILES COMBINATION_^1_%LDA- ONEBIT+1_$ERROR TRYING TO REMOVE FROM LOCKED FILE W/0 CM_^1T140_!JMP* T040€€_^1*_]_^1T150_!LDA- FISFLG,I_$CHECK IF FILE PROTECTED_^1_%AND- ONEBIT+14_^1_%SAZ T160_^1_%RTJ* (ACPROT)_$CHECK IF REQUEST PROTECTED_^1_%SAN T160_^1_%LDA- ONEBIT+13_#UNPROT CALL CANT REMOVE FROM PROT FILE_^1_%JMP* T040_)ERROR_^1*_]_^1T160_!LDA* (RECLTH)_$CHECK RECLTH FOR ZERO OR NEGATIVE_^1_%SAZ T170_^1_%SAM T170_^1_%LDQ- FISIND,I_$CHECK IF INDEXED/LINKED_^1_%SQP T180_+NO_^1_%I€€NA -3_-YES, RECORD LENGTH MUST BE .GE.3_^1_%SAP T180_^1T170_!JMP* T030_)RECORD SIZE ILLEGAL_^1*_]_^1T180_!CLR Q_,CLEAR KIS BLOCK LOCATION_^1_%STQ* KIBLOC_^1_%LDA* RECPTR_'CHECK IF FIRST RECORD POINTER ADDRESS LEGAL_^1_%RTJ* (ACUADR)_^1_%INA 1_,CHECK IF SECOND RECORD POINTER ADDRESS LEGAL_^1_%RTJ* (ACUADR)_^1*_]_^1_%LDA* RECBUF_'CHECK LEGALITY OF UNPROTECTED (IF IT IS) ADR_^1_%R€€TJ* (ACUADR)_$OK, IF IT RETURNS_^1*_]_^1_%ADD* (RECLTH)_$CHECK IF THE END OF THE RECORD BUFFER OK_^1_%INA -1_^1_%RTJ* (ACUADR)_$OK, IF IT RETURNS_^1*_]_^1_%LDA- NRLFRB,I_$CHECK IF THERE ARE ANY RECORDS IN FILE 63*1354_^1_%SAN T200_P63*1354_^1_%LDA- FRBFSA,I_L63*1354_^1_%SUB- FRBLSA,I_L63*1354_^1_%SAN T200_^1_%JMP* ENDFIL_'NO, END OF FILE/ SET BIT 3 AND EXIT_^1*_81 CARD DELETED_6€€63*1354_^1*_*CHECK IF FIRST ENTRY, GET KIS DIRECTORY AND KIS BLOCK SPACE_^1*_]_^1T200_!LDA- FISIND,I_$SET FIFO FLAG, IF FIRST-IN, FIRST-OUT SELECTED_^1_%ALS 4_.(IF SET, FIFOFG = 2)_^1_%AND- ONEBIT+1_^1_%STA* FIFOFG_^1*_]_^1_%LDA* (RECPTR)_$CHECK IF FIRST TIME ENTRY FOR LINKED CALL_^1_%SAZ T220_+YES, SET FIRST TIME ENTRY_^1*_]_^1_%LDQ* REQBUF_'CHECK IF NOT INDEXED-LINKED_^1_%LDA- €€FISIND,I_^1_%SAP T205_+YES, GET NEXT RECORD WITH NEXT HIGHER KEY_^1*_]_^1_%LDA- EOLPT1,Q_$CHECK IF RE-ENTRY AFTER REACHING END OF LINK_^1_%SAP T210_+NO, CONTINUE DOWN LINK_^1*_]_^1T205_!LDA- CURIDX,Q_$LAST CALL WAS AT THE END OF A LINK_^1_%STA* KIDIDX_((GET NEXT RECORD WITH NEXT HIGHER KEY)_^1_%LDA- CURKIB,Q_^1_%STA* KIBSEC_'RESTORE KID INDEX AND KIB SECTOR_^1_%ENA 1_^1_%JMP* T2€€20_)SET RRLFLG = 1 AND CONTINUE_^1*_]_^1T210_!LDA- EOLPT2,Q_$CHECK IF REMOVE(S) MAKE LINKED CALL 1ST TIME_^1_%TCA A_.YES, IF (EOLPT2) IS MINUS ZERO_^1*_]_^1T220_!STA* RRLFLG_'SET REPEAT RETRIEVE LINKED FLAG (POS IF FIRST)_^1_%SAP T230_^1_%INQ NXTPT1_'REPEATED RETRIEVE LINKED CALL, GET NEXT RECORD_^1_%JMP SETRTV_N63*1354_^1*_]_^1T230_!ENA WRDSEC_'FIRST TIME ENTRY OF THIS CALL_^€€1_%MUI- KIDSIZ,I_^1_%INA -KIDHDR_%GET NUMBER OF WORDS IN KIS DIRECTORY - HEADER_^1_%STA* NWKID_^1*_]_^1_%ENA WRDSEC_'GET NUMBER OF WORDS IN KIS BLOCK_^1_%MUI- KIBSIZ,I_^1_%STA* NWKIB_^1*_]_^1_%RTJ GETSPC_'GET SPACE FOR KIS BLOCK_^1_%STQ* KIBLOC_^1_%STQ KBLOC_(SAVE KIS BLOCK ADDRESS TO RELEASE_^1_%EJT_]_^1*_*FIND ORDERED INDEX INTO KIS DIRECTORY TO GET KIS BLOCK_^1*_]_^1_%LDA* (€€KEYVAL)_$INDEXED/ORDERED, CHECK KEY VALUE_^1_%SAP T250_^1_%CLR A_,NEGATIVE, USE INDEX ZERO_^1*_]_^1T250_!SUB- NUMEKV,I_^1_%SAM T260_^1_%ENA -1_+TOO LARGE, USE LARGEST INDEX_^1*_]_^1T260_!ADD- NUMEKV,I_^1_%MUI* NWKID_(INDEX = (KEYVAL*NWKID)/NEKV_^1_%DVI- NUMEKV,I_^1_%TRA Q_^1_%INQ KIDHDR_^1_%LDA* RRLFLG_'CHECK IF SEARCH FOR FIRST KEY VALUE_^1_%SAN T290_+NO, START SEARCH AT LA€€ST KIS BLOCK_^1*_]_^1T280_!STQ* KIDIDX_'SAVE KIS DIRECTORY INDEX_^1*_]_^1_%RTJ GETKID_^1*_]_^1_%LDA* (KIDIDX),Q_"GET KIS BLOCK POINTER_^1_%STA* KIBSEC_^1_%SAZ GNXPTR_'NO KIS BLOCK POINTER, GET NEXT ONE_^1T290_!JMP* SRHKIS_'SEARCH FOR KIS_^1_%EJT_]_^1*_*STORE INDEXED PARAMETERS_^1*_]_^1FILNUM ADC 0_,FILE NUMBER ADDRESS_^1KEYVAL ADC 0_,KEY VALUE ADDRESS_^1FILCOM ADC 0_,FILE COMB€€INATION_^1RECPTR ADC 0_,RECORD POINTER ADDRESS_^1RECBUF ADC 0_,RECORD BUFFER ADRESS_^1RECLTH ADC 0_,RECORD LENGTH ADDRESS_^1REQBUF ADC 0_,REQUEST BUFFER ADDRESS_^1REQIND ADC 0_,REQUEST INDICATOR ADDRESS_^1*_]_^1FIFOFG NUM 0_,INDEXED/LINKED FIRST-IN, FIRST-OUT FLAG_^1RRLFLG NUM 0_,REPEAT RETRIEVE LINK FLAG (NEG IF REPEATED)_^1NWKID NUM 0_,NUMBER OF WORDS IN KIS DIRECTORY_^1€€KIDIDX NUM 0_,KIS DIRECTORY INDEX_^1*_]_^1ACUADR ADC CKUADR_'CHECK IF AN UNPROTECTED ADDRESS_^1ACPROT ADC CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SPC 2_^1*_*GET NEXT KIS BLOCK POINTER_^1GNXPTR LDQ* KIDIDX_'GET NEXT KIS BLOCK POINTER_^1_%INQ 1_^1_%TRQ A_^1_%INA -KIDHDR_^1_%EOR* NWKID_(CHECK FOR END OF BLOCK POINTERS_^1_%SAZ ENDFIL_^1_%JMP* T280_)NO, GET NEXT ONE_^1*_]_^1ENDFI€€L LDA- ONEBIT+3_$END OF FILE, SET BIT 3 AND EXIT_^1_%JMP RQEXIT_N63*1354_^1_%SPC 2_^1*_*ACCESS (READ OR WRITE) THE KIS BLOCK_^1*_]_^1ACCKIB 000 000_^1_%STA* REDWRT+1_$SETUP READ OR WRITE REQUEST_^1*_]_^1REDWRT RTJ+ 0000_)READ OR WRITE KIS BLOCK_^1KIBLOC NUM 0_,KIS BLOCK ADDRESS_^1NWKIB NUM 0_,NUMBER OF WORDS IN KIS BLOCK_^1KIBLU NUM 0_,KIS LOGICAL UNIT_^1_%NUM 0_^1KIBSEC N€€UM 0_,KIS BLOCK SECTOR_^1*_]_^1_%SQM MMER1_"*****MASS MEMORY ERROR_^1_%JMP* (ACCKIB)_$EXIT_^1*_]_^1MMER1 JMP MMERR_O63*1354_^1_%EJT_]_^1*_*SEARCH FOR KIS IN KIS BLOCK(S)_^1*_]_^1SRHKIS ENA 2_,SEARCH FOR KIS ON KIS BLOCK(S)_^1_%ADD* FIFOFG_^1_%STA PNTLTH_'SAVE POINTER LENGTH (2 OR 4)_*63*1354_^1_%ADD- KEYLTH,I_^1_%STA KISLTH_'SAVE KIS LENGTH_763*1354_^1_%LDA* KIBLOC_^1_%INA €€KIBHDR_^1_%ADD* PNTLTH_'SAVE FIRST KIS BLOCK KEY POINTER_^1_%STA* KIB1KP_^1_%LDA- FISFLG,I_$SETUP KIS LOGICAL UNIT_^1_%ARS 7_^1_%AND- ONEMSK+6_^1_%STA* KIBLU_^1*_]_^1GNXKIB LDA =XMMREAD_$READ IN NEXT KIS BLOCK_^1_%RTJ* ACCKIB_^1_%LDA* KIB1KP_'RESET KEY POINTER_^1_%STA* KEYPTR_^1_%LDQ* KIBLOC_'CHECK NEXT KIS BLOCK_^1_%LDA- 2,Q_^1*_]_^1CNXKIS INA -1_+CHECK NEXT KIS, DECREMENT KIS €€COUNT_^1_%STA* KISCNT_^1_%SAM CHKOVF_'NO MORE KIS,S (CHECK IF ANY OVF BLOCKS)_^1*_]_^1_%LDA* (KEYPTR)_$CHECK KEY WORD AGAINST KIS KEY WORD_^1_%SUB* (KEYVAL)_^1_%SUB* RRLFLG_)(GET NEXT HIGHER KEY VALUE, IF SET TO ONE)_^1_%SAP SAVIDO_'KEY FOUND, SAVE INDEXED ORDERED INFORMATION_^1*_]_^1_%LDA* KISCNT_'KIS KEY VALUE .LT. KEY VALUE, CHECK NEXT ONE_^1_%LDQ* KEYPTR_^1_%ADQ* KISLTH_'INCR€€EMENT KEY POINTER_^1_%STQ* KEYPTR_^1_%JMP* CNXKIS_'CONTINUE SEARCH_^1*_]_^1CHKOVF LDQ* KIBLOC_'YES, CHECK IF AN OVERFLOW KIS BLOCK EXISTS_^1_%LDQ- 1,Q_^1_%SQZ NOMORE_)NO, KIS NOT FOUND_^1_%STQ* KIBSEC_)YES, GET NEXT KIS OVERFLOW BLOCK_^1_%JMP* GNXKIB_^1*_]_^1NOMORE JMP* GNXPTR_'NO MORE KIS,S, GET NEXT KIS BLOCK POINTER_^1_%EJT_]_^1*_*SAVE INDEXED ORDERED INFORMATION AND END OF LI€€NK POINTER_^1*_]_^1SAVIDO LDQ* REQBUF_'SAVE KIS DIRECTORY INDEX_^1_%LDA* KIDIDX_^1_%STA- CURIDX,Q_^1_%LDA* KIBSEC_'SAVE KIS BLOCK SECTOR_^1_%STA- CURKIB,Q_^1_%INQ EOLPT1_'SETUP TO SAVE THE END OF LINK POINTER_^1_%STQ* EOLFLG_^1*_]_^1_%LDA* KEYPTR_'GET THE KIS RECORD POINTER_^1_%SUB* PNTLTH_^1_%STA* KISPTR_^1_%TRA Q_^1*_]_^1_%LDA* FIFOFG_'FOR LIFO LINKED, SET END OF LINK = 0_^1_%S€€TA* (EOLFLG)_^1_%SAZ STOEOL_^1_%LDA- 2,Q_*FOR FIFO LINKED, SET END OF LINK_^1_%STA* (EOLFLG)_'TO CURRENT EXTRA (LAST) RECORD_^1_%LDA- 3,Q_^1STOEOL RAO* EOLFLG_^1_%STA* (EOLFLG)_^1*_]_^1_%LDA* (KEYPTR)_$STORE KEY VALUE INTO USER,S PARAMETER_^1_%STA* (KEYVAL)_^1_%SPC 2_^1*_*SETUP TO RETRIEVE THE RECORD_^1*_]_^1SETRTV LDA* RECBUF_'SETUP RECORD BUFFER_^1_%STA RECBFR_N63*1354_^1_%INA€€ 1_,SETUP TO LINK PREVIOUS WITH NEXT, IF A REMOVE_^1_%STA* RECBW1_^1*_]_^1_%LDA* (RECLTH)_$SETUP RECORD LENGTH_^1_%STA RECLGH_N63*1354_^1*_]_^1_%RTJ* SETUP_(SETUP AND RETRIEVE THE RECORD_^1_%EJT_]_^1*_*IF END OF LINK, SET FLAG / CHECK IF RECORD IS TO BE REMOVED_^1*_]_^1_%LDA- FISIND,I_$SET END OF LINK FLAG_^1_%AND- ONEBIT+15_^1_%ALS 5_^1_%STA* EOLFLG_'SET FLAG IF INDEXED LINKED_€€^1_%SAZ T510_)CLEAR FLAG IF NOT INDEXED LINKED_^1*_]_^1_%LDQ* RECBW1_'CHECK NEXT POINTER AGAINST END-OF-LINK POINTER_^1_%LDA- 1,Q_^1_%LDQ* REQBUF_^1_%STA- NXTPT2,Q_$(SAVE NEXT POINTER 2)_^1_%LDA* (RECBW1)_^1_%STA- NXTPT1,Q_$(SAVE NEXT POINTER 1)_^1_%EOR- EOLPT1,Q_^1_%SAN T510_)NOT END OF LINK_^1_%LDA- NXTPT2,Q_^1_%EOR- EOLPT2,Q_^1_%SAN T510_)NOT END OF LINK_^1_%STA* EOLFLG_^1_%S€€ET A_,END OF LINKED REACHED, SET FLAGS_^1_%STA- EOLPT1,Q_^1*_]_^1T510_!LDQ* (FILCOM)_$CHECK IF RECORD IS TO BE REMOVED_^1_%SQM T530_^1_%JMP T700_)NO, REMOVE, SET INDICATOR WORD AND EXIT_^1*_]_^1T530_!STQ* NUMWRD_'SET LINK EMPTY FLAG NEGATIVE_^1_%LDA* RRLFLG_'CHECK IF FIRST TIME ENTRY_^1_%SAM T540_^1_%JMP* CHKEOL_)YES_^1*_]_^1T540_!LDQ RECPTR_'NOT FIRST TIME, REMOVE RECORD FROM€€ LINK_!1354_^1_%LDA- 1,Q_^1_%LDQ- (ZERO),Q_^1_%INA 1_^1_%STQ* FRBSC2_^1_%STA* FRBID2_^1*_]_^1*_*CHECK IF TWO POINTER WORDS ARE IN FILE BLOCK_(63*1354_^1_%LDQ RECPTR_N63*1354_^1_%LDA- (ZERO),Q_L63*1354_^1_%SUB* FRBSC1_N63*1354_^1_%SAN T550_)NOT IN FILE BLOCK_563*1354_^1_%LDA NWFB_P63*1354_^1_%SUB- 1,Q_Q63*1354_^1_%INA -3_R63*1354_^1_%SAM T550_)NOT IN FILE BLOCK_563*1354_^1_%EJ€€T_V63*1354_^1_%LDQ AFLBLK_'UNTHREAD REMOVED RECORD IN FILE BLOCK 63*1354_^1_%ADQ* FRBID2_N63*1354_^1_%LDA* (RECBW1)_L63*1354_^1_%STA- (ZERO),Q_L63*1354_^1_%RAO* RECBW1_N63*1354_^1_%LDA* (RECBW1)_L63*1354_^1_%STA- 1,Q_Q63*1354_^1_%JMP REMREC_N63*1354_^1*_] 63*1354_^1T550_!RTJ (AMMWRT)_$REMOVE RECORD FROM THE LINK_+63*1354_^1RECBW1 NUM 0_,POINTER TO NEXT RECORD_^1_%NUM 2_,TWO €€WORDS/POINTER_^1FRBLU2 NUM 0_,LU_^1FRBID2 NUM 0_^1FRBSC2 NUM 0_,LINK PONTER AREA (WORD 1/2) OF LAST RECORD_^1*_]_^1_%SQM MMERR_"*****MASS MEMORY ERROR_^1_%JMP* REMREC_'REMOVE THE UNLINKED RECORD_^1_%EJT_]_^1*_*STORE INDEXED PARAMETERS_<63*1354_^1*_] 63*1354_^1PNTLTH NUM 0_,KIS POINTER LENGTH (2=LIFO, 4=FIFO)_"63*1354_^1KISLTH NUM 0_,KIS LENGTH_<63*1354_^1KIB1KP NUM 0_,KIS B€€LOCK FIRST KEY POINTER_+63*1354_^1KEYPTR NUM 0_,CURRENT KIS BLOCK KEY POINTER_)63*1354_^1KISCNT NUM 0_,CURRENT KIS COUNT_563*1354_^1KISPTR NUM 0_,KIS POINTER_;63*1354_^1EOLFLG NUM 0_,END OF LINK POINTER AND INDICATOR_$63*1354_^1KISNPR NUM 0_,POINTER TO NEXT KIS_363*1354_^1NUMWRD NUM 0_,NUMBER OF WORDS TO MOVE_/63*1354_^1_%EJT_V63*1354_^1*_*REQUEST EXIT (INCLUDING ERROR EXITS)€€_^1_%SPC 2_^1*_*MASS MEMORY ERROR (SET BIT 7)_^1MMERR LDA- ONEBIT+7_^1_%SPC 2_^1*_*REQUEST ERROR (SET BIT 15)_^1RQERR EOR- ONEBIT+15_^1_%SPC 2_^1*_*REQUEST EXIT_^1RQEXIT LDQ KIBLOC_'CHECK IF KIS BLOCK ALLOCATED_*63*1354_^1_%SQZ EXIT_+NO_^1_%RTJ- (AMONI)_%RELEASE KIS BLOCK_^1_%NUM $1800_^1KBLOC NUM 0_^1*_]_^1EXIT_!JMP T050_)STORE INDICATOR AND EXIT_^1_%EJT_]_^1*_*STORE IN€€DEXED PARAMETERS_^1*_811 CARDS DELETED_463*1354_^1*_*SETUP FOR RETRIEVING THE RECORD_^1*_]_^1SETUP 000 000_^1_%LDA- FISFLG,I_$SETUP FILE RECORD BLOCK LOGICAL UNIT_^1_%AND- ONEMSK+6_^1_%STA* FRBLU_^1_%STA* FRBLU1_^1_%STA* FRBLU2_^1_%STA FRBLU3_^1_%LDA- 1,Q_^1_%LDQ- (ZERO),Q_$SETUP MASS MEMORY ADDRESS OF THE RECORD_^1_%STA* FRBID1_^1_%STQ* FRBSC1_^1_%STA FRBID3_^1_%STQ FRBSC3_^1€€*_]_^1_%LDA- FRBSIZ,I_$GET NUMBER OF WORDS IN FILE RECORD BLOCK_^1_%AND- ONEMSK+8_^1_%MUI* WPS_^1_%TRA Q_-CHECK IF FRB SIZE .GT. FILE BLOCK SIZE_^1_%SUB* ANWBLK_^1_%SAM SU05_)NO, USE FILE RECORD BLOCK SIZE_^1_%LDQ* ANWBLK_'YES, USE FILE BLOCK SIZE_^1SU05_!STQ* NWFB_^1_%STQ* NWFB1_^1_%EJT_]_^1*_*CHECK IF RECORD WILL FIT IN FILE RECORD BLOCK_^1*_]_^1_%LDA* ANWBLK_'CHECK IF RECORD WI€€LL FIT IN FILE BLOCK_^1_%SUB* FRBID1_^1_%SUB* RECLGH_^1*_]_^1_%LDQ (FILCOM)_$CHECK IF RECORD IS TO BE REMOVED_^1_%SQM SU10_+YES, READ IN FILE RECORD BLOCK_^1_%SAM SU15_)NO REMOVE AND WONT FIT IN FILE BLOCK_^1*_]_^1SU10_!STA* IFBFLG_'READ IN FILE RECORD BLOCK INTO FILE BLOCK_^1_%LDA* FRBSC1_^1_%LDQ* AMMRED_^1_%RTJ* ACCFRB_^1_%LDQ* AFLBLK_^1_%ADQ* FRBID1_^1_%LDA* IFBFLG_'CHECK IF €€RECORD IN FILE RECORD BLOCK_^1_%SAP SU18_,YES_^1_%ADD* RECLGH_^1_%INA -1_+SET IN-FILE-BLOCK FLAG IF FIRST WORD IS IN_^1_%SAM SU30_^1_%STA* IFBFLG_^1_%INA 1_^1_%SUB- (ZERO),Q_$CHECK IF ACTUAL RECORD IN FILE RECORD BLOCK_^1SU15_!SAM SU30_,NO, READ IN RECORD BY ITSELF_^1*_]_^1SU18_!STQ* FRBLU1_'RECORD IN FILE RECORD BLOCK_^1_%LDQ* RECLGH_^1SU20_!INQ -1_+TRANSFER RECORD TO USER,S€€ RECORD BUFFER_^1_%LDA* (FRBLU1),Q_^1_%STA* (RECBFR),Q_^1_%SQZ SUEXIT_^1_%JMP* SU20_^1*_]_^1*_*RETRIEVE THE RECORD BY ITSELF_^1SU30_!RTJ* (AMMRED)_$READ THE RECORD IN BY ITSELF_^1RECBFR NUM 0_^1RECLGH NUM 0_^1FRBLU1 NUM 0_^1FRBID1 NUM 0_^1FRBSC1 NUM 0_^1_%SQP SUEXIT_^1MMER_!JMP* MMERR_"*****MASS MEMORY ERROR_^1SUEXIT JMP* (SETUP)_%RETURN_^1_%EJT_]_^1*_*DELETE KIS FOM KIS BLO€€CK IF AT END OF LINK_^1*_]_^1CHKEOL LDA* EOLFLG_'CHECK IF AT THE END OF THE LINK_^1_%SAZ DELKIS_'YES, DELETE KIS_^1_%LDQ* RECBFR_^1_%LDA- 2,Q_*PUT NEXT LINKED POINTER INTO KIS_^1_%LDQ- 1,Q_^1_%STQ* (KISPTR)_^1_%LDQ* KISPTR_^1_%STA- 1,Q_^1_%LDQ REQBUF_'SET FLAG TO FIRST TIME BECAUSE OF REMOVE_^1_%SET A_^1_%STA- EOLPT2,Q_^1_%JMP* WRTKIS_'WRITE OUT KIS BLOCK AND REMOVE RECORD_^1*_]€€_^1DELKIS LDA* KISPTR_'DELETE KIS FROM KIS BLOCK_^1_%ADD* KISLTH_^1_%STA* KISNPR_^1_%LDQ* KBLOC_(DECREMENT THE NUMBER OF KIS,S IN BLOCK_^1_%LDA- 2,Q_^1_%INA -1_^1_%STA- 2,Q_^1_%INA 1_,COMPUTE NUMBER OF WORDS TO MOVE_^1_%MUI* KISLTH_^1_%INA KIBHDR_^1_%ADD* KBLOC_^1_%SUB* KISNPR_^1_%STA* NUMWRD_^1*_]_^1_%CLR Q_,DELETE KIS BY MOVING UP KIS,S_^1MOVKIS TRQ A_^1_%SUB* NUMWRD_'ALL DO€€NE_^1_%SAP WRTKIS_)YES_^1_%LDA* (KISNPR),Q_^1_%STA* (KISPTR),Q_^1_%INQ 1_^1_%JMP* MOVKIS_^1*_]_^1WRTKIS LDA* AMMWRT_'WRITE CHANGED KIS BLOCK TO MASS MEMORY_^1_%RTJ ACCKIB_^1REMREC JMP* RMVREC_^1_%SPC 3_^1AMMWRT ADC MMWRIT_'ADDRESS OF MASS MEMORY WRITE ROUTINE_^1WPS_"ADC WRDSEC_'NUMBER OF WORDS PER SECTOR_^1ANWBLK ADC NWFBLK_'NUMBER OF WORDS IN FILE BLOCK_^1IFBFLG NUM 0_,IN-€€FILE-BLOCK FLAG (POSITIVE IF RECORD IS)_^1NWFB1 NUM 0_,NUMBER OF WORDS IN FILE BLOCK_^1_%EJT_]_^1*_*ACCESS THE RECORD,S FILE RECORD BLOCK_^1*_]_^1ACCFRB 000 000_^1_%STA* FRBSEC_'A = FILE RECORD BLOCK SECTOR_^1_%STQ* RORW+1_'Q = READ OR WRITE ADDRESS_^1*_]_^1RORW_!RTJ+ 0000_)READ IN FRB_^1AFLBLK ADC FILBLK_'ADDRESS OF FILE BLOCK_^1NWFB_!NUM 0_,NUMBER OF WORDS TO BE ACCESSED_^1F€€RBLU NUM 0_,LOGICAL UNIT OF FRB_^1FRBIDX NUM 0_^1FRBSEC NUM 0_,STARTING SECTOR OF FRB_^1*_]_^1_%CLR A_,RESET FRB INDEX TO ZERO_^1_%STA* FRBIDX_^1*_]_^1_%SQP ACCEXT_^1_%JMP* MMER_#*****MASS MEMORY ERROR_^1*_]_^1ACCEXT JMP* (ACCFRB)_$RETURN_^1_%EJT_]_^1*_*REMOVE THE RETRIEVED RECORD_^1RMVREC LDA FIFOFG_'SET REMOVE FIFO RECORD FLAG TO 2, IF INDEXED/_^1_%LDQ NUMWRD_)LINKED FIFO€€ AND CURRENT LINK EMPTY_!63*1354_^1_%SQP T620_^1*_]_^1T610_!CLR A_,CLEAR REMOVE-FIFO-RECORD FLAG_^1T620_!STA* RFRFLG_^1_%LDQ* AFLBLK_^1_%LDA- 2,Q_*CHECK IF RECORD IS IN LAST FRB_^1_%SAN T625_+NO_^1_%ENA -1_+RECORD IN LAST FRB_^1_%AND- IDXCHG,I_^1_%INA 1_,SET FIS CHANGED BIT_^1_%STA- IDXCHG,I_^1_%LDA- NRLFRB,I_$DECREMENT NUMBER OF RECORDS IN LAST FRB_^1_%INA -1_^1_%STA- NRLFRB€€,I_$IS THERE MORE THAN ONE RECORD IN THE LAST FRB_^1_%SAN T630_+YES, THEN JUST REMOVE THE RECORD_^1_%ENA FRBHDR_'NO MORE RECORDS IN LAST FRB,_^1_%STA- FRBNIX,I_'RESET FRB INDEX TO BEGINNING OF FRB_^1_%JMP* T700_)(DONT RETURN LAST FRB)_^1*_]_^1T625_!INA -1_+DECREMENT NUMBER OF RECORDS IN FRB_^1_%STA- 2,Q_^1_%SAN T630_^1_%JMP* RTNFRB_'NO MORE RECORDS IN FRB, RETURN FRB_^1*_]_^1T6€€30_!LDA* (RECBFR)_$SET REMOVE BIT IN RECORD_^1_%EOR- ONEBIT+15_^1_%LDQ* IFBFLG_'CHECK IF RECORD IN FILE BLOCK_^1_%SQM T640_)NO, REMOVE RECORD BY ITSELF_^1_%LDQ* FRBID3_^1_%STA* (AFLBLK),Q_"RECORD IS IN FILE BLOCK, REMOVE IT WHEN FRB IS_^1_%JMP* T650_)WRITTEN BACK TO DECREMENT NUMBER OF RECORDS_^1*_]_^1T640_!STA* (AMMRED)_$REMOVE RECORD BY ITSELF_^1_%RTJ* (AMMWRT)_^1AMMRED ADC MMR€€EAD_^1_%NUM 1_^1FRBLU3 NUM 0_^1FRBID3 NUM 0_^1FRBSC3 NUM 0_^1_%SQP T650_^1_%JMP* MMER_#*****MASS MEMORY ERROR_^1*_]_^1T650_!LDA* RFRFLG_'DOES EXTRA FIFO RECORD HAVE TO BE DELETED_^1_%SAN T660_^1_%LDA* FRBSC3_'NO, WRITE FRB TO DECREMENT NUMBER OF RECORDS_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1_%JMP* T700_)SET UP REQUEST INDICATOR AND EXIT_^1_%EJT_]_^1*_*SETUP TO DELETE EXTRA INDEXE€€D/LINKED FIFO RECORD_^1*_]_^1T660_!LDQ* RECBFR_'SETUP TO DELETE EXTRA FIFO RECORD_^1_%LDA- 1,Q_^1_%STA* FRBSC3_'GET FRB SECTOR/INDEX TO EXTRA RECORD_^1_%LDA- 2,Q_^1_%STA* FRBID3_^1_%LDA* ANWBLK_^1_%SUB- 2,Q_*DOES (OR WILL) EXTRA RECORD FIT IN FILE BLOCK_^1_%INA -1_^1_%STA* IFBFLG_'IF IT CAN, IN-FILE-BLOCK FLAG IS POSITIVE_^1*_]_^1_%LDQ* RFRFLG_'CHECK IF RECORD,S FRB WAS RETURNED_^€€1_%SQM T680_+YES, DONT WRITE RECORD,S FRB_^1_%SAM T670_)IF EXTRA RECORD NOT IN BLOCK, READ IT IN_^1*_]_^1_%LDA* FRBSC3_'CHECK IF EXTRA RECORD IN SAME BLOCK AS RECORD_^1_%EOR* FRBSC1_^1_%SAZ T690_)YES, SKIP READING ITS FRB IN_^1*_]_^1T670_!LDA* FRBSC1_'WRITE OUT RECORD,S FRB_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1*_]_^1T680_!LDA* FRBSC3_'READ IN EXTRA RECORD,S FRB_^1_%LDQ* AMMRED_^1_%€€RTJ* ACCFRB_^1*_]_^1T690_!JMP* T610_)REMOVE EXTRA FIFO RECORD IN LIKE MANNER_^1_%SPC 3_^1RFRFLG NUM 0_,REMOVE-FIFO-RECORD FLAG (NON-ZERO, IF SET)_^1_%EJT_]_^1*_*RETURN THE RECORD,S FILE RECORD BLOCK_^1*_]_^1RTNFRB ENA -1_,SET FIS CHANGED BIT_^1_%AND- IDXCHG,I_^1_%INA 1_^1_%STA- IDXCHG,I_^1_%LDQ* AFLBLK_'CHECK IF THE FRB IS BING RETURNED_^1_%ENA 1_^1_%STA* NWFB_+(SETUP TO WRITE €€ONE WORD THREADS)_^1_%LDA* FRBSC3_^1_%EOR- FRBFSA,I_^1_%SAN RFRB10_^1*_]_^1_%LDA- 1,Q_*SET NEW FIRST FRB TO NEXT FRB_^1_%STA- FRBFSA,I_^1_%JMP* RFRB20_'WRITE BACKWARD FRB THREAD ON NEW FIRST FRB_^1*_]_^1RFRB10 LDA- (ZERO),Q_$WRITE FORWARD FRB THREAD ON LAST FRB_^1_%LDQ- 1,Q_^1_%STQ* (AFLBLK)_^1_%RAO* FRBIDX_^1_%LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1*_]_^1_%LDA* (AFLBLK)_$WRITE BACKWARD FR€€B THREAD ON NEXT FRB_^1_%LDQ* FRBSEC_^1_%STQ* (AFLBLK)_^1RFRB20 LDQ* AMMWRT_^1_%RTJ* ACCFRB_^1*_]_^1_%LDA* NWFB1_(RESET NUMBER OF WORDS TO ACCESS IN FILBLK_^1_%STA* NWFB_^1_%LDA* FRBSC3_'SET UP STARTING SECTOR OF RECORD,S FRB_^1_%STA STRSEC_^1_%LDQ* FRBLU3_'Q = LOGICAL UNIT OF FRB_^1_%LDA- FRBSIZ,I_^1_%AND- ONEMSK+8_$A = NUMBER OF SECTORS IN FRB_^1_%RTJ RTNSPC_'RETURN THE RECORD,€€S FILE RECORD BLOCK_^1*_]_^1_%LDA- NUMFRB,I_$DECREMENT NUMBER OF FILE RECORD BLOCKS_^1_%INA -1_^1_%STA- NUMFRB,I_^1*_]_^1_%LDA* RFRFLG_'CHECK IF EXTRA FIFO RECORD IS TO BE REMOVED_^1_%SAZ T700_+NO_^1_%SET A_.YES, SET REMOVE-FIFO-RECORD FLAG NEGATIVE_^1_%STA* RFRFLG_^1_%JMP* T660_)PROCESS REMOVAL OF EXTRA FIFO RECORD_^1_%EJT_]_^1*_*SETUP INDICATOR WORD AND EXIT_^1*_]_^1T700_!LDA €€ (FILCOM)_^1_%SAM T705_)SKIP IF RECORD WAS DELETED_^1_%LDQ RECPTR_'SET RECORD POINTER INTO USER,S PARAM._^1_%LDA FRBSC1_^1_%STA- (ZERO),Q_^1_%LDA FRBID1_^1_%STA- 1,Q_^1*_]_^1T705_!RTJ CKPROT_'CHECK IF REQUEST PROTECTED_^1_%SAZ T710_)SKIP IF UNPROTECTED AND FMPFLG NOT SET_^1_%LDA (FILCOM)_$CHECK IF FILE IS TO BE LOCKED_^1_%AND- ONEMSK+14_^1_%TRA Q_^1_%SAZ T710_)SKIP IF NO_^€€1_%LDA- LOKADR,I_$CHECK IF FILE ALREADY LOCKED_^1_%SAZ T712_)NO, LOCK FILE_^1T710_!JMP* T718_^1*_]_^1T712_!STQ- LOKADR,I_$SAVE FILE COMB. IN LOKADR (TEMP)_^1_%RAO LOKNEU_'BUMP NO. OF IN USE ENTRIES_^1_%LDQ =XLOKNOE_$SEARCH FOR EMPTY SLOT IN LOCK TABLE_^1_%QLS 1_^1T714_!INQ -2_^1_%LDA* (ADRLOK),Q_^1_%SAZ T716_)SKIP IF SLOT FOUND_^1_%JMP* T714_^1*_]_^1T716_!ADQ* ADRLOK_'SET Q T€€O ABSOLUTE ADDRESS OF ENTRY_^1_%LDA- LOKADR,I_$PICKUP COMBINATION_^1_%STQ- LOKADR,I_$STORE ABS ADDRESS OF ENTRY_^1_%STA- 1,Q_*STORE COMB. AND FILE NO. IN ENTRY_^1_%LDA (FILNUM)_^1_%STA- (ZERO),Q_^1*_]_^1T718_!LDA EOLFLG_'SET NOT END OF LINK INDICATION (BIT 4)_^1*_8IF SO_^1_%LDQ (RECBFR)_^1_%TCQ Q_,CHECK IF A SHORT READ_^1_%ADQ RECLGH_^1_%SQP T720_^1_%EOR- ONEBIT+2_$YES, SET B€ΠIT 2_^1*_]_^1T720_!LDQ- LOKADR,I_$CHECK IF FILE LOCKED_^1_%SQZ T730_^1_%EOR- ONEBIT+1_$YES, SET BIT 1_^1*_]_^1T730_!JMP RQEXIT_'EXIT_^1_%SPC 3_^1ADRLOK ADC LOKTBL_'LOCK FILE TABLE_^1_%SPC 2_^1_%END_]_^__ΠPFMDUMY CSY/ F24 P€1_%NAM FMDUMY_'DECK-ID F24 FILE MANAGER_)SUMMARY-110_^1*_$FILE MANAGER MASS RESIDENT DUMMY_^1*_$MASS STORAGE OPERATING SYSTEM VERSION 5.0_^1*_$SMALL SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1_%SPC 2_^1*_$THIS PROGRAM IS USED TO ALLOW THE SECTOR POINTER TO BE_^1*_$CORRECTLY SPECIFIED FOR THE FILE MANAGER REQUEST PROCESSORS_^1_%SPC 2_^1€_%BSS DUMMY(96)_^1_%END_]_^__PEDITOR CSY/ F25 P€1_%NAM EDITOR_'DECK-ID F25 FILE MANAGER_)SUMMARY-110_^1*_$TEXT EDITOR CALLING ROUTINE (MSOS ONLY)_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1*_]_^1***_"PURPOSE_^1*_$-------_^1*_$THIS CALLING ROUTINE IS USED TO CALL FILE EDITOR_^1*_]_^1****_]_^1*_$ENTRY POINTS_^1*_]_^1_%ENT EDITOR_^1*_]_^1*_]_^1EDITOR RTJ- ($F4)_(GETFILE MONITOR REQUEST_^1_%ADC $5A01_^1_%ADC 0_^1_%NUM 0_^1€z_%ADC $8C2_^1_%ADC 0_^1_%ADC EDITOR_^1_%ADC 0_^1_%ADC SNAME-*+7_^1_%ADC 0_^1_%ADC 0_^1*_]_^1BUSYCK LDA* EDITOR+3_^1_%SAZ 1_^1_%JMP* BUSYCK_^1_%LDA* EDITOR+4_$CHECK FOR READ ERRORS_^1_%SAP EDITST_'NO ERROR - START PROGRAM_^1_%JMP- ($EA)_(ERROR - EXIT_^1SNAME ALF 3,EDITFL_^1_%SPC 3_^1*_]_^1*_*START PROGRAM_^1_%EQU EDITST(*)_%START OF MAIN PROGRAM_^1_%END EDITOR_^__zPEDITFL CSY/ F26 P€1_%NAM EDITFL_'DECK-ID F26 FILE MANAGER_)SUMMARY-110_^1*_$GENERAL PURPOSE TEXT EDITOR_^1*_$SMALL COMPUTER SYSTEMS DIVISION, LA JOLLA, CALIFORNIA_^1*_$COPYRIGHT CONTROL DATA CORPORATION 1976_^1****_]_^1*_]_^1*_$PROGRAM_$- EDITOR_*GENERAL PURPOSE TEXT EDITOR_^1*_]_^1*S3_"PROG FUNCTION- THIS UTILITY ALLOWS A USER TO_^1*_4ENTER TEXT, EDIT IT, STORE AND RETRIEVE IT AS_^1*_4FILES UNDER€€ CONTROL OF THE CONTROL DATA FILE_^1*_$MANAGER_^1*_]_^1*S5_"PROG LOGIC_!- THE FOLLOWING OPERATIONS AND COMMANDS_^1*_4AVAILABLE WITH THIS UTILITY ..._^1*_]_^1*S3_]_^1*_51) XXXX ...... TEXT OR DATA ...... (CR)_^1*_6- ENTERS TEXT OR DATA AT LINE NUMBER XXXX_^1*_8WHERE: XXXX = LINE NUMBER FROM 1 TO 9999_^1*_?LEADING BLANKS OR ZEROES ARE OPTIONAL_^1*_@(CR) = CARRIAGE RETURN_^1*_5**€€***********************************************_^1*_5*************************************************_^1*_5S P E C I A L L I S T C O M M A N D S_^1*_5*************************************************_^1*_5*************************************************_^1_%SPC 2_^1*_8THE SPECIAL LIST COMMANDS ARE ENTERED AS ANY_^1*_9OTHER DATA WOULD, EITHER IN AUTO OR MANUAL_^1*_9MODE. ALL SP€€ECIAL COMMANDS MUST BE AS EXACTLY_^1*_9DESCRIBED BELOW._^1*_5*************************************************_^1*_5*************************************************_^1_%SPC 2_^1*_8.SNGL_#(SINGLE SPACE TEXT. THE EDITOR WILL_^1*_CDEFAULT TO SINGLE SPACING)_^1_%SPC 2_^1*_8.DOUB_#(DOUBLE SPACE TEXT. EDITOR WILL_^1*_CDOUBLE SPACE UNTIL THE '.SNGL'_^1*_CCOMMAND IS FOUND)_^1_%SPC 2_^1€€*_8.SPAC XX_!(SPACE DOWN 1-99 LINES)_^1_%SPC 2_^1*_8.PAGE_#(THIS CAUSES A TOP OF FORM)_^1_%EJT_]_^1*_]_^1*_52) XXXX(CR)_^1*_6- DELETES CONTENTS OF LINE NUMBER XXXX_^1*_8WHERE: XXXX AND (CR) AS ABOVE._^1*_]_^1*_53) LIST,LU,N1,N2,X(CR)_^1*_6- LISTS THE CONTENTS OF LINE NUMBER N1 UP TO AND_^1*_8INCLUDING N2. N1, N2 AND X ARE OPTIONAL. IF_^1*_8N2 IS OMITTED, LINE N1 ONLY IS LISTED. €€ IF_^1*_8BOTH N1 AND N2 ARE OMITTED, THE ENTIRE PROGRAM_^1*_8TEXT IS LISTED. IF N1 IS LARGER THAN THE_^1*_8LARGEST LINE NUMBER PREVIOUSLY ENTERED, THE_^1*_8LAST LINE ONLY IS LISTED. IF X IS NON-BLANK,_^1*_8LINE NUMBERS ARE NOT PRINTED IN THE LISTING._^1*_8LU IS THE LOGICAL UNIT TO LIST ON._^1*_:(DEFAULT LU IS COMMENT DEVICE IF NO LU IS_^1*_@SPECIFIED)_^1*_;NOTE: TRAILING COMMAS M€€AY BE OMITTED IF_^1*_ATRAILING FIELDS ARE OMITTED._^1*_]_^1*_]_^1*_55) CLEAR(CR)_^1*_6- PROGRAM TEXT BEING HELD IN TEXT EDITOR IS_^1*_8CLEARED AND EDITOR IS REINITIALIZED IN_^1*_8PREPARATION OF ENTRY OF NEW TEXT._^1*_]_^1_%EJT_]_^1*_]_^1*_56) AUTO,N(CR)_^1*_6- LINE NUMBERS ARE AUTOMATICALLY GENERATED FOR_^1*_8THE USER FOR INPUT OF TEXT. STARTING LINE_^1*_8NUMBER IS N IF NO PREVIOU€€S TEXT HAS BEEN_^1*_8ENTERED OR IS M+N, WHERE M IS THE LAST LINE_^1*_8NUMBER OF TEXT PREVIOUSLY ENTERED. THE LINE_^1*_8NUMBERS ARE INCREMENTED BY N. IF N IS OMITTED_^1*_8IT IS ASSUMED THAT N=10._^1*_;TO EXIT FROM AUTO MODE, ENTER A CARRIAGE_^1*_;RETURN INSTEAD OF TEXT._^1*_]_^1*_57) DELETE,N1,N2(CR)_^1*_6- DELETES PROGRAM TEXT FROM LINE NUMBERS N1 UP_^1*_8TO AND INCLUDING N2. IF€€ N2 IS OMITTED, ONLY_^1*_8LINE N1 IS DELETED._^1*_]_^1*_88) RESEQ,N1,N2(CR)_^1*_6- LINE NUMBERS ARE RESEQUENCED STARTING AT VALUE_^1*_;N1 AND INCREMENTING SUCCESSIVE LINES BY N2._^1*_;IF N1 OR N2 ARE OMITTED, THE VALUE IS_^1*_;ASSUMED TO BE 10. TRAILING COMMAS NEED NOT_^1*_;BE ENTERED._^1*_]_^1*_810 GET,AAAAAA,N(CR)_^1*_6- PREVIOUSLY ENTERED PROGRAM TEXT IS CLEARED_^1*_8AND TEXT FR€€OM USER FILE AAAAAA IS ENTERED._^1*_;WHERE: AAAAAA = UP TO 6 CHAR FILE NAME_^1*_;WHERE, N=SEQUENCE NUMBERING,LINE NUMBERS_^1*_AARE RESEQUENCED STARTING AT VALUE_^1*_AN AND INCREMENTING SUCCESSIVE LINES_^1*_ABY N. IF N IS OMITTED, IT IS ASSUMED_^1*_AN = 10_^1*_]_^1*_*11) SAVE,AAAAAA(CR)_^1*_*- STORES PROGRAM TEXT ENTERED, ON A FILE BELONG_^1*_-TO THIS USER._^1_%EJT_]_^1*_814) MERGE€€,AAAAAA,N(CR)_^1*_6- ADDS TEXT FROM FILE AAAAAA TO CURRENT PROGRAM_^1*_8TEXT._^1*_BN = LINE NUMBER AFTER WHICH TEXT IS_^1*_FTO BE INSERTED._^1*_BIF N IS OMITTED, TEXT IS ADDED TO_^1*_ETHE END OF THE ORIGINAL PROGRAM_^1*_ETEXT._^1*_BLINE NUMBERS OF ADDED TEXT ARE_^1*_BINCREASED BY BASE N. TRAILING LINES_^1*_BOF ORIGINAL PROGRAM TEXT ARE_^1*_BINCREASED BY BASE NN, WHERE NN IS_^1*_BT€€HE ADJUSTED VALUE OF THE LAST LINE_^1*_BOF ADDED TEXT._^1*_]_^1*_]_^1*_813) LOAD,LU,N(CR)_^1*_6- LOAD ASCII DATA FROM LU AND STORE IN EDITOR'S_^1*_8WORK-FILE. TERMINATES ON DEVICE I/O FAILURE._^1*_;LU = LOGICAL TO LOAD FROM_^1*_;N = SEQUENCE NUMBERING, DEFAULT TO 10_^1_%EJT_]_^1*_]_^1*_415) ALIGN,X(CR)_^1*_6- THE TEXT FIELD ARE JUSTIFIED ACCORDING TO_^1*_8WHETHER THIS IS AN ASSEMBL€€Y OR FORTRAN_^1*_8PROGRAM TEXT._^1*_;WHERE: IF X=A, THIS IS AN ASSEMBLY PROGRAM_^1*_BIF X=F, THIS IS A FORTRAN PROGRAM_^1*_BIF X IS OMITTED, IT IS ASSUMED X=F._^1*_;NOTE: WHEN ALIGNING FORTRAN TEXT, THE_^1*_BCHARACTER * IS USED TO DESIGNATE A_^1*_BCONTINUE LINE IF IT IS THE FIRST_^1*_BNON-BLANK CHARACTER IN THE LINE._^1*_BA COMMENT LINE IS DESIGNATED BY THE_^1*_BCHARACTER C IN THE€€ FIRST COLUMN_^1*_BAFTER THE LINE NUMBERS (CHAR PSN 5)._^1*_]_^1*_416) SEARCH,[AAA.....AAA],N1,N2(CR)_^1*_6- PROGRAM TEXT IS SEARCHED FOR THE CHARACTER_^1*_8STRING AAA.....AAA STARTING FROM LINE N1 UP_^1*_8TO AND INCLUDING LINE N2._^1*_8IF N2 IS OMITTED, THE SEARCH IS PERFORMED IN_^1*_;LINE N1 ONLY._^1*_8IF BOTH N1 AND N2 ARE OMITTED, THE ENTIRE_^1*_;PROGRAM TEXT IS SEARCHED._^1*_8€€NOTE: CHARACTER STRINGS CAN BE A MAXIMUM OF_^1*_<20 CHARACTERS LONG._^1*_8THE FIRST CHARACTER AFTER THE FIRST COMMA IS_^1*_8TREATED AS THE DELIMITER FOR THE STRING AND_^1*_;MAY BE ANY CHARACTER_^1*_]_^1*_417) CHANGE,[AAA.....AAA],[BBB.....BBB],N1,N2(CR)_^1*_6- EVERY OCCURANCE OF THE CHARACTER STRING_^1*_8AAA.....AAA IS REPLACED BY THE CHARACTER_^1*_8STRING BBB.....BBB IN LINES N1 U€€P TO AND_^1*_8INCLUDING N2._^1*_8IF N2 IS OMITTED, THE CHANGE IS PERFORMED IN_^1*_;LINE N1 ONLY._^1*_8IF BOTH N1 AND N2 ARE OMITTED, THE CHANGE IS_^1*_;PERFORMED THROUGHOUT THE ENTIRE PROGRAM TEX_^1*_8IF FIELD [BBB.....BBB] IS OMITTED, THE_^1*_;CHARACTER STRING AAA.....AAA IS REMOVED._^1*_8NOTE: THE PROGRAM LINE IS AUTOMATICALLY_^1*_