📄 io_merge.c
字号:
break;
case 'O':
cmd_io (); // 'O' User I(O) controls.
break;
case 'R':
cmd_sfr (); // 'R' Special Function (R)egisters.
break;
case 'S': // 'S' Serial controls.
cmd_serial ();
break;
}
}
if (!cli_result)
cli_result = OK_ID;
cli_index = CLI_BASE;
return (OK_ID == cli_result);
}
static void cmd_sfr (void) // 'R' Special Function (R)egisters.
{
U08 c;
switch (toupper (get_char_d (&c)))
{
case 'I':
cmd_sfr_xdata (); // IO.
break;
default:
cmd_sfr ();
cli_index = c; // Unget last character.
break;
}
}
static const U08 ri2default[] = {
// 0 1 2 3 4 5 6 7
0, 1, 2, 3, 4, 5, 6, 7, // 2000-7.
8, 9, 10, 11, 12, 13, 14, 15, // 2008-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 2010-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 2018-F.
// 18 is 2022 in a 6513
16, 17, 18, -1, -1, -1, -1, -1, // 2020-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 2028-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 2030-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 2038-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 2040-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 2048-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 2050-7.
// 18 is 205A in a 6521
-1, -1, 18, -1, -1, -1, -1, -1, // 2058-F.
19, 20, 21, 22, -1, -1, -1, -1, // 2060-8.
-1, -1, -1, -1, -1, -1, -1, -1, // 2068-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 2070-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 2078-F.
23, 24, -1, -1, -1, -1, -1, -1, // 2080-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 2088-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 2090-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 2098-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 20A0-7.
25, 26, 27, -1, -1, -1, -1, -1, // 20A8-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 20B0-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 20B8-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 20C0-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 20C8-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 20D0-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 20D8-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 20E0-7.
-1, -1, -1, -1, -1, -1, -1, -1, // 20E8-F.
-1, -1, -1, -1, -1, -1, -1, -1, // 20F0-7.
-1, -1, -1, -1, -1, 28, 29, 30 // 20F8-F.
};
static void cmd_sfr_xdata (void)
{
U08 c, p;
U08 d;
p = get_num (); // Get SFR's two-byte address.
c = get_char_d (&d); // Get action for SFR.
do
{
if ('=' == c)
{
if (ri2default[ p ] == 0)
Rom[ IO_DATA + ri2default[ p++ ]] = get_num () & 0xEF; // Keep CE off.
else
Rom[ IO_DATA + ri2default[ p++ ]] = get_num ();
}
else if ('+' == c)
{
if (ri2default[ p ] == 0)
Rom[ IO_DATA + ri2default[ p++ ]] |= get_num () & 0xEF; // Keep CE off.
else
Rom[ IO_DATA + ri2default[ p++ ]] |= get_num ();
}
else // '-' == c
{
Rom[ IO_DATA + ri2default[ p++ ]] &= ~get_num ();
}
c = get_char_d (&d);
} while (('+' == c) || ('-' == c) || ('=' == c));
cli_index = d; // Unget last character.
}
static void cmd_ce_data_access (void) // ']' CE data access.
{
U32 n;
U08 c, d;
U32 p;
c = get_num ();
p = CE_DATA | (c << 2); // Get data's four-byte address.
c = get_char_d (&d); // Get action for address.
while ('=' == c)
{
n = get_long ();
p += 4;
Rom[ --p ] = (U08)(n % 0x100); // Order from MSB to...
n /= 0x100;
Rom[ --p ] = (U08)(n % 0x100); //
n /= 0x100;
Rom[ --p ] = (U08)(n % 0x100); //
n /= 0x100;
Rom[ --p ] = (U08)(n % 0x100); // ...LSB.
p += 4;
c = get_char_d (&d);
}
cli_index = d; // Unget last character.
}
typedef struct Parm
{
U08 p;
S08 s; // negative indicates a signed value
} PARM;
#define cpMax 25
#define ipMax (cpMax - 1)
// from meter\meter.h, definition of struct Parameter_t
PARM const ap[cpMax]=
{
// {(uint8x_t *) &IThrshld, sizeof(IThrshld)},
{0,4},
// {(uint8x_t *) &Config, sizeof(Config)},
{4,1},
// {(uint8x_t *) &VPThrshld, sizeof(VPThrshld)},
{5,4},
// {(uint8x_t *) &IPThrshld, sizeof(IPThrshld)},
{9,4},
// {(uint8x_t *) &Y_Cal_Deg0, -sizeof(Y_Cal_Deg0)},
{13,-2},
// {(uint8x_t *) &Y_Cal_Deg1, -sizeof(Y_Cal_Deg1)},
{15,-2},
// {(uint8x_t *) &Y_Cal_Deg2, -sizeof(Y_Cal_Deg2)},
{17,-2},
// {(uint8x_t *) &PulseWSource, sizeof(PulseWSource)},
{19,1},
// {(uint8x_t *) &PulseRSource, sizeof(PulseRSource)},
{20,1},
// {(uint8x_t *) &Vmax, -sizeof(Vmax)},
{21,-2},
// {(uint8x_t *) &Imax, -sizeof(Imax)},
{23,-2},
// {(uint8x_t *) &ppmc1, -sizeof(ppmc1)},
{25,-2},
// {(uint8x_t *) &ppmc2, -sizeof(ppmc2)},
{27,-2},
// {(uint8x_t *) &Pulse3Source, sizeof(Pulse3Source)},
{29,1},
// {(uint8x_t *) &Pulse4Source, sizeof(Pulse4Source)},
{30,1},
// {(uint8x_t *) &Scal, sizeof(Scal)},
{31,2},
// {(uint8x_t *) &Vcal, sizeof(Vcal)},
{33,2},
// {(uint8x_t *) &Ical, sizeof(Ical)},
{35,2},
// {(uint8x_t *) &VThrshld, sizeof(VThrshld)},
{37,4},
// {(uint8x_t *) &PulseWidth, sizeof(PulseWidth)},
{41,2},
// {(uint8x_t *) &temp_nom, sizeof(temp_nom)},
{43,4},
// {(uint8x_t *) &Imax2, -sizeof(Imax2)},
{47,-2},
// {(uint8x_t *) &IThrshld2, sizeof(IThrshld2)},
{49,-4},
// {(uint8x_t *) &VBatMin, sizeof(VBatMin)},
{53,-4},
// {(uint8x_t *) &CalibrationCount, sizeof(CalibrationCount)},
{57,1}
};
// store a parameter
static void s (U16 ip, U32 v)
{
U32 pT;
if (ip > ipMax)
return;
switch (ap[ ip ].s)
{
case 0:
break;
default:
case 1:
case -1:
pT = ap[ ip ].p + MPU_DATA;
Rom[ pT ] = (U08)(v & 0xff); // Order from MSB to...
break;
case 2:
case -2:
pT = 2 + ap[ ip ].p + MPU_DATA;
Rom[ --pT ] = (U08)(v & 0xff); // Order from LSB to...
v /= 0x100;
Rom[ --pT ] = (U08)(v & 0xff); // MSB
break;
case 4:
case -4:
pT = 4 + ap[ ip ].p + MPU_DATA;
Rom[ --pT ] = (U08)(v & 0xff); // Order from LSB to...
v /= 0x100;
Rom[ --pT ] = (U08)(v & 0xff); //
v /= 0x100;
Rom[ --pT ] = (U08)(v & 0xff); //
v /= 0x100;
Rom[ --pT ] = (U08)(v & 0xff); // MSB
break;
}
}
static void cmd_mpu_data_access (void) // ')' MPU data access.
{
U08 ip, c, d;
ip = get_num ();
c = get_char_d (&d);
while ('=' == c && ip < ipMax)
{
s (ip++, get_long ());
c = get_char_d (&d);
}
cli_index = d; // Unget last character.
}
// Convert ascii decimal (or hex) short to binary number.
S16 get_short (void)
{
return ((S16) get_long ());
}
// Convert ascii decimal short to binary number.
S16 get_short_decimal (void)
{
return ((S16) get_long_decimal ('+'));
}
// Convert ascii hexdecimal short to binary number.
U16 get_short_hex (void)
{
return ((U16) get_long_hex ());
}
// Convert ascii decimal (or hex) number to binary number.
S08 get_num (void)
{
return ((S08) get_long ());
}
// Convert ascii decimal number to binary number.
S08 get_num_decimal (void)
{
return ((S08) get_long_decimal ('+'));
}
// Convert ascii hexdecimal byte to binary number.
U08 get_num_hex (void)
{
return ((U08) get_long_hex ());
}
// Convert ascii decimal (or hex) long to binary number.
S32 get_long (void)
{
U08 c, d;
c = get_char_d (&d);
if ('+' == c || '-' == c)
return (get_long_decimal (c));
else
{
cli_index = d; // Unget last character.
return ((S32) get_long_hex ()); // Default to hexadecimal input.
}
}
S32 get_long_decimal (U08 c)
{
Bbool sign;
U08 d, i;
S32 n;
i = 10; // Maximum number of digits allowed for decimal input.
n = 0; // Number to be returned.
sign = '-' == c;
while (i > 0 && (c = get_digit (&d)) < 10)
{ // Convert ASCII decimal number to binary number.
n = (n * 10) + c;
i--;
}
if (i) cli_index = d; // Unget last character, it wasn't a digit.
if (sign)
n = -n;
return (n);
}
U32 get_long_hex (void) // Convert ASCII hexadecimal number to binary number.
{
U08 c, d, i;
U32 n;
i = 8; // Maximum number of digits allowed for hex input.
n = 0; // Number to be returned.
while (i > 0 && (c = get_digit (&d)) < 0x10)
{ // Convert ASCII hexadecimal number to binary number.
n = (n << 4) + c;
i--;
}
if (i) cli_index = d; // Unget last character, it wasn't a digit.
return (n);
}
// Get next decimal (or hex) digit from CLI buffer.
U08 get_digit (U08 *d)
{
U08 c;
if (isxdigit (c = get_char_d (d)))
{
c -= '0'; // '0' mapped to 0;
if (c >= 10)
{
c &= ~CASE_;
c -= 'A' - '0' - 10; // 'A' mapped to 10.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -