thumb | right | alt=alt=Refer to caption | IBM System/3 model 10
RPG II is a very early and popular version of the IBM RPG programming language.
It was developed in the late 1960s and designed to work on the smallest IBM systems of the time such as the IBM 1130, IBM System/3, System/32, System/34, System/36. It was also available for the System/370, The Singer System 10, Sperry Univac 90/25, 90/30, 90/40, System 80, 1100 mainframe series and the Wang VS Series. ICL produced versions for its ICL 2903 system and for VME/K; and Burroughs Corporation produced an RPG II compiler with database extensions for its B1700 series of computers. Digital Equipment Corporation had their own implementation named VAX RPG II for VAX/VMS systems.
An enhanced version RPG III appeared in 1978.
It has a number of unusual features, including: an implied processing loop; and that it is a fixed-format programming language, so that programs are difficult to read without a special debugging template. used as an aid to read program printouts.
Every RPG II program executes within an implied loop, the program cycle, which applies the program successively to every record of a file - this is documented via a "Logic Flow" diagram on the debugging template.
|-
| H || Header spec is at the top of the program and describes compiler options such as maximum compile size, whether the program is an MRT (Multiple Requestor Terminal) program, and what type of listing is generated when the program is compiled. The object name of the program created is located in columns 75–80; if a source does not have an H spec, the name RPGOBJ is used.
|-
| F || File spec(s) are next, and describes the files used in the program. Files may be disk files (DISK) or may be devices such as a printer (PRINTER), the workstation (WORKSTN), keyboard (KEYBORD), unformatted display (CRT or DISPLAY), or user-defined (SPECIAL). Record size, block size, overflow indicators, and external indicators are described. It is possible that an RPG program will not use any F specs.
|-
| E || Extension spec(s) are next, and describe arrays and tables, which may be prefetched from disk files (an Input table), drawn from constants placed at the end of the source between ** and /* symbols, or built from calculations.
|-
| L || Line Counter spec(s) are next, and if present, describe the form to be printed. It defines the number of lines in a page and the positions where printing begins and ends.
|-
| I || Input specs are next, and describe the data areas within files. RPG II permits redefinition of data areas so that a field named FLDA might occupy the same area as an array AR that contains 8 elements of 1 character each. Non-record areas such as data structures can be described. Depending on the values of the input record, indicators may be conditioned.
|-
| C || Calculation spec(s) are next. Total fields may be described and accumulated. Complex computations and string manipulations are possible. Indicators may be conditioned.
|-
| O || Output specifications, which describe the output record in terms of fields and output positions.
|}
Operation codes appear in columns 28–32 of an RPG-II calculation specification.
{| class="wikitable sortable" border="1"
|-
! Operation code
! Name
|-
| ADD
| Add
|-
| SUB
| Subtract
|-
| MULT
| Multiply
|-
| DIV
| Divide
|-
| Z-ADD
| Zero and Add
|-
| Z-SUB
| Zero and Subtract
|-
| MVR
| Move Remainder
|-
| MOVE
| Move
|-
| MOVEL
| Move Left
|-
| MHLZO
| Move High to Low Zone
|-
| MLHZO
| Move Low to High Zone
|-
| MLLZO
| Move Low to Low Zone
|-
| MHHZO
| Move High to High Zone
|-
| BITON
| Bit On
|-
| BITOF
| Bit Off
|-
| TESTB
| Test Bit
|-
| GOTO
| Go To
|-
| TAG
| Tag (destination of a GOTO)
|-
| EXSR
| Execute Subroutine
|-
| BEGSR
| Begin Subroutine
|-
| ENDSR
| End Subroutine
|-
| SETON
| Set On
|-
| SETOF
| Set Off
|-
| EXCPT
| Exception
|-
| EXIT
| Exit
|-
| RLABL
| Redefine Label
|-
| ULABL
| User Label
|-
| CALL<sup>1</sup>
| Call
|-
| PARM<sup>1</sup>
| Parameter
|-
| CHAIN
| Chain
|-
| READ
| Read
|-
| READE
| Read Equal
|-
| READP
| Read Previous
|-
| REDPE
| Read Previous Equal
|-
| SETLL
| Set Lower Limits
|-
| SET
| Set
|-
| TIME
| Time of day (000000-235959)
|-
| DSPLY
| Display
|-
| SORTA
| Sort Array
|-
| XFOOT
| Crossfoot
|-
| MOVEA
| Move Array
|-
| LOKUP
| Lookup (find in array)
|}
- CALL/PARM was added to RPG II with Release 6.0 (also known as the VASP).
CHAIN retrieves the record in the indexed file named in Factor 2 that matches the exact key specified by the value in Factor 1.
SETLL causes the index pointer for the file named in Factor 2 to be positioned at the location specified by the value in Factor 1.
SORTA causes the named array to be sorted in place; that is, the elements appear in order.
Z-SUB calculates Factor 2 with opposite sign and moved to result field.
XFOOT causes an array to be summed and the result moved to result field.
MVR must follow a DIV operation. The integer remainder of the DIV operation is placed in the result field. MVR following the DIV operation for "56 divided by 3" would place the value 2 in the result field.
Indicators
Indicators are either 'set' or not, they are "flags" or boolean data types.
- Generic, usually manually set, for custom usage within I, C and O specs of a program:
:: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
:: 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
:: 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
:: 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
:: 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
- Halt Indicators, manually set within the calculation C-specs, to terminate a program with a return code:
:: H1 H2 H3 H4 H5 H6 H7 H8 H9
- Matching Indicators, assigned to input I-spec fields, automatically set when reading records from a file, to coordinate the hierarchy of and signal which fields (variables) within records from two or more files are synchronized, assuming a sorted order of the records within each file, the records being processed sequentially:
:: M1 M2 M3 M4 M5 M6 M7 M8 M9, and which reflects that matching has occurred
- Control-Level Indicators, assigned to input I-spec fields, to coordinate the hierarchy of and signal which fields within a record from a file are grouped, assuming a sorted order of the records within a file, the records being processed sequentially:
:: L0 L1 L2 L3 L4 L5 L6 L7 L8 L9
- Command Key Indicators, to signal to the program processing input from a workstation keyboard, equivalent to the function keys (, and ) on a PC keyboard, used instead of the key:
:: KA KB KC KD KE KF KG KH KI KJ KK KL KM KN KP KQ KR KS KT KU KV KW KX KY
:: These indicators refer to command keys 1 to 24, in that order. Note that there is no indicator.
- First Cycle Indicator, set automatically upon output of the first page, mainly used for printer files, used similarly to an overflow indicator for controlling output like page breaks and headings:
:: 1P
- Overflow Indicators, tripped automatically processing the pagination limits of a printer output file, per each file's L-spec line counter, and may be set manually, too. Usually establishing page breaks and printing of headings. One indicator each, for up to 8 output files:
:: OA OB OC OD OE OF OG OV
- Last Record Indicator, not to be confused with Control-Level indicators, terminates a program, to return control to the batch processing jobstream (script), set automatically when end-of-file is reached on a sequentially processed file, manually set to terminate a program that has no sequential process source (file):
:: LR
- External Indicators, generic for custom usage, passed to the program from the jobstream control (script) batch file:
:: U1 U2 U3 U4 U5 U6 U7 U8
Foldable sheets, templates, plastic coated against wear and staining, were available, summarizing the different specifications. Used for the visual inspection and verification of the fixed-format source code text when held against its printed output. They matched and aligned with the then standard spacing of the text, as drawn from the original usage of punched cards:
{| class="wikitable" border="1" width="25%"
|+ System/36 SEU templates
|-
| 3
| H || header
|-
| 5
| F || files
|-
| 6
| F || extensions
|-
| 7
| E || extensions
|-
| 8
| L || line counters
|-
| 10
| I || file
|-
| 11
| I || fields
|-
| 12
| C || calculation
|-
| 13
| O || file
|-
| 14
| O || fields
|}
Sample code
<pre>
F***************************************************************
F* THIS PROGRAM READS THE CONTENTS OF AN INVOICE HEADER FILE
F* AND PRINTS THE INVOICES PROCESSED FOR THE DATE SET IN THE
F* LOCAL DATA AREA. THERE ARE LEVEL BREAKS AND TOTALS FOR
F* EACH STORE.
F***************************************************************
F*
FINVHDR IP F 62 DISK
FPRINTER O F 132 OF PRINTER
IINVHDR NS 01 1NC
I 1 3 STORE L1
I 4 13 INVNO
I 14 20 CUSTNO
I 21 45 STNAM
I 46 53 INVDAT
I 54 622TOTINV
I UDS
I 1 8 RPTDAT
C 01 INVDAT COMP RPTDAT 11
C 01 11 ADD TOTINV L1TOT 92
C 01 11 ADD TOTINV LRTOT 92
OPRINTER H 101 1P
O OR OF
O PAGE Z 106
O 102 'PAGE'
O 59 'VERY BIG'
O 72 'STORES, INC.'
O UDATE Y 17
O 8 'RUN DATE'
O H 1 1P
O OR OF
O 73 'DAILY SALES BY STORE'
O H 2 1P
O OR OF
O RPTDAT 83
O 63 'FOR DATE:'
O H 1 1P
O OR OF
O 6 'STORE'
O 18 'INVOICE'
O 28 'CUSTOMER'
O 58 'CUSTOMER'
O 78 'INVOICE'
O H 2 1P
O OR OF
O 6 'NUMBER'
O 18 'NUMBER'
O 28 'NUMBER'
O 58 'NAME'
O 78 'TOTAL'
O D 0 L1
O STORE 6
O D 1 01 11
O INVNO 18
O CUSTNO 28
O STNAM 58
O TOTINV1B 78
O T 1 L1
O 45 'STORE TOTAL...'
O L1TOT 1B 78
O T 1 LR
O 45 'GRAND TOTAL...'
O LRTOT 1 78
</pre>
References
External links
- System/36-Compatible RPG II - User's Guide and Reference
- Wiki Midrange
