ASMB,L,R,C,F
      HED %ASGN 91704-16102 REV A * (C) HEWLETT-PACKARD CO. 1976
      NAM %ASGN,7 91704-16102 REV A 751205
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 2 
      SPC 1 
*********************************************** 
* 
*%ASGN              HIGH LEVEL RFA INTERFACE ROUTINE
* 
*SOURCE PART #      91704-18102 REV A 
* 
*REL PART #         91704-16102 REV A 
* 
*WRITTEN BY:        LARRY POMATTO 
* 
*DATE WRITTEN:      11-13-74
* 
*MODIFIED BY:       JEAN-PIERRE BAUDOUIN
* 
*DATE MODIFIED:     NOV. 1975 
* 
************************************************
      SPC 1 
      SUP 
* 
* 
*     DEFINE ENTRY POINTS 
* 
      SPC 1 
      ENT FLPCK,FLRCK,ASGN,UASGN,STATS
      ENT CLASN 
      SPC 2 
* 
*     DEFINE EXTERNALS
* 
      EXT SWLST,TSTIT,EPRIN,TYPE
      EXT CRLF,CWRIT,EINPT,CREAD,READR
      EXT M2,M3,M4,M5,M7
      EXT .32,.10,B377
      EXT .ENTR,ERROR,CCLOS,CCRET,COPEN 
      EXT ABYTE,SBYTE 
      EXT DIMFG,EXEC,MOVE,FIXNM 
      SPC 2 
* 
*     DEFINE A AND B REG
* 
A     EQU 0 
B     EQU 1 
      SKP 
* 
*     HERE ON PRINT# STATEMENT
*     A REG CONTAINS THE LU 
*     NOTE....A REG MUST NOT BE LOST IF CONTROL 
*             IS TO BE RETURN TO RTEB...
*     IF THE LU IS FOUND IN THE LU TABLE
*     CONTROL IS TRANSFERED TO CORRECT ROUTINE
*     OTHERWISE CONTROL IS PASSED TO RTEB TO HANDLE I/O 
* 
      SPC 2 
FLPCK NOP 
      JSB FILCK     CHECK IF LU MATCHES FILE
      RSS           MATCH...CONTINUE
      JMP FLPCK,I   NO MATCH RETURN 
      SPC 2 
* 
*     HERE IF LU MATCHES ONE IN THE FILE TABLE
* 
      LDA TABN      GET TABLE DISPLACEMENT #
      MPY FPTS      GET DISPLACEMENT TO FILE POINTER TABLE
      ADA FPT       GET ADDRESS OF CORRECT TABLE START
      STA FILC3     SAVE IN TEMP FOR SWLST
      JSB SWLST     SWITCH LIST DEVICE
FILC3 NOP 
      JMP EPRIN     GO PROCESS AS A NORMAL PRINT
      SPC 2 
FILT1 NOP 
FILT2 NOP 
FILT3 NOP 
      SKP 
* 
*     HERE ON READ# STATEMENT 
*     A REG CONTAINS LU 
*     IF THE LU IS FOUND IN THE LU TABLE
*     CONTROL IS TRANSFERED TO CORRECT ROUTINE
*     OTHERWISE CONTROL IS PASSED TO RTEB TO HANDLE I/O 
* 
      SPC 2 
FLRCK NOP 
      JSB FILCK     CHECK IF LU MATCHES FILE
      RSS           WE HAVE A MATCH 
      JMP FLRCK,I   NO MATCH...JUST RETURN
      SPC 2 
* 
*     HERE IF LU MATCHES ON A READ REQUEST
* 
      LDA TABN      GET TABLE NUMBER
      MPY FNPS      LENGTH OF FILE NAME ENTRIES 
      ADA FNPT      ADD TO START OF FILE NAME AREA
      STA RNAMA     SAVE FOR DCB ADDRESS ON READ
      LDB TABN      GET TABLE ENTRY AGAIN 
      ADB FSTT      GET STATUS TABLE ADDRESS
      STB RSTA      SAVE STATUS TABLE ADDRESS 
      LDB FREDA     GET ADDRESS OF FILE READ ROUTINE
      STB READR     SAVE FOR BASIC
      JMP EINPT     GO PROCESS INPUT
      SPC 2 
