Код:
ir13 low_byte;
ir13 high_byte;
BOOL global_change;
BOOL rst_n;
BYTE mode_s;
BYTE parallel_data_in;
BOOL serial_data_in;
void main(void)
{
//
// Initial reset, both registers
//
rst_n = 0;
mode_s = 0;
parallel_data_in = 0;
serial_data_in = 0;
generate_event(EVENT_INPUT_CHANGE);
//
// Parallel load in low-byte, high byte always shifts
//
rst_n = 1;
parallel_data_in = 0x55; // load 'U' character
mode_s = 3; //
generate_event(EVENT_INPUT_CHANGE);
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
//
// Not needed in this example
//
// generate_event(EVENT_CLOCK_FALL);
//
mode_s = 2;
generate_event(EVENT_INPUT_CHANGE);
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
mode_s = 3;
parallel_data_in = 0x53; // load 'S' character
generate_event(EVENT_INPUT_CHANGE);
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
mode_s = 2;
generate_event(EVENT_INPUT_CHANGE);
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
mode_s = 3;
parallel_data_in = 0x42; // load 'B' character
generate_event(EVENT_INPUT_CHANGE);
generate_event(EVENT_CLOCK_RISE);
mode_s = 2;
generate_event(EVENT_INPUT_CHANGE);
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
generate_event(EVENT_CLOCK_RISE); printf("%c", (high_byte.q & 0x80) ? '1' : '0');
}
void assign_process(void)
{
for(;;)
{
global_change = FALSE;
low_byte.assign(rst_n, mode_s, parallel_data_in, serial_data_in, 0);
high_byte.assign(rst_n, 2, 0, (low_byte.q & 0x80), 0);
if (!global_chabge)
{
break;
}
}
}
void always_process_p(void)
{
low_byte.always_p();
high_byte.always_p();
}
void always_process_n(void)
{
low_byte.always_n();
high_byte.always_n();
}
//
// Отдельный поток/функция, обрабатывающая события эмулятора:
// - измнение входных сигналов
// - положительный и отрицательный фронты тактовой
//
for(;;)
{
switch(wait_event())
{
case EVENT_INPUT_CHANGE:
{
//
// Назначаем нужные входные сигналы всей схемы
// Обрабатываем assign всех модулей
//
assign_process();
break;
}
case EVENT_CLOCK_RISE:
{
//
// Обрабатываем положительный фронт тактовой
//
always_process_p();
assign_process();
break;
}
case EVENT_CLOCK_FALL:
{
//
// Обрабатываем отрицательный фронт тактовой
//
always_process_n();
assign_process();
break;
}
}
}