RPG的定义

问题描述 投票:0回答:1

我有角色扮演游戏程序。有没有人解释一下这段代码。我在这个程序中有输入文件。输出文件包含一些输入数据中不存在的数据,例如ACCS、ACCT、ACC11。我想了解它们在输入中的位置?

01010H
01050FINPUT   IP  F9000  90            DISK30
01070FOUT     O   F9000  90            DISK30
01070FSYS008  O   F 132 132     OF    LPRINTER
01050FDISPFIL D   F     120            CONSOLE
02010E                    RK1         9  1 0 RK2     1 0
02010E                    RK3         9  3 0 RK4     1
01070LSYS008    101 5612
07010IINPUT   NS  02
07022I                                        1   5 BR
07022I                                        6   80GR00
07022I                                        9  180ACC00
07022I                                       19  280ACCS
07022I                                       29  380ACCT
07022I                                       39  480ACC11
07022I                                       49  68 TABN00
07022I                                       71  75 CBI1
07022I                                       76  80 CBI2
07022I                                       71  85 CBI3
07022I                                       86  90 CBI4
07030I                                        1  90 REC1
01020IDATEU       DS                              8
03020I                                        1   2 DAYU
03020I                                        3   3 SEP1
03020I                                        4   5 MONTHU
03020I                                        6   6 SEP2
03020I                                        7   8 YEARU
04050C****************************************************
04050C  N20                EXSR Y2K
04050C****************************************************
06100C  N80                SETON                     80
04060C      66             GOTO AAA
05030C           CCC       TAG
05030C                     SETOF                     62
05040C  N66                MOVEL'BRANCH'  A10    13
05050C  N66                MOVE 'LIMIT '  A10
05060C  N66                MOVEL'FORMAT=' A12    14
05070C  N66                MOVE 'BBBBB E' A12
05070C  N66                MOVELA12       A16    18
05070C  N66                MOVE 'EEEE'    A16
05080C  N66                MOVELA10       A14    31
05090C  N66                MOVE A16       A14
05090C  N66                MOVEL'        'A56    24
05090C  N66                MOVEL'FOR LIST'A66    16
05090C  N66                MOVE '  SGB26B'A66
05090C  N66                MOVE A66       A56
05090C  N66                MOVELA14       A45    55
05090C  N66                MOVE A56       A45
05110C  N66                MOVE '       ' A15    11
05110C  N66                MOVEL'    '    A15
05130C  N66      A45       DSPLYDISPFIL   A15
05140C  N66                MOVELA15       FROM    5
05150C  N66                MOVE A15       TO      5
05160C  N66      FROM      COMP '99999'                  70
05170C  N66 70   TO        COMP '99999'                  71
05170C  N66 70 71          SETON                         LR
05180C*     71             GOTO END1
06010C  N66      FROM      COMP TO                   H1
06020C   H1                MOVEL'REFER   'A10
06030C   H1                MOVE '  H1    'A10
06040C   H1                DSPLYDISPFIL   A10
06050C   H1                GOTO CCC
06100C  N66                SETON                     66
06070C           AAA       TAG
06080C   02                SETOF                     6562
06080C   02      BR        COMP FROM                 63  63
06090C   02 63   BR        COMP TO                   626464
06100C   02 63 64          SETON                     65
06102C   02 62             SETOF                     66
06104C   02 62             GOTO CCC
06080C   02      GR00      COMP 520                      75
06080C   02N75   GR00      COMP 550                      75
06070C           END1      TAG
04050C****************************************************
04050C****************************************************
07030CSR         Y2K       BEGSR
04050CSR                   CALL 'DATT2'                10
04050CSR                   PARM           DATEU
07030CSR                   SETON                       20
07030CSR                   MOVE 'Z'       SEP1
07030CSR                   MOVE 'Z'       SEP2
07030CSR                   ENDSR
04050C****************************************************
24010OSYS008  H 1101  N80
24010O       OR        OF
24020O                                   20 ' #= 13  S.-UX-/A.'
24020O                         PAGE  Z   28
24020O                                   33 'V%JC'
24020O                         YEARU     38
24020O                                   39 'Z'
24020O                         MONTHU    41
24020O                                   42 'Z'
24020O                         DAYU      44
24020O                                   51 '>X''<|('
24020O                                   75 'V#B V#<J|A.'
24020O                                   94 'Y<W(<A%V''<RBV#U#%R'
24020O                                  130 'V(HB'
24020O                         BR       125
30220O        H 11    N80
24010O       OR        OF
31040O*                                 132 'V(HB#M'
31040O                                  124 ':(<A%VU''N'
31040O                                  105 'VU''N''AV''<RB'
31080O                                   75 'GU''BV''<RB'
31080O                                   50 'S<X<+V''<RB'
31080O                                   36 'V#BV#<J|A.SX''?.'
31080O                                    5 '#.#H|'
30220O        H  1    N80
24010O       OR        OF
31040O*                                 132 '------'
31040O                                  124 '---------'
31040O                                  105 '-----------'
31080O                                   75 '-----------'
31080O                                   50 '---------'
31080O                                   36 '-----------'
31080O                                    5 '-----'
30220O        D 11     02 65N75
31040O*                        BRN      130 '0    '
31040O                         GR00     120
31040O                         ACC00    105
31040O                         ACCS      75 '0    -  -   '
31040O                         ACCT      50 '0    -  -   '
31040O                         ACC11     36 '0    -  -   '
31040O                         TABN00    25
31080O*                        CONT       4
31080O*                24                 3 '24'
31080O*               N24                 3 'N24'
24010OOUT     D        02 65N75
24020O                         REC1      90