FREDA DEF FREAD 
.5    OCT 5 
      SKP 
* 
*     ROUTINE TO DO REMOTE READS
*     WHEN WE COME IN 
*     A REG = POSITIVE CHAR COUNT 
*     B REG = BUFFER ADDRESS
*     FILE NAME SET UP BY FLRCK 
*     A REG= # OF CHARACTERS RECIEVED 
* 
FREAD NOP 
      STB RBUFA     SAVE BUFFER ADDRESS 
      CLE,ERA       CONVERT TO WORD ADDRESS 
      STA FILT1     SAVE WORD LENGTH
* 
*     HERE WE DO THE READ REQUEST 
* 
      ISZ DIMFG     SET FOR SPECIAL REQ 
      JSB CREAD 
      DEF *+6 
RNAMA NOP           ADDRESS OF NAME BUFFER
RSTA  NOP           ADDRESS OF STATUS WORD
RBUFA NOP           ADDRESS OF BUFFER 
      DEF FILT1     MAX LENGTH
      DEF FILT2     ACTUAL LENGTH 
* 
*     IF END OF FILE...MOVE ZERO TO BUFFER
* 
      LDA RSTA,I    GET STATUS
      CPA M12       -12...EOF REACHED 
      JSB ZERO
      LDA FILT2     GET ACTUAL LENGTH 
      CLE,ELA       CONVERT TO BYTE LENGTH
      JMP FREAD,I   NO...ALL OK 
* 
*     HERE TO MOVE ZERO IN BUFFER 
* 
ZERO  NOP 
      LDA ZEROF     GET ZERO FILL WORD
      LDB FILT1     GET LENGTH
      STB FILT2     SET LENGTH TO MAX 
      CMB,INB       NEGATE COUNT
ZERO1 STA RBUFA,I   SAVE WORD 
      ISZ RBUFA     GET NEXT ADDRESS
      INB,SZB       DONE? 
      JMP ZERO1     NO
      JMP ZERO,I    YES...RETURN
      SPC 2 
ZEROF OCT 30040 
SPACW OCT 20040 
M12   DEC -12 
      SKP 
* 
*     HERE WE COME IF WE ARE TO WRITE ON FILE #1
* 
*     EACH ENTRY IS 7 WORDS LONG AND IS DESCRIBED BELOW 
*     TO EXPAND THE NUMBER OF WORDS IN EACH ENTRY,
*     YOU MUST CHANGE THE LABEL "TABS",WHICH IS USED
*     ALL OVER THE PLACE FOR INDEXING TO CORRECT STARTING 
*     ADDRESS OF ROUTINE
TABS  EQU 7         LENGTH OF EACH ENTRY
* 
      NOP CURRENT BUFFER COUNT
      ABS 0-BUFS-BUFS+2  MAX BUFFER LENGTH
      OCT -2        TO TELL SWITCH LIST TO ADD 2 TO ADDRESS FOR EOL PAR.
FILE1 NOP           SAVE RETURN ADDRESS 
      JSB FILWT     WRITE FILE INTO A TEMP BUFFER 
      OCT 0         DEFINE FILE BUFFER #1 (NOTE 1 LESS) 
FLND1 JSB FILND     GO TO END OF LINE ROUTINE 
      SPC 2 
* 
*     HERE FOR FILE #2
* 
      NOP 
      ABS 0-BUFS-BUFS+2 
      OCT -2
FILE2 NOP 
      JSB FILWT 
      OCT 1 
FLND2 JSB FILND 
      SPC 2 
* 
*     HERE FOR FILE #3
* 
      NOP 
      ABS 0-BUFS-BUFS+2 
      OCT -2
FILE3 NOP 
      JSB FILWT 
      OCT 2 
FLND3 JSB FILND 
      SPC 2 
* 
*     HERE FOR FILE #4
* 
      NOP 
      ABS 0-BUFS-BUFS+2 
      OCT -2
FILE4 NOP 
      JSB FILWT 
      OCT 3 
FLND4 JSB FILND 
      SKP 
