File: BLURB.04 of Tape: Various/Decus/decus-2
(Source file text)
INVENT-8 A SUMMARY INVENT-8 IS A SERIES OF GENERAL PURPOSE DATA MANIPULATION AND FILE HANDELING SUBROUTINES. SOME CREATE NEW FILES, AND SOME OPERATE ON ALREADY EXISTING FILES, ADDING AND DELETING INFORMATION. THEY ARE ALL DESIGNED TO OPERATE WITH FORTRAN AND ARE ALL CALLABLE FROM THE FORTRAN LEVEL. BELOW IS AN OVERVIEW OF THE ROUTINES, FOLLOWED BY A DETAILED DESCRIPTION OF THE CALLS AND THE POSSIBLE ERROR MESSAGES ISAM.RL ISAM.RL IS BY FAR THE MOST INTELEGENT AND MOST WIDLY USED OF THE SUBROUTINES INCLUDED HERE. IT OPERATES ONLY ON AN ALREADY EXISTING CORE IMMAGE FILES LOCATED ON 'SYS'. ISAM HAS THE ABILITY OF ADDING AND DELETING INDIVIDUAL RECORDS WITHIN A PRE-DEFINED FILE. IT WILL KEEP TRACK OF MOST OF THE EXTRA SPACE AS IT IS USED AND FREEDED. RECORDS MAY BE ADDED IN THE MIDDLE OF THE FILE,AT THE END, OR AT THE BEGINNING OF THE FILE. SIMIARLY, RECORDS MAY BE DELETED AT THE MIDDLE, THE END, OR THE BEGINNING. ISAM ALSO HAS THE ABILITY OF MODIFYING DATA IN ANY GIVEN RECORD AS WELL AS MOVING FORWARD OR BACKWARD WITHIN THE FILE. ROISAM.RL ROISAM WILL OPEN A FILE ON ANY FILE STRUCTURED OS/8 DEVICE. IT ONLY HAS THE CAPABILITY OF READING CORE IMMAGE DATA FROM THAT DEVICE. WOISAM.RL WOISAM WILL OPEN AN OUTPUT FILE ON ANY FILE STRUCTURED DEVICE SUPPORTED BY OS/8. IT ONLY HAS THE CAPABILITY OF WRITING CORE IMMAGE DATA ON THE DEVICE. DUMP.RL DUMP CAN READ AND WRITE DATA FROM 'SYS' ONLY AND HAS BEEN COMBINED WITH THE FORMATTING ROUTINE ('ZERO') ONLY TO CONSERVE CORE MEMORY. DUMP AND ISAM SHOULD ***NEVER*** BE USED IN THE SAME PROGRAM SINCE THEY BOTH USE THE SAME COMMON MEMORY LOCATIONS AS THE DATA STORAGE AREA. UNLESS THE PROGRAMMER SPECIFICALLY WANTS THE ROUTINE 'ZERO' INCLUDED, USE ISAM SINCE IT IS FAR, FAR MORE INTELEGENT. ISAM,ROISAM,WOISAM, AND DUMP ALL ONLY OPERATE ON CORE IMMAGE FILES!!! MULTI.RL MULTI IS THE MULTIPLE REEL DECTAPE ASCII FILE DRIVER. IT USES THE DEVICE INDEPENDEDT CHANNEL 4 READ AND WRITE COMMANDS,ONLY AFTER CALLS TO MULTI HAHE BEEN MADE TO PRESET THE DATA PATHS. MULTI IS USED WHENEVER LARGE AMMOUNTS OF DATA ARE BEING MINIPULATED. SORT THIS SORT PROGRAM WILL SORT IN ANY SPECIFIED SEQUENCE AN OUTPUT FILE CREATED BY WOISAM. WHEN IT HAS COMPLETED THE SORTING OPERATION, THE RESULT IS ACCEPTABLE TO EITHER ROISAM OR ISAM. THE SORT PROGRAM IS ACTUALLY A SORT GENERATOR IN THAT IT ASKS A SERIES OF QUESTIONS(WHAT IS THE SORTING SEQUENCE, HOW TO INTERPRETE THE DATA, ETC) AS WELL AS WETHER OR NOT TO CHAIN TO ANOTHER CORE IMMAGE PROGRAM. BELOW IS A DETAILED LAYOUT OF THE CORE IMMAGE FILE AS WELL AS THE SPECIFIC PARAMETERS ASSOCIATED WITH EACH. AS THE READER WILL NOTE, THERE IS A STRIKING SIMILARITY BETWEEN THE CALLS TO THE VARIOUS SUBROUTINES, AND A LIST FOLLOWS: OPERATION DESIRED ROUTINE USED ISAM ROISAM WOISAM DUMP MULTI MULTI INPUT OUTPUT OPEN FILE INITL GETOP PUTOP FOPN SPIOP SPOOP READ A RECORD GET GETX N/A GETF READ N/A WRITE A RECORD PUT N/A PUTX PUTF N/A WRITE BACKSPACE 1 RECORD BKSPC N/A N/A N/A N/A N/A DELETE 1 RECORD DELET N/A N/A N/A N/A N/A CLOSE THE FILE FINSH N/A PUTCL FCLOS N/A SPOCL ALTER A RECORD RWRTE N/A N/A N/A N/A N/A GO BACK TO THE BEGINNIND DO NOT UPSET THE INPUT STREAM IN ANY WAY RESET N/A N/A N/A N/A N/A FORMAT A PRE-DEFINED FILE N/A N/A N/A ZERO N/A N/A PASS TO ANOTHER REEL OF DECTAPE IF NECESSARY N/A N/A N/A N/A RDCHK WRTCHK THIS IS A DETAILED DESCRIPTION OF THE SOFTWARE SYSTEM INVENT-8 HARDWARE REQUIREMENTS: THIS SYSTEM WILL RUN ON ANY OS/8 CONFIGURATION. IT USES THE MONITOR FOR A WIDE VARIETY OF SERVICES SUCH AS OPENING, CLOSING FILES, AS WELL AS USING THE VARIOUS DEVICE HANDLERS. THE SYSTEM IS DESIGNED AROUND THE FORTRAN OPERATING SYSTEM, WITH ITS SUPPOUT OF THE TTY, HIGH SPEED PAPER TAPE, CARD READER/LINE PRINTER, AS WELL AS DEVICE INDEPENDENT I/O AT RUN TIME. THERE ARE A SERIES OF AVAILABLE SUBROUTINES WHICH ARE OUTLINED BELOW. THE GENERAL FILE STRUCTURE IS OUTLINED IN THIS SECTION. THE FILE IS A CHAINED, CORE IMMAGE FILE. WITHIN EACH BLOCK (A BLOCK IS 256 WORDS LONG, IDENTICAL TO A OS/8 BLOCK), THERE IS A FORDWARD POINTER POINTING TO THE NEXT LOGICAL BLOCK. THIS OFFERS THE ADVANTAGE THAT THE PHYSICAL BLOCKS NEED NOT BE IN THE CORRECT LOGICAL ORDER. RATHER, THE LAST WORD POINTS TO THE RELATIVE POSITION OF THE NEXT PHYSICAL RECORD. IN LIKE MANNER, THE FIRST WORD IN EACH RECORD POINTS TO THE RELATIVE ADDRESS OF THE BLOCK IN A REVERSE DIRECTION. THIS ALSO MEANS THAT IT IS EASILY POSSIBLE TO GO IN EITHER THE FORDWARD OR REVERSE DIRECTION. THE SUBROUTINES ARE FULLY CAPABLE OF DOING BOTH (ALTHOUGH THE FORDWARD DIRECTION IS CONSIDERABLY FASTER). THE DATA ITSELF PASSES THROUGH THE AREA RESERVED BY FORTRAN AS COMMON STORAGE. THIS STARTS AT 10200 AND WORKS UP FROM THERE. SINCE THE LARGEST RECORD LENGTH IN INVENT-8 IS 125 (DECIMAL) WORDS, ONLY ONE PAGE OF COMMON NEED BE USED KEEPING CORE REQUIREMENTS DOWN. IN DECIDING ON WHAT RECORD LEGNTH TO USE, TWO ITEMS SHOULD BE KEPT IN MIND: 1) THE FILE FORMATTER ROUTINE ('ZERO') ASSIGNS AN MULTIPLE NUMBER OF RECORDS PER BLOCK. TO KEEP WASTED SPACE TO A MINIMUN, USE A RECORD LENGTH AS NEAR A MULTIPLE OF 254 AS POSSIBLE, AS ANY EXTRA SPACE IN A BLOCK LESS THAN 254, BUT OVER THE MULTIPLE IS WASTED. FOR EXAMPLE, A RECORD LENGTH OF 20 (DECIMAL) WOULD CREATE 12 RECORDS PER BLOCK. WITH THE FWD AND REV POINTERS USING TWO WORDS, 242 OUT OF 256 WORDS WOULD BE USED (WASTING 14 WORDS PER BLOCK). USING A RECORD LENGTH OF 86 WOULD CREATE 2 BLOCKS PER RECORD, AND WASTE 82 WORDS IN EACH AND EVERY RECORD. 2) IF CARE IS USED IN THE DESIGN OF THE FILE, INFORMATION THAT IS COMMON TO MANY RECORDS NEED NOT BE STORED, THUS SAVING MANY COPIES OF THE SAME INFORMATION THE REST OF THE FILE ORGINIZATION, THEN, IS TO LEFT JUSTIFY THE RECORDS IN THE BLOCK. AS GETS AND PUTS (READ AND WRITE EQUIVILANTS) ARE MADE, THE ROUTINES WILL ACCESS THE MASTER FILE AND GET (OR PUT) THE DATA FROM 10200 TO 10200 + HOWEVER LONG THE RECORDS ARE (IE 10223 USING A RECORD LENGTH OF 20-DECIMAL). THE FORTRAN PROGRAM MAY EASILY ACCESS THESE LOCATIONS BY MERELY SPECIFYING THEM AS COMMOM. THE FORTRAN COMPILER WILL START WITH THE FIRST VARIABLE SPECIFIED AS COMMON, AND ASSIGN AN ADDRESS OF 10200 AND USE INCREASING ADDRESS FROM THERE USING ONE WORD FOR INTEGER VARIABLES, AND THREE WORDS FOR REAL (FLOATING POINT) VARIABLES. WITH THIS SCHEME, THERE IS NO REASON FOR THE USERS PROGRAM TO HAVE TO USE THE SABR FEATURE OF THE FORTRAN COMPILER. THE FIRST RECORD OF A FILE IS DEFINED SLIGHTLY DIFFERANTLY. THE FIRST WORD CONTAINS THE RELATIVE ADDRESS OF THE START OF THE CHAIN OF BLOCKS CONTAINING ANY DATA, THE SECOND WORD IN THE HEADER RECORD CONTAINS THE RELATIVE ADDRESS OF THE FIRST BLOCK IN THE FREE CHAIN ( THOSE BLOCKS THAT CONTAIN NO DATA AT ALL ). THE THIRD WORD CONTAINS THE NUMBER OF WORDS IN EACH RECORD, AND THE FOURTH WORD CONTAINS THE NUMBER OF RECORDS IN A BLOCK. AS A FILE IS OPENED, THE FILE DRIVER WILL EXTRACT THIS INFORMATION FROM THE HEADER, AND THAN PASS TO THE FIRST DATA BLOCK. THE ASSUMPTION THROUGHOUT THIS SYSTEM IS THAT AN INTEGER 999 IN THE FIRST POSITION OF THE LAST RECORD WILL INDICATE AN END OF FILE, AND AS CALLS TO GET (SEE BELOW) ARE MADE, THE FIRST ACTION MADE SHOULD BE TO CHECK FOR A 999. IF IT IS FOUND, AN END OF FILE MAY BE ASSUMED. THESE ARE ALSO PLACED IN THE FIRST RECORD BY THE FORMATTER ('ZERO'), SO THAT A FILE OF CORRECT FORMAT WOULD BE CREATED. A TYPICAL FILE LAYOUT (WITH 10 BLOCKS) MIGHT BE AS FOLLOWS: ABS REL LOGICAL RECORD NO. BLOCK BLOCK REV. CONTAINED WITHIN FWD NO NO POINTER THIS BLOCK POINTER ----- ----- ------- ------------------ ------- 350 O SPECIAL:STARTING BLOCK NO,FIRST FREE BLOCK NO, NO WDS PER RECORD,NO RECS PER BLK 351 1 0 (1) 1,2,3,4,5 4 352 2 4 12,13 7 353 3 0 (3) 5 354 4 1 6,7,8,9,10,11 2 355 5 3 6 356 6 5 10 357 7 2 14,15,16,17 0 (2) 360 10 6 0 (4) NOTES: (1) BEGINNING OF DATA STRING (2) END OF DATA STRING (3) BEGINNING OF FREE (EMPTY) STRING (4) END OF FREE STRING NOTE THAT THE FILE CHAINS FROM RELATIVE BLOCK NUMBER 1 TO RELATIVE BLOCK NO. 4 TO BLOCK NO. 2 TO BLOCK NO. 7. BLOCK NO 7 IS THE LAST BLOCK IN THE DATA STRING. THE FREE STRING STARTS AT RELATIVE BLOCK NO. 3 AND ENDS AT 10. READING THESE INVENT FILES PAST (IN THIS CASE) RECORD NO 17 WOULD CAUSE AN UNEXPECTED EOF ERROR MESSAGE (SEE ERROR LISTING BELOW). WITH THIS IN MIND, AN OUTLINE FOR THE SUBROUTINES FOLLOWS. ISAM.RL THIS SECTION COVERES THE CALLING SEQUENCE TO ISAM.RL AND THE ACTIONS THE DRIVER WILL TAKE. THIS IS THE MASTER DRIVER FOR GENERAL INPUT/OUTPUT ROUTINES AND OPERATE AS OUTLINED BELOW. THE ISAM DRIVER WILL ASSUME A DEVICE NAME OF SYS. THIS IS REQUIRED BECAUSE IT USES THE PERMINATELY RESIDENT DEVICE DRIVER, THUS ALLOWING FREE USE OF DEVICE INDEPENDENT I/O AVAILABLE IN FORTRAN. THE ONLY RESTRICTION IS THAT THE CALL TO INITL MUST *****MUST***** BE MADE PRIOR TO ANY USE OF INPUT CHANNEL 4!!!!!!!!!!!!!! THE ISAM DRIVER WILL KEEP ALL BLOCKS CURRENT AS DATA IS PROCESSED EXCEPT THE HEADER BLOCK WHICH CONTAINS ALL STARTING AND ENDING INFORMATION. IN ORDER TO PROTECT THE INTEGRETY OF THE FILE ON A CRASH OR UPON TYPING A CONTROL C, A TRAP HAS BEEN PLACED IN LOCATION 07600(THE ENTRY TO THE MONITOR). THIS CAUSES TWO PROBLEMS 1) IF THE SYSTEM IS MANUALLY RESTARTED, LOCATION 07600 MUST BE RESET TO 4207. IF A ^C IS TYPED, THE ISAM DRIVER WILL DO IT ITSELF 2) IF ODT IS USED,THE TWO LOCATIONS THAT PUT A JMP 0165 IN 07600 MUST BE NOP'ED SINCE ODT USES 07600 FOR SWAPPING. THESE TWO CELLS ARE AT INITL+101, AND INITL+102 (A 1312 AND 3722 RESPECTIVLY) WITH THIS IN MIND, THE FOLLOWING IS THE CALL SEQUENCE TO THE EIGHT ENTRIES. INITL('FILNAM') THIS CALL ASSUMES A SINGLE ARGUMENT 'FILMAN' WITH A .DA ASSUMED EXTENSION. THE FILE NAME SHOULD BE ONE TO SIX CHARACTERS WITH THE FIRST BEING AN ALPHA. SHOULD THE NAME BE LESS THAN THE SIX CHARACTERS, LEAVE BLANKS WITHIN THE SIX CHARACTER QUOTATION MARK. IT WILL PRESET ALL THE GOOD AND NICE VARIABLES IN THE DRIVER FOR FUTURE ACCESS. IT USES THE SUBROUTINE IOPEN, DOES A FILE LOOKUP, EXTRACTS THE VARIABLES IT NEEDS, AND THEN DISCARDS THE REST OF THE INFORMATION. AT THIS POINT, ALL DEVICE INDEPENDENT I/O HAS NO RESTRICTIONS SINCE ONCE OPENED, THE ISAM FILE IS COMPLETELY SELF CONTAINED (HENCE THE REQUIREMENT SYS: ONLY). GET GET HAS NO ARGS AND WILL GET THE NEXT LOGICAL RECORD IN THE FILE. IT WILL AUTOMATICLY PASS FORWARD IN THE FILE AS REQUIRED. IT WILL PLACE THE INFORMATION IN COMMON STORAGE (I.E. IN 10200 AND UP). PUT PUT ALSO HAS NO ARGUMENTS AND WILL PLACE THE DATA FROM COMMON STORAGE(SEE ABOVE) DIRECTLY AFTER THE RECORD THAT WAS READ. IT WILL CREATE NEW BLOCKS AS IT REQUIRES THEM SO THAT THE PHYSICAL SEQUENCE OF THE BLOCKS IS COMPLETELY TRANSPARENT TO THE USER AND HIS PROGRAM. AT THE CONCLUSION OF A CALL TO PUT, THE FILE WILL BE ONE RECORD LONGER. PUT,IF IT NEEDS THE ROOM, WILL STEAL THE FIRST BLOCK FROM THE FREE STRING, AND PLACE IT IN THE MIDDLE OF THE CHAINED DATA STRING, UPDATING THE POINTERS AS IT DOES IT BKSPC BACKSPACE HAS NO ARGS AND WILL MOVE THE FILE ONE LOGICAL RECORD BACKWARDS. SHOULD THE BEGINNING OF THE FILE BE ENCOUNTERED, THE ROUTINE WILL GET THE FIRST LOGICAL RECORD. DELET DELETE WILL DO JUST THAT - DELETE THE RECORD THAT WAS JUST READ. IT WILL THEN GET THE NEXT LOGICAL RECORD. IT, ALSO, HAS NO ARGUMENTS. IT WILL ALSO CHECK FOR BLOCKS THAT ARE MADE EMPTY PLACING THEM ON THE FREE STRING IF THEY ARE. HENCE, THE FREE STRING IS A VERY DYNAMIC LIST, OPERATING IN A LAST IN FIRST OUT MODE. FINSH FINISH WILL CLOSE THE FILE TO ALL ADDITIONAL I/O. IT WILL UPDATE THE HEADER RECORD CONTAINING THE START AND FREE LIST RECORD LOCATION. IT ALSO CLEARS THE TRAP TO THE CRASH ROUTINE, SO THAT ALL FUTURE CALLS TO THE MONITOR WILL BE HANDLED PROPERLY. RWRTE REWRITE WILL REPLACE THE RECORD THAT WAS JUST READ WITH THE INFORMATION OBTAINED IN THE COMMON STORAGE AREA. NO RECORDS ARE ADDED OR DELETED. REWRITE IS EQUIVILENT TO A CALL TO DELET, FOLLOWED BY A CALL TO BKSPC, AND A CALL TO PUT EXCEPT THAT IT IS MUCH FASTER SINCE ALL BOOKEEPING NEED NOT BE TESTED. AFTER A CALL TO RWRTE, THE FILE WILL HAVE THE SAME LEGNTH AS BEFORE THE CALL. RESET RESET WILL TAKE THE FILE BACK TO THE BEGINNING,RESET THE VARIOUS PARAMETERS, AND THEN GET THE FIRST LOGICAL RECORD. IT IS EQUIVILENT TO A CALL TO FINSH, FOLLOWED TO A CALL TO INITL EXCEPT THAT IT IS MUCH FASTER, AND THAT IT DOES NOT UPSET DEVICE INDEPENDENT INPUT (CHANNEL 4). ISAM.RL ERROR MESSAGES ISM1 ERROR AT LOC XXXXX THE ADDRESS IS CALL TO GET. AN UNEXPECTED END OF FILE WAS ENCOUNTERED. THE ERROR IS FATAL, BUT THE FILE IS IN TACT ISM2 ERROR AT LOC XXXXX THE ADDRESS IS A CALL TO INITL. AN ATTEMPT TO OPEN TWO FILES HAS BEEN MADE, OR THERE HAS BEEN NO CALL TO INITL PRIOR TO A CALL TO GET,PUT, ETC. THE ERROR IS FATAL,BUT THE FILE IS IN TACT. ISM3 ERROR AT LOC XXXXX THE ADDRESS IS OF A CALL TO PUT. AN ATTEMPT TO PUT DATA ON THE FILE HAS BEEN MADE WHEN THERE IS NO ROOM LEFT. THE CALL IS CANCELED. THE ERROR IS FATAL, BUT THE FILE IS IN TACT. ISM4 ERROR AT LOC XXXXX THE ADDRESS IS FROM THE INTERNAL CALL. THIS COVERS A WIDE VARIETY IF ERRORS, INCLUDING: 1. BAD LINKAGE (FORDWARD AND REVERSE POINTERS WITHIN TWO BLOCKS DON'T MATCH). 2. AN ATTEMPT TO READ OR WRITE A BLOCK OUTSIDE THE FILE BOUNDRIES WAS MADE. 3. THERE WAS A MASS STORAGE I/O ERROR (FROM SYS: ). 4. THERE WAS A NON ZERO REVERSE POINTER ON THE FIRST BLOCK OF THE FREE CHAIN. 5. THERE WAS A BAD LINKAGE IN THE FREE CHAIN. THE ERROR IS FATAL, BUT THE HEADER RECORD HAS NOT********** BEEN REWRITTEN. THE ACTUAL ADDRESS IS AS FOLLOWS: 1) XXXXX=YYY10 - POINTERS DONT MATCH. A CALL TO GET 2) XXXXX=YYY37 - POINTERS DONT MATCH. A CALL TO BKSPC OR RWRTE. 3) XXXXX=YYY30 - THE BLOCK TO BE READ OR WRITTED WAS BELOW THE AREA OF THE FILE OPENED. 4) XXXXX=YYY35 - THE BLOCK TO BE READ OR WRITTEN WAS ABOVE THE AREA OF THE FILE OPENED. 5) XXXXX=YYY47 - THE OS/8 DEVICE HANDLER RETURNED AN ERROR. 6) XXXXX=YYZ22 - THE FILE HAD A NON-ZERO POINTER IN THE FIRST BLOCK OF THE FREE STRING. 7) XXXXX=YYW22 - THE FREE LIST HAD BAD POINTERS. 8) XXXXX=YYY41 - THERE WERE BAD LINKAGES IN THE FILE ON A CALL TO PUT. 9) XXXXX=YYY57 - BAD LINKAGES ON A CALL TO DELET. 10) XXXXX=YYY14 - BAD LINKAGES ON A CALL TO DELET. 11) XXXXX=YYY32 - DITTO 12) XXXXX=YYY07 - BAD LINKAGES ON A CALL TO RWRTE. WHERE YYY IN MEANINGLESS DUE TO THE RELOCATIBILITY OF THE LIBRARY (THE USER HAS NO CONTROL OVER WHERE THE ACTUAL LOADING WILL OCCUR), AND WHERE Z IS AN ODD NUMBER AND W IS AN EVEN NUMBER). ALSO----- SINCE ISAM USES IOPEN, THERE IS THE POSIBILITY OF "IOER ERROR AT LOC XXXXX". THIS USUALLY MEANS THAT THE FILE WAS NOT FOUND OR NO /I SWITCH WAS SPECIFIED AT LOADER TIME. DUMP.RL THIS SECTION COVERS THE CALLING SEQUENCE TO DUMP.RL, AND THE ACTIONS THE ROUTINE WILL TAKE THIS IS THE DUMPING AND RELOADING ROUTINE AND HANDLES THE GETS AND PUTS IN A DIFFERENT MANER THAN ISAM.RL FOPN(FILNAM) THIS ROUTINE WILL OPEN A FILE ON THE SYSTEMS DEVICE IN THE SAME MANNER AS THE INITL(FILMAN) OUTLINED ABOVE. IT, ALSO, HAS THE SAME RESTRICTIONS, NAMELY THAT IT MUST BE CALLED BEFORE ANY OTHER USE OF DEVICE INDEPENDENT INPUT (CHANNEL 4). GETF THIS ROUTINE ACTS IDENTICALLY TO GET OUTLINED IN ISAM. IT IS INCLUDED IN THIS SERIES OF SUBROUTINES FOR THE SAKE OF CONSERVING CORE. PUTF THIS ROUTINE WILL PLACE DATA DIRECTLY AFTER THE DATA JUST READ. IT DIFFERS FROM PUT IN THAT IT WILL HOLD ANY SWAPPED OUT DATA IN CORE, RATHER THAN REWRITING THE DATA BACK ON THE SYSTEMS DEVICE. THIS OFFERS THE DISTINCT ADVANTAGE IN THAT THE DATA WILL END UP NOT ONLY IN CORRECT LOGICAL SEQUENCE, BUT ALSO IN CORRECT PHYSICAL SEQUENCE. SINCE IT DOES HOLD THE DATA IN CORE RATHER THAN ON THE MASS STORAGE DEVICE, PUTF CALLS MUST ***MUST*** BE MADE ONE AFTER ANOTHER. A CALL TO GETF AFTER A CALL TO PUTF WILL YIELD STRANGE RESULTS INDEED!!!. IF IT IS NECESSARY TO CALL GETF AFTER PUTF, CALL FCLOS, THEN FOPN FIRST. FCLOS FCLOSE WILL CLOSE THE FILE TO ALL ADDITIONAL I/O. IT WILL CHECK TO SEE IF ANY INFORMAION HAS BEEN HELD IN CORE, WRITING IT OUT ON THE FILE IF THERE IS A POSITINE ANSWER. IT WILL THEN UPDATE THE HEADER RECORD AND RETURN TO THE CALLING PROGRAM. ZERO('FILNAM',FILENGTH) A CALL TO ZERO WILL COMPLETLY ZERO AND FORMAT THE FILE SPECIFIED TO THE FILE LENGTH SPECIFIED. CARE MUST BE USED WITH THIS SUBROUTINE SINCE THERE ARE NO QUESTIONS ASKED AS TO WETHER OR NOT THAT IS WHAT YOU REALLY WANTED TO DO. NO DATA IS TRANSMITTED OR RECIEVED. THIS ROUTINE WILL ALSO PLACE INTEGER 999'S (OR OCTAL 1747'S) IN THE LAST HALF OF THE FIRST BLOCK. THIS IS REQUIRED SO THAT THE USERS PROGRAM MAY DETECT AN END OF FILE BY MERELY TESTING AN INTEGER VARIABLE FOR DECIMAL 999 (ASSUMING THAT FIELD IS NEVER 999 EXCEPT FOR AN EOF). DUMP.RL ERROR MESSAGES ZRO1 ERROR AT LOC XXXXX THE ADDRESS SPECIFIED IS THE CALL TO ZERO. THE PROGRAM ATTEMPTED TO FORMAT A FILE OF LENGTH 0, A NEGATIVE LENGTH, OR A LENGTH OF GREATER THAN 125 (DECIMAL). THE ERROR IS FATAL, BUT THE FILE HAS NOT BEEN ALTERED. ZRO5 ERROR AT LOC XXXXX THE ADDRESS SPECIFIED IS MEANINGLESS. AN ATTEMPT TO PUTF DATA WITH A FILE THAT IS FULL WAS ATTEMPTED. THE FILE IS INTACT, BUT THE CALL IS CANCELED. THE ERROR IS FATAL. ZRO6 ERROR AT LOC XXXXX THE ADDRESS SPECIFIED IS THE CALL TO PUTF AN ATTEMPT TO ENTER DATA IN THE MIDDLE OF THE FILE FILE, OR AN ATTEMPT TO TO SWAP DATA TWICE INTO THE BUFFER AREA HAS BEEN MADE. THE ERROR IS FATAL, BUT THE FILE IS IN TACT. ZRO7 ERROR AT LOC XXXXX THIS CAN BE ANY ONE OF VARIOUS ERRORS SUCH AS 1. BAD LINKAGES (POINTERS) 2. AN ATTEMPT TO READ OR WRITE A BLOCK THAT IS OUTSIDE THE FILE BOUNDRIES. 3. AN I/O ERROR FROM THE SYS: DEVICE HANDLER 4. A NON ZERO REVERSE POINTER ON THE FIRST BLOCK ON THE FREE CHAIN. THE ADDRESS SPECIFIED IS THAT OF THE INTERNAL CALL. NOTE:****** THE HEADER RECORD HAS NOT BEEN RESTORED!!!!!!!!!! ZRO8 ERROR AT LOC XXXXX THE ADDRESS IS THAT OF THE CALL TO GETF. AN UNEXPECTED END OF FILE HAS BEEN ENCOUNTERED. THE ERROR IS FATAL, BUT THE FILE IS IN TACT. ZRO9 ERROR AT LOC XXXXX THE ADDRESS IS THAT OF FOPN. AN ATTEMPT TO GETF OR PUTF HAS BEEN MADE WITH NO PRIOR CALL TO FOPN. THE ERROR IS FATAL, BUT THE FILE IS IN TACT. THE ACTUAL ADDRESS OF ZRO7 IS AS FOLLOWS: 1) XXXXX=YYY47 - BAD LINKAGES FROM A CALL TO GETF 2) XXXXX=YYY73 - BLOCK NUMBER IS TOO SMALL(AS IN ISM4#3 ABOVE). 3) XXXXX=YYY00 - BLOCK NUMBER IS TOO LARGE (AS IN ISM4#4 ABOVE 4) XXXXX=YYY12 - THE OS/8 DEVICE HANDLER RETURNED AN ERROR. 5) XXXXX=YYY07 - A CALL TO PUTF WITH NO ROOM LEFT WAS MADE (THE ERROR ZRO5 FAILED TO CATCH THE CONDITION EARLIER). 6) XXXXX=YYY21 - A NON ZERO REVERSE POINTER WAS FOUND IN THE FIRST BLOCK IN THE FREE STRING. 7) XXXXX=YYY37 - A CALL TO PUTF WAS MADE WHEN THE USER WAS NOT AT THE END OF THE VALID DATA. 8) XXXXX=YYY51 - THERE WERE BAD LINKAGES IN THE FREE STRING. WHERE YYY IS MEANINGLESS. NOTE: DUMP.RL ALSO USES IOPEN AND HENCE MAY PRODUCE "IOER ERROR AT LOC XXXXX". SEE ISAM FOR THE PROBABLE REASONS. MULTI.RL THIS SECTION COVERS THE CALLING SEQUENCE TO MULTI.RL, AND THE ACTIONS THE ROUTINE WILL TAKE THIS IS THE MULTI-REEL DECTAPE DRIVER, AND IS USED WHEN LARGE DATA FILES ARE REQUIRED. SPOOP(FILNAM) THIS SUBROUTINE WILL OPEN A FILE(ASCII) ON DECTAPE #1 WITH THE NAME OBTAINED FROM THE CALLING PROGRAM. IT WILL REJECT THE REEL IF THERE ARE LESS THAN 650 (DECIMAL) BLOCKS AVALIBLE. IT WILL TYPE OUT "REEL NOT EMPTY-PLEASE RELOAD". IT WILL THEN TRY TO OPEN IT AGAIN WITH THE SAME NAME AND CHECK AGAIN. THIS FEATURE MAY BE OVERIDEN BY NOT TYPING A CR, BUT RATHER BY TYPING A "A" AND THEN TYPING A CR (THE A FOR ACCEPT). THE ROUTINE WILL THEN ACCEPT THE REEL EVEN THOUGH IT IS NOT EMPTY. WRTCHK WRITECHECK IS CALLED AFTER EACH AND EVERY WRITE (4,X) STATEMENT. THE ROUTINE WILL CHECK THE AVAILABLE SPACE ON THE REEL CURRENTLY IN USE. IF THERE ARE LESS THAN 2 BLOCKS REMAINING, IT WILL CLOSE THE CURRENT REEL,OPEN ANOTHER FILE ON DECTAPE 2 WITH A NAME THE SAME AS THE FIRST EXCEPT THAT AN ARITHMETIC 1 WILL BE ADDED TO THE SIXTH CHARACTER. FOR EXAMPLE, IF THE FIRST NANE WAS "AAAAA1", THE SECOND NAME WILL BE "AAAAA2". HENCE IT WORKS ONLY IF THE NAME IS FIVE ALPHA CHARACTERS AND ONE DIGIT FOR A TOTAL LENGTH OF SIX CHARACTERS. THE OUTPUT FILE WILL THEN ALTERNATE BETWEEN DECTAPE 1 AND DECPAPE 2 WITH INCREASING NAMES (IE "AAAAA3", "AAAAA4" ETC.) WHEN CLOSING AN INTERMEDIATE REEL OF TAPE, THE ROUTINE WILL ALSO ADD TWO RECORDS. THE FIRST RECORD IS "999" (THREE CHARACTERS - THREE 9'S ). THE SECOND RECORD WILL CONTAIN A "MORE", INDICATING TO THE INPUT ROUTINES (AND ANY HUMAN READER) THAT THERE IS MORE TO THE FILE. SPOCL THIS ROUTINE WILL CLOSE THE OUTPUT FILE TO ADDITIONAL DATA. IT WILL ALSO RESET THE FIRST OUTPUT DEVICE TO DTA1 (AS REQUIRED IN SPOOP ABOVE), AS WELL AS ADDING TWO RECORDS TO THE END OF THE CURRENT FILE ( A "999" AS ABOVE, BUT ALSO A "END ") TO INDICATE TO THE INPUT ROUTINES THAT "THATS ALL FOLKS" (AN EOF) SPIOP(FILNAM) SPECIAL INPUT OPEN WILL OPEN A FILE ON DECTAPE 5 WITH A NAME PROVIDED BY THE CALLING PROGRAM. THE USER MAY THEN USE THE READ (4,X) STATEMENTS AS REQUIRED. RDCHK(SWTCH) READ CHECK WILL EXAMINE THE NEXT RECORD IN THE INPUT STREAM FOR A "MO" OR NOT. THEREFORE IT IS UP TO THE USER IN HIS READ STATEMENTS TO CHECK FOR A "999" IN THE FIRST THREE COLUMNS OF DATA READ. IF HE FINDS THEM, HE SHOULD CALL RDCHK. RDCHK WILL THEN LOOK AT THE NEXT RECORD ( AS MENTIONED ABOVE ) FOR A "MO". IF IT FINDS THEM, IT WILL AUTOMATICLY OPEN A NEW FILE ON DECTAPE 6 WITH THE SAME INCREMENTING SEQUENCE AS WRTCH ABOVE (IE "AAAAA1", "AAAAA2", "AAAAA3", ETC.) ALTERNATING BETWEEN DTA5 AND DTA6. AT THE SAME TIME IT WILL RETURN AN ARGUMENT SWITCH TO INDICATE WETHER OR NOT A TRUE END OF FILE WAS ENCOUNTERED ( SW=0 MEANS "MO" WAS NOT FOUND, AND SW=1 MEANS "MO" WAS FOUND). IT IS UP TO THE USER TO ACT ACCORDINGLY.THEREFORE, THE INPUT STREAM WILL ALTERNATE BETWEEN DTA5 AND DTA6, EVEN THOUGH THE ACTUAL DEVICE SWAPPING IS INVISABLE TO THE PROGRAM. THERE ARE NO ERROR MESSAGES ASSOCIATED WITH MULTI.RL, ALTHOUGH "IOER AT LOC XXXXX" MAY BE PRODUCED BY MULTI'S CALLS TO IOPEN, OOPEN, AND OCLOS. ROISAM.RL ROISAM.RL HAS TWO ENTRIES AND DIFFERS FROM THE PREVIOUS SUBROUTINES IN THAT IT WILL OPERATE FROM ANY MASS STORAGE DEVICE SUPPORTED BY THE OS/8 SYSTEM (THIS IS ALSO THE CASE WITH WOISAM. THERE IS, HOWEVER, ONE RESTRICTION ON THIS FILE DRIVER: IF DEVICE INDIPENDENT INPUT IS USED, THE DEVICE SPECIFIED MUST ***MUST*** HAVE A CORESIDENT HANDLER. THEREFORE THIS IS AIMED AT DECTAPE AND MULTIPLE RK8 DRIVES. FOR EXAMPLE, ON A DISK BASED SYSTEM, ALL DECTAPE DRIVES HAVE CORESIDENT HANDLERS (EXCEPT THE TD8E ACCUMULATOR DECTAPE). ON AN RK8 SYSTEM, DRIVES 2,3,AND 4 HAVE CORESIDENT DRIVERS. ON A TC08 BASED SYSTEM,DECTAPE DRIVES 1-7 HAVE CORESIDENT HANDLERS. WITH THIS IN MIND,THE CALLING SEQUENCE TO ROISAM,AND WOISAM FOLLOW GETOP('DEV','FILNAM') THIS WILL OPEN AN READ ONLY ISAM FILE ON THE DEVICE SPECIFIED. IT USES 'IOPEN', EXTRACTS THE INFORMATION IT NEEDS, AND THEN THE ONLY RESTRICTION OF INPUT DEVICE CODE 4 IS THAT ANY OTHER OPENED INPUT FILES MUST ***MUST*** USE THE SAME OS/8 DEVICE HANDLER. GETX GETX WILL GET THE NEXT LOGICAL RECORD FROM THE INPUT STREAM. IT OPERATES IN THE EXACT SAME WAY AS GET EXCEPT THAT IT WILL PLACE THE DATA IN 10400 ON UP (COMMON, BUT OUT OF THE WAY OF THE AREA USED BY GET AND PUT OF ISAM.RL. IF ISAM AND ROISAM (AND OR WOISAM) ARE USED IN THE SAME PROGRAM SPACE MAY BE RESERVED BY THE FOLLOWING CODING COMMON I1,I2,I3,IDUM,J1,J2,J3 DIMENSION IDUM(125) ROISAM.RL ERROR MESSAGES GETX ERROR AT LOC XXXXX THIS IS THE ONLY ERROR MESSAGE GIVEN BY ROISAM. THE MEANING DEPENDS ON XXXXX 1) XXXXX=YYY36 MEANS THAT AN UNEXPECTED EOF WAS ENCOUNTERED 2) XXXXX=YYY66 MEANS THAT THE FILE WAS NEVER OPENED 3) XXXXX=YYY74 MEANS THAT THERE WAS AN ERROR IN THE OS/8 DEVICE HANDLER RETURN 4) XXXXX=YYY44 MEANS THAT THE POINTERS DIDN'T MATCH WHERE XXXXX IS THE ADDRESS PRODUCED BY RUN TIME FORTRAN, AND YYY IS MEANINGLESS DUE TO THE RELOCATIBILITY OF THE LOADER (I.E THE USER HAS NO CONTROL OVER WHERE THE SPECIFIC ROUTINE WILL BE LOADED). WOISAM.RL THE SAME RESTRICTIONS THAT APPLY FOR READ ONLY ISAM ALSO APPLY FOR WRITE ONLY ISAM (WOISAM.RL). ONCE OPENED, THERE IS NO PROBLEM WITH OUTPUT CHANNEL 4 EXCEPT THAT THE THE OS/8 DRIVERS MUST BE CORESIDENT. *************** NOTE: OS/8 WILL ACCEPT ONE AND ONLY ONE ACTIVE TENTATIVE FILE (OPENED BUT NOT YET CLOSED) PER DEVICE AND INVENT MUST ADHERE TO THIS SYSTEM PARAMETER. *************** WITH THIS IN MIND, THE CALLING SEQUENCE TO WOISAM FOLLOWS: PUTOP('DEV','FILNAM',FILENGTH) PUTOP WILL OPEN A TENTATIVE OUTPUT FILE ON THE DEVICE SPECIFIED, WITH THE NAME SPECIFIED, AND WITH THE LENGTH SPECIFIED (REMEMBER THAT THE LENGTH MUST BE GREATER THAN 0 AND LESS THAN 126 DECIMAL). NOTE ALSO THAT THE LENGTH IS NOT IN QUOTES. PUTX PUTX WILL TAKE THE DATA FROM 10400 ON UP AND WRITE IT ON THE OUTPUT DEVICE. PUTCL PUTCL WILL CLOSE THE FILE AFTER WRITING A SERIES OF EOF'S (999'S). WOISAM.RL ERROR MESSAGES PUTX ERROR AT LOC XXXXX. THIS IS THE ONLY ERROR MESSAGE GIVEN BY WOISAM. THE MEANING DEPENDS ON XXXXX. 1) XXXXX=YYY74 MEANS THAT THE FILE WOULD NOT CLOSE PROPERLY. A WRONG DEVICE (OOPEN CALLED ON A NON CORESIDENT DEVICE) OR OTHER PROBLEM. 2) XXXXX=YYY51 MEANS THAT THE /O SWITCH AT LOADER TIME WAS NOT SPECIFIED. 3) XXXXX=YYY16 MEANS THAT THE FILE RECORD LEGNTH WAS TOO SMALL OR 0. 4) XXXXX=YYY21 MEANS THAT THE FILE RECORD LENGTH WAS TOO LARGE. 5) XXXXX=YYY65 MEANS THAT THERE WAS NOT ENOUGH ROOM ON THE MASS STORAGE DEVICE SPECIFIED IN PUTOP. 6) XXXXX=YYY44 MEANS THAT THERE WAS A HIGH SPEED I/O ERROR (OS/8 DEVICE HANDLER RETURNED AN ERROR). 7) XXXXX=YYY36 MEANS THAT THE FILE WAS NEVER OPENED. ROISAM AND WOISAM BOTH USE THE FORTRAN LIBRARY SUBROUTINE IOPEN AND HENCE MAY PRODUCE "IOER ERROR AT LOC XXXXX". SEE THE OS/8 USERS MANUAL FOR THE PROPER EXPLINATION. GTDATE.RL TWO OTHER ROUTINES HAVE BEEN ADDED TO THE LIBRARY FOR THE SAKE OF SIMPLICITY:GTDATE AND NCOMP. THE CALLING SEQUENCE IS AS FOLLOWS: GTDATE: GDATE(IM,ID,IY) THIS ROUTINE WILL GET THE DATE FROM MONITOR AND RETURN IT IN THE FORM OF THREE INTEGER VARIABLES, IM, ID, AND IY FOR MONTH (0<IM<13), DAY (0<ID<32), AND YEAR (69<IY<79). THIS IS THE SAME FORMAT THAT THE DATE IS KEPT IN THE MONITOR EXCEPT THAT THE YEAR IN MONITOR IS BETWEEN 0 AND 7. IF THE DATE HAS NOT BEEN SET SINCE BOOTSTRAPPING THE SYSTEM, THE ROUTINE WILL TYPE "ENTER DATE AND RESTART", AND EXIT TO THE MONITOR RATHER THAN RETURN TO THE CALLING PROGRAM. CKTST(INTGR) OFTEN IT IS USEFUL TO TEST FOR AN ALPHA Y (FOR YES) N (FOR NO) AND O (FOR OMIT). THIS CALL WILL DO JUST THAT, AND RETURN INTGR =0 FOR A YES; +1 FOR A NO; AND =-1 FOR AN OMIT. NOTE THAT THE TEST CHARACTER SHOULD HAVE BEEN READ UNDER AN A1 FORMAT. IF THE ROUTINE DOES NOT FIND ONE OF THE THREE, IT WILL TYPE "Y,N, OR O ONLY" AND WAIT FOR ANOTHER ALPHA. IT WILL THEN CHECK AGAIN. GTDATE.RL ERROR MESSAGES THERE ARE NO ERROR MESSAGES ASSOCIATED WITH GTDATE.RL NCOMP: NCOMP(A1,A2,A3,A4,A5) THIS ROUTINE WILL COMPARE TWO ALPHANUMERIC FIELDS, AND RETURN A -1 FOR A1<A4; 0 FOR A1=A4; AND +1 FOR A1>A4. IT, THEREFORE IS A FUNCTION AND IS USED: IF (NCOMP(X1,1,5,Y1,4) 10,20,30 10 ACTION TO BE TAKEN IF X1 COLATES ABOVE Y1 20 ACTION TO BE TAKEN IF X1 AND Y1 COLATE EQUAL 30 ACTION TO BE TAKEN IF X1 COLATES BELOW Y1 AND WHERE THE 1 MEANS THAT THE FIRST ELEMENT OF THE SUBSCRIPTED REAL VARIABLE OF X1 IS TO BE USED FIRST, AND THE SECOND ELEMENT OF THE SUBSCRIPTED ARAY Y1 IS TO BE USED. (REMEMBER THAT REAL VARIABLES ARE THREE WORDS EACH). THE 5 MEANS THAT FIVE 12 BIT WORDS (OR 10 PACKED ASCII CHARACTERS) COMPARISONS ARE TO BE MADE. FOR EXAMPLE: DIMENSION X1(10),Y1(30) IF (NCOMP(X1,1,5,Y1,4)) 10,20,30 WOULD COMPARE: X1(1) TO Y1(2) X1(2) TO Y1(3) (THE FIRST TWO 12 BIT WORDS ONLY) AND TAKE A BRANCH TO 10 IF THEY COLATE LOW, TO 20 IF THEY COLATE EQUAL, AND TO 30 IF THEY COLATE HIGH AND SO FORTH. NOTE THAT INTEGER VARIABLES MAY BE USED IF THEY ARE CONSIDERED TO BE ONE 12 BIT WORD EACH. MOVE(X1,1,9,Y1,15) THE ARGUMENTS TO MOVE ARE IDENTICAL TO NCOMP. THIS IS A SUBROUTINE, HOWEVER. I.E.: CALL MOVE(X1,1,9,Y1,15) WILL MOVE X1(1) TO Y1(5), X1(2) TO Y1(6), AND X1(3) TO Y1(7). ****** BE SURE THERE IS A Y1(7) IN YOUR DIMENSION STATEMENT OR IT WILL MOVE DATA TO WHATEVER HAPPENS TO BE IN THE SUCEEDING MEMORY LOCATIONS. CALL MOVE(X1,1,6,Y1,3) IS IDENTICAL TO: DO 10 I=1,3 J=I+4 10 Y1(J)=X1(I) EXCEPT THAT IT IS MUCH FASTER. NCOMP.RL ERROR MESSAGES THERE ARE NO ERROR MESSAGES ASSOCIATED WITH NCOMP.RL LIBRARY NOTES - - - - - - THE CURRENT STRUCTURE OF LIBSET AND THE /L OPTION TO THE LINKING LOADER MAKE IT DIFFICULT TO HAVE VERY LARGE LIBRARY DIRECTORIES. FOR THIS REASON, THESE ROUTINES HAVE BEEN ADDED AND TWO LIBRARIES CREATED: LIB81.RL AND LIB82.RL. THE ONLY DIFFERANCE BETWEEN THESE AND LIB8.RL IS THAT IT TOOK TWO DIRECTORIES TO HOLD ALL THE ENTRY POINTS. THE LONGET ROUTINES ARE IN THE FIRST (LIB81.RL) AND THE OVERFLOW IN THE SECOND (LIB82.RL). IN COMPLING A FORTRAN PROGRAM USE THE FOLLOWING SEQUENCE: .R FORT DTA3:PROG/I/O/L (USE THE /I AND /O OPTIONS AS REQUIRED *LIB81/L (THE /L OPTION HERE MEANS THE INPUT IS A LIBRARY *LIB82/L (/L AGAIN FOR MORE LIBRARY INPUT */M$ (THE $ IS THE ECHO OF ALT MODE AND THE /M IS (TO PRODUCE A MAP BEFORE CREATING A CORE IMMAGE (WITH A CORE CONTROL BLOCK. THE LOADER WILL THEN OUTPUT: MAIN 12345 ABCDEF 23456 BBBBBB 11221 . . . . . XYZABD 23456 0000 (THIS IS THE NUMBER OF FREE PAGES IN FIELD 0 0003 (AND THE NUMBER OF FREE PAGES IN FIELD 1, ETC. FOR THOSE INTERESTED, THE SUBROUTINES IN LIB81 ARE: ISAM.RL DUMP.RL IOH.RL FLOAT.RL WOISAM.RL ROISAM.RL POWERS.RL UTILTY.RL INTEGR.RL TRIG.RL ATAN.RL AND THE SUBROUTINES IN LIB82 ARE: MULTI.RL IPOWRS.RL RWTAPE.RL IOPEN.RL GTDATE.RL SQRT.RL NCOMP.RL SORT.SV THE SORT PROGRAM IS IN ITSELF NOT A SORT BUT A SORT GENERATOR. RUNNING THE SORT PROGRAN WILL ACTUALLY PRODUCE A SERIES OF QUESTIONS. THE FIRST QUESTION IS WHAT TYPE OF FORMAT THE DATA IS TO BE INTERPRETED AS - NAMELY I FORMAT (A 12 BIT WORD IN FIXED POINT FORMAT), F FORMAT (A 36 BIT WORD IN FLOATING POINT FORMAT), A2 FORMAT (A 12 BIT WORD IN STRIPPED ASCII (2 6-BIT CHARACTERS) FORMAT), OR A6 FORMAT (A 36 BIT WORD IN STRIPPED ASCII (6 6-BIT CHARACTERS) FORMAT). THE SECOND QUESTION IS WHERE IN THE RECORD THE HIGH ORDER WORD(S) STARTS. ANY NUMBER BERWEEN 1 AND 125 (DECIMAL) IS OK. THE PROGRAM THEN ASKS IF THE LAST TWO ENTRIES (FORMAT AND LOCATION) ARE CORRECT. ANSWER Y OR N. "N" WILL ALLOW RE-ENTRY OF THE DATA, WHILE "Y" WILL CAUSE THE PROGRAM TO PROCEED TO THE NEXT QUESTION. THEN THE PROGRAM WILL ASK IF THERE ARE ANY MORE SORT KEYS. ANSWER Y TO INPUT THE SECONDARY SORTING KEY ( THE KEY THAT WILL BE TESTED IF THE FIRST KEYS WERE EQUAL). THIS PROCEDURE WILL CONTINUE UNTIL 1) A "N" IS THE ANSWER TO THE "MORE VARS?" QUESTION, OR 2) SIXTEEN SEPERATE SORTING FIELDS ARE ENTERED. THESE QUESTIONS DEFINE THE DATA LAYOUT TO THE SORTING SECTION OF THE GENERATOR. UPON THE COMPLETION OF THESE QUESTIONS, THE GENERATOR WILL ASK WHAT DEVICE THE DATA RESIDES. ANSWER AND OS/8 DEVICE NAME. THEN IT WILL ASK WHAT THE FILE IS NAMED. ANSWER THE OS/8 NAME (THE .DA EXTENAION SHOULD BE OMITTED, SINCE THE GENERATOR SUPPLIES THE .DA BY ITSELF). THEN IT WILL ASK "ALL OK?". ANSWER Y OR N AS REQUIRED. THE PROGRAM WILL THEN ASK IF THE GENERATED SORT IS CHAIN TO ANOTHER PROGRAM. ANSWER Y OR N. IF THE ANSWER WAS "Y", IT WILL ASK THE NAME OF THE PROGRAM TO BE CHAINED TO. NOTE THAT THE CHAINED TO PROGRAM MUST BE IN SAVED OR CORE IMMAGE FORMAT. ANSWER AS REQUIRED. THE LAST QUESTION ASKED IS WETHER OR NOT THE GENERATED SORT IS TO BE SAVED. A "N" ANSWER WILL START THE SORT IMMEDIATLEY, WHILE A "Y" ANSWER WILL DO SOME INTERNAL HOUSE KEEPING AND THEN RETURN TO THE OS/8 MONITOR WITH A DOT (.). IF THE GENERATED SORT IS TO BE SAVED, TYPE "SAVE SYS SORTXX" WHERE SORTXX IS THE OS/8 NAME OF THE GENERATED PROGRAM. A SAMPLE OF THE SORT GENERATION DIALOGUE FOLLOWS: TO SORT THE SECOND EXAMPLE PROGRAM FIRST BY TYPE, AND THEN BY DATE, THE FOLLOWING DIALOGUE WOULD BE REQUIRED. .RUN SYS SORT INVENT-8 SORTING PROGRAM PLEASE INPUT SORT KEYS WHAT FORMAT? I STARTING AT WORD NO. 0 ALL OK? Y MORE VARS? Y WHAT FORMAT? I STARTING AT WORD NO. 7 ALL OK? Y MORE VARS? Y WHAT FORMAT? I STARTING AT WORD NO. 5 ALL OK? Y MORE VARS? Y WHAT FORMAT? I STARTING AT WORD NO. 6 ALL OK? Y MORE VARS? N WHAT DEVICE DTA5 WHAT FILE PARTS ALL OK? Y CHAIN TO ANOTHER PROGRAN? Y CHAIN TO WHAT PROGRAM? PRINT ALL OK? Y SAVE IT? Y .SAVE SYS SORTXX SEVERAL ITEMS BECOME APARENT FROM THIS EXAMPLE 1) ALWAWS START THE SORT GENERATOR WITH THE RUN COMMAND SINCE THE R COMMAND DOES NOT BRING THE CORE CONTROL BLOCK (THAT PIECE OF INFORMATION THAT TELLS THE MONITOR WHAT CORE LOCATIONS TO SAVE IN THE "SAVE SYS SORTXX" COMMAND). 2) THE DEVICE THAT CONTAINS THE DATA TO BE SORTED MUST BE A FILE STRUCTURED (READABLE AND WRITABLE) DEVICE. 3) THE SORT WILL SORT THE DATA UPON ITSELF AND IT REQUIRES NO TEMPORARY STORAGE. THE SORTED DATA (UPON THE COMPLETION OF THE SORTING PROCESS) HAS THE SAME NAME AS WHEN IT WAS STARTED. 4) THE SORT PROGRAM WILL OPERATE ***ONLY*** ON WOISAM GENERATED DATA FILES. ANY OTHER INPUT FILES WILL PRODUCE ENTIRELY UNPREDICTABE (AND PERHAPS DESASTEROUS) RESULTS. 5) WHEN SORTING A DATE, SORT ON YEAR FIRST, THEN MONTH, FOLLOWED BY THE DAY. 6) IF THE FOURTH SORT KEY WAS DESIRED, NAMELY THE VARIABLE CN THE FORMAT WOULD BE "F", STARTING AT WORD NO. 2! 7) IF THE FIFTH SORT KEY WAS DESIRED, NAMELY THE VARIABLE D1 THE FORMAT WOULD BE "A6", STARTING AT WORD NO. 8! GOOD LUCK ON YOUR ENDEAVOR TO USE THIS SOFTWARE SYSTEM!!! ANY COMMENTS AND/ OR SUGGESTIONS ABOUT THE SYSTEM SHOULD BE REFFERED TO THE AUTHOR THROUGH DECUS (PLEASE) TWO SAMPLE PROGRAMS FOLLOW. THE FIRST USES MULTI AND DUMP, WHILE THE SECOND USES ROISAM,WOISAM, ISAM, AND DEVICE INDEPENDENT INPUT/OUTPUT (READ (4,N) LIST AND WRITE (4,M) LIST) AS ILLISTRATIONS. C ALL FILES ARE KEYED AND SORTED ON X1 Y1 AND Z1 C C THIS PROGRAM WILL MERGE DBASE, INASCI, AND INPUT AS FOLLOWS C C IF ON INASCI AND DBASE - DELETE FROM DBASE C IF ON INASCI AND INPUT - ADD TO DBASE C IF ON INASCI ONLY - ADD TO OUTASC C IF ON INPUT AND DBASE - DO NOTHING C IF ON INPUT ONLY - ADD TO OUTPUT C IF ON DBASE ONLY - CHANGE TO TYPE 2 C IF ON ALL THREE - CHANGE TYPE TO 2 C C C C THE FOLLOWING EXAMPLE USES ISAM, ROISAM, AND WOISAM C IT ALSO USES READ (4,XXX) AND WRITE (4,XXX) C C C COMMON ITYPE,X1,X2,IDUM,JTYPE,Y1,Y2 DIMENSION IDUM(121) C FORTRAN WILL ASSIGN 121 LOCATIONS IN COMMON FOR IDUM, FORCING C JTYPE TO 10400 WHICH IS WHERE WE WANT IT. CALL INITL('DBASE') CALL GETOP('DTA5','INPUT') CALL PUTOP('DTA6','OUTPUT',7) C MUST CALL IOPEN AFTER GETOP CALL IOPEN('DTA1','INASCI') C MUST CALL OOPEN AFTER PUTOP CALL OOPEN('DTA2','OUTASC') C INASCI AND OUTASC NEED NOT BE ON THE SAME DEVICE TYPE, BUT C INASCI AND GETOP MUST HAVE CORESIDENT HANDLERS READ (4,1000) KTYPE,Z1,Z2 1000 FORMAT(I4,2F6.1) C NOW ALL THE FILES HAVE THE SAME STATUS( THE FIRST RECORD IS C IN CORE. 10 IF (X1-Y1) 20,60,90 20 IF (Z1-X1) 30,40,50 C ON INASCI ONLY 30 WRITE (4,1000) KTYPE,Z1,Z2 READ (4,1000) KTYPE,Z1,Z2 C IS THERE AN EOF ON INASCI? IF (KTYPE-999) 10,200,200 C ON INASCI AND DBASE 40 CALL DELET C DELET WILL ALSO GET THE NEXT SEQUENTIAL RECORD C CHECK FOR AN END OF FILE IF (ITYPE-999) 45,300,300 45 READ (1L4,1000) KTYPE,Z1,Z2 C CHECK FOR AN EOF IF (KTYPE-999) 10,200,200 C ON DBASE ONLY 50 ITYPE=2 CALL RWRTE C RWRTE WILL NOT GET THE NEXT RECORD CALL GET IF (ITYPE-999) 10,300,300 60 IF (X1-Z1) 70,80,30 C ON DBASE AND INPUT - DO NOTHING 70 CALL GET IF (ITYPE-999) 75,300,300 75 CALL GETX IF (JTYPE-999) 10,400,400 C ON ALL THREE 80 ITYPE=2 CALL RWRTE CALL GET IF (ITYPE-999) 82,300,300 82 CALL GETX IF (JTYPE-999) 84,400,400 84 READ (4,1000) KTYPE,Z1,Z2 IF (KTYPE-999) 10,200,200 90 IF (Z1-Y1) 30,100,110 C ON INPUT AND INASCI-ADD TO DBASE BUT KEEP IT IN SEQUENCE 100 CALL BKSPC ITYPE=2 X1=Z1 X2=Z2 CALL PUT C PUT WILL NOT GET THE NEXT RECORD CALL GET IF (ITYPE-999) 102,300,300 102 CALL GETX IF (JTYPE-999) 104,400,400 104 READ (4,1000) KTYPE,Z1,Z2 IF (KTYPE-999) 10,200,200 C ON INPUT ONLY 110 CALL PUTX CALL GETX IF (JTYPE-999) 10,400,400 C C C C MUST HANDLE EOS'S C EOF ON INASCI 200 IF (ITYPE-999) 210,260,260 210 IF (JTYPE-999) 220,230,230 220 IF (X1-Y1) 230,240,250 C ON DBASE ONLY 230 ITYPE=2 CALL RWRTE CALL GET GO TO 200 C ON DBASE AND INPUT 240 CALL GETX READ (4,1000) KTYPE,Z1,Z2 GO TO 200 C ON INPUT ONLY 250 CALL PUTX CALL GETX GO TO 200 260 IF (JTYPE-999) 250,900,900 C C C BACKSPACE DBASE SINCE MAY WANT TO ADD TO IT 300 CALL BKSPC 305 IF (JTYPE-999) 310,360,360 310 IF (KTYPE-999) 320,330,330 320 IF (Y1-Z1) 330,340,350 C ON INPUT ONLY 330 CALL PUTX CALL GETX GO TO 305 C ON INPUT AND INACSI 340 ITYPE=JTYPE X1=Y1 X2=Y2 CALL PUT GO TO 305 C ON INASCI ONLY 350 WRITE (4,1000) KTYPE,Z1,Z2 READ (4,1000) KTYPE,Z1,Z2 GO TO 305 C AN EOF ON INPUT - SO ON INASCI ONLY 360 IF (KTYPE-999) 350,900,900 C C C C EOF ON INASCI 400 IF (ITYPE-999) 410,460,460 410 IF (JTYPE-999) 420,430,430 420 IF (X1-Y1) 430,440,450 C ON DBASE ONLY 430 ITYPE=2 CALL RWRTE CALL GET GO TO 400 C ON DBASE AND INPUT 440 CALL GETX CALL GET GO TO 400 C ON INPUT ONLY 450 CALL PUTX CALL GETX GO TO 400 C ON INPUT ONLY (MAYBE) 460 IF (JTYPE-999) 450,900,900 C C C C THATS ALL FOLKS C CLOSE ALL THE FILES C ALSO CLOSE DBASE 900 CALL FINSH CALL PUTCL C PUT SOME EOF'S ON OUTASC WRITE (4,1000) 999,0.,0. WRITE (4,1000) 999,0.,0. WRITE (4,1000) 999,0.,0. CALL OCLOS WRITE (1,1001) 1001 FORMAT('JOB XXX COMPLETE') CALL EXIT END C THE RECORD FORMAT IS AS FOLLOWS C THE ORDER HEADER IS TYPE 1 C THE PART HEADER IS TYPE 2 C THE DELIVERY HEADER IS TYPE 3 C VAR FORMAT NO WDS P.O. P.N. DELIV C 1 I1 1 =1 =2 =3 C 2 A2 1 PO1 PN1 CODE C 3 F7.0 3 PO2 PN2 QUAN C 4,5,6 3I2 3 DATE DATE DATE C 7,8 2A6 6 VNAME PDESC C 9 F9.2 3 VCODE PRICE RCQUAN C 10 I3 1 ACC PN3 RCDATE1 C 11 2I2 2 RCDATE2,3 C C COMMON IM,IC,CN,ID1,ID2,ID3,D1,D2,VC,IP,IXD2,IXD3 CALL GDATE(IMO,IDAY,IYR) 1099 FORMAT('UTILITY ROUTINE') 1009 FORMAT('WHAT COMMAND ',A6) WRITE (1,1099) READ (1,1009) X 5 IF (X-'DUMP ') 200,8,200 C INITIALIZE THE FILE 8 CALL FOPN('DBASE') CALL SPOOP('MASTR1') 10 CALL GETF IF (IM-1) 10,20,30 20 WRITE (4,1001) IM,IC,CN,ID1,ID2,ID3,D1,D2,VC,IP,IXD2,IXD3 CALL WRTCH C CHECK TO SEE IF END OF REEL GO TO 10 30 IF (IM-3) 40,50,60 40 WRITE (4,1002) IM,IC,CN,ID1,ID2,ID3,D1,D2,VC,IP,IXD2,IXD3 CALL WRTCH GO TO 10 50 WRITE (4,1003) IM,IC,CN,ID1,ID2,ID3,D1,D2,VC,IP,IXD2,IXD3 CALL WRTCH GO TO 10 60 CALL SPOCL CALL FCLOS 70 READ (1,1004) X 1004 FORMAT('COMPRESS ALSO(YES OR NO)? ',A6) IF (X-'YES ') 80,90,80 80 IF (X-'NO ') 70,900,70 90 CALL SPIOP('MASTR1') C LETS CALL SPIOP JUST TO BE SURE IT WON'T FAIL CALL ZERO('DBASE',20) CALL FOPN('DBASE') CALL SPIOP('MASTR1') 100 READ (4,1005) IM, IF (IM-1) 100,110,120 110 READ (4,1006) IC,CN,ID1,ID2,ID3,D1,D2,VC,IP,IXD2,IXD3 GO TO 145 120 IF (IM-3) 130,140,150 130 READ (4,1007) IC,CN,ID1,ID2,ID3,D1,D2,VC,IP,IXD2,IXD3 GO TO 145 140 READ (4,1008) IC,CN,ID1,ID2,ID3,D1,D2,VC,IP,IXD2,IXD3 145 CALL PUTF GO TO 100 150 CALL RDCHK(I) IF (I) 160,160,100 160 CALL FCLOS 900 WRITE (1,1013) 1013 FORMAT('DONE') CALL EXIT 1001 FORMAT(I4,2X,A2,F7.0,3I3,2X,2A6,2X,F7.0,3I5) 1002 FORMAT(I4,2X,I2,F7.0,3I3,2X,2A6,2X,F7.2,3I5) 1003 FORMAT(I4,2X,A2,F7.0,3I3,2X,2F6.0,2X,F7.0,3I5) 1005 FORMAT(I4) 1006 FORMAT(2X,A2,F7.0,3I3,2X,2A6,2X,F7.0,3I5) 1007 FORMAT(2X,I2,F7.0,3I3,2X,2A6,2X,F7.2,3I5) 1008 FORMAT(2X,A2,F7.0,3I3,2X,2F6.0,2X,F7.0,3I5) 200 IF (X-'RELOAD') 210,90,210 210 IF (X-'ZERO ') 220,230,220 1010 FORMAT('DUMP,RELOAD,OR ZERO ONLY ',A6) 220 READ (1,1010) X GO TO 5 230 READ (1,1011) X 1011 FORMAT('ARE YOU SURE? ',A6) IF (X-'YES ') 901,240,901 240 CALL ZERO('DBASE',20) GO TO 900 901 WRITE (1,1012) 1012 FORMAT('ERROR') CALL EXIT END