Отладочный модуль на К1801ВМ1

Digital Equipment Corporation PDP-8 & PDP-11 (а также совместимые с последним советские ЭВМ на 1801ВМ1/2/3)

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Lavr wrote:Посмотрел код - нашел места, где обрабатывают адрес FFCC, кстати не так, как я ожидал.
Я ожидал сравнения на число FFCC, а в коде делается так:

Code: Select all

004120C5: 8B8ED0000000                 mov       ecx,[esi][0000000D0]
004120CB: 68CCFF0000                   push      00000FFCC
004120D0: E82B23FFFF                   call     .000404400
Я, конечно, не большой специалист по С++, но как работает код всё же представляю.
В С++ есть вот такой абзац:

Code: Select all

void CCovox::SetWord (int addr, WORD value)
{
  ASSERT (addr == 0177714);

  if (addr == 0177714)
  {
    SetSample (value);
  }
}
Ну про ASSERT - ладно - Shaos мне объяснил...
Но вот дальше: if (addr == 0177714)

Взял я сегодня один свой коротенький (чтоб легче искать) проект на С++, и вставил в него очень
похожий код:

Code: Select all

  if (addr == 0177714)
  {
    // SetSample (value);
    Sleep(0177714); //--- это аналог вызова функции
  }
  Sleep(10000); //--- это в исходном коде так и было
Скомпилировал и поискал в коде сигнатуру CC FF (=o177714). Вот что нашел:

Code: Select all

.004011D7: 8B842430050000               mov       eax,[esp][000000530]
.004011DE: 8B3594F14000                 mov       esi,[00040F194] - это явно указатель на ф-цию  Sleep
.004011E4: 83C404                       add       esp,004
.004011E7: 3DCCFF0000                   cmp       eax,00000FFCC - if (addr == 0177714)
.004011EC: 7507                         jne      .0004011F5

.004011EE: 68CCFF0000                   push      00000FFCC \    - 0177714
.004011F3: FFD6                         call      esi - Sleep(0177714);

.004011F5: 6810270000                   push      000002710 \  - 10000
.004011FA: FFD6                         call      esi - Sleep(10000);
Ну cmp eax,00000FFCC <==> if (addr == 0177714) я просто ожидал! :wink:
Остальное - просто интересно...

Только вот в коде эмулятора БК-0010 кода cmp eax,00000FFCC или чего похожего не нашлось... :o
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Написал письмо автору эмулятора - Юрию Калмыкову, а он исчез... однако. :o
Final-Recipient: rfc822; kalmykov@stoik.com
Action: failed
Status: 5.0.0
Diagnostic-Code: smtp; 550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser b38sor10147536uad.30 - gsmtp
Last-Attempt-Date: Sat, 13 Jan 2018 20:19:41 -0800 (PST)
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Отладочный модуль на К1801ВМ1

Post by Shaos »

Lavr wrote:Только вот в коде эмулятора БК-0010 кода cmp eax,00000FFCC или чего похожего не нашлось... :o
Может эмулятор 16-битный? :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Shaos wrote:Может эмулятор 16-битный? :roll:
Да нет... не 16-битный, я уже почти все аналогии в коде нашел.
Вот, к примеру, смотри:
Код С++

Code: Select all

  SetWordIndirect (0177660, 0);
  SetWordIndirect (0177662, 0);
  SetWordIndirect (0177664, 01330);
  SetWordIndirect (0177706, 0);
  SetWordIndirect (0177710, 0);
  SetWordIndirect (0177712, 0);
  SetWordIndirect (0177714, 0);
Этот код на ассемблере:

Code: Select all

.00404594: 8B4E18                       mov       ecx,[esi][00018]
.00404597: 52                           push      edx
.00404598: 68B0FF0000                   push      00000FFB0; 0177660
.0040459D: 8B01                         mov       eax,[ecx]
.0040459F: FF5024                       call      d,[eax][00024]

.004045A2: 8B4E18                       mov       ecx,[esi][00018]
.004045A5: 33DB                         xor       ebx,ebx
.004045A7: 53                           push      ebx
.004045A8: 68B2FF0000                   push      00000FFB2; 0177662
.004045AD: 8B11                         mov       edx,[ecx]
.004045AF: FF5224                       call      d,[edx][00024]

.004045B2: 8B4E18                       mov       ecx,[esi][00018]
.004045B5: 68D8020000                   push      0000002D8; o1330; 728d
.004045BA: 68B4FF0000                   push      00000FFB4; SetWordIndirect (0177664, 01330);
.004045BF: 8B01                         mov       eax,[ecx]
.004045C1: FF5024                       call      d,[eax][00024] SetWordIndirect

.004045C4: 8B4E18                       mov       ecx,[esi][00018]
.004045C7: 53                           push      ebx
.004045C8: 68C6FF0000                   push      00000FFC6; 0177706
.004045CD: 8B11                         mov       edx,[ecx]
.004045CF: FF5224                       call      d,[edx][00024]

.004045D2: 8B4E18                       mov       ecx,[esi][00018]
.004045D5: 53                           push      ebx
.004045D6: 68C8FF0000                   push      00000FFC8; 0177710
.004045DB: 8B01                         mov       eax,[ecx]
.004045DD: FF5024                       call      d,[eax][00024]

.004045E0: 8B4E18                       mov       ecx,[esi][00018]
.004045E3: 53                           push      ebx
.004045E4: 68CAFF0000                   push      00000FFCA; 0177712
.004045E9: 8B11                         mov       edx,[ecx]
.004045EB: FF5224                       call      d,[edx][00024]