* 
*     HERE WHERE ALL BUFFER ROUTINES COME TO HAVE 
*     THERE BUFFERS DUMPED TO CENTRAL 
*     THE CALLING SEQUENCE MUST BE HELD TO OR WE IN BIG TROUBLE 
* 
*     NOP           CURRENT COUNT UPDATED BY SWLST
*     DEC -72       MAX LINE LENGTH 
*     OCT -2        FLAG TO TELL SWITCH LIST I WILL HANDLE CRLF 
*FILEX              NOP HERE WE COME FROM BASIC 
*     JSB FILWT     THERE WE GO TO FILL THE BUFFER
*     OCT X         FILE BUFFER NUMBER
*     JSB FILND     JSB FILND CRLF ROUTINE (MUST BE IN THAT LOC FOR SWLST)
* 
* 
      SPC 2 
FILWT NOP 
      STA FLWTB     SAVE - LENGTH 
      CLE,ELB       CONVERT WORD ADDRESS TO BYTE ADDRESS
      STB SBYA      SAVE IN SOURCE BYTE ADD.
      LDA FILWT     GET PRAMS OF CALL 
      ADA M2        GET TO CALLING ADDRESS
      STA *+2       SET FOR SWITCH LIST 
      JSB SWLST     SWITCH TO CURRENT DEVICE (SET TYPE WORD!) 
FLWTA NOP           SET A LABEL FOR RETURN AT END OF ROUTINE
UPDAT LDA FLWTB     GET LENGTH
      CMA,INA       MAKE IT POSITIVE
      ADA TYPE      SET TYPE TO LENGTH AFTER MOVE 
      STA TYPE
      CLA           NEEDED FOR TSTIT
      JSB TSTIT     SEE IF WE EXCEEDED LENGTH 
      SZA,RSS       A ZERO...EXCEEDED LENGTH
      JMP UPDAT     YES...RESET TYPE
      LDA FILWT,I   GET BUFFER #
      MPY FBPS      GET STARTING ADDRESS OF CORRECT BUFFER
      ADA FBPT      GET ACTUAL STARTING WORD ADDRESS
      CLE,ELA       CONVERT TO BYTE ADDRESS 
      LDB FILWT     GET TO CURRENT DISPLACEMENT WITHIN
      ADB M5        DATA BUFFER...IT IS 5 WORDS BACK
      ADA B,I       FROM FILWT RETURN...GET BYTE ADD IN BUFER 
      STA DBYA      SET FOR DESTINATION START BYTE ADDRESS
      LDA TYPE      GET LENGTH IN BUFFER AFTER WRITE
      STA B,I       RESET CURRENT COUNTER 
      LDA SBYA      GET SOURCE BYTE ADDRESS 
      LDB DBYA      GET DESTINATION BYTE ADDRESS
      JSB MOVE      MOVE LINE 
FLWTB NOP 
      LDA .32       GET A SPACE 
      JSB SBYTE     ALWAYS END WITH SPACE...TAKE CARE EVEN ODD
      LDB FLWTA,I   GET RETURN ADDRESS
      JMP B,I       RETURN
      SPC 2 
SBYA  NOP 
DBYA  NOP 
      SKP 
* 
*     HERE AT END OF LINE 
*     CALLED BY CRLF ROUTINE INDIRECTLY THROUGH FLNDX 
* 
FILND NOP 
      LDA M2
      ADA FILND 
      LDA A,I       GET FILE# 
      JSB WRITF     WRITE OUT BUFFER...A REG=0 MUST 
      LDB CRLF      GET RETURN ADDRESS
      JMP B,I       RETURN
      SKP 
* 
*     SUBROUTINE CALLED BY BASIC TO ASSIGN AN LU
*     TO A REMOTE FILE. 
* 
*     CALLING SEQUENCE
*     CALL ASSIGN("FILENAME",LU,ERROR)
*     B/N TABLE ENTRY SHOULD LOOK LIKE
*     ASSIGN(R,I,V),SUB=ASGN
* 
      SPC 2 
AFNMA NOP 
ALUA  NOP 
AERRA NOP 
ASGN  NOP 
      JSB .ENTR     GO GET PRAMS
      DEF AFNMA 
      LDA AFNMA     GET ADDRESS OF NAME LOCATION
      JSB FIXNM     CHECK NAME
      JMP AER15 
      STB AFNMA     SAVE ADDRESS
      LDA AFNMA,I   GET LENGTH WORD 
      AND B377
      ADA M7        CHECK IF IN RANGE 
      SSA,RSS 
      JMP AER15     NOT IN RANGE
      LDA CM70      GET ERROR CODE
      LDB ALUA,I    GET LU
      SZB,RSS       LU ZERO ILLEGAL 
      JMP AERR
      LDA B 
      JSB FILCK     SEE IF IT IS ASSIGNED 
      JSB CLOSE     ASSIGNED...CLOSE FILE 
      JSB ROMCK     SEE IF WE HAVE ROOM 
      JMP AERR      NO ROOM 
      JSB ASNF      HAVE ROOM ASSIGN THE FILE 
