Setting the timezone by patching the system with RAMROD and *OBJUTIL
D6.0A uses the US Eastern Standard timezone by default. In this post we will look at how to set the timezone to something different, which will lead us on to how to patch the system using the RAMROD and OBJUTIL utilities.
The TABLES assembly
As MTS was run on a small number of mainframes, the timezone is set inside the resident code of the system rather than by a command. The relevant code is TABLES; you can see the source assembly code in UMPS:UMTABLES#SA
...
359 SET YEAR=87,TIMEZONE=EST
...
which references a macro in copy:tables*sal
1500 MACRO
1501 TIMEZONE &Z
...
1517 .L4 AIF ('&Z' NE 'EST' AND '&Z' NE 'CDT').L5
1518 TIMEZONE DC H'-300' EASTERN STANDARD OR CENTRAL DAYLIGHT
1519 AGO .OUT
...
Normally you would change the code, assemble it and reboot. But this requires the ASMH
assembler, which is a licensed IBM product that cannot be distributed with MTS. The alternative, which we will look at here, is to patch the object code with the desired value.
Roadmap
An overview of the steps we will take
- Use
RAMROD
to extract theTABLES
deck to a file - Use
*OBJUTIL
to patch the file, adding a new ‘card’ to change the timezone - Use
RAMROD
again to incorporate the file into the deck - Reboot and enjoy the correct time
RAMROD
RAMROD
is used to keep track of a set of object decks and combine these into a file suitable for IPL. ‘Decks’ refers to the older practice of using a deck of punched cards to boot the system; on MTS thankfully this is done using files stored on disk.
A set of object decks is combined into a system. You can see the systems currently defined, and the current system, with the list systems
and list current
commands in RAMROD
. RAMROD
can be run as the MTS
user as follows; RAMROD
commands are given at the ~
prompt:
# $run mts:ramrod
Using file "RMRD:ROD"
Proceed.
~ list systems
D6.0A-AN172 created from AN152 23:05:42 01-17-12
AN152 created from AN062 23:29:05 01-15-12
AN062 created from AN052 01:13:12 01-06-12
AN052 created from D6.0SYS.600/MP 19:49:40 01-05-84
...
~ list current
D6.0A-AN172 created from AN152 23:05:42 01-17-12
Patch the timezone name and timezone offset in TABLES to be EST
and GMT minus 5 rather than EDT and GMT minus 4. (jco)
So we can see the current system is D6.0A-AN172
, the comment made when creating the system (which was to set the timezone to EST) and the history of previous systems.
You can see a list of decks that make up the system with list decknames
; a snippet is below:
~ LIST DECKNAMES
CONFIG.CARD.MP (DEC08-86)
CONFIG.CARD.COMMENTS (AUG16-85)
LOWCORE.DEFS.MP (SEP11-87)
SEG0.NCA (SEP17-81)
UMLOADTV (NOV20/79)
TABLES.MP (AN172) patched
...
TABLES.MP
is the deck we want. We can see a list of the patches already applied in the below:
~ list sys cur deck tables.mp patches
TABLES.MP (AN172) patched changed
REP 004088 0400030001,00000240,00000030,000002A0,00000180 Rearrange OPERDEVS 01:26:36 01-06-12 MTS.
REP 000180 01F1F0F5F2 CON1 IS A 1052 01:26:51 01-06-12 MTS.
REP 003F8A 04,FED4 Make the timezone offset -300 (GMT minus 300 minutes or 5 hours)
REP 003F8C 04,C5E2E340 Make the timezone name "EST"
What we want to do is extract the TABLES.MP
deck to a file, so we can edit it outside the system using *OBJUTIL
. Use the copy
command to do this; let’s store this to the temporary file -tables
:
~ copy current tables.mp -tables
Exit RAMROD
for now with stop
.
*OBJUTIL
*OBJUTIL
is used to edit a deck. Pass the file to be edited as unit 0:
# $run *objutil 0=-tables
OBJUTIL VERSION(PR137) 08:22:26 10-21-14
*
*OBJUTIL
accepts commands at the *
prompt. First, let’s get a listing of the values in the deck using the map
command:
* map
Symbol Type Esid Address Length AF
Module: TABLES Size = 0041C8
TABLES SD 0001 000000 003E0E $HSPMNDV LD 0040FC 0004
...
TIMEZONE LD 003F8A 0004 TIMZONTB LD 003F94 0004
...
The timezone is encoded as a half-word (16 bit) offset in minutes from GMT followed by a 8 character string giving the timezone name. We can use the display
command to see the current values, using the type
and length
modifiers:
* display@type=h timezone
TIMEZONE 'H' -300
* display@type=c@len=8 timezone+2
TIMEZONE+2 'C' "EST "
We’ve confirmed the current setting is GMT minus five hours, name “EST” padded with blanks. Let’s now set it to the value we want; I’m going to use plain GMT which is zero offset but you could use any positive or negative value. Use the modify
command with the @repgen
modifier to create a REP
card to set each part of the value
* modify@repgen timezone H'0'
TIMEZONE WAS 'H' -300 NOW 'H' +0
Enter comment for REP card:
? Set timezone to GMT
* modify@repgen timezone+2 C'GMT '
TIMEZONE+2 WAS 'C' "EST " NOW 'C' "GMT "
Enter comment for REP card:
? Set timezone name to GMT
A REP
cards means we are adding a line to change the object file rather than changing the existing contents of the file. Note that it prompts for a comment after each change; terminate this with a blank line.
To be sure, we can now display the new values;
* display@type=h timezone
TIMEZONE 'H' +0
* display@type=c@len=8 timezone+2
TIMEZONE+2 'C' "GMT "
Use stop
to get out of *OBJUTIL
.
Back to RAMROD
Run RAMROD
again and create a new system from the current system to incorporate your changes:
# $run mts:ramrod
Using file "RMRD:ROD"
Proceed.
~ create D6.0A-CT214
** Fromsystem = "D6.0A-AN172"
& OK
? ok
Enter comments:
? 2014-10-21 Modify timezone
The new system name D6.0A-CT214
needs some explanation. The D6.0A
is obvious; the CT214
comes from a convention for naming releases that is described in the distribution driver file:
1. The name of the system installed is changed to the "model
number" of the date it is installed, e.g. "AY108" for May 10,
1978. [2nd and 3rd letters of the month name, two digit day
of the month and one digit year.]
So this system I am creating was made on October 21, 2014.
Next, replace
the TABLES
deck with the one you just edited; supply a comment and leave the version code blank:
~ replace tables.mp from -tables
Enter comments:
? 2014-10-21 Modify timezone to GMT
?
Enter version code:
?
** REPLACE deck "TABLES.MP" from file "-TABLES" :
& OK
? ok
Done.
You can list the patches again, to be sure:
~ list deck tables.mp patches
TABLES.MP (OCT21-14) patched changed
REP 004088 0400030001,00000240,00000030,000002A0,00000180 Rearrange OPERDEVS 01:26:36 01-06-12 MTS.
REP 000180 01F1F0F5F2 CON1 IS A 1052 01:26:51 01-06-12 MTS.
REP 003F8A 04,FED4 Make the timezone offset -300 (GMT minus 300 minutes or 5 hours)
REP 003F8C 04,C5E2E340 Make the timezone name "EST"
REP 003F8A 04,0000 Set timezone to GMT
REP 003F8C 04,C7D4E34040404040 Set timezone name to GMT
Finally, use the current
command. This will check the system and write to the IPL files:
~ current
There are 4 IPL files with prefix "*IPL. "
Loading system D6.0A-CT214 using the UMLOAD deck it contains.
LOAD: Resident: 2000-5DFC8 UMLOAD Psect: B0000 Pageable: DD000-191A70 End: 1DCFFF
Contents of IPL file "*IPL.3":
AN052 ENTRY=56D18 PSECT=100008 VIRTUAL=B0000...191A70 VIRTUAL_START=100000 UMLOADTV=2000
WRITTEN BY ID MTSS AT 19:55:37 THU JAN 05/84 BY
COM 18:50 Jan 05 - Replace RSF to fix the halfword date problem.
** Write system "D6.0A-CT214" to IPL file "*IPL.3":
& OK
? ok
System "D6.0A-CT214" has been written to IPL file "*IPL.3"
IPL file stacked has been pushed.
System "D6.0A-CT214" is now the current system.
"D6.0A-CT214" : Released.
System "D6.0A-CT214" has been Frozen.
Done.
The moment of truth
Get out of RAMROD
with stop
and then reboot the system as normal. When it comes up you should get a warning that the timezone has changed, which you can just ok
.
00000 ** UMMPS/XA ** assembled 04/19/88
00000 CONFIG CPU 0000 online
00000 CONFIG CPU 0001 online
00001 INIT Time and date have been set to 14:45:22 on 10-21-14.
00002 OPERATOR Started at 14:45:22 on 10-21-14 Model 3090 Serial 000611
00002 OPERATOR Using display DS01 & printer CON1 (1052)
00004 MTS Timezone "GMT" is different from timezone during last IPL ("EST").
00004 MTS If you are sure the time is set correctly, enter "OK" to proceed wit
00004 MTS IPL; otherwise re-IPL now.
Later on in the boot sequence you can see the new system:
00004 MTS Reload at 14:45:56 on 10-21-14. Model: IBM 3090/FF Serial: 611
00004 MTS System: D6.0A-CT214 written at 08:34:51 on TUE OCT 21/14.
And that’s it! The operator’s console will now show the correct time for your timezone, as should the display time
command from MTS.
Further information
There’s a summary of this process in the D6.0A FAQ and I also found the conversation between Ron Frederick and Jeff Ogden on the H390-MTS Yahoo list useful to understand the steps required.
Original instructions to new sites on patching the system deck can be found in the D6.0-NOTES.txt
file in the distribution archive.
RAMROD
has a write-up in file RMRD:RAMROD*PF
, with the wonderful introduction:
Cards were made for salesmen and bridge players and in that
domain they should have undoubtedly remained. Their passing will
not be mourned by those enlightened programmers who have seen
fit to rise above the hardcopy world and to place their faith in
the wonderous MAGNETIC MEDIUM.
*OBJUTIL
is described in Volume 5 of the MTS documentation. You can bypass *OBJUTIL
and use the patch
command in RAMROD
, but *OBJUTIL
has much better facilities to enter number and character patches, and to check your work. Using patch
you have to find the address of TIMEZONE
, the ESDID where it located, and convert the offset and the timezone description (in EBCDIC, not ASCII!) to a sequence of hex characters, eg
~ PATCH DECK TABLES.MP
Address Esdid Text <comments> :
? 3F8A 4 0000C7D4E34040404040