BESM6: Removed tabs, reindented, removed GNU extensions.

This commit is contained in:
Leo Broukhis 2014-12-30 11:42:52 -08:00
parent b4eeaa77de
commit cc33257836
15 changed files with 5776 additions and 5782 deletions

View file

@ -145,17 +145,17 @@ static void normalize_and_round (alureg_t acc, t_uint64 mr, int rnd_rq)
goto chk_zero; goto chk_zero;
} }
} }
chk_zero: chk_zero:
if (rr) if (rr)
rnd_rq = 0; rnd_rq = 0;
chk_rnd: chk_rnd:
if (acc.exponent & 0x8000) if (acc.exponent & 0x8000)
goto zero; goto zero;
if (! (RAU & RAU_ROUND_DISABLE) && rnd_rq) if (! (RAU & RAU_ROUND_DISABLE) && rnd_rq)
acc.mantissa |= 1; acc.mantissa |= 1;
if (! acc.mantissa && ! (RAU & RAU_NORM_DISABLE)) { if (! acc.mantissa && ! (RAU & RAU_NORM_DISABLE)) {
zero: ACC = 0; zero: ACC = 0;
RMR &= ~BITS40; RMR &= ~BITS40;
return; return;
} }

View file

@ -98,40 +98,40 @@ t_stat cpu_reset (DEVICE *dptr);
UNIT cpu_unit = { UDATA (NULL, UNIT_FIX, MEMSIZE) }; UNIT cpu_unit = { UDATA (NULL, UNIT_FIX, MEMSIZE) };
REG cpu_reg[] = { REG cpu_reg[] = {
{ "СчАС", &PC, 8, 15, 0, 1 }, /* счётчик адреса команды */ { "СчАС", &PC, 8, 15, 0, 1 }, /* счётчик адреса команды */
{ "РК", &RK, 8, 24, 0, 1 }, /* регистр выполняемой команды */ { "РК", &RK, 8, 24, 0, 1 }, /* регистр выполняемой команды */
{ "Аисп", &Aex, 8, 15, 0, 1 }, /* исполнительный адрес */ { "Аисп", &Aex, 8, 15, 0, 1 }, /* исполнительный адрес */
{ "СМ", &ACC, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* сумматор */ { "СМ", &ACC, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* сумматор */
{ "РМР", &RMR, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* регистр младших разрядов */ { "РМР", &RMR, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* регистр младших разрядов */
{ "РАУ", &RAU, 2, 6, 0, 1 }, /* режимы АУ */ { "РАУ", &RAU, 2, 6, 0, 1 }, /* режимы АУ */
{ "М1", &M[1], 8, 15, 0, 1 }, /* регистры-модификаторы */ { "М1", &M[1], 8, 15, 0, 1 }, /* регистры-модификаторы */
{ "М2", &M[2], 8, 15, 0, 1 }, { "М2", &M[2], 8, 15, 0, 1 },
{ "М3", &M[3], 8, 15, 0, 1 }, { "М3", &M[3], 8, 15, 0, 1 },
{ "М4", &M[4], 8, 15, 0, 1 }, { "М4", &M[4], 8, 15, 0, 1 },
{ "М5", &M[5], 8, 15, 0, 1 }, { "М5", &M[5], 8, 15, 0, 1 },
{ "М6", &M[6], 8, 15, 0, 1 }, { "М6", &M[6], 8, 15, 0, 1 },
{ "М7", &M[7], 8, 15, 0, 1 }, { "М7", &M[7], 8, 15, 0, 1 },
{ "М10", &M[010], 8, 15, 0, 1 }, { "М10", &M[010], 8, 15, 0, 1 },
{ "М11", &M[011], 8, 15, 0, 1 }, { "М11", &M[011], 8, 15, 0, 1 },
{ "М12", &M[012], 8, 15, 0, 1 }, { "М12", &M[012], 8, 15, 0, 1 },
{ "М13", &M[013], 8, 15, 0, 1 }, { "М13", &M[013], 8, 15, 0, 1 },
{ "М14", &M[014], 8, 15, 0, 1 }, { "М14", &M[014], 8, 15, 0, 1 },
{ "М15", &M[015], 8, 15, 0, 1 }, { "М15", &M[015], 8, 15, 0, 1 },
{ "М16", &M[016], 8, 15, 0, 1 }, { "М16", &M[016], 8, 15, 0, 1 },
{ "М17", &M[017], 8, 15, 0, 1 }, /* указатель магазина */ { "М17", &M[017], 8, 15, 0, 1 }, /* указатель магазина */
{ "М20", &M[020], 8, 15, 0, 1 }, /* MOD - модификатор адреса */ { "М20", &M[020], 8, 15, 0, 1 }, /* MOD - модификатор адреса */
{ "М21", &M[021], 8, 15, 0, 1 }, /* PSW - режимы УУ */ { "М21", &M[021], 8, 15, 0, 1 }, /* PSW - режимы УУ */
{ "М27", &M[027], 8, 15, 0, 1 }, /* SPSW - упрятывание режимов УУ */ { "М27", &M[027], 8, 15, 0, 1 }, /* SPSW - упрятывание режимов УУ */
{ "М32", &M[032], 8, 15, 0, 1 }, /* ERET - адрес возврата из экстракода */ { "М32", &M[032], 8, 15, 0, 1 }, /* ERET - адрес возврата из экстракода */
{ "М33", &M[033], 8, 15, 0, 1 }, /* IRET - адрес возврата из прерывания */ { "М33", &M[033], 8, 15, 0, 1 }, /* IRET - адрес возврата из прерывания */
{ "М34", &M[034], 8, 16, 0, 1 }, /* IBP - адрес прерывания по выполнению */ { "М34", &M[034], 8, 16, 0, 1 }, /* IBP - адрес прерывания по выполнению */
{ "М35", &M[035], 8, 16, 0, 1 }, /* DWP - адрес прерывания по чтению/записи */ { "М35", &M[035], 8, 16, 0, 1 }, /* DWP - адрес прерывания по чтению/записи */
{ "РУУ", &RUU, 2, 9, 0, 1 }, /* ПКП, ПКЛ, РежЭ, РежПр, ПрИК, БРО, ПрК */ { "РУУ", &RUU, 2, 9, 0, 1 }, /* ПКП, ПКЛ, РежЭ, РежПр, ПрИК, БРО, ПрК */
{ "ГРП", &GRP, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* главный регистр прерываний */ { "ГРП", &GRP, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* главный регистр прерываний */
{ "МГРП", &MGRP, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* маска ГРП */ { "МГРП", &MGRP, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* маска ГРП */
{ "ПРП", &PRP, 8, 24, 0, 1 }, /* периферийный регистр прерываний */ { "ПРП", &PRP, 8, 24, 0, 1 }, /* периферийный регистр прерываний */
{ "МПРП", &MPRP, 8, 24, 0, 1 }, /* маска ПРП */ { "МПРП", &MPRP, 8, 24, 0, 1 }, /* маска ПРП */
{ 0 } { 0 }
}; };
MTAB cpu_mod[] = { MTAB cpu_mod[] = {
@ -150,74 +150,74 @@ DEVICE cpu_dev = {
* REG: псевдоустройство, содержащее латинские синонимы всех регистров. * REG: псевдоустройство, содержащее латинские синонимы всех регистров.
*/ */
REG reg_reg[] = { REG reg_reg[] = {
{ "PC", &PC, 8, 15, 0, 1 }, /* счётчик адреса команды */ { "PC", &PC, 8, 15, 0, 1 }, /* счётчик адреса команды */
{ "RK", &RK, 8, 24, 0, 1 }, /* регистр выполняемой команды */ { "RK", &RK, 8, 24, 0, 1 }, /* регистр выполняемой команды */
{ "Aex", &Aex, 8, 15, 0, 1 }, /* исполнительный адрес */ { "Aex", &Aex, 8, 15, 0, 1 }, /* исполнительный адрес */
{ "ACC", &ACC, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* сумматор */ { "ACC", &ACC, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* сумматор */
{ "RMR", &RMR, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* регистр младших разрядов */ { "RMR", &RMR, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* регистр младших разрядов */
{ "RAU", &RAU, 2, 6, 0, 1 }, /* режимы АУ */ { "RAU", &RAU, 2, 6, 0, 1 }, /* режимы АУ */
{ "M1", &M[1], 8, 15, 0, 1 }, /* регистры-модификаторы */ { "M1", &M[1], 8, 15, 0, 1 }, /* регистры-модификаторы */
{ "M2", &M[2], 8, 15, 0, 1 }, { "M2", &M[2], 8, 15, 0, 1 },
{ "M3", &M[3], 8, 15, 0, 1 }, { "M3", &M[3], 8, 15, 0, 1 },
{ "M4", &M[4], 8, 15, 0, 1 }, { "M4", &M[4], 8, 15, 0, 1 },
{ "M5", &M[5], 8, 15, 0, 1 }, { "M5", &M[5], 8, 15, 0, 1 },
{ "M6", &M[6], 8, 15, 0, 1 }, { "M6", &M[6], 8, 15, 0, 1 },
{ "M7", &M[7], 8, 15, 0, 1 }, { "M7", &M[7], 8, 15, 0, 1 },
{ "M10", &M[010], 8, 15, 0, 1 }, { "M10", &M[010], 8, 15, 0, 1 },
{ "M11", &M[011], 8, 15, 0, 1 }, { "M11", &M[011], 8, 15, 0, 1 },
{ "M12", &M[012], 8, 15, 0, 1 }, { "M12", &M[012], 8, 15, 0, 1 },
{ "M13", &M[013], 8, 15, 0, 1 }, { "M13", &M[013], 8, 15, 0, 1 },
{ "M14", &M[014], 8, 15, 0, 1 }, { "M14", &M[014], 8, 15, 0, 1 },
{ "M15", &M[015], 8, 15, 0, 1 }, { "M15", &M[015], 8, 15, 0, 1 },
{ "M16", &M[016], 8, 15, 0, 1 }, { "M16", &M[016], 8, 15, 0, 1 },
{ "M17", &M[017], 8, 15, 0, 1 }, /* указатель магазина */ { "M17", &M[017], 8, 15, 0, 1 }, /* указатель магазина */
{ "M20", &M[020], 8, 15, 0, 1 }, /* MOD - модификатор адреса */ { "M20", &M[020], 8, 15, 0, 1 }, /* MOD - модификатор адреса */
{ "M21", &M[021], 8, 15, 0, 1 }, /* PSW - режимы УУ */ { "M21", &M[021], 8, 15, 0, 1 }, /* PSW - режимы УУ */
{ "M27", &M[027], 8, 15, 0, 1 }, /* SPSW - упрятывание режимов УУ */ { "M27", &M[027], 8, 15, 0, 1 }, /* SPSW - упрятывание режимов УУ */
{ "M32", &M[032], 8, 15, 0, 1 }, /* ERET - адрес возврата из экстракода */ { "M32", &M[032], 8, 15, 0, 1 }, /* ERET - адрес возврата из экстракода */
{ "M33", &M[033], 8, 15, 0, 1 }, /* IRET - адрес возврата из прерывания */ { "M33", &M[033], 8, 15, 0, 1 }, /* IRET - адрес возврата из прерывания */
{ "M34", &M[034], 8, 16, 0, 1 }, /* IBP - адрес прерывания по выполнению */ { "M34", &M[034], 8, 16, 0, 1 }, /* IBP - адрес прерывания по выполнению */
{ "M35", &M[035], 8, 16, 0, 1 }, /* DWP - адрес прерывания по чтению/записи */ { "M35", &M[035], 8, 16, 0, 1 }, /* DWP - адрес прерывания по чтению/записи */
{ "RUU", &RUU, 2, 9, 0, 1 }, /* ПКП, ПКЛ, РежЭ, РежПр, ПрИК, БРО, ПрК */ { "RUU", &RUU, 2, 9, 0, 1 }, /* ПКП, ПКЛ, РежЭ, РежПр, ПрИК, БРО, ПрК */
{ "GRP", &GRP, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* главный регистр прерываний */ { "GRP", &GRP, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* главный регистр прерываний */
{ "MGRP", &MGRP, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* маска ГРП */ { "MGRP", &MGRP, 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* маска ГРП */
{ "PRP", &PRP, 8, 24, 0, 1 }, /* периферийный регистр прерываний */ { "PRP", &PRP, 8, 24, 0, 1 }, /* периферийный регистр прерываний */
{ "MPRP", &MPRP, 8, 24, 0, 1 }, /* маска ПРП */ { "MPRP", &MPRP, 8, 24, 0, 1 }, /* маска ПРП */
{ "BRZ0", &BRZ[0], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "BRZ0", &BRZ[0], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "BRZ1", &BRZ[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "BRZ1", &BRZ[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "BRZ2", &BRZ[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "BRZ2", &BRZ[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "BRZ3", &BRZ[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "BRZ3", &BRZ[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "BRZ4", &BRZ[4], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "BRZ4", &BRZ[4], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "BRZ5", &BRZ[5], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "BRZ5", &BRZ[5], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "BRZ6", &BRZ[6], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "BRZ6", &BRZ[6], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "BRZ7", &BRZ[7], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "BRZ7", &BRZ[7], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "BAZ0", &BAZ[0], 8, 16, 0, 1 }, { "BAZ0", &BAZ[0], 8, 16, 0, 1 },
{ "BAZ1", &BAZ[1], 8, 16, 0, 1 }, { "BAZ1", &BAZ[1], 8, 16, 0, 1 },
{ "BAZ2", &BAZ[2], 8, 16, 0, 1 }, { "BAZ2", &BAZ[2], 8, 16, 0, 1 },
{ "BAZ3", &BAZ[3], 8, 16, 0, 1 }, { "BAZ3", &BAZ[3], 8, 16, 0, 1 },
{ "BAZ4", &BAZ[4], 8, 16, 0, 1 }, { "BAZ4", &BAZ[4], 8, 16, 0, 1 },
{ "BAZ5", &BAZ[5], 8, 16, 0, 1 }, { "BAZ5", &BAZ[5], 8, 16, 0, 1 },
{ "BAZ6", &BAZ[6], 8, 16, 0, 1 }, { "BAZ6", &BAZ[6], 8, 16, 0, 1 },
{ "BAZ7", &BAZ[7], 8, 16, 0, 1 }, { "BAZ7", &BAZ[7], 8, 16, 0, 1 },
{ "TABST", &TABST, 8, 28, 0, 1 }, { "TABST", &TABST, 8, 28, 0, 1 },
{ "RP0", &RP[0], 8, 48, 0, 1, NULL, NULL, REG_VMIO }, { "RP0", &RP[0], 8, 48, 0, 1, NULL, NULL, REG_VMIO },
{ "RP1", &RP[1], 8, 48, 0, 1, NULL, NULL, REG_VMIO }, { "RP1", &RP[1], 8, 48, 0, 1, NULL, NULL, REG_VMIO },
{ "RP2", &RP[2], 8, 48, 0, 1, NULL, NULL, REG_VMIO }, { "RP2", &RP[2], 8, 48, 0, 1, NULL, NULL, REG_VMIO },
{ "RP3", &RP[3], 8, 48, 0, 1, NULL, NULL, REG_VMIO }, { "RP3", &RP[3], 8, 48, 0, 1, NULL, NULL, REG_VMIO },
{ "RP4", &RP[4], 8, 48, 0, 1, NULL, NULL, REG_VMIO }, { "RP4", &RP[4], 8, 48, 0, 1, NULL, NULL, REG_VMIO },
{ "RP5", &RP[5], 8, 48, 0, 1, NULL, NULL, REG_VMIO }, { "RP5", &RP[5], 8, 48, 0, 1, NULL, NULL, REG_VMIO },
{ "RP6", &RP[6], 8, 48, 0, 1, NULL, NULL, REG_VMIO }, { "RP6", &RP[6], 8, 48, 0, 1, NULL, NULL, REG_VMIO },
{ "RP7", &RP[7], 8, 48, 0, 1, NULL, NULL, REG_VMIO }, { "RP7", &RP[7], 8, 48, 0, 1, NULL, NULL, REG_VMIO },
{ "RZ", &RZ, 8, 32, 0, 1 }, { "RZ", &RZ, 8, 32, 0, 1 },
{ "FP1", &pult[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "FP1", &pult[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "FP2", &pult[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "FP2", &pult[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "FP3", &pult[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "FP3", &pult[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "FP4", &pult[4], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "FP4", &pult[4], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "FP5", &pult[5], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "FP5", &pult[5], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "FP6", &pult[6], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "FP6", &pult[6], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ "FP7", &pult[7], 8, 50, 0, 1, NULL, NULL, REG_VMIO }, { "FP7", &pult[7], 8, 50, 0, 1, NULL, NULL, REG_VMIO },
{ 0 } { 0 }
}; };
UNIT reg_unit = { UNIT reg_unit = {
@ -447,15 +447,16 @@ static void cmd_002 ()
besm6_debug ("*** рег %03o", Aex & 0377); besm6_debug ("*** рег %03o", Aex & 0377);
#endif #endif
switch (Aex & 0377) { switch (Aex & 0377) {
case 0 ... 7: case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
/* Запись в БРЗ */ /* Запись в БРЗ */
mmu_setcache (Aex & 7, ACC); mmu_setcache (Aex & 7, ACC);
break; break;
case 020 ... 027: case 020: case 021: case 022: case 023:
case 024: case 025: case 026: case 027:
/* Запись в регистры приписки */ /* Запись в регистры приписки */
mmu_setrp (Aex & 7, ACC); mmu_setrp (Aex & 7, ACC);
break; break;
case 030 ... 033: case 030: case 031: case 032: case 033:
/* Запись в регистры защиты */ /* Запись в регистры защиты */
mmu_setprotection (Aex & 3, ACC); mmu_setprotection (Aex & 3, ACC);
break; break;
@ -468,8 +469,12 @@ static void cmd_002 ()
/* нехранящие биты невозможно погасить */ /* нехранящие биты невозможно погасить */
GRP &= ACC | GRP_WIRED_BITS; GRP &= ACC | GRP_WIRED_BITS;
break; break;
case 0100 ... 0137: case 64: case 65: case 66: case 67: case 68: case 69: case 70: case 71:
/* Бит 1: управление блокировкой режима останова БРО. case 72: case 73: case 74: case 75: case 76: case 77: case 78: case 79:
case 80: case 81: case 82: case 83: case 84: case 85: case 86: case 87:
case 88: case 89: case 90: case 91: case 92: case 93: case 94: case 95:
/* 0100 - 0137:
* Бит 1: управление блокировкой режима останова БРО.
* Биты 2 и 3 - признаки формирования контрольных * Биты 2 и 3 - признаки формирования контрольных
* разрядов (ПКП и ПКЛ). */ * разрядов (ПКП и ПКЛ). */
if (Aex & 1) if (Aex & 1)
@ -485,12 +490,8 @@ static void cmd_002 ()
else else
RUU &= ~RUU_CONVOL_LEFT; RUU &= ~RUU_CONVOL_LEFT;
break; break;
case 0140 ... 0177: case 0200: case 0201: case 0202: case 0203:
/* TODO: управление блокировкой схемы case 0204: case 0205: case 0206: case 0207:
* автоматического запуска */
longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break;
case 0200 ... 0207:
/* Чтение БРЗ */ /* Чтение БРЗ */
ACC = mmu_getcache (Aex & 7); ACC = mmu_getcache (Aex & 7);
break; break;
@ -499,6 +500,11 @@ static void cmd_002 ()
ACC = GRP; ACC = GRP;
break; break;
default: default:
if ((Aex & 0340) == 0140) {
/* TODO: управление блокировкой схемы
* автоматического запуска */
longjmp (cpu_halt, STOP_UNIMPLEMENTED);
}
/* Неиспользуемые адреса */ /* Неиспользуемые адреса */
besm6_debug ("*** %05o%s: РЕГ %o - неправильный адрес спец.регистра", besm6_debug ("*** %05o%s: РЕГ %o - неправильный адрес спец.регистра",
PC, (RUU & RUU_RIGHT_INSTR) ? "п" : "л", Aex); PC, (RUU & RUU_RIGHT_INSTR) ? "п" : "л", Aex);
@ -520,32 +526,32 @@ static void cmd_033 ()
/* Точно неизвестно, что это такое, но драйвер МД /* Точно неизвестно, что это такое, но драйвер МД
* иногда выдает команду "увв 0". */ * иногда выдает команду "увв 0". */
break; break;
case 1 ... 2: case 1: case 2:
/* Управление обменом с магнитными барабанами */ /* Управление обменом с магнитными барабанами */
drum (Aex - 1, (uint32) ACC); drum (Aex - 1, (uint32) ACC);
break; break;
case 3 ... 4: case 3: case 4:
/* Передача управляющего слова для обмена /* Передача управляющего слова для обмена
* с магнитными дисками */ * с магнитными дисками */
disk_io (Aex - 3, (uint32) ACC); disk_io (Aex - 3, (uint32) ACC);
break; break;
case 5 ... 7: case 5: case 6: case 7:
/* TODO: управление обменом с магнитными лентами */ /* TODO: управление обменом с магнитными лентами */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 010 ... 011: case 010: case 011:
/* управление устройствами ввода с перфоленты */ /* управление устройствами ввода с перфоленты */
fs_control (Aex - 010, (uint32) (ACC & 07)); fs_control (Aex - 010, (uint32) (ACC & 07));
break; break;
case 012 ... 013: case 012: case 013:
/* TODO: управление устройствами ввода с перфоленты по запаянной программе */ /* TODO: управление устройствами ввода с перфоленты по запаянной программе */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 014 ... 015: case 014: case 015:
/* Управление АЦПУ */ /* Управление АЦПУ */
printer_control (Aex - 014, (uint32) (ACC & 017)); printer_control (Aex - 014, (uint32) (ACC & 017));
break; break;
case 023 ... 024: case 023: case 024:
/* Управление обменом с магнитными дисками */ /* Управление обменом с магнитными дисками */
disk_ctl (Aex - 023, (uint32) ACC); disk_ctl (Aex - 023, (uint32) ACC);
break; break;
@ -560,7 +566,7 @@ static void cmd_033 ()
PC, (RUU & RUU_RIGHT_INSTR) ? "п" : "л", ACC << 24);*/ PC, (RUU & RUU_RIGHT_INSTR) ? "п" : "л", ACC << 24);*/
GRP |= (ACC & BITS(24)) << 24; GRP |= (ACC & BITS(24)) << 24;
break; break;
case 032 ... 033: case 032: case 033:
/* TODO: имитация сигналов из КМБ в КВУ */ /* TODO: имитация сигналов из КМБ в КВУ */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
@ -574,15 +580,13 @@ static void cmd_033 ()
* с МБ и МЛ, имитация обмена */ * с МБ и МЛ, имитация обмена */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 040 ... 057: case 040: case 041: case 042: case 043:
case 044: case 045: case 046: case 047:
case 050: case 051: case 052: case 053:
case 054: case 055: case 056: case 057:
/* Управление молоточками АЦПУ */ /* Управление молоточками АЦПУ */
printer_hammer (Aex >= 050, Aex & 7, (uint32) (ACC & BITS(16))); printer_hammer (Aex >= 050, Aex & 7, (uint32) (ACC & BITS(16)));
break; break;
case 0100 ... 0137:
/* Управление лентопротяжными механизмами
* и гашение разрядов регистров признаков
* окончания подвода зоны. Игнорируем. */
break;
case 0140: case 0140:
/* Запись в регистр телеграфных каналов */ /* Запись в регистр телеграфных каналов */
tty_send ((uint32) ACC & BITS(24)); tty_send ((uint32) ACC & BITS(24));
@ -599,7 +603,7 @@ static void cmd_033 ()
/* Запись в регистр управления электропитанием, */ /* Запись в регистр управления электропитанием, */
/* не оказывает видимого эффекта на выполнение */ /* не оказывает видимого эффекта на выполнение */
break; break;
case 0150 ... 0151: case 0150: case 0151:
/* TODO: управление вводом с перфокарт */ /* TODO: управление вводом с перфокарт */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
@ -607,19 +611,19 @@ static void cmd_033 ()
/* гашение аппаратуры сопряжения с терминалами */ /* гашение аппаратуры сопряжения с терминалами */
/* besm6_debug(">>> гашение АС: %08o", (uint32) ACC & BITS(24));*/ /* besm6_debug(">>> гашение АС: %08o", (uint32) ACC & BITS(24));*/
break; break;
case 0154 ... 0155: case 0154: case 0155:
/* TODO: управление выводом на перфокарты */ /* TODO: управление выводом на перфокарты */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 0160 ... 0167: case 0160: case 0167:
/* TODO: управление электромагнитами пробивки перфокарт */ /* TODO: управление электромагнитами пробивки перфокарт */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 0170 ... 0171: case 0170: case 0171:
/* TODO: пробивка строки на перфоленте */ /* TODO: пробивка строки на перфоленте */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 0174 ... 0175: case 0174: case 0175:
/* Выдача кода в пульт оператора */ /* Выдача кода в пульт оператора */
consul_print (Aex & 1, (uint32) ACC & BITS(8)); consul_print (Aex & 1, (uint32) ACC & BITS(8));
break; break;
@ -627,11 +631,11 @@ static void cmd_033 ()
/* управление табло ГПВЦ СО АН СССР */ /* управление табло ГПВЦ СО АН СССР */
/* besm6_debug(">>> ТАБЛО: %08o", (uint32) ACC & BITS(24));*/ /* besm6_debug(">>> ТАБЛО: %08o", (uint32) ACC & BITS(24));*/
break; break;
case 04001 ... 04002: case 04001: case 04002:
/* TODO: считывание слога в режиме имитации обмена */ /* TODO: считывание слога в режиме имитации обмена */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 04003 ... 04004: case 04003: case 04004:
/* Запрос статуса контроллера магнитных дисков */ /* Запрос статуса контроллера магнитных дисков */
ACC = disk_state (Aex - 04003); ACC = disk_state (Aex - 04003);
break; break;
@ -645,16 +649,16 @@ static void cmd_033 ()
* в запаянной программе ввода с перфоленты */ * в запаянной программе ввода с перфоленты */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 04014 ... 04015: case 04014: case 04015:
/* считывание строки с устройства ввода с перфоленты */ /* считывание строки с устройства ввода с перфоленты */
ACC = fs_read (Aex - 04014); ACC = fs_read (Aex - 04014);
break; break;
case 04016 ... 04017: case 04016: case 04017:
/* TODO: считывание строки с устройства /* TODO: считывание строки с устройства
* ввода с перфоленты */ * ввода с перфоленты */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 04020 ... 04023: case 04020: case 04021: case 04022: case 04023:
/* TODO: считывание слога в режиме имитации /* TODO: считывание слога в режиме имитации
* внешнего обмена */ * внешнего обмена */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
@ -685,7 +689,7 @@ static void cmd_033 ()
/* besm6_debug("Reading punchcard/punchtape READY @%05o", PC);*/ /* besm6_debug("Reading punchcard/punchtape READY @%05o", PC);*/
ACC = READY2; ACC = READY2;
break; break;
case 04103 ... 04106: case 04103: case 04104: case 04105: case 04106:
/* Опрос состояния лентопротяжных механизмов. /* Опрос состояния лентопротяжных механизмов.
* Все устройства не готовы. */ * Все устройства не готовы. */
ACC = BITS(24); ACC = BITS(24);
@ -699,20 +703,12 @@ static void cmd_033 ()
* группами по 8 штук каждые несколько секунд. */ * группами по 8 штук каждые несколько секунд. */
ACC = 0; ACC = 0;
break; break;
case 04140 ... 04157: case 04170: case 04171: case 04172: case 04173:
/* TODO: считывание строки перфокарты */
longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break;
case 04160 ... 04167:
/* TODO: контрольное считывание строки перфокарты */
longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break;
case 04170 ... 04173:
/* TODO: считывание контрольного кода /* TODO: считывание контрольного кода
* строки перфоленты */ * строки перфоленты */
longjmp (cpu_halt, STOP_UNIMPLEMENTED); longjmp (cpu_halt, STOP_UNIMPLEMENTED);
break; break;
case 04174 ... 04175: case 04174: case 04175:
/* Считывание кода с пульта оператора */ /* Считывание кода с пульта оператора */
ACC = consul_read (Aex & 1); ACC = consul_read (Aex & 1);
break; break;
@ -720,13 +716,26 @@ static void cmd_033 ()
/* чтение табло ГПВЦ СО АН СССР */ /* чтение табло ГПВЦ СО АН СССР */
ACC = 0; ACC = 0;
break; break;
default: default: {
unsigned val = Aex & 04177;
if (0100 <= val && val <= 0137) {
/* Управление лентопротяжными механизмами
* и гашение разрядов регистров признаков
* окончания подвода зоны. Игнорируем. */
} else if (04140 <= val && val <= 04157) {
/* TODO: считывание строки перфокарты */
longjmp (cpu_halt, STOP_UNIMPLEMENTED);
} else if (04160 <= val && val <= 04167) {
/* TODO: контрольное считывание строки перфокарты */
longjmp (cpu_halt, STOP_UNIMPLEMENTED);
} else {
/* Неиспользуемые адреса */ /* Неиспользуемые адреса */
/* if (sim_deb && cpu_dev.dctrl)*/ /* if (sim_deb && cpu_dev.dctrl)*/
besm6_debug ("*** %05o%s: УВВ %o - неправильный адрес ввода-вывода", besm6_debug ("*** %05o%s: УВВ %o - неправильный адрес ввода-вывода",
PC, (RUU & RUU_RIGHT_INSTR) ? "п" : "л", Aex); PC, (RUU & RUU_RIGHT_INSTR) ? "п" : "л", Aex);
ACC = 0; ACC = 0;
break; }
} break;
} }
} }
@ -1199,7 +1208,7 @@ void cpu_one_inst ()
} }
case 042: /* счи, ita */ case 042: /* счи, ita */
delay = MEAN_TIME (6, 3); delay = MEAN_TIME (6, 3);
load_modifier: Aex = ADDR (addr + M[reg]); load_modifier: Aex = ADDR (addr + M[reg]);
ACC = ADDR(M[Aex & (IS_SUPERVISOR (RUU) ? 037 : 017)]); ACC = ADDR(M[Aex & (IS_SUPERVISOR (RUU) ? 037 : 017)]);
RAU = SET_LOGICAL (RAU); RAU = SET_LOGICAL (RAU);
break; break;
@ -1211,7 +1220,7 @@ load_modifier: Aex = ADDR (addr + M[reg]);
case 044: /* уии, mtj */ case 044: /* уии, mtj */
Aex = addr; Aex = addr;
if (IS_SUPERVISOR (RUU)) { if (IS_SUPERVISOR (RUU)) {
transfer_modifier: M[Aex & 037] = M[reg]; transfer_modifier: M[Aex & 037] = M[reg];
if ((M[PSW] & PSW_MMAP_DISABLE) && if ((M[PSW] & PSW_MMAP_DISABLE) &&
((Aex & 037) == IBP || (Aex & 037) == DWP)) ((Aex & 037) == IBP || (Aex & 037) == DWP))
M[Aex & 037] |= BBIT(16); M[Aex & 037] |= BBIT(16);
@ -1245,7 +1254,12 @@ transfer_modifier: M[Aex & 037] = M[reg];
M[0] = 0; M[0] = 0;
delay = 6; delay = 6;
break; break;
case 050 ... 077: /* э50...э77 */ case 050: case 051: case 052: case 053:
case 054: case 055: case 056: case 057:
case 060: case 061: case 062: case 063:
case 064: case 065: case 066: case 067:
case 070: case 071: case 072: case 073:
case 074: case 075: case 076: case 077: /* э50...э77 */
case 0200: /* э20 */ case 0200: /* э20 */
case 0210: /* э21 */ case 0210: /* э21 */
stop_as_extracode: stop_as_extracode:
@ -1411,7 +1425,7 @@ transfer_modifier: M[Aex & 037] = M[reg];
longjmp (cpu_halt, STOP_STOP); longjmp (cpu_halt, STOP_STOP);
break; break;
case 0340: /* пио, vzm */ case 0340: /* пио, vzm */
branch_zero: Aex = addr; branch_zero: Aex = addr;
delay = 4; delay = 4;
if (! M[reg]) { if (! M[reg]) {
PC = addr; PC = addr;
@ -1547,7 +1561,7 @@ t_stat sim_instr (void)
*/ */
switch (r) { switch (r) {
default: default:
ret: besm6_draw_panel(); ret: besm6_draw_panel();
return r; return r;
case STOP_RWATCH: case STOP_RWATCH:
case STOP_WWATCH: case STOP_WWATCH:

View file

@ -31,6 +31,7 @@
#define _BESM6_DEFS_H_ 0 #define _BESM6_DEFS_H_ 0
#include "sim_defs.h" /* simulator defns */ #include "sim_defs.h" /* simulator defns */
#include "scp.h"
#include <setjmp.h> #include <setjmp.h>
/* /*
@ -123,11 +124,6 @@ enum {
#define USEC 10 /* одна микросекунда - десять тактов */ #define USEC 10 /* одна микросекунда - десять тактов */
#define MSEC (1000*USEC) /* одна миллисекунда */ #define MSEC (1000*USEC) /* одна миллисекунда */
extern uint32 sim_brk_types, sim_brk_dflt, sim_brk_summ; /* breakpoint info */
extern int32 sim_interval, sim_step;
extern FILE *sim_deb, *sim_log;
extern int32 sim_switches;
extern UNIT cpu_unit; extern UNIT cpu_unit;
extern t_value memory [MEMSIZE]; extern t_value memory [MEMSIZE];
extern t_value pult [8]; extern t_value pult [8];

View file

@ -96,20 +96,20 @@ UNIT disk_unit [16] = {
}; };
REG disk_reg[] = { REG disk_reg[] = {
{ "КУС_0", &controller[0].op, 8, 24, 0, 1 }, { "КУС_0", &controller[0].op, 8, 24, 0, 1 },
{ "УСТР_0", &controller[0].dev, 8, 3, 0, 1 }, { "УСТР_0", &controller[0].dev, 8, 3, 0, 1 },
{ "ЗОНА_0", &controller[0].zone, 8, 10, 0, 1 }, { "ЗОНА_0", &controller[0].zone, 8, 10, 0, 1 },
{ "ДОРОЖКА_0", &controller[0].track, 8, 2, 0, 1 }, { "ДОРОЖКА_0", &controller[0].track, 8, 2, 0, 1 },
{ "МОЗУ_0", &controller[0].memory, 8, 20, 0, 1 }, { "МОЗУ_0", &controller[0].memory, 8, 20, 0, 1 },
{ "РС_0", &controller[0].status, 8, 24, 0, 1 }, { "РС_0", &controller[0].status, 8, 24, 0, 1 },
{ "КУС_1", &controller[1].op, 8, 24, 0, 1 }, { "КУС_1", &controller[1].op, 8, 24, 0, 1 },
{ "УСТР_1", &controller[1].dev, 8, 3, 0, 1 }, { "УСТР_1", &controller[1].dev, 8, 3, 0, 1 },
{ "ЗОНА_1", &controller[1].zone, 8, 10, 0, 1 }, { "ЗОНА_1", &controller[1].zone, 8, 10, 0, 1 },
{ "ДОРОЖКА_1", &controller[1].track, 8, 2, 0, 1 }, { "ДОРОЖКА_1", &controller[1].track, 8, 2, 0, 1 },
{ "МОЗУ_1", &controller[1].memory, 8, 20, 0, 1 }, { "МОЗУ_1", &controller[1].memory, 8, 20, 0, 1 },
{ "РС_1", &controller[1].status, 8, 24, 0, 1 }, { "РС_1", &controller[1].status, 8, 24, 0, 1 },
{ "ОШ", &disk_fail, 8, 6, 0, 1 }, { "ОШ", &disk_fail, 8, 6, 0, 1 },
{ 0 } { 0 }
}; };
MTAB disk_mod[] = { MTAB disk_mod[] = {

View file

@ -69,12 +69,12 @@ UNIT drum_unit [] = {
}; };
REG drum_reg[] = { REG drum_reg[] = {
{ "УС", &drum_op, 8, 24, 0, 1 }, { "УС", &drum_op, 8, 24, 0, 1 },
{ "ЗОНА", &drum_zone, 8, 10, 0, 1 }, { "ЗОНА", &drum_zone, 8, 10, 0, 1 },
{ "СЕКТОР", &drum_sector, 8, 2, 0, 1 }, { "СЕКТОР", &drum_sector, 8, 2, 0, 1 },
{ "МОЗУ", &drum_memory, 8, 15, 0, 1 }, { "МОЗУ", &drum_memory, 8, 15, 0, 1 },
{ "СЧСЛОВ", &drum_nwords, 8, 11, 0, 1 }, { "СЧСЛОВ", &drum_nwords, 8, 11, 0, 1 },
{ 0 } { 0 }
}; };
MTAB drum_mod[] = { MTAB drum_mod[] = {

View file

@ -61,51 +61,51 @@ unsigned iintr_data; /* protected page number or parity check location */
t_value pult[8]; t_value pult[8];
REG mmu_reg[] = { REG mmu_reg[] = {
{ "БРЗ0", &BRZ[0], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, /* Буферные регистры записи */ { "БРЗ0", &BRZ[0], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, /* Буферные регистры записи */
{ "БРЗ1", &BRZ[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРЗ1", &BRZ[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРЗ2", &BRZ[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРЗ2", &BRZ[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРЗ3", &BRZ[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРЗ3", &BRZ[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРЗ4", &BRZ[4], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРЗ4", &BRZ[4], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРЗ5", &BRZ[5], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРЗ5", &BRZ[5], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРЗ6", &BRZ[6], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРЗ6", &BRZ[6], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРЗ7", &BRZ[7], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРЗ7", &BRZ[7], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БАЗ0", &BAZ[0], 8, 16, 0, 1 }, /* Буферные адреса записи */ { "БАЗ0", &BAZ[0], 8, 16, 0, 1 }, /* Буферные адреса записи */
{ "БАЗ1", &BAZ[1], 8, 16, 0, 1 }, { "БАЗ1", &BAZ[1], 8, 16, 0, 1 },
{ "БАЗ2", &BAZ[2], 8, 16, 0, 1 }, { "БАЗ2", &BAZ[2], 8, 16, 0, 1 },
{ "БАЗ3", &BAZ[3], 8, 16, 0, 1 }, { "БАЗ3", &BAZ[3], 8, 16, 0, 1 },
{ "БАЗ4", &BAZ[4], 8, 16, 0, 1 }, { "БАЗ4", &BAZ[4], 8, 16, 0, 1 },
{ "БАЗ5", &BAZ[5], 8, 16, 0, 1 }, { "БАЗ5", &BAZ[5], 8, 16, 0, 1 },
{ "БАЗ6", &BAZ[6], 8, 16, 0, 1 }, { "БАЗ6", &BAZ[6], 8, 16, 0, 1 },
{ "БАЗ7", &BAZ[7], 8, 16, 0, 1 }, { "БАЗ7", &BAZ[7], 8, 16, 0, 1 },
{ "ТАБСТ", &TABST, 8, 28, 0, 1, NULL, NULL, REG_HIDDEN },/* Таблица старшинства БРЗ */ { "ТАБСТ", &TABST, 8, 28, 0, 1, NULL, NULL, REG_HIDDEN },/* Таблица старшинства БРЗ */
{ "ЗпТР", &FLUSH, 8, 4, 0, 1, NULL, NULL, REG_HIDDEN },/* Признак выталкивания БРЗ */ { "ЗпТР", &FLUSH, 8, 4, 0, 1, NULL, NULL, REG_HIDDEN },/* Признак выталкивания БРЗ */
{ "Старш", &OLDEST, 8, 3, 0, 1 }, /* Номер вытолкнутого БРЗ */ { "Старш", &OLDEST, 8, 3, 0, 1 }, /* Номер вытолкнутого БРЗ */
{ "РП0", &RP[0], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* Регистры приписки, по 12 бит */ { "РП0", &RP[0], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, /* Регистры приписки, по 12 бит */
{ "РП1", &RP[1], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, { "РП1", &RP[1], 8, 48, 0, 1, NULL, NULL, REG_VMIO},
{ "РП2", &RP[2], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, { "РП2", &RP[2], 8, 48, 0, 1, NULL, NULL, REG_VMIO},
{ "РП3", &RP[3], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, { "РП3", &RP[3], 8, 48, 0, 1, NULL, NULL, REG_VMIO},
{ "РП4", &RP[4], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, { "РП4", &RP[4], 8, 48, 0, 1, NULL, NULL, REG_VMIO},
{ "РП5", &RP[5], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, { "РП5", &RP[5], 8, 48, 0, 1, NULL, NULL, REG_VMIO},
{ "РП6", &RP[6], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, { "РП6", &RP[6], 8, 48, 0, 1, NULL, NULL, REG_VMIO},
{ "РП7", &RP[7], 8, 48, 0, 1, NULL, NULL, REG_VMIO}, { "РП7", &RP[7], 8, 48, 0, 1, NULL, NULL, REG_VMIO},
{ "РЗ", &RZ, 8, 32, 0, 1 }, /* Регистр защиты */ { "РЗ", &RZ, 8, 32, 0, 1 }, /* Регистр защиты */
{ "ТР1", &pult[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, /* Тумблерные регистры */ { "ТР1", &pult[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, /* Тумблерные регистры */
{ "ТР2", &pult[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "ТР2", &pult[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "ТР3", &pult[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "ТР3", &pult[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "ТР4", &pult[4], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "ТР4", &pult[4], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "ТР5", &pult[5], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "ТР5", &pult[5], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "ТР6", &pult[6], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "ТР6", &pult[6], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "ТР7", &pult[7], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "ТР7", &pult[7], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРС0", &BRS[0], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, /* Буферные регистры слов */ { "БРС0", &BRS[0], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, /* Буферные регистры слов */
{ "БРС1", &BRS[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРС1", &BRS[1], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРС2", &BRS[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРС2", &BRS[2], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БРС3", &BRS[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO}, { "БРС3", &BRS[3], 8, 50, 0, 1, NULL, NULL, REG_VMIO},
{ "БАС0", &BAS[0], 8, 16, 0, 1 }, /* Буферные адреса слов */ { "БАС0", &BAS[0], 8, 16, 0, 1 }, /* Буферные адреса слов */
{ "БАС1", &BAS[1], 8, 16, 0, 1 }, { "БАС1", &BAS[1], 8, 16, 0, 1 },
{ "БАС2", &BAS[2], 8, 16, 0, 1 }, { "БАС2", &BAS[2], 8, 16, 0, 1 },
{ "БАС3", &BAS[3], 8, 16, 0, 1 }, { "БАС3", &BAS[3], 8, 16, 0, 1 },
{ "БРСст", &BRSLRU, 8, 6, 0, 1, NULL, NULL, REG_HIDDEN}, { "БРСст", &BRSLRU, 8, 6, 0, 1, NULL, NULL, REG_HIDDEN},
{ 0 } { 0 }
}; };
#define CACHE_ENB 1 #define CACHE_ENB 1
@ -261,7 +261,7 @@ void mmu_flush_by_age()
switch (FLUSH) { switch (FLUSH) {
case 0: case 0:
break; break;
case 1 ... 8: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
set_wins (OLDEST); set_wins (OLDEST);
mmu_update_oldest (); mmu_update_oldest ();
mmu_flush (OLDEST); mmu_flush (OLDEST);
@ -279,7 +279,7 @@ void mmu_flush_by_number()
switch (FLUSH) { switch (FLUSH) {
case 0: case 0:
break; break;
case 1 ... 8: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
mmu_flush (FLUSH-1); mmu_flush (FLUSH-1);
set_wins (FLUSH-1); set_wins (FLUSH-1);
if (FLUSH-1 == OLDEST) if (FLUSH-1 == OLDEST)

View file

@ -114,7 +114,7 @@ static SDL_Surface *sprite_from_data (int width, int height,
*/ */
SDL_LockSurface (sprite); SDL_LockSurface (sprite);
for (y=0; y<height; ++y) { for (y=0; y<height; ++y) {
s = (unsigned*) (sprite->pixels + y * sprite->pitch); s = (unsigned*) ((char*)sprite->pixels + y * sprite->pitch);
for (x=0; x<width; ++x) { for (x=0; x<width; ++x) {
r = *data++; r = *data++;
g = *data++; g = *data++;

View file

@ -66,9 +66,9 @@ int acpu_isatty[2];
#define LINEFEED_SYNC 1 /* Чтобы быстрее печатало; в жизни 20-25 мс/1.4 мс ~= 17 */ #define LINEFEED_SYNC 1 /* Чтобы быстрее печатало; в жизни 20-25 мс/1.4 мс ~= 17 */
REG printer_reg[] = { REG printer_reg[] = {
{ "Готов", &READY, 2, 2, 18, 1 }, { "Готов", &READY, 2, 2, 18, 1 },
{ "Прогон", &READY, 2, 2, 22, 1 }, { "Прогон", &READY, 2, 2, 22, 1 },
{ 0 } { 0 }
}; };
MTAB printer_mod[] = { MTAB printer_mod[] = {
@ -204,8 +204,7 @@ t_stat printer_event (UNIT *u)
int num = u - printer_unit; int num = u - printer_unit;
struct acpu_t * dev = acpu + num; struct acpu_t * dev = acpu + num;
switch (dev->curchar) { if (dev->curchar < 0140) {
case 0 ... 0137:
GRP |= GRP_PRN1_SYNC >> num; GRP |= GRP_PRN1_SYNC >> num;
++dev->curchar; ++dev->curchar;
/* For next char */ /* For next char */
@ -213,8 +212,7 @@ t_stat printer_event (UNIT *u)
if (dev->feed && --dev->feed == 0) { if (dev->feed && --dev->feed == 0) {
READY |= PRN1_LINEFEED >> num; READY |= PRN1_LINEFEED >> num;
} }
break; } else {
case 0140:
/* For "zero" */ /* For "zero" */
dev->curchar = 0; dev->curchar = 0;
GRP |= GRP_PRN1_ZERO >> num; GRP |= GRP_PRN1_ZERO >> num;
@ -222,7 +220,6 @@ t_stat printer_event (UNIT *u)
besm6_debug(">>> АЦПУ%d 'ноль'", num); besm6_debug(">>> АЦПУ%d 'ноль'", num);
/* For first sync after "zero" */ /* For first sync after "zero" */
sim_activate (u, 1000*USEC); sim_activate (u, 1000*USEC);
break;
} }
return SCPE_OK; return SCPE_OK;
} }
@ -234,33 +231,33 @@ int gost_latin = 0; /* default cyrillics */
* Documentation: http://en.wikipedia.org/wiki/GOST_10859 * Documentation: http://en.wikipedia.org/wiki/GOST_10859
*/ */
static const unsigned short gost_to_unicode_cyr [256] = { static const unsigned short gost_to_unicode_cyr [256] = {
/* 000-007 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 000-007 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
/* 010-017 */ 0x38, 0x39, 0x2b, 0x2d, 0x2f, 0x2c, 0x2e, 0x2423, /* 010-017 */ 0x38, 0x39, 0x2b, 0x2d, 0x2f, 0x2c, 0x2e, 0x2423,
/* 020-027 */ 0x65, 0x2191, 0x28, 0x29, 0xd7, 0x3d, 0x3b, 0x5b, /* 020-027 */ 0x65, 0x2191, 0x28, 0x29, 0xd7, 0x3d, 0x3b, 0x5b,
/* 030-037 */ 0x5d, 0x2a, 0x2018, 0x2019, 0x2260, 0x3c, 0x3e, 0x3a, /* 030-037 */ 0x5d, 0x2a, 0x2018, 0x2019, 0x2260, 0x3c, 0x3e, 0x3a,
/* 040-047 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, /* 040-047 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
/* 050-057 */ 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 050-057 */ 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
/* 060-067 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* 060-067 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
/* 070-077 */ 0x0428, 0x0429, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x44, /* 070-077 */ 0x0428, 0x0429, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x44,
/* 100-107 */ 0x46, 0x47, 0x49, 0x4a, 0x4c, 0x4e, 0x51, 0x52, /* 100-107 */ 0x46, 0x47, 0x49, 0x4a, 0x4c, 0x4e, 0x51, 0x52,
/* 110-117 */ 0x53, 0x55, 0x56, 0x57, 0x5a, 0x203e, 0x2264, 0x2265, /* 110-117 */ 0x53, 0x55, 0x56, 0x57, 0x5a, 0x203e, 0x2264, 0x2265,
/* 120-127 */ 0x2228, 0x2227, 0x2283, 0xac, 0xf7, 0x2261, 0x25, 0x25c7, /* 120-127 */ 0x2228, 0x2227, 0x2283, 0xac, 0xf7, 0x2261, 0x25, 0x25c7,
/* 130-137 */ 0x7c, 0x2015, 0x5f, 0x21, 0x22, 0x042a, 0xb0, 0x2032, /* 130-137 */ 0x7c, 0x2015, 0x5f, 0x21, 0x22, 0x042a, 0xb0, 0x2032,
}; };
static const unsigned short gost_to_unicode_lat [256] = { static const unsigned short gost_to_unicode_lat [256] = {
/* 000-007 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 000-007 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
/* 010-017 */ 0x38, 0x39, 0x2b, 0x2d, 0x2f, 0x2c, 0x2e, 0x2423, /* 010-017 */ 0x38, 0x39, 0x2b, 0x2d, 0x2f, 0x2c, 0x2e, 0x2423,
/* 020-027 */ 0x65, 0x2191, 0x28, 0x29, 0xd7, 0x3d, 0x3b, 0x5b, /* 020-027 */ 0x65, 0x2191, 0x28, 0x29, 0xd7, 0x3d, 0x3b, 0x5b,
/* 030-037 */ 0x5d, 0x2a, 0x2018, 0x2019, 0x2260, 0x3c, 0x3e, 0x3a, /* 030-037 */ 0x5d, 0x2a, 0x2018, 0x2019, 0x2260, 0x3c, 0x3e, 0x3a,
/* 040-047 */ 0x41, 0x0411, 0x42, 0x0413, 0x0414, 0x45, 0x0416, 0x0417, /* 040-047 */ 0x41, 0x0411, 0x42, 0x0413, 0x0414, 0x45, 0x0416, 0x0417,
/* 050-057 */ 0x0418, 0x0419, 0x4b, 0x041b, 0x4d, 0x48, 0x4f, 0x041f, /* 050-057 */ 0x0418, 0x0419, 0x4b, 0x041b, 0x4d, 0x48, 0x4f, 0x041f,
/* 060-067 */ 0x50, 0x43, 0x54, 0x59, 0x0424, 0x58, 0x0426, 0x0427, /* 060-067 */ 0x50, 0x43, 0x54, 0x59, 0x0424, 0x58, 0x0426, 0x0427,
/* 070-077 */ 0x0428, 0x0429, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x44, /* 070-077 */ 0x0428, 0x0429, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x44,
/* 100-107 */ 0x46, 0x47, 0x49, 0x4a, 0x4c, 0x4e, 0x51, 0x52, /* 100-107 */ 0x46, 0x47, 0x49, 0x4a, 0x4c, 0x4e, 0x51, 0x52,
/* 110-117 */ 0x53, 0x55, 0x56, 0x57, 0x5a, 0x203e, 0x2264, 0x2265, /* 110-117 */ 0x53, 0x55, 0x56, 0x57, 0x5a, 0x203e, 0x2264, 0x2265,
/* 120-127 */ 0x2228, 0x2227, 0x2283, 0xac, 0xf7, 0x2261, 0x25, 0x25c7, /* 120-127 */ 0x2228, 0x2227, 0x2283, 0xac, 0xf7, 0x2261, 0x25, 0x25c7,
/* 130-137 */ 0x7c, 0x2015, 0x5f, 0x21, 0x22, 0x042a, 0xb0, 0x2032, /* 130-137 */ 0x7c, 0x2015, 0x5f, 0x21, 0x22, 0x042a, 0xb0, 0x2032,
}; };
/* /*
* Write Unicode symbol to file. * Write Unicode symbol to file.

View file

@ -66,10 +66,10 @@ char line[2][128];
unsigned char FS[2]; unsigned char FS[2];
REG fs_reg[] = { REG fs_reg[] = {
{ "Готов", &READY, 2, 2, 14, 1 }, { "Готов", &READY, 2, 2, 14, 1 },
{ "ФС1500-1", &FS[0], 8, 8, 0, 1 }, { "ФС1500-1", &FS[0], 8, 8, 0, 1 },
{ "ФС1500-2", &FS[2], 8, 8, 0, 1 }, { "ФС1500-2", &FS[2], 8, 8, 0, 1 },
{ 0 } { 0 }
}; };
MTAB fs_mod[] = { MTAB fs_mod[] = {
@ -203,14 +203,12 @@ static int utf8_getc (FILE *fin);
t_stat fs_event (UNIT *u) t_stat fs_event (UNIT *u)
{ {
int num = u - fs_unit; int num = u - fs_unit;
again: again:
switch (fs_state[num]) { if (fs_state[num] == FS_STARTING) {
case FS_STARTING:
/* По первому прерыванию после запуска двигателя ничего не читаем */ /* По первому прерыванию после запуска двигателя ничего не читаем */
FS[num] = 0; FS[num] = 0;
fs_state[num] = FS_RUNNING; fs_state[num] = FS_RUNNING;
break; } else if (fs_state[num] == FS_RUNNING) {
case FS_RUNNING: {
int ch; int ch;
/* переводы строк игнорируются */ /* переводы строк игнорируются */
while ((ch = utf8_getc (u->fileref)) == '\n'); while ((ch = utf8_getc (u->fileref)) == '\n');
@ -228,9 +226,7 @@ again:
ch = (ch & 0x0F) + ((ch >> 4) & 0x0F); ch = (ch & 0x0F) + ((ch >> 4) & 0x0F);
if (ch & 1); else FS[num] |= 0x80; if (ch & 1); else FS[num] |= 0x80;
} }
break; } else if (FS_IMAGE <= fs_state[num] && fs_state[num] <= FS_IMAGE_LAST) {
}
case FS_IMAGE ... FS_IMAGE_LAST: {
int ch = utf8_getc (u->fileref); int ch = utf8_getc (u->fileref);
if (ch < 0) { if (ch < 0) {
/* обрыв ленты */ /* обрыв ленты */
@ -253,9 +249,7 @@ again:
if (ch & 1); else FS[num] |= 0x80; if (ch & 1); else FS[num] |= 0x80;
++fs_state[num]; ++fs_state[num];
} }
break; } else if (fs_state[num] == FS_TOOLONG) {
}
case FS_TOOLONG: {
/* дочитываем до конца строки */ /* дочитываем до конца строки */
int ch; int ch;
besm6_debug("<<< too long???"); besm6_debug("<<< too long???");
@ -266,15 +260,12 @@ again:
fs_state[num] = FS_TAIL; fs_state[num] = FS_TAIL;
} else } else
goto again; goto again;
break; } else if (FS_FILLUP <= fs_state[num] && fs_state[num] <= FS_FILLUP_LAST) {
}
case FS_FILLUP ... FS_FILLUP_LAST:
FS[num] = 0; FS[num] = 0;
if (++fs_state[num] == FS_ENDA3) { if (++fs_state[num] == FS_ENDA3) {
fs_state[num] = FS_IMAGE; fs_state[num] = FS_IMAGE;
} }
break; } else if (FS_ENDA3 <= fs_state[num] && fs_state[num] <= FS_ENDA3_LAST) {
case FS_ENDA3 ... FS_ENDA3_LAST:
if ((fs_state[num] - FS_ENDA3) % 5 == 0) if ((fs_state[num] - FS_ENDA3) % 5 == 0)
FS[num] = 0200; FS[num] = 0200;
else else
@ -282,11 +273,8 @@ again:
if (++fs_state[num] == FS_TAIL) { if (++fs_state[num] == FS_TAIL) {
fs_state[num] = FS_RUNNING; fs_state[num] = FS_RUNNING;
} }
break; } else if (fs_state[num] == FS_IDLE || fs_state[num] == FS_TAIL) {
case FS_IDLE:
case FS_TAIL:
FS[num] = 0; FS[num] = 0;
break;
} }
GRP |= GRP_FS1_SYNC >> num; GRP |= GRP_FS1_SYNC >> num;
return SCPE_OK; return SCPE_OK;
@ -308,38 +296,38 @@ unsigned char
unicode_to_gost (unsigned short val) unicode_to_gost (unsigned short val)
{ {
static const unsigned char tab0 [256] = { static const unsigned char tab0 [256] = {
/* 00 - 07 */ 017, 017, 017, 017, 017, 017, 017, 017, /* 00 - 07 */ 017, 017, 017, 017, 017, 017, 017, 017,
/* 08 - 0f */ 017, 017, 0214, 017, 017, 0174, 017, 017, /* 08 - 0f */ 017, 017, 0214, 017, 017, 0174, 017, 017,
/* 10 - 17 */ 017, 017, 017, 017, 017, 017, 017, 017, /* 10 - 17 */ 017, 017, 017, 017, 017, 017, 017, 017,
/* 18 - 1f */ 017, 017, 017, 017, 017, 017, 017, 017, /* 18 - 1f */ 017, 017, 017, 017, 017, 017, 017, 017,
/* !"#$%&' */ 0017, 0133, 0134, 0034, 0127, 0126, 0121, 0033, /* !"#$%&' */ 0017, 0133, 0134, 0034, 0127, 0126, 0121, 0033,
/* ()*+,-./ */ 0022, 0023, 0031, 0012, 0015, 0013, 0016, 0014, /* ()*+,-./ */ 0022, 0023, 0031, 0012, 0015, 0013, 0016, 0014,
/* 01234567 */ 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, /* 01234567 */ 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007,
/* 89:;<=>? */ 0010, 0011, 0037, 0026, 0035, 0025, 0036, 0136, /* 89:;<=>? */ 0010, 0011, 0037, 0026, 0035, 0025, 0036, 0136,
/* @ABCDEFG */ 0021, 0040, 0042, 0061, 0077, 0045, 0100, 0101, /* @ABCDEFG */ 0021, 0040, 0042, 0061, 0077, 0045, 0100, 0101,
/* HIJKLMNO */ 0055, 0102, 0103, 0052, 0104, 0054, 0105, 0056, /* HIJKLMNO */ 0055, 0102, 0103, 0052, 0104, 0054, 0105, 0056,
/* PQRSTUVW */ 0060, 0106, 0107, 0110, 0062, 0111, 0112, 0113, /* PQRSTUVW */ 0060, 0106, 0107, 0110, 0062, 0111, 0112, 0113,
/* XYZ[\]^_ */ 0065, 0063, 0114, 0027, 017, 0030, 0115, 0132, /* XYZ[\]^_ */ 0065, 0063, 0114, 0027, 017, 0030, 0115, 0132,
/* `abcdefg */ 0032, 0040, 0042, 0061, 0077, 0045, 0100, 0101, /* `abcdefg */ 0032, 0040, 0042, 0061, 0077, 0045, 0100, 0101,
/* hijklmno */ 0055, 0102, 0103, 0052, 0104, 0054, 0105, 0056, /* hijklmno */ 0055, 0102, 0103, 0052, 0104, 0054, 0105, 0056,
/* pqrstuvw */ 0060, 0106, 0107, 0110, 0062, 0111, 0112, 0113, /* pqrstuvw */ 0060, 0106, 0107, 0110, 0062, 0111, 0112, 0113,
/* xyz{|}~ */ 0065, 0063, 0114, 017, 0130, 017, 0123, 017, /* xyz{|}~ */ 0065, 0063, 0114, 017, 0130, 017, 0123, 017,
/* 80 - 87 */ 017, 017, 017, 017, 017, 017, 017, 017, /* 80 - 87 */ 017, 017, 017, 017, 017, 017, 017, 017,
/* 88 - 8f */ 017, 017, 017, 017, 017, 017, 017, 017, /* 88 - 8f */ 017, 017, 017, 017, 017, 017, 017, 017,
/* 90 - 97 */ 017, 017, 017, 017, 017, 017, 017, 017, /* 90 - 97 */ 017, 017, 017, 017, 017, 017, 017, 017,
/* 98 - 9f */ 017, 017, 017, 017, 017, 017, 017, 017, /* 98 - 9f */ 017, 017, 017, 017, 017, 017, 017, 017,
/* a0 - a7 */ 017, 017, 017, 017, 017, 017, 017, 017, /* a0 - a7 */ 017, 017, 017, 017, 017, 017, 017, 017,
/* a8 - af */ 017, 017, 017, 017, 0123, 017, 017, 017, /* a8 - af */ 017, 017, 017, 017, 0123, 017, 017, 017,
/* b0 - b7 */ 0136, 017, 017, 017, 017, 017, 017, 017, /* b0 - b7 */ 0136, 017, 017, 017, 017, 017, 017, 017,
/* b8 - bf */ 017, 017, 017, 017, 017, 017, 017, 017, /* b8 - bf */ 017, 017, 017, 017, 017, 017, 017, 017,
/* c0 - c7 */ 017, 017, 017, 017, 017, 017, 017, 017, /* c0 - c7 */ 017, 017, 017, 017, 017, 017, 017, 017,
/* c8 - cf */ 017, 017, 017, 017, 017, 017, 017, 017, /* c8 - cf */ 017, 017, 017, 017, 017, 017, 017, 017,
/* d0 - d7 */ 017, 017, 017, 017, 017, 017, 017, 0024, /* d0 - d7 */ 017, 017, 017, 017, 017, 017, 017, 0024,
/* d8 - df */ 017, 017, 017, 017, 017, 017, 017, 017, /* d8 - df */ 017, 017, 017, 017, 017, 017, 017, 017,
/* e0 - e7 */ 017, 017, 017, 017, 017, 017, 017, 017, /* e0 - e7 */ 017, 017, 017, 017, 017, 017, 017, 017,
/* e8 - ef */ 017, 017, 017, 017, 017, 017, 017, 017, /* e8 - ef */ 017, 017, 017, 017, 017, 017, 017, 017,
/* f0 - f7 */ 017, 017, 017, 017, 017, 017, 017, 0124, /* f0 - f7 */ 017, 017, 017, 017, 017, 017, 017, 0124,
/* f8 - ff */ 017, 017, 017, 017, 017, 017, 017, 017, /* f8 - ff */ 017, 017, 017, 017, 017, 017, 017, 017,
}; };
switch (val >> 8) { switch (val >> 8) {
case 0x00: case 0x00:
@ -456,7 +444,7 @@ static int
utf8_getc (FILE *fin) utf8_getc (FILE *fin)
{ {
int c1, c2, c3; int c1, c2, c3;
again: again:
c1 = getc (fin); c1 = getc (fin);
if (c1 < 0 || ! (c1 & 0x80)) if (c1 < 0 || ! (c1 & 0x80))
return c1; return c1;

View file

@ -27,19 +27,19 @@
#include <unistd.h> #include <unistd.h>
const char *opname_short_bemsh [64] = { const char *opname_short_bemsh [64] = {
"зп", "зпм", "рег", "счм", "сл", "вч", "вчоб", "вчаб", "зп", "зпм", "рег", "счм", "сл", "вч", "вчоб","вчаб",
"сч", "и", "нтж", "слц", "знак", "или", "дел", "умн", "сч", "и", "нтж", "слц", "знак","или", "дел", "умн",
"сбр", "рзб", "чед", "нед", "слп", "вчп", "сд", "рж", "сбр", "рзб", "чед", "нед", "слп", "вчп", "сд", "рж",
"счрж", "счмр", "э32", "увв", "слпа", "вчпа", "сда", "ржа", "счрж","счмр","э32", "увв", "слпа","вчпа","сда", "ржа",
"уи", "уим", "счи", "счим", "уии", "сли", "э46", "э47", "уи", "уим", "счи", "счим","уии", "сли", "э46", "э47",
"э50", "э51", "э52", "э53", "э54", "э55", "э56", "э57", "э50", "э51", "э52", "э53", "э54", "э55", "э56", "э57",
"э60", "э61", "э62", "э63", "э64", "э65", "э66", "э67", "э60", "э61", "э62", "э63", "э64", "э65", "э66", "э67",
"э70", "э71", "э72", "э73", "э74", "э75", "э76", "э77", "э70", "э71", "э72", "э73", "э74", "э75", "э76", "э77",
}; };
static const char *opname_long_bemsh [16] = { static const char *opname_long_bemsh [16] = {
"э20", "э21", "мода", "мод", "уиа", "слиа", "по", "пе", "э20", "э21", "мода","мод", "уиа", "слиа","по", "пе",
"пб", "пв", "выпр", "стоп", "пио", "пино", "э36", "цикл", "пб", "пв", "выпр","стоп","пио", "пино","э36", "цикл",
}; };
const char *opname_short_madlen [64] = { const char *opname_short_madlen [64] = {
@ -73,7 +73,7 @@ const char *besm6_opname (int opcode)
if (opcode & 0200) if (opcode & 0200)
return opname_long_bemsh [(opcode >> 3) & 017]; return opname_long_bemsh [(opcode >> 3) & 017];
return opname_short_bemsh [opcode]; return opname_short_bemsh [opcode];
}; }
/* /*
* Выдача кода инструкции по мнемонике (UTF-8). * Выдача кода инструкции по мнемонике (UTF-8).
@ -553,7 +553,7 @@ t_stat besm6_read_line (FILE *input, int *type, t_value *val)
{ {
char buf [512], *p; char buf [512], *p;
int i, c; int i, c;
again: again:
if (! fgets (buf, sizeof (buf), input)) { if (! fgets (buf, sizeof (buf), input)) {
*type = 0; *type = 0;
return SCPE_OK; return SCPE_OK;
@ -615,7 +615,7 @@ again:
return SCPE_OK; return SCPE_OK;
} }
/* Неверная строка входного файла */ /* Неверная строка входного файла */
bad: besm6_log ("Invalid input line: %s", buf); bad: besm6_log ("Invalid input line: %s", buf);
return SCPE_FMT; return SCPE_FMT;
} }

View file

@ -615,9 +615,9 @@ void tt_print()
*/ */
static int unicode_to_koi7 (unsigned val) static int unicode_to_koi7 (unsigned val)
{ {
switch (val) { if ('_' <= val) return val;
case '\0'... '_': return val; else if ('a' <= val && val <= 'z') return val + 'Z' - 'z';
case 'a' ... 'z': return val + 'Z' - 'z'; else switch (val) {
case 0x007f: return 0x7f; case 0x007f: return 0x7f;
case 0x0410: case 0x0430: return 0x61; case 0x0410: case 0x0430: return 0x61;
case 0x0411: case 0x0431: return 0x62; case 0x0411: case 0x0431: return 0x62;
@ -901,7 +901,7 @@ void vt_cmd_loop (int num, int c)
break; break;
case 'U' & 037: case 'U' & 037:
/* Стирание всей строки. */ /* Стирание всей строки. */
erase_line: while (*cptr > cbuf) { erase_line: while (*cptr > cbuf) {
--*cptr; --*cptr;
if (! (**cptr & 0x80)) if (! (**cptr & 0x80))
tmxr_linemsg (t, "\b \b"); tmxr_linemsg (t, "\b \b");
@ -1009,7 +1009,7 @@ int vt_getc (int num)
static int vt_kbd_input_unicode (int num) static int vt_kbd_input_unicode (int num)
{ {
int c1, c2, c3, r; int c1, c2, c3, r;
again: again:
r = vt_getc (num); r = vt_getc (num);
if (r < 0 || r > 0377) if (r < 0 || r > 0377)
return r; return r;
@ -1146,7 +1146,7 @@ void vt_receive()
vt_receiving |= mask; vt_receiving |= mask;
} }
break; break;
case 1 ... 7: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
/* need inverted byte */ /* need inverted byte */
TTY_IN |= (tty_typed[num] & (1 << (tty_instate[num]-1))) ? 0 : mask; TTY_IN |= (tty_typed[num] & (1 << (tty_instate[num]-1))) ? 0 : mask;
tty_instate[num]++; tty_instate[num]++;
@ -1155,7 +1155,7 @@ void vt_receive()
TTY_IN |= odd_parity(tty_typed[num]) ? 0 : mask; /* even parity of inverted */ TTY_IN |= odd_parity(tty_typed[num]) ? 0 : mask; /* even parity of inverted */
tty_instate[num]++; tty_instate[num]++;
break; break;
case 9 ... 11: case 9: case 10: case 11:
/* stop bits are 0 */ /* stop bits are 0 */
tty_instate[num]++; tty_instate[num]++;
break; break;
@ -1180,7 +1180,7 @@ int vt_is_idle ()
int tty_query () int tty_query ()
{ {
/* besm6_debug ("*** телетайпы: приём");*/ /* besm6_debug ("*** телетайпы: приём");*/
return TTY_IN; return TTY_IN;
} }

0
BESM6/formatdisk.c Executable file → Normal file
View file

View file

@ -7,7 +7,6 @@ load test_pprog05.b6
ex -ml 1-6 ex -ml 1-6
ex 7-11 ex 7-11
echo echo
go
echo Должно быть четыре останова с числами на сумматоре: 1.0 2.0 3.0 4.0. echo Должно быть четыре останова с числами на сумматоре: 1.0 2.0 3.0 4.0.
br 2 br 2
go go