DECsystem-10 RPGII Internal Documentation Date: 8 March 1977 Revision: 2 Copyright (C) 1976, 1977 Cerritos Community College District and Robert Currier This software is furnished under license for use only on a single computer system and may be copied only with the inclusion of the above copyright notice. This software, or any other copies thereof, may not be provided or otherwise made available to any other person except for use on such system and to one who agrees to these license terms. Title to and ownership of the software shall at all times remain with Cerritos Community College District and Robert Currier. The information in this software is subject to change without notice and should not be construed as a commitment by either Cerritos Community College District or Robert Currier. RPGII Internal Documentation Page 2 Table of Contents INTRODUCTION CHAPTER 1 COMPILER OVERVIEW 1.1 COMPONENTS OF RPG II .................... 1-1 CHAPTER 2 COMPILER FILE STRUCTURE 2.1 CONTENTS OF SRC ......................... 2-2 2.2 CONTENTS OF LST ......................... 2-2 2.3 CONTENTS OF BIN ......................... 2-2 2.4 CONTENTS OF ERA ......................... 2-2 2.5 CONTENTS OF GEN ......................... 2-3 2.5.1 Operators ............................ 2-3 2.5.2 Operands, Other than Literal ......... 2-3 2.5.3 Operands, Literal .................... 2-3 2.6 CONTENTS OF CPY ......................... 2-3 2.7 CONTENTS OF CAL ......................... 2-4 2.8 CONTENTS OF AS1, AS2, AS3 ............... 2-4 2.8.1 Addresses ............................ 2-4 2.8.2 Address Increments ................... 2-4 2.8.3 Instructions ......................... 2-5 2.8.4 Byte Pointers ........................ 2-5 2.8.5 XWD .................................. 2-6 2.8.6 Constants ............................ 2-6 2.8.7 Miscellaneous ........................ 2-6 2.8.8 Instruction Codes .................... 2-7 CHAPTER 3 COMPILER INTERNAL TABLE STRUCTURE 3.1 FILTAB - THE FILE TABLE ................. 3-1 3.2 DATAB - THE DATA ITEM TABLE ............. 3-3 3.3 IDTTAB - THE INDICATOR CHAIN TABLE ...... 3-6 3.4 PROTAB - THE TAG TABLE .................. 3-7 3.5 LITAB - THE LITERAL TABLE ............... 3-7 3.6 VALTAB - THE VALUE TABLE ................ 3-8 3.7 NAMTAB - THE NAME TABLE ................. 3-8 3.8 EXTAB - THE EXTERNAL NAME TABLE ......... 3-8 CHAPTER 4 RUNTIME SYSTEM OVERVIEW 4.1 COMPONENTS OF RPGLIB .................... 4-1 4.2 INPUT/OUTPUT IN RPGLIB .................. 4-2 4.2.1 RPGIO ................................ 4-2 4.2.2 CBLIO ................................ 4-2 CHAPTER 5 RUNTIME SYSTEM INTERNAL TABLE STRUCTURE 5.1 CHNTAB - THE CHANNEL TABLE .............. 5-1 5.2 OTFTAB - THE OBJECT TIME FILE TABLE ..... 5-2 5.3 FTBTAB - THE CBLIO FILE TABLE ........... 5-3 5.4 ICHTAB - THE INPUT CHAIN TABLE .......... 5-6 RPGII Internal Documentation Page 3 5.5 OCHTAB - THE OUTPUT CHAIN TABLE ......... 5-8 5.6 ARRTAB - THE ARRAY TABLE ................ 5-9 APPENDIX A REFERENCE TABLES A.1 INDICATOR VALUES ........................ A-1 RPGII Internal Documentation Page 4 Introduction This manual is intended to assist the programmer that must maintain or modify the DECsystem-10 RPGII system. While all attempts have been made to assure the accuracy of this manual, the final authority is always the program listings themselves. This manual is designed to be used in conjunction with a set of listings, rather than just by itself. In appropriate parts, references have been made to particular program modules that contain further documentation of a particular feature. Programmers that are familiar with the DECsystem-10 COBOL system will notice many similarities in RPGII. This is both good and bad. The programmer that has been deep into COBOL and found his way out, should not get lost in the RPGII system. However, such a programmer, being overly smug about having a vague understanding of how COBOL works, may get overconfident and not notice some of the subtle changes that have been made. Contrary to appearences, these changes have not been made just to trap unwary programmers, but were made for what, at the time, seemed to be good reasons. CHAPTER 1 COMPILER OVERVIEW The RPG II compiler consists of seven major phases: RPGIIA Initialization RPGIIB Header, File, Extension and Line counter specification scanner RPGIIC Input and Output specification scanner RPGIID Calculation specification scanner RPGIIE Table builder and code generator RPGIIF Listing RPGIIG Final assembly In addition there is a phase which dumps core and the contents of the scratch files whenever a catastrophic error occurs in the compiler. This phase in RPGIIK. If a multi-segment compiler (ONESEG=0) is generated, the seven major phases and RPGIIK are grouped into six high segments: RPGII.SHR RPGIIA, RPGIIB RPGIIC.SHR RPGIIC RPGIID.SHR RPGIID RPGIIE.SHR RPGIIE RPGIIF.SHR RPGIIF, RPGIIG RPGIIK.SHR RPGIIK If a single segment compiler (ONESEG=1) is generated, all eight phases are stored in RPGII.SHR. 1.1 COMPONENTS OF RPG II Each phase of the compiler also contains an impure segment (IMPURE.MAC) and one or more of the following routines. All of these routines are collected into the library LIBA.REX. The extenstion of "REX" is for historical reasons. CLEANT Clean up tables to gain more free core DIAGS Define diagnostics tables GENCOM Common routines used by Phase E COMPILER OVERVIEW Page 1-2 GETASY Read from AS1FIL, AS2FIL, AS3FIL GETCPY Read from CPYFIL GETERA Read from ERAFIL GETGEN Read from GENFIL GETSRC Read from the source file and perform some editing IMPURE Define the impure storage area INTERM Universal file to define default switches LOOKUP Generate code for the LOOKUP operation PREDIT Pre-edit the edit words PURAB Pure constants for Phases A & B PUREC Pure constants for Phase C (multi-segment compilers only) PURED Pure constants for Phase D (multi-segment compilers only) PUREE Pure constants for Phase E (multi-segment compilers only) PURFG Pure constants for phases F & G PUTAS1 Write AS1FIL PUTAS2 Write AS2FIL PUTAS3 Write AS3FIL PUTBIN Write BINFIL PUTERA Write ERAFIL PUTGEN Write GENFIL PUTLST Write LSTFIL RPGASM Universal file to define option switches RPGCOM Common routines used by all phases RPGERR Define error messages RPGIIA Initialization and command scanner RPGIIB H, F, E, and L specification scanner RPGIIC I and O specification scanner RPGIID C specification scanner RPGIIE Code and table generation phase RPGIIF Listing generator RPGIIG Assembly phase RPGIIK Error dump phase RPGIIP Parameter definition fil RPGUNV Universal file used by many routines SRTTAB Sort tables (primarily ERAFIL) STINFL Set up input file TRYNAM Interface to NAMTAB XPAND Expand a table XPNPPL Handle error traps CHAPTER 2 COMPILER FILE STRUCTURE The RPG II compiler uses three files specified by the user. These files can be on any device which supports the type of data contained in the file. The three files are: 1. SRC - The RPG II source program. 2. LST - The listing. 3. BIN - The relocatable binary produced by the compiler. The compiler also uses several data files for temporary storage. All of these files are stored on disk, and are deleted at the end of each compilation. All files have the user's job number as the first three characters of the filename, and the extension ".TMP". The three characters that are appended to the job number to form the six character filename are given below with a brief description of each file: 1. ERA - Diagnostics to be output with the listing file. 2. GEN - Output of the syntax parsing phase. 3. CPY - A copy of the source with line numbers assigned. 4. CAL - A copy of the calculation specifications used to delay calculation spec processing until after output processing. 5. AS1 - Intermediate language containing assembly information for the data storage and table definition areas of the object program. 6. AS2 - Intermediate language containing assembly information for the detail calculation area of the object program. 7. AS3 - Intermediate language containing assembly information for the total calculation and literal areas of the object program. COMPILER FILE STRUCTURE Page 2-2 2.1 CONTENTS OF SRC SRC is the ASCII file containing the program to be compiled. It is primarily manipulated by the routines contained in the "GETSRC" module. 2.2 CONTENTS OF LST The listing file is broken down into two subsections: A copy of the source with line numbers assigned and error messages imbedded; and a listing of the generated object output if the user has requested it via the /A switch. 2.3 CONTENTS OF BIN This file contains the relocatable binary data generated by the compiler. This relocatable binary code is designed to be loaded with LINK-10. A description of it's contents can be found in the LINK-10 Programmer's Reference Manual (DEC-10-ULKMA-B-D). 2.4 CONTENTS OF ERA The diagnostic file contains a one-word entry for each error or warning detected by the compiler. The file is written by Phases B, C, D, and E, and read by Phase F. The entries are defined as follows: Bit 0 Always zero to aid sorting of the file. Bit 1 A zero if this diagnostic is to be imbedded in the source listing, a one if the diagnostic is to be listed seperately. Bits 2-14 The line number of the line in error. This is used to determine where in the listing the error message should go. Bit 21 A zero if this is a warning, a one if this is a fatal error. Bits 22-25 The compiler phase which generated the diagnostic. (1=Phase A,...,5=Phase E). Bits 26-35 A number identifying the error message. The messages are defined in the module "RPGERR.MAC". COMPILER FILE STRUCTURE Page 2-3 2.5 CONTENTS OF GEN The generator input file consists of operators and operands put out by the parsing phases B, C and D. Each operator entry is two words, all others are one word. 2.5.1 Operators Word 1: OP.OPR Bit 0 A zero to identify this as an operator OP.OP Bits 1-8 A code for identifying the operator Bits 9-15 Misc flags required for code generation OP.LN Bits 16-28 Source line number to use if error found Word 2: OP.IND Bits 0-17 Link to conditioning indicator chain OP.RES Bits 18-35 Resulting indicator chain link 2.5.2 Operands, Other Than Literals Word 1: OP.OPR Bit 0 A one to identify this as an operand OP.LIT Bit 1 A zero to identify this as other than a literal OP.AC Bit 2 Operand is TEMP of AC's OP.LNK Bits 18-35 Table link to operand 2.5.3 Operands, Literal Word 1: OP.OPR Bit 0 A one to identify this as an operand OP.LIT Bit 1 A one to identify this as a literal OP.NUM Bit 2 A one to identify this as a numeric literal, a zero to identify this as non-numeric OP.FIG Bit 3 A one if a figurative constant OP.LNK Bits 18-35 Table link to literal (if OP.FIG = 0) 2.6 CONTENTS OF CPY This file contains a copy of the source file with line numbers assigned and some editing done. There is a one word entry for each line which contains: COMPILER FILE STRUCTURE Page 2-4 Bits 0-6 The printer control character for the preceding line (form-feed or line-feed) Bit 7 Always zero Bits 8-20 The assigned line number for this line Bits 21-24 The first two characters of the source line Bit 35 Always one to identify this as a header word The remaining words for each line contain the ASCII characters copied from the source file. 2.7 CONTENTS OF CAL This file contains a copy of the calculation specifications copied from the source file. This copy is used to delay processing of the calculation statements until after the output statements have been processed. The file is just an ASCII copy from the source, with no editing done. 2.8 CONTENTS OF AS1, AS2, AS3 The output of Phase E is a set of files containing directions for the assembly phase. Each entry in the file consists of a header word followed by one or more words of more definitive data. 2.8.1 Addresses The header data words may contain an address. That address has a type code in its first three bits, followed by an address relative to some table. The type codes are: AS.CNS 0 The remainder of the address is a constant AS.ICH 1 The address is relative to the start of ICHTAB AS.PRO 2 The address is relative to PROTAB AS.EXT 3 The address is relative to EXTAB AS.FTB 4 The address is relative to FTBTAB AS.OCH 5 The address is relative to OCHTAB AS.CNB 6 The increment (see 2.8.2) is a constant AS.MSC 7 Miscellaneous (see 2.8.2) 2.8.2 Address Increment Occasionally the address must be modified by some increment. The increment has a type code in its first three bits, followed by a constant amount to increment by. COMPILER FILE STRUCTURE Page 2-5 The values for the type codes are: AS.ABS 0 Add constant to the address AS.OTB 1 Add constant to OTFBAS AS.OCB 2 Add constant to OCHBAS AS.LIT 3 Add constant to base of the literal pool AS.ICB 4 Add constant to ICHBAS AS.DOT 5 Add constant to current location AS.TMP 6 Add constant to base of runtime impure area AS.DAT 7 Add constant to base of data storage area 2.8.3 Instruction Word 1: Bit 0 Always zero to identify this as an instruction Bit 1 If there is an increment word following this, this bit is a one Bits 2-8 Operation code (see 2.8.8) Bits 9-12 Accumulator field for the instruction Bit 13 Indirect bit for instruction Bits 14-17 Index field for the instruction Bits 18-35 The address (see 2.8.1) Word 2: This word exists only if bit 1 of word 1 was a one. It has zero in the left half, and an increment (see 2.8.2) in the right half. 2.8.4 Byte Pointer Word 1: Bits 0-2 Always 4 Bits 3-17 Not used Bits 18-35 Address (see 2.8.1) Word 2: Bits 0-17 The left half of the byte pointer, as generated by the MACRO-10 psuedo-op. Bits 18-35 Increment (see 2.8.2) COMPILER FILE STRUCTURE Page 2-6 2.8.5 XWD Word 1: Bits 0-2 Always 5 Bits 3-17 Not used Bits 18-35 Number of following two word entries The header word is followed by one or more two word entries as follows: First Word: Bits 0-17 Address increment for left half of the XWD Bits 18-35 Address for the left half of the XWD Second Word: Bits 0-17 Address increment for right half of the XWD Bits 18-35 Address for the right half of the XWD 2.8.6 Constant Word 1: Bits 0-2 Always 6 Bit 3 ASCII constant Bit 4 SIXBIT constant Bit 5 One-word decimal constant Bit 6 Two-word decimal constant Bit 7 Floating point constant Bit 8 Octal constant Bits 9-12 Not used Bits 13-17 Number of characters in the floating point mantissa Bits 18-35 Number of words containing the constant Following the header word is the value constant, in as many words as is necessary. Floating point constants are two words apiece: the first word is the tens exponent in binary; the second word is the mantissa, four bits per digit. 2.8.7 Micellaneous Word 1: Bits 0-2 Always 7 Bit 3 Paragraph or section name (for listing pruposes) Bit 4 Special tag (for listing purposes) Bit 5 RELOC psuedo-op COMPILER FILE STRUCTURE Page 2-7 Bits 6-16 Not used Bit 17 Increment word follows Word 2: Present only if bit 17 of word 1 is a 1 Bits 0-17 Not used Bits 18-35 Address increment (see 2.8.2) 2.8.8 Instruction Codes A complete list of the instruction codes and their compiler symbols can be found in the module "GENCOM.MAC". CHAPTER 3 COMPILER INTERNAL TABLE STRUCTURE The RPGII compiler makes use of a great many internal tables during the compilation process. This chapter is intended to be a description of those tables. A complete, and up to date, listing of the tables and their entries may be found in the module PURE.MAC. 3.1 FILTAB - THE FILE TABLE FILTAB consist of one 8 word entry for each file used by the object program. These entries are arranged as follows: Word 1: Bits 0-2 Always 0 to identify table. FI.NAM Bits 3-17 Relative pointer to NAMTAB entry for this file. FI.TYP Bits 18-20 File Type as follows: 000 = Input 001 = Output 010 = Update 011 = Combined 100 = Display FI.DES Bits 21-23 File Designation: 000 = Primary 001 = Secondary 010 = Chained 011 = Record Address 100 = Table or Array 101 = Demand 110 = Blank (Output or Display) FI.PRO Bits 24-26 Processing Mode: 000 = Consecutive 001 = By ADDRout 010 = Sequential by key 011 = Sequential within limits (not supported) 100 = Random by relative record 101 = Random by Record Key FI.ORG Bits 27-28 File Organization: 00 = One I/O area (sequential or direct) COMPILER INTERNAL TABLE STRUCTURE Page 3-2 10 = Indexed file 11 = ADDRout file (if not and FI.DES = 011, is limits file) FI.RAF Bits 29-30 Record Address Format 00 = Unpacked 01 = Binary (not supported) 10 = Packed (not supported) 11 = None FI.DEV Bits 31-34 Device Name: .FIMF1 0 = MFCU input hopper 1 .FIMF2 1 = MFCU input hopper 2 .FICDR 2 = READ01 (CDR:) .FILPT 3 = PRINTER (LPT:) .FILP2 4 = PRINTR2 (obsolete) .FITTY 5 = CONSOLE (TTY:) .FIDSK 6 = DISK (DSK:) .FIMTA 7 = TAPEn (MTAn:) FI.EOF Bit 35 Program may end only after all records from this file have been processed when this bit is set. Word 2: FI.KYP Bits 0-11 Relative key position within record FI.BKL Bits 12-23 Block length FI.RCL Bits 24-35 Record length Word 3: FI.SEQ Bits 0-1 Sequence checking option: 00 = No checking 01 = Ascending order 10 = Descending oreder FI.BUF Bits 2-8 Tape buffer offset FI.AST Bit 9 ASCII File flag FI.REW Bits 10-11 Tape rewind option: 00 = Rewind at EOF 01 = Unload at EOF 10 = Leave tape at EOF FI.EXT Bits 12-17 Number of extents FI.ADD Bits 18-19 File addition option: 00 = No additions 01 = Ordered additions 10 = Unordered additions FI.OVI Bits 20-27 Overflow indicator FI.ADF Bit 28 Record Address link flag FI.LPP Bits 29-35 Lines per Page Word 4: FI.OVL Bits 0-5 Overflow line FI.UNT Bits 6-9 Unit number for TAPE FI.KYL Bits 12-16 Length of key field FI.EXI Bits 17-24 External Indicator COMPILER INTERNAL TABLE STRUCTURE Page 3-3 Word 5: FI.COR Bits 0-17 Core index size (not implemented) FI.ADL Bits 18-35 Link to ADDRout or Limits file Word 6: FI.DAT Bits 0-17 Link to primary DATAB item FI.LIN Bits 18-29 Line number of defining file specification Word 7: FI.PHY Bits 0-35 Physical (SIXBIT) name of file Word 8: FI.OTF Bits 0-17 Link to corresponding OTFTAB item 3.2 DATAB - THE DATA ITEM TABLE DATAB, the data item table, consists of a series of 13 word entries linked together in such a manner as to represent the input and output data structures defined in the user's program. It also contains descriptions of data items defined in the calculation specifications and not used in either the input or output sections. For each input or output file there is a corresponding FILTAB entry as defined above. This entry contains a pointer (FI.DAT) to the first DATAB item in the input or output chain. This first item contains the data defining the first record. If there are additional input or output records they are linked together via the DA.MAJ pointer. Each record also contains a pointer to those data items contained within the record. These data items are chained together via the DA.BRO link. Another linkage of importance is the same name (DA.SNM) linkage. Via this pointer all items that have a common name are linked together. This link is useful for compiling composite information on a field. The remainder of the DATAB items are defined as follows: Word 1: Bits 0-2 Always 01 to identify the table DA.NAM Bits 3-17 NAMTAB link DA.MAJ Bits 18-35 Link to next major (record) item Word 2: DA.BRO Bits 0-17 Link to next minor (field) item DA.IND Bits 18-35 Link to conditioning indicators COMPILER INTERNAL TABLE STRUCTURE Page 3-4 Word 3: DA.VAL Bits 0-17 Link to literal value of field DA.COR Bits 18-35 Pointer to assigned core location Word 4: DA.NPS Bits 0-1 Number of entries per sequence type: 00 = Sequence not checked 01 = 1 record/type 10 = n records/type DA.RTR Bit 2 Record type is required DA.TRA Bit 3 Trailer item (not supported) DA.LHI Bit 4 Look-ahead item DA.STS Bits 5-7 MFCU stacker select DA.FLD Bits 8-9 Field type: 00 = Alphanumeric 01 = Packed decimal (not supported) 10 = Packed binary (not supported) 11 = Unpacked numeric DA.SIZ Bits 10-21 Size of field DA.DEC Bits 22-25 Number of decimal positions DA.PRI Bit 26 Print and punch MFCU (not supported) DA.PRO Bit 27 Punch only MFCU (not supported) DA.STR Bit 28 Sterling sign (not supported) 0 = not used 1 = postion stored in DA.STP DA.RES Bits 29-34 Byte residue for core pointer (DA.COR) DA.IMD Bit 35 Array index is immediate Word 5: DA.RII Bits 0-7 Record identifying indicator DA.CLI Bits 8-15 Control level indicator DA.FPL Bits 16-23 Positive field indicator DA.STP Bits 24-35 Sterling position (not supported) Word 6: DA.ORT Bits 0-1 Output record type: 00 = Heading 01 = Detail 10 = Total 11 = Exception DA.ARC Bit 2 Add record DA.FOV Bit 3 Fetch overflow DA.SPA Bits 4-5 Space after count DA.SKA Bits 6-12 Skip after line number DA.EDT Bits 13-16 Edit Code: 1 = "1" 11 = "J" 2 = "2" 12 = "K" 3 = "3" 13 = "L" 4 = "4" 14 = "M" 5 = "A" 15 = "X" 6 = "B" 16 = "Y" COMPILER INTERNAL TABLE STRUCTURE Page 3-5 7 = "C" 17 = "Z" 10 = "D" DA.BLA Bit 17 Blank field after printing DA.SPB Bits 18-19 Space before count DA.END Bits 20-31 Field end position in output record DA.LDC Bit 32 Table/array loads at compile time DA.LDR Bit 33 Table/array loads at pre-execution time DA.LDE Bit 34 Table/array loads at execution time DA.DMP Bit 35 Table/array dumps at end of job Word 7: DA.OCC Bits 0-14 Number of occurs (Max index) of table/array DA.ALT Bit 15 Alternate table DA.INF Bit 16 Input section flag (this item seen in input section) DA.RND Bit 17 Round (Half-adjust) the result DA.ALL Bits 18-35 Table link to alternate table Word 8: DA.EPR Bits 0-9 Number of entries per record DA.SEQ Bits 10-11 Sequence checking: 00 = No check 01 = Ascending sequence 10 = Descending sequence DA.ARE Bit 12 This item an array entry DA.ADD Bit 13 Add record DA.FMT Bits 14-17 Field data format: 0 = SIXBIT 1 = ASCII 2 = EBCDIC DA.LDP Bits 18-35 Table link to file this table/array loads from Word 9: DA.DPP Bits 0-17 Table link to file this table/array dumps to DA.SNM Bits 18-35 Table to link to item with same name Word 10: DA.FRP Bits 0-11 From relative field location DA.TOP Bits 12-23 To relative field location DA.MAT Bits 24-31 Matching indicator DA.TAB Bit 32 Table flag (valid for OCHTAB linked items only) Word 11: DA.FMN Bits 0-7 Negative field indicator DA.FBZ Bits 8-15 Blank or zero field indicator DA.SKB Bits 16-22 Skip before line number DA.FRR Bits 23-30 Field record relation indicator DA.DUN Bit 31 This item processed by Phase E DA.NDF Bit 32 This item not fully defined (used?) DA.FLS Bit 33 This item defined in file section COMPILER INTERNAL TABLE STRUCTURE Page 3-6 Word 12: DA.ICH Bits 0-17 Pointer to related ICHTAB item DA.ARP Bits 18-35 Pointer to array this item references Word 13: DA.INP Bits 0-17 Pointer to index (or index itself if DA.IMD = 1) DA.LIN Bits 18-30 Line number of defining line (for errors) DA.LTF Bit 31 Literal flag DA.RSV Bits 32-35 Reserved word flag/code (set up by Phase E): 1 = UDATE 5 = PAGE 2 = UDAY 6 = PAGE1 3 = UMON 7 = PAGE2 4 = UYEAR 3.3 IDTTAB - THE INDICATOR TABLE The indicator table consists of a series of 1 word entries linked together form an equivalent of the indicator checks used in the user's program. Rather than actually being linked, consecutive entries are used until the ID.END flag is seen, indicating the end of the chain. In addition to using IDTTAB to link together indicator checks for output records and calculations, it is also used to link together checks for record identifying indicators in the input specs. When used for this, only OR lines contain an indicator, which is placed in ID.RII rather than in the usual ID.IND. Placed in ID.IND instead, is the character that is to be looked for in column ID.POS of the input record. The assigned sequence number, ID.SEQ, is also only used in input chains. This number corresponds to the record sequence number given on the input specs. The IDTTAB items are defined as follows: Word 1: ID.OR Bit 0 0 = Boolean AND relation with previous entry, 1 = Boolean OR relation. ID.NOT Bit 1 Boolean NOT condition applied to ID.OR ID.IND Bits 2-9 Indicator/character ID.POS Bits 10-21 Character position ID.END Bit 22 This is last entry in this chain ID.RII Bits 23-30 Record identifying indicator (OR line only) ID.SEQ Bits 31-35 Assigned sequence number (first entry only) COMPILER INTERNAL TABLE STRUCTURE Page 3-7 3.4 PROTAB - THE TAG NAME TABLE The tag name table consists of 2 word entries used to store information about symbols used in TAG and BEGSR statements. The entries are defined as follows: Word 1: PR.ID Bits 0-2 Always 4 to identify the table PR.NAM Bits 3-17 NAMTAB pointer to value of symbol PR.LNK Bits 18-35 Pointer to assigned location of tag Word 2: PR.SEG Bit 0 Segment containing the tag, as follows: 0 = AS2FIL 1 = AS3FIL PR.BSR Bit 1 Tag used in a BEGSR flag 3.5 LITAB - THE LITERAL TABLE LITAB contains information about literals generated by the code generation phase of RPG II. This information is dumped into AS3FIL at the end of that phase. Each LITAB entry consists of a header word followed by words containing the literal value. The header word is defined as follows: In the left half: 1 XWDLIT An XWD 2 BYTLIT A byte pointer 3 ASCLIT ASCII text 4 SIXLIT SIXBIT text 5 D1LIT 1-word decimal 6 D2LIT 2-word decimal 7 FLTLIT Floating point 10 OCTLIT Octal In the right half: Number or following words containing data. The data words are described in Section 2.8 of this manual. COMPILER INTERNAL TABLE STRUCTURE Page 3-8 3.6 VALTAB - THE VALUE TABLE VALTAB holds the literals found in the output specifications as edit words or output literals. Each value is placed in one or more words. The first word has the number of characters in bits 0-6; the remainder of that word, and the following words, if any, contain an ASCII string. 3.7 NAMTAB - THE NAME TABLE NAMTAB contains the names of all files and data items found in the source program. This is a table driven by several hash tables. The search technique is described in the module "TRYNAM.MAC". Each NAMTAB entry consists of at least two words, defined as below: Word 1: Bits 0-35 Undefined (available for flags) Word 2: The name, in SIXBIT, over as many words as is necessary. The name is terminated by a zero byte. 3.8 EXTAB - THE EXTERNAL NAME TABLE EXTAB contains information about external routines. This table is used only by the EXIT operation at the present time, but is included in this form to allow for the possibility of reentrant code generation. Each two word entry in defined as follows: Word 1: Bits 0-2 Always 5 to identify the table EX.NAM Bits 3-17 Pointer to NAMTAB entry for this name Word 2: EX.NRS Bit 0 Name is used by non-resident segment EX.USN Bit 1 Use flag: 0 = OPsys name 1 = User name EX.PID Bit 2 This is the program ID EX.ENT Bit 3 This is an entry point EX.CAL Bit 4 Referenced by a CALL EX.CNT Bits 15-17 Count of extra words allocated EX.HLD Bits 18-35 Misc. uses CHAPTER 4 RUNTIME SYSTEM OVERVIEW 4.1 COMPONENTS OF RPGLIB The RPG II runtime system, RPGLIB, is a collection of library routines to perform various functions needed by the object program. In addition it contains a interpretive module, RPGMAN, which simulates the RPG II cycle, taking the burden of the code generators in the compiler. The routines contained in RPGLIB are listed below: CBLIO Low level I/O routines (taken from LIBOL) CHREQV Generates a universal file containing the character equivalences across the supported character sets CDD Convert from one display format to another COMP Comparison routines COMUNI Define the impure area DEBUG Debugging routines DIV11 Divide single precision by single precision DPADD Do double precision add DPDIV Do double precision divide DPMUL Do double precision multiplication DPSUB Do double precision subtraction DSPLY Handle the DSPLY operation EASTBL Define EBCDIC, ASCII, SIXBIT conversion tables EDIT Handle editing FLGDF Define flags for LIBOL compatibility FTDEFS Define file table constants for CBLIO GC Convert COMP-3 to binary GD Convert display to binary INTERM Define default switches MAGNEG Take magnitude and negative of numbers MOVE Perform moves MOVSGN Move sign field NUMEQV Define character/number equivalences PC Convert binary to COMP-3 PD Convert binary ti display RPGASM Define user selected switches RPGIO Perform high level I/O RPGIMP Define impure area RPGMAN Simulate RPG II cycle RPGPUR Define pure area RUNTIME SYSTEM OVERVIEW Page 4-2 RPGPRM Define miscellaneous parameters RPGSWI Define switch macros and constants SETRET Do return and exit setup SPAC Check for spaces SQRT Find a square root SUBSCR Do array/table subscripting UUOHAN Handle UUO traps 4.2 INPUT/OUPUT IN RPGLIB I/O in the runtime system is performed by two modules: RPGIO and CBLIO. Each performs a different level of I/O. 4.2.1 RPGIO This module contains the high level I/O routines. It contains the routines that the generated code talks to, and also the routines that the RPG II cycle simulator RPGMAN talks to. It is within this module that all indicator checking and buffer setup is done. 4.2.2 CBLIO All actual I/O is done within this module. This is the same module contained in COBOL's runtime system LIBOL. This module was used to maintain complete compatibility with COBOL's I/O system, especially the ISAM handlers, without introducing still another piece of software that must be supported. CHAPTER 5 RUNTIME SYSTEM INTERNAL TABLE STRUCTURE The primary tables that the runtime system utilizes are: OTFTAB, FTBTAB, DEVTAB, ICHTAB, OCHTAB, ARRTAB, and CHNTAB. All except CHNTAB are set up by the compiler and output as part of the object program. CHNTAB is allocated and set up by RPGLIB. IDTTAB is also used by the runtime system, but each entry is assigned a unique location in the literal pool. Thus, although the entries are formated that same as in the compiler, the table itself is distributed throughout memory, rather than grouped in one place as with the other tables. 5.1 CHNTAB - THE CHANNEL TABLE CHNTAB consists of one 23 word table for each file. Its primary use is to allow quick access to some of the information contained in OTFTAB and FTBTAB. When a file is opened, it is assigned a pseudo-channel number. This psuedo-channel number is the entry number within CHNTAB. The offsets into CHNTAB are defined as follows: 0 CHN I/O channel assignment 1 BLK Blocking Factor (obsolete) 2 CUR Current block in buffer (not always correct) 3 PNT SIXBIT byte pointer 4 KEY Relative key for next file access 5 RWF REWRITE flag 6 BSZ Buffer size in words 7 BUF Base of I/O buffer 10 BCN Byte count in current buffer (obsolete) 11 EOF This file has reached end-of-file 12-16 UPD Update key 17 LIN Line counter 20 IPC Input chain pointer 21 SEQ Sequence number 22 RII Record identifying indicator Those entries marked as obsolete are defined for historical reasons only. RUNTIME SYSTEM INTERNAL TABLE STRUCTURE Page 5-2 5.2 OTFTAB - THE OBJECT TIME FILE TABLE OTFTAB contains much the same information as FILTAB but has been rearranged and condensed to be of more use to the runtime system. While this table is built at compile time, it is used only at runtime by the runtime system. Each file used by the object program generates one 9 word OTFTAB entry. Within this entry are pointers to the input and output chains related to the file. These pointers point into ICHTAB and OCHTAB, respectivly. Also contained in this entry is a pointer to the corresponding FTBTAB entry so that the runtime system can gain access to CBLIO generated information. The entries are defined as follows: Word 1: OT.COR Bits 0-17 Pointer to core index (not supported) OT.ADP Bits 18-35 Pointer to ADDRout file Word 2: OT.BFP Bits 0-17 Pointer to record buffer OT.OPC Bits 18-35 Pointer to OCHTAB output chain Word 3: OT.IPC Bits 0-17 Pointer to ICHTAB input chain Word 4: OT.NAM Bits 0-35 Physical SIXBIT name of file Word 5: OT.TYP Bits 0-2 File type (as defined in FI.TYP) OT.DES Bits 3-5 File description (as defined in FI.DES) OT.PRO Bits 6-8 Processing mode (as defined in FI.PRO) OT.ORG Bits 9-10 File organization (as defined in FI.ORG) OT.RAF Bits 11-12 Record address format (as defined in FI.RAF) OT.DEV Bits 13-16 File device (as defined in FI.DEV) OT.EOF Bit 17 EOF option (as defined in FI.EOF) OT.BLK Bits 18-35 Blocking factor Word 6: OT.KYP Bits 0-11 Key position within record OT.SEQ Bits 12-13 Sequence checking (as defined in FI.SEQ) OT.BUF Bits 14-19 Tape buffer offset OT.AST Bits 20 ASCII file option OT.REW Bits 21-22 Tape rewind option (as defined in FI.REW) OT.EXT Bits 23-28 Number of extents OT.ADD Bits 29-30 File addition option (as defined in FI.ADD) OT.KYL Bits 31-35 Length of key field RUNTIME SYSTEM INTERNAL TABLE STRUCTURE Page 5-3 Word 7: OT.OVI Bits 0-7 Overflow indicator OT.EXI Bits 8-15 External conditioning indicator OT.OVL Bits 16-21 Overflow line OT.CHN Bits 32-35 Psuedo-channel number assigned to file Word 8: OT.CRS Bits 0-17 Core index size (not supported) OT.BSZ Bits 18-35 Buffer size in words Word 9: OT.BSC Bits 0-17 Buffer size in characters OT.LAS Bit 18 "I am the last OTFTAB entry" flag OT.LPP Bits 19-25 Lines per page 5.3 FTBTAB - THE CBLIO FILE TABLE FTBTAB is generated to be compatible with the CBLIO module, which does all of the actual I/O for the runtime system. A bare minimum of explanation is given here, as little trouble should ever be experienced with this table. It should be kept in mind that all items defined below are used by RPG II but are defined only for CBLIO compatibility. More complete documentation may be found in CBLIO.MAC. In addition to the 32 word entry defined below, there is also a 32 word DEVTAB preceding each FTBTAB entry. This DEVTAB area is used only by CBLIO, thus the compiler merely outputs zeroes for this area. Documentation on the contents of DEVTAB can also be found in CBLIO.MAC. Words 1-5: FT.FNM The filename used within the users program in SIXBIT. This is not the physical filename that a LOOKUP is done on, but rather the descriptive filename given by the user. Used for error messages. Word 6: FT.CVR Bits 0-5 Compiler version number FT.BLC Bit 6 Buffer location is assigned FT.SDF Bit 7 SORT descriptor flag FT.NOD Bits 8-17 Number of devices FT.DNM Bits 18-35 Pointer to first device name Word 7: FT.NFL Bits 0-4 Number of file limits FT.PMT Bits 5-17 File position on Mag-tape RUNTIME SYSTEM INTERNAL TABLE STRUCTURE Page 5-4 FT.NFT Bits 18-35 Pointer to next file table Word 8: FT.NAB Bits 0-4 Number of alternate buffers FT.MRS Bits 5-17 Maximum record size FT.RRC Bits 18-35 Records between RERUN dump Word 9: FT.VLR Bit 0 Variable length EBCDIC records FT.NSL Bit 2 Non-standard labels FT.STL Bit 3 Standard labels FT.IOF Bit 6 Input/output file FT.DDM Bits 7-9 Device data mode: 0 = SIXBIT 3 = EBCDIC 1 = Binary 4 = ASCII-8 2 = ASCII 5-7 = Unused FT.RRE Bit 10 RERUN dump at end-of-reel FT.RCR Bit 11 RERUN on record count FT.OPT Bit 13 File is optional FT.CDM Bits 14-15 Core data mode: 0 = SIXBIT 1 = Binary 2 = ASCII 3 = EBCDIC FT.MOD Bits 16-17 File I/O mode: 0 = Sequential 1 = Random 2 = ISAM 3 = Unused FT.REC Bits 18-35 Address of record area Word 10: FT.NLS Bits 0-17 Non-standard label size FT.FSD Bits 18-35 Link to file that shares same device Word 11: FT.BKF Bits 6-17 Blocking factor FT.ACK Bits 18-35 Address of actual key table Word 12: FT.VID Bits 0-35 Byte pointer to value-of-id Word 13: FT.VDW Bits 0-35 Byte pointer to value-of-date-written Word 14: FT.SBA Bits 0-17 Link to file that shares the same buffer area FT.EUP Bits 18-35 Address of error-use procedure RUNTIME SYSTEM INTERNAL TABLE STRUCTURE Page 5-5 Word 15: FT.BBR Bits 0-17 Address of before-beginning-reel procedure FT.BBF Bits 18-35 Address of before-beginning-file procedure Word 16: FT.ABR Bits 0-17 Address of after-beginning-reel procedure FT.ABF Bits 18-35 Address of after-beginning-file procedure Word 17: FT.BER Bits 0-17 Address of before-ending-reel procedure FT.BEF Bits 18-35 Address of before-ending-file procedure Word 18: FT.AER Bits 0-17 Address of after-ending-reel procedure FT.AEF Bits 18-35 Address of after-ending-file procedure Word 19: FT.DNS Bits 0-2 Mag-tape density: 0 = System standard 1 = 200 BPI 2 = 556 BPI 3 = 800 BPI 4 = 1600 BPI FT.PAR Bit 4 Mag-tape parity: 0 = Odd 1 = Even FT.OUP Bit 5 Open use-procedure when enter fails FT.PPN Bits 18-35 Pointer to PPN Word 20: FT.BSK Bits 0-35 Byte pointer to symbolic key Word 21: FT.BRK Bits 0-35 Byte pointer to record key Word 22: FT.KTY Bits 15-17 ISAM key type: 0 = Non-numeric 1 = Numeric display < 11 digits 2 = Numeric display > 10 digits 3 = COMP < 11 digits 4 = COMP > 10 digits 5 = COMP-1 FT.KSG Bit 20 ISAM key is signed FT.KLB Bits 24-35 ISAM key length in bytes Word 23: RUNTIME SYSTEM INTERNAL TABLE STRUCTURE Page 5-6 FT.OWA Bits 0-8 ISAM owner write access. Rightmost 4 bits correspond to Read, Rewrite, Write and Delete privledges. FT.OTA Bits 9-17 ISAM other write access. Same bit assignments as FT.OWA. FT.RTC Bits 18-35 ISAM retained record count Word 24: FT.PFS Bits 0-35 Byte pointer to file-status Word 25: FT.PEN Bits 0-35 Byte pointer to error-number Word 26: FT.PAC Bits 0-35 Byte pointer to action-code Word 28: FT.PID Bits 0-35 Byte pointer to value-of-id Word 28: FT.PBN Bits 0-35 Byte pointer to block-number Word 29: FT.PRN Bits 0-35 Byte pointer to record-number Word 30: FT.PFN Bits 0-35 Byte pointer to file-name Word 31: FT.PFT Bits 0-35 Byte pointer to file-table Word 32: FT.LHL Bits 0-35 Pointer to low,,high file limit 5.4 ICHTAB - THE INPUT CHAIN TABLE ICHTAB contains entries chained together much as the DATAB items were; the chaining path defines a data structure representing the users input specifications. Each of the 7 word entries contains 2 pointers of interest; the first is IC.NXR which points to the next record level item in the chain; the second is IC.NXF which points to the next field level item in the chain. In both cases, a pointer of zero terminates the chain. RUNTIME SYSTEM INTERNAL TABLE STRUCTURE Page 5-7 The remainder of the entries are defined below: Word 1: IC.DES Bits 0-35 Byte pointer to assigned core location Word 2: IC.RII Bits 0-17 Pointer to IDTTAB record identifying indicator chain IC.NXF Bits 18-35 Pointer to next field level item Word 3: IC.NXR Bits 0-17 Pointer to next record level item IC.ARP Bits 18-35 Pointer to array this item references Word 4: IC.INP Bits 0-17 Pointer to array index (or array index itself if IC.IMD = 1 Word 5: IC.FMN Bits 0-7 Minus field indicator IC.FBZ Bits 8-15 Blank/zero field indicator IC.FPL Bits 16-23 Plus field indicator IC.CLI Bits 24-31 Control level indicator IC.NPS Bits 32-33 Number per sequence (same as DA.NPS) IC.FLD Bits 34-35 Field type (same as DA.FLD) Word 6: IC.FRR Bits 0-7 Field record relation indicator IC.MAT Bits 8-15 Matching indicator IC.RTR Bit 16 Record type required IC.LHI Bit 17 Look ahead item IC.STS Bits 18-20 MFCU stacker select IC.SIZ Bits 21-32 Size of field IC.SEQ Bits 33-34 Sequence check option (same as DA.SEQ) IC.IMD Bit 35 Immediate array reference Word 7: IC.SRC Bits 0-11 Character position in source IC.OCC Bits 12-26 Number of occurs for array item IC.FMT Bits 27-31 Data format (same as DA.FMT) RUNTIME SYSTEM INTERNAL TABLE STRUCTURE Page 5-8 5.5 OCHTAB - THE OUTPUT CHAIN TABLE OCHTAB is the direct counterpart of ICHTAB, but for the output specifications. OCHTAB is linked in the same manner as ICHTAB, but each 7 word entry contains information pertaining to output records and fields. Each entry is defined as follows: Word 1: OC.IDX Bits 0-17 Pointer to array index OC.NXR Bits 18-35 Pointer to next record level item in chain Word 2: OC.NXF Bits 0-17 Pointer to next field level item in chain OC.IND Bits 18-35 Pointer to conditioning IDTTAB chain Word 3: OC.SRC Bits 0-35 Pointer to data source Word 4: OC.FLD Bits 0-1 Field type (same as DA.FLD) OC.SIZ Bits 2-13 Size of field OC.DEC Bits 14-17 Number of decimal positions in field OC.STP Bits 18-29 Sterling position (not supported) OC.PRI Bit 30 MFCU print & punch (not supported) OC.PRO Bit 31 MFCU print only (not supported) OC.STR Bit 32 Sterling sign (not supported) OC.ORT Bits 33-34 Output record type (same as DA.ORT) OC.ADD Bit 35 Add a record Word 5: OC.FOV Bit 0 Forced overflow OC.SKB Bits 1-7 Skip before line number OC.SKA Bits 8-14 Skip after line number OC.SPB Bits 15-16 Space before count OC.SPA Bits 17-18 Space after count OC.END Bits 19-30 Field end position in output record OC.STS Bits 31-34 MFCU stacker select OC.IMD Bit 35 Array index is immediate Word 6: OC.OCC Bits 0-14 Number of occurs of array/table OC.EDT Bits 15-18 Edit code (same as DA.EDT) OC.LTF Bit 19 Literal only output flag OC.LSZ Bits 20-28 Size of literal OC.RSV Bits 29-32 Reserved word code (same as DA.RSV) OC.BLA Bit 33 Blank this field after printing OC.TAB Bit 34 "This is a table" flag Word 7: RUNTIME SYSTEM INTERNAL TABLE STRUCTURE Page 5-9 OC.ARP Bits 0-17 Pointer to array this item references OC.EDP Bits 18-35 Pointer to edit word/literal 5.6 ARRTAB - THE ARRAY LOAD/DUMP TABLE ARRTAB is generated for use by the runtime system whenever a table or array must be loaded or dumped by the runtime system. This table consists of a series of 4 word entries each defining a table that is to loaded or dumped. The entries are set up as follows: Word 1: AR.PNT Bits 0-35 Byte pointer to array/table Word 2: AR.SIZ Bits 0-9 Size of array entry AR.OCC Bits 10-19 Number of occurs of the array/table AR.EPR Bits 20-29 Number of entries per record AR.LDM Bit 30 Dump/Load flag: 0 = Load 1 = Dump AR.LAs Bit 31 "This is the last entry" flag Word 3: AR.FIL Bits 0-17 Link to OTFTAB entry for file this loads/dumps from/to AR.ASZ Bits 18-27 Size of alternating table/array (if any) Word 4: AR.ALT Bits 0-35 Byte pointer to Alternate table/array (if any) APPENDIX A REFERENCE TABLES A.1 INDICATOR VALUES In both the compiler and the runtime system, all indicators are referenced by the numbers described below: Indicator Octal Value _________ _____ _____ 01-99 1-143 H1-H9 144-154 L1-L9 155-165 LR 166 OA-OG 167-175 OV 176 M1-M9 177-207 MR 210 L0 211 1P 212 U1-U8 213-222