.004045EE: 8B4E18                       mov       ecx,[esi][00018]
.004045F1: 53                           push      ebx
.004045F2: 68CCFF0000                   push      00000FFCC ; 0177714 ***
.004045F7: 8B01                         mov       eax,[ecx]
.004045F9: FF5024                       call      d,[eax][00024] SetWordIndirect
Но не могу найти вот этой аналогии:

Code: Select all

  if (addr == 0177714)
  {
     SetSample (value);
  }
Как ты считаешь if (addr == 0177714) можно выполнить иначе чем cmp eax,00000FFCC ?
Ну то есть без cmp ?
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Отладочный модуль на К1801ВМ1

Post by Shaos »

ну можно скажем push 0000FFCC и потом pop его в какой-то регистр и потом сравнивать уже регистры?
и допустим если у человека включена жестокая оптимизация и этот адрес уже сидит в каком то регистре...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Shaos wrote:ну можно скажем push 0000FFCC и потом pop его в какой-то регистр и потом сравнивать уже регистры?
Я тоже уже про это думал... :-?
Тут еще в чем сложность - исходники от версии 3.0, а код от версии 2.6.
Я предполагаю, что разницы большой между ними не случилось в обработке порта FFCC.
Но может так быть что в версии 2.6 этот момент был написан иначе - я поэтому и компилировал
сам отдельно похожий участок: он выдает, что if (addr == 0177714) компилируется в cmp eax,00000FFCC.

А push 0000FFCC - это, как мне кажется, судя по коду - передача аргумента в функцию.


Собственно, я и попробовал написать письмо автору - спросить исходники для версии 2.6.
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Отладочный модуль на К1801ВМ1

Post by Shaos »

Ну если у тебя код более старый чем исходники, то видимо там этой строчки вообще небыло?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Shaos wrote:Ну если у тебя код более старый чем исходники, то видимо там этой строчки вообще небыло?
Может быть... Но как-то должно же происходить выделение адреса 0000FFCC.
Тем паче, что судя по коду версии 3.0, автор не мудрствовал лукаво в выделении адресов портов.
Их там потом больше интересовало качество и плавность звука.

Ладно... подумаю еще над кодом...


P.S. Могло быть сделано через switch (...) case ...
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Наверное, всё же в версии 2.6 проверки if (addr == 0177714) не было.
Такое ощущение, что автор в версии 3.0 её непонятно зачем добавил, перестраховался что ли...

Вот так идет вызов:

Code: Select all

  case 0177714:
    if (m_pCovox)
      m_pCovox->SetWord (0177714, src);
    return;
То есть адрес 0177714 уже выделен.
Но дальше в SetWord опять проверка на адрес 0177714 :

Code: Select all

void CCovox::SetWord (int addr, WORD value)
{
  ASSERT (addr == 0177714);

  if (addr == 0177714)
  {
    SetSample (value);
  }
}
По меньшей мере такое сочетание странно.
В SetWord не должно быть if (addr == 0177714). Тогда всё похоже на истину.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Shaos, пока я ищу точку входа (а я надеюсь, что всё же найду), посмотри вот этот материал:
http://arhiv.xaker.name/threads/22158/

Всё ли там достоверно? Ибо другого плана внедриться в код .ехе-файла у меня просто нет.
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Отладочный модуль на К1801ВМ1

Post by Shaos »

А зачем внедряться, если есть более новые исходники? Просто собери исходники и вперёд
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Shaos wrote:Просто собери исходники и вперёд
С ними приложен уже и собранный .ехе - но версия 3.0 уже не работает в Вынь 98 и Вынь ХР,
иначе бы я, бесусловно, не морочил себе и другим голову...

Но в познавательных целях морочить себе голову, оказывается, очень полезно порой! :roll:
Lavr wrote:Но дальше в SetWord опять проверка на адрес 0177714 :

Code: Select all

void CCovox::SetWord (int addr, WORD value)
{
  ASSERT (addr == 0177714);

  if (addr == 0177714)
  {
    SetSample (value);
  }
}

По меньшей мере такое сочетание странно.
Скомпилировал я для проверки это "странное сочетание"...
Так вот компилятор С++ тоже считает вторую проверку if (addr == 0177714) не только
странной, но и ненужной! И ОН ЕЁ ПРОСТО УДАЛЯЕТ!!! АФИГЕННО!!!
Поэтому я и не могу найти cmp eax,00000FFCC ТАМ ЕЁ ПРОСТО НЕТ! :o

Ну и заодно посмотрел, как компилятор С++ разворачивает конструкцию switch (...) case ...
Тоже очень интересно... хотя и не так потрясно... 8)
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Отладочный модуль на К1801ВМ1

Post by Shaos »

Ну если собрать правильным компилятором, то поди и в Win98 заработает?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Shaos wrote:Ну если собрать правильным компилятором, то поди и в Win98 заработает?
Нет, об этом прямо предупреждают там, где выложены исходники.
Начиная с версии 3.0, эмулятор БК-0010 ориентирован на Вин 7, Виста и т.д.

Да я уже почти все нашел. Пустот в коде много. Даже интересно будет попробовать
все же сделать "инжекцию" в код.
Один раз у меня это не получилось, надо попробовать еще раз... :wink:
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Отладочный модуль на К1801ВМ1

Post by Shaos »

Ну может человек перешел на вижуалстудию более новой версии - вот сборка 3.0 и перестала быть совместимой со старыми виндами
А ты попробуй пересобери исходники в старой вижуалстудии - авось заведётся?
Я тут за главного - если что шлите мыло на me собака shaos точка net