我有角色扮演游戏程序。有没有人解释一下这段代码。我在这个程序中有输入文件。输出文件包含一些输入数据中不存在的数据,例如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
我必须知道如何从输入文件生成输出文件?
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
。