AERR  STA AERRA,I   SAVE STATUS 
      JMP ASGN,I    NO...RETURN 
      SPC 2 
CM15  DEC -15 
AER15 LDA CM15
      JMP AERR
      SKP 
* 
*     SUBROUTINE TO SET ALL TABLE ENTRIES AND 
*     EITHER OPEN OR CREATE A FILE
*     CALLING SEQUENCE
*     JSB ASNF
*     NORMAL RETURN 
*     A REG = TABLE INDEX NUMBER
*     B REG = TABLE # 1 ADDRESS 
*ALUA=              ADDRESS OF LU 
*AFNMA=             FILE NAME ADDRESS 
*     ALSO TABN MUST CONTAIN TABLE #
*     UPON RETURN A REG= STATUS 
* 
ASNF  NOP 
      STB FILT2     SAVE ENTRY INTO TABLE 
      ADA FSTT      GET STATUS ADDRESS
      STA OSTA      SAVE AS OPEN STATUS ADDRESS 
      STA CRSTA     SAVE FOR CREATE STATUS ADDRESS
      LDA TABN      GET TABLE ENTRY # 
      MPY FNPS      GET DISPLACEMENT IN NAME BUFFER 
      ADA FNPT      GET ADDRESS OF NAME 
      STA ONAMA     SAVE DCB-"NAME" ADDRESS 
      STA CRNMA     SAVE FOR CREATE AS WELL 
      LDA AFNMA     ADDRESS OF FILE NAME
      STA OFNAM     SAVE FOR OPEN 
      STA CRFNM     SAVE FOR CREATE 
      ISZ DIMFG     SET FOR SPECIAL 
      JSB COPEN     TRY OPENING THE FILE
      DEF *+6 
ONAMA NOP 
OSTA  NOP 
OFNAM NOP 
      DEF .0        NO SECURITY CODE
      DEF .0        NO LU 
      LDA OSTA,I    GET STATUS
      SSA,RSS       ALL OK? 
      JMP ASNF1     YES 
      ISZ DIMFG     SET FOR SPECIAL 
      JSB CCRET     NO...TRY TO CREATE IT 
      DEF *+8 
CRNMA NOP 
CRSTA NOP 
CRFNM NOP 
      DEF FSIZE     DEFINE FILE SIZE AS A FLOATING PT. NUMBER 
      DEF .10        FILE TYPE=10 
      DEF .0
      DEF .0
      LDA CRSTA,I   GET STATUS
ASNF1 LDB ALUA,I    GET LU
      SSA,RSS       ALL OK? 
      STB FILT2,I   YES...SET FILE AS ASSIGNED
      JMP ASNF,I    RETURN
      SPC 2 
FSIZE DEC 20.       MAKE IT 20 RECORDS LONG  F.P. 
.0    OCT 0,0       RECORD SIZE 0 
      SKP 
* 
*     FUNCTION CALL MADE BY BASIC 
*     ROUTINE NAME STATS
*     B/N ENTRY SHOULD LOOK LIKE
*     STATUS,SUB=STATS
*     ROUTINE TO GET THE STATUS OF A LOGICAL UNIT 
* 
STATS NOP 
      FIX           CONVERT LU TO INTEGER 
      STA FILT1     SAVE LU 
      JSB FILCK     SEE IF IT IS A FILE 
      RSS           YES IT IS A FILE
      JMP EQTST     NOT A FILE DO AN EQT STATUS CALL
      LDA TABN      GET TABLE DISPLACEMENT #
      ADA FSTT      GET STATUS
      LDA A,I       WE HAVE STATUS
STAT1 CLB           GET A ZERO IN B 
      FLT           CONVERT TO FLOATING NUMBER
      JMP STATS,I   RETURN TO BASIC 
