SIM_CARD: Update to support IBM360 codes.

This commit is contained in:
Richard Cornwell 2017-12-02 21:05:13 -05:00
parent 3f27200f88
commit 4ecb739cf6

View file

@ -93,8 +93,8 @@ static const uint16 ascii_to_hol_026[128] = {
/*Control*/ /*Control*/
0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,
/* sp ! " # $ % & ' */ /* sp ! " # $ % & ' */
/* none Y28 78 T28 Y38 T48 X 48 */ /* none Y28 78 T28 Y38 T48 XT 48 */
0x000, 0x482, 0x006, 0x282, 0x442, 0x222, 0x800, 0x022, /* 40 - 77 */ 0x000, 0x600, 0x006, 0x282, 0x442, 0x222, 0xA00, 0x022, /* 40 - 77 */
/* ( ) * + , - . / */ /* ( ) * + , - . / */
/* T48 X48 Y48 X T38 T X38 T1 */ /* T48 X48 Y48 X T38 T X38 T1 */
0x222, 0x822, 0x422, 0x800, 0x242, 0x400, 0x842, 0x300, 0x222, 0x822, 0x422, 0x800, 0x242, 0x400, 0x842, 0x300,
@ -147,7 +147,7 @@ static const uint16 ascii_to_hol_029[128] = {
/* T 1 2 3 4 5 6 7 */ /* T 1 2 3 4 5 6 7 */
0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004, 0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004,
/* 8 9 : ; < = > ? */ /* 8 9 : ; < = > ? */
/* 8 9 58 Y68 X68 T85 68 28 */ /* 8 9 58 Y68 X68 T85 T68 28 */
0x002, 0x001, 0x012, 0x40A, 0x80A, 0x212, 0x00A, 0x082, 0x002, 0x001, 0x012, 0x40A, 0x80A, 0x212, 0x00A, 0x082,
/* @ A B C D E F G */ /* @ A B C D E F G */
/* 48 X1 X2 X3 X4 X5 X6 X7 */ /* 48 X1 X2 X3 X4 X5 X6 X7 */
@ -159,8 +159,8 @@ static const uint16 ascii_to_hol_029[128] = {
/* Y7 Y8 Y9 T2 T3 T4 T5 T6 */ /* Y7 Y8 Y9 T2 T3 T4 T5 T6 */
0x404, 0x402, 0x401, 0x280, 0x240, 0x220, 0x210, 0x208, 0x404, 0x402, 0x401, 0x280, 0x240, 0x220, 0x210, 0x208,
/* X Y Z [ \ ] ^ _ */ /* X Y Z [ \ ] ^ _ */
/* T7 T8 T9 X48 X68 T68 T78 T58 */ /* T7 T8 T9 X48 X68 T68 T78 68 */
0x204, 0x202, 0x201, 0x822, 0x20A, 0x20A, 0x406, 0xf000, 0x204, 0x202, 0x201, 0x822, 0x20A, 0x20A, 0x406, 0x00A,
/* ` a b c d e f g */ /* ` a b c d e f g */
0xf000,0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04, /* 140 - 177 */ 0xf000,0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04, /* 140 - 177 */
/* h i j k l m n o */ /* h i j k l m n o */
@ -232,7 +232,7 @@ const char sim_ascii_to_six[128] = {
/* 0 1 2 3 4 5 6 7 */ /* 0 1 2 3 4 5 6 7 */
012, 001, 002, 003, 004, 005, 006, 007, 012, 001, 002, 003, 004, 005, 006, 007,
/* 8 9 : ; < = > ? */ /* 8 9 : ; < = > ? */
010, 011, 015, 056, 076, 013, 016, 032, 010, 011, 015, 056, 076, 013, 016, 072,
/* @ A B C D E F G */ /* @ A B C D E F G */
014, 061, 062, 063, 064, 065, 066, 067, /* 100 - 137 */ 014, 061, 062, 063, 064, 065, 066, 067, /* 100 - 137 */
/* H I J K L M N O */ /* H I J K L M N O */
@ -254,65 +254,65 @@ const char sim_ascii_to_six[128] = {
static uint16 ebcdic_to_hol[256] = { static uint16 ebcdic_to_hol[256] = {
/* T0918 T91 T92 T93 T94 T95 T96 T97 0x0x */ /* T0918 T91 T92 T93 T94 T95 T96 T97 0x0x */
0xB03, 0x901, 0x881, 0x841, 0x821, 0x811, 0x809, 0x805, 0xB03, 0x901, 0x881, 0x841, 0x821, 0x811, 0x809, 0x805,
/* T98, T918 , T928, T938, T948, T958, T968, T978 */ /* T98, T918 , T928, T938, T948, T958, T968, T978 */
0x803, 0x903, 0x883, 0x843, 0x823, 0x813, 0x80B, 0x807, 0x803, 0x903, 0x883, 0x843, 0x823, 0x813, 0x80B, 0x807,
/* TE918 E91 E92 E93 E94 E95 E96 E97 0x1x */ /* TE918 E91 E92 E93 E94 E95 E96 E97 0x1x */
0xD03, 0x501, 0x481, 0x441, 0x421, 0x411, 0x409, 0x405, 0xD03, 0x501, 0x481, 0x441, 0x421, 0x411, 0x409, 0x405,
/* E98 E918 E928 E938 E948 E958 E968 E978 */ /* E98 E918 E928 E938 E948 E958 E968 E978 */
0x403, 0x503, 0x483, 0x443, 0x423, 0x413, 0x40B, 0x407, 0x403, 0x503, 0x483, 0x443, 0x423, 0x413, 0x40B, 0x407,
/* E0918 091 092 093 094 095 096 097 0x2x */ /* E0918 091 092 093 094 095 096 097 0x2x */
0x703, 0x301, 0x281, 0x241, 0x221, 0x211, 0x209, 0x205, 0x703, 0x301, 0x281, 0x241, 0x221, 0x211, 0x209, 0x205,
/* 098 0918 0928 0938 0948 0958 0968 0978 */ /* 098 0918 0928 0938 0948 0958 0968 0978 */
0x203, 0x303, 0x283, 0x243, 0x223, 0x213, 0x20B, 0x207, 0x203, 0x303, 0x283, 0x243, 0x223, 0x213, 0x20B, 0x207,
/* TE0918 91 92 93 94 95 96 97 0x3x */ /* TE0918 91 92 93 94 95 96 97 0x3x */
0xF03, 0x101, 0x081, 0x041, 0x021, 0x011, 0x009, 0x005, 0xF03, 0x101, 0x081, 0x041, 0x021, 0x011, 0x009, 0x005,
/* 98 918 928 938 948 958 968 978 */ /* 98 918 928 938 948 958 968 978 */
0x003, 0x103, 0x083, 0x043, 0x023, 0x013, 0x00B, 0x007, 0x003, 0x103, 0x083, 0x043, 0x023, 0x013, 0x00B, 0x007,
/* T091 T092 T093 T094 T095 T096 T097 0x4x */ /* T091 T092 T093 T094 T095 T096 T097 0x4x */
0x000, 0xB01, 0xA81, 0xA41, 0xA21, 0xA11, 0xA09, 0xA05, 0x000, 0xB01, 0xA81, 0xA41, 0xA21, 0xA11, 0xA09, 0xA05,
/* T098 T18 T28 T38 T48 T58 T68 T78 */ /* T098 T18 T28 T38 T48 T58 T68 T78 */
0xA03, 0x902, 0x882, 0x842, 0x822, 0x812, 0x80A, 0x806, 0xA03, 0x902, 0x882, 0x842, 0x822, 0x812, 0x80A, 0x806,
/* T TE91 TE92 TE93 TE94 TE95 TE96 TE97 0x5x */ /* T TE91 TE92 TE93 TE94 TE95 TE96 TE97 0x5x */
0x800, 0xD01, 0xC81, 0xC41, 0xC21, 0xC11, 0xC09, 0xC05, 0x800, 0xD01, 0xC81, 0xC41, 0xC21, 0xC11, 0xC09, 0xC05,
/* TE98 E18 E28 E38 E48 E58 E68 E78 */ /* TE98 E18 E28 E38 E48 E58 E68 E78 */
0xC03, 0x502, 0x482, 0x442, 0x422, 0x412, 0x40A, 0x406, 0xC03, 0x502, 0x482, 0x442, 0x422, 0x412, 0x40A, 0x406,
/* E 01 E092 E093 E094 E095 E096 E097 0x6x */ /* E 01 E092 E093 E094 E095 E096 E097 0x6x */
0x400, 0x300, 0x681, 0x641, 0x621, 0x611, 0x609, 0x605, 0x400, 0x300, 0x681, 0x641, 0x621, 0x611, 0x609, 0x605,
/* E098 018 TE 038 048 058 068 078 */ /* E098 018 TE 038 048 68 068 078 */
0x603, 0x302, 0xC00, 0x242, 0x222, 0x212, 0x20A, 0x206, 0x603, 0x302, 0xC00, 0x242, 0x222, 0x00A, 0x20A, 0x206,
/* TE0 TE091 TE092 TE093 TE094 TE095 TE096 TE097 0x7x */ /* TE0 TE091 TE092 TE093 TE094 TE095 TE096 TE097 0x7x */
0xE00, 0xF01, 0xE81, 0xE41, 0xE21, 0xE11, 0xE09, 0xE05, 0xE00, 0xF01, 0xE81, 0xE41, 0xE21, 0xE11, 0xE09, 0xE05,
/* TE098 18 28 38 48 58 68 78 */ /* TE098 18 28 38 48 58 T58 78 */
0xE03, 0x102, 0x082, 0x042, 0x022, 0x012, 0x00A, 0x006, 0xE03, 0x102, 0x082, 0x042, 0x022, 0x012, 0x212, 0x006,
/* T018 T01 T02 T03 T04 T05 T06 T07 0x8x */ /* T018 T01 T02 T03 T04 T05 T06 T07 0x8x */
0xB02, 0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04, 0xB02, 0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04,
/* T08 T09 T028 T038 T048 T058 T068 T078 */ /* T08 T09 T028 T038 T048 T058 T068 T078 */
0xA02, 0xA01, 0xA82, 0xA42, 0xA22, 0xA12, 0xA0A, 0xA06, 0xA02, 0xA01, 0xA82, 0xA42, 0xA22, 0xA12, 0xA0A, 0xA06,
/* TE18 TE1 TE2 TE3 TE4 TE5 TE6 TE7 0x9x */ /* TE18 TE1 TE2 TE3 TE4 TE5 TE6 TE7 0x9x */
0xD02, 0xD00, 0xC80, 0xC40, 0xC20, 0xC10, 0xC08, 0xC04, 0xD02, 0xD00, 0xC80, 0xC40, 0xC20, 0xC10, 0xC08, 0xC04,
/* TE8 TE9 TE28 TE38 TE48 TE58 TE68 TE78 */ /* TE8 TE9 TE28 TE38 TE48 TE58 TE68 TE78 */
0xC02, 0xC01, 0xC82, 0xC42, 0xC22, 0xC12, 0xC0A, 0xC06, 0xC02, 0xC01, 0xC82, 0xC42, 0xC22, 0xC12, 0xC0A, 0xC06,
/* E018 E01 E02 E03 E04 E05 E06 E07 0xax */ /* E018 E01 E02 E03 E04 E05 E06 E07 0xax */
0x702, 0x700, 0x680, 0x640, 0x620, 0x610, 0x608, 0x604, 0x702, 0x700, 0x680, 0x640, 0x620, 0x610, 0x608, 0x604,
/* E08 E09 E028 E038 E048 E058 E068 E078 */ /* E08 E09 E028 E038 E048 E058 E068 E078 */
0x602, 0x601, 0x682, 0x642, 0x622, 0x612, 0x60A, 0x606, 0x602, 0x601, 0x682, 0x642, 0x622, 0x612, 0x60A, 0x606,
/* TE018 TE01 TE02 TE03 TE04 TE05 TE06 TE07 0xbx */ /* TE018 TE01 TE02 TE03 TE04 TE05 TE06 TE07 0xbx */
0xF02, 0xF00, 0xE80, 0xE40, 0xE20, 0xE10, 0xE08, 0xE04, 0xF02, 0xF00, 0xE80, 0xE40, 0xE20, 0xE10, 0xE08, 0xE04,
/* TE08 TE09 TE028 TE038 TE048 TE058 TE068 TE078 */ /* TE08 TE09 TE028 TE038 TE048 TE058 TE068 TE078 */
0xE02, 0xE01, 0xE82, 0xE42, 0xE22, 0xE12, 0xE0A, 0xE06, 0xE02, 0xE01, 0xE82, 0xE42, 0xE22, 0xE12, 0xE0A, 0xE06,
/* T0 T1 T2 T3 T4 T5 T6 T7 0xcx */ /* T0 T1 T2 T3 T4 T5 T6 T7 0xcx */
0xA00, 0x900, 0x880, 0x840, 0x820, 0x810, 0x808, 0x804, 0xA00, 0x900, 0x880, 0x840, 0x820, 0x810, 0x808, 0x804,
/* T8 T9 T0928 T0938 T0948 T0958 T0968 T0978 */ /* T8 T9 T0928 T0938 T0948 T0958 T0968 T0978 */
0x802, 0x801, 0xA83, 0xA43, 0xA23, 0xA13, 0xA0B, 0xA07, 0x802, 0x801, 0xA83, 0xA43, 0xA23, 0xA13, 0xA0B, 0xA07,
/* E0 E1 E2 E3 E4 E5 E6 E7 0xdx */ /* E0 E1 E2 E3 E4 E5 E6 E7 0xdx */
0x600, 0x500, 0x480, 0x440, 0x420, 0x410, 0x408, 0x404, 0x600, 0x500, 0x480, 0x440, 0x420, 0x410, 0x408, 0x404,
/* E8 E9 TE928 TE938 TE948 TE958 TE968 TE978 */ /* E8 E9 TE928 TE938 TE948 TE958 TE968 TE978 */
0x402, 0x401, 0xC83, 0xC43, 0xC23, 0xC13, 0xC0B, 0xC07, 0x402, 0x401, 0xC83, 0xC43, 0xC23, 0xC13, 0xC0B, 0xC07,
/* 028 E091 02 03 04 05 06 07 0xex */ /* 028 E091 02 03 04 05 06 07 0xex */
0x182, 0x701, 0x280, 0x240, 0x220, 0x210, 0x208, 0x204, 0x182, 0x701, 0x280, 0x240, 0x220, 0x210, 0x208, 0x204,
/* 08 09 E0928 E0938 E0948 E0958 E0968 E0978 */ /* 08 09 E0928 E0938 E0948 E0958 E0968 E0978 */
0x202, 0x201, 0x683, 0x643, 0x623, 0x613, 0x60B, 0x607, 0x202, 0x201, 0x683, 0x643, 0x623, 0x613, 0x60B, 0x607,
/* 0 1 2 3 4 5 6 7 0xfx */ /* 0 1 2 3 4 5 6 7 0xfx */
0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004, 0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004,
/* 8 9 TE0928 TE0938 TE0948 TE0958 TE0968 TE0978 */ /* 8 9 TE0928 TE0938 TE0948 TE0958 TE0968 TE0978 */
0x002, 0x001, 0xE83, 0xE43, 0xE23, 0xE13, 0xE0B, 0xE07 0x002, 0x001, 0xE83, 0xE43, 0xE23, 0xE13, 0xE0B, 0xE07
@ -581,6 +581,7 @@ sim_read_card(UNIT * uptr)
mode = uptr->flags & UNIT_CARD_MODE; mode = uptr->flags & UNIT_CARD_MODE;
switch(mode) { switch(mode) {
default:
case MODE_TEXT: case MODE_TEXT:
sim_debug(DEBUG_CARD, dptr, "text: ["); sim_debug(DEBUG_CARD, dptr, "text: [");
/* Check for special codes */ /* Check for special codes */
@ -610,6 +611,7 @@ sim_read_card(UNIT * uptr)
} }
if (cmpcard(&data->cbuff[0], "raw")) { if (cmpcard(&data->cbuff[0], "raw")) {
int j = 0; int j = 0;
sim_debug(DEBUG_CARD, dptr, "-octal-");
for(col = 0, i = 4; col < 80; i++) { for(col = 0, i = 4; col < 80; i++) {
if (data->cbuff[i] >= '0' && data->cbuff[i] <= '7') { if (data->cbuff[i] >= '0' && data->cbuff[i] <= '7') {
data->image[col] = (data->image[col] << 3) | data->image[col] = (data->image[col] << 3) |
@ -628,12 +630,15 @@ sim_read_card(UNIT * uptr)
} }
} }
} else if (cmpcard(&data->cbuff[0], "eor")) { } else if (cmpcard(&data->cbuff[0], "eor")) {
sim_debug(DEBUG_CARD, dptr, "-eor-");
data->image[0] = 07; /* 7/8/9 punch */ data->image[0] = 07; /* 7/8/9 punch */
i = 4; i = 4;
} else if (cmpcard(&data->cbuff[0], "eof")) { } else if (cmpcard(&data->cbuff[0], "eof")) {
sim_debug(DEBUG_CARD, dptr, "-eof-");
data->image[0] = 015; /* 6/7/9 punch */ data->image[0] = 015; /* 6/7/9 punch */
i = 4; i = 4;
} else if (cmpcard(&data->cbuff[0], "eoi")) { } else if (cmpcard(&data->cbuff[0], "eoi")) {
sim_debug(DEBUG_CARD, dptr, "-eoi-");
data->image[0] = 017; /* 6/7/8/9 punch */ data->image[0] = 017; /* 6/7/8/9 punch */
i = 4; i = 4;
} else { } else {
@ -656,7 +661,7 @@ sim_read_card(UNIT * uptr)
if ((uptr->flags & MODE_LOWER) == 0) if ((uptr->flags & MODE_LOWER) == 0)
c = toupper(c); c = toupper(c);
switch(uptr->flags & MODE_CHAR) { switch(uptr->flags & MODE_CHAR) {
case 0: default:
case MODE_026: case MODE_026:
temp = ascii_to_hol_026[(int)c]; temp = ascii_to_hol_026[(int)c];
break; break;
@ -707,7 +712,9 @@ sim_read_card(UNIT * uptr)
case MODE_CBN: case MODE_CBN:
sim_debug(DEBUG_CARD, dptr, "cbn\n"); sim_debug(DEBUG_CARD, dptr, "cbn\n");
/* Check if first character is a tape mark */ /* Check if first character is a tape mark */
if (size == 1 && ((uint8)data->cbuff[0]) == 0217) { if (((uint8)data->cbuff[0]) == 0217 &&
(size == 1 || (((uint8)data->cbuff[1]) & 0200) != 0)) {
i = 1;
r = SCPE_EOF; r = SCPE_EOF;
break; break;
} }
@ -733,7 +740,7 @@ sim_read_card(UNIT * uptr)
data->image[col++] |= c; data->image[col++] |= c;
} }
if (col >= 80 && (data->cbuff[i] & 0x80) == 0) { if (i < data->len && col >= 80 && (data->cbuff[i] & 0x80) == 0) {
r = SCPE_IOERR; r = SCPE_IOERR;
} }
/* Record over length of card, skip until next */ /* Record over length of card, skip until next */
@ -747,7 +754,9 @@ sim_read_card(UNIT * uptr)
case MODE_BCD: case MODE_BCD:
sim_debug(DEBUG_CARD, dptr, "bcd ["); sim_debug(DEBUG_CARD, dptr, "bcd [");
/* Check if first character is a tape mark */ /* Check if first character is a tape mark */
if (size == 1 && ((uint8)data->cbuff[0]) == 0217) { if (((uint8)data->cbuff[0]) == 0217 &&
(size == 1 || (((uint8)data->cbuff[1]) & 0200) != 0)) {
i = 1;
r = SCPE_EOF; r = SCPE_EOF;
break; break;
} }
@ -767,7 +776,7 @@ sim_read_card(UNIT * uptr)
data->image[col++] = sim_bcd_to_hol(c); data->image[col++] = sim_bcd_to_hol(c);
} }
if (col >= 80 && (data->cbuff[i] & 0x80) == 0) { if (i < data->len && col >= 80 && (data->cbuff[i] & 0x80) == 0) {
r = SCPE_IOERR; r = SCPE_IOERR;
} }
@ -895,7 +904,7 @@ sim_punch_card(UNIT * uptr, UNIT *stkuptr)
case MODE_OCTAL: case MODE_OCTAL:
sim_debug(DEBUG_CARD, dptr, "octal: ["); sim_debug(DEBUG_CARD, dptr, "octal: [");
out[outp++] = '~'; out[outp++] = '~';
for (i = 80; i > 0; i--) { for (i = 79; i >= 0; i--) {
if (data->image[i] != 0) if (data->image[i] != 0)
break; break;
} }