abelykh0 / esp32-bkEmu

BK-0010 Emulator on ESP32 VGA32 board
MIT License
10 stars 0 forks source link

БК0010 resources #4

Closed vitasam closed 2 years ago

vitasam commented 2 years ago

Hello,

do you know about this emulator? http://gid.pdp-11.ru/

And this is quite active community: https://t.me/bk0010_11m

abelykh0 commented 2 years ago

Not really, I made this one as a proof-of-concept, it was not my goal to make it work 100% correctly.

vitasam commented 2 years ago

По-русски можно?

Насколько я понимаю, Ваш эмулятор БК0010 - единственный для этой железки ttgoVGA32. Было бы интересно развивать его дальше. У меня никогда не было БК0010, но я с детства всегда его хотел :)

Я скинул ссылку и фотографии в тот чат БК0010, некий интерес там есть, по крайней мере один человек точно заказал железку, чтобы попробовать.

abelykh0 commented 2 years ago

Я буду только рад, если кто-то будет развивать этот проект, однако я не могу тратить много времени на это, к сожалению. У меня тоже не было БК, но я ходил в кружок заниматься.

vitasam commented 2 years ago

Спасибо! Мне точно было бы интересно этим заниматься, попробую по мере свободного времени.

Кстати, вот ещё нашелся, но там кастомная железка: https://github.com/konst-st/BK8266

abelykh0 commented 2 years ago

Этот, похоже дальше продвинулся.

vitasam commented 2 years ago

Про загрузку бинарных файлов. Вот в эмуляторе гида (первая ссылка в этом issue), может, полезная информация:

// для БК10.
bool CMotherBoard::EmulateLoadTape()
{
    /*
     * Известные косяки: 1) для бейсиковских бин файлов удаляет расширение .bin, как исправить
     * непонятно, потому что никак не узнать, что мы загружаем именно бейсиковский бин файл,
     * а не какой-либо другой. То же самое и с любыми другими файлами, по задумке авторов,
     * имеющими расширение .bin, оно как правило удаляется.
     * 2) при загрузке файла с автозапуском, автозапуск делается из ячейки на слово выше, чем в реальности.
     * Это может быть критично только для очень хитрых программ.
     **/
    // если включена эмуляция и по этому адресу действительно ПЗУ монитора БК10
    if (g_Config.m_bEmulateLoadTape && ((GetWord(0116206) == 04767) && (GetWord(0116210) == 0426)))
    {
        bool bFileSelect = false; // что делать после диалога выбора

и тут:

    // Загрузим файл, если ошибок не было
            if (!bError && file.Open(strFileName, CFile::modeRead))
            {
                file.Read(&readAddr, sizeof(readAddr));   // Первое слово в файле - адрес загрузки
                file.Read(&readSize, sizeof(readSize));   // Второе слово в файле - длина
                // сплошь и рядом встречаются .bin файлы. у которых во втором слове указана длина
                // меньше, чем длина файла - 4. Это другой формат бин, у которого в начале указывается
                // адрес, длина, имя файла[BK_NAMELENGTH], массив[длина], КС - контрольная сумма в конце
                uint16_t filesz = (file.GetLength() < 65536) ? static_cast<uint16_t>(file.GetLength()) : 65535;
                bool bIsCRC = false;
vitasam commented 2 years ago

Там вообще как-то хитро всё грузится (файл ..\BKemu\BK\devemu\Board.cpp):

if (loadAddr < 0750)
    {
        // Помещаем в R1 последний адрес, куда производилось чтение, как в emt 36
        SetRON(CCPU::REGISTER::R0, 0);
        SetRON(CCPU::REGISTER::R1, loadAddr + loadLen);
        SetRON(CCPU::REGISTER::R2, 0);
        SetRON(CCPU::REGISTER::R3, 0177716);
        SetRON(CCPU::REGISTER::R5, 040);
        SetRON(CCPU::REGISTER::PC, 0117374); // выходим туда.
    }
    else
    {
        SetRON(CCPU::REGISTER::R0, loadcrc);
        SetRON(CCPU::REGISTER::R0, 0314);
        SetRON(CCPU::REGISTER::R3, 0177716);
        SetRON(CCPU::REGISTER::R4, 0);
        // Помещаем в R5 последний адрес, куда производилось чтение, как в emt 36
        SetRON(CCPU::REGISTER::R5, loadAddr + loadLen);
        SetRON(CCPU::REGISTER::PC, 0116710); // выходим туда.
    }
abelykh0 commented 2 years ago

Вот это я точно не обрабатываю:

// сплошь и рядом встречаются .bin файлы. у которых во втором слове указана длина // меньше, чем длина файла - 4. Это другой формат бин, у которого в начале указывается // адрес, длина, имя файла[BK_NAMELENGTH], массив[длина], КС - контрольная сумма в конце uint16_t filesz = (file.GetLength() < 65536) ? static_cast(file.GetLength()) : 65535; bool bIsCRC = false;

vitasam commented 2 years ago

Мне кажется, надо попробовать этот кусок, где if (loadAddr < 0750)

Я вчера поэкспериментировал немного - поднял размер 0х4000 побольше (кстати, 0х4000 это маловато для реальной БК0010) и добавил printf().

Некоторые программы типа dizzy, скрашились с выводом core-dump, но некоторые типа Перестройка, не работают.

abelykh0 commented 2 years ago

(кстати, 0х4000 это маловато для реальной БК0010) В БК-0010 ОЗУ всего 0x4000, включая системную область, но без экранной памяти https://zx-pk.ru/wiki/%D0%91%D0%9A-0010 Я не поддерживаю БК-0011 пока

vitasam commented 2 years ago

Да, я знаю, но в БК0010-чате говорят, что многие программы для чистой БК0010 грузятся с экраном, вплоть до ПЗУ