* 
*     HERE IF EQT STATUS CHECK
* 
EQTST JSB EXEC
      DEF *+4 
      DEF .13 
      DEF FILT1     LU IN THAT ADDRESS
      DEF FILT2 
      LDA FILT2     GET STATUS
      AND B377      MASK ALL BUT STATUS 
      JMP STAT1     RETURN TO BASIC 
      SPC 2 
.13   DEC 13
      SKP 
* 
*     ROUTINE CALLED BY BASIC TO UNASSIGN AN LU 
*     CALLING SEQUENCE
*     CALL UNASSGN(LU,ERROR)
*     B/N ENTRY SHOULD LOOK LIKE
*     UNASGN(I),SUB=UASGN 
* 
*     ERROR WILL BE DS/1-11 
* 
ULUA  NOP 
USTAT NOP 
UASGN NOP 
      JSB .ENTR 
      DEF ULUA
      LDA ULUA,I    GET LU
      SZA,RSS       ZERO? 
      JMP UAERR     YES...ILLEGAL...ERROR 
      JSB FILCK     FIND FILE 
* 
*     HERE WE CLOSE THE FILE
* 
      JSB CLOSE     CLOSE FILE
      RSS 
UAERR LDA CM70
      STA USTAT,I 
      JMP UASGN,I   RETURN
      SPC 2 
      SKP 
* 
*     ROUTINE CALLED BY BSUPV TO UNASIGN ALL ASSIGNED 
*     FILES. THIS ROUTINE IS CALLED TO PROTECT THE BASIC
*     USER FROM HIMSELF 
* 
CLASN NOP 
      LDA ASGLA     GET LU TABLE ADDRESS
      STA CLGN1     SAVE TABLE ADDRESS
      LDA MMAXF     GET MAX NUMBER OF ENTRIES 
      STA CLGN2     SAVE FOR DOWN COUNTER 
CLGNA LDA CLGN1,I   GET LU
      SZA,RSS       IS THERE ONE? 
      JMP CLGNB     NO...ENTRY NOT ASSIGNED...CHECK THE REST
      JSB UASGN     IT IS ASSIGNED...UNASIGN IT 
      DEF *+3       FAKE UNASIGN ROUTINE OUT!!! 
CLGN1 NOP 
      DEF USTAT     PUT STATUS BACK ON ITSELF 
CLGNB ISZ CLGN1     GET NEXT ENTRY
      ISZ CLGN2     WE DONE?
      JMP CLGNA     NO...GET NEXT ENTRY 
      JMP CLASN,I   DONE...RETURN 
      SPC 1 
CLGN2 NOP 
      SKP 
* 
*     ROUTINE TO CHECK IF FILE MATCHES LU 
*     A REG CONTAINS LU 
*     B REG SAVED IF NO MATCHED 
*     B REG=TABLE #1 ADDRESS IF ENTRY FOUND 
*     UPON RETURN  FILT2 CONTAINS - DISPLACEMENT+1
*                  TABN CONTAINS TABLE NUMBER -1
* 
FILCK NOP 
      STB FILT1     SAVE B REG
      CLB           GET A ZERO TO CLEAR TABLE COUNT 
      STB TABN      RESET TABLE NUMBER TO ZERO
      LDB MMAXF     GET NUMBER OF BUFFERS 
      STB FILT2     SAVE IN DISPLACEMENT COUNTER
      LDB ASGLA     GET ADDRESS OF LU ASSIGNEMENT TABLE 
FILC1 CPA B,I       IS THE LU SPECIFIED MATCHED?
      JMP FILCK,I   YES...DO MATCH RETURN 
      ISZ TABN      INCREMENT TABLE NUMBER
      INB           NO...GET TO NEXT ENTRY
      ISZ FILT2     DONE? 
      JMP FILC1     NO
      LDB FILT1     YES...RESTORE B REG 
      ISZ FILCK     GET NO MATCH RETURN 
      JMP FILCK,I   RETURN
      SPC 1 
TABN  NOP 
      SKP 
