.TITLE LOADTABLE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Routine to load internal program tables from CSG Table Files. ;;
;; (Default CSG table file is "REMOTE$TABLES:REMTAB.DAT") ;;
;; ;;
;; Calling Sequence (from a COBOL program): ;;
;; ;;
;; CALL "LOADTABLE" USING ;;
;; ;;
;; BY DESCRIPTOR
;;
;; ;;
;; BY REFERENCE ;;
;; ;;
;; ;;
;; ;;
;; . ;;
;; . ;;
;; . ;;
;; ;;
;; GIVING . ;;
;; ;;
;; contains the name of the file in which the ;;
;; tables to be loaded are located. ;;
;; ;;
;; contains the name of the table to be loaded. ;;
;; ;;
;; is the address of the data structure to ;;
;; recieve the loaded table. ;;
;; ;;
;; contains the number of bytes per table entry. ;;
;; ;;
;; contains the maximum number of entries that ;;
;; can be loaded. ;;
;; ;;
;; will contain the number of entries that were ;;
;; actually loaded by the routine. ;;
;; ;;
;; will contain the return status of the routine. ;;
;; ;;
;; , and must be defined ;;
;; as VAX Word items, PICTURE 9(1) - 9(4), USAGE IS COMP. ;;
;; ;;
;; must be defined as a Signed Vax Longword item, ;;
;; PICTURE S9(9), USAGE IS COMP. ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; File Access Block (FAB) ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FABBLK: $FAB,- ; File Access Block
FAC = GET,- ; File Access type is Input
ORG = REL,- ; Organization is Relative
RFM = VAR,- ; Record length is variable
DNM = ; Default file spec
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Record Access Block (RAB) ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RABBLK: $RAB,- ; Record Access Block
FAB = FABBLK,- ; Access of FAB
RAC = KEY,- ; Access Mode is Random
KSZ = 4,- ; Key is longword Record No.
KBF = TABKEY,- ; Address of Record No.
UBF = RECBUF,- ; Record Buffer Address
USZ = 405 ; Record Size
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Other file related structures ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DEFNAM: .ASCII /REMOTE$TABLES:REMTAB.DAT/ ; Default table file name
DEFSIZ: .BYTE DEFSIZ-DEFNAM ; Default table file name size
TABKEY: .LONG 0 ; Relative Key
RECBUF: .BLKB 405 ; Record Buffer
RECPTR: .LONG 4 ; Size of Record Number
.ADDRESS RECBUF+13 ; Address of Record Number
ENTPTR: .LONG 4 ; Size of Entry Count
.ADDRESS RECBUF+18 ; Address of Entry Count
TABCNT: .BLKL 1 ; Number of tables to load
REMAIN: .BLKL 1 ; Remainder - old/new format?
OFFSET: .BLKL 1 ; Offset to repeating params
TABLIT: .ASCII "/TABLE" ; Table definition identifier
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Table load parameters ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TBLADR: .BLKL 50 ; Table Addresses
TBLSIZ: .BLKW 50 ; Bytes per table entry
TBLMAX: .BLKW 50 ; Maximum number of entries
TBLCTR: .BLKL 50 ; Address of table count var.
TBLREC: .BLKL 50 ; Next record to GET
TBLENT: .BLKL 50 ; Number of entries in table
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; 1) Initialization. ;;
;; o Clear internal tables ;;
;; o Determine call format - old or new ;;
;; . Old format uses default table file - REMOTE$TABLES:REMTAB.DAT ;;
;; . New format passes table name as first argument ;;
;; ;;
;; 1) Open the table file and connect. ;;
;; ;;
;; 2) Parse calling parameters against header and build load tables. ;;
;; ;;
;; 3) Load the requested tables. ;;
;; ;;
;; 4) Close the table file and return. ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ENTRY LOADTABLE,- ; LOADTABLE Entry
^M
CLRL TABKEY ; Initialize table key
MOVL #0,R5 ; Initialize table index
ZAP: CLRL TBLADR[R5] ; Clear next table segment
ACBL #249,#1,R5,ZAP ; Loop until all cleared
MOVAL DEFNAM,FABBLK+FAB$L_FNA ; Move file name addr to FAB
MOVB DEFSIZ,FABBLK+FAB$B_FNS ; Move size of file name string
MOVL #4,OFFSET ; Default offset - old format
MOVL 0(AP),R5 ; Get number of parameters
MOVL #0,R6 ; Clear other half of quad div
EDIV #5,R5,TABCNT,REMAIN ; Get number of tables to load
CMPL REMAIN,#0 ; Old or new format?
BEQL OLD ; Old - Use default table file
MOVL #8,OFFSET ; New format - increase offset
MOVL AP,R5 ; Get parameter pointer
ADDL2 #4,R5 ; Point to table file name param
MOVL 0(R5),R7 ; Get address of descriptor
MOVL 4(R7),FABBLK+FAB$L_FNA ; Move file name addr to FAB
CVTLB 0(R7),FABBLK+FAB$B_FNS ; Move size of file name string
OLD: $OPEN FAB = FABBLK ; Open Table File
BLBC R0,LEXIT ; Quit if error
$CONNECT RAB = RABBLK ; Connect to RAB Block
BLBC R0,LEXIT ; Quit if error
JSB FINIT ; Initialize table counts
JSB GETTAB ; Get tables to load
BLBC R0,LEXIT ; Quit if error
JSB LODTAB ; Load the tables
BLBC R0,LEXIT ; Quit if error
$CLOSE FAB = FABBLK ; Close Table File
BLBC R0,LEXIT ; Quit if error
LDONE: MOVL #1, R0 ; Set Good Return Status
LEXIT: RET ; Return to caller
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Routine to initialize table counts to -1 to indicate failure status ;;
;; so that if by some chance the table doesn't get loaded the caller ;;
;; will know about it. ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FINIT: MOVL AP,R5 ; Get Parameter pointer
ADDL2 OFFSET,R5 ; Point to first parameter
CLRL R6 ; Init table counter
FLOOP: INCL R6 ; Increment table counter
CMPL R6,TABCNT ; Compare with number of tables
BGTR FDONE ; Branch if out of tables
ADDL2 #16,R5 ; Point to table count address
MOVW #-1,@(R5) ; Init table count to failure
ADDL2 #4,R5 ; Point to next table
BRW FLOOP ; Next table
FDONE: RSB ; Return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Routine to look at passed parameters and file header records ;;
;; and get information for the requested tables. ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETTAB: INCL TABKEY ; Increment Table Key
JSB READIT ; Read the record
BLBC R0,GEXIT ; Quit if error
CMPC3 #6,RECBUF,TABLIT ; Is it a /TABLE rec?
BNEQ GDONE ; No, exit
MOVL AP,R5 ; Get Parameter pointer
ADDL2 OFFSET,R5 ; Point to first parameter
CLRL R6 ; Init table counter
GLOOP: INCL R6 ; Increment table counter
CMPL R6,TABCNT ; Compare with number of tables
BGTR GETTAB ; Branch if out of tables
MOVL 0(R5),R7
CMPC5 #5,RECBUF+7,#^X20,0(R7),@4(R7)
; Do we need this table?
BEQL GKEEP ; Branch if yes
ADDL2 #20,R5 ; Next Table Entry
BRB GLOOP ; Continue until found or end
GDONE: MOVL #1,R0 ; Set Good Return Status
GEXIT: RSB ; Return
GKEEP: ADDL2 #4,R5 ; Point to address of table
MOVL (R5),TBLADR[R6] ; Save address of table
ADDL2 #4,R5 ; Point to entry size address
CVTLW @(R5),TBLSIZ[R6] ; Save entry size
ADDL2 #4,R5 ; Point to max. entries address
CVTLW @(R5),TBLMAX[R6] ; Save max. entries
ADDL2 #4,R5 ; Point to table count address
MOVL (R5),TBLCTR[R6] ; Save table count address
PUSHL #0 ; No flags
PUSHL #4 ; Convert to word
PUSHAL TBLREC[R6] ; Where to put result
PUSHAQ RECPTR ; Pointer to Record Number
CALLS #4, G^OTS$CVT_TI_L ; Convert
PUSHL #0 ; No flags
PUSHL #4 ; Convert to word
PUSHAL TBLENT[R6] ; Where to put result
PUSHAQ ENTPTR ; Pointer to Entry Count
CALLS #4, G^OTS$CVT_TI_L ; Convert
BRW GETTAB ; Next record
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Routine to load tables using tables built from header records. ;;
;; ;;
;; TBLADR - Addresses of tables to load. ;;
;; TBLSIZ - Number of bytes per entry for each table. ;;
;; TBLMAX - Maximum number of entries to load for each table. ;;
;; TBLCTR - Address of the counter for the number of entries loaded. ;;
;; TBLREC - Starting record number in the file for each table. ;;
;; TBLENT - Number of entries that exist in each table. ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LODTAB: CLRL R6 ; Reset table index
LDLOOP: INCL R6 ; Next table
CMPL TBLADR[R6],#0 ; End of table?
BEQL LDDONE ; Branch if yes
MOVL TBLCTR[R6],R7 ; Get address of counter
CLRW (R7) ; Init counter
JSB DOLOAD ; Load the table
BLBC R0,LDEXIT ; Quit if error
BRB LDLOOP ; Loop until all loaded
LDDONE: MOVL #1,R0 ; Set Good Return Status
LDEXIT: RSB ; Return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Routine to read a record from the table file. ;;
;; ;;
;; TABKEY has record number to read. ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READIT: $GET RAB = RABBLK ; Get next record
BLBC R0,REXIT ; Quit if error
REXIT: RSB ; Return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Routine to load entries for a table. ;;
;; ;;
;; R6 has index to table parameters for the table to be loaded. ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DOLOAD: MOVL TBLREC[R6],TABKEY ; Get record number
JSB READIT ; Go read record
BLBC R0,DOEXIT ; Quit if error
SUBW #5,RABBLK+RAB$W_RSZ ; Adjust record size
MOVL TBLADR[R6],R8 ; Get table address
MOVC5 RABBLK+RAB$W_RSZ,- ; Move characters from record
RECBUF+5,- ; to next table entry
#^X20,- ; Pad with spaces
TBLSIZ[R6],-
(R8)
INCW (R7) ; Increment table counter
INCL TBLREC[R6] ; Next record
CVTWL TBLSIZ[R6],R8 ; Get size per entry
ADDL R8,TBLADR[R6] ; Point to next entry
DECL TBLENT[R6] ; Decrement entry count
CMPL TBLENT[R6],#0 ; All entries loaded?
BEQL DODONE ; Branch if yes
CMPW (R7),TBLMAX[R6] ; Enough loaded?
BGEQ DODONE ; Branch if yes
BRW DOLOAD ; Go get next entry
DODONE: MOVL #1,R0 ; Set Good Return Status
DOEXIT: RSB ; Return
.END