我必须知道如何从输入文件生成输出文件?

rpg
1个回答
0
投票

TLDR;该程序提示输入起始行号和结束行号,并打印输入中

BR
位于用户输入的起始行号和结束行号之间的所有记录。不打印 GR00 = 520 或 550 的记录。它还将打印的记录写入名为
OUT
的磁盘文件。


这是非常古老的RPG,也许是RPG II,可能来自真正的S36。它无法在现代 IBM 中端机上编译,甚至不能在 AS/400 上编译(自 1990 年代以来就不再销售)。

尽管如此,我可以告诉你一些事情。您为输入记录定义的字段。我知道这一点是因为输入记录格式是程序定义的。

这是输入记录的定义:

07010IINPUT   NS  02
07022I                                        1   5 BR
07022I                                        6   80GR00
07022I                                        9  180ACC00
07022I                                       19  280ACCS
07022I                                       29  380ACCT
07022I                                       39  480ACC11
07022I                                       49  68 TABN00
07022I                                       71  75 CBI1
07022I                                       76  80 CBI2
07022I                                       71  85 CBI3
07022I                                       86  90 CBI4
07030I                                        1  90 REC1    

第一行命名文件,以及读取记录时打开(设置为 true)的指示器(布尔值)。其余行是记录格式中的字段。这些数字表明记录中字段的位置和长度(作为起始位置和结束位置)。有些像 GR00 有一个额外的 0,而其他则没有。这个额外的 0 是小数位数,表示该字段是数字还是字符,而且在这种情况下,数字格式是分区十进制,这意味着数字在内存中每字节存储一位数字。这些将出现在内存转储(如 12345)或十六进制转储(如 F1 F2 F3 F4 F5)中。另请注意,最后一行

REC1
上的字段似乎与其他字段重叠,因为它的起始位置为 1,而终止位置为 90。这在 RPG 中是完全合法的。

然后有一些日期内容,用于将我猜测的当前日期放入报告标题中。至少这是唯一使用字段的地方。

接下来是一些提示起始行和终止行的代码:

06100C  N80                SETON                     80
04060C      66             GOTO AAA
05030C           CCC       TAG
05030C                     SETOF                     62
05040C  N66                MOVEL'BRANCH'  A10    13
05050C  N66                MOVE 'LIMIT '  A10
05060C  N66                MOVEL'FORMAT=' A12    14
05070C  N66                MOVE 'BBBBB E' A12
05070C  N66                MOVELA12       A16    18
05070C  N66                MOVE 'EEEE'    A16
05080C  N66                MOVELA10       A14    31
05090C  N66                MOVE A16       A14
05090C  N66                MOVEL'        'A56    24
05090C  N66                MOVEL'FOR LIST'A66    16
05090C  N66                MOVE '  SGB26B'A66
05090C  N66                MOVE A66       A56
05090C  N66                MOVELA14       A45    55
05090C  N66                MOVE A56       A45
05110C  N66                MOVE '       ' A15    11
05110C  N66                MOVEL'    '    A15
05130C  N66      A45       DSPLYDISPFIL   A15
05140C  N66                MOVELA15       FROM    5
05150C  N66                MOVE A15       TO      5
05160C  N66      FROM      COMP '99999'                  70
05170C  N66 70   TO        COMP '99999'                  71
05170C  N66 70 71          SETON                         LR
05180C*     71             GOTO END1
06010C  N66      FROM      COMP TO                   H1
06020C   H1                MOVEL'REFER   'A10
06030C   H1                MOVE '  H1    'A10
06040C   H1                DSPLYDISPFIL   A10
06050C   H1                GOTO CCC
06100C  N66                SETON                     66
06070C           AAA       TAG

这段代码提示输入开始和结束行号,我怀疑BR包含输入文件中的行号,并将其返回到变量

FROM
TO
中的程序。如果
FROM
TO
均为 99999,则程序结束,如果
FROM
大于
TO
,则程序显示错误消息并重试。

最后是你感兴趣的部分:

06080C   02                SETOF                     6562
06080C   02      BR        COMP FROM                 63  63
06090C   02 63   BR        COMP TO                   626464
06100C   02 63 64          SETON                     65
06102C   02 62             SETOF                     66
06104C   02 62             GOTO CCC
06080C   02      GR00      COMP 520                      75
06080C   02N75   GR00      COMP 550                      75
06070C           END1      TAG

记住我说指示器 02 在读取每个记录时打开,这些行仅在读取记录时使用(当 02 打开时)第一行设置更多指示器 62 和 65。下一行比较

BR
FROM
并在
BR
>=
FROM
时打开指示器 63。下一行将
BR
TO
进行比较,如果
BR
是 <=
TO
,则打开指示器 64。如果
BR
>
TO
,则指示灯 62 点亮。如果指示灯 63 和 64 都打开,接下来打开指示灯 65。这会在
FROM
<=
BR
<=
TO
时发生。如果此后指示灯 62 亮起,我们将关闭指示灯 66 并返回到提示代码。

注意提示代码由 66 指示器决定。仅当指示灯 66 熄灭时才运行。

还有一些代码可以过滤掉字段

GR00
= 520 或 550 的输入行。

接下来是报告的更多日期代码和标题信息。那么这两个输出规格:

30220O        D 11     02 65N75
31040O*                        BRN      130 '0    '
31040O                         GR00     120
31040O                         ACC00    105
31040O                         ACCS      75 '0    -  -   '
31040O                         ACCT      50 '0    -  -   '
31040O                         ACC11     36 '0    -  -   '
31040O                         TABN00    25
31080O*                        CONT       4
31080O*                24                 3 '24'
31080O*               N24                 3 'N24'
24010OOUT     D        02 65N75
24020O                         REC1      90

第一个是

SYS008
的一部分,第二个是文件OUT(这是一个磁盘文件)。为读取的每条记录打印详细信息。当指示器65打开并且指示器75关闭时,这些行被写入它们各自的文件。字段上没有计算,它们只是从输入中读取,然后写入输出。磁盘文件获取整个记录,打印文件获取选定字段,具体为:
GR00
ACC00
ACCS
ACCT
ACC11
TABN00

© www.soinside.com 2019 - 2024. All rights reserved.