* 
*     SUBROUTINE TO WRITE A RECORD ONTO A FILE
*     CALLING SEQUENCE
*     JSB WRITF 
*     A REG= FILE # 
* 
*     UPON RETURN FILT3=ADDRESS OF CURRENT LENGTH 
*     A REG=0       TYPE AND CURRENT LENGTH SET TO ZERO 
* 
WRITF NOP 
      STA FILT1     SAVE IN TEMP LOCATION 
      MPY FBPS      GET DISPLACEMENT IN DATA BUFFER BUFFER
      ADA FBPT      GET STARTING ADDRESS FOR THIS DATA BUFFER 
      STA BUFA      SAVE BUFFER ADDRESS 
      LDA FILT1     GET TABLE NUMBER
      MPY FNPS      GET DISPLACEMENT IN NAME BUFFER 
      ADA FNPT      GET ADDRESS OF NAME BUFFER
      STA NAMA      SAVE FOR WRITE CALL 
      LDA FSTT      GET FILE STATUS TABLE ADDRESS 
      ADA FILT1     GET DISPLACEMENT
      STA STATA     SAVE STATUS ADDRESS 
      LDA FILT1     GET TABLE NUMBER
      MPY FPTS      GET DISPLACEMENT IN ROUTINE BUFFER
      ADA FPT       GET ADDRESS OF ROUTINE BUFFER 
      ADA M3        GET TO LENGTH WORD
      STA FILT3     SAVE CURRENT LENGTH ADD 
      LDA A,I       GET LENGTH
      SZA,RSS       IF LENGTH ZERO DON'T DO ANYTHING
      JMP WRT1
      INA           ADD ONE TO CONVERT ODD TO EVEN
      CLE,ERA       CONVERT TO WORD ADDRESS 
      STA FILT2     SAVE LENGTH 
* 
*     HERE WE DO THE REMOTE FILE WRITE
* 
      ISZ DIMFG     SET FOR SPECIAL 
      JSB CWRIT 
      DEF *+5 
NAMA  NOP 
STATA NOP 
BUFA  NOP 
      DEF FILT2 
      CLA           GET A ZERO
      STA FILT3,I   CLEAR COUNTS
      STA TYPE      CLEAR COUNTS
WRT1  JMP WRITF,I   RETURN
      SKP 
* 
*     SUBROUTINE CLOSE A FILE 
*     CALLING SEQUENCE
*     JSB CLOSE 
*     RETURN
*     A REG= FILE # 
*     B REG=ADDRESS OF LOCATION IN TABLE #1 
*     FILT2 MUST BE SET TO -TABLE NUMBER+1
*     WILL CLOSE FILE AND CLEAR ALL ENTRIES 
*     AFTER FLUSHING THE BUFFER 
* 
CLOSE NOP 
      CLA           GET A ZERO FOR TABLE ENTRY
      STA B,I       CLEAR OUT TABLE 
      LDA TABN      GET TABLE NUMBER
      JSB WRITF     FLUSH THE BUFFER
      LDA NAMA      GET ADDRESS OF NAME 
      STA CNAMA     SAVE FOR CLOSE REQEST 
      LDA STATA     GET STATUS ADDRESS
      STA CSTA      SAVE STATUS 
      JSB CCLOS     CLOSE THE FILE
      DEF *+3 
CNAMA NOP 
CSTA  NOP 
      LDA CSTA,I    GET STATUS OF CLOSE 
      JMP CLOSE,I   RETURN
      SKP 
* 
*     ROUTINE TO CHECK IF THERE IS ANY TABLE ROOM 
*     CALLING SEQUENCE
*     JSB ROMCK 
*     ERROR RETURN  B REG=-73...NO ROOM 
*     NORMAL RETURN 
*     UPON RETURN A REG= TABLE NUMBER 
*                 B REG= TABLE #1 ADDRESS 
* 
ROMCK NOP 
      LDA MMAXF     GET MAX TABLE SIZE
      STA ROMT1     SAVE IN COUNTER 
      CLA           GET A ZERO
      STA TABN      RESET TABLE INDEX NUMBER
      LDB ASGLA     GET ADDRESS OF FILE TABLE 
ROM1  CPA B,I       ZERO WORD= AVAILABLE
      JMP ROM2
      ISZ TABN      GET TO NEXT TABLE ENTRY 
      INB           GET NEXT BUFFER ADDRESS 
      ISZ ROMT1     DONE? 
      JMP ROM1
      LDA CM73
      JMP ROMCK,I   NO ENTRY AVAILABLE RETURN 
