xref: /openbmc/qemu/include/hw/s390x/ebcdic.h (revision 1c8e93fb)
140fa5264SHeinz Graalfs /*
240fa5264SHeinz Graalfs  * EBCDIC/ASCII conversion Support
340fa5264SHeinz Graalfs  *
440fa5264SHeinz Graalfs  * Copyright (c) 2011 Alexander Graf
540fa5264SHeinz Graalfs  * Copyright IBM, Corp. 2013
640fa5264SHeinz Graalfs  *
740fa5264SHeinz Graalfs  * This work is licensed under the terms of the GNU GPL, version 2 or (at your
840fa5264SHeinz Graalfs  * option) any later version.  See the COPYING file in the top-level directory.
940fa5264SHeinz Graalfs  *
1040fa5264SHeinz Graalfs  */
1140fa5264SHeinz Graalfs 
12*2a6a4076SMarkus Armbruster #ifndef EBCDIC_H
13*2a6a4076SMarkus Armbruster #define EBCDIC_H
1440fa5264SHeinz Graalfs 
1540fa5264SHeinz Graalfs /* EBCDIC handling */
1640fa5264SHeinz Graalfs static const uint8_t ebcdic2ascii[] = {
1740fa5264SHeinz Graalfs     0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F,
1840fa5264SHeinz Graalfs     0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1940fa5264SHeinz Graalfs     0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07,
2040fa5264SHeinz Graalfs     0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
2140fa5264SHeinz Graalfs     0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B,
2240fa5264SHeinz Graalfs     0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07,
2340fa5264SHeinz Graalfs     0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04,
2440fa5264SHeinz Graalfs     0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A,
2540fa5264SHeinz Graalfs     0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86,
2640fa5264SHeinz Graalfs     0x87, 0xA4, 0x5B, 0x2E, 0x3C, 0x28, 0x2B, 0x21,
2740fa5264SHeinz Graalfs     0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07,
2840fa5264SHeinz Graalfs     0x8D, 0xE1, 0x5D, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
2940fa5264SHeinz Graalfs     0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F,
3040fa5264SHeinz Graalfs     0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
3140fa5264SHeinz Graalfs     0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
3240fa5264SHeinz Graalfs     0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
3340fa5264SHeinz Graalfs     0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
3440fa5264SHeinz Graalfs     0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1,
3540fa5264SHeinz Graalfs     0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
3640fa5264SHeinz Graalfs     0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07,
3740fa5264SHeinz Graalfs     0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
3840fa5264SHeinz Graalfs     0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07,
3940fa5264SHeinz Graalfs     0x9B, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC,
4040fa5264SHeinz Graalfs     0xAB, 0x07, 0xAA, 0x7C, 0x07, 0x07, 0x07, 0x07,
4140fa5264SHeinz Graalfs     0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
4240fa5264SHeinz Graalfs     0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07,
4340fa5264SHeinz Graalfs     0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
4440fa5264SHeinz Graalfs     0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98,
4540fa5264SHeinz Graalfs     0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
4640fa5264SHeinz Graalfs     0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07,
4740fa5264SHeinz Graalfs     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
4840fa5264SHeinz Graalfs     0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07,
4940fa5264SHeinz Graalfs };
5040fa5264SHeinz Graalfs 
5140fa5264SHeinz Graalfs static const uint8_t ascii2ebcdic[] = {
5240fa5264SHeinz Graalfs     0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
5340fa5264SHeinz Graalfs     0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
5440fa5264SHeinz Graalfs     0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
5540fa5264SHeinz Graalfs     0x18, 0x19, 0x3F, 0x27, 0x22, 0x1D, 0x1E, 0x1F,
5640fa5264SHeinz Graalfs     0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
5740fa5264SHeinz Graalfs     0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
5840fa5264SHeinz Graalfs     0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
5940fa5264SHeinz Graalfs     0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
6040fa5264SHeinz Graalfs     0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
6140fa5264SHeinz Graalfs     0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
6240fa5264SHeinz Graalfs     0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
6340fa5264SHeinz Graalfs     0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D,
6440fa5264SHeinz Graalfs     0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
6540fa5264SHeinz Graalfs     0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
6640fa5264SHeinz Graalfs     0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
6740fa5264SHeinz Graalfs     0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
6840fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
6940fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7040fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7140fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7240fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7340fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7440fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7540fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7640fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7740fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7840fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
7940fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
8040fa5264SHeinz Graalfs     0x3F, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
8140fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
8240fa5264SHeinz Graalfs     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
8340fa5264SHeinz Graalfs     0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x3F, 0xFF
8440fa5264SHeinz Graalfs };
8540fa5264SHeinz Graalfs 
ebcdic_put(uint8_t * p,const char * ascii,int len)8640fa5264SHeinz Graalfs static inline void ebcdic_put(uint8_t *p, const char *ascii, int len)
8740fa5264SHeinz Graalfs {
8840fa5264SHeinz Graalfs     int i;
8940fa5264SHeinz Graalfs 
9040fa5264SHeinz Graalfs     for (i = 0; i < len; i++) {
9140fa5264SHeinz Graalfs         p[i] = ascii2ebcdic[(uint8_t)ascii[i]];
9240fa5264SHeinz Graalfs     }
9340fa5264SHeinz Graalfs }
9440fa5264SHeinz Graalfs 
ascii_put(uint8_t * p,const char * ebcdic,int len)9540fa5264SHeinz Graalfs static inline void ascii_put(uint8_t *p, const char *ebcdic, int len)
9640fa5264SHeinz Graalfs {
9740fa5264SHeinz Graalfs     int i;
9840fa5264SHeinz Graalfs 
9940fa5264SHeinz Graalfs     for (i = 0; i < len; i++) {
10040fa5264SHeinz Graalfs         p[i] = ebcdic2ascii[(uint8_t)ebcdic[i]];
10140fa5264SHeinz Graalfs     }
10240fa5264SHeinz Graalfs }
10340fa5264SHeinz Graalfs 
104*2a6a4076SMarkus Armbruster #endif /* EBCDIC_H */
105