Продолжаю разбирать микрокод, после устранения ошибки с адресами вроде все нормально выглядит, но предварительный декодер на ПЛМ выдает какой-то бред и точки входа на выполнение инструкций PDP-11 явно никак не совпадают с ожидаемым. Перепроверил и перезвонил все, ничего не нашел.
Смотрим в прочитанную таблицу ПЛМ декодера инструкций:
Код:
16'o01xxxx: ad = (&ins[11:8] | &ins[5:3]) ? 7'h31 // mov
/* 16'o010x0x: */ : 7'h30; // mov Rs, Rd
16'o02xxxx: ad = (&ins[11:8] | &ins[5:3]) ? 7'h13 // cmp
/* 16'o020x0x: */ : 7'h3A; // cmp Rs, Rd
16'o03xxxx: ad = (&ins[11:8] | &ins[5:3]) ? 7'h1C // bit
/* 16'o030x0x: */ : 7'h3C; // bit Rs, Rd
16'o04xxxx: ad = (&ins[11:8] | &ins[5:3]) ? 7'h1E // bic
/* 16'o040x0x: */ : 7'h3E; // bic Rs, Rd
16'o05xxxx: ad = (&ins[11:8] | &ins[5:3]) ? 7'h10 // bis
/* 16'o050x0x: */ : 7'h20; // bis Rs, Rd
И видим там (помимо прочего) отдельное декодирование для двухадресных инструкций с операндами регистр-регистр. Ну чтобы оно побыстрее было и не тратило дополнительные такты на определение типа адресации в самом микрокоде. И подумалось мне что оно будет выполнять операции АЛУ сразу над Rd и Rs. Поискал я такие инструкции в дизассемблированном листинге, и нашел, 11 штук. А оптимизаций R-R всего 8. По перебирал я эти найденные инструкции, и 8 штук из них таки на адресах кратных 8 - потенциальные точки входа с предекодера. Далее проанализировал сами операции и нашел соответствие запрошенным инструкциям PDP-11. А потом сопоставил фактические адреса в микрокоде и то что выдает ПЛМ предекодера. И оказалось что XOR между фактом и нужным - всегда 0x11! Похоже за 30 лет сдохли перемычки программирования выходных инверторов в 556РТ2. Перепроверить и потестровать все результаты декодирования конечно придется, но уже есть хинт - не надо перебирать все 128 потенциальных точек входа. Но и уже легче, при расставленных точках входа микрокод понимается "влет", уже не выглядит как бред. Потому что такой листинг:
Код:
; "add Rs, Rd" opcode
; 03A0 0010100010110000.0101010000011101.111111001000000.011011100
jp L28B, CCEN
& or B12 & A8, C0, RAMF, ZA
& dimm 0x28B0
очень сильно сбивал - запросили ADD, а выполняется OR. И что неправильно - было вообще неясно, а теперь все встало на свои места. Листинг ADD выглядит так:
Код:
0x74; // add Rs, Rd +
; 0328 0011000101100000.1101011001111011.011100100010110.011000001
jrp L316, CCI
& add Bd0 & As0, C0, RAMF, AB
& dmux
& cpsw PSW1