ROM2  ISZ ROMCK     GET NORMAL RETURN 
      LDA TABN      GET TABLE NUMBER
      JMP ROMCK,I   RETURN
* 
ROMT1 NOP 
CM70  DEC -70 
CM73  DEC -73 
      SKP 
* 
*     DEFINE MAX # OF FILES 
*     THE MAX NUMBER OF FILES THAT A USER CAN OPEN
*     AT ANY ONE TIME IS DEFINED BY THE LABEL "MAXF". 
*     CHANGING THE VALUE OF THIS LABEL WILL CHANGE
*     THE NUMBER OF FILES THAN CAN BE OPENED. ALL TABLES
*     WILL MODIFY THEMSELVES TO REFLECT THE CHANGE EXCEPT 
*     THE FILE POINTER TABLE. I AM UNABLE TO AUTOMATE THE 
*     GROWTH OF THIS TABLE AT ASSEMBLY TIME BECAUSE OF
*     JSB INSTRUCTIONS INTERSPECRED WITH THE CONSTANTS... 
*     10 POINTS FOR THE ONE WHO CAN HELP ME...L.P.
* 
MAXF  EQU 4 
* 
* 
*     DEFINE TABLES NEEDED
* 
      SPC 2 
* 
*     TABLE #1...LU ASSIGNMENT TABLE
*     THIS TABLE IS SET BY AN ASSGN CALL
*     AND CLEARED BY A REASSGN OR CLOSE CALL
*     IF THE TABLE CONTAINS A ZERO...NO LU
* 
ASGLA DEF *+1 
      REP MAXF      #DEFINE NUMBER OF ENTRIES 
      NOP 
      SPC 2 
* 
*     TABLE #2... ROUTINE TABLE 
*     HERE WE DEFINE THE STARTING ADDRESS OF THE ROUTINE
*     TABLE-"FPT", AND THE LENGTH OF EACH ENTRY IN THE TABLE
*     -"FPTS", WHICH IS SET TO THE LENGTH OF EACH ENTRY 
* 
FPT   DEF FILE1 
FPTS  ABS TABS
      SPC 2 
* 
*     TABLE #3...BUFFER TABLE 
*     HERE WE DEFINE THE STARTING ADDRESS OF THE DATA 
*     BUFFER AREA-"FBPT", AND THE LENGTH OF EACH DATA 
*     BUFFER WITHIN THE AREA-"FBPS".
* 
FBPT  DEF FBF 
FBPS  ABS BUFS
      SPC 2 
* 
*     TABLE #4...FILE NAME TABLE
*     HERE WE DEFINE THE STARTING ADDRESS OF THE
*     DCB-FILE NAME TABLE-"FNPT",AND THE LENGTH OF
*     EACH NAME ENTRY-"FNPS". THE NAME GETS PUT IN
*     THIS BUFFER WHEN WE DO AN OPEN OR A CREATE. 
* 
FNPT  DEF NAME
FNPS  ABS NAMES 
      SPC 2 
* 
*     TABLE #5...STATUS TABLE 
*     THE NUMBER OF ENTRIES IN THIS TABLE IS DETERMINED 
*     BY MAXF.
* 
FSTT  DEF *+1 
      REP MAXF
      NOP 
      SPC 2 
* 
*     NEGATIVE MAX # OF ENTRIES 
* 
* 
MMAXF ABS 0-MAXF
      SKP 
* 
*     FILE BUFFERS--TABLE #3
*     BUFFER SIZE IS DEFINED BY "BUFS". 
* 
BUFS  EQU 37
* 
*     # OF BUFFERS IS DEFINED BY MAXF 
* 
FBF   REP MAXF      LABEL ON REP WILL HAVE ADD OF FIRST WORD
      BSS BUFS      INDIVIDUAL BUFFER SIZE
      SPC 2 
* 
*     NAME BUFFERS--TABLE #4
*     LENGTH OF EACH NAME BUFFER IS DEFINED BY "NAMES"
* 
NAMES EQU 4 
* 
*     NUMBER OF NAME BUFFERS DEFINED BY "MAXF"
* 
NAME  REP MAXF
      ASC NAMES,    MOVE SPACE IN NAME AREA 
      SPC 3 
END EQU * 
      END 
                                                                                                                          