/OS/8 BASIC VIRTUAL FILE UDEF / ********************************************* / * * / * STANLEY R. VIVIAN * / * DEPARTMENT OF PHARMACOLOGY * / * UNIVERSITY OF MANITOBA FACULTY OF MED. * / * 770 BANNATYNE AVE * / * WINNIPEG, MANITOBA * / * CANADA * / * R3C OW3 * / * * / * PHONE: (204) 786-3642 * / * * / ********************************************* /ADDS A VIRTUAL FILE CAPABILITY TO OS/8 BASIC. /DATA CAN BE RETRIEVED FROM THE FILES AS FOLLOWS: / / LET Y=GET(F,J) \ LET X=GET(4,J*100) /DATA IS INSERTED INTO THE FILES AS FOLLOWS: / / LET D=PUT(F,L,X(I)) \ LET D=PUT(4,J,V) / WHERE D IS A DUMMY VARIABLE /ERROR MESSAGES: / 1. AN ATTEMPT TO ADDRESS A LOCATION BEHOND 174,080, OR / LESS THAN 1, RESULTS IN AN 'FM' OR 'FO' ERROR / MESSAGE. / 2. AN ATTEMPT TO ADDRESS AN INACTIVE FILE RESULTS / IN AN 'FI' ERROR. / 3. AN ATTEMPT TO ADDRESS A NON-NUMERIC FILE, INCLUDING / FILE 0, RESULTS IN AN 'FN' ERROR. / 4. AN ATTEMPT TO ADDRESS A BLOCK BEHOND THE LARGEST / FILE SIZE, (LARGEST EMPTY FILE FOR VARIABLE FILES), / RESULTS IN A NON-FATAL 'RE' OR 'WE' ERROR DEPENDING / ON WHETHER THE FUNCTION WAS A GET OR PUT. THE EOF / BIT IS SET. /THE SEQUENTIAL POINTER IS INITIALIZED TO POINT JUST /BEHOND THE NUMBER JUST 'GOT' OR 'PUT' TO FACILITATE /SWITCHING FROM RANDOM ACCESS TO SEQUENTIAL ACCESS. /BRTS ENTRIES SHOULD BE INITIALIZED AS FOLLOWS: / / .GET SYS BRTS / .ODT / 1560/ 0240 3400 / 1561/ 0240 3403 / 7600G / .SAVE SYS BRTS /THE FOLLOWING SHOULD BE ADDED TO BASIC PROGRAMS: / / 20 UDEF GET(F,L),PUT(F,L,V) / /ANY OTHER UNIQUE FUNCTION NAMES MAY BE USED BUT /SHOULD BE IN THE ABOVE ORDER. /DEFINITIONS FF=37 EXP=44 HORD=45 LORD=46 INSAV=64 ILOOPL=113 INTL=114 FIDLE=123 FGETL=134 FPUTL=135 FNORL=136 FTYPL=150 ENTNO=162 WORD0=163 WORD1=164 WORD2=165 WORD3=166 WORD5=170 WORD6=171 ARGPRE=307 SFN=2000 FN=2005 NEXREC=3302 RE=3010 WE=3025 /** FOR VERSION 1.0 WE=3032 WRBLK=3352 / WRBLK=3350 BLINIT=3364 / BLINIT=3361 ** FFSUB1=5400 FFMPY=5600 FFDIV=5722 FFSUB=6117 /GET(F,L). VIRTUAL FILE GET FUNCTION. / F IS THE FILE NUMBER, 1 - 4 / L IS THE FILE LOCATION. / /PUT(F,L,V). VIRTUAL FILE PUT FUNCTION. / V IS THE VALUE TO BE INSERTED INTO THE FILE. *3400 GET, 0 /GET ENTRY IAC SKP PUT, 0 /PUT ENTRY CMA DCA RW /GET=-2, PUT=-1 JMS I INTL DCA FILENO /FLAC HAS FILE # LOCATE, DCA FF /MODE 1 JMS ARG /GET LOCATION JMS I FSUBL /BUFFERS START AT ZERO F1 / NOT ONE - SUBTRACT 1 JMS I FNORL JMS I FPUTL /STORE AS A FLOAT LOC RESCHK, TAD ENTNO /IS FILE CURRENT DCA ORIGNO /SAVE ORIGINAL IN CASE THIS / IS A 'PRINT' JMS I TABLEL /CHECK ON IT EOFB, TAD I WORD0 /TURN OFF EOF BIT CLL RTR CLL RTL DCA I WORD0 ACTIVE, JMS I FIDLE /CHECK IF FILE IS ACTIVE NUMER, JMS I FTYPL /CHECK IF NUMERIC JMP FINDBK /OK - GO ON ERROR, JMP I .+1 /GIVE AN 'FN' FATAL ERROR FN /ILLEGAL FILE NO. ENTRY FINDBK, JMS I FGETL /CALCULATE BLOCK LOC JMS I FDIVL F85 JMS I FNORL JMS I INTL DCA BLOCK /INT((LOC-1)/85) CORE, TAD BLOCK /IS BLOCK IN CORE TAD I WORD5 CIA TAD I WORD2 SZA CLA JMS I MASSL /NO - GO GET IT FINDOS, TAD BLOCK /CALCULATE OFFSET JMS FLOAT JMS I FMPYL F85 JMS I FSUB1L LOC JMS I FNORL JMS I INTL /OFFSET=(LOC-1)-85*INT(BLOCK) DCA LOC POINT, TAD LOC /POINTER=OFFSET*3+BUFFSTART CLL RAL TAD LOC /MULT BY 3 TAD I WORD1 /ADD BUFFER STARTING POINT DCA LOC /NOW HAS ACTUAL ADDRESS MODE2, IAC /MODE 2 NEEDED NEXT DCA FF ISZ RW /READ OR WRITE? JMP READ WRITE, IAC /GET V IN FLAC JMS ARG TAD LOC /DO THE 'PUT' CDF 10 JMS I FPUTL K7737, 7737 /USE THE SPACE CHANGE, TAD I WORD0 /SET THE BUFFER CHANGED BIT AND K7737 TAD K40 DCA I WORD0 JMP EXIT READ, TAD LOC /JUST GO GET IT CDF 10 JMS I FGETL K40, 40 /USE THE SPACE EXIT, TAD LOC /SET FILE POINTER TO POINT TAD K3 / JUST AFTER LAST ACCESS DCA I WORD3 JMS TABLER /RESET ORIGINAL TABLE ISZ RW /WHICH WAY HOME JMP I PUT JMP I GET ARG, 0 /GETS NEXT ARG DCA INSAV /AC=0, FIRST JMS I KARG /AC=1, SECOND JMS I FGETL KARG, ARGPRE JMP I ARG FLOAT, 0 /FLOAT ROUTINE DCA LORD DCA HORD TAD K27 DCA EXP JMS I FNORL CLA JMP I FLOAT TABLER, 0 /RESETS ORIGINAL TABLE TAD ORIGNO / IF NECESSARY DCA FILENO JMS I TABLEL /SEE IF IT NEEDS CHANGING JMP I TABLER K3, 3 K4, 4 K27, 27 FILENO, 0 ORIGNO, 0 RW, 0 BLOCK, 0 MASSL, MASS TABLEL, TABLE FDIVL, FFDIV FMPYL, FFMPY FSUBL, FFSUB FSUB1L, FFSUB1 LOC, 0 0 0 F85, 7 2520 0 F1, 1 2000 0 *3600 MASS, 0 /GETS CORRECT BLOCK INTO CORE UPDATE, JMS I WRBLKL /WRITE BACK BLOCK IF JMS I BLINIL / CHANGED AND CLEAR RDBLK, CMA /SET UP CURRENT BLOCK TO TAD I BLOCKL / BLOCK-1 FOR ISZ TAD I WORD5 DCA I WORD2 GETBLK, TAD ILOOPL /MODIFY 'EOF' RETURN DCA TEMP2 / TO RETURN TO THIS IAC / ROUTINE TAD EOFR DCA ILOOPL JMS I NEXREL /GET NEW BLOCK EXPCHK, CLA CMA /IS THIS AN EXPANDING TAD I WORD6 / VARIABLE FILE CIA TAD I BLOCKL SPA SNA CLA JMP OUT /NO - TAKE NO ACTION EXPAND, IAC /EXPAND THE FILE TAD I BLOCKL DCA I WORD6 OUT, TAD TEMP2 /RESTORE NORMAL RETURN DCA ILOOPL JMP I MASS EOFR, . RWERR, TAD TEMP2 /RESTORE NORMAL RETURN DCA ILOOPL CMA /FORCE A RE-READ AFTER RE DCA I WORD2 / OR WE ERROR JMS I TABRL /RESET ORIGINAL TABLE JMS I FLOATL /RETURN WITH ZERO FLAC ISZ I RWL /WHICH MESSAGE? TAD REDIF /WAS A GET - GIVE 'RE' TAD WEL /SET UP FOR 'WE' (OR 'RE') DCA .+2 /PUT THE JUMP IN LINE JMP I .+1 . /THE 'RE' OR 'WE' MESSAGE IS / NON-FATAL - PROCESSING CONTINUES TABLE, 0 /IS FILE CURRENT TAD ENTNO CIA TAD I FILENL SNA CLA JMP I TABLE /YES - DO NOTHING MOVE, TAD ILOOPL /NO - CHANGE IT DCA TEMP2 /BORROW THE 'SFN' ROUTINE IAC / ITS NOT A JMS SO FIX RETURN TAD SFNRET DCA ILOOPL TAD EXP /SAVE EXP AS THIS ROUTINE DCA TEXP / WRECKS IT TAD I FILENL /ENTER WITH NEW FILE # JMP I CSFNL SFNRET, . TAD TEXP /RESTORE EXP DCA EXP TAD TEMP2 /RESET NORMAL RETURN DCA ILOOPL JMP I TABLE NEXREL, NEXREC TEMP2, 0 TEXP, 0 WRBLKL, WRBLK BLINIL, BLINIT WEL, WE REDIF, RE-WE FLOATL, FLOAT RWL, RW BLOCKL, BLOCK CSFNL, SFN+1 FILENL, FILENO TABRL, TABLER *4000; NOP /MAKE THE OVERLAY NORMAL *4200; NOP / SIZE *4400; NOP $$$$$$$$$$