IBM 1401 SIMULATOR FOR OS/360
Home Rafael Pereira Tercero
   rptv2003@yahoo.com Español   

Presentation
Stand-alone programs
IPL from CD
IBM 1401
  SIM1401
  Hacking
  Diagnostics
SoftCap
TK3-SVC244
zLinux on Hercules
PGP public key
   
 

IBM 1401 simulator
for OS/360 on HERCULES


Introduction

This page contains the details about the transcription of an IBM 1401 simulator for OS/360 into an ASCII file, its assembly in an OS/360 system on HERCULES, and the execution of some 1401 sample programs on that simulator.


Environment

Hardware used:

    Machine "ubieta":   Workstation Intel Pentium III, 800MHz, 128MB memory.

Software used:

    GNU/Linux:          Debian GNU/Linux v4.0r0 / kernel 2.6.18-4-686
    Hercules:           v3.03.1
    OS/360 MFT:         mftr33.tar.gz (1709790 bytes, md5=1e7ef41556eb185a376f00fc2476b959)

Transcription

The source code of the IBM 1401 simulator for OS/360 written by William Wilcox, as modified by Tom Brown, is available at bitsavers as a PDF file (http://bitsavers.org/pdf/ibm/360/1401sim360_1971.pdf).

On the other hand, the "Tape of IBM 1401 software from Dick Weaver" (http://bitsavers.org/1401/weaver/tape/weaver-split.tgz) contains, in the weaver-split/FILE011 file, a different version of the same simulator, but this one as an ASCII file, instead of a PDF one.

The ASCII code from Dick Weaver is a good starting point to reduce the time required to transcribe the PDF version into ASCII. The result is in the sim1401.txt file.


Assembly

OS/360

The OS/360 system that I have used is the one distributed under the MFTR33 name, with just a few modifications:

  • I use cckd DASDs instead of the original ckd ones:
  •         ckd2cckd -z mftr33.150 mftr33.150.z
            ckd2cckd -z work01.151 work01.151.z
    
  • Changes in the os360.cnf configuration file:
  •         Added ARCHMODE S/370
            I use shadow files:
               0150  3330  mftr33.150.z sf=shadow/mftr33_1.150.z
               0151  3330  work01.151.z sf=shadow/work01_1.151.z
    
  • Defined SYS1.MACLIB.

The most important change is the definition of SYS1.MACLIB. The MFTR33 distribution does not include this library, which prevents the assembly of programs. Fortunately, the OS/360 CD from Rick Fochtman includes a file, MACLIB.TXT, containing the SYSIN needed to generate it with IPOUPDTE. This has allowed me to define the library in my OS/360, with the exception of member IMDSADMP which contains binary data, and so it will probably have become useless after the conversion of MACLIB.TXT into ASCII.

sim1401-jcl.txt

The JCL used for the assembly is the following:


//SIM1401  JOB 1,'SIM1401'
//*
//* STEPDEL: DELETE TARGET DATASETS IF THEY ALREADY EXIST.
//*
//STEPDEL EXEC PGM=IEFBR14,REGION=2K
//DD1       DD DSN=RAFA.SIM1401.SOURCE,
//             UNIT=SYSDA,VOL=SER=WORK01,
//             SPACE=(TRK,1),
//             DISP=(MOD,DELETE)
//DD2       DD DSN=RAFA.SIM1401.LOADLIB,
//             UNIT=SYSDA,VOL=SER=WORK01,
//             SPACE=(TRK,1),
//             DISP=(MOD,DELETE)
//*
//* STEPDEF: DEFINE TARGET DATASETS
//*
//STEPDEF EXEC PGM=IEFBR14,REGION=2K
//DD1       DD DSN=RAFA.SIM1401.SOURCE,
//             UNIT=SYSDA,VOL=SER=WORK01,
//             SPACE=(7200,40),
//             DCB=(RECFM=FB,BLKSIZE=7200,LRECL=80),
//             DISP=(NEW,KEEP)
//DD2       DD DSN=RAFA.SIM1401.LOADLIB,
//             UNIT=SYSDA,VOL=SER=WORK01,
//             SPACE=(3625,(100,20,10)),
//             DCB=(BLKSIZE=3625,RECFM=U),
//             DISP=(NEW,KEEP)
//*
//* STEPSTR: STORE SIM1401 SOURCE INTO A DATASET
//*
//STEPSTR EXEC PGM=IEBUPDTE,PARM=NEW,REGION=40K
//SYSPRINT  DD DUMMY
//SYSUT2    DD DISP=OLD,DSN=RAFA.SIM1401.SOURCE,
//             UNIT=SYSDA,VOL=SER=WORK01
//SYSIN     DD *
./        ADD  SEQFLD=765
./      NUMBER NEW1=10,INCR=10
(here the source code of the simulator)              <========== **********
/*
//*
//* STEPASM: ASSEMBLY AND LINKEDIT SIM1401
//*
//STEPASM EXEC  ASMFCL                                                      *//
//ASM.SYSUT1 DD DSNAME=&SYSUT1,UNIT=SYSDA,SPACE=(1700,(400,50)),
//             SEP=(SYSLIB)
//ASM.SYSUT2 DD DSNAME=&SYSUT2,UNIT=SYSDA,SPACE=(1700,(400,50))
//ASM.SYSUT3 DD DSNAME=&SYSUT3,SPACE=(1700,(400,50)),
//             UNIT=(SYSDA,SEP=(SYSUT2,SYSUT1,SYSLIB))
//ASM.SYSGO  DD DSNAME=&LOADSET,UNIT=SYSDA,SPACE=(80,(200,50)),
//             DISP=(MOD,PASS)
//ASM.SYSIN DD DISP=OLD,DSN=RAFA.SIM1401.SOURCE,
//            UNIT=SYSDA,VOL=SER=WORK01
//LKED.SYSLMOD DD DISP=OLD,DSN=RAFA.SIM1401.LOADLIB(SIM1401),
//            UNIT=SYSDA,VOL=SER=WORK01
//

The assembly step by step

Notation:

    HC: Hercules console
    OS: OS/360 console

Basically, I will follow the instructions given by Jay Maynard in his guide "IPLING OS/360 (MFT) FOR DUMMIES",
included in the MFTR33 distribution.

HC:
hercules -f os360.cnf

OS:
telnet localhost 1052

HC:
sf+ *                             (new shadow generation, in case something goes wrong)
ipl 150

OS:
IEA100I TIMER IS NOT WORKING
IEA218I MOD=50 ASSUMED S360
IEA101A  SPECIFY SYSTEM PARAMETERS FOR RELEASE 21.0  MFT
[enter]

I define the two partitions bigger than the predefined ones.

IEA217I SEREP INTERFACE ESTABLISHED
*00 IEE801D CHANGE PARTITIONS- REPLY YES/NO (,LIST)
r 0,yes,list
 IEE866I DEFINE COMMAND BEING PROCESSED
 IEE804I P0=(D,8192),P1=(ABC,66560),
 IEE816I CLASSES=ABCD
*00 IEE803A CONTINUE DEFINITION
r 0,'p0=(wtr,512k),p1=(abc,512k),list,end'
 IEE804I P0=(WTR,524288),P1=(ABC,524288),
 IEE812I P 01 HAS   981480 EXCESS BYTES ADDED IN H0
 IEE805I DEFINITION COMPLETED
 IEE101A READY

This is not the first time I use this OS/360, and so I do not need to format the
job queue dataset.

set date=72.024
mn jobnames
mn status

s wtr.p0,00e
 IEF403I WTR      STARTED    P00
 IEF236I ALLOC. FOR WTR      P0 P00
 IEF237I 00E   ALLOCATED TO IEFRDER P00
 IEF868I 00E WTR WAITING FOR WORK P00

I want to mount volume WORK01 (UNIT=151) as "storage".

v 151,offline
s wtr.p1,00f       I run "anything" so that the volume gets varied OFFLINE
 IEF403I WTR      STARTED    P01
 IEF281I 151   NOW OFF-LINE           P01            <-- OFFLINE
 IEA000I 151,CMD,A4,0E00,,,WORK01, P01
 IEA000I 151,,,,8000000031000002,000000000000 P01
 IEF236I ALLOC. FOR WTR      P1 P01
 IEF237I 00F   ALLOCATED TO IEFRDER P01
 IEF868I 00F WTR WAITING FOR WORK P01

p p1
 IEF301I 00F WTR CLOSED P01
 IEF868I 00E WTR WAITING FOR WORK P00
 IEF404I WTR      ENDED      P01

m 151,vol=(sl,work01),use=storage
s wtr.p1,00f       The same as before, now the MOUNT command to take effect
 IEF403I WTR      STARTED    P01
 IEF279I 151   NOW MOUNTED            P01           <-- MOUNTED
 IEF236I ALLOC. FOR WTR      P1 P01
 IEF237I 00F   ALLOCATED TO IEFRDER P01
 IEF868I 00F WTR WAITING FOR WORK P01

p p1
 IEF301I 00F WTR CLOSED P01
 IEF868I 00E WTR WAITING FOR WORK P00
 IEF404I WTR      ENDED      P01

v 151,online
 IEE302I 151     ONLINE

Now the WORK01 is already a storage volume:
d u,dasd,online
 IEE450I 00.00.00 UNIT STATUS 001
 UNIT TYPE STATUS  VOLSER VOLSTATE   UNIT TYPE STATUS  VOLSER VOLSTATE
 150  3330 S       MFTR33  PUB/RSDNT 151  3330 O       WORK01 STRG/RSERV
 
The next step is to run the JOB to store and assemble the sim1401 simulator.

HC:
devinit a [path/]sim1401-jcl.txt ascii eof
HHCPN098I Device 000A initialized

OS:
s rdr.p1,00a
 IEF403I RDR      STARTED    P01
 IEF236I ALLOC. FOR RDR      P1 P01
 IEF237I 00A   ALLOCATED TO IEFRDER P01
 IEF161I 00A-READER CLOSED P01
 IEF285I   SYS72024.T000000.RF000.RDR.R0000001          KEPT        P01
 IEF285I   VOL SER NOS= SYSIN . P01
 IEF285I   SYS1.PROCLIB                                 KEPT        P01
 IEF285I   VOL SER NOS= MFTR33. P01
 IEF868I 00E WTR WAITING FOR WORK P00
 IEF404I RDR      ENDED      P01

s init.p1,,,a
 IEF403I SIM1401  STARTED    P01
 IEF285I   RAFA.SIM1401.SOURCE                          KEPT        P01
 IEF285I   VOL SER NOS= WORK01. P01
 IEF285I   RAFA.SIM1401.LOADLIB                         KEPT        P01
 IEF285I   VOL SER NOS= WORK01. P01
 IEF285I   RAFA.SIM1401.SOURCE                          KEPT        P01
 IEF285I   VOL SER NOS= WORK01. P01
 IEF244I SIM1401 .ASM     .SYSUT1   UNABLE TO ALLOCATE P01
 IEF247I SIM1401  ALLOCATION RECOVERY P01
 IEF247I SIM1401  130,131,132,133,134,135,152,153,190,191 OFFLINE P01
 IEF247I SIM1401  192,193,197,1C0,1D0,1F0,230,231,232,233 OFFLINE P01
 IEF247I SIM1401  234,235,250,251,252,253,290,291,292,293 OFFLINE P01
 IEF247I SIM1401  297,2C0,2D0,2F0,330,331,332,333,350,351 OFFLINE P01
 IEF247I SIM1401  352,353 OFFLINE P01
*00 IEF238A REPLY DEVICE NAME , 'NOSEP', OR 'CANCEL' P01

r 0,nosep
 IEF285I   SYS1.MACLIB                                  KEPT        P01
 IEF285I   VOL SER NOS= MFTR33. P01
 IEF285I   RAFA.SIM1401.SOURCE                          KEPT        P01
 IEF285I   VOL SER NOS= WORK01. P01
 IEF244I SIM1401 .LKED    .SYSUT1   UNABLE TO ALLOCATE P01
 IEF247I SIM1401  ALLOCATION RECOVERY P01
 IEF247I SIM1401  130,131,132,133,134,135,152,153,190,191 OFFLINE P01
 IEF247I SIM1401  192,193,197,1C0,1D0,1F0,230,231,232,233 OFFLINE P01
 IEF247I SIM1401  234,235,250,251,252,253,290,291,292,293 OFFLINE P01
 IEF247I SIM1401  297,2C0,2D0,2F0,330,331,332,333,350,351 OFFLINE P01
 IEF247I SIM1401  352,353 OFFLINE P01
*00 IEF238A REPLY DEVICE NAME , 'NOSEP', OR 'CANCEL' P01

r 0,nosep
 IEF285I   RAFA.SIM1401.LOADLIB                         KEPT        P01
 IEF285I   VOL SER NOS= WORK01. P01
 IEF404I SIM1401  ENDED      P01
 IEF868I 00E WTR WAITING FOR WORK P00

p p0
 IEF301I 00E WTR CLOSED P00
 IEF404I WTR      ENDED      P00

z eod
 IEA000I 150,CMD,A4,0E00,,,MFTR33,
 IEA000I 150,,,,8000000038000002,000000000000
 IEA000I 151,CMD,A4,0E00,,,WORK01,
 IEA000I 151,,,,8000000031000002,000000000000
 IEE334I HALT     EOD SUCCESSFUL

HC:
stopall
sf- *           (the assembly has ended ok, so I keep the data in the new shadow generation)
quit

As everything has gone fine, the simulator is now installed at RAFA.SIM1401.LOADLIB(SIM1401) in volume WORK01. The listing of the JOB execution is in the sim1401-job-output.txt file.


Sample executions

The first test has been to run a trivial program (although when one starts writting his first 1401 program it does not seem trivial at all :-) which writes down a few lines in the printer.

After that, I have tried one of the diagnostic tests used by the IBM CEs.

Basic JCL

The run1401-basic-jcl.txt file is a basic JCL to run the simulator, in ASCII. It includes DD cards for a 3505 reader (UNIT=012), a 3525 puncher (UNIT=00D) and a 1403 printer (UNIT=00F).

HelloWorld program

The card deck with the HelloWorld program is written is ASCII, using the ISO8859-1 coding: HelloWorld.txt.

Test 0050

According to bitsavers, the 1401 diagnostics tape was found by Paul Pierce: "Pierce found the diagnostics tape. He also has a scanned-in copy of the diagnostics manual." (http://bitsavers.org/1401/1401-progs.html)

Both the whole tape as some of the individual tests can be found in various sites. For instance:

In this case, I have run the test 0050: TEST CHARACTER AND BRANCH. At Ed Thelen's pages (http://www.madscientistroom.org/ethelen/1401CardDecks/) this test can be found in two different formats:

  • .crd (0050Object.crd): Binary code using two bytes for each column of the punched card. Every one of the twelve holes in the card is represented by one bit, according to the following mapping:

    6789 ---- YX01 2345

    where Y and X stand for, respectively, the zone punches that IBM called 12 and 11.

  • .txt (0050Object.txt): ASCII code. It is no specified the particular ASCII coding used.

The .crd format is the most reliable, as it is an exact representation of the punched cards. However, in order to used it as input for HERCULES we have to convert it either into ASCII or into EBCDIC. To avoid confusions, I prefer to convert it into EBCDIC. HERCULES does not perform any conversion to the cards in EBCDIC. However, the cards in ASCII are converted into EBCDIC by HERCULES, and this could give rise to some undesired result in case the involved character sets are not the ones we think.

To carry out the crd-to-EBCDIC conversion I make use of the crd2ebc utility, which I will describe later:

      crd2ebc 0050Object.crd > 0050Object_EBCDIC

The executions step by step

Notation:

    HC: Hercules console
    OS: OS/360 console

Basically, I will follow the instructions given by Jay Maynard in his guide "IPLING OS/360 (MFT) FOR DUMMIES",
included in the MFTR33 distribution.

HC:
hercules -f os360.cnf

OS:
telnet localhost 1052

HC:
sf+ *                             (new shadow generation, in case something goes wrong)
ipl 150

OS:
IEA100I TIMER IS NOT WORKING
IEA218I MOD=50 ASSUMED S360
IEA101A  SPECIFY SYSTEM PARAMETERS FOR RELEASE 21.0  MFT
[enter]

I define the two partitions bigger than the predefined ones.

IEA217I SEREP INTERFACE ESTABLISHED
*00 IEE801D CHANGE PARTITIONS- REPLY YES/NO (,LIST)
r 0,yes,list
 IEE866I DEFINE COMMAND BEING PROCESSED
 IEE804I P0=(D,8192),P1=(ABC,66560),
 IEE816I CLASSES=ABCD
*00 IEE803A CONTINUE DEFINITION
r 0,'p0=(wtr,512k),p1=(abc,512k),list,end'
 IEE804I P0=(WTR,524288),P1=(ABC,524288),
 IEE812I P 01 HAS   981480 EXCESS BYTES ADDED IN H0
 IEE805I DEFINITION COMPLETED
 IEE101A READY

This is not the first time I use this OS/360, so I do not need to format the
job queue dataset.

set date=72.024
mn jobnames
mn status

s wtr.p0,00e
 IEF403I WTR      STARTED    P00
 IEF236I ALLOC. FOR WTR      P0 P00
 IEF237I 00E   ALLOCATED TO IEFRDER P00
 IEF868I 00E WTR WAITING FOR WORK P00

s init.p1,,,a

I feed the 1442 reader, UNIT=00A, with the card deck containing the JCL to run the simulator:

HC:
devinit a [path/]run1401-basic-jcl.txt ascii eof
HHCPN098I Device 000A initialized

And the 3505 reader, UNIT=012, with the card deck containing the HelloWorld program, in ASCII:

devinit 12 [path/]HelloWorld.txt ascii eof
HHCPN098I Device 0012 initialized

We are now ready to run the simulator:

OS:
s rdr.p1,00a
 IEF403I RDR      STARTED    P01
 IEF236I ALLOC. FOR RDR      P1 P01
 IEF237I 00A   ALLOCATED TO IEFRDER P01
 IEF403I RUN1401  STARTED    P01
 IEF236I ALLOC. FOR RUN1401  STEP1401 P01
 IEF237I 00F   ALLOCATED TO WRITE P01
 IEF237I 00D   ALLOCATED TO CARDOUT P01
 IEF237I 012   ALLOCATED TO CARDIN P01
*00 ILLEGAL ENTRY P01                     (the simulator waits for a command)

r 0,ldc                                   (LDC: LOAD CARD)

The simulator stops after executing the HALT instruction at address 447:

 HALT  I   447 P01
*00 OK RUN1401  P01

The command TRM terminates the simulator:

r 0,trm                                   (TRM: Terminate)
 IEF285I   RAFA.SIM1401.LOADLIB                         KEPT        P01
 IEF285I   VOL SER NOS= WORK01. P01
 IEF404I RUN1401  ENDED      P01
 IEF868I 00E WTR WAITING FOR WORK P00
 IEF161I 00A-READER CLOSED P01
 IEF285I   SYS72024.T000000.RF000.RDR.R0000001          KEPT        P01
 IEF285I   VOL SER NOS= SYSIN . P01
 IEF285I   SYS1.PROCLIB                                 KEPT        P01
 IEF285I   VOL SER NOS= MFTR33. P01
 IEF404I RDR      ENDED      P01
 IEF868I 00E WTR WAITING FOR WORK P00

The printer's output (prt/prt00f.txt) contains the desired result: HelloWorld-printer.txt


Now, let us run the test 0050.

I feed the 1442 reader, UNIT=00A, with the card deck containing the JCL to run the simulator:

HC:
devinit a [path/]run1401-basic-jcl.txt ascii eof
HHCPN098I Device 000A initialized

And the 3505 reader, UNIT=012, with the card deck containing the test 0050, in EBCDIC:

devinit 12 [path/]0050Object_EBCDIC
HHCPN098I Device 0012 initialized

As before, I run the simulator:

OS:
s rdr.p1,00a
 IEF403I RDR      STARTED    P01
 IEF236I ALLOC. FOR RDR      P1 P01
 IEF237I 00A   ALLOCATED TO IEFRDER P01
 IEF403I RUN1401  STARTED    P01
 IEF236I ALLOC. FOR RUN1401  STEP1401 P01
 IEF237I 00F   ALLOCATED TO WRITE P01
 IEF237I 00D   ALLOCATED TO CARDOUT P01
 IEF237I 012   ALLOCATED TO CARDIN P01
*00 ILLEGAL ENTRY P01                     (the simulator waits for a command)

r 0,ldc                                   (LDC: LOAD CARD)

This time, the simulator stops when, during the execution of the READ instruction
at address 348, it tries to read a new card after all the cards in the deck have
already been read:

 READ TRIED AFTER LAST CARD P01
*00  I 000348      OP 1      LENGTH 000001     INST  1        P01

We can now finish the execution of the simulator:

r 0,trm                                   (TRM: Terminate)
 IEF285I   RAFA.SIM1401.LOADLIB                         KEPT        P01
 IEF285I   VOL SER NOS= WORK01. P01
 IEF868I 00E WTR WAITING FOR WORK P00
 IEF404I RUN1401  ENDED      P01
 IEF161I 00A-READER CLOSED P01
 IEF285I   SYS72024.T000000.RF000.RDR.R0000001          KEPT        P01
 IEF285I   VOL SER NOS= SYSIN . P01
 IEF285I   SYS1.PROCLIB                                 KEPT        P01
 IEF285I   VOL SER NOS= MFTR33. P01
 IEF404I RDR      ENDED      P01
 IEF868I 00E WTR WAITING FOR WORK P00

Now there is nothing at the printer's output, and that is correct because with
the C switch = OFF, the program prints only the errors.


And we stops the OS/360:

OS:
p p0
 IEF301I 00E WTR CLOSED P00
 IEF404I WTR      ENDED      P00

z eod
 IEA000I 150,CMD,A4,0E00,,,MFTR33,
 IEA000I 150,,,,8000000038000002,000000000000
 IEA000I 151,CMD,A4,0E00,,,WORK01,
 IEA000I 151,,,,8000000031000002,000000000000
 IEE334I HALT     EOD SUCCESSFUL

HC:
stopall
sf- *                                     (I remove the new shadow generation)
quit

cdr2ebc utility

It is a small program I have written to convert from the crd format into EBCDIC, as it is accepted by the SIM1401 program. The syntax is:

	crd2ebc [-lf] [-crlf] file.cdr > file.ebcdic

		-lf	Add a LineFeed character (x'25') at the end of every card.
			By default it does not add any line separator.

		-crlf	Add two EBCDIC characters: Carriage-return (x'0d') and LineFeed (x'25') 
                        at the end of every card.
			By default it does not add any line separator.

To convert the cdr file into another character set (for instance, into ASCII ISO8859-1) we could use iconv:

	crd2ebc file.cdr | iconv -f IBM037 -t ISO8859-1 - > file.ISO8859-1

But we should be careful with this, because we are assuming that crd2ebc is using a particular EBCDIC coding (IBM037 in the example), whereas the only criteria for selecting the coding of each EBCDIC byte is to match the values accepted by the simulator.

The source code is available at crd2ebc.c. To get it compiled on a GNU/Linux system the following command will suffice:

        gcc crd2ebc.c -o crd2ebc

This is how I normally use the utility:

  • If I want to use the HERCULES reader in EBCDIC mode:
  • 		crd2ebc file.cdr > file.ebcdic
    
  • If I want to use the HERCULES reader in ASCII mode and/or to view the card deck in ASCII:

    		crd2ebc -lf file.cdr | iconv -f IBM037 -t ISO8859-1 - > file.ascii
    

What follows is a description of the way in which I have determined the EBCDIC coding to assign to each punch pattern in the card.

The "Reference Manual - IBM 1401 Data Processing System - A24-1403-5" book includes, in page 170, the IBM 1401 Character Code Chart. There we have the mapping between CARD CODEs and BCD CODEs. On the other hand, the TRIE table in the simulator source code (sim1401.txt) contains the mapping between the BCD CODEs and the EBCDIC codes. From these two mappings we can get the mapping we are looking for: the one between the crd coding (2 bytes per card column) and the EBCDIC codes. In the following table, I give all those mappings and also the graphical representation of the EBCDIC codes according to the IBM037 codepage. Please note that the choosing of the IBM037 codepage here is arbitrary and its only purpose is to provide a graphical visualization of the characters. And keep in mind that the important thing is the EBCDIC coding of the characters, which is what the simulator needs to work properly, and not its graphical representation. Moreover, the graphical representation shown does not match the one originally used in the IBM 1401 documentation, which can lead to confusion when searching the manuals.

             +-------+-----+---------+------+------+    +-------+-----+---------+------+------+
             |2-BYTE |CARD | BCD CODE|      | CHAR |    |2-BYTE |CARD | BCD CODE|      | CHAR |
             | CODE  |CODE | (W/O C) |EBCDIC|IBM037|    | CODE  |CODE | (W/O C) |EBCDIC|IBM037|
             +-------+-----+---------+------+------+    +-------+-----+---------+------+------+
             | 00 00 |     |         |  40  |      |    | 20 02 |  48 |    84   |  7C  |  @   |
             | 00 01 |  5  |     4 1 |  F5  |  5   |    | 20 04 |  38 |    8 21 |  7B  |  #   |
             | 00 02 |  4  |     4   |  F4  |  4   |    | 20 20 | 08  |  A 8    |  E8  |  Y   |
             | 00 04 |  3  |      21 |  F3  |  3   |    | 20 21 | 058 |  A 84 1 |  6D  |  _   |
             | 00 08 |  2  |      2  |  F2  |  2   |    | 20 22 | 048 |  A 84   |  6C  |  %   |
             | 00 10 |  1  |       1 |  F1  |  1   |    | 20 24 | 038 |  A 8 21 |  6B  |  ,   |
             | 00 20 |  0  |    8 2  |  F0  |  0   |    | 20 28 | 028 |  A 8 2  |  E0  |  \   |
             | 00 21 | 05  |  A  4 1 |  E5  |  V   |    | 20 40 | X8  | B  8    |  D8  |  Q   |
             | 00 22 | 04  |  A  4   |  E4  |  U   |    | 20 41 | X58 | B  84 1 |  5D  |  )   |
             | 00 24 | 03  |  A   21 |  E3  |  T   |    | 20 42 | X48 | B  84   |  5C  |  *   |
             | 00 28 | 02  |  A   2  |  E2  |  S   |    | 20 44 | X38 | B  8 21 |  5B  |  $   |
             | 00 30 | 01  |  A    1 |  61  |  /   |    | 20 80 | Y8  | BA 8    |  C8  |  H   |
             | 00 40 | X   | B       |  60  |  -   |    | 20 81 | Y58 | BA 84 1 |  4D  |  (   |
             | 00 41 | X5  | B   4 1 |  D5  |  N   |    | 20 82 | Y48 | BA 84   |  4C  |  <   |
             | 00 42 | X4  | B   4   |  D4  |  M   |    | 20 84 | Y38 | BA 8 21 |  4B  |  .   |
             | 00 44 | X3  | B    21 |  D3  |  L   |    | 40 00 |  7  |     421 |  F7  |  7   |
             | 00 48 | X2  | B    2  |  D2  |  K   |    | 40 20 | 07  |  A  421 |  E7  |  X   |
             | 00 50 | X1  | B     1 |  D1  |  J   |    | 40 40 | X7  | B   421 |  D7  |  P   |
             | 00 60 | X0  | B  8 2  |  D0  |  }   |    | 40 80 | Y7  | BA  421 |  C7  |  G   |
             | 00 80 | Y   | BA      |  50  |  &   |    | 60 00 |  78 |    8421 |  7F  |  "   |
             | 00 81 | Y5  | BA  4 1 |  C5  |  E   |    | 60 20 | 078 |  A 8421 |  6F  |  ?   |
             | 00 82 | Y4  | BA  4   |  C4  |  D   |    | 60 40 | X78 | B  8421 |  5F  |  ¬   |
             | 00 84 | Y3  | BA   21 |  C3  |  C   |    | 60 80 | Y78 | BA 8421 |  4F  |  |   |
             | 00 88 | Y2  | BA   2  |  C2  |  B   |    | 80 00 |  6  |     42  |  F6  |  6   |
             | 00 90 | Y1  | BA    1 |  C1  |  A   |    | 80 20 | 06  |  A  42  |  E6  |  W   |
             | 00 A0 | Y0  | BA 8 2  |  C0  |  {   |    | 80 40 | X6  | B   42  |  D6  |  O   |
             | 10 00 |  9  |    8  1 |  F9  |  9   |    | 80 80 | Y6  | BA  42  |  C6  |  F   |
             | 10 20 | 09  |  A 8  1 |  E9  |  Z   |    | A0 00 |  68 |    842  |  7E  |  =   |
             | 10 40 | X9  | B  8  1 |  D9  |  R   |    | A0 20 | 068 |  A 842  |  6E  |  >   |
             | 10 80 | Y9  | BA 8  1 |  C9  |  I   |    | A0 40 | X68 | B  842  |  5E  |  ;   |
             | 20 00 |  8  |    8    |  F8  |  8   |    | A0 80 | Y68 | BA 842  |  4E  |  +   |
             | 20 01 |  58 |    84 1 |  7D  |  '   |    |       |     |         |      |      |
             +-------+-----+---------+------+------+    +-------+-----+---------+------+------+
                | |    ^ |     ^ |      ^ ^                | |    ^ |     ^ |      ^ ^
                | |    | |     | |      | |                | |    | |     | |      | |
                | +----+ +-----+ +------+ |                | +----+ +-----+ +------+ |
                | 2-byte   Ref.   SIM1401 |                | 2-byte   Ref.   SIM1401 |
                | format  Manual  Program |                | format  Manual  Program |
                |                         |                |                         |
                +-------------------------+                +-------------------------+
                      cdr2ebc utility                            cdr2ebc utility

08/23/2007

 
   rptv2003@yahoo.com