- Пара вопросов по эмулятору ув. gid
-
? Дмитрий - 24.04.2017 22:16
Опытные сишники, просветите в следующем. В качестве Си-экспириенса разбираюсь в сырцах эмуля. Вроде все понятно, но натыкаюсь на некоторые места, коих насчитал 6 - а именно: реализации get_src_arg/get_dst_arg/set_dst_arg. С чем сравнивается, к примеру, m_nMethSrc (метод адресации 0..7) в коде:
¤
if (m_bSign)
{
m_datarg = (m_nMethSrc) ? GetByte(m_nSrcAddr) : LOBYTE(m_RON[m_nSrcAddr]);
}
else
{
m_datarg = (m_nMethSrc) ? GetWord(m_nSrcAddr) : m_RON[m_nSrcAddr];
}
¤
==0, !=0, больше чего-то, меньше? Компилятору мб и понятно что с чем кушать, но читающему непрофессионалу - вряд ли. С булевым значением все ясно - (m_nMethSrc) равнозначно (m_nMethSrc == true). А с целочисленной переменной?
¤
Встретился еще один затык в CCPU::TranslateInstruction, в именно в if (nInterruptVector), но тут по смыслу оказалось (или показалось??), что эта запись равносильна if (nInterruptVector !=0)
¤
Вот теперь думаю, а не так ли должен выглядеть код с явным указанием что с чем проверяется??
¤
if (m_bSign)
{
m_datarg = (m_nMethSrc != 0) ? GetByte(m_nSrcAddr) : LOBYTE(m_RON[m_nSrcAddr]);
}
else
{
m_datarg = (m_nMethSrc != 0) ? GetWord(m_nSrcAddr) : m_RON[m_nSrcAddr];
}
-
? gid - 25.04.2017 09:58
Вы затрагиваете опасную тему. Чреватую холиварами, перерастающими в срачи с киданием какашками друг в друга между поклонниками строгой типизации и сишниками, постигшими дзен Си. Хорошо, что тут людей не много и нам это вряд ли грозит
Эти вопросы возникают практически у каждого, пришедшего в Си из паскалеподобных языков.
¤
[С чем сравнивается, к примеру, m_nMethSrc]
Ни с чем не сравнивается. Она просто тестируется на 0 или не 0. Самой обычной ассемблерной командой tst.
Т.е. тут (да и вообще везде в булевых операциях с небулевыми переменными) приводится неявное преобразование целочисленного типа в bool и затем выясняется true оно или false.
¤
[Вот теперь думаю, а не так ли должен выглядеть код с явным указанием что с чем проверяется??]
Так, если писать много кода не лень.
Просто имейте в виду, что if (x) равнозначно if (x != 0), а if (!x) равнозначно if (x == 0) только и всего.
¤
Причём, записывать по-длинному никто не запрещает, компилятор всё равно соптимизирует до нормального вида.
Например, я использую явное преобразование int (или чего угодно целочисленного) в bool только тогда, когда компилятор ругается на использование небулевых переменных в булевых выражениях и говорит, что это чревато потерей производительности.
Например, в таких случаях:
int nI;
bool bB;
...
if (nI && bB) {}
-
? Дмитрий - 25.04.2017 11:24
>> между поклонниками строгой типизации и сишниками, постигшими дзен Си
Я ни в коем разе не в плане холивара. Каждый пишет как ему удобнее. Просто везде, на каждом углу говорят: хочешь изучить Си - читай код профессионалов. В принципе согласен (что и делаю), но в 99% случаев код написан профи для профи и начинающему разбирать профи-кашу, вкупе с полностью отсутствующими комментариями в коде (не в данном случае), часто не под силу, особливо не знающему вышеописанных тонкостей.
¤
>> Так, если писать много кода не лень
Значит я не ошибся. Пока начинающий - не лень. Надо уметь писать полностью. Когда опыт придет, можно и сокращать. Когда детей учат писать - заставляют писать правильно. Научится - пусть хоть стенографирует. :)
¤
Благодарю. Появятся вопросы - напишу сюда еще.
-
? Дмитрий - 25.04.2017 14:51
Еще вопрос:
¤
В CMotherBoard::GetWord и SetWord вычисляется адрес как m_MemoryMap[nBank].nOffset + (addr & 007777). А в CMotherBoard::GetWordIndirect и SetWordIndirect как m_MemoryMap[nBank].nOffset + (addr & 007776). Т.е в первом случае маска &O7777, а во втором &O7776. Тут не ошибка ли?
-
? Дмитрий - 25.04.2017 14:53
И не проще ли для ускорения вычислять адрес один раз в переменную, чем каждый раз заново?
-
? Дмитрий - 25.04.2017 15:06
Хм и еще одно сомнение: CMotherBoard::SetWord и GetWord в switch в нескольких OnSetSystemRegister используется num и тут же вычисляется адрес через addr, а ветке default опять же addr.
-
? gid - 25.04.2017 15:52
[Т.е в первом случае маска &O7777, а во втором &O7776. Тут не ошибка ли?]
Нету там ошибок. Смотрим в начале этих функций строку "addr &= 0177776;" т.е. младший бит мы изначально исключили, поэтому как писать: 007777 или 007776 абсолютно без разницы. С моей точки зрения. Но перфекционизма ради, можно 007777 исправить на 007776, ничего не изменится.
¤
[И не проще ли для ускорения вычислять адрес один раз в переменную, чем каждый раз заново?]
А где там каждый раз? Адрес вычисляется один раз за вызов функции, там где это необходимо. Там где не надо - не вычисляется лишний раз. А то, что там одна и та же формула накопипасчена, так зато ненавистное многим goto не используется.
¤
[используется num и тут же вычисляется адрес через addr]
А там специально комментарий такой написан: "//специально для регистров hdd smk512"
СМК умеет обращаться к слову по нечётным адресам, например 0177740 и 0177741 это два разных слова.
Поэтому, чтобы различать их введена переменная num у которой младший бит остаётся, а у addr - младший бит очищается.
Поэтому переменная addr используется там, где гарантированно не может быть обращения к регистрам СМК, а num - там где может быть.
В принципе, этот код за время писания, дописывания, переписывания и приделывания костылей для работы с СМК стал немного кривоват и избыточен, там слишком много в вызываемых функциях операций типа num & 0177776, но уж очень неохота браться за чистку. Там сперва надо расписать всю иерархию вызовов с учётом наследования, и убрать лишнее.
-
? Vslav - 25.04.2017 16:46
Добавлю что нежелательно писать:
m_nMethSrc == true
¤
Я как-то скрещивал чужой проект с библиотеками, так там в разных модулях TRUE был определен тремя разными способами - 1, -1, ~0. И авторы резвились сравнениями с TRUE :) В этом случае производится неявное приведение булевой переменной к типу знаковой целой и сравнение в итоге работает некорректно. Поэтому не надо сравнивать булевые переменные с константами, стандарт языка значения TRUE/FALSE не детерминирует, они уже определяются в самом проекте.
-
? Дмитрий - 25.04.2017 17:58
void CMotherBoard::RunOut()
{
// Run all commands to function end
CDebugger::InitOutMode();
UnbreakCPU(GO_OUT);
}
¤
Почему InitOutMode вызывается по имени класса (а где он создан?), а не по определенному CMotherBoard->m_pDebugger??
¤
>> Добавлю что нежелательно писать
Это для примера, для полного понимания.
-
? gid - 25.04.2017 19:18
[Почему InitOutMode вызывается по имени класса]
Потому что это статическая функция. Они так вызываются.
Функция сделана статической, потому что использует статическую переменную.
Зачем там так всё сделано - я не знаю, это ещё Юрий Калмыков всё придумывал.
Мне класс CDebugger вообще весь не нравится, его нужно переделывать полностью, почему и зачем он так устроен я не знаю, работает и ладно. Я туда в процессе столько костылей навтыкал, что это чудище уже мало на что пригодно.
-
? Ozeroff@ - 25.04.2017 19:21
У меня не получается в эмуляторе, загрузить WAV файл в режиме БК11 и БК11М с магнитофона, командой L.
Я что-то не так делаю?
-
? gid - 25.04.2017 20:24
[Я что-то не так делаю?]
Возможно. Вы не указали порядок своих действий.
¤
Прямо с магнитофона я никогда не пробовал. Мне такое даже в голову не приходило. И наверное это даже невозможно.
Обычно я загружал уже оцифрованный WAV файл.
-
? Ozeroff@ - 26.04.2017 01:01
Нет, не на прямую с магнитофона, а через эмуляцию магнитофона, загрузить BIN файл или COD.
Выдаёт вот такую ошибку или ждёт готовности магнитофона.
¤
На БК0011:
https://drive.google.com/open?id=0B5eYDitNLlZ9T2JzOW1CX2ZWMm8
https://drive.google.com/open?id=0B5eYDitNLlZ9RnNIVDMwcFM4eXM
¤
На БК0011М:
https://drive.google.com/open?id=0B5eYDitNLlZ9RVU1dkxDSW92eTg
https://drive.google.com/open?id=0B5eYDitNLlZ9aXNSbnJ2SmJJTnM
-
? gid - 26.04.2017 09:42
Для БК11(М) не реализована эмуляция чтения с магнитофона как для БК10.
Поэтому для работы с магнитофоном на БК11(М) нужно делать так:
1. Отключить в опциях пункт "Эмулировать загрузку ленты"
Если нужна ещё запись с магнитофона - отключить "Эмулировать сохранение на ленту"
2. После этого в панели инструментов и меню "Файл" станет доступен пункт "Загрузить ленту..."
3. В мониторе или бейсике запускаем загрузку файла и жмём на "Загрузить ленту..."
4. Выбираем нужный .wav файл (по умолчанию - .tap, надо переключить фильтр) и слушаем как он загружается.
¤
Вот так. Надо это как-нибудь в документации описать будет.
Делать эмуляцию я счёл нецелесообразным, т.к. операция перехвата - ресурсоёмкая и не стоит заморачиваться ради 1.5 человека. Гораздо проще нужный .wav сконвертировать в .bin в "Опции"/"Менеджер лент", а его поместить в образ и пользоваться дисководом. Для бейсика - пользоваться дисковым бейсиком.
-
? Дмитрий - 26.04.2017 15:55
BkSound -> WaveCallback
¤
int *freeBlockCounter = reinterpret_cast<int *>(dwInstance);
...
(*freeBlockCounter)++;
¤
непонятны эти два заклинания - что во что интерпретируется и где сохраняется результат увеличения? По оператору почитал - пока не совсем понятно. Встречались подобные заклинания неоднократно, пока пропускал, но их число увеличивается с каждым новым файлом исходников.
-
? Дмитрий - 26.04.2017 16:47
В BkSound объявлен WAVEHDR *m_pWaveBlocks. WAVEHDR это структура-заголовок, а *m_pWaveBlocks - указатель. В CBkSound::SoundGen_Initialize на нее "натягивается" выделенный массив памяти из 8 блоков "WAVEHDR+буфер", потом распределяются указатели в нем поблочно. Чем было вызван такой подход? Я завис на этой процедуре из-за непонимания процесса.
-
? gid - 26.04.2017 17:00
Тут всё просто, если понять суть указателя. Указатель - это адрес ячейки памяти, в которой хранится значение переменной.
WaveCallback - это Виндовс АПИшная функция, с жёстко заданными входными параметрами. В неё передаются пользовательские параметры, представляющие собой просто числовые значения.
Нам нужно в этой функции модифицировать статическую переменную m_nWaveFreeBlockCount. Поэтому мы передаём туда указатель на эту переменную, т.е. адрес этой переменной в памяти, а указатель сперва интерпретируем как число (в функции SoundGen_Initialize), чтобы удовлетворять условиями передачи параметров, поскольку адрес по сути и есть обычное число.
А чтобы адрес был всегда достоверен, переменная сделана статической.
А уже внутри WaveCallback нам входной параметр надо обратно интерпретировать как указатель.
[int *freeBlockCounter = reinterpret_cast<int *>(dwInstance);]
Вот тут как раз и делается это.
тут мы просто говорим, что входной параметр - это адрес нужной нам переменной, и адрес этой переменной запомним в переменной freeBlockCounter
[(*freeBlockCounter)++;]
скобки тут просто для красоты, они в общем-то не нужны, но мне скобок никогда не было жалко, и я всегда их ставлю там, где мне хочется, чтобы была как-то выделена и сгруппирована какая-либо операция.
Тут мы переменную m_nWaveFreeBlockCount, адрес которой теперь хранится в freeBlockCounter увеличиваем на единицу.
Вт как-то так.
-
? gid - 26.04.2017 17:02
[Чем было вызван такой подход?]
Я не разбираясь, хороший это метод или нет, просто взял это целиком из BKBTL.
Видимо так было проще, выделить одним куском память и в ней блоки организовать, чем навыделять кучу блоков.
-
? Дмитрий - 26.04.2017 17:53
Т.е. в m_pWaveBlocks помещается указатель на весь массив и сначала идут подряд 8 заголовков WAVEHDR, а затем подряд 8 буферов.
-
? vldmr - 26.04.2017 18:11
[(*freeBlockCounter)++;]
> скобки тут просто для красоты, они в общем-то не нужны, но мне скобок никогда не было жалко, и я
> всегда их ставлю там, где мне хочется, чтобы была как-то выделена и сгруппирована какая-либо
> операция.
> Тут мы переменную m_nWaveFreeBlockCount, адрес которой теперь хранится в freeBlockCounter
> увеличиваем на единицу.
¤
скобки здесь нужны потому что приоритет постфиксного оператора ++ выше, чем унарного *.
*freeBlockCounter++ возвращает значение по адресу указателя, после чего переводит указатель на следующий элемент
-
? ak@ - 27.04.2017 13:39
to gid вопрос может не совсемм по теме
или может я что то не понимаю объясните ...
поддержана ли мыш марсианка в эмуляторе?
или редакоры графики должны подерживать маниипелятор? чет я не могу вкурить поясните плз
-
? gid - 27.04.2017 14:20
>>? vldmr@ - 26.04.2017 18:11
[скобки здесь нужны]
таки да, лажанулся я тут.
¤
[поддержана ли мыш марсианка в эмуляторе?]
Нет, не поддержана. Мышка как и джойстик эмулируется стрелками на доп.клавиатуре.
Нормальную поддержку сделать хочется, но не получается.
Какой-то редактор поддерживал. TurboVision вроде.
-
? ak@ - 27.04.2017 15:17
спасибо за исчерпывающий ответ ..
-
? Дмитрий - 28.04.2017 16:30
CFDDController::SetCommand
...
if (m_drive != newdrive)
{
FlushChanges();
m_drive = newdrive;
m_pDrive = (newdrive == -1) ? nullptr : m_drivedata + m_drive;
okPrepareTrack = true;
}
¤
неясна логика работы в случае, если newdrive != -1: m_drivedata + m_drive. m_drivedata - массив структур CFloppyDrive по числу приводов. m_pDrive хранит указатель на одну из структур. И чтобы получить этот указатель к массиву прибавляется номер привода. Это как? А случаем не m_drivedata + m_drive * sizeof(CFloppyDrive)?? Или компилятор сам поймет, что нужно поместить ссылку на элемент массива, на который указывает m_drive?
¤
Вот за что я терпеть не могу Си, так это за такие закидоны. Квадратное скрестим с треугольным - пофиг как получится, главное, что заработает.
-
? Дмитрий - 28.04.2017 16:35
>> Тут мы переменную m_nWaveFreeBlockCount, адрес которой теперь хранится в freeBlockCounter увеличиваем на единицу.
Мда, геморрой еще тот. Если адрес передан в dwInstance, то в паскале весь этот ужас
¤
int *freeBlockCounter = reinterpret_cast<int *>(dwInstance);
(*freeBlockCounter)++;
¤
легко заменяется на
¤
Inc(PInteger(dwInstance)^);
-
? gid - 28.04.2017 19:43
[Это как?]
Очень просто.
m_drivedata - массив структур. структура имеет определённый размер.
m_drivedata + m_drive - передвинуть указатель к той структуре, номер которой равен m_drive. приведение типов делается автоматически.
[А случаем не m_drivedata + m_drive * sizeof(CFloppyDrive)??]
так тоже можно, но при этом сперва m_drivedata нужно преобразовать в BYTE*, а потом, результат сложения преобразовать обратно в CFloppyDrive* Зачем такой геморрой, когда можно тупо подвинуть индекс массива?
[Или компилятор сам поймет, что нужно поместить ссылку на элемент массива, на который указывает m_drive?]
именно. В этом то и прелесть Си. Ты имеешь полный контроль над данными. И если очень надо, можно заиметь доступ к каждому байтику чего угодно. И можно любые данные проинтерпретировать именно так, как нужно здесь и сейчас. Всякие дурацкие дельфи так не умеют, поэтому там очень трудно писать нормальные программы.[то в паскале весь этот ужас]
на си никто не мешает тоже написать абсолютно точно так же:
++*(int*)dwInstance;
¤
действие получается абсолютно то же, но я такие конструкции не люблю, поэтому стараюсь не применять.
-
? Дмитрий - 28.04.2017 23:21
>> Всякие дурацкие дельфи так не умеют
Кто сказал? Умеют. И там все написанное будет понятно - пусть длинее, но понятнее. А не так как в Си - массив + число. Не спец не поймет сразу что значит эта байда.
¤
>> поэтому там очень трудно писать нормальные программы
Так все сишники считают. Однако они ошибаются. :) Вот драйверы писать на дельфи крайне сложно и неудобно, хотя и можно. А любой другой софт - пожалуйста.
-
? Дмитрий - 30.04.2017 17:21
CFDDController::DecodeTrackData
...
switch (sectno)
{
case 1:
sectorsize = 256;
break;
case 2:
sectorsize = 512;
break;
case 3:
sectorsize = 1024;
break;
default:
return false;
}
...
¤
не проще ли было записать как:
¤
if sectno < 1 && sectno > 3
{
return false;
}
else
{
sectorsize = 256 * sectno;
}
-
? Дмитрий - 30.04.2017 17:22
тьфу, там же прогрессия. ошибся...
-
? gid - 01.05.2017 20:35
даже не знаю, тут уже дело эстетики и разных желаний, нужно ли получить компактный код или быстродействующий, даже с отключенными оптимизациями.
надо включить опцию, которая генерирует при компиляции ассемблерный листинг, и посмотреть что получается, понравившийся вариант - оставить.
по мне, свич выглядит проще для понимания и работает быстрее, чем такое:
if (1 <= sectno && sectno <= 3)
{
sectorsize = 128 << sectno;
}
else
{
return false;
}
-
? Дмитрий - 02.05.2017 17:17
Как получается, что в классе CTape объявлена:
¤
bool FindTuning(int length, DWORD &wave_pos, int &wave_length);
¤
а в реализации:
¤
bool CTape::FindTuning(int nLength, DWORD &wave_pos, int &wave_length)
¤
в первом случае первый параметр length, а во втором nLength. И при компиляции нет ошибки типа определение отличается от предыдущего?
¤
--------------
¤
В CTape::SaveWaveFile (и еще в паре подобных мест класса) файл после записи не закрывается. Это нормально?
-
? gid - 02.05.2017 20:23
[И при компиляции нет ошибки типа определение отличается от предыдущего?]
Потому что в .h файле - объявление функции, и там имя переменной вообще не важно, его можно не указывать, там важен лишь тип передаваемого параметра.
¤
[Это нормально?]
В данном конкретном случае - вполне. Файл автоматически закрывается при уничтожении объекта CFile.
-
? Дмитрий - 02.05.2017 20:48
>> там важен лишь тип передаваемого параметра
А не проще ли тогда вообще писать в .h только типы - bool FindTuning(int, DWORD, int); ?? И допустимо ли это?
-
? Дмитрий - 02.05.2017 21:29
>> Файл автоматически закрывается при уничтожении объекта CFile
А не приведет такое раздолбайство в мелочах к более серьезным последствиям в будущем? Имхо в сях различного рода приведение типов автоматом (типа массив+инт) как раз сделано для таких "ценителей". В итоге чем больше расслабонов в подобных случаях, там больше костылей впоследствии введут в студии. И так далее по нарастающей.
-
? vldmrrr - 03.05.2017 02:29
Дмитрий, по моему Вам, вместо чтения исходников с огромной потерей невосстановимых нервных клеток следовало бы лучше почитать классику. Мой первый поиск немеделенно выдал ссылки на книги создателей языков (в русском переводе), которые я Вам горячо рекомендую. На многие вопросы, которые Вы тут задавали, там есть исчерывающие ответы.
¤
http://www.r-5.org/files/books/computers/languages/c/kr/Brian_Kernighan_Dennis_Ritchie-The_C_Programming_Language-RU.pdf
¤
http://lib.ru/CPPHB/cpptut.txt
-
? Дмитрий - 03.05.2017 09:21
>> На многие вопросы, которые Вы тут задавали, там есть исчерывающие ответы.
Я разбираюсь в исходнике и задаю вопросы по нему. Книги у меня все есть. :)
-
? gid - 03.05.2017 10:35
[А не проще ли тогда вообще писать в .h только типы - bool FindTuning(int, DWORD, int); ?? И допустимо ли это?]
Допустимо, и даже практикуется. Например когда объявляешь переменную - указатель на функцию, там чтобы не загромождать код, пишут только тип.
А вот проще или нет, тут уж вам решать. Я, например, на просто Си обычно сперва пишу функцию, с параметрами в cpp файле, затем, при необходимости, просто копипащу объявление функции в h файл, мне нет смысла делать лишний труд и удалять имена переменных.
А в Си++ обычно делаю наоборот, в h файле в описании класса сперва пишу объявление функции, опять же с переменными, а потом средствами ИДЕ создаю определение функции cpp файле. Тут если не писать имена переменных сразу, то их придётся потом дописывать, опять лишние телодвижения.
¤
[А не приведет такое раздолбайство]
Это не раздолбайство, а нормальное поведение. И не костыль это, а изначально так задумано. При создании объекта класса, под него выделяется память, при уничтожении - освобождается. Всё логично.
¤
[приведение типов автоматом (типа массив+инт)]
массив+инт это никакое не приведение типов, это элементарное подведение указателя к нужному месту.
а автоматическое приведение типов, это
int i=5;
float f=i; //вот это
¤
Эта штука опасна тем, что при бесконтрольном применении и игнорировании предупреждений компилятора, можно при преобразовании типа с большей разрядностью в меньшую, получить неожиданный результат.
¤
Ну так за всё нужно платить, больше контроля и гибкости, требуют более ответственного подхода к коду.
-
? Дмитрий - 06.05.2017 12:24
Что-то не могу разобраться каким образом эмулятор обрабатывает коды БК, выдерживая время выполнения каждой команды с учетом методов адресации. В коде есть фрейм, в котором выполняются команды "сколько влезет" в него. А сам фрейм каким образом выполняется? Что выполняется между двумя фреймами?
-
? gid - 06.05.2017 13:40
Чё-то как-то сразу и не сказать по-простому.
1. для каждой команды есть определённое время выполнения в тактах, задаётся таблицами. Для БК10 - стабильное, для БК11 - сильно примерное, т.к. ВП1-037 довольно часто занят собой и все команды выполняются то за одно время, то за чуть большее, потому как просирается цикл ввода-вывода на шине, и приходится ждать следующего.
2. Длительность фрейма задана 40мс. Рассчитывается, сколько тактов процессора при текущей ТЧ влезает в фрейм, и всё остальное пропорционально тактам, и вот в этом цикле выполняется столько команд, сколько их длительностей полезает в фрейм.
3. сам фрейм вызывается из отдельного потока. CMotherBoard::TimerThreadFunc()
Там есть комментарий, что вообще-то точная синхронизация по звуковой подсистеме делается. У звука тоже есть звуковые буферы, которые передаются звуковой карте по мере заполнения, и пока буфер не отзвучит, следующий не передаётся, а поскольку звук звучит с заданной частотой дискретизации, получается довольно чёткая синхронизация.
И таймер в TimerThreadFunc() нужен только тогда, когда в системе вообще нет никакой звуковой карты.
4. Между фреймами не выполняется ничего, процессор ПиСи простаивает. Чем быстрее выполнятся вычисления во фрейме, тем дольше будет простаивать процессор.
¤
Но тут есть нюанс.
Мы ведь не можем всё по быстрому вычислить и по быстрому вывести на экран и в звук, а потом сидеть и ждать, когда придёт время выполнения следующего фрейма. Если на экран можно всё по-быстрому заранее вывести (из-за этого как я подозреваю у меня и неистребимое мерцание экрана), то звук приходится выводить хоть чуть-чуть в реальном времени. Поэтому фрейм разбит на 4 части, четырьмя звуковыми буферами. Т.е. фрейм выполняется в 4 рывка - по быстрому заполняет звуковой буфер, ждёт, пока предыдущий буфер отзвучит и передаёт заполненный, и так 4 раза. И так бесконечно в цикле.
¤
Я очень много экспериментировал с длительностями фрейма, количеством звуковых буферов и как этот фрейм выполнять, из-за чего код стал немного избыточным, переусложнённым и местами бессмысленным, зато остановился на том варианте, что сейчас есть, как наиболее компромиссном. Задержка звука - всего 10мс, на слух практически не заметна. Нагрузка фрейма на ядро - 40%-50% (у меня).
-
? gid - 06.05.2017 14:52
[неистребимое мерцание экрана]
ошибка, читать как неистребимое дёрганье экрана. Изображение двигается рывками.
-
? Дмитрий - 06.05.2017 16:41
Тогда тут все крайне жестко завязано на частоту эмулируемого проца. Если, к примеру, у БК10 поставить не 3мгц, а 10, то все съедет к чертям - по крайней мере я не нашел пересчета времени выполнения команд в таблицах (или плохо смотрел). Но как тогда происходит выполнение при частоте, отличной от 3/4Мгц (когда ее клавишей увеличивают)?
-
? gid - 06.05.2017 18:05
[то все съедет к чертям]
Естественно съедет. 10МГц и 3МГц - это же разные вещи, на 10МГц будет всё работать быстрее, но с совершенно неправильными таймингами, рассчитанными на 3МГц. Я поэтому возлагал большие надежды на точную потактовую модель на верилоге, но пока ничего не получается.
¤
[по крайней мере я не нашел пересчета времени выполнения команд в таблицах]
потому что мы увеличиваем частоту, а не уменьшаем время выполнения. Именно из-за этого длительность команд задаётся в тактах, а не в микросекундах. Именно поэтому во фрейме, длительность фрейма в миллисекундах переводится в количество тактов текущей частоты ВМ1. Именно поэтому там используется плавающая арифметика.
¤
[Но как тогда происходит выполнение при частоте, отличной от 3/4Мгц]
Просто фрейм не зависит от частоты, частота может быть совершенно какая угодно.
¤
Вот:
m_fTickCount += double(m_nCPUFreq) / CPU_FRAMERATE; //количество тактов процессора в текущем фрейме. При нестандартной частоте
//может быть совсем не целое число.
-
? Дмитрий - 06.05.2017 22:41
Тогда непонятно как сделать универсально, чтобы работало на любой частоте - хоть на 100мгц. Гипотетически если я, допустим, хочу сделать режим БК+: 50 или 100мгц, добавить 32 битные регистры, переписать прошивку СМК на LBA (выкинув прочий уже ненужный мусор), дописать "аппаратные" mul/div/ash/ashc (нужны только их время выполнения в тактах, сами команды несложны), fpu-команды (опять же нет тактов, и написать несколько сложнее), сделать линейно адресуемой памяти несколько мегабайт, видеоадаптер с "аппаратным" текстовым режимом и т.д. и т.п. А тут все заточено под конкретную частоту. И получается сразу же упираемся в то, что проще написать с нуля, чем перелопачивать имеющийся эмулятор.
-
? gid - 07.05.2017 10:09
Правильно. Я тоже упёрся в этот тупик.
Чтобы сделать универсальный эмулятор, нужна потактовая эмуляция, чтобы сделать потактовую эмуляцию, нужна аппаратная реализация, хотя бы в виде схем и проектов, иначе можно тупо всем новшествам задать быстродействие 1 такт и не париться с релистичностью, всё равно этого в реале не будет, и как оно даолно быть никто никогда не узнает.
БК+: 100МГц, 32бит регистры, новые команды - это уже совсем другое железо, ничего общего с оригинальным не имеющее, соответственно, нужна своя аппаратная реализация, которую потом нужно заэмулировать.
¤
Например, я сейчас использую эмулятор как отладочный стенд, когда пишу что-нибудь для БК. Для этого он вполне подходит. Но как полноценная замена БК - нет.
Когда появится возможность сделать точную модель процессора ВМ1 с достаточным быстродействием, тогда и появится новый эмулятор.
-
? Дмитрий - 07.05.2017 12:23
>> нужна своя аппаратная реализация, которую потом нужно заэмулировать
Согласен. Но ее нет. Проект Воланда по созданию БК12 так и не завешен и, вероятно, уже никогда не будет. Вот у меня и появилась мысль сделать его хоть в виде эмулятора.
¤
>> ничего общего с оригинальным не имеющее
По идее это развитие дальше. Система команд остается той же, но расширяется. Никто же не скажет, что нынешняя система команд Интела/АМД это уже не то, что было во времена 286/386. Все, что написано для них заработает и на нынешних машинах. Очень не хочется, чтобы БК умерла окончательно, пусть будет хоть в виде эмулятора. Этакий памятник несбывшимся аппаратным мечтам.
¤
>> иначе можно тупо всем новшествам задать быстродействие 1 такт и не париться с релистичностью
Вот насчет БК+ эта мысль и посещала. Все равно аппаратной реализации нет. 1-2 такта на команду (FPU 3-4, к примеру) и вперед.
¤
>> Когда появится возможность сделать точную модель процессора ВМ1 с достаточным быстродействием, тогда и появится новый эмулятор.
Ув. Vslav говорил как-то о точной реализации ВМ1 на 100мгц в ПЛИС по результатам вскрытия проца. Но пока никаких вестей нет. Но это будет просто ВМ1 без доп. плюшек, а 3мгц или 100 для старой БК нет никакой разницы.
-
? gid - 07.05.2017 15:37
В общем, я выше всё писал к тому, что нельзя заэмулировать то, чего нет. Можно лишь смоделировать, с разной степенью достоверности и реалистичности.
[и вперед.]
В таком случае, вам нужно было бы не к эмуляторам обратиться, а просто для начала расписать на бумаге желаемую модель: систему команд, прерываний, реакции на прерывания, всякие другие мелочи, которые сейчас не видны, но в процессе обязательно всплывут. И писать прогу - программную модель своего компьютера.
¤
[Но пока никаких вестей нет.]
Есть вестей. Некоторые люди на основе его трудов уже ПЛИС БКшку сделали для себя, я правда за результатами не следил, на сколько всё получилось, не в курсе. Собственно пока нет Pin-2-pin ПЛИС ВМ1, так и надобности в ней особой нету ни у кого.
-
? Дмитрий - 09.05.2017 21:22
Можно услышать о взаимосвязи времени фрейма, размеру и числу звуковых буферов, частоте проца и т.п.? Какими путями был выбран конечный результат, промежуточные результаты, почему не устроили отброшенные варианты?
-
? gid - 10.05.2017 10:05
Со звуковыми буферами всё просто - чем больше буфер, тем длиннее звук, туда помещаемый, соответственно, задержка между происходящим на экране и звуком заметнее, но вычислительные затраты на обработку и передачу данных звуковой карте меньше.
А чем меньше звуковой буфер, тем всё наоборот - задержка меньше, но нужно чаще эти буферы передавать железу. А там нужно залочить критическую секцию, обработать, разлочить - операции времязатратные.
Вот и получился компромисс - длина звукового буфера 10мс.
Затем, раньше количество самих звуковых буферов было довольно большое, но эта стратегия применима там, где нужна потоковая обработка данных, напр. стриминг. А для обработки в реальном времени, большое количество буферов избыточно, здесь просто недопустима ситуация с переполнением очереди. Поэтому вначале я сделал два буфера длиной в один фрейм каждый, убедился, что это плохо, и экспериментальным путём убедился, что буфера длиной 10мс достаточно, и оставил их столько, сколько влазит во фрейм, хотя по алгоритму достаточно всего 2 буфера, но мы не страдаем от недостатка памяти.
¤
Сам фрейм раньше был длительностью 20мс, но я решил отвязать все расчёты от длины фрейма, и теперь можно делать фрейм любой длительности 20*n мс (думаю, можно и меньше, но исхожу из расчёта, что минимально комфортная длина равна одному кадру в секунду, более мельтешить нет практического смысла), хоть секунду, хоть 10. Это повлияет на отзывчивость самой программы в некоторых местах на реакцию пользователя, только и всего.
¤
Про частоту не понял. Частота проца - эмулируемая вещь, она к фреймам и буферам отношения не имеет, сколько её полезает в фрейм, столько и полезает.
-
? Дмитрий - 10.05.2017 11:38
Я в вопросах двигаюсь к пониманию как мне увеличить частоту проца и хотя бы грубо и приблизительно рассчитать остальные параметры буферов, фреймов и прочего. А уже потом двигать в небольших пределах относительно этих значений и добиваться наименьших задержек. На какие параметры мне обратить внимание? Если взять поток, который исполняет инструкции процессора и отбросить пока все остальные вспомогательные потоки, то получается ли так, что его можно легко перевести на любую частоту? Или нужно что-то менять кроме константы базовой частоты?
-
? Terra - 10.05.2017 15:04
Вот тут https://habrahabr.ru/post/327996/#comment_10204646 Юрий Калмыков в комментариях был замечен
-
? gid - 10.05.2017 15:16
[На какие параметры мне обратить внимание?]
Там не в параметрах дело, а в конкретной реализации эмулируемого устройства. Например, я в эмуляторе ограничил максимальную частоту процессора ВМ1 40Мгц, потому что уже и при этом вычисления тупо не укладываются во фрейм. А значит и не возможна эмуляция работы устройства в реальном времени.
[то получается ли так, что его можно легко перевести на любую частоту?]
нет, чем сложнее и не оптимальнее эмуляция, тем ниже верхний порог быстродействия, который можно сэмулировать.
Например моя потактовая модель ВМ1 + ВП1-037 на основе верилога эмулирует работу на частоте 500кГц максимум. И ничего нельзя сделать с этой реализацией, пока или не появятся процессоры, работающие на терагерцевой частоте, или не будет переписана сама модель.
-
? Дмитрий - 10.05.2017 21:14
>> моя потактовая модель ВМ1 + ВП1-037
Я имел в виду ТОЛЬКО модель самого ВМ1, без 037 и прочего. Только исполнение инструкций. Можно ли пока только эту часть "разогнать"? И какие константы править?
¤
Нашел в pdf тайминги команд на PDP11/40, но там в микросекундах, а не в тактах...
-
? gid - 10.05.2017 22:49
Даж не знаю. Если в эмуляторе - можно тупо в модуле CPU всем командам задать время выполнения 1 такт (0 нельзя, тогда нужно будет придумывать свой цикл обработки команд), нужен ведь разгон, а не достоверность. Задать частоту CPU как можно больше - экспериментировать надо. Отключить лишнее - эмуляцию вращения дискет, работу со звуком (эмуляция конденсатора и медиатакты), убрать эмуляцию хода луча ЭЛТ, поставить упрощенный вывод экрана - чем меньше вычислений, тем больше эмулируемых тактов влезет во фрейм.
в CMotherBoard::TimerThreadFunc() убрать таймеры, оставить просто цикл с проверкой на останов цикла и завершение потока - так мы получим чистую возможную производительность, без разделения на фреймы. Вернём таймеры обратно - снова получим фреймы, когда будет надо.
¤
Тайминги команд на PDP11/40 годятся только для PDP11/40, и больше ни для чего. Тайминги команд БК критически зависят от ВП1-037, и с таймингами голого ВМ1 не имеют ничего общего. Вообще.
-
? Дмитрий - 10.05.2017 23:13
>> Тайминги команд БК критически зависят от ВП1-037
Тогда, если выкинуть 037 и сделать а-ля "мгновенное 0-такт ОЗУ", все эти тайминги не нужны вообще. Или сделать, к примеру, CLR R0 - 2 такта, CLR (R0) - 3 такта, CLR (R0)+ и CLR -(R0) - 4 такта, CLR @(R0)+ и CLR @-(R0) - 5 тактов, CLR const - 6 тактов, CLR @const(R0) - 7 тактов. Как-то так.
¤
Частота на разных компах разная, значит, чтобы добиться результирующей частоты 50Мгц или 100, надо в потоке ставить задержку. Только вот не пойму, как с помощью QueryPerformanceFrequency/QueryPerformanceCounter сделать верную задержку на нужную частоту.
-
? gid - 11.05.2017 11:47
В функции CMotherBoard::TimerThreadFunc() есть целых два ответа на этот вопрос.
А вот вам ещё один вариант. Я его давно наваял, но не видел в нём смысла, поэтому он валяется в черновиках.
UINT CMotherBoard::TimerThreadFunc()
{
#define ONE_SECOND_MS 1000
LARGE_INTEGER i1, i2, li_clock, res;
HANDLE hWaitableTimer = CreateWaitableTimer(nullptr, FALSE, nullptr); //самосбрасывающийся
if (hWaitableTimer == nullptr)
{
return -1;
}
if (QueryPerformanceFrequency(&li_clock)) //если этот метод возможно применять
{
//применим
do
{
QueryPerformanceCounter(&i1);
¤
//если процессор остановлен для каких-то целей, значит ничего выполнять не надо
//фрейм всегда выполняется полностью. Остановка делается только на границах фреймов.
if (IsCPURun())
{
// Выполняем набор инструкций
ExecuteFrame();
// Парсим скрипт, если он есть
m_pParent->GetScriptRunnerPtr()->RunScript();
}
QueryPerformanceCounter(&i2);
res.QuadPart = (i2.QuadPart - i1.QuadPart) * 10000000LL / li_clock.QuadPart; //сколько времени делались вычисления
// вычтем из времени, которое отводится на фрейм, время, которое заняли вычисления. Все расчёты в сотнях наносекунд,
// поэтому такие большие числа.
res.QuadPart = (10000LL * ONE_SECOND_MS / CPU_FRAMERATE) - res.QuadPart; //остаток, сколько надо подождать
//если есть что ждать - подождём.
if (res.QuadPart > 0)
{
SetWaitableTimer(hWaitableTimer, &res, 0, nullptr, nullptr, FALSE);
WaitForSingleObject(hWaitableTimer, INFINITE); // ждём срабатывания таймера.
}
} while (!m_lockKillTimerEvent.IsLocked()); //пока не придёт событие остановки
}
else
{
//иначе, ограничимся обычным таймером
res.QuadPart = -10000LL * ONE_SECOND_MS / CPU_FRAMERATE;
SetWaitableTimer(hWaitableTimer, &res, (ONE_SECOND_MS / CPU_FRAMERATE), nullptr, nullptr, FALSE); //периодический
do
{
//если процессор остановлен для каких-то целей, значит ничего выполнять не надо
//фрейм всегда выполняется полностью. Остановка делается только на границах фреймов.
if (IsCPURun())
{
// Выполняем набор инструкций
ExecuteFrame();
// Парсим скрипт, если он есть
m_pParent->GetScriptRunnerPtr()->RunScript();
}
// ждём срабатывания таймера.
WaitForSingleObject(hWaitableTimer, INFINITE);
} while (!m_lockKillTimerEvent.IsLocked()); //пока не придёт событие остановки
}
CancelWaitableTimer(hWaitableTimer);
CloseHandle(hWaitableTimer);
m_lockKillTimerEvent.UnLock();
return 0;
}
¤
код надо будет обратно отформатировать в любом редакторе, который это умеет.
-
? Дмитрий - 11.05.2017 13:32
Если я правильно помню, фрейм 20мс. Для БК10 частота 3Мгц или 3.000.000 тактов. Выходит на один 20мс фрейм (в 1 секунде у нас 50 фреймов) приходится 60.000 тактов. Но в коде ExecuteFrame
¤
m_fTickCount += (double)m_nCPUFreq / CPU_FRAMERATE; //количество тактов процессора в текущем фрейм
¤
а CPU_FRAMERATE = 25. Или дефолтный фрейм 40мс?
¤
Итак грубо: задается промежуток, через который должен завершиться таймер, в ExecuteFrame исполняются команды по тактам без каких-либо задержек (то бишь потоком, одна за другой), пока не накопится 60000 тактов или чуть более. Затем выполнение фрейма прерывается и ждем срабатывания таймера. Потом снова и пока запущен процессор. Получается исполнение происходит рывками по размеру фрейма.
¤
Хм, разве это достоверно? На глаз получается нормально, даже отлично, но если используется таймер 177706-177712, то он работает линейно (а вдруг внутри фрейма читается значение счетчика для чего-либо). А выполнение команд получается нелинейно, то, по идее, должно получится расхождение. Расхождение будет даже внутри одного фрейма, т.к. в цикле может многократно читаться счетчик (а задержки-то у нас между командами нет => т.е. получается, что команды фрейма исполняются на частоте проца компьютера, что не есть гуд). Также цикл чтения счетчика может быть не закончен в пределах одного фрейма, а мы задерживаем исполнение следующего фрейма для достижения рабочей частоты. Таким образом, внутри фрейма промежуток между считанными значениями счетчика будет меньше (по сравнению с аппаратным БК10), а между фреймами гораздо больше из-за накопившейся задержки. А если исполняется какой-то алгоритм, завязанный на временные промежутки? Или я что-то упустил?
¤
В LockVarType для чего использовать целое при значениях 0/1? И использовать InterlockedCompareExchange, которая тупо сравнивает два числа и выдает в результат 0 или 1? bool не проще было бы и избавиться от кернеловской InterlockedCompareExchange?
¤
И еще по поводу звуковых буферов. Создается 8 буферов и 8 заголовков. А зачем 8 заголовков? Параметры буферов одинаковые - не достаточно ли одного?
-
? gid - 11.05.2017 14:54
Я уже писал, в посте от "gid - 06.05.2017 13:40", что фрейм у меня 40мс, так лучше.
¤
[Получается исполнение происходит рывками по размеру фрейма.]
Не исполнение, а эмуляция. Не будем же мы замедлять программу, имитируя быстродействие в 3МГц, вставляя задержки в виде Sleep(n) после каждой команды. Мы просто по-быстрому выполним всю пачку команд, укладывающихся во фрейм, а оставшееся время просто ничего не будем делать, имитируя тем самым заданное быстродействие.
[разве это достоверно?]
Таки это эмуляция, а не симуляция. Как можем, так и эмулируем.
[но если используется таймер 177706-177712]
то он тоже эмулируется, и работает точно так же - сколько тактов ВМ1 помещается во фрейм - столько тактов и обслуживается таймер, поэтому никакого расхождения.
[Или я что-то упустил?]
да. Все БКшные таймеры и счётчики тоже эмулируются, и всё засинхронизировано между собой. Чтобы независимо от длины фрейма, от эмулируемой частоты БК, звук работал с частотой дискретизации 44100 (по умолчанию), частота эмуляции вращения эмулируемого диска эмулируемой дискеты в эмулируемом дисководе была строго 5 об/сек. И чтобы такты БК равномерно распределялись между всеми событиями - квантом вращения дискеты, квантом звука.
¤
[LockVarType для чего использовать целое]
Потому что InterlockedCompareExchange не умеет байты, оно умеет только платформозависимый LONG
[bool не проще было бы]
не проще, даже если задать переменной свойство volatile, нет никаких гарантий, что при взаимодействии между потоками, не будет прочитано недостоверное значение переменной.
Я там до этого использовал Eventы, но они сильно тормозные.
¤
[А зачем 8 заголовков?]
Каждому буферу по заголовку, потому что в каждом заголовке свои параметры и флаги для каждого буфера. Иначе, как узнать, какой буфер подготовлен для передачи устройству, а какой свободен?
-
? Дмитрий - 06.06.2017 14:09
1. Что-то я запутался.
¤
SetV((~old & m_ALU & m_Nbit) != 0)
¤
тут значения трех переменных DWORD накладываются друг на друга с помощью AND и результат проверяется на !=0?
¤
2. Если мне не изменяет память, ВП-128 работает на частоте ВМ1. Если "гнать" проц, то и частота эмулятора 128-й тоже будет расти. Железка такого не выдержит (сверх разумных пределов), а эмуляция - запросто, но! Прошивки контроллеров дисководов настроены на частоту работы 128-й (там паузы выдерживаются). Получается, если гнать проц с усреднением времени выполнения команд, то прошивка ПЗУшкой тронется. Если гнать 128-ю, то останутся ли верными задержки и не полетит вся эмуляция к чертям? "Отсюда мораль" - либо эмуляцию 128-й оставлять, допустим, на 4Мгц, либо как-то подгонять задержки в прошивке (что в разы геморнее). Получилось два подпорченных помидора и какой из них менее гнилой?
-
? gid - 06.06.2017 16:29
[тут значения трех переменных DWORD накладываются друг на друга с помощью AND и результат проверяется на !=0?]
Именно. Тут используется не логическое, а побитовое and. А если быть внимательным, то можно заметить, что m_Nbit содержит значение маски знакового бита, т.е. 0200 для байтовой операции и 0100000 для словной. Таким образом, в результате операций & у нас будет результат 0 или не 0 (0200 или 0100000). Всё корректно. Там даже комментарий есть, объясняющий смысл этой операции.
old - это предыдущее значение m_ALU, до операции, m_ALU - текущее значение.
¤
[Если мне не изменяет память, ВП-128 работает на частоте ВМ1.]
Изменяет. У ВП-128 свой кварц и генератор 4МГц, по крайней мере в контроллерах АльтПро. Про стандартный КНГМД не помню, может и нету. Правда для повышения стабильности лучше брать частоту ВМ1.
[Если гнать 128-ю, то останутся ли верными задержки и не полетит вся эмуляция к чертям?]
Задержки перестанут быть верными, надо при этом ещё и скорость вращения дискеты повышать.
У меня ВП-128 + ВМ1 синхронно на 6МГц на чтение кое-как работали, с 3.5" дисководом. С 5.25' - не работали. Но мой экземпляр ВП-128 не выдерживает долго такой частоты и зависает на шине.
¤
Отсюда мораль - эмуляцию 128-й оставлять, на 4Мгц и не париться. Однако с повышением частоты ВМ1 задержки в прошивке тоже надо будет корректировать. Ибо если проц будет быстрее работать, то и задержки, заданные SOBами будут меньше чем нужно. Поэтому нужно изобретать другой метод работы с ВП-128 и другую прошивку.
-
? Дмитрий - 06.06.2017 18:03
Вдогонку. Не совсем понял, почему таймер 177706-177712 вложен в класс CPU, а не "мамки"?
¤
>> изобретать другой метод работы с ВП-128 и другую прошивку
В эмуляторе можно упростить работу с ВП путем отбрасывания чтения/записи различных маркеров. Поскольку нам известна последовательность чтения/записи маркеров и что за чем идет, то при попытке чтения служебной области выдавать в 177132 (а в 177130 выставлять биты) нужные данные СРАЗУ (без ожидания оборота диска (и прочих медиа-тактов), пока маркер окажется под головой). В итоге, даже если прошивка будет ждать маркер пустым циклом, то эмулятор не ждет оборотов, а сразу же сообщает, что маркер найден. И когда закончится цикл ожидания (который зависит от скорости ВМ1), все уже выдано в регистры и эмуль контроллера ждет дальнейших команд. Прошивка же остается неизменной. Придется подкорректировать эмуляцию контроллера и дисковода.
-
? gid - 06.06.2017 19:51
Таймер вложен в класс CPU потому что он является неотъемлемой частью CPU, расположен на кристалле CPU, среди других транзисторов. И так просто проще синхронизировать работу таймера с таймингами команд.
Ну, хотя, формально, его можно разместить где угодно. Этот рудимент не тянет на полноценный функциональный блок CPU.
Но мне так проще было. Поэтому.
Если в 177130 выставлять нужные биты СРАЗУ, то прошивка посчитает, что диск не крутится и вообще ничего работать не будет. Потому что она проверяет появление маркера и пропадание маркера, причём не когда хочешь, а с определённой задержкой.
Там ещё есть проблема межсекторных расстояний, которые в прошивке тоже задаются задержкой а потом просто идёт ожидание, пока не прочтётся нужный заголовок сектора, если мы уже проскочили мимо него, то совершается оборот диска, и в это время фиктивно читается вообще всё - не нужные секторы, маркеры гапов, заголовки. Пока не прочитается то, что нужно или не наступит предел ожидания - 5 гарантированных оборотов диска, т.е. индексный маркер должен появиться, и через некоторую задержку должен исчезнуть, иначе не считается.
А ещё есть проверка синхропоследовательстей чтобы убедиться, что ВП-128 правильно разбивает считанные MFM импульсы на байты, и не сбился нигде. Проверка на инверсный/прямой приём, хотя это наверное остатки кода от другого контроллера.
Если выдавать все нужные данные сразу, как в ЭД, то стандартная прошивка просто не будет работать, она на это не рассчитана. Нужно будет написать свою прошивку, которая будет работать по своему протоколу обмена данных.
-
? Alexander Tishin@ - 11.06.2017 19:55
Проверка на инверсный/прямой есть только в коде чтения синхропоследовательности, т.к. на этот момент 128 ещё не знает фазу сигнала, и надо проверять оба варианта. После того, как контроллер считает старт-символ (0xa1 ЕМНИМС), то он зацепляется за правильную фазу и дальше всё это шаманство не нужно.
-
? Дмитрий - 27.08.2017 15:41
Что-то я уже стал подзабывать тонкости генерации кода. Команда (если ее разместить по адресу 1020) MOV 1000,1002 генерирует код 16767 177754 177754. Если я правильно помню, то вычисление смещения происходит от адреса следующей команды (1026). То бишь, смещения должны быть равны 1000-1026=177752 и 1002-1026=177754. Или при разборе двухоперандной команды с адресациями 67 в обоих операндах процессор опирается на адрес после считывания очередных данных?
-
? gid - 27.08.2017 16:55
Да, традиционно - при разборе любой команды со всеми относительными адресациями, действительный адрес вычисляется сразу после чтения смещения. Адрес источника вычисляется относительно адреса 1024, потому что после чтения аргумента источника счётчик команд равен 1024 - указывает на адрес аргумента приёмника. а адрес приёмника вычисляется после чтения аргумента приёмника.
-
? Дмитрий - 25.09.2017 00:05
Не буду создавать отдельную тему, спрошу тут. Интересует инфа про принципы работы контроллера клавы в РС - отлов нажатия нескольких клавиш и прочего. Плюс интересует инфа по программируемому таймеру РС. У Фроловых в "Библиотеке программиста" инфа есть, но не въеду как определяется нажатие 2-х и более клавиш. Где можно еще почитать?
-
? MM - 25.09.2017 04:28
Насчет клавы именно в ИБМ ЭВМ - погуглите чип ОЭВМ 8042 и его аналоги, там для клавной прошивки примено рассказывается.
Кратко - контроллер формирует отдельную последовательности котов при нажатии 1 шт. кнопки, и др. последовательность - при её отпускании. При этом может быть нажато много кнопок одновременно. Результат нажатия формируется программно в драйвере клавы, например в БИОС ИБМ ЭВМ.
Т.е. КОИ-х на выходе 8042 в принципе отсуствуют, в отличии от 1801ВП1-014
Как вариант, можно погуглить паспорт от МС7004 - там приводится таблица кодов кнопок, для общего ознакомления с принципами работы ( с ИБМ клавой не совместима ).
-
? Дмитрий - 25.09.2017 14:27
>> контроллер формирует отдельную последовательности котов при нажатии 1 шт. кнопки, и др. последовательность - при её отпускании
Нашел, благодарю. Там все просто. Если нажата клавиша, то выдается ее скан-код. Если клавиша отжата, то передается 0xF0 и ее код. Контролируя поступающие скан-коды можно отлавливать хоть сколько нажатых одновременно клавиш.
-
? Дмитрий - 12.11.2017 21:56
Дошли руки до продолжения погружения с исходники эмуля. Интересует назначение и принцип действия класса Device - код вроде простой, но для чего он и как используется пока неясно.
-
? gid - 13.11.2017 09:42
Это был класс прототип. От него наследовалось, да и сейчас наследуется куча классов устройств, хотя я и поломал стройную схему наследования, ибо смысл в ней был только эстетический.
-
? Дмитрий - 13.11.2017 09:49
Как используется и для чего? И нужен ли он вообще?
-
? gid - 13.11.2017 11:01
Ну, для чего в ООП используются прототипы?
Поскольку я не фанат ООП и пользуюсь принципами, правилами (и т.п.) ООП только когда без них не обойтись, я так и не понял, в чём фетиш классов-прототипов, кроме как иметь единообразный интерфейс и набор функций-членов класса.
В конкретной реализации эмулятора - класс прототип такой, какой он есть - бесполезен. Я не стал ломать всё, потому что лень переписывать много наследников.
Вообще, он не нужен. Его можно удалить, а потом во всех наследниках убрать родителя прототипа, и скопипастить пару функций. Во многих местах и эту пару функций можно исключить за ненадобностью, там функция вызывает другую функцию, а можно просто напрямую вызов делать. В общем возни много, толку - мало. Проще оставить как есть.
-
? Дмитрий - 13.11.2017 11:36
Просто в некоторых местах потомков юзается увеличение тика. Раз юзается, значит нужно. В некоторых нет никаких вызовов родителя. Мне неясно для чего нужны эти тики Device?
-
? gid - 13.11.2017 12:37
В Device - почти низачем. Единственный наследник, который использует этот функционал по назначению - класс Speaker, который использует m_tickCount как счётчик захваченных сэмплов, при эмуляции магнитофона.
У всех остальных наследников функция NextTick либо не используется вообще, либо используется вхолостую (это значит я просто не закомментировал эту ненужную функцию), либо переопределена для собственных нужд.
Зачем это нужно было с самого начала - я не знаю, так было, но смысла в этом не было. А я не стал ломать то, что не работало, но не мешало мне.
-
? Дмитрий - 14.11.2017 10:26
Вопрос: вот в CMotherBoard::ExecuteFrame на время выполнения процедуры вызывается лочилка m_lockExecuteFrame.lock. Что дает этот лок? Что он запрещает? Вызов m_lockExecuteFrame.lock/unlock есть только внутри ExecuteFrame (равно как и обращение к классу m_lockExecuteFrame). А зачем он, если извне его никто не контролирует? Это ведь отдельный экземпляр класса LockVarType. Был бы глобальным, тогда понятно - пока он залочен, другие потоки ждут его разлочки, чтобы начать выполнять свои действия или обрабатывать результаты выполнения другого потока. Точно также непонятно назначение m_lockRunning в классе мамки - лочится при вызове CMotherBoard::RunCPU и анлочится при CMotherBoard::StopCPU. И, опять-таки, его никто не контролирует - проверок lockRunning.IsLocked нет. Загадка...
-
? gid - 14.11.2017 12:09
m_lockExecuteFrame контролируется. В хедере есть функция IsFrameExecuted(), которая проверяет состояние m_lockExecuteFrame
Функция вызывается в функциях void CMotherBoard::StopCPU(bool bUnbreak) и bool CMainFrame::SaveMemoryState(CString strPath).
m_lockExecuteFrame используется для того, чтобы фрейм НЕ выполнялся когда происходят некоторые критичные действия, затрагивающие параметры выполнения фрейма.
То же самое с m_lockRunning, есть функция IsCPURun(), которая проверяет состояние m_lockRunning. Вызывается в void CMotherBoard::ExecuteFrame(), void CMainFrame::OnCpuResetCpu(), UINT CMotherBoard::TimerThreadFunc()
m_lockRunning - простой флаг, индицирующий работу процессора. Нужен для синхронизации, чтобы UI и класс CMotherBoard не уничтожался раньше, чем завершится функция ExecuteFrame и отдельный поток TimerThreadFunc (зависит от ситуации: или закрыть прогу или пересоздать конфигурацию)
-
? Дмитрий - 14.11.2017 13:09
>> В хедере есть функция IsFrameExecuted()
Млин, вот терпеть ненавижу этот Си из-за таких допущений. Одна ф-ция объявлена в одном месте, а реализована в другом, другая и объявлена, и реализована в одном месте. И ищи ее по всем файлам. Нет, чтобы строго .h - объява, .c - реализация.
¤
И что-не наблюдаю таймер по 100 вектору, 177706-177712 вижу. Плюс, если реализовывать 177706-177712 в отдельном потоке, то как взаимодействовать с ним в случае, если от ЦПУ поступил запрос чтения счетчика? Ведь поток таймера работает (ибо работает ExecuteFrame) - и как правильно считать значение (не с точки зрения Сишных потоков, а вообще, без привязки к ЯВУ)? В сырцах 3.8 в комментах сказано, что таймер надо в отдельный поток выносить, а не выполнять каждый 128 такт.
-
? gid - 14.11.2017 14:30
[И ищи ее по всем файлам.]
Ctrl-F и искать во всём проекте - найдётся всё. Правый клик на функции и посмотреть иерархию вызовов - покажет всё, Вижуал студия удобна в этом плане, легко найти и посмотреть всё что угодно в каком угодно большом проекте.
¤
[Нет, чтобы строго .h - объява, .c - реализация]
Вообще-то так и задумано, и так и должно быть по правилам. Но мне лень копипастить, поэтому все инлайн функции я объявляю и реализую в .h файлах, а так же крохотные функции из одного ретурна там же.
¤
Вот таймер по 100 вектору, в CPU.h
inline void TickIRQ2()
{
m_bIRQ2rq = true;
}
вызывается из void CMotherBoard::Make_One_Screen_Cycle() если таймер не замаскирован битом 14 регистра 177662
¤
[если реализовывать 177706-177712 в отдельном потоке]
Вот поэтому и не надо реализовывать в отдельном потоке. Это просто функция, которая вызывается каждый 128й такт процессора. Поскольку такты эмулируются очень приблизительно, то и таймер работает очень приблизительно. см. как вызывается функция void CCPU::Timerprocess()
[В сырцах 3.8 в комментах сказано,]
Там много чего сказано. Иногда там вообще уже неправда. Я когда это замечаю - удаляю или исправляю, но далеко не всегда.
Так, как сейчас работает таймер - технически правильно, но из-за фундаментально кривой эмуляции самого принципа работы всё работает абсолютно недостоверно.
¤
Там реально надо плюнуть на всё, и писать заново с нуля. У Patrona есть нормальная реализация 1801ВМ1 он даже исходники выклал на zx-pk.ru, но я, когда хотелось и было время, так и не смог разобраться, как выцепить только проц из его эмулятора ДВК, а потом стало не до этого, и до сих пор нет достаточного количества времени, чтобы браться за это.
-
? Дмитрий - 14.11.2017 17:04
А где эти исходники эмуля ДВК?
-
? gid - 14.11.2017 19:02
там http://zx-pk.ru/threads/25252-adapter-shiny-mpi-dlya-emulyatora-dvk-1/page3.html
В последнем посте.
Только не исходники эмулятора ДВК, а исходники модели процессора, адаптированные под потактовую модель работы шины МПИ.
-
? Дмитрий - 14.11.2017 20:25
Мда, там черт ногу сломит. Особливо с моими скромными познаниями в Си.
-
? Дмитрий - 15.11.2017 11:46
Как все-таки лучше организовать задержку в потоке? Юзать WaitableTimer или sleep в цикле с приблизительным отсчетом через связку QueryPerformance*? А то в комменте написано, что QueryPerformance отлично работает на 10-ке, а на ХР плохо (почему?) и наоборот. И как ведет себя таймер на БК, если менять параметры - начинает работать с новыми параметрами или перезапускается при любом изменении (к примеру множитель)?
-
? gid - 15.11.2017 13:46
sleep использовать нельзя по одной простой причине - его параметр задаётся в миллисекундах, а задержку надо делать когда как, -
на десятки или сотни микросекунд, в зависимости от загруженности фрейма вычислениями видео и звука. Причём виндовсные функции Sleep и т.п. не умеют делать задержку даже на 1мс, только на 10-12мс минимум, и то примерно. Т.к. виндовс не является ОСРВ.
¤
Не знаю какую версию вы смотрите, но в последней доступной версии я исправил функцию UINT CMotherBoard::TimerThreadFunc()
Косяк, который отмечен в комментарии теперь остался как комментарий к закомментированной старой функции. На будущее, чтоб я не забыл и через несколько лет потом снова не возвращался к неудачному варианту.
Почему было плохо? А потому, что там был простой цикл do while, где читался QueryPerformanceCounter и вычислялось условие выхода из цикла, что вызывало дикую загрузку процессора почти до 100%. Особенно на ХР.
¤
Какой таймер и какие параметры?
Таймер 50Гц по вектору 100 - напрямую зависит от частоты кадров экрана, а она старается вести себя независимо и пытается быть 50Гц. Если виндовс сильно занят, то проседает фреймрейт, и пропорционально ему проседает всё остальное - частота кадров, звук начинает запинаться, но вычислительного рассинхрона нет, просто БКшка начинает работать не в реальном времени а в пошаговом режиме. Выполнит фрейм и ждёт, когда виндовс освободит ресурсы, чтобы выполнить следующий фрейм и т.д.
¤
Встроенный ВЕ-таймер ведёт себя как на реальном проце. При изменении параметров работы таймера меняет поведение в соответствии с документацией. Т.к. он напрямую зависит от ТЧ, то при её изменении скорость таймера тоже меняется. TMRclk=CPUclk / 128.
Ничего не перезапускается, всё работает по жёстко заданному алгоритму. Если я правильно понял вопрос.
-
? Дмитрий - 15.11.2017 16:21
>> не умеют делать задержку даже на 1мс
В курсе. Поэтому использую sleep в крайнем случае, когда нужна просто задержка, не критичная по времени исполнения. Но sleep использовать необязательно. Можно запустить обработку диспетчера сообщений как в CMotherBoard::StopTimerThread, чтоб обрабатывал очередь, а после обработки одного события отслеживать величину задержки - так и GUI не будет подвисать во время цикла.
¤
По вектору 100 я в курсе. Про встроенный конечно. Имелось в виду, что я настроил и запустил счет, допустим, с делителем скорости 4, а через некоторое время изменил делитель на 16, не меняя другие параметры и не останавливая счет. Встроенный таймер при этом продолжит считать с новым делителем или сначала перезапустится, перезагрузив счетчик?
¤
Кстати, в эмуле неплохо было бы сделать возможность в режиме паузы проца напрямую загрузить/сохранить участок памяти из/в файл(а), чтоб не пихать его в образ, потом грузить и т.д. Экпериментировал тут как-то с алгоритмом и задолбался копировать файл в образ, чтоб потом его загрузить в отладчике. Напрямую писать и читать память эмулируемой машины было бы гораздо удобнее.
-
? gid - 15.11.2017 19:02
[Можно запустить обработку диспетчера сообщений]
Что-то такое мне в голову не приходило. Я знаю что сама идея обрабатывать элементы гуя в простом потоке, как у меня сделано, а не в специальном UI-thread, порочна. Но нормальных примеров, как сделать по-нормальному в интернете я не нашёл. Поэтому в борьбе с дедлоками я понаделал столько локов и флагов. Когда-нибудь надо будет снова всё переделать.
¤
[Встроенный таймер при этом продолжит считать]
мгновенно с новым делителем или начнёт сначала, зависит от режима работы, ровно так же, как и воплощённый в железе.
¤
[в эмуле неплохо было бы сделать возможность в режиме паузы проца напрямую загрузить/сохранить участок памяти из/в файл(а)]
Я тоже думал об этом, и не только я, технически это сделать совсем не трудно. Трудно будет, если надо будет загружать/сохранять данные из страниц БК11, которые в данный момент не подключены.
У меня тогда не было кросс ассемблера, поэтому смысла утруждаться я в этом не видел. Теперь есть, но уже целый год не притрагиваюсь к эмулятору. Нет времени и желания что-то делать урывками впопыхах.
-
? Дмитрий - 15.11.2017 21:40
>> в последней доступной версии я исправил функцию UINT CMotherBoard::TimerThreadFunc()
А что, кстати, было переписано в ней в 3.9? Я разбирался с 3.8, сегодня качнул сырцы 3.9, глянул эту функцию и не увидел изменений.
¤
>> Трудно будет, если надо будет загружать/сохранять данные из страниц БК11, которые в данный момент не подключены.
А что сложного? Память в эмуле линейная, единым массивом - вычислить смещение по номеру страницы, подключена или нет - значения не имеет. Главное загрузить в нужную страницу, а потом после старта программно переключать страницы и юзать загруженное. Либо в окне просмотра страниц памяти СМК/БК11 сделать кнопку загрузить/сохранить, указать адрес смещения от начала страницы и длину, и читать/писать в файл.
¤
>> зависит от режима работы, ровно так же, как и воплощённый в железе
Так вот и интересовал этот момент - как в железе реализовано? Перезапускается ли таймер при смене делителя или продолжает работать с новым делителем. :)
¤
>> У меня тогда не было кросс ассемблера
асм я себе тоже уже сделал (заодно и стандартного ВМ1), с покером и профурсетками - без него никуда, надо же как-то проверять работу команд FPU и префиксов. Не писать же вручную. Все реализации работают нормально. Щас надо выяснить макс. возможную частоту работы симуляции команд, чуток полирнуть и можно приступить к таймерам. Асмы БК забыл напрочь - полчаса вспоминал клавиши управления и команды входа в редактор/выхода/компиляции и чтения/записи.
-
? gid - 16.11.2017 10:33
[А что, кстати, было переписано в ней в 3.9?]
Раньше было можно через условную компиляцию использовать два варианта - или QueryPerformanceCounter, или WaitableTimer.
А сейчас, если аппаратное обеспечение поддерживает QueryPerformanceCounter, то используется он для задания задержек для WaitableTimerа, если не поддерживает - то для WaitableTimerа используется константная задержка, как было раньше.
¤
[А что сложного?]
Чуть не так. Там надо выводить диалог, для БК10 и БК11 разный, где можно изменить номера подключенных страниц сейчас (для БК10 неактивно), выбрать файл, взять адрес загрузки из бин заголовка, если он есть у файла или задать свой адрес загрузки, проверить размер файла, помещается ли он в ОЗУ БК с задаваемого адреса и если всё ОК - применить загрузку. Если файл не помещается - можно обрезать и всё равно применить загрузку.
Сохранение файла - тоже свой диалог, с выбором страниц (для БК10 неактивно), выбором начального адрес, заданием длины или конечного адреса (на выбор, если задаётся длина - конечный адрес корректируется, если задаётся конечный адрес - корректируется длина, чтобы всегда можно было выбрать размер одним из двух способов), выбором имени файла и формата - bin или raw.
Как быть с памятью СМК я ничего путного придумать не могу.
¤
[Либо в окне просмотра страниц памяти СМК/БК11]
Мне не нравится сама реализация этого окна, я его реализовал очень не рациональным образом. Его сперва надо переписать по-нормальному, потом навешивать любых кнопочек туда можно будет.
¤
[Так вот и интересовал этот момент - как в железе реализовано?]
Описание - комментарий к функции void CCPU::Timerprocess(). Вот так и реализовано. При смене делителя счётчик не инициализируется и продолжает уменьшаться с новым делителем. Под сменой делителя понимается изменение только битов 5 и 6, остальные биты не изменяются.
-
? Дмитрий - 16.11.2017 14:21
Чет я уже мозг сломал - никак не допру как вычислить задержку между фреймами в зависимости от частоты проца, фреймрейта и пр. В исходниках, видимо, приблизительная константа, ибо
¤
//liDueTime.QuadPart = -10000000LL / CPU_FRAMERATE;
liDueTime.QuadPart = -9000000LL / CPU_FRAMERATE; //вот такая пока фигня будет - полное игнорирование реальности.
¤
Чем не устроило число -10 млн (не понял - оно завязано на 3 или 4Мгц или взято с потолка, лишь бы примерно соответствовать скорости) и было заменено на -9 млн?
-
? gid - 16.11.2017 15:39
Когда ставишь -10000000LL (ровно одна секунда) появляются микроразрывы между воспроизведениями звуковых буферов. И звук получается грязный и попёрдывающий.
¤
Это связано с тем, что на самом деле в эмуляторе синхронизация в реальном времени происходит через воспроизведение звука - единственное место в виндовсе, где можно как-то привязаться к реальному времени.
А этот фрейм - привязка UI к реальному ходу времени (Тут в отличии от звука можно делать примерно, а не точно - инерционность зрения и психовосприятия окружающей обстановки - мозг сам подстроится и скорректирует картинку со звуком). Поэтому там задержка должна быть чуть меньше, чтобы всё шло гладко.
На самом деле, здесь можно вообще убрать и задержку и таймеры. И всё будет работать как ни в чём не бывало. Но только до момента, когда в системе есть устройство воспроизведения звука. Как только убрать все звуковухи, всё начнёт скакать с максимально возможной скоростью, без задержек. Поэтому и стоят в этом цикле и задержки и таймеры.
¤
Кстати, что мешает поэкспериментировать? задать интересующее значение и пересобрать эмулятор, многие вопросы могут отпасть сразу.
-
? Дмитрий - 16.11.2017 16:45
>> Кстати, что мешает поэкспериментировать? задать интересующее значение и пересобрать эмулятор, многие вопросы могут отпасть сразу.
Мешает полное незнание VS и экспериментирование не совсем то, что надо. Частота может меняться, а под каждое изменение подгонять константу - не комильфо.
¤
К тому же во фрейм не обязательно каждый раз одинаковое число тактов уложится. Значит надо учитывать это "переполнение". К примеру частота 50Мгц. 50 млн тактов в секунду. Фрейм 40мс, 25 фреймов/сек. Получается во фрейм надо "уложить" 2 млн тактов в идеале. Но так может быть не всегда (а то и вообще редко). А будет, к примеру, 2000012 тактов. Хотя этими 12 тактами можно пренебречь. И вот как теперь вычислить задержку для SetWaitableTimer, если на одном компе этот фрейм выполнится за одно время, на другом - за другое, а на третьем - за третье? Упрощенно:
¤
LARGE_INTEGER Freq,Start,End;
¤
QueryPerformanceFrequency(&Freq);
QueryPerformanceCounter(&Start);
ExecuteFrame();
QueryPerformanceCounter(&End);
¤
// время выполнения текущего ExecuteFrame в секундах
double time = (End - Start) / Freq;
// в 100 наносекундных интервалах (в "формате" SetWaitableTimer) это будет
time *= 1E7;
¤
это универсально, для любой машины. И как теперь узнать - сколько таких интервалов будет для моих 50МГц? Тут мысль стремительно ускользает. А в итоге: полученное значение минус time и будет задержкой для SetWaitableTimer.
-
? Дмитрий - 16.11.2017 18:58
Переврал все что можно. Оказалось решение легче и проще. Пример тот же - частота 50МГц, фрейм 40мс, 25 фреймов/сек, 2 млн. тактов на фрейм. Итого: время выполнения 2 млн тактов на симулируемом проце 2.000.000/50.000.000 секунд. Переводим это число в 100нс интервал. А теперь запускаем таймер с этим интервалом ДО выполнения фрейма и прочего. Что получаем: пока таймер тикает - выполняем ExecuteFrame, выполняем вывод на экран видеоОЗУ, вывод признаков, регистров, звуковых буферов и т.д. и т.п. В конце этого просто через WaitForSingleObject ждем оставшееся время до завершения таймера. Получаем приблизительно точную частоту исполнения команд.
-
? gid - 16.11.2017 21:28
Я подошёл к задаче с другой стороны, в общем так же как и в посте [ Дмитрий - 16.11.2017 18:58 ]. Время разделил на фреймы по 40мс. Константа. Я предположил, что число эмулируемых тактов ВМ1, укладывающееся во фрейм априори выполняется на современных компах быстрее, гораздо быстрее, чем 40мс, поэтому WaitableTimer у меня используется как замедлитель.
1.Запускаешь таймер
2.выполняешь вычисления фрейма
3.ждёшь пока таймер не отсчитает свои 40мс, или не ждёшь, если вычисления фрейма затянулись и таймер уже своё отсчитал.
4.идёшь к пункту 1.
Кстати, если число выполненных тактов превысило число расчётных тактов, то ими я не пренебрегаю, а переношу в следующий фрейм. Т.е. если текущий фрейм оказался длиннее расчётного на 12 тактов, то следующий должен быть короче на 12 тактов, т.о. у меня постоянно сколько-то тактов переносится в следующий фрейм.
¤
При этом экспериментально выяснилось, что максимальная эмулируемая частота ВМ1 может быть 20МГц. На большее просто не хватает вычислительных возможностей, Вычисления длятся больше, чем 40мс и не укладываются во фрейм.
Нужно менять алгоритмы. Вводить многопоточность, чтобы потоки работали независимо, синхронизируясь между собой. При этом люди с двух и одноядерными процами окажутся в пролёте из-за сильно упавшей у них производительностью.
А все мои эксперименты с многопоточностью приводили к тому, что многопоточная прога начинала работать заметно медленнее однопоточной из-за многократного переключения контекстов потоков для доступа к расшаренным данным, на которые тратилось 90% всего процессорного времени.
В общем не осилил я пока нормальные высокопроизводительные вычисления.
-
? Дмитрий - 16.11.2017 22:47
>> а переношу в следующий фрейм
Абсолютно верно. Про этот момент я забыл.
¤
>> На большее просто не хватает вычислительных возможностей
Тогда мб сделать так - все, что надо вывести и что требует достаточно времени, засунуть в свой отдельный поток, который запускать после выполнения фрейма (основной поток идет дальше, не отвлекаясь), а после завершения всех операций останавливается автоматически. Туда сунуть вывод видеоОЗУ, регистров, признаков и прочего. Или подобное уже опробовано и не принесло результатов?
¤
>> максимальная эмулируемая частота ВМ1 может быть 20МГц
Это с реальными таймингами команд ВМ1 или это независимо от таймингов? Если тайминги не влияют, то надо всю эмуляцию команд переписывать на асм.
¤
В общем неутешительно это. Хотя эмуляторы сонек, ARMов существуют и быстродействие там повыше будет, чем БК. Значит возможно как-то уложить быстродействие.
-
? Alexander Tishin@ - 17.11.2017 07:14
20 МГц -- очень мало. У вас там что-то нереальное делается на каждую команду процессора.
¤
Синхронизацию правильно делать так:
¤
считаем кадр
QueryPerformanceCounter()
смотрим, сколько времени осталось до вывода этого кадра, Sleep()
выводим
¤
Ну а если есть звук, то да, за звук проще всего. И правильней, кстати. Но есть одно но :)
Скорость вывода звука на самом деле скачет, потому что он выводится блоками а не потоком, так звуковая подсистема во всех современных ОС устроена. Этот момент надо учитывать, иначе производительность тоже будет скакать, и получится рваная анимация.
-
? Дмитрий - 17.11.2017 09:42
>> что-то нереальное делается на каждую команду процессора
Выборка кода команды, декодирование методов адресации, выборка из памяти (если требуется), исполнение, установка признаков, запись в память (если требуется). Ничего лишнего, что необходимо, то и выполняется. Если ускорять, то только переписывать на чистый асм. И то не факт, что сильно ускорится.
¤
>> смотрим, сколько времени осталось до вывода этого кадра, Sleep()
Такой способ имеет большую погрешность и сильно плавает. К тому же в момент паузы нужно отдавать кванты времени ОС, а не тупо грузить поток. Вот интересная статья на тему задержек https://habrahabr.ru/post/75234/
-
? Дмитрий - 17.11.2017 09:58
Ну и насчет QueryPerformanceCounter - http://www.virtualdub.org/blog/pivot/entry.php?id=106
-
? gid - 17.11.2017 12:00
[Это с реальными таймингами команд ВМ1 или это независимо от таймингов?]
Никаких реальных таймингов нет. Примерные тайминги: для БК10 - Зальцмана. для БК11 - то, что натестировалось на 4МГц.
Это не только CPU, это ещё и всё, что выполняется в ExecuteFrame();
Обработка звука - пищалка, ковокс, AY, захват звука с линии. (всё кроме захвата - отключается)
В пищалке - эмуляция заряда/разряда конденсатора, чтобы звук пищалки был как у настоящей БКшки (не отключается, т.к. нужна привязка к реальному времени)
+ у всех звуковых устройств постоянно заполняются буферы фильтров БПФ, даже если фильтр выключен, чтобы при включении не было щелчков.
Эмуляция хода луча ЭЛТ, и затухания люминофора (отключается).
Эмуляция вращения дисковода (отключается).
Вычислений - овердохрена, эмуляция инструкций - это мелочь. Поэтому и 20МГц, дальше - фрейм становится длиньше 40мс.
¤
[Скорость вывода звука на самом деле скачет, потому что он выводится блоками]
Это смотря как программировать. Хоть звук и выводится блоками, но пока не отзвучит один блок за строго определённое время и не появится хоть один свободный блок, следующий блок передать звуковухе нельзя, приходится ждать, и вот эти-то ожидания и дают чёткую синхронизацию с реальным временем. Скачок происходит в самом начале, когда буферы только заполняются, но этого никто не замечает. А звук у меня выводится всегда, когда ничего не звучит, на звуковуху отправляется тишина.
¤
[Если ускорять, то только переписывать на чистый асм.]
не поможет. Даже замедлит, компилятор оптимизирует лучше, чем например я пишу на асме. Мой код получается медленнее кода, сгенерированного оптимизирующим компилятором.
-
? Дмитрий - 17.11.2017 12:02
БКшный проц реально медленный. Провел эксперимент на "своих" таймингах:
¤
базовый 12 тактов, адресации (пока от балды):
Rn = 0 тактов
(Rn) = 1 такт
(Rn)+ = 1 такт
@(Rn)+ = 2 такта
-(Rn) = 1 такт
@-(Rn) = 2 такта
E(Rn) = 3 такта
@E(Rn) = 4 такта
SOB = 20 тактов (как на ВМ1), остальное не использовалось.
¤
Реализация (пока взят класс CPU, добавлена поддержка 32-битных инструкций) на паскале кода эмулятора gid'а. В итоге 2 млн. инструкций (взят 32 битный алгоритм вычисления таблицы по полиному для подсчета CRC32 и зациклен с изменением полинома на каждом шаге) исполняются на частоте проца "хоста" (рабочий комп старый, i3-3220 3,3ГГц) от 14 до 27 мс. Дома проверю на скае i5-6500.
¤
Попробую взять тайминги БК из эмуля и еще раз запущу.
-
? Дмитрий - 17.11.2017 13:07
С таймингами БК11 2 млн тактов исполняются за 18 мс. И получается все остальное исполняется за 22+ мс. Действительно,
¤
>> эмуляция инструкций - это мелочь
-
? Дмитрий - 25.11.2017 14:33
Кстати, если задержки в драйвере флопа важны, то почему тот же СМК отлично работает и на 10-ке, и на 11? Задержки не меняются, а частота 11-й увеличена на треть относительно 10-ки. С точки зрения задержек это очень много, однако все работает без проблем. Но если глянуть в расчетные тайминги, то получается полный пушной зверек. Число тактов одной и той же команды у 10-ки и 11-й различается! Причем число тактов команды 11-й больше, чем у 10-ки. Как такое может быть? Проц-то один и тот же, только у 11-й частота выше на 1Мгц. Т.е. задержки должный быть равны в таблицах 10 и 11.
-
? gid - 27.11.2017 13:02
А мы про какие задержки говорим? ПЗУ, в котором драйвер, что на 10ке, что на 11ке одно и то же, и работает с одной и той же скоростью, чтение опкодов из ПЗУ происходит одинаково медленно, что на 3МГц, что на 4 МГц. Собственно чтение/запись дискеты делается синхронно, по биту готовности, так что и тут от частоты не зависим.
Как мне кажется, разработчики драйвера приняли за аксиому, что частота процессора никогда не может быть выше 5МГц, ну 5.5 максимум, поэтому сделали в драйвере ряд упрощений.
Я вижу там несколько моментов:
1. позиционирование с дорожки на дорожку. Там задержка на реакцию дисковода задана константой. И если будет частота проца сильно большая, то команды перехода будут подаваться слишком быстро, и дисковод не будет успевать спозиционироваться куда нужно.
2. INDEX: П/п проверки диска и числа оборотов. Там тоже счётчик циклов. При большой частоте может быть нарушена логика работы и драйвер будет считать, что диска нет или он не крутится.
3. FINDH: П/п поиска адресного маркера - там вообще ошибка, делается чтение 15 слов данных без готовности данных, т.е. - простой цикл. И на малой частоте это работает, на большой - вряд ли будет.
4. STREAD: П/п запуска чтения и т.п. управление дисководом - установка и сброс битов делается через задержку. На большой частоте дисковод перестанет успевать реагировать на команды должным образом.
Всё это станет критично, если с повышением частоты проца будет соответственно увеличено и быстродействие памяти, в которой находится драйвер. Если по-прежнему использовать тормознутые ОЗУ/ПЗУ, то всё скорее всего продолжит работать даже при частоте проца 100МГц.
Число тактов команды 11-й больше, чем у 10-ки потому, что ОЗУ тормознутое. Чем выше частота, тем больше тактов проца расходуется вхолостую в ожидании, когда же ОЗУ соизволит предоставить процу доступ к себе, чтобы проц что-нибудь прочитал/записал оттуда. Всё логично. на 6МГц на выполнение команды затрачивается ещё больше тактов. Причем не в 2 раза больше, чем на 3МГц как ожидалось, а ещё больше.
При повышении частоты процессора, быстродействие повышается, но не настолько, как могло бы, если бы не ОЗУ.
-
? Alexander Tishin@ - 27.11.2017 20:36
1) Константа времени позиционирования по умолчанию страшно большая, и настроена под древнее железо вроде 6022. Для 53xx мы её прямо вправкой начального загрузчика ускоряли в несколько раз -- и работало быстрее, и дисковод переставал жужжать.
2) Хардкод под быстродействие железа. И что?
3) Это НЕ ошибка. Это компенсация особенностей системы захвата фазы сигнала в контроллере дисковода. Так надо, иначе работать не будет.
4) См. 2.
-
? gid - 28.11.2017 09:39
Хорошо. Признаю, был не прав.
Задержки в драйвере с помощью магических констант не важны. Драйвер одинаково ровно будет работать хоть на 20МГц, хоть на 100МГц.
и код:
FINDH: MOV #15., R0
1$: TST (R5) ; Вхолостую прочитаем
SOB R0, 1$ ; 15. слов
тоже не ошибка, а просто неверный комментарий. Тут не 15 слов читается, а просто эвристически подобранная задержка в мс, зависящая от быстродействия команды tst (r5) и магического числа 15., чтобы подгадать чтоб диск прокрутился от заданной точки до области адресного маркера.
Потому что везде правильное чтение данных делается так:
1$: TSTB (R4) ; Ждем готовности
BPL 1$
MOV (R5), R1 ;получаем данные
Чтобы гарантировано прочитать новые данные, а не одно и то же подряд несколько раз.
-
? Дмитрий - 28.11.2017 11:33
>> ПЗУ, в котором драйвер, что на 10ке, что на 11ке одно и то же, и работает с одной и той же скоростью
Вот про этот момент я забыл за давностью лет. Помню, говорилось где-то, что код в ПЗУ работает быстрее, чем в ОЗУ. А вот про то, что ОЗУ 11-й тормознее - не знал.
¤
>> Число тактов команды 11-й больше, чем у 10-ки потому, что ОЗУ тормознутое.
А вот тут сразу возникает вопрос: если драйвер в ПЗУ, проц один и тот же (внутри проца, на железном уровне, скорость выполнения в тактах одна и та же), то почему скорость выполнения одинаковая, раз команда, допустим SOB, будет выполняться чуть быстрее на частоте 4Мгц супротив 3Мгц??? 4 млн тактов в секунду против 3-х. У нас ведь условия одинаковые, кроме частоты! И разгон подразумевает увеличение скорости выполнения команд и, следовательно, увеличение производительности. Пусть в случае ВМ1 она мизерная.
¤
>> делается чтение 15 слов данных без готовности данных
Меня тоже смутил данный код - тупо читаем регистр без сохранения. Для чего? И почему именно 15, а не 16, 12, 22?
¤
>> Я вижу там несколько моментов:
¤
Интересно было бы узнать оптимальные задержки флопа в миллисекундах - индекса, перехода с дорожки на дорожку, адр. маркера и прочего. Ведь на большой частоте проца проще будет реализовать sleep и юзать его (он будет независим от частоты).
¤
>> Всё это станет критично, если с повышением частоты проца будет соответственно увеличено и быстродействие памяти, в которой находится драйвер.
Вот тут у меня тоже затык. Тупо увеличить задержки кратно с повышением частоты мб и прокатит, но и прочие команды тоже будут работать быстрее. С винтом все ясно - если мне склероз не изменяет, то там проверка готовности по биту, а не задержка. Отсюда вопрос: а почему у FDD не сделать проверку по битам? Изменить чуток логику работы эмулятора FDD и сделать выставление бита готовности после операций. Дали команду перехода на дорожку - ждем бита готовности. Проверка диска тоже битом (у нас же эмуль работает не с реальным железом, а с его эмулятором). Это было бы критично, если бы в системе стоял реальный флоп и эмуль пробрасывал бы команды к нему. А раз у нас эмулятор всего: дали команду включения движка - выставили бит (можно из числа неиспользуемых), отключили движок - бит сбросили. Я хотел именно так сделать. Но как быть с адресным маркером? Ведь команды его поиска нет. Либо также бит сделать - в эмуле эмулируется оборот диска. Вот и выставить бит когда маркер "под головкой" и сбрасывать, когда маркер "ушел". Тогда драйвер будет ловить бит и идти дальше безо всяких задержек.
-
? Дмитрий - 28.11.2017 11:36
>> Изменить чуток логику работы эмулятора FDD
Это на будущее - все равно уже новых БК не будет в железе, остаются эмуляторы.
-
? gid - 28.11.2017 13:17
[А вот про то, что ОЗУ 11-й тормознее - не знал.]
Оно не тормознее. Оно такое же. Просто процессор быстрее на 1МГц, и соответственно тормознутая скорость работы ОЗУ становится ещё заметнее.
¤
[то почему скорость выполнения одинаковая]
Вообще-то не одинаковая. Я немного неточно выразился. Разница в скорости на 3 и на 4МГц хоть и есть, и даже на глаз заметна, но для работы драйвера несущественна, вот в этом смысле одинаковая и вот поэтому СМК отлично работает и на 10-ке, и на 11. Он и на 6Мгц вполне работоспособен. А так, да, чем выше частота, тем меньше времени на выполнение команды и дальше мы просто упрёмся в быстродействие ПЗУ. Ведь перед выполнением команды, её сперва надо прочитать из ПЗУ. Сколько раз выполнить, столько раз и прочитать. Кеша команд у ВМ1 нету.
¤
[Для чего? И почему именно 15]
В посте от 28.11.2017 09:39 я сделал предположение для чего.
¤
[почему у FDD не сделать проверку по битам?]
потому что битов не хватит. Нужно вводить команды как у HDD. и в результате получится тот же HDD.
[Дали команду перехода на дорожку - ждем бита готовности]
В HDD именно так. много разных команд.
[Но как быть с адресным маркером? Ведь команды его поиска нет.]
Как в HDD - перебросить эти заботы на аппаратную часть.
Хотите эмулировать - берите код эмулятора HDD и сделайте там аппаратные ограничения - только 2 стороны и только 80 цилиндров. И количество секторов как-то можно ограничить в разумных пределах. Вот и получится продвинутый флоп. Но с ВП1-128 он уже не будет иметь ничего общего.
-
? Дмитрий - 28.11.2017 13:55
>> я сделал предположение для чего
Это предположение - точного объяснения, видимо, уже нет надежды узнать.
¤
>> потому что битов не хватит.
Почему? Нам нужно, по идее, избавиться от задержек. Полностью свободных битов в 177130 по чтению и записи - 4 (бит 3 и 11-13). Идем по списку в gid - 27.11.2017 13:02:
¤
>> 1. позиционирование с дорожки на дорожку.
Дали команду ШАГ и ждем бит 7 в цикле. Шаг выполнен, идем дальше. Задержка не нужна.
¤
>> 2. INDEX: П/п проверки диска и числа оборотов.
Дисководов у нас всего 2 (да и 2 много, достаточно 1, есть же винт). Значит берем бит 4, ставим в 1 (включаем движок), читаем бит 4 - если равен 1, то вращается, 0 - не включен двигатель. Задержка не нужна.
¤
>> 3. FINDH: П/п поиска адресного маркера
Вот тут покумекать, ибо команды, как таковой, нет.
¤
>> 4. STREAD: П/п запуска чтения и т.п. управление дисководом
В самой STREAD короткий цикл также заменить на TSTB (R4)+BPL. Установили бит ЧТЕНИЕ, ждем ответа контроллера, снимаем бит, идем дальше. Задержка не нужна. С записью точно также.
¤
С индексом надо подумать как избавится от задержки. В итоге пока(!) ни один доп. бит не использован.
¤
>> Но с ВП1-128 он уже не будет иметь ничего общего
К сожалению с ВП-128 вообще ничего больше не будет иметь общего. Все это умерло. И флопы умерли и не выпускаются более. С большим объемом памяти и быстрым процом проще программно сэмулировать флоп из образа на винте прямо в эмуляторе/симуляторе.
¤
Все-таки есть где-нить задержки флопов в миллисекундах? Если нет, то как рассчитать? По циклам SOB будет примерно (хм, а надо ли точнее?). Я сам на своем TEAC в давние времена уменьшал задержки до минимума, пока не начинали сыпаться ошибки чтения/записи/форматирования, чуть увеличивал для надежности и использовал.
-
? Дмитрий - 28.11.2017 13:57
>> берем бит 4, ставим в 1 (включаем движок), читаем бит 4 - если равен 1, то вращается, 0 - не включен двигатель.
Тьфу, ставим бит 4, ждем бит 7, проверяем бит 4.
-
? Дмитрий - 05.01.2018 17:30
Наткнулся на использование системных регистров 177700-177704. Есть инициализация начальных значений, но нет использования. Для чего эти регистры?
-
? Дмитрий - 07.01.2018 17:08
Непонятка возникла с CCPU::SetSysRegs: там видим, что m_pSysRegs[n] = (m_pSysRegs[n] & ~m_pSysRegsMask[n]) | (value & m_pSysRegsMask[n]). Маска для m_pSysRegsMask[SYS_REG_177710] = 0. Допустим, для 177710 старое значение m_pSysRegs[n] = 100000. Получается непонятно что пишем - вроде хотим MOV #177777,@#177710 из программы, но получается NOP, ибо (100000 & ~0) = 100000 (не меняется), а (value & m_pSysRegsMask[n]) соответственно (177777 & 0) = 0. В итоге 100000 | 0 = 100000. А мы писали 177777. Для чего эти маски для 177700..177712? Не проще было проверить адреса и для 177706 и 177710 выполнить запись слова, а для 177712 - байта, отказавшись от ненужных масок? И для чего инициализировать в m_pSysRegs[SYS_REG_177712] = 0177400 старший байт единицами, если нужен только младший? Правильнее m_pSysRegs[SYS_REG_177712] = 0.
-
? Дмитрий - 07.01.2018 17:16
Пропустил главное: 177710 -- Реверсивный счётчик. Доступен по чтению, запись в регистр игнорируется.
Но назначение регистров 177700-177704 не понятно.
-
? gid - 09.01.2018 10:56
[Наткнулся на использование системных регистров 177700-177704. Есть инициализация начальных значений, но нет использования.]
Для этих регистров эмулируется только их наличие. Поведение не эмулируется в связи со сложностями и ненужностью в повседневной жизни.
[Для чего эти регистры?]
Максимально достоверное описание можно найти в этом файле http://u.zeptobars.ru/yuot/MISC/1801vm1-10.pdf (стр.25)
Время от времени ревизия файла меняется, так что если ссылка сдохнет, надо зайти в директорию и выбрать файл вручную.
-
? Дмитрий - 14.03.2018 00:35
Возник вопрос в плане быстродействия реализации команд. Не быстрее будет признаки не сразу записывать в переменную через логические команды, а хранить булевы переменные под них, Т-разряд и прочее? А слово PSW формировать непосредственно в реализации MFPS. Ведь во время эмуляции команд каждая работает с признаками, а MFPS может быть вообще не вызвана.
-
? gid - 14.03.2018 10:14
Можно попробовать, но думаю, всё преимущество будет нивелировано функцией вывода содержимого PSW на экран. Оно там несколько раз в секунду опрашивается (зависит от настроек). Слово PSW используется далеко не только в MFPS/MTPS.
-
? BD - 14.03.2018 11:40
офф 2gid, эмуляции регистров ИРПС от Вас ждать не приходится? ))
-
? gid - 14.03.2018 12:26
пока нет. Не выходит каменный цветок. Сами по себе, как отдельные наработки есть, но в эмулятор не прицепляется, т.к. структурно несовместимо, потому как не для него делалось.
-
? Дмитрий - 14.03.2018 13:13
>> функцией вывода содержимого PSW на экран
В принципе верно, но можно же сделать и вытаскивание состояния признаков не с PSW, а тоже с проверки булевых переменных для вывода? Тогда PSW как член класса будет не нужна вовсе, а формирование PSW будет сразу в FALU.
¤
2 BD: Возник вопрос - вот сделан в эмуляторе регистр 177560 (и сопутствующие) - а куда попадающие в него данные будут улетать из эмулятора? Нужен же виртуальный СОМ-порт, куда будут отправляться данные, а софтина на РС будет из этого порта их читать.
-
? BD - 14.03.2018 13:28
"структурно несовместимо".. там надо-то регистры 177560-177564 (176560-176564) направлять/читать на COM-порт и IRQ по 360 обрабатывать отдельным процессом )) это не займет много времени, в сравнении с отрисовкой экрана или эмуляцией 177130, да еще с СМК ))
-
? BD - 14.03.2018 13:32
Дмитрий, они будут попадать сюда, прям через wifi
http://bk0010.org/forum/?id=28579
-
? Дмитрий - 14.03.2018 13:49
>> они будут попадать сюда, прям через wifi
А если без этой штуки? Так сказать для других целей?
-
? BD - 14.03.2018 14:17
Какие "для других целей"? У БК нет встроенного последовательного порта, в отличии от ДВК и прочих. Он реализуется подключением блочка ИРПС на 1801ВП1-035 (или 1801вп1-065, что недостижимо было по тем временам, а теперь и не надо).
-
? BD - 14.03.2018 14:24
..а эмуляция нужна для написания броузера, хотя бы текстового, с загрузкой файлов больших (.dsk) на БК10...
-
? Дмитрий - 14.03.2018 14:38
>> Какие "для других целей"?
Ну, к примеру, как эхо-теминальчик на РС - сохранить всю текстовую информацию, выводимую на экран.
-
? BD - 14.03.2018 14:59
Я, и S_V_B, тебя прям сейчас убили бы за "эхо-теминальчик" ))
http://forum.pk-fpga.ru/viewtopic.php?f=15&t=5606
все уже грузится давно в БК на скорости 57600 бод
-
? Дмитрий - 14.03.2018 17:14
Чё сразу убивать? :) Я про эмулятор говорю, а не про железку - железка меня не интересует.
-
? Дмитрий - 14.03.2018 17:15
Да и терминальчик - так, в голову первое что взбрело...
-
? Дмитрий - 14.03.2018 18:01
Еще непонятка.
¤
if (bInterruptMode) // HALT mode interrupt
{
m_bTwiceHangup = (bCanTwiceHangup && nInterruptVector == 2);
m_pChip->SetWord(0177676, m_RON[R_PSW]); //вот это-то и вызывает прерывание по вектору 4
m_pChip->SetWord(0177674, m_RON[R_PC]);
m_bTwiceHangup = false;
nInterruptVector += 0160000; //Таки да, у 1801ВМ1 действительно тут константа 0160000
m_RON[R_PC] = GetWord(nInterruptVector);
m_RON[R_PSW] = (GetWord(nInterruptVector + 2) & 07777) | PSW_HALT;
}
¤
Для чего nInterruptVector увеличивается на 160000? В m_RON[R_PC] и m_RON[R_PSW] считается хрень - не с адреса вектора прерывания, а с ПЗУ FDD. Или в БК этот кусок никогда не будет выполняться? Тогда непонятно зачем он тут.
-
? gid - 14.03.2018 20:31
[там надо-то регистры 177560-177564 (176560-176564) направлять/читать на COM-порт]
Пример, как это сделать - в студию!
Я не умею вообще никак, сделайте хотя бы плохой, кривой, но примерно работающий пример. И увидите его реализацию в эмуляторе.
¤
[Для чего nInterruptVector увеличивается на 160000]
Этот код не совсем достоверный. Там просто сделано чтобы примерно как надо работало, там надо всё заново переписать, в соответствии с документацией, тем более, что пультовый бит 3 в 177716 у меня вообще не эмулируется.
Внимательно читаем в документе http://u.zeptobars.ru/yuot/MISC/1801vm1-10.pdf параграф 7.1 со стр.55, особенно - таблицу прерываний со стр.60
С адреса 160000 располагается пультовое адресное пространство. С адреса 160002 располагается три пультовых вектора пультовых прерываний. Там же описано в каких ситуациях происходит пультовое прерывание, а в каких - обычное.
¤
[Или в БК этот кусок никогда не будет выполняться?]
Штатно - сделано всё возможное, чтобы пультовая часть схемотехники на БК не была задействована. Но нет ничего невозможного, что доказывает HALT-режим контроллеров АльтПро.
Там кроме пультовых адресов векторов есть ещё и пультовый стек, с вершиной по адресу 177700. А поскольку на БК там (177674, 177676) нет ОЗУ, на БК никогда не сможет возникнуть пультовое прерывание, получается зависание шины и прерывание по вектору 4. до чтения адреса 160002...160014 просто дело не доходит.
¤
[Тогда непонятно зачем он тут.]
Для эмуляции HALT-режима контроллеров АльтПро. Но я это дело даже не отлаживал. Оно может вообще не работать.
-
? Alexander Tishin@ - 15.03.2018 17:27
Там всё просто. Для пульта достаточно сделать RPLY на 177674, 177676, и ловушку перехода на 160004 ЕМНИМС. Я делал буквально на проводках -- работало.
-
? Дмитрий - 16.03.2018 13:54
Насчет признаков в виде булевых переменных. При 3 млн. тактов/фрейм удалось сократить время выполнения фрейма на 3 мс (с 19 до 16 мс). Но Дельфя по сравнению с Сями тормознее. Вполне может статься, что на 3/4 МГц прирост будет мизерный, но Си может вытянуть оптимизацией. Позднее перепишу реализации команд ВМ1 на асм, посмотрим сколько там удастся выиграть.
-
? Дмитрий - 16.03.2018 21:20
Непонятка в выборке аргумента. Команда MOVB #1,R0. Константа 1 записана как word. По Get_Src_Arg мы получим в m_datarg = GetByte(m_nSrcAddr) эту единицу, а адрес PC увеличится на 1 в get_arg_addr. Но я не вижу где идет увеличение PC как адреса-источника еще на 1, чтобы сместиться на следующую команду?
-
? gid - 16.03.2018 22:27
в get_arg_addr надо смотреть вот это:
case 2: // (R0)+, #012345
arg = m_RON[reg];
¤
if (m_bSign && (reg < R_SP))
{
m_RON[reg] += 1;
}
else
{
m_RON[reg] += 2;
}
¤
break;
¤
Для типа адресации 2 регистры SP и PC увеличиваются всегда на 2, не зависимо от того, байтовая операция или нет.
-
? Alexander Tishin@ - 18.03.2018 10:37
И для 4 тоже.
-
? Дмитрий - 18.03.2018 16:54
И для 3 и 5 тоже.
-
? Дмитрий - 07.04.2018 16:17
Возникли пара вопросов по поводу потока CMotherBoard::TimerThreadFunc. Как лучше сделать, чтобы при паузе или завершении потока извне гарантированно завершился цикл эмуляции команды? Юзать флаги извне? Типа bool Terminated, Suspended. Или добавить лок и лочить в TranslateInstruction пока выполняется 1 команда. Либо забить на команду и ждать окончания выполнения ExecuteFrame - там лок уже есть. И можно ли внутри потока юзать Suspend/Terminate для паузы/остановки самого себя? Последнее пока проверить не могу, времени мало.
-
? gid - 07.04.2018 19:45
[Как лучше сделать, чтобы при паузе или завершении потока извне гарантированно завершился цикл эмуляции команды?]
Не знаю. Знал бы, давно по-нормальному сделал, а не как сейчас.
[И можно ли внутри потока юзать Suspend/Terminate для паузы/остановки самого себя?]
Не могу сейчас с уверенностью сказать, но я пробовал такое когда-то, но что-то не срослось, то ли всё-таки нельзя, то ли что-то не так работает. Вроде бы самотерминироваться можно, но самозасуспендиться нельзя. Проверить как на самом деле - лень. Даже загуглить для более правильного ответа лень.
-
? Дмитрий - 07.04.2018 23:34
Проверил. Работает. Сделал примерно так:
¤
enum Thread_Status
{
ts_Worked,
ts_Suspended,
ts_Terminated
};
¤
LockVarType LT;
Thread_Status TS;
HANDLE hThread; // дескриптор потока
...
¤
UINT TimerThreadFunc()
{
HANDLE CurThread;
Thread_Status Status;
¤
CurThread = GetCurrentThread();
// тут запускаем цикл выполнения
do
// сразу же проверяем выставленный статус потока
while (!LT.IsLocked()); // ждем, если в этот момент менятся статус
LT.Lock();
Status = TS;
LT.Unlock();
// проверяем, что делать с потоком
switch (Status)
{
case ts_Suspended:
SuspendThread(CurThread); // поток поставлен на паузу - паузим сами себя
break;
case ts_Terminated: return 0; // выходим, поток остановили
}
...
// далее выполняем поток как обычно
...
while ...;
}
¤
Создаем приостановленный поток, выставляем TS = ts_Worked, в нужном месте ResumeThread(hThread). Поток запустился. Если нужно запаузить/завершить рабочий поток:
¤
if TS = ts_Worked
{
while LT.IsLocked() // пока залочено - ждем
{
}
LT.Lock();
TS = ts_Suspended; // меняем статус (или ts_Terminated)
LT.UnLock();
}
¤
Если надо запустить приостановленный поток:
¤
if TS = ts_Suspended
{
TS = ts_Worked; // лочить не надо - поток неактивен
ResumeThread(hThread);
}
¤
Итого имеем: проверка и выполнение действий с потоком происходит в начале цикла, когда новая итерация цикла еще не начата, либо предыдущая гарантированно отработала.
¤
PS: Не знаю написал ли на Си правильно - по написанию я пока с ним на "мама мыла раму", а не на "о сколько нам ошибок трудных..."
-
? Дмитрий - 05.05.2018 15:43
Что-то я не волоку в параметрах видеосигнала. В БК при 256х256 на строку отводится 64 мкс. По стандарту там 52 мкс само изображение и 12 мкс на гашение для перехода на следующую строку. Итого 64 мкс * 256 строк = 16384 мкс на весь кадр. Кадр 20 мс. Обратный ход луча - 20000-16384=3616 мкс. В стандарте сказано, что 80% времени задействовано на вывод информации. В БК получается ~82%. Сходится. Это для 256х256. А для 512х256 тоже самое или нет?
¤
Далее. Если я правильно понял из стандарта, то у 640х480 горизонтальная частота 31,5кГц, т.е. за секунду в таком разрешении адаптер может выдать 31500 строк или 31500/60 = 525 на кадр. 1 строка выводится за 1/31500 = 31.75 мкс, 480 строк - за ~15238 мкс. Если взять пиксельную частоту у этого режима 25.175 Мгц, то 640х480 = 307200 пикселей и с такой частотой эти 307200 пикселей будут выведены за ~12203 мкс. Почему такая разница? По стандарту VESA кадр в этом режиме 16.7 мс.
-
? Alexander "Sandro" Tishin@ - 06.05.2018 13:41
1) Разница потому, что ноги растут от телевизионных стандартов 50 и 60 Герц.
2) Длина строки в режимах 512 и 256 пикселей совершенно одинаковая. Аппаратно это один и тот же режим, просто по-разному декодируется цвет.
-
? Дмитрий - 06.05.2018 14:31
>> 1) Разница потому, что ноги растут от телевизионных стандартов 50 и 60 Герц.
Стоп-стоп. Параметры 640х480 я взял именно 60Гц, стандарт VESA. И именно в пределах этого режима разные длительности кадра. Вычисленная длительность строки верная, а вот длительность кадра - нет. Почему так и причем тут 50 и 60Гц, если я взял именно 60Гц? Вносятся какие-то доп. задержки? Или 31.75 мкс - это длительность строки именно самого изображения, без учета гашений, бордеров и прочего?
¤
http://caxapa.ru/thumbs/361638/DMTv1r11.pdf стандарт, режим на 17 стр.
-
? Дмитрий - 07.05.2018 18:54
Вопрос про таймер, который 177706/10/12. У Зальцмана написано, что частота таймера совпадает с частотой проца. А в эмуле CCPU::Timerprocess вызывается каждый 128 такт. Примерный период, вычисленный на нескольких БК, у Зальцмана 42.9 мкс. В итоге с макс. множителем цикл получается 180 сек. Верны ли данные зальцмана?
-
? gid - 07.05.2018 22:13
Естественно верны, за исключением утверждения про частоту. А в эмуляторе - эквивалентная схема, которую я позаимствовал у Patrona, она не достоверно точная, но для такой эмуляции, какая у меня - подходит вполне. У Patrona есть и достоверно точный алгоритм, вплоть до эмуляции глюка с пропуском первого цикла счёта, но я никак не могу придумать, как мне прицепить его модель процессора к своему эмулятору, загвоздка как обычно оказалась в ВП1-037.
¤
К тому же, если приглядеться, как работает алгоритм, то можно увидеть, что при установке значений в биты 5 (делитель на 4), бит 6 (делитель на 16) получается такая штука
бит 6 бит 5
....0.....0 декремент счётчика происходит каждый 2-й такт
....0.....1 декремент счётчика происходит каждый 8-й такт
....1.....0 декремент счётчика происходит каждый 16-й такт
....1.....1 декремент счётчика происходит каждый 128-й такт
¤
Просто алгоритм построен так, что значения таймера аппроксимированы с шагом в 128 тактов, чтобы было быстрее, а не точнее.
-
? gid - 07.05.2018 22:15
ошибся.
....1.....0 декремент счётчика происходит каждый 32-й такт
-
? Дмитрий - 08.05.2018 01:22
>> чтобы было быстрее, а не точнее
Блин, весь эмулятор построен "лишь бы работало" :)
-
? gid - 08.05.2018 09:32
Во-во, блин. И самое поганое - никто не хочет написать нормальный эмулятор.
-
? Дмитрий - 08.05.2018 11:17
C 3/4 МГц нет особых проблем в задании тактовых задержек. А вот мне с моими 100 МГц выдерживать 10 нс на такт нет вообще никаких вариантов, кроме фреймового. И вообще, как народ писал эмули той же плойки на РС или эмули Ведроида - там же далеко за 100МГц частоты. И ведь работают как-то. А потактовой реализацией ВМ1 от Patron вообще мрак - я вижу текст, вроде написано (местами) понятно, но я нихрена не понимаю что там и как делается. Ощущаешь себя открывшим трактат на китайском языке.
-
? gid - 08.05.2018 14:19
В сообщении (gid - 07.05.2018) оказывается я написал полную чушь. Ни слова правды. На самом деле всё ровно наоборот.
Должно быть так:
бит 6 бит 5
....0.....0 декремент счётчика происходит каждый 128-й такт
....0.....1 декремент счётчика происходит каждый 2048-й такт
....1.....0 декремент счётчика происходит каждый 512-й такт
....1.....1 декремент счётчика происходит каждый 8192-й такт
¤
И вообще, у меня алгоритм не совсем правильный, и надо бы его будет переписать как нибудь.
-
? Alexander "Sandro" Tishin@ - 11.05.2018 07:03
Дмитрий, если пытаться применить к БК стандарт VESA, то и выйдёт полная чушь, неужели не понятно? Он к ней не имеет никакого отношения вообще.
Нет смысла рассчитывать времянки БК по этому стандарту, это всё равно, что мешать дюймовие величины с метрическими.
-
? Дмитрий - 12.05.2018 21:13
>> если пытаться применить к БК стандарт VESA, то и выйдёт полная чушь, неужели не понятно?
Если к БК10/11, то ессно нет смысла, но я не о них говорю. В том же Бустере и в БК12 будут стандарты VESA. Я просто не стал ради пары вопросов создавать новую тему.
-
? Alexander "Sandro" Tishin@ - 13.05.2018 04:46
Дмитрий> Я просто не стал ради пары вопросов создавать новую тему.
¤
В результате чего твое сообщение превратилось в информационный шум. Вообще-то, темы как раз и существуют для отделения одного вопроса от другого. И на форумах, как правило, за "не стал ради пары вопросов создавать новую тему" обычно штрафуют и переносят в отдельную тему.
¤
Просто тут нет модерирования, вот и прокатило.
-
? Дмитрий - 15.05.2018 16:38
Возвращаясь к драйверу FDD. Как все-таки вычислить время выполнения задержки, допустим, в 10000. циклов SOB в ПЗУ в микросекундах? По тактам я вычислю, но выполнение в ПЗУ быстрее, чем в ОЗУ. Переделывать на битовые флаги все же не комильфо. Пусть все останется таким, каким придумали изначально, надо только с задержками разобраться.
-
? gid - 15.05.2018 19:13
Я не знаю. Думаю, что без логического анализатора не обойтись. Посмотреть, сколько тактов CPU выполняется команда SOB из ПЗУ и вычислить.
-
? Дмитрий - 15.05.2018 22:20
Анализатора нет. Таймером, имхо, бесполезно - погрешность будет дай боже (да и команда в ПЗУ - точно начало и конец отсчета не зафиксировать), тогда с такой же точностью проще увеличить константу в столько раз, в сколько раз больше частота процессора относительно "православного" ВМ1, т.е. "пальцем в небо".
¤
Нашел данные по МС 5305 - емнип для него записаны в прошивке SMK время опускания головок (10000(8)) и время перехода с дорожки на дорожку (4000(8)). Для 326-й, опять-таки емнип, 10000 и 10000. Второй параметр 3 мс, т.е. возможно 4000 циклов SOB примерно равны 3 мс. Хотя эти параметры могли быть взяты с большим запасом, тогда вообще непонятно. Мб 3 мс = 3000 циклам, а доп. 1000 накинули для верности. Но задержка опускания головки для 5305 равна 36 мс, что не укладывается. У ТЕАС 15 мс и 6 мс соответственно. Кароче гадание на кофейной гуще.
-
? microxa - 20.05.2018 22:16
некоторый экспириенс для xp& 10ой модели бк https://exelab.ru/f/index.php?action=vthread&forum=3&topic=24033&page=5#31
¤
эмуль- форк А.Грабовца (FPC/D7), вывод графы по обращению к экранной памяти в BMP затем в буффер DDraw
(по мотивам перепаек к155ла13 для вывода совмещенной чб и цветной графы )
¤
некоторые пробелмы в знаниях/умениях/ по сверхбыстрому выводу звука и графики решилось благодаря сорсам эмуля Калмыкова, которые с некоторыми правками собрались на ламповой шизуал студии 6.0
-
? microxa - 20.05.2018 22:52
gid, а каким чудом Вам удалось прикрутить AY8910?
¤
На BCB6/VC6 (некоторые правки) собрал SDL проект "БК0010-0011М Эрика Эдвардса и Леонида Брухиса", более менее ясно как оно, не работает загрузка с диска, но работает таймер 50гц c сопутствующей активацией в порт 177662 (этакая недо бк0011) (POTDEMO с попкорн и ноулимитс пиликают)
¤
неспешно прикидываю какбы это оформить в сугубо отдельный AY8910.DLL со своим выводом (пусть даже в winmm)
+ куча стаффа https://bulba.untergrund.net/progr.htm
¤
с некоторых композ для AY/YM пребываю в благоговейном шоке
-
? microxa - 20.05.2018 22:58
кстати, касаемо POTDEMO, и сообщения "хочу таймер!!!", получается что мальчуки прокачивали бк0010 еще и 11-ым таймером?... странно... как все странно...
-
? gid - 21.05.2018 10:06
[а каким чудом Вам удалось прикрутить AY8910?]
Что значит каким чудом?
Очень просто. Нашёл в интернете исходники, аж несколько реализаций, выбрал ту, код которой более понятен сходу, изучил, потом выбрал ту, которая наиболее качественно реализует функции и модифицировал под свои нужды. Как оно всё на реальном железе работает, я знаю, у меня это железо есть и свериться и уточнить нюансы можно, поэтому запрограммировать не проблема.
¤
[какбы это оформить в сугубо отдельный AY8910.DLL]
Зачем? У того же Бульбы есть универсальный плеер, который играет всё, кроме БКшного.
¤
[получается что мальчуки прокачивали бк0010 еще и 11-ым таймером?]
Не факт. Хоть это и возможно, даже несколькими способами, не каждый мог осилить даже простую навеску схемы таймера из БК11 на БК10. Проще всего было использовать БК11(М), там программы от БК10 при наличии монитора БК10, работают и не замечают подвоха, если не требуется ПЗУ бейсика.
-
? microxa - 21.05.2018 15:18
Благодарствую за отклик, ув. комрад gid
¤
>>>Зачем? У того же Бульбы есть универсальный плеер, который играет всё, кроме БКшного...
в том то все и дело, что не знаю зачем...
мои первые синтезы были на рассыпухе с к155ид3 на резисторной матрице и генератором на к155ла3, ДПКД к155ие8 и чтото на к155ие7 & к155ру2, а в качестве ударных.. был аж пионерский барабан c системой подвеса электромагнитов :)))
Процесс был весьма увлекательный (несмотря на все эти "зачем???" даже в то время)...
¤
Подключал ТА07(от сега мега драйв) ограничился "пиликаньем" засылкой рандомных значений в регистры... Микросхемка осталась хоть и не черным но "мутным ящиком"...
¤
¤
C переходом на PC-юк, это дело несколько упразнилось...
¤
Были исходники BK Д.Тюрьева, и супер дос эмуль Савельева, в котором присутствовали(!!!) исходники PLAYPSG (asm/tp7), с прямым преобразованием AY вывода в ADLIB/SB AWE32 синтезатор...
¤
Не могу кстати их найти (оригинальный playpsg), у меня лишь осталася хелловорлд https://pastebin.com/YpRixEEY
¤
переделаный под 32битку и с прямым выводом в порты AWE32 с включением реверберацией(аж под w2k)...
¤
Собственно, на достаточно "дохлых" компутерах 486(5x86)/p1-166/celeron 366/celeron tualatin 1.3ггц
&ISA пиликали трели с непосредственным нажиманием кнопок на клавиатуре.. Можно сказать синтезатор был причем изумительно реального времени, хоть и без шикарных GUI морд как у FL Studio
¤
хоть синтез ADlib и предоставлял аж 16 каналов, но в PC-юке не было... чегото чудесного что было в БК0010
-
? microxa - 21.05.2018 15:50
у-пс... скорей всего это была рабочая версия https://pastebin.com/MDdS6fkK
¤
хоть впору опять сооружай супер PC-юк с ISA шиной, хотя я сидел долго на целероне 1.3ггц, сейчас предпочитаю нетбук с атом-ом, с загрузкой c micro-sd
¤
gid, что кстати заметил, space128 - это вроде как первая демка AY8910 by RDC на базе игры Савина.
¤
Так вот она чтото глючит и виснет...
-
? gid - 21.05.2018 16:33
[Не могу кстати их найти (оригинальный playpsg)]
там: http://pdp-11.ru/mybk/Emulators/Savelev/3.01/BK11-301.zip v1.0
и там: http://pdp-11.ru/mybk/Emulators/Savelev/5.0b/emu50b.rar v1.1
-
? microxa - 22.05.2018 19:36
gid да, спасибо, это оно... Наскоряк воткнул pci-платку ESS 1938, с FM-OPL3 на борту, порта левые (кроме MPU-401), playpsg кроме шипенья/жужжанья/ ничего хорошего не выдала... Ну да ладно...
¤
Такой вопрос значит, как понял у вас вывод звука уже другой c BKBTL, просмотрел проект то попроще, чем MFC-шный, и вроде как поддержка AY8910, но чтото POTDEMO - не пиликает, у него движок синтеза совсем не рабочий?
¤
(а то некоторые траблы по сборке в vc6/BCB6)
-
? gid - 22.05.2018 21:11
У меня вывод звука на звуковое устройство 1:1 как в BKBTL, я именно оттуда его и взял, изменения минимальны. У меня звуковые буферы формируются по-своему, так как мне необходимо.
BKBTL у Никиты Зимина проект вторичный, основной у него UKNCBTL, которому он уделяет больше времени, AY8910 он прикрутил совсем недавно, он говорил, что как-то работает, но вот насколько так как надо, он не знает, просил людей потестить, но никто не отозвался.
А мне пока своим эмулятором времени не хватает заниматься.
Хотя очень хочется узнать причину феерических глюков в space128, когда такое появилось и почему я в остальных программах такого не замечал. При беглом осмотре я заметил, что там не всегда отлавливается переход через 0, т.е. какие-то проблемы с флагами PSW, и проявляется это случайно.
-
? microxa - 23.05.2018 03:02
да уж... Припомнил историю с PUNK by DIMcorp, в дельфи-эмуле. Работает даже в Тюрьевском, а в этом бесконечная заставка после нажатия кнопки: как оказалось (при внимательном рассмотрении в Калмыковском дебаге), вектор 030 прерывания обрабатывался простым RET (0207)...
¤
Желания вникать и добиваться "правильной" работы подобной дикости, как-то не возникло, решилось поправкой RET на RTTI :)
¤
Или не работал XENON. В какойто момент(чуда?)... чудненько заработал. Как оказалось стартует если до него был загружен Epic1 (почемуто именно он) ... Решилось дампом-склейкой до 37777 xenon.bin
¤
Такие вот чудеса, в домике полном привидений... (хоть автор Андрей Грабовец и называл
использование delphi/fpc утопичным, поэтому тоже "хотябы работает на как есть(as is)".
-
? microxa - 23.05.2018 08:18
>>когда такое появилось и почему
архивный релиз 3.9.1709.5847 корректно пашет
-
? gid - 23.05.2018 10:12
3.9.1803.6289 тоже, а уже после, когда я с подачи Дмитрия (топикстартера) заменил PSW массивом булевых переменных - перестало. Если не разберусь в чём дело, верну всё обратно.
-
? Дмитрий - 23.05.2018 11:07
>> Хотя очень хочется узнать причину феерических глюков в space128
А можно поподробнее про это? Что за глюки, что за space128?
-
? gid - 23.05.2018 12:23
Есть такая игра, space128, находится много где (например в архиве свиблово в образе 03-93.img). И вот, начиная с билда 3.9.1803.6475 в эмуляторе эта игра глючит - на экране всякое постороннее вылазит, фризы начинаются, т.к. счётчики получают отрицательные значения, т.е. сильно большие числа.
Раз эта игра глючит, то и всё остальное подобным образом глючит, просто пока не заметил никто.
Где ошибка вкралась, я пока так и не разобрался. Изменения между билдами 3.9.1803.6475 и 3.9.1803.6289 очень значительные. хрен разберёшься сходу.
-
? Дмитрий Николаевич - 23.05.2018 12:34
> Изменения между билдами 3.9.1803.6475 и 3.9.1803.6289 очень значительные. хрен разберёшься сходу.
Я однажды предлагал чтобы последние цифры соответствовали номеру ревизии в SVN, "откат" был бы ощутимо легче средствами репозитория. Собственно и сейчас его можно сделать.
-
? Дмитрий - 23.05.2018 13:04
>> заменил PSW массивом булевых переменных - перестало
Я посмотрел новый код CPU.cpp - с признаками все в порядке (на мой взгляд). В реализациях команд все осталось по-прежнему, ибо там использовались функции работы с признаками как с булевыми значениями. Обращений типа m_RON[R_PSW] нет - все заменено на SetPSW.
¤
Кстати, а не мог начаться рассинхрон из-за уменьшившегося времени исполнения фрейма?
-
? Дмитрий - 23.05.2018 13:05
>> все заменено на SetPSW
и обращениям к m_PSW[]
-
? gid - 23.05.2018 14:46
Нашёл я ошибку. Когда я перелопачивал диспетчер прерываний, я там неправильную последовательность условий задал. Из-за чего всё глючить начало.
-
? Дмитрий - 23.05.2018 19:37
А не проще в обработчике всю эту тонну if-then-else сделать на перечисляемом списке и утоптать в case? Там такая пирамида растет...
-
? microxa - 23.05.2018 21:45
Дмитрий, да полноте вам... (Выбы еще спросили а что это за дельфизмы такие как
¤
class CDevice : public CObject
...
virtual ~CCovox() override;
virtual void ReInit() override;
¤
...
¤
Дмитрий, а что за система BK-проца с 32мя битами, по типу VAX или 68000 (вроде как расширеный PDP)?
¤
предлагаю заценить коечто из производственных отходов, в качестве памятника мэчтам -
горизонтальному скроллингу c ассемблерной убер-оптимизацией, и порой дергающейся(под 60герц адаптер) VBlank синхронизацией (пуск->монитор-М->имя? HS.EXE)
http://rgho.st/6wxCrSCh8
¤
Для теста горизонталки RETYPE - запустите с адреса 37740 (режим пофига)
¤
из некоторого опыта:
¤
коечто учтено из трололо сетований (с картинками)
http://www.cqham.ru/forum/showthread.php?9931-Windows-7&p=1383041&viewfull=1#post1383041
¤
дело в том что на полном экране этот шедевр PC-шного уродства(сенсорник с атомомZ)
http://www.cqham.ru/forum/showthread.php?9931-Windows-7&p=1380262&viewfull=1#post1380262
перегревался/заикался/мог глюкануть, посему порулила отрисовка исключительно на клиппере (Хотя активированый VBLank существенно грузит ресурсы)
¤
ну а так, в основном медитирую на этой клаве с экранчиком
http://www.cqham.ru/forum/showthread.php?9931-Windows-7&p=1382652&viewfull=1#post1382652
бывает со скинутой до 570мгц тактовой частотой
¤
¤
По директц саунду тоже были какието рога, наскоряк из всего возможного нарисовалась то что нарисовалось...
¤
Были и 50 хендлов на нотификаторы DS буферов (как в Калмыковском оригинале), и мрачные думы про тормозной mmsystem(aka winmm), и даже asio (м.б. в перспективе)...
¤
gid, еще раз благодарствую, вроде как потихоньку собрал emu2149.cpp (из 3.7 версии),
всетаки хочется опиратся на чтото рабочее, и хорошо звучащее...
-
? gid - 23.05.2018 21:50
Не проще. Условия неконстанты и зависят от битов PSW и от приоритета выставленного прерывания, а условие case - всегда константа. В общем, я не смог. Я даже сам это придумать не смог. а взял как есть из BKBTL этот кусок.
-
? microxa - 23.05.2018 22:16
зы. извиняюсь за опечатку - retype/fan15 это вертикалка..
совсем не помню что делает код, изобилующий 8биткой, но помню что, это меня так прорвало после проганья на PDP асме
-
? Дмитрий - 24.05.2018 13:27
>> а что за система BK-проца с 32мя битами, по типу VAX или 68000 (вроде как расширеный PDP)?
Не совсем. 16 32-битных регистров, линейная адресация памяти, полностью сохраненный асм БК, полноценный FPU, префиксы (для 32-битного режима). Простейший видеоадаптер, 3 текстовых режима, 3 режима 256 цветов, 3 режима 65536 цветов. Система команд работает, видео работает. Файловая система будет FAT16/32, в качестве образа винта воткну VHD - удобно будет гонять файлы между БК и PC. Сейчас все собираю воедино, надо погонять тесты.
-
? microxa - 24.05.2018 16:25
Дмитрий, хорошо :)
¤
gid, а осталось ли чего с проекта версии 3.6?
На r-games.net, версия, вроде как с выводом в DS/OpenGL, интересно посмотреть
(и тут дело не в актуальности, а в программных техниках)..
-
? gid - 24.05.2018 19:38
нет, по просьбам трудящихся, я начал сохранять старые версии только начиная с 3.7.1409.3828.
До этого, мне это делать даже в голову не приходило, потому что я практически ничего не выкидывал из исходников. Наоборот, они всё распухают и распухают. Всё, кроме улучшенного вывода звука и рендера экрана так и тащится со времён, когда эмулятором ещё Калмыков занимался.
Сейчас эмулятор предлагает на выбор 4 способа вывода на экран:
1) OpenGL - Универсальный, хорошо работает везде, если видеокарта позволяет, и плохо - если не позволяет.
2) VFW (DibDraw) - Хорошо работает под ХР и Вин7. Иногда дёргается на Вин8, Вин10, а иногда и не дёргается. Поскольку алгоритм один, то зависит это от драйверов наверное.
3) Direct2D - не работает на ХР по причине отсутствия, работает на Вин7 и выше. С недавнего времени начал глючить заторможенностью. С чем связано - я не знаю. Заметил после того, как я начал пытаться применить свойства масштабирования рабочего стола к UI эмулятора, но до масштабирования экрана ещё не дошло, а работать хорошо уже перестало.
4) Direct3D (9 для XP, 11 для более новых винд) под ХР глючноват, в редких случаях даже приводит к краху, но понять причины этого я не смог, в отладочном режиме всё стабильно, просто изредка очень тормозно, потому что я не нашёл в инете нормальных примеров, и сделал его по тем, что нашёл, поэтому получилось, что получилось. D3D11 работает гораздо лучше, не глючит, но тоже сделан по примитивным примерам, найденным в сети.
¤
DirectSound я выкинул потому что он слишком сложен, медленный и давал большую задержку между происходящим на экране и звучащим в колонках. А уменьшаешь буфер - становился очень прожорливым к ресурсам. Его исходники можно посмотреть в оригинальных исходниках эмулятора Калмыкова.
-
? microxa - 25.05.2018 08:03
gid, усаживаю по маленьку emu2149 (вместо covox), в БК 3.0.
¤
Недолюбливаю этот проект, в плане правок, так что, не до апгрейда вывода графы (пытался исключить SetCooperativeLevel&Set Resolution) но забил - собрается в VC6, и ладно)..
¤
Ну а насчет движков - на фулскрине, куда-то фокус уходит что клава не работает, я не смог толком ничего заценить из за куцого юзабилити) ни на XP ни на 10тке
¤
¤
вот если интересно:
Для меня пока единственный из всех вариантов DirectDraw c CreateDibSection (если рисовать на bmp-ушке) и таки DsounD (более реактивная отдача), и совмещенная чб/цв графа (переключение alt+f11)+какието бонусы (компилер fpc/ассемблер Фарфорова переделаный, экземплы r-type, rs(допиленый мной оконными рюшечками) и cf48bi грузящийся в ПЗУ http://rgho.st/6BxJWZnFg
-
? Дмитрий - 25.05.2018 09:33
>> компилер fpc/ассемблер Фарфорова переделаный
Что за переделанный fpc и асм?
-
? gid - 25.05.2018 10:15
Вы не первый жалуетесь на потерю фокуса. НО! У меня фокус не теряется, что бы я ни делал, какие бы кнопки не нажимал (в разумных пределах). Может есть какие-то комбинации клавиш, которые мне в голову не приходит нажимать?
Я тупо не могу повторить ситуацию у себя.
Не теряется самопроизвольно фокус ни в полноэкранном режиме, ни в оконном. Т.е. в оконном режиме фокус естественным образом теряется, если ткнуться мышкой в тулбар или в какие-нибудь дополнительные окошки, потом нужно обратно ткнуться мышкой в экран, чтобы вернуть фокус, это естественная фича виндового графического интерфейса.
-
? Maxvel - 25.05.2018 14:56
В эмуляторе найден баг еще с версии от 11 апреля баг такой зажимаем следующие кнопочки - ctrl+j вирт.БК встает раком помогает только сброс машины по num-5.
Для разъяснения...
На рынке появились клавиатуры на которых вторая клавиша ВИН заменена на клавишу Fn но кнопка контекстового меню осталась.
У меня есть предложение!
В связи с тем что клавиша БК "ЛАТ" завязана на правый WIN я предлагаю продублировать клавишу БК "ЛАТ" на контекстовую клавишу которая находящуюся там же рядом с правым "WIN".
-
? gid - 25.05.2018 15:39
ctrl+j - это код клавиши ВВОД. Так не бывает, чтобы при нажатии ctrl+j == 012 глючило, а при нажатии ВВОД == 012 - нет.
Потому как с точки зрения как микросхемы 1801ВП1-014, так и с точки зрения эмулятора, это одно и то же.
Видимо, вот конкретно у вас, по нажатию клавиши ввод запускается нечто,ставящее раком вирт.БК.
¤
Продублировать на контекстовую клавишу можно, но это крайне неудобно. Я уже пробовал. Я начинаю путать их и всё время нажимаю сперва не туда, а потом не на ту, лат вместо рус и наоборот.
Так что лучше назначить действие на ту клавишу, которая теперь находится вместо левого WIN. Только я подозреваю, что каждый производитель лепит туда что-то своё. И нужно составить список кодов таких клавиш от разных производителей.
-
? Maxvel - 25.05.2018 17:30
Попробуй я просто так говорить не буду так как ей пользуюсь постоянно а на счет контекстовой нет это стандарт майкрософт и код у нее стандартный. А по поводу ctrl+j на БК аналогично су+о как раз и есть переключения языка.
-
? Maxvel - 25.05.2018 17:36
На счет контекстовой клавиши поправляюсь ее правильное название "menu" ее код в Hex 65 у Rwin e7.
-
? microxa - 25.05.2018 18:06
gid, насчет BKBTL был неправ, на
¤
Дмитрий, >>Что за переделанный fpc и асм?
Асм (tp7) от Фарфорова Алексея https://bk0010.org/forum/?id=4725 переделаный под консольную 32битку
(и что-то свое по мелочи). Собирает достаточно серьезные асмы-листинги (retype как например -выхлоп с дизасемблера IDA Pro)
¤
А FPC (free pascal compiler) в комплекте для гарантированой сборки текстов эмулятора(кстати в FPC-шном диалект позволяет использовать знак & для указания восьмеричных констант..
(из примера Epic32)
procedure PRINT_AT(X,Y:integer;str:pchar);var i:integer;
begin CPU.R[1]:=X;CPU.R[2]:=Y;
//EMT 24 - установка курсора по координатам X=R1,Y=R2;
ExecToAddr(&107272,&107500);
for i:=0 to 128 do begin if str[i]=#0 then exit;
CPU.R[0]:=word(str[i]);
//EMT 16 - вывод символа; вход: код символа в R0;
ExecToAddr(&102234,&102366);
end;
end;
...
Что даже и послужило некой отправной точкой для такого бзика как, подгруз "виртуальных программ" под эмуль
на х86-ой нативке. Ессно можно и более продвинуто сделать (чтото типа плагинов).
¤
gid, просмотрел zx-pk, собственно мне хорошо понято, что такое в болото тянуть бегемота :-D
насчет BKBTL - оказия, я тестил старую сборку, а новая да тихонько пиликает, но не скажу что корректно, как у вас))
-
? gid - 25.05.2018 22:26
>>? Maxvel@ - 25.05.2018 17:30
Точно. Там вообще кошмар. В попытках угодить одному пользователю, чтобы чётко работала клавиатура в игре boulderdash, оказалось, что я поломал все алгоритмы эмуляции клавиатуры, но так и не добился никакого результата.
Буду исправлять.
-
? Дмитрий - 26.05.2018 00:11
2 microxa: А вы не пробовали сделать для FPC модуль кодогенерации для БК? Я в свое время было протянул к этому ручки, но инфы как написать свой backend - никакой, код компилятора вообще не документирован. Надо бы разобраться, но времени нет.
-
? microxa - 26.05.2018 02:23
Дмитрий, с FPC была связана несколько другая история - cобирал его под ARM платформу WM2003... для PC-юка, он выхлоп сразу в .ехе делал а под WM требовал линуксовый AS, из-за ненаписаного генератора машкода(Даже не знаю осилили ли его). Так что максимум -хеловорлд(на большее памяти не хватало).
¤
Вобщем тоже самое: посмотрел, потыкал палочкой, да и нафик :-D ...
¤
Проект бэкашки для меня вроде "скринсейвера", больше занимают примитивные вещи, лишь бы их понимал:) Начал с бейсика, но потом прогал (в то и дело прокачиваемом cf48) в _восьмеричных_ машкодах. даже Бейсик так не понимал, как циферки от 0 до 7-ми :)
-
? microxa - 27.05.2018 14:59
gid, потестил в XP свежий релиз 3.9.1805.6650. Фуллскрин фокуса не теряет, единственное что не запускался Direct3D рендер: обнаружил торчащее обращение к D3DX9_43.dll (решено).
¤
Движок мажет пиксель - такое было и DDraw как на стретчинге 512х256 битмапа/dd буфера, из-за чего и приходилось удваивать пиксела до 1024, чтобы добится компроммиса в более-менее резкости.
¤
По своему проекту:
После разборок с плюсовыми текстами (пока забил), emu2149.c & synth.c c эмулятора Леонида Брухиса выглядели сущим хеловорлдом, закомпилены в дельфовую сборку (с реализацией 11-ого таймера), и выдают звук... Слехка невменяемый(кудато частота плывет) - ну, всё есть над чем интересно поработать(над синхронизацией которую пока еще не полностью понимаю).
¤
Хорошо :)
-
? Alexander "Sandro" Tishin@ - 28.05.2018 05:11
gid, а что там такое с boulderdash? И какая именно версия boulderdash имеется в виду? Хочу сам потыкаться/посмотреть, что там с клавиатурой такого странного.
-
? gid - 28.05.2018 07:55
Та, что в комплекте с эмулятором. bolder.bin
У меня в эмуляторе с ней неустранимый косяк. Если быстро нажимать клавиши управления - то новая нажатая, всё ещё продолжает считаться старой нажатой. Вот это вот никак не побеждается.
И ещё, если очень-очень быстро нажать и отпустить клавишу - то в регистре 177660 флаг нажатия новой клавиши и код в 177662 появится, но если игра опрашивает бит 6 в 177716, и по нему определяет, нажато ли что-нибудь, то нажатие не отлавливается. Хотя я приделал фикс - бит 6 в 177716 держится целый фрейм, независимо от того, как быстро была отпущена нажатая клавиша. Болдердашу это не помогло.
-
? Maxvel - 28.05.2018 12:10
Я думаю что сам bolder dash по себе такой, первая не стыковка между эмулятором и реальной БК наблюдается сразу же при вывода лабиринта на экран, в эмуляторе он выводится резко а на реальной БК плавненько как положено или к примеру тоже происходит с игрой "GREEN" но уже не с экраном а только с обработкой клавиатуры.
-
? gid - 28.05.2018 12:48
А у меня в эмуляторе лабиринт выводится плавно, скрололм снизу вверх.
А в игру GREEN, я вообще никогда играть не мог. Играл джойстиком и всё равно тупо не хватало скорости поворота пушки всех расстрелять, да ещё и не забывать уворачиваться от выстрелов.
Я вообще мало в какие игры мог по-нормальному играть на БК, поэтому обычно хакал игры, делал себе неуязвимость и только тогда мог хоть как-то играть.
-
? microxa - 28.05.2018 13:44
да уж... эмуль както, четко передает "совковую дубовость" бк-шной клавы... После "pc-шных" привычек, такое не хочеться вспоминать: отжимать кнопку чтоб нажать другую. (Из-за этого, приходилось подбирать, перепаивать танталовые кондеры 0.33/0.47мкф у ВП1 0-14, и чтото еще перепахивать, чтобы отжать большую играбельность).
(а еще убрать кантики, по бортам и уложить плашмя резисторные матрицы - чтоб корпус был еще площе :)
¤
Не знаю... Обработчик клавы в движке А.Грабовца, (простыня которого вынесена в TranslateKeys ) покорил именно что, игровой динамикой..
¤
gid, фишка Green была в AR2+стрелочки :)
-
? Maxvel - 28.05.2018 15:47
gid Если в "GREEN" зажать АР2 и стрелки то все путем пуха ездит и одновременно стреляет.
-
? Maxvel - 08.06.2018 23:09
Привет всем дорогие друзья, недавно было выпущено обновление эмулятора а через какое то время еще точнее последнее обновления вышло 6 июня, но вот что было замечено и то случайно, а именно. При работе оператора «RESET» код 5(8) почему-то сбрасывается палитра на 15ую(БК0011М) хотя содержимое регистра 177662 остается не изменённым, но если в тексте программы приметить такой способ:
…..
……
MOV #100,@#177662
…….
То палитра не срывается.
Так же в последней версии от 6 июня, как то странно ведет себя рендеринг экрана, верхняя часть экрана наплывает волной.
Пока все.
-
? gid - 09.06.2018 09:58
[При работе оператора «RESET» код 5(8) почему-то сбрасывается палитра на 15ую(БК0011М)]
Заметили старый-старый косяк. там один и тот же код используется и для начальной инициализации, и для команды RESET. поэтому и поведение неправильное.
Будет исправлено в следующем обновлении.
¤
[но если в тексте программы приметить такой способ]
Тут непонятно.
MOV #100,@#177662 задаёт нулевую палитру, и разрешает прерывания по вектору 100, при ресете палитра по любому устанавливалась в 15, так что должна срываться.
¤
[как то странно ведет себя рендеринг экрана]
Я применил новый, немного сомнительный, способ синхронизации через блокировки, может поэтому быть такое на некоторых системах.
Нужно больше информации. Какая видеокарта? Проц/платформа если видео - встройка? ОС? И каким рендером пользуетесь?
У меня на платформах с процом AMD Phenom-II x4 955 / видео нвидия 8800GT / виндовс 7 и на AMD FX8350 / видео нвидия 570GTX / виндовс 10 все 5 рендеров (OpenGL, VFW (DrawDIB), Direct2D (для всех, кроме винХП), Direct3D9 (только для винХП), Direct3D11 (для всех, кроме винХП)) ведут себя как обычно, ровно и чётко.
Разве что VFW (DrawDIB) в вин10 какой-то дёрганный, как будто рывками выводит, может пытается под частоту монитора подстроиться, он же для вывода видео предназначен. Но это мирософтовцы чё-то сделали, в вин8 вообще с этим рендером кошмар был.
И Direct2D, если осциллограф тоже Direct2D начинает чудить по непонятным причинам - ФПС плавно падает до 30 и потом назад к 50 возвращается.
-
? Maxvel - 09.06.2018 11:52
MOV #100,@#177662 - если по простому то происходит блокировка 60 и 274 вектора, управление палитрой не затрагивается так как слишком маленькое значения для этого регистра.
По поводу рендера экрана - лично смотрел на 2х машинах где использовалась win10 на первой машине стоит видеокарточка от NVIDIA 970 GTX на второй intel 4000 на всех режимах.
-
? gid - 09.06.2018 12:42
блокировка 60 и 274 вектора, это MOV #100,@#177660
а MOV #100,@#177662 на БК10 вызовет прерывание по вектору 4
¤
А точно, есть глюки. Нужно было сразу сказать - в цветном режиме. Я то цветной режим редко использую, т.к. в нём 64 символа в строке нечитаемы. А в ЧБ режиме ничего такого не видно, особенно когда просто текст на экране.
¤
Ща всё исправлю.
-
? Maxvel - 09.06.2018 13:09
Если бы не чего не писал то я так думаю что долго бы эти глюки не увидели бы, да к стати про писанину то что сейчас делаю будет интересно только для владельцев оригинальных БК0010-01 с контролером СМК 128 и СМК 512 на счет других не знаю проверить нет возможности.
-
? Дмитрий - 14.06.2018 13:29
Еще один момент. В CMotherBoard::TimerThreadWrapper нет необходимости каждый раз вычислять разницу в мс.
¤
LARGE_INTEGER period = li_clock / CPU_FRAMERATE; // Число тиков в 20мс фрейме
...
do
{
...
QueryPerformanceCounter(&i1);
...
ExecuteFrame();
...
do
{
Sleep(1);
QueryPerformanceCounter(&i2);
}
while (i2 < (i1 + period)); // ловим "перескок" через вычисленную границу 20мс интервала в тиках
¤
в итоге меньше вычислений, не используем плавающую арифметику.
-
? Дмитрий - 14.06.2018 13:32
тьфу, LARGE_INTEGER period = li_clock / 50;
-
? Дмитрий - 14.06.2018 13:46
Только я что-то не понимаю. ExecuteFrame должен вызываться 25 раз в секунду (по 40мс на фрейм), а тут в таймере 50Гц ExecuteFrame вызывается 50 раз в секунду.
-
? gid - 14.06.2018 14:09
Я от QueryPerformanceCounter давно отказался. Как раз из-за того, что там считать много надо, а толку нет.
¤
А с длиной фрейма я время от времени играю. Он у меня то 40 мс, то 20 мс. В разных версиях сборки.
-
? Дмитрий - 14.06.2018 15:19
То есть waitable timer получается точнее?
-
? gid - 14.06.2018 16:13
Не точнее, а просто менее затратный. Синхронизация то всё равно по звуку делается. Звуковые буферы отправляются на звучание строго за заданные моменты времени.
А в этом цикле все эти таймеры нужны на случай, если в системе не будет вообще никакого звукового железа.
-
? Дмитрий - 14.06.2018 16:19
Я вот щас пишу как раз цикл выполнения команд. Звука пока нет, соответственно буферов тоже. Синхронизация тоже по звуку идет? Надо ставить точное время -20000 (20 мс) для таймера или как в последней версии -10000 * 990 / CPU_FRAMERATE? Я просто не пойму какие таймер вносит задержки, если поставить точное время? И почему сделан периодический таймер вместо однократного? Ведь вы писали про время устаканивания после сработки - там точно не получится отсчитать.
-
? gid - 14.06.2018 19:03
Если вообще никак ни в WaveOut, ни в DirectSound ничего не отправляется, то естественно, звук никак не влияет на синхронизацию.
¤
[Я просто не пойму какие таймер вносит задержки, если поставить точное время?]
Я тоже не пойму, что вносит задержки. Но если поставить точное время, то когда слушаешь AYшную музыку запинок больше, чем если сделать время немного меньше.
Я потому и по-всякому долго экспериментировал с этими таймерами - меня очень раздражали эти запинки, когда слушаешь музыку.
Победить их я так и не смог, поэтому забил на это дело, пока кто-нибудь не подскажет, как улучшить ситуацию.
¤
[И почему сделан периодический таймер]
Потому что выставил один раз период, и всё, он сам срабатывает. А в однократном, надо каждый раз выставлять период, чтобы запустить таймер - лишняя операция.
¤
[там точно не получится отсчитать]
Windows и точно - понятия не совместимые. Как ни извращайся, точно всё равно не получится, так что если будет хоть примерно точно, уже хорошо. Тем более, что у этого WaitableTimera минимальный квант времени 1мс. И погрешность такая же.
-
? Alexander "Sandro" Tishin@ - 21.06.2018 12:11
Дмитрий, а что есть точное время? ;)
¤
Нет его. У звуковой подсистемы есть какое-то своё время, у видео своё, у процессора -- третье. Поэтому надо выбирать что-то одно.
¤
В эмуляторах и видеопроигрывателях за источник времени всегда выбирают звук, так как его искажения наиболее заметны. Соответственно, звук надо воспроизводить как можно точнее, а остальное -- как получится. Вот и всё :)
-
? Дмитрий - 02.07.2018 11:13
Интересуют назначение и описание команд FPU
¤
170003 LDUB
170004 LDSC
170005 STA0
170006 STB0
170007 STQ0
¤
а также инструкций CIS с опкодами 076ххх. Этих команд FPU не нашел в файлах описания системы команд PDP-11, по CIS вообще только мнемоника и опкоды - описания также не могу найти. Сабж вообще есть в природе? CIS хотелось бы реализовать.
-
? Дмитрий - 02.07.2018 11:24
Забыл еще
¤
0070dd CSM
0072nn TSTSET
0073nn WRTLCK
-
? gid - 02.07.2018 14:52
Описание инструкций CSM TSTSET WRTLCK можно найти в книге http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/pdp11/1193/EK-KDJ1E-UG-001_KDJ11-E_CPU_Module_Users_Guide_Jan91.pdf
CSM - call to supervisor mode
TSTSET - Test and set (low bit interlocker)
WRTLCK - write interlocker.
¤
А с инструкциями 17000х труднее, это какие-то инструкции управления самим FPU и то ли они какие-то специфичные, только для каких-то конкретных реализаций FPU, то ли очень секретные, но для них, ничего, кроме мнемоники найти не удаётся.
¤
Однако я просто не осилил чтение всех хандбуков и гуидов для всех пдп процессоров по ссылке http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/ , может, где-то там что-то и найдётся.
-
? gid - 02.07.2018 15:22
описание
170003 LDUB
170004 LDSC
170005 STA0
170006 STB0
170007 STQ0
нашлось там: http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/pdp11/1170/EK-FP11C-MM-01_FP11C_May76.pdf
Только там всё начёркано ручкой и ссылаются на FP-11B (это PDP-11/45) но его описания что-то не нашлось.
-
? gid - 02.07.2018 19:13
Забыл про CIS написать.
Обычно, CIS - это заказные инструкции. Применяются в заказных специфических процессорах, которые делались ограниченными сериями. И заказчик обычно не раскрывает данных об этих инструкциях, что это и зачем они нужны. К тому же, одни и те же опкоды в разных изделиях могли иметь разные функции.
Откуда взялись те инструкции CIS, уже не помню, но кажется из какой-то документации на какие-то процессоры LSI.
-
? Дмитрий - 02.07.2018 21:32
Благодарю. Сколько ж там инфы - ее хрен осилишь. Почитал бегло: эти FPU команды бесполезны, а равно как и CSM/TSTSET/WRTCLK (пока, по крайней мере). Насчет CIS припоминаю, что там были команды сканирования строки на определенный символ в обе стороны, еще что-то подобное. Аргументы задавались жестко в определенных регистрах, поэтому сами команды безоперандные. Надо будет порыться в тех пыльных архивах по ссылке.
-
? Дмитрий - 03.07.2018 10:18
>> инструкции CIS
Нашлись довольно быстро. http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/pdp11/handbooks/EB-24944-18_Micro_PDP-11_Handbook_1983-84.pdf стр. 363 (355 по документу)
-
? Дмитрий - 05.07.2018 11:28
Наткнулся на непонятки с приоритетом процессора. Во времена расцвета БК писали, что в PSW отведено три бита на приоритет - 5,6,7 биты (приоритет 0..7). Заметил, что в эмуле в обработчике прерываний проверяется только 7-й бит - bool bNoPriority = !m_PSW[PSW_P_POS], хотя при инициализации все три бита устанавливаются. Полез в инет - в доках по 1801ВМх пишут, что приоритет в 7-м бите, а 5,6 не используются. Это как так? Выходит у 1801ВМх процов реально есть обычный и повышенный приоритет и никаких других промежуточных?
-
? gid - 05.07.2018 11:59
Да. Вот так это так. Видимо пилили, но не допилили, и оставили для совместимости с остальными PDP-11 совместимыми процами. чтобы софт не переписывать. Биты 5 и 6 просто висят в воздухе, они доступны для чтения и записи, но совершенно ни на что не влияют.
Это только у 1801ВМ1. У ВМ2 и ВМ3 уже нормальный 8-ми уровневый приоритет.
-
? Дмитрий - 05.07.2018 13:28
Стоп, получается нам тогда лапшу вешали про "если приоритет прерывания выше, чем текущий приоритет проца, то происходит прерывание, иначе нет" и расписывали эти три бита со значениями от 0 до 340? Причем вроде даже Зальцман что-то подобное писал. Помню во второе слово векторов писали 340, 200, 0 - а на самом деле это всего лишь два значения 200 и 0, остальное туфта. И 340 фактически одно и тоже, что и 200. Вот это поворот!
¤
Емнип, bNoPriority показывает необходимость обработки прерывания? Но bNoPriority используется не везде, а только в 6 и 7 приоритете прерывания. Т.е. если делать полноценные 7 уровней, то надо сравнивать текущий приоритет в PSW и приоритет прерывания/вектора, но вектора нам еще неизвестен в коде, где используется bNoPriority. Что-то я запутался...
-
? gid - 05.07.2018 15:06
Не вешали, а были недостаточно проинформированы.
¤
Про прерывания точно и достоверно написано там (таблица на стр. 55)
http://u.zeptobars.ru/yuot/1801/VM1/DOC/1801vm1-17-Jun-2018.pdf
Также там написано что их маскирует. Правда приоритеты там расставлены с аппаратной точки зрения, а не логической, в которой 8 или 7 уровней.
¤
У меня, bNoPriority - инверсный бит 7 PSW, который означает, что данное прерывание может быть им замаскировано, но вот если прямо сейчас не замаскировано, то условие if истинно и тело if выполняется.
¤
Кстати, насчёт ВМ2 я ошибся, там тоже приоритет всего один бит 7.
¤
[если делать полноценные 7 уровней]
то не сравнивают приоритет PSW прерывания, чтобы узнать, прерываться на него или нет, а маскируют саму возможность возникновения прерывания. Т.е. нужно делать несколько разных входов например векторных прерываний и в зависимости от текущего уровня приоритета, разрешать или нет прерывания на одних входах и не разрешать на других.
¤
Например в ВМ3, в котором всё таки уже 3 бита под прерывания задействовано, они маскируют прерывания на линиях IRQ3-IRQ0
И вообще в ВМ3 больше источников прерываний и поэтому там просто одним битом не обойтись.
-
? Дмитрий - 05.07.2018 15:21
>> нужно делать несколько разных входов например векторных прерываний
Нет, я про симуляцию этих приоритетов.
-
? Дмитрий - 05.07.2018 15:33
Я так понял, что в случаях, где не проверяется bNoPriority, прерывание немаскируемое и произойдет при любом раскладе. А в случаях с прерыванием от таймера и прерыванием от внешнего устройства (priority 6) и VIRQ (priority 7) нужно смотреть на приоритет. Т.е. получается, если у проца выставлен приоритет 7 (наивысший), то произойдет прерывание с VIRQ (из тех, что маскируются), а вот прерывание от внешнего устройства пойдет лесом. А если у проца приоритет 5, то выполнятся оба?
-
? gid - 05.07.2018 16:32
[Нет, я про симуляцию этих приоритетов.]
У 1801ВМ1 делать 8 уровней приоритета просто бессмысленно, там просто нечего приоретизировать. Разве что можно попробовать запрещать/разрешать не всё скопом, а по отдельности (IRQ2, IRQ3, VIRQ). Но источников прерываний всё равно мало, так что тут большой простор для фантазии и разных комбинаций.
напр
7 - запрещено всё (IRQ2, IRQ3, VIRQ)
6 - разрешено IRQ2, запрещено IRQ3, VIRQ
5 - разрешено IRQ3, запрещено IRQ2, VIRQ
4 - разрешено VIRQ, запрещено IRQ2, IRQ3
3 - разрешено IRQ2, IRQ3, запрещено VIRQ
2 - разрешено IRQ2, VIRQ, запрещено IRQ3
1 - разрешено IRQ3, VIRQ, запрещено IRQ2
0 - разрешено всё (IRQ2, IRQ3, VIRQ)
¤
или один бит приоритета запрещает одно какое-то прерывание, их как раз три.
Но это полностью ломает всю совместимость.
¤
[где не проверяется bNoPriority]
прерывание не маскируется битом 7, поэтому от него не зависит.
[А в случаях с прерыванием от таймера и прерыванием от внешнего устройства (priority 6) и VIRQ (priority 7) нужно смотреть на приоритет]
и если случилось так, что одновременно пришёл запрос на прерывание IRQ2 и VIRQ, то смотрим таблицу приоритетов, и видим, что у VIRQ приоритет ниже (т.е. чем больше номер в таблице, тем ниже приоритет, не знаю кто это придумал, но это так).
Поэтому сперва обработается запрос на прерывание IRQ2, а затем, сразу после него VIRQ (если ничего не случится при обработке IRQ2).
И вообще в этой таблице указан арбитраж, как разруливается конфликт, когда приходит несколько прерываний одновременно. А не то, что делается в зависимости от приоритета проца.
¤
[А если у проца приоритет 5]
У проца нет приоритета 5, у него приоритет или есть или нет.
-
? Дмитрий - 05.07.2018 16:43
Тогда не буду изобретать велосипед и оставлю все как есть. Пусть будет обычный и повышенный приоритет.
-
? Lasoft / Excess team@ - 19.08.2018 04:22
> ? Дмитрий - 07.05.2018 18:54
> Вопрос про таймер, который 177706/10/12. У Зальцмана написано, что частота таймера совпадает с частотой проца. А в эмуле CCPU::Timerprocess вызывается каждый 128 такт. Примерный период, вычисленный на нескольких БК, у Зальцмана 42.9 мкс. В итоге с макс. множителем цикл получается 180 сек. Верны ли > данные зальцмана?
> ? gid - 07.05.2018 22:13
> Естественно верны, за исключением утверждения про частоту. А в эмуляторе - эквивалентная схема, которую я позаимствовал у Patrona, она не достоверно точная, но для такой эмуляции, какая у меня - подходит вполне. У Patrona есть и достоверно точный алгоритм, вплоть до эмуляции глюка с пропуском > первого цикла счёта, но я никак не могу придумать, как мне прицепить его модель процессора к своему эмулятору, загвоздка как обычно оказалась в ВП1-037.
¤
Интересное обсуждение, почему "за исключением утверждения про частоту"? По моим тестам на реальном БК0011М на 6 Мгц таймер тикает тоже быстрее, может я просто не понял что ты имел в виду?
Как раз сейчас провожу тесты... и есть один непонятный косяк.. т.к. любая команда бк работает быстрее чем тикает таймер, невозможно точно попасть на переход ( фактический декремент числа счётчика ), есть вообще у кого какие идеи? Проблема в том, что пытаюсь ловить луч, читая значения таймера, но при каждом включении БК, оно всегда находится в разной позиции, если же просто нажимать резет, то как было при включении питания, так перехват в том же месте и держится чётко, то есть резет не влияет, а вот включение питания не позволяет точно отловить луч, он всегда плавает, что интересно, в эмуляторе тоже плавает )
-
? gid - 19.08.2018 10:41
[Интересное обсуждение, почему "за исключением утверждения про частоту"?]
Потому что частота таймера = частота процессора / 128.
И самый быстрый один тик таймера происходит за 128 тактов процессора, и поэтому никогда не будет возможно поймать переход, если не использовать 0-тактовую память. При 0-тактовом ОЗУ, которое не зависит от ВП1-037, можно точно подобрать команды, т.к. их время выполнения в тактах известно.
ВЕ таймер нужно запускать дважды, из-за глюка первого перехода через 0 после подачи питания.
Т.е. запустить таймер, остановить, запустить повторно. Или просто дать ему покрутиться с малым периодом, потом задать нужный и начать использовать.
А синхронизироваться лучше по прерыванию 50Гц. Потому что, когда оно происходит луч находится всегда в определённой позиции.
Т.е. запускать таймер в прерывании, тогда его отсчёт будет совпадать с ходом луча в каждом кадре, не будет плавать.
-
? Alexander "Sandro" Tishin@ - 19.08.2018 10:51
А ты насколько точно хочешь поймать луч? Напоминаю, время исполнения MOV R0,R0 -- 2 слова пикселей. Для команд работы с памятью ещё хуже, время дрожит, так как видеконтроллер и проц работают асинхронно. Так что можно надеяться только поймать с точностью до строки. А для этого играться с вычислением точного момента не нужно.
¤
Впрочем, способ есть. Но кривой, так как будет неконтролируемое смещение, зависящее от конкретного экземпляра БК.
¤
На память, разрешили прерывания от 50Гц таймера, запретили клавиатуру, и:
¤
MOV #177712, R5
CLR R0
CLR R1
WAIT
MOV @R5, R4
INC R1
CMP @R5, R4
BEQ .-8
MOV @R5, R4
INC R0
CMP @R5, R4
BEQ .-8
;... пошли рисовать
¤
в R0 будет период таймера, В R1 -- сдвиг фазы тамера вправо.
-
? Lasoft / Excess team@ - 19.08.2018 16:26
> Потому что частота таймера = частота процессора / 128.
¤
ну тогда в чём не прав Зальцман? ты с чем-то был не согласен, но сам же противоречишь, не потроллить ради, а просто не совсем тебя понимаю, объясни пожалуйста
¤
> И самый быстрый один тик таймера происходит за 128 тактов процессора, и поэтому никогда не будет возможно поймать переход, если не использовать 0-тактовую память. При 0-тактовом ОЗУ, которое не зависит от ВП1-037, можно точно подобрать команды, т.к. их время выполнения в тактах известно.
> ВЕ таймер нужно запускать дважды, из-за глюка первого перехода через 0 после подачи питания.
> Т.е. запустить таймер, остановить, запустить повторно. Или просто дать ему покрутиться с малым периодом, потом задать нужный и начать использовать.
¤
Ещё раз объясню, я смог поймать точно, но в пределах одного запуска БК, всё чётко, не плавает, луч отлавливается каждый кадр, в нужном мне месте, если выключаем БК и включаем, то луч может отлавливаться теперь уже в другом месте ( до 10-ти вариантов ), и опять же на каждом кадре ровно в том месте.
Посмотрите Однажды - там переключение луча идёт 8 раз за строку.
¤
> А синхронизироваться лучше по прерыванию 50Гц. Потому что, когда оно происходит луч находится всегда в определённой позиции.
¤
и это тоже не совсем так, бывает сбивка ( при включении питания - 2 варианта у меня получилось, причём правильный вариант в 80% случаев наверно ), а то что я пишу про системный таймер, разумеется он работает в паре с кадровым
¤
> Т.е. запускать таймер в прерывании, тогда его отсчёт будет совпадать с ходом луча в каждом кадре, не будет плавать.
¤
Лучше приведу код, чтобы было понятно
¤
; Исходные данные
; 0-ой экран ( 5 страница ) - пустой
; 1-эй экран ( 6 страница ) - полностью залита синим цветом ( 52525o )
...
MOV #177663,R5
MOV #200+12.,R1 ; 1 экран + 12-ая палитра ( red )
MOV #200+1.,R2 ; 1 экран + 1-ая палитра ( yellow )
MOV #0,R3 ; 0 экран, 0 палитра ( black )
¤
MOV #TICK,@#100
CLRB @#177662 ; запускаем кадровый таймер
FRAME_LOOP:
WAIT
0: TST (R0)
BNE 0
MOVB R1,(R5) ; включаем жёлтый цвет, 8 команд дают ровно одну линию
MOVB R1,(R5)
MOVB R1,(R5)
MOVB R1,(R5)
MOVB R1,(R5)
MOVB R1,(R5)
MOVB R1,(R5)
MOVB R1,(R5) MOVB R2,(R5) ; включаем красный цвет, также рисуем одну линию 8-ю командами
MOVB R2,(R5)
MOVB R2,(R5)
MOVB R2,(R5)
MOVB R2,(R5)
MOVB R2,(R5)
MOVB R2,(R5)
MOVB R2,(R5) MOVB R3,(R5) ; выключаем манипуляции и оставляем чёрный цвет на экране
BR 0
TICK:
MOV #177710,R0
MOV #175,@#177706 ; start value
MOV #1,@#177712 ; copy value to timer
MOV #32,@#177712 ; start
0: CMP #174,(R0) ; попробовать засинхрится с таймером, поймав переход
BNE 0
1: CMP #173,(R0) ; и тут тоже
BNE 1
RTI
¤
Что должно быть в итоге: - Самая первая строка экрана должна выводится жёлтым цветом, вторая строка красным цветом, остальное чёрный цвет. Если "правильно" поймать включение питания - то будет то что я написал, в других случаях, начало переключение всегда в разных местах.
-
? Lasoft / Excess team@ - 19.08.2018 16:42
> А ты насколько точно хочешь поймать луч?
¤
Если видел нашу дему "Однажды" то мы ловим до пикселя ), а переключений на одной строке может быть максимум 8 ( 6 попадает в видимую область, 2 как бы за пределами экрана )
¤
> Напоминаю, время исполнения MOV R0,R0 -- 2 слова пикселей.
¤
Это не правда )
R0 = 200+N палитры ( смотри выше исходник )
R5 - 177663
например команда MOVB R0,(R5) - их ровно 8 за одну строку отрисовки кадра, причём две из них не видны на экране ( в идеальном случае конечно же, начало необязательно самый левый пиксель строки ), так что переключение грубо в районе 40 пикселей? команда MOV R0,R0 не может быть быстрее в 20 раз, чем MOVB R0,(R5)
В деме "Однажды" (логотип) - получилось 8 колонок ( 6 из них на экране, 2 как бы за пределами ), и четыре кадра свдига начала переключения, там у меня рассчитанные задержки, а теперь я хочу выходить на нужную область на экране через системный таймер, чтобы я мог пока луч бежит, обсчитывать какой-то
эффект, а потом в нужный мне сравниться с таймером и включить экран/палитру, понимаете?
¤
> Для команд работы с памятью ещё хуже, время дрожит, так как видеконтроллер и проц работают асинхронно. Так что можно надеяться только поймать с точностью до строки. А для этого играться с вычислением точного момента не нужно.
¤
Выше ответ, точность до 8 колонок я уже сделал, а строку мы ловили в "Электробулке"
¤
> Впрочем, способ есть. Но кривой, так как будет неконтролируемое смещение, зависящее от конкретного экземпляра БК.\
> ...
¤
код я погляжу, спасибо, может быть CMP вместо TST творит чудеса
-
? Lasoft / Excess team@ - 19.08.2018 16:51
Да, может быть кому-нибудь будет интересно:
R0 - 200
R5 - 177663
¤
как я уже говорил, 8 команд MOVB R0,(R5) выполняются ровно за одну строку ( БК0011М, 4 Mhz, обычная память ), для справки на 6 Mhz также в обычном памяти - получается 12 колонов, 8 из них видимы на экране ( 4 "обратный ход луча" )
но если например одну из команд сделать CLRB (R5), то она выполнится быстрее чем MOVB R0,(R5)
CLRB (R5) по сути включает 0-ой экран и 0-ую палитру
¤
Да, ещё замечено, что экран и палитры переключаются не одновременно, вначале переключается палитра, а через 8 пикселей переключается экран, можете проверить, пока думаем тоже как заюзать данную возможность )
-
? Lasoft / Excess team@ - 19.08.2018 17:05
прошу прощения, в коде выше несколько ошибок
¤
1.конечно же не BR 0, а BR FRAME_LOOP
2.запуск таймера не CLRB @#177662, а CLRB (R5)
¤
3.в качестве эксперимента, пробовал ещё вот так:
0:TST (R0) ; ждём пока таймер дотикает до нуля
BNE 0
1:TST (R0) ; ждём пока не пробьёт ноль
BEQ 0
такой финт тоже пробовал...
-
? Lasoft / Excess team@ - 19.08.2018 17:06
0:TST (R0) ; ждём пока таймер дотикает до нуля
BNE 0
1:TST (R0) ; ждём пока не пробьёт ноль
BEQ 1 ; конечно же вот так
¤
не очень удобный форум ( можно тут как-то редактировать сообщение? или система "нипель" ? )
-
? gid - 19.08.2018 21:25
>>? Lasoft / Excess team@ - 19.08.2018 16:26
[ты с чем-то был не согласен, но сам же противоречишь]
Я был не согласен с выражением "частота таймера == частота процессора" потому что "частота таймера = частота процессора / 128"
Это немного разные частоты, хоть и полностью синхронны.
¤
[луч может отлавливаться теперь уже в другом месте ( до 10-ти вариантов )]
Вот так вот работает ВП1-037 и 4МГц или 6МГц частоты БК, никогда не угадаешь. Время выполнения команды зависит от того, какой была предыдущая команда (для 4МГц - 6 или 8 вариантов на каждую команду, для 6МГц - 12 или 16 вариантов на каждую команду), а её время выполнения - от того какая было до неё, и так вплоть до включения питания. А какая фаза установилась при включении ВП1-037 - зависит от рандомно инициализировавшихся триггеров внутри микросхемы. Всего 4 варианта, некоторые маловероятны, некоторые - максимально вероятны.
¤
>>? Lasoft / Excess team@ - 19.08.2018 16:42
[> Напоминаю, время исполнения MOV R0,R0 -- 2 слова пикселей.
Это не правда )]
Это правда только для 3МГц частоты процессора, для остальных частот - нет.
¤
>>? Lasoft / Excess team@ - 19.08.2018 16:51
[экран и палитры переключаются не одновременно]
Палитра переключается "абсолютно мгновенно", как только изменится значение в регистре палитры, а экран переключается синхронно с фазами работы ВП1-037
¤
>>? Lasoft / Excess team@ - 19.08.2018 17:06
[можно тут как-то редактировать сообщение?]
Нельзя. Все ошибки и опечатки сохраняются для потомков. Если их стесняетесь - просто 7 раз перечитайте своё сообщение перед отправкой.
¤
Единственно возможный вариант не зависеть от конкретного экземпляра БК - придумать алгоритм, который сперва бы или рассчитывал нужные коэффициенты, в зависимости от фазы работы, или бы добивался стабильно нужной фазы работы.
-
? tim - 17.10.2018 17:42
Господа программеры, ни у кого не возникала мысль реализации эмулятора БК в рамках RetroPie ? см. https://github.com/RetroPie/RetroPie-Setup/wiki
Спек там уже :)
-
? Maxvel - 23.10.2018 00:34
Решил написать сюда!
В новой версии от 15 октября была найдена отломаная функция - почему то в дампе регистров процессора в тактовой чистоте после замены хотя бы одной цифры происходит какая то ерись а не то что нужно.
-
? gid - 23.10.2018 13:38
У меня ереси не происходит, делается именно то, что нужно, а именно - изменение частоты.
Вот только, если задать частоту меньше 1МГц происходят разные непонятные процессы. Иногда начинается самовольный Trap To 4. Ни отловить причину, ни отладить пока не удалось. Это очень древний косяк, проявивший себя сразу после того, как я сделал эти контролы и стало можно менять частоту на лету. Пока знаю, что это из-за прерываний, а как и почему - не знаю.
-
? Maxvel - 23.10.2018 14:23
Могу видео дать.
-
? Maxvel - 23.10.2018 14:40
вот два видео ролика
ОС win10 1803 для информации возможно проблема и в ОС
первый ролик версии от 9 июля вроде
а второй от 15 октября
¤
https://yadi.sk/i/c4uKdAS7Ed2W8Q
¤
https://yadi.sk/i/fz5ehRi9wq1cRg
-
? gid - 23.10.2018 15:48
Объясняю что происходит:
в прошлой версии, при редактировании поля значение проверялось на граничные условия, но не обновлялось, если выходило за границы. Это легко увидеть, если смотреть на частоту в статус баре.
Вы удаляете цифру 4, т.о. рабочая ТЧ стала 0, а нуль - нельзя, оно поправляется ни минимально возможную - текущая частота дискретизации звука * 10, в статус баре показывается - 441000.
Потом вводите цифру 6, т.о. рабочая ТЧ стала 6000000.
¤
А в текущей версии, мало того что значение проверяется на граничные условия, оно ещё при этом и корректируется в поле ввода.
Вы удаляете цифру 4, т.о. рабочая ТЧ стала 0, а нуль - нельзя, оно поправляется ни минимально возможную - текущая частота дискретизации звука * 10. И она корректируется в поле ввода, там стало 441000.
После этого вводите цифру 6, т.к. количество символов не изменилось. было 000000, стало 441000, то курсор остался на месте и цифра 6 ввелась перед числом 441000, и т.о. текущая ТЧ стала 6441000.
¤
В общем-то не очень хорошо получилось. Я уберу коррекцию поля ввода. Есть альтернатива - заканчивать ручное редактирование ТЧ в поле ввода обязательным нажатием Enter, но там кода больше и я поленился делать это.
-
? Maxvel - 23.10.2018 18:00
Ага понятно, так же я думаю к функции «загрузка ленты» будет наверное добавить кнопку останова загрузки или воспроизведения так как при выдерание картинок с ZX этой кнопочки или функции сильно не хватает а слушать файл целиком как то камельфо.
К примеру: начинаем грузить с ленты массив данных выбираем файл для загрузки (типа магнитофон) грузим файл (к примеру выдираем картинку из любой игрушки со спектрума), файл или массив данных необходимый для работы загружен но остановить воспроизведения звукового файла (tap, bin, wav) возможности нет, очень не удобно.
-
? tim - 23.10.2018 18:18
Неужели кто-то ещё до сих пор сидит с магнитофоном?! 🤦
-
? Maxvel - 23.10.2018 18:54
Да я вообще заметил токую тенденцию что эмулятором интересуюсь только я а магнитофон эээ ностальгия. Вот тут к стати еще вопросик возник - Есть ли возможность сделать так что бы эмулятор понимал диски от спектрума или это много муторно реализовать на его платформе?
-
? gid - 23.10.2018 19:36
[к функции «загрузка ленты» будет наверное добавить кнопку останова загрузки или воспроизведения]
Такая кнопка есть с самого начала. Она находится в окошке "Управление чтением/записью лент" (кнопочка с квадратиком) Она становится активной, если выключены опции эмуляции загрузки/сохранения ленты, т.е. если вы можете запустить на воспроизведение Wav файл, то и остановить его в любой момент тоже можете, этой самой кнопкой. Горячих клавиш у неё нет, поэтому только тыкать мышкой в неё.
¤
[Есть ли возможность сделать так что бы эмулятор понимал диски от спектрума]
Это чисто программная задача. Если кто-то напишет или когда-то писал драйвер чтения спектрумовских дисков на БК, то это будет возможно.
А писать специально какой-то транслятор, чтобы диски понимались БКшкой как родные, что-то тяжко. проще использовать сторонние проги. Сперва на РС выковыривать нужные файлы с диска или образа диска Спектрума, а потом заковыривать их на образы дисков БК с помощью BKDE, а потом использовать образ в эмуляторе.
-
? tim - 23.10.2018 20:50
>>тенденцию что эмулятором интересуюсь только я а магнитофон эээ ностальгия.
Ну слава,Богу что есть ещё Вы, и люди, не понимающие сарказма. Без вас былл юы скучно
-
? Дмитрий - 23.10.2018 22:59
Есть же TRDCOPY - она понимает диски спека (чтение, поиск спрайтов). Образ .trd переименовать в img или dsk и "подключить" в дисковод.
-
? Maxvel - 27.10.2018 00:28
а вот за это спс. Попробуем.
-
? Дмитрий - 03.12.2018 17:08
В CHDD::configure проверяется служебный сектор на валидность.
¤
BYTE cs = 0;
for (int i = 0; i < 511; ++i)
{
cs += m_pSectorBuffer.b[i];
}
cs = -cs;
¤
В чем смысл cs = -cs, если BYTE беззнаковый тип?
-
? gid - 03.12.2018 19:16
Так положено по алгоритму расчёта КС, нужно менять знак результата суммы. исходники можно посмотреть в прошивке АльтПро.
к счастью компилятор си не считает себя умнее программиста. Сказано поменять знак, значит будет поменян знак. Даже у беззнакового типа. Это просто ассемблерная команда neg al, а уж как интерпретировать содержимое al, это решать программисту.
-
? a214 - 13.12.2018 05:12
ув. gid - когда-то давно у Вас на сайте была программа на Бейсике про чтение и вывод файла на магнитофон ... нет давно уже магнитофонов но вход БК при первичной загрузке (команда М) есть ...
-
? gid - 13.12.2018 09:21
Вы уже не первый такое спрашиваете. Но я понятия не имею о чём речь. Я никогда не увлекался бейсиком и не было у меня никаких программ на нём.
Что за программа такая на бейсике? Бейсик же сам может и читать и писать с/на магнитофон(а). там есть команды LOAD,CLOAD,BLOAD/SAVE,CSAVE,BSAVE. Не нужны бейсику никакие программы чтобы работать с магнитофоном.
Кто-то в прошлый раз спрашивал про программу на бейсике для РС. Я недавно случайно в архиве Макса Багаева наткнулся на какую-то прогу, может это она http://pdp-11.ru/mybk/PC_Util/bk-mg/
-
? Дмитрий - 15.12.2018 00:39
Что-то не въеду в логику работы 48-битной адресации в плане чтения регистров. В доках ATA6 указано, что при 8-битных регистрах можно использовать регистры 1F2-1F5 как 16-битные путем "текущей" и "предыдущей" записи. Т.е., как я понял, для задания кол-ва читаемых/записываемых секторов более 256 пишем в регистр 1F2 сначала старшие 8 бит и следом младшие 8 бит. Точно также и с адресом LBA сектора в регистрах 1F3-1F5. Так вот чтение этих данных производится при манипуляции бита HOB (7-й бит регистра 1F7, т.е. командного регистра). Выставленный в 1 он дасти прочитать из 1F2-1F5 старшие части, а при HOB=0 - младшие. Но как его выставить - ведь это же командный регистр? Нельзя же просто взять и записать в 1F7 значение 0x80.
¤
А в доках АТА8 никакие HOB не указывается и не описываются, а говорится, что регистры для LBA уже 16-битные. Плюс непонятно, как устройство может выполнять 32 битный I/O, если регистр данных 16-битный?
-
? gid - 15.12.2018 09:18
Я в этом даже не разбирался, т.к. всё это завязано на ДМА и без ДМА не работает, посему для БК не имеет смысла.
Максимум, что можно - 24 битный ЛБА доступ через ПИО моде.
¤
Там, чем дальше в лес, тем толще партизаны, все эти АТА6 и далее рассчитаны на большие скорости и большие объёмы данных, там уже даже со старыми стандартами нет совместимости. Переключаешься в этот режим, и всё - по тем же адресам совсем другие регистры с другим назначением.
-
? Дмитрий - 21.12.2018 00:34
Возник вопрос по процедурам SMK в плане чтения/записи HDD. Какой умник написал так, что проверка на ошибку НЕ производится сразу ПОСЛЕ подачи команды считывания/записи данных, а выполняется после считывания самих данных? Имхо это неверно. Ведь если произошла ошибка, допустим, позиционирования или отсуствия маркера, то будет выставлен бит соответствующей ошибки. Или попадется битый сектор, попытки считывания закончатся и опять-таки выставится бит ERROR. А п/п тупо ждет сброса бита BUSY, а затем ждет выставления бита готовности данных и при его наличии выполняет чтение. А получается, что читать-то нечего - голова не дошла по адресу сектора (или сектор битый), BUSY сброшен, а бита готовности данных нет и не будет. Правильнее будет подать команду, выждать сброс бита BUSY, проверить бит ERROR и только после его отсутствия проверять бит наличия данных и читать оные. А в прошивке имхо бред.
-
? gid - 21.12.2018 09:41
Когда я искал исходники эмуляторов HDD, я нашёл три штуки, из них самый простой для понимания оказался исходник libspectrum.
http://fuse-emulator.sourceforge.net/libspectrum.php на тот момент версия была 1.0.0. Вот оттуда я и взял весь код почти без изменений, только из С сделал С++ и в класс это всё обернул.
Умники, которые так написали: Copyright (c) 2003-2004 Garry Lancaster, 2004 Philip Kendall, все вопросы к ним.
Насколько там всё было правильно, меня не волновало, главное - вся эта штука на БК заработала при минимуме усилий с моей стороны.
-
? gid - 21.12.2018 11:04
Хотя нет. У меня код - гибрид из libspectrum и unreal speccy версии 0.35b2. Собственно эмуляция HDD - преимущественно из libspectrum, и что-то возможно из unreal speccy. Я обычно когда есть выбор разных реализаций, беру себе ту, что проще понять, как работает и как мне кажется более правильнее работает. А эмуляция интерфейса ATA взята из unreal speccy.
-
? Дмитрий - 21.12.2018 14:48
Я не про исходники эмуля, а про исходники прошивки SMK - там напортачено.
-
? gid - 21.12.2018 16:36
блин, невнимательно прочитал. Зато, нашёл тут про LBA48.
В исходниках unreal speccy 0.38.4 в hdd.cpp можно поглядеть. Там оказывается, есть два блока регистров 1f0-1f7
и в первом блоке регистры 1f3-1f5 - это младшие 24 бита LBA, а во втором блоке эти же регистры - старшие 24 бита LBA.
Вот как получается якобы 16 битность. И переключается это через бит HOB в регистре 3F6, а не 1F7.
-
? Дмитрий - 21.12.2018 17:15
С LBA48 я тогда разобрался по спецификации, непонятка была именно с чтением регистров 1F3-1F5. Бит HOB нужен для чтения содержимого этих регистров. Согласно спецификации при HOB=1 читается старшая часть регистра, при =0 - соответственно младшая. Запись в регистр осуществляется байтами (при любой записи в регистры HOB сбрасывается) и предыдущее значение сдвигается в старшую часть Reg_1F5 = (Reg_1F5 << 8) | NewByte. Т.е. сколько раз в регистр не пиши - запомнены будут последние два байта.
-
? Дмитрий - 24.12.2018 01:55
Что-то мне склероз уже изменяет: на БК читались данные по 0хEC, а потом переворачивались все или переворачивались только строки с моделью и т.п.?. А то в CHDD::configure() из служебного сектора читается конфигурация образа
¤
m_nCylinders = m_pSectorBuffer.w[1];
m_nHeads = m_pSectorBuffer.w[3];
m_nSectors = m_pSectorBuffer.w[6];
¤
и данные берутся без swab. Получается, в служебном секторе .hdi (и у винта) только текстовые данные перевернуты, а числовые нет?
-
? gid - 24.12.2018 07:44
да. по каким-то непонятным или исторически забытым причинам только текст в таком виде.
-
? Дмитрий - 08.01.2019 21:51
Не пойму почему так: в CBKView::EmulateKeyDown есть строки
¤
//если ещё прошлый код не прочитали, новый игнорируем.
if ((board->m_reg177660 & 0200) == 0)
¤
но в описании регистра 177660 говорится, что бит7=1 означает, что в 177662 есть код и надо его считать и при его наличии нажатия игнорируются до сброса. Т.е. по описанию должно быть if ((board->m_reg177660 & 0200) != 0).
-
? Дмитрий - 08.01.2019 23:30
И далее надо не установить 7 бит в 177660, а сбросить его. В итоге:
¤
//если ещё прошлый код не прочитали, новый игнорируем.
if ((board->m_reg177660 & 0200) != 0)
{
//сюда заходим только если прочитан прошлый код
board->m_reg177662in = nScanCode & 0177;
board->m_reg177660 &= ~0200;
board->KeyboardInterrupt((vkbdvw->isAR2Press()) ? INTERRUPT_274 : nInt);
}
-
? Дмитрий - 08.01.2019 23:31
блин... вечно путаюсь в этих равно-не равно. Все верно...
-
? Дмитрий - 16.01.2019 11:40
Я все никак не могу допереть - как сделать синхронное "тикание" тактов и выполнение инструкций (вернее синхронный учет затраченных тактов на выполнение)? Ведь во время выполнения инструкции таймер продолжает считать, тактовый генератор тоже не ждет проц, движок дисковода продолжает вращаться и т.д. Хоть там и микроскопические задержки, но все равно так неправильно. Максимум пока что пришло в голову - разнести выполнение инструкций и таймер со счетчиком тактов в разные потоки. Счетчик тактов работает только во время выполнения инструкций (ExecuteFrame). Но как синхронизировать это все? Если один поток считает такты и там же: учитывается таймер, медиа-такты и пр. В данном случае счет будет независим от выполнения. Но! Допустим выполняется инструкция и ее "время" 10 тактов, которое мы получим уже после выполнения. Поток с таймером и счетчиком тактов продолжает свою работу во время выполнения. По идее надо считать значение счетчика тактов до выполнения инструкции, выполнить инструкцию, прибавить время выполнения команды и ждать в счетчике полученного значения. Но счетчик тактов считает на полной скорости хостового проца и, скорее всего, счетчик давно пройдет эти 10 тактов. А дальше... дальше мысль обрывается...
-
? gid - 16.01.2019 12:35
Я тоже не знаю. Поэтому сделал так, как сделал.
А настоящее синхронное "тикание" тактов и выполнение инструкций можно сделать только полной потактовой эмуляцией полноценной модели процессора на основе кода в верилоге. У меня такая модель может работать на частоте максимум 500Мгц и ни в какую быстрее не получается. И это без всего остального, только процессор и память с 0-тактовой задержкой.
-
? Дмитрий - 16.01.2019 13:28
Код на верилоге (или на Си) - помню, читал. Там мрак. Хоть и Си-подобный, но черт ногу сломит. А есть уже эта модель в коде, отличном от верилога? Я уже неоднократно думал убрать к чертям это поддержание частоты 100МГц, убрать фреймы и "запустить" проц на макс. возможную частоту, которую может дать эмуляция на хост-процессоре. Тогда не надо будет синхронизироваться с тактами эмуляции команд. К тому же я так и не придумал как обойти эмуляцию индекса на гибком диске.
¤
В качестве звукового чипа хочу прицепить эмулятор Nuked OPL3 Алексея Хохлова, который в инете считают едва ли не самым лучшим и точным. Но есть только модуль, а как его использовать (с какой частотой снимать данные с рендера каналов для заполнения звукового буфера) - примеров не нашел. Писал ему в ЛС на тюбике, но он не ответил.
¤
И еще. У таймера 42,9 мкс это полный цикл с множителем х1 и начальной константой 0? Расчетый получается 42,66 мкс. У 11(М) на 4Мгц ровно 32 мкс.
-
? gid - 16.01.2019 15:47
Есть эта модель на Си. Но там такой же мрак. Как было в 2016 году нифига не получалось, так и до сих пор всё в таком же состоянии. http://gid.pdp-11.ru/f/vm1cpp.rar
Код только рефакторится время от времени, когда настроение есть. Никаких улучшений не придумывается.
Вот модель 1801ВП1-037 там может работать аж на 6,5МГц, если только одна, сама по себе. Но толку от неё нету никакого.
-
? ejique - 18.01.2019 13:57
Здравствуйте gid. Скажите пожалуйста, планируется ли эмуляция джойстика (usb). В эмуляторе3000 usb джойстик работает, но сам эмулятор жутко глючный и все время падает.
-
? gid - 18.01.2019 14:50
У меня нет джойстика. Поэтому я не знаю как проверить работоспособность того, что я наэмулирую.
У меня есть гейпад (именно так, т.к. с помощью этого унылого поделия я не смог поиграть ни в одну игру на ПК, т.к. очень неудобно). И изредка я думаю, что надо бы что-то сделать такое, но полежу немного - и проходит.
-
? ejique - 18.01.2019 21:49
gid, спасибо за ответ) собственно говоря у меня тоже usb геймпад обычный, наподобие геймпада от sega genesis. Я на нем прошел space Савельева на эмуляторе3000. Очень удобно. Но ваш эмулятор работает стабильно, и вообще лучший на мой взгляд. Но вот джойстика очень не хватает. На клавиатурке в бкшные аркады не особо пошпилишь)
-
? Лёха Башой - 22.01.2019 12:41
Вопрос по эмулятору. А можно ли в эмулятор прицепить TRACE.LOG работы процессора. Я часто копаюсь в коде - облегчило бы жизнь. Пусть очень медленно - не принципиально.
Дамп регистров каждую команду + Состояние таймера.
-
? gid - 22.01.2019 13:18
Принципиально - ничего сложного в этом нет. Прицепить можно, но быстроту не обещаю, не знаю, когда заняться смогу. И если таймер имеется в виду 177706-177712, то могу сказать сразу - он будет врать, т.к. эмуляция ничего общего с реальностью не имеет. Тайминги команд неверные, эмуляция процессора приблизительная. Поэтому то, что покажет таймер в эмуляторе и в реальности - две большие разницы.
-
? Лёха Башой - 22.01.2019 13:23
Мне не суть, врёт или не врёт. Мне как точка привязки. Кстати попробовал точки останова, пошаговое. Сильно поломан отладчик. Точку останова не подсвечивает в листинге. Соответственно непонятно как её снимать. На команде RTI сделал пошаговый - потерял управление. Придется вернуться в 3.0 для текущей задачи.
-
? Лёха Башой - 22.01.2019 17:00
А да.. Еще (ну хочется) чтобы в лог попадали фактические чтения памяти (особенно при косвенных адресациях). PDP-11 бывает крайне сложен в понимании логики программы.
Каждый раз гулять дважды в память за косвенной адресацией тяжко. Видимо придется компилить эмулятор самому))
-
? gid - 23.01.2019 09:58
Всё нормально в отладчике. И точки останова никуда не деваются. Работоспособность эмулятора проверяется на Вин10, Вин7 (правда чистые девелоперские, не засранные всяким софтом) и ВинХР (на виртуалке, тоже вообще голая ХР без ничего).
Дважды кликнул мышой на строке в поле точки останова - точка поставилась, дважды кликнул мышой на точке останова - снялась. Лень кликать - то же самое можно делать клавишей F9, но там точка ставится/снимается только на той строке, которая выделена жёлтым курсором.
¤
[На команде RTI сделал пошаговый - потерял управление.]
Если делал это клавишей F10 - всё правильно, управление теряешь и должен вернуть будешь по адресу за командой RTI, что маловероятно. Чтобы не терять управление, нужно делать это клавишей F11.
Все команды, которые изменяют в результате свое работы PC лучше трассировать клавишей F11
¤
[Видимо придется компилить эмулятор самому]
Вот это самое верное решение. Потом результатами поделиться не забудьте, чтоб все могли пользоваться.
-
? Лёха Башой - 23.01.2019 15:31
Еще раз проверил (3.9 XP Версия). Ни мышкой ни клавишами точка останова не поставилась.
-
? Лёха Башой - 23.01.2019 15:31
Ни кнопкой "Точка останова" в меню)
-
? gid - 23.01.2019 19:46
Однако точно, не работает. Но тот же самый код работает в Вин7, значит микрософт где-то в своём апи подгадил.
И наверное там ещё много где чего по мелочи не работает.
Мне проще сказать, что ВинХР больше не поддерживается, чем даунгрейдить код из С++11 в С++99 и собирать его в VS2008 под ХР.
Пусть найдётся энтузиаст, который будет делать это для себя.
-
? Лёха Башой - 23.01.2019 22:55
О времена)) В 2001м году кто бы знал что через 18 лет на XP не будет поддерживаться даже эмулятор БК-0010 )))
-
? gid - 24.01.2019 09:58
При более внимательном изучении, оказалось, что всё работает, просто в ВинХР не отображаются иконки. В Вин10, Вин7 отображаются, а в ВинХР - эта же самая иконка не отображается.
Я вообще не понимаю, как так получается, иконки в одном и том же графическом формате, одной и той же битности, в одних случаях отображаются, а в других - нет. Чего им не хватает, хер знает. Поэтому обычно беру уже готовые, нарисованные людьми, которые соображают в них.
-
? Дмитрий - 24.01.2019 10:22
2 gid: Эмулятор GameBoy https://habr.com/ru/post/154901/ - никаких таймеров/задержек, частота эмулируемого проца используется только для вычисления в звуковой части SamplePeriod, все выполняется на скорости хост-проца. Гляньте на досуге, мб какие мысли придут. Ссыль на гитхаб есть в статье.
-
? Лёха Башой - 24.01.2019 11:56
Фикс будет? )) Пусть вместо пупырушка хоть котик.. Лишь бы можно было пользоваться)
-
? Лёха Башой - 24.01.2019 12:41
Конфигурация .01 + 32кб ОЗУ.. попытка записи в 140000+ приводит к классическому СТОПу.. Как доп ОЗУ реализовано? Думал просто память. Пиши да гуляй)
-
? Лёха Башой - 24.01.2019 13:11
Кажется понял.. Никакой доп.памяи)) Только монитор. У меня в моей БКшке на столе в страницах 120,140,160 статика)
Можно прикрутить ОЗУ туда? ))
-
? Лёха Башой - 24.01.2019 13:20
Хотя написано )) доп.ОЗУ ))
-
? gid - 24.01.2019 13:43
>>? Дмитрий - 24.01.2019 10:22
Я в общем-то так и делаю. Синхронизация делается по звуку. А таймеры и ожидание - на всякий случай, если в системе нет вообще звуковой подсистемы, то начнут работать они, а когда она есть - никто никого не ждёт.
¤
>>? Лёха Башой - 24.01.2019 11:56
Фикс будет. Скоро.
¤
[Конфигурация .01 + 32кб ОЗУ.. попытка записи в 140000+ приводит к классическому СТОПу..]
Так и должно быть. там пусто. туда писать нельзя.
Я как-то забыл отразить эту херню в документации. Потому что подразумевалось, что все и так знают как этот расширитель ОЗУ работает.
Доп ОЗУ подключается по адресам 120000-140000, банком 8кБ. Всего 4 банка. Для подключения нужного банка надо записать его номер в любое место по адресам 100000-117777.
Кто и зачем придумал такое нерациональное решение - без понятия. Вот если бы был ещё блок МСТД, с фокалом по адресу 140000 и тестами по адресу 160000, то было бы понятно. а так - чтобы всего 8кб ОЗУ и 16кб пустоты за ней, зачем надо - неясно.
Это оригинальная конфигурация из эмулятора Калмыкова, как есть. Я её вообще не трогал.
-
? Лёха Башой - 24.01.2019 14:39
Тогда просьба сделать еще одну конфигурацию. +24кб ОЗУ с 120.000
Конфигурация имеет право на жизнь)
Можно подгрузить свои версии фокала, бейсика или чего угодно. Отпатчить.
Во всяком случае у меня есть железо, было бы неплохо отлаживаться в эмуляторе.
-
? Дмитрий - 24.01.2019 14:53
>> Синхронизация делается по звуку
Что-то я тогда не пойму - как вообще эта синхронизация работает, если звук, допустим, выводится с частотой 44100, а проц, к примеру, 6МГц? Каким образом будет синхронизация выполнения команд, если эмуляция выполняется на частоте хост-проца?
-
? Лёха Башой - 24.01.2019 15:09
Звук вероятно пакетами отправляется в звуковую карту. Ушел пакет - пошли готовить новый пакет путем запуска эмуляции)
-
? gid - 24.01.2019 15:46
>>? Дмитрий - 24.01.2019 14:53
[Каким образом будет синхронизация выполнения команд, если эмуляция выполняется на частоте хост-проца?]
В целом, принцип работы такой же, как и описано в статьях на хабре. Есть коэффициент пересчёта тактов проца в частоту дискретизации звука (или наоборот), т.е. сколько за 1/44100Гц выполняется тактов процессора, чтобы синхронизировать генерируемый звук с реальным временем.Просто у меня есть ещё и фрейм - пережиток прошлого, от которого можно в принципе и отказаться. Раньше он нужен был для синхронизации вывода видеокадров, но сейчас видео тоже синхронизируется с частотой проца через коэффициент пересчёта частоты проца с частотой работы ВП1-037 6МГц. Мне неохота за это браться, там слишком много ломать надо будет.
¤
>>? Лёха Башой - 24.01.2019 14:39
Есть уже такая конфигурация, и даже лучше, называется БК10+СМК.
В зависимости от режима работы СМК можно сделать ОЗУ по адресам 120000-157777, или вообще все 64КБ ОЗУ, с разными нюансами.
-
? Лёха Башой - 24.01.2019 15:59
А можно инструкцию? Как перевести диапозон 120-177 в ОЗУ. Не было у меня СМК никогда.
-
? gid - 24.01.2019 16:29
Вот там: http://www.bk001x.ru/forum/121-104-1
-
? Дмитрий - 24.01.2019 17:59
>> синхронизировать генерируемый звук с реальным временем
Т.е. 6МГц/44100Гц = ~136 тактов, получается, что каждые 136 тактов я должен записать в звуковой буфер 2 сэмпла (L+R) и по заполнению буфера проиграть его, а заполнять следующий. И, следовательно, таким же образом рассчитать через сколько тактов я должен буду вывести 1 строку изображения на экран, через сколько тактов "тикнуть" таймером и т.д. и т.п. Но вся фигня в том, что все эти действия нужно выполнять одновременно, иначе все поедет из-за неравномерного времени выполнения эмуляции команд. Тут я вижу только один вариант. Сделать главный поток "тактового генератора", которому на старте передать через сколько тактов делать вывод звука, сработка таймера, вывод строки изображения (или одной точки) и т.д. Все эти вспомогательные потоки запускаются, но ждут разлочки каждый своей переменной. А "генератор" сам разлочит нужную через определенный промежуток. Но "тикание" генератора - тупое увеличение переменной на 1 + несколько проверок не нужно ли кому выполнить свою часть работы. А эмуляция команды может выполняться дольше числа тактов, отведенных на нее. В результате генератор "утикает" дальше, чем число тактов и получится рассинхрон.
-
? gid - 24.01.2019 19:45
и тут мы приходим к пониманию, чем симулятор отличается от эмулятора.
¤
[Сделать главный поток "тактового генератора"][- тупое увеличение переменной на 1 + несколько проверок]
....
[А эмуляция команды может выполняться дольше числа тактов]
А для этого и нужен точный потактовый эмулятор процессора, которому на вход будет подаваться тик тактового генератора, и процессор будет считать, и сам, когда надо будет делать ввод/вывод по шине МПИ с точного потактового эмулятора контроллера памяти ВП1-037, который заодно ещё будет и видео рисовать.
¤
Пока этого нет, придётся обходиться примерной эмуляцией, и делать так, чтобы было хотя бы приблизительно как в реальности.
-
? Лёха Башой - 24.01.2019 20:07
А кто-нибудь может описать точно как ВП1-037 работает?
В схемы и диаграммы не тыкать, я их понимаю только при очень большой нагрузке на примитивном уровне)
192 тика генератора (3Mhz) уйдет на ТВ строку. Из них будет прочитано (необходимость) 32 слова по 16 бит. Это займет 128тиков. 64 тика на отрисовку бордюров и обратный ход луча.
Есть подозрение что машинное слово(16 бит) может быть прочитано не быстрее чем за 4 тика. (2 тика отдано ВП1-037), 2 тика отдано процессору.
Опять же. Диаграмм не знаю - могу чушь пороть. Но близкую к реальности.
-
? Лёха Башой - 24.01.2019 20:15
Если разбить эмуляцию процессора в каждой команде на стадии (чтение памяти / внутренние операции / чтение памяти / внутренние).
И жить этими категориями, то можно сделать эмуляцию всего в одном потоке. Пусть будет не совсем точно.
Но один процесс дойдя до нужной стадии будет снимать 16 бит для видео, состояние системного регистра для звука, чтение или запись памяти для CPU.
А далее мы будем редактировать только таблицу команд.
¤
Для старта я бы разделил всё время пополам. Ввел бы таблицу тиков ближайших событий (чтение видеопамяти / чтение данных с шины).
Как-то так. Готов попробовать написать такой код.
-
? Лёха Башой - 24.01.2019 20:31
Кстати подозреваю что память для видео нужно читать почти постоянно, 32 слова. Каждые 4 такта. И в этом есть определенное ускорение.
If(VideoUpdate) Get_Next_Video_Word();
¤
...
VideoCounter++;
If(VideoCounter > 32) VideoUpdate=0;
if(VideoCounter > 32+16) { VideoUpdate=1; VideoCounter=0; }
-
? Дмитрий - 24.01.2019 21:23
>> и тут мы приходим к пониманию, чем симулятор отличается от эмулятора.
Да тут не важно - симулятор или эмулятор. Я сферически говорю. А в моем случае можно сделать так, чтобы генератор "останавливался" перед выполнением команды (фактически вызов TranslateInstruction), по возврату к счетчику прибавляется время в тактах выполненной команды (мы же затратили время). Ну и далее проверки - надо ли было кому-то что-то сделать. Генератор объединить с таймером, чтобы убрать лишний поток.
¤
>> нужен точный потактовый эмулятор процессора
А для этого нужны все точные растактовки для каждой команды (коих нет, только "на глазок" измеренные), для каждого метода адресации, для чтения/записи памяти.
¤
>> можно сделать эмуляцию всего в одном потоке
В принципе можно, но с ростом частоты погрешность будет увеличиваться.
¤
-----
Кстати, этот InterlockerExchange и класс под него - расточительство. Я сделал так (не совсем понимаю как на Си написать):
¤
var
MemLock: dword; // вместо класса LockVarType
¤
procedure Lock(var LockVar: dword); assembler; // адрес переменной будет в EAX
asm
@1:
CMP [EAX],0
JNZ @1
LOCK INC [EAX]
end;
¤
procedure Unlock(var LockVar: dword);
begin
LockVar:=0; // или LOCK DEC [EAX]
end;
¤
и все. Все отлично работает (проверено), не надо специально проверять в цикле переменную на !=0 для залочки. Просто Lock(переменная) в нужном месте и Unlock(переменная).
-
? Лёха Башой - 24.01.2019 21:53
Думаю что инструкция CMP [EAX], 0 в цикле - будет жрать процессор... Смысл LOCK - сделать INC атомарным, чтобы этот код мог в разных тредах запускаться одновременно.
-
? Лёха Башой - 24.01.2019 22:08
Был кстати какой-то классический алгоритм на 2-3х переменных для организации блокировки выполнения. Без ассемблера.
-
? Дмитрий - 24.01.2019 22:27
LOCK гарантирует, что только один поток будет иметь доступ к ячейке на запись.
-
? Лёха Башой - 24.01.2019 22:32
Есть еще одна инструкция без префикса LOCK которая гарантирует эксклюзивный доступ к содержанию ячейки)) XCHG [EAX], EBX
-
? Дмитрий - 24.01.2019 22:59
Можно и ее. Но XCHG требует использования еще одного операнда, а INC/DEC одного. Кстати InterlockerExchange как раз ее и юзает.
-
? Дмитрий - 24.01.2019 23:00
Тьфу, соврал. cmpxchg она юзает.
-
? gid - 25.01.2019 09:46
>>? Лёха Башой - 24.01.2019 20:07
[А кто-нибудь может описать точно как ВП1-037 работает?]
Могу дать почитать описание модели на верилоге. Теперь оно всем доступно на гитхабе https://github.com/1801BM1/k1801/blob/master/037/rtl/va_037.v
¤
>>? Дмитрий - 24.01.2019 21:23
[А для этого нужны все точные растактовки для каждой команды]
Если кто-нибудь сумеет модель на верилоге преобразовать из описания мелкоты на лог.элементов в описание функциональных блоков, то будет быстрая потактовая модель, а пока есть только то, что сделал Patron. Я вроде бы давал ссылку. http://emulator.pdp-11.org.ru/DVK/MPI/distr/MPI_API_v1.1.zip
Там эквивалентная потактовая модель, которая по словам Patronа в точности соответствует верилог модели, но более быстрая.
-
? Лёха Башой - 25.01.2019 11:23
Ниасилил. Не увидел даже где он память вычитывает. Может оно там и есть в завуалированной форме)) Но понять логику работы не зная всей картины целиком...
Проще проанализровать поведение "монитора" при запуске тестов.
-
? gid - 25.01.2019 12:14
Ну так вся картина целиком и описана в файле.
А он нигде память не вычитывает. И никогда не занимался этим. Он выставляет адрес микросхемам памяти, и команду - читать данные с шины или выдавать данные на шину. А читает и пишет их процессор.
А в цикле видеовывода - читает данные ИР13 и потом побитно формирует точки на экране.
-
? Лёха Башой - 25.01.2019 16:56
Ну вот собственно этого я и не увидел. )) Паззл не сложился.
Поэтому и писал про точную модель чтения "видеопамяти". Как это мешает(согласуется) с работой процессора. И так далее.
Описал бы кто кому доступна вся картинка в голове. Сколько процентов времени шина занята формированием картинки. И так далее.
Посмотрел в параллельные файлы по 037 на гитхабе - там есть qbus_read/write.
-
? Лёха Башой - 25.01.2019 16:58
ИР13 - 8 разрядный регистр... Значит видеопамять читается побайтно или там всё же два ИР13?
-
? gid - 25.01.2019 19:43
[Описал бы кто кому доступна вся картинка в голове.], [ИР13 - 8 разрядный регистр... Значит видеопамять читается побайтно или там всё же два ИР13]
Для этого есть схемы электрические принципиальные БК10 и БК11(М)
¤
[Сколько процентов времени шина занята формированием картинки. И так далее.]
Диаграмм же сами просили не давать, а это там.
¤
Описывать всё это словами - получится большая и толстая книга. А она уже написана, называется "МИКРО-ЭВМ индивидуального пользования "ЭЛЕКТРОНИКА БК0010" М1.492.000 РД Инструкция по ремонту" в двух частях.
ищите там https://yadi.sk/d/c4FJ4g6YUFB3P файлы bk0010_rd_1_(DjVuPhoto).djvu и bk0010_rd_2_(DjVuPhoto).djvu
-
? Лёха Башой - 25.01.2019 20:56
А микрокод процессора доступен? ))
-
? gid - 25.01.2019 21:14
в большинстве своём, описан там https://github.com/1801BM1/cpu11/blob/master/vm1/doc/1801vm1.pdf
Верилог модели 1801ВМ1 где весь микрокод в бинарном виде описан, брать там https://zx-pk.ru/threads/23978-tsifrovaya-arkheologiya-1801-i-vse-vse-vse.html
-
? Дмитрий - 28.01.2019 11:09
Что-то я не пойму всей фишки синхронизации со звуком. Возьмем абстрактный проц с частотой X МГц. Есть звуковой чип с частотой Y МГц и частотой дискретизации 44100Гц. Все остальное пока отбросим. В итоге каждые Y*10^6/44100 тактов мы должны получить от чипа данные двух каналов и передать их в буфер. По заполнению буфера передать их на воспроизведение, а пока заниматься заполнением другого буфера.
¤
SoundSampleRate = Y*1000000 / 44100
¤
1) Проверяем - не наступило ли время выполнения очередной инструкции?
2) Да - выполняем инструкцию, получаем время ее исполнения в тактах, нет - увеличиваем число тактов проца на 1, уменьшаем число тактов прошлой выполненной инструкции на 1
3) Выполняем NextTick класса эмуляции звукового чипа (там он увеличивает число своих тактов на 1 и проверяет - не насчитали ли число тактов SoundSampleRate? Да - рендерим каналы и прочее, нет - выходим).
4) уходим на п.1
¤
И к чему мы тут привязываемся? К частоте звукового чипа? А получается привязаться к частоте проца можно только фреймами. Или есть какой-то другой способ привязки?
¤
И еще непонятно, почему в реализации YM2149 частота взята
¤
#define EMU_SOUNCHIP_FREQUENCY 3428572 //BK: (12Mhz / 7) * 2
¤
в 2 раза больше, чем реальная? А период в тактах вычислен вообще от max Integer?
-
? gid - 28.01.2019 13:20
[почему в реализации YM2149 частота взята ... в 2 раза больше, чем реальная?]
Потому что такой алгоритм реализации YM2149. Есть другие алгоритмы, там по другому сделано, напр. см. в BKBTL самых свежих версий на гитхабе.
А период в тактах как-то связан с битностью регистра тона. Внутренним, там получается 24 бита и за один такт частоты чипа меняется на одно значение заданным образом (насколько я разобрался в алгоритме)
¤
[И к чему мы тут привязываемся? К частоте звукового чипа?]
Вы решили привязаться к частоте звукового чипа. Это тоже вариант, но наверно не очень удобный.
¤
Я синхронизировался с частотой CPU. У меня через каждый интервал, равный CPUFreq/SoundSampleRate (4000000/44100) выполняется функция CMotherBoard::NextTick, которая формирует звук в звуковом буфере. В результате частота дискретизации звука получается как раз примерно 44100. А передискретизация звука из частоты генерации YM2149 в текущий SoundSampleRate делается в отдельной функции, реализации YM2149. В BKBTL в реализации YM2149 например сделано наоборот, там звуковой сопр. уже генерирует звук в заданной частоте дискретизации.
¤
Естественно, у меня, выполнение команды процессора, занимающей тактов больше, чем интервалов CPUFreq/SoundSampleRate и выполнение нужного количества CMotherBoard::NextTick выполняется последовательно друг за другом, а не одновременно. Потому что вот нихера не получается сделать малой кровью многопоточную реализацию, которая бы работала быстрее однопоточной. Там надо как-то умудриться сделать независимые потоки, которые бы никак не обращались к одной и той же области памяти одновременно, и как-то передавать им данные. Т.е. надо переписать всё с нуля, а то все ресурсы уходят на переключение контекстов и доступ к общей памяти, которая копируется из контекста в контекст.
¤
И вот, когда мы сгенерируем буфер с заданной частотой дискретизации, мы отправляем его звуковому устройству, а сами заполняем следующий буфер.
Буферы заполняются быстрее, чем звучат, в результате получится так, что все буферы заполнены, и чтобы отправить следующий буфер звучать, нужно ждать, пока отзвучит предыдущий. Вот тут и получается синхронизация с реальным временем звучания звука.
При этом чем больше у нас буферов, или чем больше их размер, тем больше отставание звука от реального положения дел. А если размер буферов маленький - то сильно повышается нагрузка на процессор. Тут надо искать компромисс.
-
? gid - 28.01.2019 13:25
[В результате частота дискретизации звука получается как раз примерно 44100.]
Ну вот, если процессор работает на частоте 4МГЦ и программа что-то генерирует, то при заданных условиях, звук получится именно такой. Т.е. воспроизводить его надо с настройками частоты дискретизации 44100 Гц.
¤
Если мы поменяем частоту процессора на 6МГц, то при заданной формуле, условия генерации звука останутся прежними, и он по прежнему будет генерироваться на частоте дискретизации 44100 Гц.
-
? Дмитрий - 28.01.2019 14:41
Кстати, эмуль OPL3, который я хочу попробовать прикрутить, вообще не оперирует частотой девайса. Там используется только его родная частота дискретизации 49716Гц. Так что для упрощения можно привязать проц с этой частоте (и вообще все звуковые буферы), потому как мешать звук, допустим, Ковокса на 44100 со звуком OPL3 на 49176 получится каша.
¤
>> Там надо как-то умудриться сделать независимые потоки
Вот у меня та же мысля. Поток проца работает независимо от других, но! Он для доступа к памяти использует глобальную interlock-переменную (я пока сделал так, ибо позднее, если дойдут руки, сделаю маппинг/блиттинг). И все потоки, которые должны обращаться к памяти, также должны ее использовать. А это можно сделать написав, к примеру, "внеклассные" единые для всех SetByte/SetWord с передачей не только внутреннего адреса и данных, но и адреса памяти БК. В них перед записью в память проверяется interlock-переменная на 0, далее она лочится и только в этом случае данные пишутся в память с поледующей разлочкой переменной. Либо написать эти функции на асме, юзая префикс LOCK с XCHG - в регистр EAX помещаем адрес в памяти, в DX - записываемое значение и пишем его в память с залочкой шины: LOCK XCHG word ptr[EAX],DX или LOCK XCHG byte ptr[EAX],DL. Все остальные потоки, обратившись к этой же ячейке в тот же момент, "замерзнут" на этой команде до окончания ее выполнения. В итоге любое кол-во потоков будут корректно юзать память без критических ситуаций. Или сделать в каждом классе-потоке свои SetByte/SetWord точно таким же способом.
¤
Но! Если внимательно рассмотреть ситуацию, то все это не нужно, ибо пишет в память только класс и поток проца. Видеоконтроллер только читает. Звуковой класс имеет свои буферы. Системные порты реализованы в виде переменных. А читать из одной и той же ячейки можно сколь угодно большому числу потоков. Все потоки привязать к работающему потоку проца. m_lockExecuteFrame проверять ВСЕМ потокам и работать только в случае его активности. Останов проца выполнять в паузах между фреймами и все остальные потоки суспендить (они стоят на проверке m_lockExecuteFrame). Если возникла нештатная ситуация, то выполнить останов со сбросом m_lockExecuteFrame в 0, а после обработки останова m_lockExecuteFrame=1 и поехали дальше. Как-то так...
-
? gid - 31.01.2019 14:41
Таки вот. Кому надо, скачивайте новую версию, где один единственный фикс - вернуты пропавшие иконки в ВинХР.
И куча внутренних изменений алгоритмов, которые могут где-то привести к тормозам, где-то наоборот, тут нужны бесплатные бета тестеры со своим многообразием конфигураций железа.
-
? Лёха Башой - 03.02.2019 14:15
Ув.тов.gid :) Идея для улучшения функционала эмулятора.
Видел такое в OpenMsx - возможность "впечатывания" текста через окошко интерфейса. Задаём кусок листинга - например на бейсике в текстовое окно.
Эмулятор сам используя прерывания "генерирует" последовательность кодов для ввода данной информации.
Очень удобная штука для разработки.
Я бы пользовался а не придумывал внешние конверторы )
-
? Лёха Башой - 03.02.2019 14:16
Соответственно сиё полезно для любых программ оперирующих с вводом информации с клавиатуры.
-
? gid - 03.02.2019 15:36
Идей я и сам нафонтанировать могу. Вы мне рабочий пример приведите. Напишите эту штуку и прицепите к эмулятору. А я дальше доделаю.
Экранная клавиатура в эмуляторе так и появилась. Один энтузиаст, которому было очень надо, взял и вкрячил, как сумел, клавиатуру. А я посмотрел в исходники, и сделал так же, только лучше. А потом оно само пошло. Улучшалось постепенно, и дошло до того, что есть.
Точно так же появились некоторые элементы интерфейса.
Так что нет ничего невозможного. Всё упирается в отсутствие желания шевелиться и морщить мозг у пользователей. И отсутствие знаний и умений у меня.
-
? Лёха Башой - 03.02.2019 23:23
Если бы я на своей XP мог бы компилить, я бы сделал)
Впрочем еще не вечер...
¤
Обычное текстовое окно как в notepad. С единственной кнопкой TYPE. При нажатии всё содержимое начинает с задержками уходить в эмулятор в виде прерываний по клавиатуре (30, 274).
Учитываются регистры РУС/ЛАТ и прочие. Работы прилично...
-
? Лёха Башой - 03.02.2019 23:59
Кстати есть и другой вариант.. Найти окно эмулятора в структурах Windows и посылать события о "нажатых" клавишах в него. Внешней программой.
Почти хакерский метод. Для меня он проще, где то валялся рабочий пример)
Но решение будет "не для народа".
-
? gid - 04.02.2019 07:39
В эмуляторе с самого начала есть скрипты. Делают абсолютно то же самое, но не из текстового окошка, а просто из текстового файла. Я этой штукой ни разу не пользовался. Только изредка проверяю - не поломалась ли, пока что-то другое улучшал.
Я не помню, можно ли запустить скрипт на исполнение в любое время, поэтому погляжу, как можно расширить функционал ихний.
-
? Лёха Башой - 04.02.2019 18:21
В интерфейсе скрипты каким образом задаются? Так чтобы что то выполнить... И есть ли в скрипте возможность СТОП нажать.
-
? gid - 04.02.2019 20:08
Драгндропом. Берёшь файл скрипта, и кидаешь его на окно эмулятора. То, что кинут именно скрипт, опознаётся по его расширению .bkscript.
Кнопку стоп нажать нельзя, потому что у неё нету аски символа. Но можно договориться, каким символом считать кнопку стоп.
Или ввести что-то вроде esc последовательностей, для служебной и не текстовой информации
И ещё, сейчас скриптообработчик вроде как поломался. Я пробовал на БК-11М в вортексе, там символы теряются. Хотя по алгоритмам не должны. Пока не нашёл решения кроме как сделать задержку побольше, чтоб символы пореже передавались.
-
? Лёха Башой - 04.02.2019 23:08
СТОП можно нулевым символом считать
-
? gid - 05.02.2019 07:47
Нулевой символ - сканкод клавиши шаг, и конец строки в Си
-
? Лёха Башой - 05.02.2019 18:19
ну если только кому то ШАГ нужно ввести скриптом...
А СИ к вводу с клавиатуры ну никакого отношения...
Можно любым кодом расширить функционал, тем же ШАГ например.. 0, 0 - ШАГ 0 FF - СТОП. Остальное по мере необходимости.
-
? gid - 05.02.2019 19:06
[ну если только кому то ШАГ нужно ввести скриптом...]
Ну вот кому-то СТОП нужно ввести.
Я не буду делать текстовое окно с эмуляцией ввода с клавиатуры. Почти это же самое успешно делает уже готовый функционал. Та правда не эмуляция нажатия клавиш, а тупо засылание в регистр 177662 сканкодов, чтобы БКшка думала, что это ей с клавиатуры данные приходят.
¤
Скачайте свежий релиз. Там в скрипте кнопка СТОП повешена на букву Ё. Этой буквы на БК нету, даже кода её нету. Там и пример есть.
-
? Лёха Башой - 06.02.2019 00:15
Спасибо) СТОП гораздо нужнее ШАГа в скрипте) неравнозначный пример)
Ушел тестить)
-
? Лёха Башой - 06.02.2019 00:25
Спасибо)))
-
? Лёха Башой - 06.02.2019 00:26
Скрипт понравился)
-
? gid - 06.02.2019 09:41
Да. Злоупотребление кнопкой СТОП творит интересные непотребства в фокале и неинтересные в бейсике и неожиданные в редакторе vortex. В остальных местах не проверял.
-
? Лёха Башой - 07.02.2019 18:38
Помнится стек нужно было правильно восстанавливать для "неубиваемости по СТОПУ". Обычно многократное нажатие стопа вызывало странные эффекты.
Как то в клубе БК на Тульской когда только только появился редактор под марсианку - мы его умудрились стащить под носом у "клетчатого председателя"))
Прицепили БЛОК-МСТД. Перезапуск. СТОП. Тесты. Запись)
У меня так и была копия редактора со сдвинутым сохраненным курсором мыши)
-
? gid - 07.02.2019 19:59
Это вопрос?
тогда вот так неубиваемость по СТОПУ на БК10 делали:
mov #hlt4,@#4
mov #psw,@#6 ;текущий приоритет, такой же какой у программы
...
hlt4: sub (pc),(sp)
rti
¤
Особый шик - такой приём:
mov #161716,@#2 ;по адресу 2 команда sub (pc),(sp)
mov #2,@#4 ;по адресу 4 - команда rti и одновременно адрес вектора - адрес команды sub (pc),(sp)
mfps @#6 ;приоритет вектора
-
? Лёха Башой - 07.02.2019 22:51
Да, тоже вспоминаю этот шик))
Но вот деталей зачем 2 отнимать из стека, не помню)
-
? gid - 08.02.2019 09:34
Потому что по немаскируемому прерыванию IRQ1, которое вызывает переход в пультовый режим, а из-за отсутствия пультовой памяти, происходит зависание на шине и прерывание по вектору 4.
При этом с 90% вероятностью (или даже больше) адрес возврата из вектора прерывания равен {адрес опкода} + 2 (независимо от того, скольки словная команда), при этом данный опкод как правило ещё не выполнился, прерывание помешало.
Для этого и корректируют адрес возврата, чтобы прерванная команда всё таки выполнилась, и выполнение программы шло как задумано.
Но если очень-очень быстро-быстро долбить по кнопке СТОП, можно достичь того, что попадём в остаточные 10% (или меньше) и что-то пойдёт не так, и программа таки зависнет. Мне такое удавалось. Чисто из вредности.
-
? Лёха Башой - 08.02.2019 11:10
А известно по какому вектору с блоком МСТД печатается ЗВ(зависание)?
В принципе можно попробовать исполнять код у которого вторым словом будет опкод JMP по определенному адресу (массив таких двухсловных команд). И посмотреть перейдет ли он туда.
Интересный тест.
Пультовой код в процессоре как я понимаю известен?
-
? gid - 08.02.2019 13:12
Всё это уже давно обсуждено там https://bk0010.org/forum/?id=3799
¤
[А известно по какому вектору с блоком МСТД печатается ЗВ(зависание)?]
Вектор 4. Там можно аппаратно узнать, причину, возникновения прерывания. Смотрим бит 4 в 177716, если 1, то нажали СТОП, если 0, то ЗВ
¤
[Пультовой код в процессоре как я понимаю известен?]
Пультового кода нету, и аппаратной поддержки нету. Кому надо, должен сам собрать железку, которая реализует пультовый режим, и написать ПО, которое работает с этой железкой. Например: железка - альтпровский контроллер СМК, ПО - альтпровский RAM/ROM BIOS и некая операционка OS/A WASP (если не путаю, как там она пишется)
-
? Лёха Башой - 08.02.2019 14:51
Я про другое.. про код микропрограммы который выполняется при нажатии СТОПа.. и который и вызывает 4 вектор. Где то я такое видел, но сходу не найду.
Причем этот код был в командах ассемблера.
-
? gid - 08.02.2019 15:38
https://github.com/1801BM1/cpu11/blob/master/vm1/doc/1801vm1.pdf
-
? gid - 08.02.2019 15:40
стр. 75 пункт 8.3.
Там правда не в командах ассемблера. зато в кодах микропрограммы. А она совсем не на ассемблере сделана.
-
? Лёха Башой - 08.02.2019 23:03
Значит кто то публиковал "аналог" на ассемблере...
-
? Vslav - 09.02.2019 14:07
https://github.com/svofski/bk0010/wiki/ru_STOP
-
? Дмитрий - 10.02.2019 12:40
Что-то запамятовал я по поводу XOR. Она в асме пишется как XOR R2,R1 (код 074201), т.е. R1=R2 xor R1. А непосредственную константу нельзя использовать, как, к примеру, в MUL/DIV, где в асме меняются местами операнды? Или там тот же принцип XOR #1,R2 (код 074227 000001)?
-
? gid - 10.02.2019 14:14
MUL ss,R - 070Rss
DIV ss,R - 071Rss
ASH ss,R - 072Rss
ASHC ss,R - 073Rss
но!
XOR R,dd - 074Rdd
¤
Как видим у MUL/DIV два поля занимает операнд - источник, а приёмник - одно поле - регистр.
А у XOR - всё наоборот. Два поля занимает операнд - приёмник, а источник - одно поле - регистр.
Именно поэтому у MUL/DIV приходится записывать операнды задом наперёд, потому что по нотации ассемблера PDP-11 первым идёт операнд источник, а вторым - приёмник.
074227 000001 xor R2,#1 полностью корректная операция, потому что в целях экономии памяти некоторые хранят переменные прямо внутри команд в поле операндов.
-
? Лёха Башой - 11.02.2019 02:04
очень разумно.. тоже недавно думал о том что стоит хранить данные в полях команд..
¤
а еще интересны обфускаторы.. такие вещи можно на pdp творить с запутыванием кода...
кто что помнит из интересного?
-
? Дмитрий - 08.03.2019 21:50
Непонятка с DIV. Судя по описанию знак результата совпадает со знаком делимого. Но 27 / -3 = -9, а согласно описанию должно будет получиться 9. Команду сначала реализовал на IDIV, но сейчас закрались сомнения - а верно ли? Есть соображения как правильно ее реализовать на асме?
-
? gid - 09.03.2019 08:42
См. в исходнике драйвера ПЗУ 326 эмуляцию EIS/FIS. http://gid.pdp-11.ru/f/326v12.rar (добавил немного комментариев к коду EIS/FIS)
Сам недавно интересовался этим вопросом, эмуляция EIS проходит тест 791402, значит там всё правильно, и как раз на асме.
Эмуляция FIS тест 791403 не проходит из-за ошибок определения того, что есть 0.0 и неправильного определения переполнения.
¤
Ещё есть исходник эмулятора EIS/FIS на MACRO-11 с авторскими комментариями:
http://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/PATRON_EMv14/
И тут моё сообщение, где описаны ошибки в этом исходнике:
https://zx-pk.ru/threads/2348-dvk-(i-vsjo-chto-s-nimi-svyazano).html?p=1000907&viewfull=1#post1000907
правда исправление определения 0.0 слишком радикально, там много переписывать и я его не отразил.
¤
В этом сообщении приаттачены исходники ещё одного набора драйверов эмуляции EIS/FIS/FPU:
https://zx-pk.ru/threads/2348-dvk-(i-vsjo-chto-s-nimi-svyazano).html?p=1000776&viewfull=1#post1000776
И там кстати немного другая логика установки флага V результата команд ASH/ASHC, которая тестом 791402 считается неправильной.
А в каких-то PDP-11/xx - правильной.
-
? Дмитрий - 10.03.2019 12:17
Благодарю. Кстати, а simh проходит тесты eis/fis? Качнул исходники, там довольно лаконично сэмулировано. Только непонятно, почему остаток от деления не получен через %.
-
? microxa - 10.03.2019 14:09
нда. новые версии с "бесфреймовым" выполнением уже не тянет нетбук на intel atom n450 1600mhz, а это, на минуточку: 4GMIPS (гигамипса), и 2.5 (гигафлопса)
-
? microxa - 10.03.2019 14:17
и насчет сборки под ХП:
Всплывающее окно приложения: BK.exe - Точка входа не найдена : Точка входа в процедуру GetLogicalProcessorInformation не найдена в библиотеке DLL KERNEL32.dll.
-
? gid - 10.03.2019 15:18
>>? Дмитрий - 10.03.2019 12:17
[simh проходит тесты eis/fis]
без понятия, я чё-то даже и не вспомнил про simh, сам писал эмуляцию по алгоритмам на асме из драйверов.
>>? microxa - 10.03.2019 14:09
Эмулятор не имеет доступа к режиму ядра, чтобы монопольно использовать 100% процессора. Поэтому довольствуется тем, сколько выделит ему Windows. А Windowsу побоку на эти мипсы и флопсы.
А насчет сборки под ХП: как работала на тестовой виртуальной машине, так и работает, даже не потребовала установки VC redist 2017, обходится VC redist 2015.
Я на своих тестовых конфигах не заметил разницы от перехода на VS2017 и от смены алгоритма эмуляции, потому и выложил новую версию.
-
? microxa - 10.03.2019 16:13
gid, вы эти сказки новичкам расказывайте, чего там венде по боку. Я извините четверть века уже за вендой. Виндопс если ничем не загажена,и не загружена отдает всё приложению. И если оно написано грамотно, особенно если программист знает что такое отжимать быстродействие то этому эмулю хватит и пня166.. да какого пня.. Вон эмулятор Дмитрия Тюрьева тянул 386-ой SX 33-тий.. А вашему наверное AMD-RYZEN подавай да, с CORE-I9.. И видеокарту майнерского уровня..
-
? microxa - 10.03.2019 17:51
Вроде как 4.0 смотрю, модульной концепции.. И чтоже? все опять завернуто на MFC, это тяжелое и убогое и сложное наследство 3-ей версии..
¤
Может сменить компилятор на GCC... и вообще парадигму мышления...
¤
надеюсь вы понимаете.. это юмор.. и ничего более..
-
? gid - 10.03.2019 19:25
Я вообще не понимаю юмора. Не нравится - пишите сами, а не нойте, что работает не так как вам хочется.
-
? microxa - 10.03.2019 19:38
>>Не нравится - пишите сами
так пейшу иногда.. много заимствую..
¤
вот что и заинтересовал "бесфреймовый движок", и как это так быть оно может..
¤
вроде понятно: на тредах и эвентах.. Собственно суть тотже фрейм..
-
? Дмитрий - 11.03.2019 01:21
>> эмуляция EIS проходит тест 791402
А есть где эти тесты в исходниках?
-
? microxa - 11.03.2019 01:54
>>не нойте, что работает не так как вам хочется.
Ох.. Вообще я и оригинальный v3.0 не жаловал, в котором, совершенно отсутствовал "дух БК" и" эффект присутствия".
¤
gid, удивляюсь Вам... Вы c++ & mfc, изучали в процессе работы над ним, или у вас уже был многолетний опыт?
¤
просто интересно..
-
? gid - 11.03.2019 09:37
>>? Дмитрий - 11.03.2019 01:21
https://github.com/1801BM1/cpu11/tree/master/vm2/tst
Там vslav в исходниках немного модифицировал диагностический вывод результатов под конкретно этот свой проект, поэтому они отличаются от оригинальных. А 791402 есть только дизассемблированная версия, в единственном своём виде.
¤
>>? microxa - 11.03.2019 01:54
[Вообще я и оригинальный v3.0 не жаловал]
но ведь есть другие, более лучшие эмуляторы.
например вот https://github.com/nzeemin/bkbtl
Вот недавно и там появилась эмуляция БК https://github.com/samstyle/Xpeccy
И ещё есть куча других, авторы которых зажопили исходники.
¤
[удивляюсь Вам]
Ну неужели по лютому говнокоду в исходниках не видно, какой из меня программист. Потому и всё ужасно тормозит и вообще не работает на Pentium-166. Естественно, я изучал c++ & mfc в процессе и писал как умел. У меня многолетний опыт изучения всякого интересного мне в данный момент времени.
Так что будьте снисходительны и великодушны. И не стесняйтесь не только указывать на ошибки, но и давать правильные варианты. От этого всем станет лучше, эмулятор наконец-то будет нормальный.
-
? microxa - 11.03.2019 10:58
Понятно...
Да я с Тюрьевского начинал, эпопею программирования под pc-x86..
И что такое пень166 скролящий 2мегабайта видеопамяти, припоминаю, так как переделывал его из DOS в Win9x приложение с прямым доступом в видеопамять.
Но в целом, оказывался заложником как сложного кода(ассемблер таки), так и неправильных методов.. Пришлось забить (в виду паталогической лени)..
¤
Периодически компилировал Калмыковский v3.0, в VC6, и уж было пошло поехало чуть не собрал его на BorlandC++ Builder6, у которого была некоторая поддержка
MFC, он быстрее сгребал, и был вариант вообще выпилить MFC, обойтись VCL а потом и совсем без него, чтоб потом по кускам как нибуть реверснуть на Дельфу...
Короче тот еще долгострой(с подзабитием на всё)...
¤
Время от времени искал Epic1.. а когда нашел, то нашел меня этот эмуль на гугле сорс...
http://bk-0010-01.narod.ru/
https://code.google.com/archive/p/bk-0010/source/default/source
¤
вот на базе его периодически и занимаюсь.. творчеством в программизме..
¤
Ну, както так вот:
http://vrtp.ru/uploads/post-108-1551122554.png
http://vrtp.ru/index.php?act=Attach&type=post&id=808777
¤
Так что желаю получать кайф, от... подобного хобби..
-
? Дмитрий - 11.03.2019 13:47
>> выпилить MFC, обойтись VCL
Все рано все сводится к виндовым controls - MFC/VCL всего лишь обертки
¤
>> потом по кускам как нибуть реверснуть на Дельфу...
Реверснуть надо саму эмуляцию, а все остальное можно сделать и самому - это гораздо проще эмуляции. Кстати, я так и сделал, ибо интерфейс проще с нуля написать, чем конвертить обертки.
-
? microxa - 11.03.2019 14:04
ой не надо, ляля, "что надо и что просто..."
¤
А в эмуле А.Грабовца было практически все написано. Вначале мне показалось простой версия с SDL либой. А затестив ее на дохлой тачке, оказалось что либа таки отстойная и тормозная, еще обнаружились неустранимые артефакты по звуку..
¤
Вобщем пришлось вновь изучать движок Ю.Калмыкова - у которого я считаю одна из сильных сторон была работа через DirectSound (выкинутый потом в форке), и DirectDraw (замененый на глюкавые костыли)..
¤
Я же вот периодически возвращаюсь к идее заиметь "процессорный движок" с эмуля Д.Тюрьева, по сути прямой преобразователь PDP->x86, отчего и был такой шустрый :)
-
? Дмитрий - 11.03.2019 14:09
Пишите эмуляцию напрямую в асме - будет быстро. Эмуляция вещь затратная.
-
? microxa - 11.03.2019 14:22
gid, "полный экран" что на картинке - это рисование по клипперу. Оконный режим, кадровая синхра есть, кстати чере lpDD.WaitForVerticalBlank (жручая правда). По надежности устраивает например если нырнуть FAR-ом на ALT+Enter в труЪ консольный режим (80х25) и вернуться обратно, экран как ни в чем не бывало..
¤
Кстати, Долгое время не мог юзать win7 из-за того что этот "старый" режим выпилили.. Решилось видео драйверами от виндопс ХП.. (охуеть не правда ли?) А вы говорите старьё.. Страрьё то как раз и рулит..
-
? gid - 11.03.2019 16:29
В Вин10 нету ни DirectSoundа, ни DirectDrawа. Ну и зачем они мне?
-
? microxa - 11.03.2019 17:10
да вы что? win10 от семерки/хп/2к далеко не ушла. и врядли уйдет.
-
? microxa - 11.03.2019 17:22
да я эту ебаную десятку по фат32 грузил с уефи
http://www.cqham.ru/forum/attachment.php?attachmentid=259641&stc=1&thumb=1&d=1490775183
¤
и девелопил на сенсорнике эмуль бк, блядь
http://www.cqham.ru/forum/attachment.php?attachmentid=260284&d=1491440170
-
? Дмитрий - 11.03.2019 17:38
Каким образом вы учитываете вывод через DDraw при перемещении окна, когда туда производится рисование? Я, когда городил вывод, коснулся DDraw чуток и забросил - как раз из-за вывода в указанный участок экрана при перемещении окна. Окно утащили, а вывод продолжается на место бывшего окна.
-
? microxa - 11.03.2019 18:01
а тут Никаким. абсолютно. само все.. потомушто исползуецо клиппер какойто
-
? microxa - 11.03.2019 19:57
>>Окно утащили, а вывод продолжается на место бывшего окна.
Кстати да, для меня это тоже долгое время было капец проблемой..
¤
¤
ну вообще, в арсенале имелось несколько методик по выводу.
1)Старый добрый прямой вывод на экран. Способ работает только на встроеных в проц атом видимокартах, с линейным фреймбуфером. (невида и амд-ати сосут и идут лесом со своей мраковой сегментированостью).
Lock-ается первичный буффер, и отжимаеться заветный адресок видепамяти.
¤
2)Рендеринг в теневом, вторичном DX буффере, и последущее Dx.Blt (c хардварным (судя по бенчам) стретчингом)
¤
и тут да, было отслеживание:
¤
case uMsg of
¤
WM_MOVE, WM_SIZE:UpdateRect(ddWnd);
¤
И вот такой User32 "контрол" был у А.Грабовца
¤
procedure UpdateRect(ddWnd: hWnd);
var p:TPoint;
begin
p.x:=0;p.y:=0;
ClientToScreen(ddWnd,p);
GetClientRect(ddWnd,WndRect);
OffsetRect(WndRect,p.x,p.y);
end;
¤
Ну и в DrawScreen шел собственно вывод
if lpDDSPrim.Blt(@WndRect,lpDDSBack,nil, 0 ,nil)
= DDERR_SURFACELOST then lpDDSPrim.Restore;
¤
¤
ну и несколько тормозной:
3) рендеринг по экранному массиву из двух кадров BMP, BitBlt осуществлял копирование (+скролинг) в теневой буфер, и затем dx.Blt на экран
-
? microxa - 11.03.2019 20:24
Вобщем, допил эмулятора Андрея, особенно в плане упрощения и убыстрения, доставил много кайфа. от решения довольно нетривиальных проблем..
Да и время от времени доставляет. К примеру идет некоторая работа над распаралелизацией работы трехканального YM2149(AY89) муз процессора, допилы и хачинг прожек по выводу музыки.(musdemo it's work), ну и "запуск нативных дельфи/fpc х86 ехе". Которыми проще окучивать 16цветов (опциональных)..
А по DirectSound-у, имееться (опционально) "сквозной" с входа-на-выход 96/192кгц поток..
Для некоторых задач(в основном хеловорлд) в области DSP/SDR..
Както так вот...
-
? Дмитрий - 11.03.2019 22:38
>> Старый добрый прямой вывод на экран
Я как раз primary поверхность и пользовал. Работал на НВ. Но я выводил 16-битное изображение прямым копированием в битовый массив поверхности.
-
? microxa - 12.03.2019 13:21
>>Вот недавно и там появилась эмуляция БК https://github.com/samstyle/Xpeccy
gid, какой милый https://github.com/samstyle/Xpeccy/blob/master/src/libxpeccy/cpu/1801vm1/1801vm1.c
вы не находите?
нда.. и какая аццкая опупея с этим приплюснутым и не менее мерзопакосным, чем mfc (с костылями), QT (чесслово даже заценять не хочется).
Может как альтернативный (модульной концепции-то) проект замутить на Си-шечке?
Ну и чтоб одинаково компилялось старыми компилями..
Хуйняжеж делов то..
-
? microxa - 12.03.2019 14:04
и шоб без "новодела" а то ЫнтелС++ (многому научил в simd оптимайзе) не хочет понимать это:
1801vm1.c
1801vm1.c(24): error: declaration may not appear after executable statement in block
xpair res;
^
1801vm1.c(42): error: expected an expression
for (int i = 0; i < 7; i++)
^
1801vm1.c(42): error: identifier "i" is undefined
for (int i = 0; i < 7; i++)
1801vm1.c(1535): error: declaration may not appear after executable statement in block
int idx = 0;
¤
вот.. никакого шоб цэ99, ток старый добры керниган да ритчи (знатно они удолбались тогда лсд, когда интерпретатор для паскаля писали)
-
? microxa - 12.03.2019 14:11
хотя да.. что может быть лучше паскаля. с его мгновенной компиляцией, и хоть какойто похожестью на бейсик -бэкашный.. наверное ничего.. А может на бейсике и хуйнуть? Интерфейсы хотябы. Вон - практически виндопс
https://r-games.net/uploads/posts/2011-02/1297149710_1.jpg
на бейсике, блядь
https://r-games.net/511-color-lines-beysik.html
-
? Дмитрий - 13.03.2019 10:30
Смотрю в реализацию DIV в simh и что-то не пойму:
¤
#define GET_SIGN_W(v) (((v) >> 15) & 1)
src = (((uint32) R[srcspec]) << 16) | R[srcspec | 1];
...
if (GET_SIGN_W (R[srcspec]))
src = src | ~017777777777;
¤
с какого перепугу при 15-м бите равным 1 (старшая часть отрицательная) в старшей части делимого у src выставляется бит 31? scr имеет тип int32, т.е. знаковый. Ведь два 16-битных аргумента сливаются в один беззнаковый 32-битный и кладутся в 32-битный знаковый (преобразование типов), т.е. если старшая часть была со знаком "минус", то и результирующий знаковый src также отрицательный. Зачем впустую накладывать 1 на 1?
-
? Дмитрий - 13.03.2019 10:38
Кстати, и у делителя тоже такая же петушня.
-
? gid - 13.03.2019 10:55
Наверное, некоторые компиляторы, видя, что у src знаковый тип, начинают своевольно манипулировать знаковым битом переменной при приведении типов, вот и приходится добавлять его обратно вручную. Больше нет предположений этому бессмысленному действию.
-
? microxa - 13.03.2019 11:35
simh.. ааа, вот откуда А.Грабовец использовал движок процессора.. Ну все хоть от самого Боба Супника (а не васьи пупника). Хотя...
В Speccy он какойто экстремально маленький, и то может быть еще меньше если выкинуть символьные опкоды команд.. И не понял что там насчет таймингов микро-опкодов то..
наверно придецо кочать 50метров кутевой мути..
-
? microxa - 13.03.2019 11:56
не понял, короч где там их нахуй кочать.. да и глянул оно еще SDL2 штоле тянет.. Ндааа.. без костылей как без люлей...
короч, к хуям эту - БК0010, да еще (pre-alpha)
"хорошие эмули"
gid, а вы тот однако шутник.. это надож так было потролить...
-
? Дмитрий - 13.03.2019 14:58
Тест 791402 жестко привязан к адресам? Там используется часто MOV PC,R1. А то у меня ошибка 1 уже на первом тесте.
-
? gid - 13.03.2019 16:09
Ну он скомпилирован как позиционно зависимый. и адрес загрузки у него 0, адрес запуска - 0200.
А команда MOV PC,R1 нужна только для того, чтобы узнать, если нарушен порядок тестов, где именно он нарушен.
Без листинга под рукой - бесполезно.
там даже номер ошибки без таблицы ошибок бесполезен, потому что нету этой таблицы, всё равно надо в исходник лезть и выяснять, отчего ошибка случилась.
-
? microxa - 13.03.2019 16:20
Дмитрий,
MUL-то не факт что работал в к1801вм1"Г", как надо. И то, там эмуляция чтоли была, исходя из такой нижеплинтусной производительности.
-
? microxa - 13.03.2019 16:25
Вот у интел (и всяко там прочих), все какбудто строилось вокруг умножителя..
Интересно и как его скоммуниздили.. https://ru.wikipedia.org/wiki/К1810ВМ86
-
? Дмитрий - 13.03.2019 16:35
>> А команда MOV PC,R1 нужна только для того, чтобы узнать, если нарушен порядок тестов, где именно он нарушен.
То есть в самих тестах как параметр он не участвует?
¤
>> MUL-то не факт что работал в к1801вм1"Г", как надо. И то, там эмуляция чтоли была
Я другое делаю - 32-битную БК, там все "аппаратно", если можно так выразиться.
¤
Ошибку нашел, продвинулся до 11(8) ошибки.
-
? microxa - 13.03.2019 16:38
>>Я другое делаю - 32-битную БК
я тоже иногда ее делаю. не определюсь только с машинным словом.. 16 или 32 бит.. вот в чем вопрос..
-
? microxa - 13.03.2019 16:40
Хотя если 32.. то регистров будет до жопы (даже переизбыточно)
-
? gid - 13.03.2019 16:58
>>? Дмитрий - 13.03.2019 16:35
[То есть в самих тестах как параметр он не участвует?]
Нет конечно, после занесения в R1 значения PC, проверяется, соответствует ли номер теста, который вот прям щас будет, ожидаемому, и если да - то значения регистра R1 заполняется нужными для теста параметрами.
-
? microxa - 13.03.2019 17:17
Дмитрий, кстати ради спортивно академического интереса, не видели какой машкод у ARM64?
Хотел было, малинку распери пи, что могли с пина FM радио играть https://xakep.ru/2012/12/11/59792/
а чегото.. они какието пошли 4ядерные и 64-битные... и не факт что уже так играют..
А так и х86_64 то не порулил. Слишком переизбыточен.
-
? Дмитрий - 13.03.2019 17:45
>> Ошибку нашел, продвинулся до 11(8) ошибки.
Походу ошибка 11 возникает на какой-то итерации и хрен поймет на какой, потому как трассируешь - 11 пролетает без ошибки. Сделать бы лог из оригинального теста, где было бы указано: тест №, значение, сдвиг, результат, байт признаков. По исходнику нихрена непонятно что откуда, на каком значении ошибка.
¤
>> я тоже иногда ее делаю. не определюсь только с машинным словом.. 16 или 32 бит.. вот в чем вопрос..
Размер машинного слова переменный. Команды как были, так и остались 16-битными. Я решил, что делать надо максимально приближенно к оригинальной БК. Чтобы код работал с околонулевыми исправлениями. От 32-битных смещений (CALL/JMP и адресаций) не избавиться. Если адрес (или индекс в x(Rn)) известен (к примеру @#4), то ассемблер видит, что адрес умещается в 16 битах и в префиксе сбрасывается признак 32-битного аргумента. Стандартные интеловские префиксы для БК не годятся - почти все попадают на команды. Плюс недавно столкнулся с таким фактом, что длины в командах условных переходов катастрофически не хватает. Пришлось изворачиваться и делать 16-битное смещение (интел столкнулся с тем же - с i386 введены команды с 16/32 битным размером смещения).
¤
мнемоника асма полностью сохранена.
MOVB R0,R1 - переслать байт
MOV R0,R1 - слово
MOVL R0,R1 - двойное слово
¤
добавил команды FPU (FIS делать не стал - бесполезны), но не убогий DEC'овский вариант, а свой (8 аккумуляторов, использовать можно любые комбинации в командах), формат чисел IEEE754.
¤
>> Хотя если 32.. то регистров будет до жопы (даже переизбыточно)
Регистров 16 (добавлены R8-R15) - их использование выставлено битами в префиксе.
¤
>> не видели какой машкод у ARM64?
Машкод не смотрел, асм видел - он очень похож на DEC, но расширен.
-
? microxa - 13.03.2019 18:34
>>Команды как были, так и остались 16-битными.
>>Я решил, что делать надо максимально приближенно к оригинальной БК
ну.. в целом,как ясно. А проблема коротких джампов была даже общая что у PC-х86 что у БК-PDP, порою решалась прыжочками на другие джампы :)
-
? microxa - 13.03.2019 18:49
Кстати не прошло и дцати лет, как FPC3.0 уже умеет х86-16bit машкод выдавать, для nasm-а & for fan in retrocomputing... И как обычно я нихрена не понял как сделан там, этот фронт энд генератора кода.
-
? microxa - 13.03.2019 19:05
Хм.. Давненько я на него глаза не разувал.. Ёлки.. Он еще может для 8бит AVR mega16-128 еще код создавать. Вроде как фронт-енд небольшой: 222кила пиcанины.. Против почти мегабайта i8086 (по сути сравним с х86).
-
? Дмитрий - 13.03.2019 19:51
>> порою решалась прыжочками на другие джампы
Вот этот огород я не хотел городить. Поэтому сделал 16-битное смещение.
¤
>> И как обычно я нихрена не понял как сделан там, этот фронт энд генератора кода
Только не фронтэнду, а бэкэнду. Я тоже не понял. Код вообще недокументирован, инфы нет, руководства по добавлению своей архитектуры нет. Проще в gcc добавить и собрать - там хоть в коде комменты есть что зачем почем для чего.
-
? microxa - 13.03.2019 20:16
А в gcc вроде что-то было для PDP-11.. я его собирал даже. лет овер 10 назад, gcc3.4.6 (от Slackware), но тогда интересовал больше кросс компиль x86_64, он вроде хотел, но так и не собрался (для х86 легко), а ведь там еще надо было квест с ld/as и прочим bin-utils-ом квест по сборке проходить.
Пришлось забить т.к слишком муторно (хотя думалось фигня делов ибо: пень4 3ггц/800мгц c HT, ram 1гиг).
-
? microxa - 13.03.2019 20:27
что-то было, и все еще что-то есть
https://github.com/gcc-mirror/gcc/blob/master/gcc/config/pdp11/pdp11.c
Дмитрий, гугл говорит что кроме вас оно нахрен никому не было нужно.. Gcc собирать PDP-11-ый..
эээх...
-
? Дмитрий - 13.03.2019 21:13
>> Gcc собирать PDP-11-ый
Нафик мне пдпшный? К тому же он Vslav'ом собран давно. Я про 32-битную БК - для нее бэкэнд забабахать. Не на асме же писать всю дорогу, хотя асм мне больше по душе.
-
? microxa - 13.03.2019 21:26
упс.. ну не понял я с ходу. А насчет асма то да.
вообще ужос вспомнить, как меня пробило PDP кодингом (по осеннему обострению).. c года так два назад.
Я вобщем-то бросил БК+Ramdisk 64к (году в 98-ом) в процессе допиливания RS экранного редактора спрайтов(ибо спустя пару-тройку дней. нихрена не помнил и не понимал что, и зачем)
¤
Вот тут-то идеи то все и сплыли опять. и микро-выводилка чисел DigiOut..
и обводчик рамочки с тенью GreenBox.. (ой не верил что даже получится в экран уместить).
и вобще получился перемещаемый гипероптимайз, с элементами х86-ых привычек аля
Mov PC,R2 baseV: add #(AddrS-baseV),R2
так что действительно, какой-такой язык высокого уровня на бк0010... хотя если со встроеным асм-ом..
ик..
https://pastebin.com/cW1R0XjE
После этого квеста, пришла идея хоть как нибудь... но на дельфе прожечки кодить. под этот бэээка. Ибо PDP кодинг... Какаято тяжелая наркомания.
-
? Дмитрий - 13.03.2019 22:08
>> но на дельфе прожечки кодить. под этот бэээка
http://mads.atari8.info/ поляки забабахали паскаль для 6502, довольно развесистый. У меня не хватило сил раскорвырять его. Мб вам удасться?
-
? microxa - 13.03.2019 22:59
>>поляки забабахали паскаль для 6502
нда.. я потрясен. это как так надо любить.. дендивский проц, чтоб кодернуть простыню на 902кб
C:\FPC3>c:\fpc3\ppc386 -Mdelphi mp.pas
и вроде бы собралось, однако при запуске
C:\FPC3>mp.exe
какаято дичь:
>>Не удается выполнить указанную программу.
странно.. что за хузня.. (в принципе то, у меня на одном C:\ и хп и семерка. )
под семеркой тоже облом, потому, что у MP.exe :
Size of uninit data 438B48F4
Size of image 4394E000
размер:
.bss 438B48F4
не.. я не готов проходить такой квест. с таким пОпенсорсом..
-
? microxa - 13.03.2019 23:23
ну хоть прямой вывод в экран, в win7 затестил.. вот такой тестилкой
https://pastebin.com/hEJVJKg8
шумит однако рандомчег. по всему экрану. со страшной силой. (мб из за драйверов от хп)
сдул пыль с планшета сенсорника (грузит win10 по microSD), этот пример уже не работает.
ну и хуссней..
-
? microxa - 14.03.2019 00:31
Из за некоторых FreePascal-измов не компилировалось древней дельфей7.. Но фигня делов оказалось:
C:\Delphi7>c:\delphi7\bin\dcc32 mp.pas
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
mp.pas(1905) Warning: Combining signed and unsigned types - widened both operands
mp.pas(1959) Hint: Value assigned to 'j' never used
mp.pas(3237) Hint: Value assigned to 'yes' never used
mp.pas(26741)
26742 lines, 0.23 seconds, 417736 bytes code, 1133196469 bytes data.
ну. всё хоть не баг FPC3 (хотя дельфе по скорости сборки уделал его раз в 10):
Файл подкачки слишком мал для завершения операции.
Ошибка выполнения C:\Delphi7\mp.exe
-
? Дмитрий - 14.03.2019 00:41
Хз, у меня все работает, Д7 его компилит на ура.
-
? microxa - 14.03.2019 00:50
Ну попробуйте свежий релиз MP компильнуть.. И кстати там собраный MP.exe тоже с таким косяком. так что никакого хе зе.. Просто у меня конфигурация не тянет такие запросы. Даже подкачки нет.
-
? Дмитрий - 14.03.2019 00:55
У меня этот релиз и есть. Он работает на ура, компилирует тестовые (другие не пробовал).
-
? microxa - 14.03.2019 00:57
>>у меня все работает, Д7 его компилит на ура
угу.. наверно у вас особая версия Д7 шо может компилять exit(bla-bla)... и преобразовывать xz:=integer(single);
-
? microxa - 14.03.2019 00:58
Ну может у вас вин10 х64 с 64гигами памяти..
-
? Дмитрий@ - 14.03.2019 01:08
Глянул исходник. Да, припоминаю - тут малех пришлось руками переписать exit() и integer(single). Однако после этого все собирается Д7 и раотает. И приложенный готовый exe также работает нормально - я проверял им правильность.
¤
>> Даже подкачки нет.
Вот поэтому и не работает. Включить обратно, но поставить размер свой, а не по выбору системы. Диспетчер памяти винды не работает нормально без файла подкачки.
-
? microxa - 14.03.2019 01:16
У меня 3д игрухи прут. бровзеры прут (ток следить надо за прожором овер гига). А это капец просто. Ну мож ктото возьмет это на заметку, как надо тролить старые конфигурации, угу..
...
ладно окей.. вроде ясненько.. с генерацией map
0002:038A3C98 CallGraph
0002:438B3C98 NumIdent
...
CallGraph: array [1..MAXBLOCKS] of TCallGraphNode; // For dead code elimination
...
нда.. просто окуеть какой dead code
-
? microxa - 14.03.2019 01:28
ну.. уря.. уря..
C:\Delphi7>mp.exe
Mad Pascal Compiler version 1.5.8 [2018/11/22] for 6502
Syntax: mp <inputfile> [options]
-d Diagnostics mode
-code:$address Code origin address
-data:$address Data origin address
-stack:$address Software stack address (size = 64 bytes)
-zpage:$address Address variables on the zero page (size = 24 bytes)
..
осилит ли он компилять хеловорлды а тож 128мб всего (MAXBLOCKS=4096), для графов :-D
-
? Дмитрий - 14.03.2019 16:12
gid, сделал лог теста ASH. Так вот непонятка в 50(8) тесте: число 137777 сдвигается слево на 15 бит. Получается 100000 (ожидается это же значение), PSW получается NZVC=1001, но тест с какого-то перепоя ждет NZVC=1011. Причем в тесте 47 выполняется та же самая операция и она проходит нормально 11=11. Ожидаемый PSW хранится в @#442. Бит V указывает менялся ли знак в процессе операции. Так вот вопрос: учитывается смена знака после каждого смещения или перед и после смещения? Я понял, что перед и после. А получается после каждого сдвига.
-
? Дмитрий - 14.03.2019 16:15
Блин, в 47 тесте 177777 сдвигается. Выходит, бит V учитывается после каждого сдвига.
-
? gid - 14.03.2019 19:16
Да, так и есть. Учитывается факт изменения V в процессе побитного смещения на заданное количество бит. А вот в PDP-11/03, и может ещё каком-нибудь, бит V устанавливается в результате сравнения начального и конечного значений.
-
? Дмитрий - 14.03.2019 21:13
Чуток допилил у себя асм-версию - теперь все 52 теста пройдены.
-
? Дмитрий - 20.03.2019 14:20
В дизассемблированном исходнике теста ошибка (тест ASHC)
¤
; apar0 - значение младшего слова для сдвига
; apar1 - значение старшего слова для сдвига
; apar2 - параметр сдвига
; apar3 - значение младшего слова для контроля
; apar4 - значение старшего слова для контроля
; apar5 - контрольное PSW для сравнения
¤
apar0/apar3 - СТАРШЕГО, а apar1/apar4 - младшего. Иначе при реализации неверное размещение данных вызовет ошибку в #102 тесте (установятся N и V), контрольное PSW равно 0.
-
? Vslav - 20.03.2019 16:10
>>Выходит, бит V учитывается после каждого сдвига.
Да есть такое, в арифметическом блоке при выполнении сдвигов бит V накапливается
-
? Дмитрий - 21.03.2019 15:34
Кстати, ASHC тест у меня полностью проходит, но я не увидел там циклического сдвига (аналог ROL/ROR интела) при нечетном регистре. MOV #-1,R3 + ASHC #20,R3 тест проверяет R3=0, а ROL/ROR дал бы тоже самое число - 177777.
-
? microxa - 21.03.2019 18:18
ROL, да, хорошая инструкция, использовал для быстрого преобразования Hex->Oct
function Oct(hexx:integer):integer;assembler;
asm
ror eax,3
shr ax,1
ror eax,3
shr ax,1
ror eax,3
shr ax,1
ror eax,3
shr ax,1
ror eax,3
shr al,2
ror eax,17
¤
movzx eax,ax
end;
¤
А то в дельФи нету образного представления восьмеричных чисел..
¤
Кстати идет некоторый процесс по запилу сишной версии эмулятора. Наиболее критичные вещи (DDdraw/Dsound/User32 контролы) уже перенесены и тестированы в общем миксе CPP+PAS(в Builder6). Ну а общая и уже Си-шня "простыня",вроде как одинаково собираеться на BCB6/MC_VC6/GCC3.4 :)
¤
Ну и попутно, также выявились очень интересные баги и огрехи... Цэ в этом плане, боле дисциплинизирует..
-
? microxa - 22.03.2019 00:21
ндэ... а вот "простыня" процессора k1801vm1 (с динамической структурой), начинает негодно обрастать CPU->bla bla >_< (и чем-то начинает походить на васик% бэкашки% % % % )
и вообще.. какойто всё бред.. в бесконечной борьбе, с какими-то исскуственными сложностями..
от си уже нифига.. сплошное сВынь Апи (древнее как кости сбитого птеродактиля)
короч паскаль рулит.
-
? microxa - 22.03.2019 20:22
однако GCC "уделал" даже ICL, собрав воркающий SIMD движок по шустрому выводу бэкашных пикселей :)
https://pastebin.com/JGwzFM28
¤
вот я понимаю практически прямая работа с железом.. А не через ебаные костыли от поехавших и давно нихуя уже не ведающих шо творят пидоргов из мракософт :)
¤
gid, а шо за трэнд такой скакать из студию в студии? как обезьяны чесслово... думают им годнотой обделались. На которой обтворицо добром.. угу какже...
-
? gid - 22.03.2019 21:20
миграция. в более новых студиях более удобно писать код, и поддерживается более больше новшеств из стандартов с++, которые в gcc обычно запиливаются первыми и потом слоупочный мелкософт реализует у себя в студии.
А обезьяны были бы, если бы хаотично скакали из студии 2012->2015->2010->2013->2017->2015
-
? microxa - 27.03.2019 18:19
Выводилку потестил на win2k/winXp/7Win10. По скорости уделывает BitBlt раз в пять..
¤
Получил какоето жуткое количество FPS когда Sleep =0 крутя в потоке
¤
procedure ThreadSCR (id:integer); stdcall;
begin
while quit=0 do begin
¤
DrawScreen(g_hwnd, @CPU^.mem.b[16384], CPU^.mem.w[p177664 div 2]);
¤
Sleep(1);
FPS;
end;
end;
¤
Под тысячу! на задлхом атоме N45x на скинутом FSB до пня3-533
¤
а так 128 (при Sleep=1) и 64 при Sleep=5... чтоли.. С включеной синхронизацией 60 - картинка в R-Type/Fan-15 (вроде больше и нет вертикальных шутеров то?)
¤
Но с синхрой жрет CPU как будто тысяычу FPS выводит :)
-
? microxa - 27.03.2019 21:14
gid, вообще интересно как это крутится void CMotherBoard::TimerThreadFunc()
но какбы, в общих и довольно поверхностных чертах...
¤
непонятно, уходит ли оно вообще в какойто Sleep/Wait или этот цикл интенсивный (в рамках бесфреймовой концепции)?
-
? microxa - 27.03.2019 21:48
у меня движок эмуля завязан на синхру со звуком, точней, даже на длину его буфера
SMP_RATE = 44100;//48000 88200 96000
speedcpu := 3000000;
screen_hz := 50;
buf_length := (SMP_RATE div screen_hz) * 4;
speedcpu := speedcpu div screen_hz; // 60000 тактов в 1/50 секунды
¤
ну и на больших частотах дискретизации больших чем 44100 уже наблюдаються артефакты, в эмуляции спикера.
.
более того проблем подвалил "старый" драйвер realtek-овского кодека
(аж пришлось смотреть wrk/win2000 source чтоб сократить вызов)
//
procedure NtWaitForSingleObject(hEvnt,Alert,Time:integer);stdcall; external 'ntdll.dll';
//
только это не помогло в
//
function Play_Buffer: LongInt;
label top,sk1;
var
i,dwStatus,hr:LongInt;
begin
NtWaitForSingleObject(_hEvent,0,0);//ожидание NotifyEvent
//
_DSOutputBuffer.GetCurrentPosition(@_pos,nil);
//
от драйвера при запуске другой копии эмулятора наваливаются "левые" эвенты..
и все начинает "бесицо"
решения есть некоторые... но вот яркий пример граблей на ровном месте.
а вы говорите купацо..
-
? gid - 27.03.2019 22:10
[как это крутится void CMotherBoard::TimerThreadFunc()]
Непрерывно, бесконечно, синхронизируясь с реальностью по звуковым фреймам, пока не придёт событие останова потока, или пока не придёт событие отладочного приостанова, в этом случае цикл залипает в своём внутреннем цикле, пока не придёт событие отмены отладочного приостанова, если во время отладочного приостанова придёт событие останова, то всё отменяется и поток останавливается.
длительность одного звукового фрейма - 10 мс
эмулятор без проблем тянет звук с частотой синхронизации 96000 Гц, лично у меня на рабочем компе тянет и 192000 Гц, но я смысла такую частоту дискретизации делать не вижу совсем. качество генерируемого звука и 44100 вполне устраивает, хотя на 96000 AY звучит мягче, а спикер менее песочно.
¤
Я может чего-то не так делал, но у меня DirectSound был более тормознутый, чем WaveOut
-
? microxa - 27.03.2019 23:23
>>>тянет и 192000 Гц, но я смысла такую частоту дискретизации делать не вижу совсем.
на синтезе у меня, как, переписаный на pascal, так и оригинально вкомпиленый
"emu2149.c" by Mitsutaka Okazaki 2001.. (более новая версия еще есть, но чемто не устроила..)
и к сведенью, задохлик N43х (со скинутым fsb до 533..733) тянет синтез AY в 192кгц в HQ режиме.
..
Возможно смысл может и был-бы.. в тойже hi-res синхре. Но увы - все работает
не так как должно (было-бы). Хоть делай так-хоть делай сяк.. Наверно "сенькю"
надо сказать что хоть както работает..
..
В оригинале ю.Калмыкова создавалось 50 хэндлов для покадровой dsound нотификации.
Надо будет его поковырять - вроде как, запускал две копии (когда был комп мощный).
И явления наложения Wait эвентов не наблюдалось, которое было в упрощенном и облегченном
варианте с 4-мя буферами (отрезками)... Даже подумалось может чего там
из-за VC-шной сборки (дельфя в этом плане более глючновата.. это да)
...
Но сейчас у меня используеться несколько другой концепт - линковка Си-шных
обьектников by ICL/GCC/VC внутренним компоновщиком FPC 3.0.4.. И в общем ситуацию
оно не сильно меняет.. (ну все хоть, какая-никакая (хотя ого-ого какая) альтернатива
Borland-у :)
...
>>>Я может чего-то не так делал, но у меня DirectSound был более тормознутый, чем WaveOut
Хе, waveOut мне так и не дался - вроде и нашел примеры и даже заполнение
структуры WAVEFORMATEX-а схож с DSound, и даже разметки похожие в описателях буферов
но Play_Byffer() трещит и щелкает на cWaveOutWrite.. Правда CallBack я не использовал
- делал опять таки на событиях.. Видимо какието...ммм.. тонкие моменты не доделал :)
...
да уж..
-
? microxa - 27.03.2019 23:46
Так что пока еще квест.. насчет понимания юмора с "глюканатом двух копий".
я с ним столкнулся после того как все прекрасно отработало на нетбуке с ALC269,
мало того, один эмуль грузил другой "пыщ-пыщ" через аудио микшер! (вот в чем был весь и "цинус")
..
а на компе Сore2D lga775 с ALC888 вдруг косяк-такой. Как оказалось причина в старом RtkHDAudio.sys
набрал их на целую коллекцию))) (Почему старый - потомучто в новых там потом чегото испоганили).
На нетбук тоже пришлось подбирать (то звука на динамики не было, то чего то еще там).
..
Core2d два года уже как пылью покрыт, заброшеный на шкаф. Кондеры ему опять перепаивать надо вздутыши.
да вот. привык уже к мелким компам). что уже не понимаю PC-шную клаву. как всю эту дико жрущую дичь.
в черном ящике..
-
? Дмитрий - 28.03.2019 09:44
Насчет ADC(B)/SBC(B). В доках по ПДП написано, что у ADC бит V устанавливается, если результат до сложения был равен 077777 и бит С=1. А бит С устанавливается в случае dst=177777 и С=1. У SBC аналогично, но другие значения. Так вот вопрос состоит в том, что для словных и байтовых операций проверяется одно и тоже значение (хотя это бред при байтовой операции проверять 077777) или же соответствующее байтовое значение (для 077777 это 177, для 177777 - 377)?
-
? gid - 28.03.2019 10:54
там как-то запутано написано, проще говоря, бит V устанавливается, если при выполнении операции происходит смена знака числа.
Очевидно, что чтобы что-то изменилось, бит С должен быть равен 1, иначе ADC/SBC ничего не прибавляет/вычитает.
¤
Читая эти доки получается, что V устанавливается для ADC при смене знака с + на -, и не устанавливается при смене с - на +,
А для SBC - наоборот. Что с моей точки зрения как-то сложновато и непонятно. У меня так и сэмулировано, и я всё забываю проверить, так ли это на самом деле. Мне кажется, что V должен устанавливаться в любом случае смены знака числа.
достаточно проверять, что результат xor между знаковыми битами значения до операции и после операции равен 1
bool V = !!((old_value ^ new_value) & NBit_mask)
¤
[вопрос состоит в том, что для словных и байтовых операций проверяется одно и тоже значение]
Это где? У меня в эмуляторе для словных команд проверяется изменение бита 15, для байтовых - бита 7.
-
? Дмитрий - 28.03.2019 15:37
>> Это где?
Это по описанию. Оно одинаковое для словных/байтовых команд. Видимо копипаста и тогда рулила.
¤
Посмотрел на конструкцию установки бита V у ADD/SUB - ужас. Оказалось проще асмом - биты, которые выставляет интеловские инструкции полность соответствуют ПДПшным (все ведь из DEC растет). Получилось (в EBX дельфя хранит ссылку на класс - в данном случае CPU):
¤
mov dx,word ptr[ebx].FDataRg
sub word ptr[ebx].FALU,dx
sets [ebx].SignN
setz [ebx].SignZ
seto [ebx].SignV
setc [ebx].SignC
¤
и все. ADD аналогично.
-
? Дмитрий - 28.03.2019 16:22
Тьфу, наоборот же. FALU=FDataRG-FALU.
¤
mov dx,word ptr[ebx].FDataRg
mov cx,word ptr[ebx].FALU
sub dx,cx
mov word ptr[ebx].FALU,dx
sets [ebx].SignN
setz [ebx].SignZ
seto [ebx].SignV
setc [ebx].SignC
-
? microxa - 28.03.2019 18:33
gid, последняя оригинальная версия bk3.1 (http://boulder-dash.narod.ru/bk_emulator.html) содержала некое исправление
"In latest version fixed DirectSound driver bug ocuured during sound playing.
Now sound must be perfect"
Вам не известно, что это был за фикс?
(а то версии v3.0 а также собраные из исходников - заикаються)
-
? microxa - 28.03.2019 19:47
ЫЫы.. таки пришлось сдувать пыль с черного системника. подрубать переходник IDE->USB к винту, чтобы узнать что там был за перетрах со сборкой и какимто портированием на 6-ой быдлербуилдлер.. (а то совсем все забыл за овер 10лет)
¤
Значится в BkSound.cpp:
try
{
// Init Direct Sound
hr = DirectSoundCreate (NULL, &m_pDirectSound, NULL);
hr = m_pDirectSound->SetCooperativeLevel (pWnd->m_hWnd, DSSCL_EXCLUSIVE); m_BD.dwSize = sizeof (DSBUFFERDESC);
m_BD.dwFlags = /*fix!*/DSBCAPS_LOCSOFTWARE|DSBCAPS_GLOBALFOCUS|DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_CTRLPOSITIONNOTIFY;
¤
ну вот... казалось бы какаято мелочь.. какойто флажо4
DSBCAPS_LOCSOFTWARE
¤
а суко так звук поганил. шо хоть все с нуля переписывай :-D
-
? microxa - 28.03.2019 19:49
(ну тоесть наоборот.. его добавление все сказочно исправляло..)
-
? gid - 28.03.2019 19:52
Вообще без понятия. Исходников v3.1 то нет. Из того, что помню, в версии v3.0, собранной из исходников звук отставал на длину звуковых буферов. Т.е. на БК10 в бейсике жмёшь на кнопку, а звук раздаётся заметно позже. Ничего не заикалось.
Я буквально год, каждый день без выходных, с перерывами на работу, разбирался с его исходниками, переносил в гуй нового интерфейса и правил код, чтобы под x64 работало (указатели в 32-битных переменных). И после всего этого, как у меня заработало, тоже довольно долго бился над тем, чтобы задержку звука уменьшить. И какие-то проблемы там были. Я из-за этого и перешёл на WaveOut без сожалений, после того как увидел, что в BKBTL звук звучит лучше, чем у меня, просто взял весь код оттуда. А версию 3.1 даже не запускал. Нет исходников == нет смысла.
-
? microxa - 28.03.2019 19:59
Проверил уже и в минималистичном "движке" - с ним эвенты четкие, без наложения..
вот капец, а.. что значит как MFC - то блядь выбесил что приходилось на все нахуй забить и забыть... Даже о уже пройденом квесте..
-
? microxa - 28.03.2019 21:06
который разгадывал в 08/2009-ом (судя по кул-кацкерским заметкам)
(v3.1)
.text:004042B0 mov dword ptr [eax], 24h // SizeOF DSBD ???????
.text:004042B6 mov dword ptr [esi+54h], 18108h // 18100 - v3.0 атрибуты
.text:004042BD mov dword ptr [esi+5Ch], 0
.
используя IDAPRO))))))
да уж.. толком ниче не понимая в этом дирекцЫкс.. Да а кто понимал то, настолько тонких вещей..
-
? microxa - 30.03.2019 00:02
Но все это хорошо отработало применительно к моей модификации DSound движка А.Грабовца
дичайшая производительность На всех системах и на всех драйверах..
дополнительно заюзал
procedure NtWaitForSingleObject(hEvnt,Alert,Time:integer);stdcall; external 'ntdll.dll';
в обход kernel32/kernelbase.dll костылей:
¤
function Play_Buffer: LongInt;
label top,sk1;
var
i,dwStatus,hr:LongInt;
begin
pos := NtWaitForMultipleObjects(n_buffer, @_hEvents, 1,false,0);
pos := pos - 1; if pos < 0 then pos := n_buffer - 1;
.
и тоже замечательная совместимость с линейкой NT 2к/xp/w7/w10 :)
.
.
Но в случае с 50ти разметочным концептом от Ю.калмыкова все плохо:
В ХП вроде как вполне рилтаймово.. А вот:
.
На win7(starter sp1, шо шло к нетбуку samsung) временно стоял от XP-ишки: наблюдались какието затыки и щелчки. На уже семерочном драйвере(благо меняю их простым копированием) с поддержкой WaveRT/WASAPI
и на дефолтовом драйвере (типа устройство звука High Definition)
.
ДЕЙСТВИТЕЛЬНО существенная задержка, как описывал ув.gid:
>>Из того, что помню, в версии v3.0, собранной из исходников звук отставал на длину звуковых буферов. Т.е. ?>>на БК10 в бейсике жмёшь на кнопку, а звук раздаётся заметно позже.
Звук приходит через почти секунду..
>>Ничего не заикалось.
Под 10ткой заикания схожи что были как на ХП так и кието затыки с семерки :)
¤
Пробывал компилял с другими аттрибутами - пофигу... И даже пробывал обьявлять (по феншую из DirectX5 -9 SDK ) вначале PrimaryBuffer а уж потом вторичный OutputDSBuffer.. пофигу..
...
видимо 50 хендлов на разметке это действительно дофига..
-
? microxa - 30.03.2019 13:54
хотя о чем это говорит? Лишь о тотальной днищевости пОперационных систем на базе вислы-дрислы. Пидорасыж все делали то, охуевшие, по обезьяньи скача из студии студию :)
-
? microxa - 30.03.2019 14:53
ув.gid, а версия v3.1 собрана уже на шизуал студио 7.1. ну поставил чего (на 7рку, ибо на 2k/xp не терплю присутствия быдлоNET фреймвороковой ракоты).
попробывал скомпилить, и ога какже, понеслось блядь (почти на 99% сборке всего):
...
MemoryDumpCtrl.cpp(407) : error C2668: 'ATL::CStringT<BaseType,StringTraits>::__ctor' : ambiguous call to overloaded function
MSFManager.cpp(70) : error C2664: 'GetFileName' : cannot convert parameter 1 from 'bool' to 'CString'
No constructor could take the source type, or constructor overload resolution was ambiguous
MSFManager.cpp(90) : error C2316: 'CFileException' : cannot be caught as the destructor and/or copy
...
MSFManager.cpp - шо он делает, а? впрочем это хуйня.. а вот в int CBKApp::Run()
:
int CBKApp::Run()
{
// Init main BK Emulator loop
HACCEL hAccel = ::LoadAccelerators (NULL, MAKEINTRESOURCE (IDR_MAINFRAME));
¤
while (1)
{
// Get current message
if (!::PeekMessage (&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
¤
¤
c:\BK_v3.0_source\BK.cpp(139): error C3861: 'm_msgCur': identifier not found, even with argument-dependent lookup
..
нету идентификатора m_msgCur, который в VS C++6.0-той шизухе торчал в:
AFXWIN.h
// message pump for Run
MSG m_msgCur; // current message
...
В студии "охуительно новых возможносте"й (которые и нах ненужны), по негрософтовскому
обычаю все и вся уже в рот выебли (как наверное всех), хуй знает уже
как ее достать (видимо через жопу).
.
Но совершенно очевидно шо на таком пидорском гнилье, разве шо и творить - то
подобное.. Глючное, тормозное, и замороченое... ГНИЛЬЁ
-
? S_V_B - 30.03.2019 16:45
Что за поток сознанию? Выражения пожалуйста выбирайте.
Если есть что показать... вперед. И незачем всех и вся поносить.. BCB не чем не хуже вашего горячо любимого дельфи.. компиллер один.
Не нравится.. TASM в руки.
-
? microxa - 30.03.2019 18:25
шта? я лишь назвал вещи подлинными именами. так шта попрошу быть в этом согласным, адептов школы БК...
или чево эта школа никого ничему нахуй не научила???
школа выживания блядь... на 16килах.. Хотя.. для меня БК был лиш интерфейсом к RAM диску. на двух 32 килобайтных микрухах хитачи (выпиленых от сега мегадрайв, кстати, и приколоченых к полу в виде монтажки (типа приемника суко МАЛЬЧИШЬ нах). потом уже валом поперли с кэша вхуй ненужных 386/486), энергонезависимого RAM.
...
S_V_B, а Вы кстати, не пробывали собирать в BCB эмулятор БК ю.Калмыкова? А то приколитесь - поддержка там есть MFC даже примеры идут демонстрашек (cube/fire). С позиции так сказать "бэкашной школы"
..
или шта, "нихт ферштейн-твоя-моя-йа-йа-йа, да"?
...
касаемо такой "чушни" как "быдлер цэ 6"
мне с "быдлера" нужно было собрать Quake1, блядь и я его суко собрал нахуй:
..
я хуеты не держу потомушто "Бэка... школа жизни блядь.. ну ты понел.. (и давайте без "шта")
...
а почему, сынок?
http://vrtp.ru/uploads/post-108-1551524332.png
http://vrtp.ru/index.php?act=Attach&type=post&id=809390
а всё потомушто квейк.. вы вообще знаете что такое, блядь quake.exe на 486дх33/66/100/120/133 , а???
а то складываецо впечатление што после бк сразу за ЫБМЫ засели с ХПи
..
вот собирал, ре-кодил негрософт стайл сукоблядь(а то BCB6 пащель нах говорил с новым гото ога)
..
со страшной силой и с охуенно крутой графой суко "пашет-ебашет"
..
у BCB6 (онже быдлер) кстати осилил собрать BKASM от ув.VINX RU
и то в режиме совместимости с линупс. без ебаных memcpy_s всяких там "безопастных"
..
ну еах xor, xor во вставках це круть... йа йа...
ладно.. я пьяная.. бдь.. извинити..
-
? S_V_B - 30.03.2019 18:33
кесарю-кесарево... я уже давно забыл про ту блажь по сборке mfc..
-
? microxa - 30.03.2019 20:02
>>кесарю-кесарево...
А Авто-слесарю-... эЭЭ НЕТ СЫНОК, я дохуя уже понимал в какое стойло всех норовят поставить, загнув в позе раком блядь.. ладно бы негров, а то жеж рюсских людей (шо ленивы так шо врот да хоть через жепю ипали всех)
Эпик1 был у хобот но там штото его очухонило с ошыпкой17 це означало шо "ввёден код" а какой - а хуz его знает. вы вроде за эпик то спрашивали?
я о нем Господа умолял. шо даже поспорил (проспорил "по полной" да).
там были поскипаны данные - похуй нахуй все собралось все стартовало... я забил уже на то что нихуя, чегото
не Понимаю.. а на бэкашке лехко все это могло... (было быть)
>>>я уже давно забыл про ту блажь по сборке mfc
Да и я не настолько поехавший... Хотя и представляло "академический интерес"
вы все верно сказали: бк из на сделало в первую очередь хакеров..
япьяная. забыла что надо было сказать (хотя все все поняли, ДАЖЕ БОЛЬШЕ)
-
? S_V_B - 30.03.2019 20:10
EPIC1 есть живой?
-
? microxa - 30.03.2019 20:19
Ы\S_V_B, эпик для Бк.. это больше чем квэйк для писюка.. вот..
-
? microxa - 30.03.2019 20:37
Разницы скачаного с R-games и хоботовым - в один байт. я знал даже это но м.б подзабыл. думая какой это ужос ебаный Бк в охуенном RAM-disk
-
? microxa - 31.03.2019 02:35
gid, сынок, я понимать шо вам похуй. как похуй и мне на вас. как и на всех вас "пидорасов от негрософт"
так што с хуйцами во рту всепозравлямсх вас уебков поздравлямс..
я понимать да мне тоже глубоко всх вас в рот и жопу ипаодсади чоть..
думал всех подсадить на негрософт фреем ворк (а подсади чо, он такой охуеннеый)?
да хуйцов всем вам в врот...
че думаеш перец штоль продвинутый ниибацо?
как сосали хуй так и...
и это грустно товаищи....
-
? microxa - 31.03.2019 02:41
слыш ты сука, из русских людей пидорасов не делай да
а то приду и убью
-
? microxa - 31.03.2019 02:53
как в DOS-овском quake это он научил блядь. я тут вообще не причем. идите все на нахуй
-
? microxa - 31.03.2019 02:58
самое грустное што вот все.. все пидорасы нахуй. тяжело опедорашеные по голове.
и я суко тоже...
-
? microxa - 31.03.2019 03:15
ну ребят, конечножеж всем респект и уважуха..
не программист. вообще не знаю что и чего я... но вот компутер Бк.. забудте его пацаны. вы молодые вам еще жить. забудте пожалуста.
а я ни как не могу...
-
? microxa - 31.03.2019 03:59
вам то чего от него надо? кроме кактех же хуййов защеку он ничего никому не давал..
и не даст.. потомушто "обезьяны поехавшие "
тому пример "йа сам".. это капец обезьяна-мало того что тупорылая так еще это..
незнаю даже чего...
-
? microxa - 31.03.2019 04:17
ну окей ребят. расскажу блядь. что такое компутер Бэээка. Ну как вам сказать то блядь а? КОМПЮТЕР НЕВОЗМОЖНОГО БЛЯДЬ вот шо таке компутер бэээка...
для него небыло (да и нет) ничего невозможного.. понимаете?
я тоже нет.. за многие вещи и ситуации казалось ну.. действительно не может быть. а хуяк - есть..
понимаете.. поэтому эмулятор бэка всегда был со мной. Потомушто детектилась такая вот ХУЯТА.. а вам то зачем оно? посоны это не шутка... я его чего и тянул. тем что нихуя не понимая блядь я чтото знал про строение всяке там..
и это более чем странно..
но вам то оно нафига???
-
? microxa - 31.03.2019 04:54
вот поэтому каждая функция в таком эмуляторе обязана быть/превосходить лучшим из достижимого.
а вы хули думали а..
это не шутки ребят.. для меня это не "эмулятор" а "прямой преобразователь..."
это очень опасно, ребят...
-
? Manwe - 31.03.2019 22:04
У меня есть рациональное предложение для одной из функций эмулятора:
конвертирование bin в wav делать в формате 22 КГц моно 8 бит. Будет занимать в 8 раз меньше места (сейчас качество избыточное). Для теста сконвертировал в такой формат аудиоредактором, запустил с iPhone – БК читает без проблем.
-
? gid - 01.04.2019 09:57
[сейчас качество избыточное]
тут дело в том, что я не только конвертирую bin <-> wav, но ещё и сохраняю Wav с программами из эмулятора. И для этого используется один и тот же код.
Сейчас там такая проблема: программа сохранённая на частоте 48кГц, не читается на частоте 44100Гц, и наоборот. Из-за того, что я как-то неправильно передискретизирую файлы.
Как только мне подскажут, как надо делать правильно, чтобы передискретизировать из любой частоты в любую и при этом программа будет читаться эмулятором, то я сразу смогу сделать фиксированный формат сохранения wav.
¤
Потому что сейчас внутри эмулятора звук хранится в 16-битном формате, и для генерации 8 битного звука нужно будет писать новые функции, а мне туда лезть неохота.
-
? Manwe - 01.04.2019 11:48
WAV, полученный из bin с помощью утилиты конвертации - идеальный, в нём чистая квадратная волна. Даже после перевода в 22 КГц (без интерполяции, просто выборкой каждого второго байта) такой WAV читается живой БКшкой без проблем с первого раза (пробовал с iPhone на максимальной громкости).
¤
А вот WAV, сграбленный из эмулятора в реальном времени (кнопка записи в окне "Управление чтением/записью лент") - совсем не такой. Он сильно сглаженный (хотя фильтр у меня отключен). Проверял копировщиком HELP12 (он в начале пишет загрузчик в обычном формате).
Что кажется довольно странным: ведь динамик однобитный и на выходе должна получиться та же квадратная волна. Я опасаюсь, что сглаженный звук ухудшает качество чтения такого WAVа на реальной БК.
-
? gid - 01.04.2019 12:30
[Он сильно сглаженный (хотя фильтр у меня отключен)]
Там в эмуляторе присобачен неотключаемый эмулятора коннденсатора, чтобы звук пищалки был похож на настоящий.
а с выхода реальной БКашки тоже получается менадр? У моей БКашки на выходе тоже конденсатор и сигнал получается тоже сглаженный, что никак не мешает записи а потом и чтению с магнитофона
-
? Manwe - 01.04.2019 13:35
[чтобы звук пищалки был похож на настоящий]
Это здорово, но кажется более подходящим к режиму "фильтр". В эмуляторах Amiga фильтр включается отдельной опцией, чтобы было похоже на реальное железо.
Всё же чистый цифровой звук имеет свою ценность.
¤
[что никак не мешает записи а потом и чтению с магнитофона]
Сдаётся мне, что уже сглаженный звук после пересчёта на 22 КГц испортится и будет плохо читаться. Я проверю.
-
? Manwe - 01.04.2019 13:52
Проверил. Запусти в эмуляторе копировщик HELP12. Записал из эмулятора WAV. 44 КГц 16 бит. Считал на живой БК. Результаты такие:
В обычном формате (первая часть WAVа) программа грузится. В формате HELP12 (вторая часть WAVа) не грузится.
Вероятно, сглаживание подкузьмило.
-
? Manwe - 01.04.2019 22:45
[Как только мне подскажут, как надо делать правильно, чтобы передискретизировать из любой частоты в любую]
В данном случае – без интерполяции.
Допустим, надо преобразовать файл 44.1 КГц в 48 КГц. Двигаем первый указатель по файлу с шагом 0.91875 (44.1/48), а второй указатель с шагом 1. Берём целую часть от первого указателя и выбираем значение от туда. Помещаем по адресу второго указателя.
Если 48 КГц преобразуем в 44.1 КГц, то первый указатель двигаем с шагом 48/44,1.
Ну и я всё же из лучших побуждений советую добавить возможность записывать звук биппера в Wav без эмуляции конденсатора. Тогда мы сможем пользоваться крутыми штуками типа HELP4, HELP7, HELP12.
-
? gid - 02.04.2019 07:49
Именно так я и делаю, и хренушки, 48000->44100 и 44100->48000 при этом перестаёт пониматься. Хотя казалось бы всего 1 сэмпл дублируется/удаляется через каждые 10 сэмплов и такой странный результат.
-
? S_V_B - 02.04.2019 08:08
Возможно при ковертации в случайном порядке теряется значимая часть сигнала (отрезали хвостик, который впоследствии и не читается).
Возможно правильнее будет при чтении файла Wav сначала переводить в цифру, а потом писать с нужной дискретизацией.. тогда сто проц будет работать :)
-
? S_V_B - 02.04.2019 08:29
/* переводить в цифру */ я имел в виду грузить программу в память, проверять КС, потом писать с другой дискретизацией.
-
? gid - 02.04.2019 09:45
не каждый хочет грузить программу в память в виде bin файла. Некоторые хотят слышать эти ностальгические звуки из магнитофона. И эмулятор это позволяет - грузить фалы wavками. И вот, когда в эмуляторе была всего одна рабочая частота дискретизации, не было никаких проблем. А как стало можно её задавать в настройках - неожиданно вылезло в самом том месте, которое я старался по возможности не трогать.
Проблема начинается с того, что программа загрузки с магнитофона монитора БК10 перестаёт вообще определять конец начальной синхрнизации и начало блока данных.
¤
там даже сложнее, чем кажется.
//!!!Остался один непонятный косяк. Wav файлы, которые записаны эмулятором
// на частотах 44100 и 96000 не воспринимаются эмулятором на частоте 48000
// даже преобразованный в tap такой wav не воспринимается. Как-то неправильно
// ресэмплинг делается. Там каждый 10й(11й) сэмпл дублируется /удаляется
// Wav файл, записанный на 48000 не воспринимается на частоте 44100, а на
// 96000 - воспринимается.
я ещё никак понять не могу такой феномен 96000->48000 тоже не работает, но просто в случайных местах просто перестаёт читаться файл. Вот тут-то в чём проблема?
¤
Всё это касается не конвертирования, а именно загрузки wav через эмуляцию магнитофонного входа посредством выполнения программы из мониторе БК10. Если записать Wav эмулятором с одной частотой дискретизации и на ней же читать - всё работает как на реальном железе, а если читать с другой частотой дискретизации - работать перестаёт.
¤
Ресемплер с интерполяцией превращает программный файл в жуткое непотребство, которое вообще никак не читается, а ресемплер с вставкой/удалением сэмплов - работает не так, как я от него ожидаю. И хз, что я делаю не так.
-
? S_V_B - 02.04.2019 12:56
/* Некоторые хотят слышать эти ностальгические звуки из магнитофона */
В гробу я их слышал, наслушался в детстве (с отверткой в руках на ходу подкручиваю головку), пока заветный вопросик не выскочит :)
-
? S_V_B - 02.04.2019 13:01
/* 96000->48000 тоже не работает*/
Действительно не понятно, если в случае с 44100 можно грешить на сбой арифметики (чет/нечет)..
-
? S_V_B - 02.04.2019 13:04
(чет/нечет) типа сдвиг по фазе происходит
-
? Manwe - 02.04.2019 17:28
А на слух файлы с разной частотой звучат одинаково?
-
? gid - 02.04.2019 18:31
конечно, у них даже спектрограмма на вид одинаковая и в audacity выглядят одинаково
-
? microxa - 11.04.2019 19:10
всеже постараюсь обьяснится.
както смешно уже даже.. но поймите, на тот момент той бухой ереси казалось невозможным получить вменемый
"перфоманс".. но чтото про "невозможное" было верно:
¤
СУКО.ОНО РАБОТАЕТ.
¤
procedure ThreadSimNoFrame(id:integer); stdcall;
var acc,t,delay:integer;
begin
¤
while quit=0 do begin
acc := 0;
¤
delay := ExecSim() * 400;//0;1660мгц
¤
while acc < delay do begin
t:=rdtsc();
DelayEx( 0, p_arg ); //SleepEx(0,false); //NtDelayExecution(Alertable:boolean;Interval:PInt64);
acc:=acc+ (rdtsc() - t);
end;
¤
end;
¤
// quit:=0;
end;
¤
в том самом архаичном бесфреймовом режиме. особо не напрягая (по распределению CPU) виндовс7. а почему 7рку (а потом и 10тку)?
а потомушто юзали они TSC счетчик что в процу. а XP юзала некий PM-timer. (ну все побагфиксилось да).
¤
Единственное что . короч ладно. TSC Perf Count & хотяб некоторая псевдвухядерность (типа хупертрединга). И даже скинутый по FSB атомN435 влехкую тащит эту "невозможность в лехкой реализации"
..
так что это.. не знаю чего...
-
? microxa - 12.04.2019 09:32
а, кстати по поводу ввода 96/192кгц звука. В фреймовом двиге имелась значительная недоработка в плане заполнения.. и еслиб гм.. 'обьязьяна' поменьше тупорылилась-бы пойлом.. то задачка давнобы решилась элегантным вилле:
...
aud_pos := (CPU^.cmnd_time shl i_shl) div frame_div;
//заполнение аудиобуферов
if aud_pos > frame_length then aud_pos := frame_length;
while i < aud_pos do begin
if (CPU^.port_out_177716 and 64) <> 0 then
wav:[i] := Bit16_1 else _wav^[i] := Bit16_0;
ay_wav^[i] := synth_next();
i := i + 1;
end;
end;
...
После чего все довольно приемлемо звучит. Программный 'двухголосый' синтез (MELMAN/True Poker REKL) играют и звучат на 96000/192000 просто СКАЗОЧНО (без шумоподобных артефактов), и свисты у записи чистенькие, НЕЖЕЛИ на 44100/48000 (почему так хз)...
...
Бесфреймовый метод на RDTSC не совсем точен, звук хоть и есть но на простейшем позиционном методе, который полагается на соответствии скоростей (поэтому с подхрипами).. Так что тут еще разрабатывать и отрабатывать технологии..
-
? microxa - 12.04.2019 14:24
Вот все ойти в даунской жопеж какойто.. Где движки с потактово точным отсчетом ?
..
Кстати меня чего и прикалывало ядро (точней HAL даже в нем там счетчик) на базе 3.57мгц таймера: ну он суть тогоже RDTSC только значение 32битного счетчика бралось из порта 1008, занимая порядка пару тыщ тактов млять. Но зато не было рассинхрона на сквозном аудио (в некоторых мультимедия прогах использующих Asio2All/Realtek ASIO ).
..
обертка над "какбэ рилтаймовым" висла-дрисла WASAPI (с применением некоего костылька AVRT для задач создания мультимедийных потоков???)
https://github.com/EddieRingle/portaudio/blob/master/src/hostapi/wasapi/pa_win_wasapi.c
хоть и на сях, и с вроде какойто реализацией nano-sleep-ов, но что-то как-то, заморочено..
..
Хрен его знает, что там в винде есть хорошего предложить в такой интересной тематике. Кроме как NtDelayExecution->который суть вызов->NtDelayExecutionThread, который хотябы их шерудит и распределяет по ядрам...
...
вроде и нечего. а все эти таймерки/слипы опятьже обертки над QueryPerfomanceCounter который суть вызов NtQueryPerfomanceCounter возвращающий значение команды RDTSC...
несколько рандомное такое да :)
-
? microxa - 12.04.2019 14:39
а точным бесфреймовым методом я занимался с переделаным под 32битку Тюрьевским эмулем (благо проект погиб в связи с кончиной 4гигового винча с 64килобайтовыми кластерами. Был этакий осьдевелоперский хелловорлд с переключением в защищенку и захватом таймерка и прочей канители.. Кончилось это аж припайкой сигнала спикера (который суть тамер ви53 какойт) к пину NMI мля Socket7/PGA370-ых.. Хреначило с таймерка что там овер 100килогерц..
маловато было конечно.. Хотелось отыметь все 3мегагерца . Алгоритмически казалось бы хули там. чикнул пикнул. и опять на HLT-е тусуй.. а вот хуй.. все через жопу и тормоза у х86 этих.. даже похрен что частота уже была овер 1гигагерца..
А вы говорите ипацо..
-
? microxa - 12.04.2019 17:47
вот оптимизируешь блядь.. оптимизируеш... следишь как компилер собрал код. что даже передавать управление ядерной мерзопакости не хочется. какже суко тошнит от этого порождения шизуал студио угрёбища (оптимизировал haltsc.dll шоб джампов левых не делал и вызов к RDTSC был более выровненым. а то каждый такт драгценный блядь, в режиме бесфреймовой эмуляции.. ладно бы там чего - а тожеж священного компутера бэка. )... которое в 7 рке и 10тке стало еще поганее..
¤
картинко с софтайсиком http://www.cqham.ru/forum/attachment.php?attachmentid=260211&d=1491346075
думал мож на семерке пойдет.. а хуй там.. он даже на хп-сп3 не пашет (ну то со спецом жеж испоганили что- то там пидры поехавшие, к улыбкам и радосным маханиям лапкками шизоидного рачья то, не уебашеным с ноги кирзачом то пыльным). ну да. Старье блядь.. а на новье то разве что сосать не пересосать. развития нет никакого. одна деградация нахуй
-
? microxa - 13.04.2019 11:50
вначале не понял юмора почему эта AVRT висит в процессе БК0010 под семеркой - а потом дошло(ну еще потыкал это палочкой в IDA (с некоторым отвращением)). короч DSOUND в 2к/хп это надстройка над KS-WDM а висладрисловский DSOUND - надстройка над этим WASAPI.
-
? microxa - 13.04.2019 12:50
но куда больше какихто "своих" системных хаков.. Грузанул под другим именем в которой "пофиксил" вызов AVRT чтоб не грузило ее. Вроде работает как ни в чем не бывало. так что костылек то как и следовало ожидать особо и нах был ненужен. Либы с 2к/хп работают (по крайней мере пытаються чтото выдавить в звуковую) но уже капец с какими глюками на WaitObject.
...
ну хоть в семерке прокатывает ололо как исполнение рынг0 кода в узермодовой прожке..
это когда из дрова делается обратный каллбек
function WriteDispatch(const DeviceObject : PDEVICE_OBJECT;const Irp : PIRP) : NTSTATUS; stdcall;
var
Ring0Proc : procedure;
begin
Ring0Proc := Irp.UserBuffer;
try
Ring0Proc();
except
end;
ну типа так вот.. а тожеж мои хеловорлды speed-step'ом балуюцо:
procedure enabless; assembler;
asm
mov ecx,$1A0
rdmsr
or eax,65536
wrmsr
end;
..
ну то переделаная дос прожка
begin
writeln('Speedstep 1.0 by Falcosoft');
writeln('usage: sstepp [multiplier] [voltageid] -without parameters shows CPU info');
¤
..
так В десятке блядь этот прием уже не прокатывает.. выпилили к хуям такую возможность каллбэка обратного с дрова.. квест интереснейший по определению скорости (у скинутого по FSB к томуже) еще проца. ибо по RDTSC счетчику оно какбэ 774мгц а по факту она 580мгц.. и вот поди определи...
¤
Assign(f,'\\.\\MicroDrv');
Reset(f,1);
proc := @enabless;
BlockWrite(f,proc^,4);
..
ну и вот таким вот вжик-вжиком .. хуяк и кернелмодес в консольной прожке.. удобно чо..
вот шо значит русская школа бэкашинга.. а не какаято там замороченая хуета от негрософта..
-
? Manwe - 20.04.2019 14:36
gid, я сейчас посмотрел/послушал живую БУ0010 – нет конденсатора у пищалки.
-
? gid - 20.04.2019 16:02
У моих БК0010-01 и БК0011М есть. У БК0011М это C15 6.8 нФ на схеме. Там 3битный ЦАП из резисторов R35,R29,R30,R31 и параллельно стоит конденсатор, благодаря которому биперный музон на БК звучит слушабельно.
У БК0010-01 это С48 6.8 нФ и 2битный ЦАП на R29,R30,R31
Но с БК0010 уже разнообразие есть. На каких-то моделях вместо R29 перемычка, А на каких-то - нет конденсатора. По крайней мере есть в сети такая схема БК0010, без конденсатора.
-
? Manwe - 20.04.2019 19:56
Я просто сделал (с помощью импульсной модуляции) такую красоту на пищалке: http://thesands.ru/bk0010/3ch2-spealer-volume.png
Записал звук из эмулятора. Классно. Звучит так же как и выглядит.
Попробовал на реальной БК0010 и расстроился. Слышна разная скважность, а эффекта изменения громкости нет.
-
? gid - 20.04.2019 22:52
там ещё такая особенность, на встроенную пищалку выводится только 1 бит, 6-й, без всяких сглаживающих конденсаторов, а на магнитофонный - уже 2 бита 6-й и 5-й.
Но всё равно изменение уровня амплитуды простым нетренированным ухом не улавливается, по крайней мере я не слышал никогда, это видно только на спектрограмме.
А пищалка со своим одним битом не песочит из-за своей инерционности.
Зато громкость регулируется скважностью, как в ШИМ.
-
? Manwe - 21.04.2019 20:26
Сейчас проверил на БК0011М – пищалка песочит, слышна скважность и никакого изменения громкости с помощью ШИМ не получается.
Поставил конденсатор 1 мкфд – тогда да, эффект как в эмуляторе. Только пищалка стала в несколько раз тише, естественно.
-
? microxa - 21.04.2019 23:46
Вобщем толку особо и нет от режима ядра (вспомнил некоторые хеловорлды (с ужоснахом забытые) по перехвату/отработки прерываний APIC).. Но вот както, да... Это какаято мутная дичь, довольно тухлая, унылая и незанятная.
..
Поэтому за бортом остануцо такие вещи как БК010 с троичной а то и квантовой логикой..
..
Стыдно товаищи за наших "амеропидрских партнеров" опедорасивших весь этот мирок х86-ой поганью(хотя может и ура (шо аж аллилуя нах, да))
...
Вот эмулятор бк0010 единственное, благодаря чему, еще хоть поддерживаю некоторую 'интелектуальную форму' в программировании, которое обыдлилось до какогото патологического апофеоза, что иначе как 'IT-раком' это уже не назвать.. (гип гип ура шо аж аллилуя нах, да)...
...
А! Допиливал муз. синтез AY (а то стерео не было, и какието артефакты). Как оказалось япошка в версиях emu2149.c только лишь испортил звучание 'огибающих' .
...
gid, посему пересматривал вашу реализацию, и нашел её таки наиболее удачной, по алгоритмике, в подфункции 'calc':
в этом месте:
...
isON := ((tone_toggle[i] or tmask[i]) and (noise_toggle or nmask[i]));
en := ((env[i] and env_ptr) or volume[i]) and isON;
¤
mix_L := mix_L + voltbl[i, en];
mix_R := mix_R + voltbl[1+i*2,en];
...
И както на ура перепастилось на паскаль..
...
Хотя некоторый момент, связаный с применением плавучки не совсем устраивал- (кстати там до жопы хватает и 32бит float (c которой Intel C++ делает очаровательный SSE оптимайз).
.. Впрочем понятно без расфуфыривания даже мелкой задачи в современном ойти никак..
Ну на 'интегралке' пиликает без проблем (незнание математики, решилось копипастингом калькуляции рассчета стерео таблиц, взятой из AY.PAS (AY плеера Бульбы)).
.
В целом же, и упростилось, и стало несколько более опциональным (float/int),
...
Короч это.. ну ура товаищи, да..
-
? Manwe - 21.04.2019 23:58
gid, вот показания осцилографа:
Так выглядит пьезодинамик: http://thesands.ru/bk0010/bk11-beeper.m4v
Так выглядит магнитофонный выход: http://thesands.ru/bk0010/bk11-lineout.m4v
Напомню, что эмуляторный звук такой: http://thesands.ru/bk0010/3ch2-spealer-volume.png
Лично мне приятней слушать эмуляторный. Но он не соответствует уже трём протестированным БКшкам.
-
? S_V_B - 22.04.2019 06:44
Где-то читал про недокументированные возможности спектрума, там тоже писали что магнитофонный ЦАП трехбитный, якобы заложили возможность подключения не только бытовых но и спец. магнитофонов.
-
? Manwe - 22.04.2019 10:08
В любом случае, у поздних моделей БК только один бит подключен к пищалке и магнитофонному выходу.
-
? gid - 22.04.2019 10:21
microxa, не вижу ничего плохого в использовании плавучки, тем более что я использую в работе исключительно процессоры AMD, начиная с K6, у них с быстродействием FPU нет проблем в отличии Интеловских. А начиная с 64битных АМД так и вообще никакой разницы между использованием плавающей арифметики и целочисленной нету. Т.е. есть, но она не принципиальна. В отличии от дурацих дырявых интеловких поделий.
¤
Manwe, я вот не вижу особой разницы в сигналах с магнитофонного выхода и генерируемого эмулятором. Просто в эмуляторе:
1. амплитудные уровни не соответствуют действительным. Я взял их на глаз, когда захватил сигнал с БК11М в Audacity с 8-ю уровнями амплитуды и просто примерно рассчитал процентное соотношение от максимальной амплитуды.
2. к выходному сигналу применена ещё фильтрация с помощью БПФ, это из-за неё такие волны на плечах амплитуд и пики на задних фронтах и звук приятнее.
¤
Я ведь не придумываю, я взял демку с биперными мелодиями "меломан" и запустил её на своей БК11М (БК10 у меня тогда ещё не было), записал несколько мелодий на ПК в Audacity и просто как мог постарался воссоздать такую же форму сигнала по возможности. Без учёта джиттера и теплового шума аналогового тракта.
-
? Manwe - 22.04.2019 11:03
«Меломан» или «Клавесин»? Мне казалось что Меломан играл через внешнюю приставку на УП-порт.
-
? Manwe - 22.04.2019 11:20
Спутал с «Маэстро», кажется.
-
? gid - 22.04.2019 12:13
маестро и клавесин - это такие редакторы биперных музонов.
маестро был продвинутым и к нему можно было писать свои модули воспроизведения. И все, кому не лень их писали. даже я для себя написал модули, воспроизводящие музыку на ковокс и на AY, только получилось не очень.
А меломан - одна из многих демок, где собраны разные биперные мелодии разных типов. Причём вариантов меломана было более чем 1.
-
? microxa - 22.04.2019 14:47
>>>не вижу ничего плохого в использовании плавучки
Да понятно, всетаки тут разные 'старые школы' и подходы..
.
Для меня интересно оставатся в около 64кб как по обьему кода так и по размеру EXE.
.
И вроде как получен (касаемо emu2149 копипаст-рерайтинга), даже некоторый выигрыш, и по машкоду, особенно после некоторого реворкинга с расположением данных в структуре PSG, теперь можно сказать устраивает, более чем (всетоке дельфи). а то до этого, сплошные нули топтались, ну.. (а'ля 64битка):
https://pastebin.com/iCm6eySC
..
>>тем более что я использую в работе исключительно процессоры AMD, начиная с K6, у них с быстродействием FPU >>нет проблем в отличии Интеловских.
ну тут конечно, можно поднавалить DSP-обработки, такой как эмуляция конденсаторов, методами фурье. Так что тут 'хозяин-барин', да и быстродействие особенно десктоповых х86/64 такое что о подобной мелочи не стоит даже задумыватся..
Вот только кодинг у меня на них совершенно не шёл.. сплошной gaming..
-
? microxa - 22.04.2019 18:42
На писюке конешно осталось мистическое касаемо взвода APIC на частоте деленой помоему FSB/то ли 32 толи 64 толи 256 (минимум).. Что теоритически позволяло бы иметь наносекундно точные задержки, тусуя на HLT.. Так
что интерес к бесфреймовому методу чисто опциональный... (Дико странно что он всетоке есть. и вроде как плотно занимался этой тематикой. не помню уже шо хотел. хотелось - но болт на все 666 с контрагайкой кооч. поэтому и перехват прерываний. и апик-лапик хуяпик. в хупертрейде какбе двухядерном. и короч хрень все какаято посоны.. )ах
...
а в чем была трабла? во первых эмуль Дмитрия Тюрьева. вы спросите ШО? а я сказал - вот сконоплил суко нахуй. Ис уконахуй идет.. еще раз для 'в танке горбатых' : идет блядь в консоли нах виндопс хп и семерки ебаной. кстати в семерке ебаной в консоли дос идет квейк1. ну то детали (от танков).. десятка ебаная подкручена так что от хп ток дрова старые на рылотек подхватила. а на ынтел встройку в чип атом послала нах. старое оборудование с поддержкой святага консольного моде 80х25. ламонтины ебаные лапки отбили чтобы выпилить нахуй его. типа жить всем мешал. достойно.
...
а ну вот скомпилял C:\...rojects\bk0010\!files\!flat\!Dos>asm.bat
Turbo Assembler Version 3.1 Copyright (c) 1988, 1992 Borland International
¤
Assembling file: bk.ASM
Error messages: None
Warning messages: None
Passes: 2
Remaining memory: 367k
¤
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International
Warning: No stack
...
пашет ебашет на но вот блядь не пашет блядь нихуя в эмуляторе ебаного х86-486 досбокс. да и хуйс ним. да..
..
..
gid, слыш товаищ обьясни контуженому чем я обязан ебаному х86... как будто вся жизнь проеблась.. и как будто ф пустую.. смешно или плакать.. никак не могу поняит... обьясни тупому пожалуста
-
? microxa - 22.04.2019 19:13
gid, я приехал на дачу и по пластунски прополз блядь. шоп ты знал. дистанцию нихуевую. до лопатника. я его ебанул кооч. а все потомушт Дух Машин блядь.. он сказал как все сделать. роботу Вертеру блядь
...
так вот я ебанул пицот гдето рублей на которых и прибарахлил в нужном месте и в нужное время недопаяный компутер бэка.. так шта какой амд . какой fpu.. шо ты несешь. я пионер старой школы блядь. я галстук рвал на клочки повязывая на куст где упал сам Ю.Гагарин. не то што вы.. пидорасы... все пидорасы.. и ниибет блядь
-
? microxa - 22.04.2019 19:43
от переводчика с 'обезяньего' : это не человек. он нехотел? нет. он эта. да, обезьяна. не понимать русский. не знаю как обьяснить. лучше не понимать. да.
-
? microxa - 22.04.2019 20:12
это вадик. я не хотел ему сообщения передавать. и не советовал.
..
ЭТО ВАДИк... (вадик, пожалей всех нас, ну не надо)
имел блядь все сокеты7 -462/ 754/939 вы чего думали а?
а вы хули думали.. и всё - ХУЕТА.. я сказал блядь..
-
? gid - 22.04.2019 21:00
Не нравится x86? Есть много других платформ, посмотрите например на ARM v7. Это самое доступное. А есть ещё малодоступное и совсем недоступное, разные там RISC архитектуры, MIPS семейства. Вот там простор для творчества и есть куда моск приложить, так что времени даже поесть не останется, не то что побухать.
-
? microxa - 23.04.2019 10:30
>>Не нравится x86?
я не знаю что это такое. и почему.. оно такое.. вот хотелось бы уточнить у трезвомыслящих .. так сказать существ или созданий не знаю. не знаю даже кого и о чем спрашиваю.
...
А ведь вопрос он в другом. что такое х86?
...
вадик, он был компьютерный специалист.. к его ногам складывались фашиские (этот наркоман считал их фашискими)
знамена в виде плат всякоразных х86. и он решал что с ними.. кого уебло там разрядом (у него была микрочпоколка преобразователь 400v).. Отсеивал, узнавая, скоко отжать. и при (зачастую) негодной ситуации, производил некий обряд. ЧИПКИЛЛИНГ.
что такое х86? ничего, ниочем. это не то очем мы(русские пионеры), это не то чем оказалось.. вот весь вердикт. и вадик уеб около тысячи х86-ых хуевин... исповедовал месть.. и на вопрос зачем? был ответ.. а за БК... ноль ноль десять...
-
? microxa - 23.04.2019 17:19
>>Есть много других платформ, посмотрите например на ARM v7. Это самое доступное. А есть ещё малодоступное и >>совсем недоступное, разные там RISC архитектуры, MIPS семейства
ну как.. поглядываем в замочную скважину за.. (пока еще) энтузиастами в.. таком хайтеке..
...
какойто глюк в матрице.. или не знаю чего.. эта тупорылорожая обезьяна собрала ЭМУЛЯТОР СЕГЕ...
...
оно у меня овер десять лет нихуя не собиралось.. а тут на хуяк хуяк и вжик -вжик..
суко..
шо за хуйня... а?
¤
ебашит со страшной силой на 580мгц атом...
посоны окей.. я пока в шоке.. не понимать. шо це таке..
ЕЕЕБАТЬ КОПАТЬ.. а...
ААААААААААААААААААААААААААААА....
https://vrtp.ru/index.php?showtopic=30775&st=120&#entry815374
-
? microxa - 24.04.2019 18:34
>>>времени даже поесть не останется, не то что побухать.
нде.. походу с последним абзацц... на попойку пришел иисус и фашисты... и от страшного гласа "все пидоры" пришлось аж на землю припасть и по пластунски... проползать дистанцию нефиговую.. двое нехороших товаищей в реанимации.. с потерей сознания (иисус ебанул лбом.. шо аж это.. короч не знаю шо за дикость была)
-
? microxa - 24.04.2019 19:31
ну все какбы ок.. постановили 'распитие и мелкое хулиганство' пострадавшие отделались штрафаком (нормально).. а вот на вопрос что это всетоке было.. что то както.. ответа нет(вобщемто кодла отморозков известная.. но не советут ничего узнавать)
-
? microxa - 05.05.2019 00:00
был занят.. постился.. лежа на печи. и это как его.. млять.. HPET вот там торчит по адресу FED00000 ну с ним короч просношался - в общемта хуй чего, в таком сокральном деле как.. ну вы поняли..
казалось хуйня делов сэмулировать потактно бесфреймово. обделались же хуеты буржуины ипаные, да - а чета шишок под носок нахуй всем сука. сосать хуйцов по полной программе. и радовацо. исус нах воскресе блядь..
-
? microxa - 05.05.2019 01:01
p.s
хич перфомансе таймерок. по сути чуть-чуть лучше чем pmtimer-т.к деление на 14.318мгц клокер.. надстройка над 100герцовым RTC. В бонусах 32/64бит time-stamp счетчик, отображенный на память. только обращение к такой охуенной памяти->(шина обрубок DMI) гдето 500 тактов...
а вот мифический Apic-таймерок,как оказалось даже семерка не юзала.. зато активировала, HPET причем втихушу(Откуда его брала ХЗ, даже в диспетчере не торчит) HPET этот..
полностью активировать можно:
bcdedit /set useplatformclock true
но суть в том что толку с него никакого. APIC-вый таймерок вроде бы 10тка научилась юзать.. но что он там из себя представляет - ХЗ... походу то еще кидалово...
-
? microxa - 05.05.2019 01:14
вобщем я не понимаю чем занимаюцо все эти ебаные х86... причем вне зависимости амд это или ынтел.. говно есть говно... и как показывает опыт и практика бк0010 во многом был и остаецо лутшим достижением совьецкого союза...
-
? microxa - 05.05.2019 09:24
Самое интересное - системные тики/значение TSC счетчика с HPET можно вообще
выключить (!) (QueryPerformanceCounter будет возвращать 0)...
...
Это ни как даже не сказывается на работу событийно/ждущего движка эмулятора
БК0010 (простому фреймовому варианту) достаточно того что приходит по
прерываниям от клавы и аудио.. Скорее наоборот, поскольку:
...
Другие проги практически в заморозке (например диспетчер задач, не обновляет
графики). Или тот консольный бред закостылизированый в семерке через
conhost.exe, FAR в зависании в ожидании тикового фрейма, угу)...
...
Хотя кому щас нужна консоль то эта.. Кстати у А.Грабовца была даже реализация
эмуля бк0010 с редиректом текстовых EMT на консольный вывод..
...
А текстовый режим 80х25... К хуям выпилили пидоры его в новых процессорах
со встроеной видимо картой.. коре-хуере всякие там.. амд райзон-хуяйзон..
Хотя на такие даже семерка хрен встанет.. (а если и встанет - так упадет с
глюканата)
.
а ведь самое лучшее что было, что суко запомнилось в писюках-то этих ипаных
- разве что этот режим.. текстовый..
..
короч ура дорогие товаищи, да.. у буржуина все проебано по самое днище...
..
ура...
-
? microxa - 11.05.2019 02:39
Ну вот, не мог побухать на 9-ое: так как маялсо особой дурью:
собирал ядро WRK 1-2, короч,(для виндовс сервера 2003).
..
Потом проходил квест с кернелхаком SoftICE, (ну как полежу на печи,
помедитирую на БК0010 в бесфреймовом режиме (какойто он ссуко волшебный)).
..
Ну и короч фигня делов: отымелась win2003 Server (типа хпищки),
+кастомное ядро, +невьипенный опятьже отладчег..
ну буржуйские хачеры сношались с этим х знает когда
https://forum.exetools.com/showthread.php?t=9469
и толком никуя... хотя как
хуйня делов:
add eax,[000130D3] ; hard coded value: 10h
хардкоженое значение сделать 4
...
ну то короч выражение:
#define _PsGetCurrentProcess() (CONTAINING_RECORD(((KeGetCurrentThread())->ApcState.Process),EPROCESS,Pcb))
...
какимто колдовством преобразуецо в:
в mov eax, fs:[124h]
mov eax, [eax+38h]
...
и вуаля, пашет-ипашет нах никому ненужный инстрюментарий
на овер лям бачей.. (ну окромя разве шо мнуса)...
...
Потом пересобирал HALTSC, но пока чета влом и облом.
...
пришлось возвращацо к истокам.. и короч: на атоме стартанула аж NT4SP6...
проходил квест по сбору апикового HAL-а (из скомунижженых исходников)..
..
недособралось чегото млять нехватает..
...
хотя мож лучше было бы побухать, чем маяцо этим ретро-х86-ым компутингом:
вон на сайтенге самого негрософт уже и семерку тролят:
https://www.microsoft.com/ru-ru/windows/windows-7-end-of-life-support-information
типа говно уже старое
(кстати, согласен W2к3 попижже с реактивным откликом даже с PMTIMER (с котором хп был тормоз))
..
берите новые суки компьютеры с виндопс 10ткой... Охуительные возможности..
хотя какие блядь? где точные таймеры с овер 10мгц тиком то а?
...
чего там блядь нахуй нового??? окромя овер 1024 прерываний в какомто MSI режиме. и все бестолковые что пиздец нахуй..
...
пидорасы, короч..
-
? microxa - 11.05.2019 03:26
Я кстати в очередной раз убедился в уебищности win 10тки (& AtomZ x4)- sega эмулятор Gens, довольно продвинутый по DirectX графе c трипл буферингом и синхрой, под десяткой глюканат если активировать синхру.. звук заикаецо...
..
+ко всему тормознутость USB клавы, делает это все не очень играбельным..
...
+(Раскуреная) проблема в SetCooperativeLevel (Fullscren) и флипаньем DSBuffer->Flip (bla bla): встроеное граф ядро (Intel HD) видимо думает шо сейчас ему активируют 3D по полной и.. это.. видимо активируецо шо аж перегрев и тротлинг (пропуск тактов).. С ходу не заборол С++ плюсы, чтоб это както пофиксить, (не мое, да и х с ними)..
...
Между тем вот, копирование буферов и последующая отдача в DX клиппер прет с нефиговым запасом даже на скинутых (через SpeedStep множителю) аж до ~436мгц ядрах (чуть тепленьких, с пассивным теплоотводом)..
...
Судя по всему этот DirectX-Draw весьма плотно запилен в ядроNT (костылек dxapi/ dxg(xp/w2k3)/dxkernel(win7-10)
поэтому "синячит" если удалить костыльки эти :)
-
? Bkbn - 11.05.2019 23:45
microxa, вот ты мегамозг! микрософт похоже видит пк будущего полностью подконтрольным, а лучше в виде клиента к облачной ос, которую контролировать проще. сижу на win7 до последнего. железо уже не обновить, с семеркой работать не будет, дров нет. хады!
-
? microxa - 12.05.2019 20:50
да уж.. вот даже насчет "пк будущего" - както позвали на "разборки" с установкой ХП на "новый нетбук два-ядра/два гига", Samsung NP-NC (какойто)..
...
(пива естественно не хватило, пришлось бежать еще за пузырем.. правда кончилось обломом с откатом на win7 стартер).
...
Тогда толком еще в них не шарил (а как оказалось там стояло заподло, в виде Atom N2600, перепаханый под инновационный DisplayPort, и драйвера под ХП представляли какойто непонятный набор СДЕЛАЙ САМ(и обломайся ога))..
...
И вот, по ходу разборок, пришлось подтыкать флешку с некоторым инструментарием, far/quake1(для тестов) был и ЭМУЛЬ БК.. И когда в полный экран стартанул.. аж тишина повисла - почемуто все просто офигели... (шо аж - бегом за второй (от шока).
...
Ну как оказалось народ, вполне себе проходил квесты с загрузкой с магнитофона/ололо с рубиловом в СНУТТЛ...
..
И вот кстати "магия БК" - (а то пробрало и непопускало, с восторженых визгов "типа ОФИГЕЕЕТЬ ЭТОж -НОУТ БЭКАШКА!!!1")
..
через какоето время и мне подворачиваецо "sams N100-тый":
¤
что даже.. уже не хотел игровой ящик "на LGA1150" как.. недобук в режиме эмуляции БК-Т34...
...
да уж..
ну хоть "трехрублевый N100-тый" с удачным проциком, оказался (аж ХП на микросдэшку встала):
http://www.cqham.ru/forum/attachment.php?attachmentid=260210&d=1491346075
...
(а винт c нафик c борта)
...
Шедеврально сгорел - прохуячило его от экспериментальной зарядки.. 40вольт пошло.. благо чипы (те что на переднем плане) сработали как предохранители.. Ниче, отодрал их и пашет.. (попутно собрал второй гнус 150-ый, с SSD платкой калибра m2)
..
ну походу последние атом-ы что еще поддерживали ХП по видеодрайверам..
-
? microxa - 13.05.2019 02:15
ндээ.. наткнулся на обсуждении включения команд для реализации
(теоретической) задержки MONITOR/MWAIT в пользовательском режиме RING3..
а оно, походу работает..только
https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/703842
¤
The user-mode MONITOR/MWAIT extension for Xeon Phi x200
для ксеона пфи какого-то:
¤
Характеристики и преимущества Решайте задачи быстрее
¤
Новый 72-ядерный процессор Intel(R) Xeon Phi(T) с внеочередным исполнением команд обеспечивает свыше 3 тераФЛОПС (да да, операций с плавающей запятой в секунду)
при выполнении вычислений с двойной точностью!!!!111
¤
ндэ.. нифигасебе вундервафля..
http://www.cpushack.com/wp-content/uploads/2018/08/KnightsCornerFront.jpg
для x86 майнинга штоле...
-
? Дмитрий - 17.06.2019 14:07
gid, нужен совет. К чему привязываться при генерации звука, если я убрал фреймы? Никаких счетчиков нет. У OPL, как и у AY, своя частота дискретизации звука. И для его получения нужно 44100 (или 48000) раз в секунду генерировать сэмплы от эмулятора чипа. Но поскольку я понятия не имею как программировать AY (не говоря уже про OPL, у которого 200+ регистров) и как заполнять буфер, стал искать пути проверки. Нашел музон от старой игрушки, там тупо дамп регистров с задержками. Попробовал написать тестовое приложение. В нем в потоке привязался к таймеру QueryPerformance и в цикле генерирую сэмпл, жду задержку и снова генерирую. Музон вроде звучит, но как-то не так. Причем в DOSBox't в игре он же звучит сочно и отлично. В двух других плеерах он звучит по-другому, у меня звучит примерно как в них, но отличается. Чую, что я неверно снимаю сэмплы с эмулятора - видимо где-то пропуск и ноты звучат как-то отрывисто. Я в генерации звука чайник еще тот, ни разу не сталкивался до этого.
-
? gid - 17.06.2019 16:11
Если нет фреймов, то всё равно есть неявный фрейм, равный длине звукового буфера.
И чтобы заполнить звуковой буфер сэмплами с заданной частотой дискретизации, допустим 44100, можно определить соотношение между 44100 и частотой эмулируемого чипа, допустим 2000000, чтобы узнать, через сколько тактов эмулируемого чипа вставлять один сэмпл звука.
d = 2000000 / 44100;
и потом в основном цикле, где выполняются такты эмулируемого чипа, выполнять это:
if (--soundTick <= 0) // если пришла пора вставлять сэмпл
{
soundTick += d; //заново инициализируем счётчик
GenerateSample(); //генерируем сэмпл и помещаем его в звуковой буфер.
//там же, проверяем, заполнился ли звуковой буфер, и если да - отправляем его звучать, и ждём, пока освободится новый
//звуковой буфер, чтобы заполнять уже его, тем самым получаем привязку к реальном времени.
}
¤
если частота чипа может быть меньше чем частота дискретизации, то условие надо немного усложнить.
if (--soundTick <= 0)
{
do {
soundTick += d;
GenerateSample();
} while (soundTick < 0);
}
Потому что тут наоборот, через сколько сэмплов частоты 44100 надо вставлять один такт частоты эмулируемого чипа.
Тут используется плавающая арифметика, чтобы переделать в целочисленную, надо немного поизвращаться.
¤
Хотя мне кажется, что тут всё гораздо проще. Если в музоне дамп регистров с задержками, то как правило задержки там стандартные 20мс, 40мс или ещё что-то. Это и будет фрейм, от которого никак не отвертеться. А модуль эмуляции AY у меня в эмуляторе самый простой в применении, какой я нашёл в интернете. Его инициализируешь нужной частотой дискретизации, а потом вызываешь GetSample с этой частотой дискретизации, чтобы получить звук AY, как настоящий.
-
? Дмитрий - 17.06.2019 16:34
Там задержки по-другому сделаны. Есть насколько вариантов формата. В данном музоне используется 280Гц цикл (в других 560 и 700Гц). В 1 сек 280 тактов. Так вот задержка указывается как число этих 1/280 тактов. Да и музон так, для проверки. Запись в регистры будет осуществляться из программы в эмуляторе, а я в потоке формирую звуковые буферы. Я пока пишу поток заполнения, проверяю его этим музоном, а потом в эмуляторе напишу программу записи этого дампа в регистры и опять проверю как выводится звук.
-
? Дмитрий - 17.06.2019 17:00
Не, вариант с частотой чипа не работает - воспроизводятся отдельные ноты с большими паузами. Частота 14,3Мгц, дискретизация 44100, 16 бит, моно.
-
? Дмитрий - 18.06.2019 11:51
Как говорится, дело было не в бобине... Использовал другой эмулятор чипа - там все отлично звучит. генерацию потока сделал как и раньше через QueryPerformance. Сначала ступил - сделал съем показаний перед задержкой, но ПОСЛЕ генерации сэмпла. Звучит также, но данные в wav отличаются. Переставил съем ПЕРЕД генерацией и теперь даже звуковые данные в wav идентичны.
-
? microxa - 22.06.2019 23:44
Продолжал работу над самым лучшим эмулем, и путем выпила дельфового RTL
удалось довести размер даже менее 64 кил - и это при том что в бинаре 10точный
ROM 24кб. gid, помогло использование аллокатора памяти
HeapAlloc(GetProcessHeap(), 8, да..
...
В связи наверное с этим событием - произошло другое, стартанул ядерный отладчик
SoftNTICE.sys под 7-ою вендой (немного похаченый насчет проверок версий,
короч думает что под ХП-ишкой 2600 билда).
Хоть и не в полном обьеме (некоторые структуры не показываются/синячит при
попытке загруза отладочных символов), но елки-палки оно трейсит хотябе
примеры использования команд таких как Monitor/Mwait в недрах
soft-охладителя intelppm..
Более чем странное событие, не ожидал такого, но вот опять таки магия бк
(и некоторый интерес под чем там оно крутицо )..
..
Дальнейшее исследование притормозилось, так как, внезапно собралось x64-битное
ядро WRK и стартануло с какойто страшной силой сначало на коре2дуровом
(сдул с него пыль и перепаял таки кондюки) а затем (путем простого переноса
папки winxp64/Administrator) и на атомном нетбуке(отлично поддержаный хп64
дровами).. Посему периодически изучается /что это такое/накой сдалось.
(ну вроде как во многом 32-bit френдли)
..
покамест хеловорлд нативного БК-64 эмуля глючит в оконных ф-кциях.
на DCC64 с упиленым RTL (разве что радует приемлемый обьем 85кб).
..
Пытался собрать нативный FPC64 шоп выплевывал PE64 а чето облом какойта..
...
(подымал Core2Duo с целью запуска FreeDos с системой БК осьдевелопинга,
и выяснения чопочом по частоте прерываний в пинауты LPT/IDE порта, и ссуко
надо было так влипнуть в ретрокомпутинг х64того болота..
..
Но ссуко.. с точки зрения осьдевелопера, WinXP64 это какойто, абсолютный шедевр...
¤
Шо аж странно как оно смогло устареть и уступить место такой ИТ-мерзопакости, как висла/севен/десятко..
-
? microxa - 07.07.2019 10:29
всё собралось/подредактировалось(через FAR64), как на 64бит нативном fpc-64, так и на dcc64 (учтены тонкие моменты), квест пройден (bk0064/epic64 it's work). Полноэкранных (80х25) буковок нету (от слова совсем), поэтому особо уже нет интереса в х86_64 системе..
Некоторые нюансы с DirectX пришлось отлаживать при помощи IDA64, и на этом хватило знакомства с этим немеряным "x86 расширением"..
Нарисовалась другая тема квеста: обнаружен пяточок NMI/LINT идущий к LGA755, вот может его и прощупать... Как оно осилит отработку прерываний 14.318мгц (ну или хотябы деленое на 2/4)... А то LPT/IDE какаято несерьезная для тематик точной синхронизации хренота..
-
? microxa - 08.07.2019 04:44
Надо отметить, что опять таки без некоторых бк-магии не обошлось (да и проекты ориентированы
на его так сказать небытийное воскрешение): поднялась из
хламья плата MSI 7255 служившая донором кондеров и мосфетовых транюков...
¤
Довольно странная (т.к чипы VIA под ынтеловский pga775) и стремная шо капец:
стабы питания (мостов/ддр2 памяти) выполнены как "непрерывнеги"..
ну вот, какбэ обзор:
https://www.youtube.com/watch?v=M19ezjOWKbs
надеюсь что автор забил на этот помойный ужос, с идеей установки десяточки
на один гиг оперативы..
..
Пока вот поканает в какчестве этокой 86дурины (всетоке на выбор кучка процов
всякоразной стремносте, но с какбэ ниибическим запасом частот. Впрочем мне как
программисту железячнику х86-ой гомнины (ну а шо делать коль их как гомна и грязи),
до сих пор непонятно хуле тогда тормозит? Порой кажецо что они нихуя ничего не
вычисляют, а лишь чето там перекидывают из пустого в порожнее..
и главное - нахуя всё так заморочено?
.
Интересовался этим проектом (86duinio) с целью вот некоторого изучения...
точней даже поиска одного кодеса который в досе WAV-кав в HD кодек. Таки
нашелся
https://github.com/roboard/86Duino/blob/master/hardware/86duino/x86/libraries/Audio/utility/WSS.cpp
не пойму, правда, хотелось бы мне это опять понимать, или мож ну его накуй...
Но не удивительно что с учотом подобных сложностей все этий робойобо проекты
так и остануцо на уровне недоношеных выродков...
..
Вот бк0010 я понимаю хороший компьютер: потомушто суко простой блядь..
..
gid, ах да удалось уже опробвать студию2019 в плане новых языковых возможностей?
...
а тожеж как известно в х64-той версии был выпелен ассемблер..
конечно простым кодерам на это ложить. но к примеру мне как железячнегу этого пакостного х86 того дерьма
это важно, как некоторое даже уважение.
Почему вот и выбрал паскаль тем шо блядь даже с первой моей программой для
х64титке особо не возникло трабл с пересаживанием на 64битные рельсы: хуйня
делов, как оказалось просто параметры регистровых передач несколько надо вот
было учесть.. ну и еахы заменить на раксы-хуяксы...
https://pastebin.com/1kKQipUk
...
кстати же "Скоро в продаже!!!1 Процессоры Intel® Core™ 10-го поколения"
https://www.intel.ru/content/www/ru/ru/products/docs/processors/core/10th-gen-processors.html
..
Умная производительность и потенциал искусственного интеллекта:
Ноутбуки на базе процессоров InteI® Core™ 10-го поколения обучаются и адаптируются к вашим действиям с помощью встроенных алгоритмов ИИ, тем самым помогая вам быстрее и эффективнее выполнять задачи!!!11
..
gid - слыш, может действительно можно будет студии обучать чтобы сами всё уже кодили?
..
впрочем ладнос.. проехали..
-
? gid - 08.07.2019 09:30
2019я студия не поддерживает компиляцию под XP, поэтому я не вижу смысла переходить на неё, разве что когда возникнет прямая необходимость.
А всякие языковые особенности с++19, с++17 и т.п. я почти не использую, так что мне пофиг, чего там навнедряли, и того, что уже есть, достаточно.
У меня даже в 2017й студии уже возникли проблемы сборки под ХР, так что наплевать на 2019ю, хоть у неё и заставка красивше.
А х64 ассемблер прикрутить можно, через жопу, методом компиляния функций масмом и линковки накомпиленного. Никакой не инлайн и очень неудобно, поэтому использует это только тот, кому прямо очень очень нужно.
-
? microxa - 13.07.2019 08:12
ну по уши в около-DOS'овском болоте. приходится много определятся как по софту(всякие старые уникальности откапывать) так и по электронике.
..
Насчет прямой NMI генерации пока толком не ясно - то наглухо висло, то что-то ещё. Точности нет никакой. как и вменяемых скоростей.
..
Как оказалось "южник" то и дело генерировал SMI и проц уходил в какойто недо-реальный режим, и все сбивалось. Вроде пофиксилось путем перерезания проводка, из-за отвалилась загрузка по USB (128метровой флешки), видимо както через "систем менежмент моде" это дело эмулировалось (ну хоть 60гиговый ssd пашет через sata). может както и можно программно решить. но поди разберись.
..
Хоть дошло и до такой дичи как
"Multi-Threading под DOS: исследовательская работа №3/№4"
https://xakep.ru/2008/07/17/44508/ (благо откопались примеры к этой уникальной статье).
вроде отрабатывает двух процессорно-то (и вроде как в реальном режиме. странно)..
..
хрен его знает, что делать. Помню прилаживал статическое 64кил ОЗУ-ROM на ISA писюка, с некоторым прицелом под некоторую ROM реализацию эмулятора. Но какбэ (ни опыта/не ума) не хватило освоить.. Да и винда постоянно предлагала куда более развлекательное ололо. так что не до того было.
..
-
? gid - 15.07.2019 09:45
А чё DOS-то? Переходи на RTOS (ОСРВ), бесплатных правда маловато, почти 0, зато контроль над таймерами будет полный.
-
? Voland - 17.07.2019 10:51
gid, там вопрос к Вам по эмулятору: http://forum.pk-fpga.ru/viewtopic.php?p=7363#p7363
-
? Manwe - 17.07.2019 13:12
Почему-то последняя версия эмулятора грабит скриншоты всегда в сглаженном виде. Пиксели не чёткие 4x3, а между ними плавные переходы.
-
? gid - 17.07.2019 15:09
Не подтверждаю. У меня на Windows7 всё чётко, в коде деланья скриншота просто нет функционала сглаживания. Разве что микрософтовцы тайком добавили сглаживание куда-то в свои дллки. Позже на windows10 проверю, но думаю, что и там будет как обычно.
¤
А по вопросу на том форуме, ситуацию как оказалось можно пофиксить, путём упрощения эмуляции. Раньше, в каких-то ранних сборках эмулятора так и было.
-
? Дмитрий - 12.10.2019 15:48
Вопрос по таймеру. В комментах cpu.cpp сказано, что бит 7 (EXPIRY) выставляется (если установлен бит 2) по достижению нуля. Сбрасывается программно. Т.е. для контроля следующего перехода через ноль мы должны его обнулить. Но в обработке записи в системные регистры сказано, что при любой записи в регистр управления из регистра начального значения переписывается в счетчик. По сути это сброс и начало отсчета. Получается, если нам надо отсчитывать равные промежутки времени с выполнением какого-либо действия при достижении нуля, это нарушает работу, т.к. счетчик зафиксировал переход нуля, перезагрузил начальное значение и пошел считать следующий период. А сбросом бита 7 мы заставляем его начать счет заново. Или 7 бит сбрасывается как-то иначе, не вызывая перезапуска таймера?
-
? gid - 12.10.2019 17:47
Ну вообще-то записывать данные в регистр управления когда попало - плохая идея, как раз потому, что счётчик начинает считать сначала и может никогда не досчитать до конца.
¤
Бит 7 имеет смысл использовать только в так называемом "режиме одновибратора", т.е. счётчик досчитал до нуля, выставился бит 7 и всё, больше никто ничего не считает. Дальше мы выполняем какие-нибудь действия, и чтобы снова начать отсчёт, сбрасываем бит 7 (обычно туда просто записывают исходную комбинацию битов).
Это делается, чтобы отмерять гарантированное количество времени, и выполнять какие-то действия строго через заданные промежутки.
Во всех остальных режимах бит 7 просто покажет, что переход через 0 был, но когда и сколько было переходов мы не узнаем.
-
? Дмитрий - 18.10.2019 15:49
Еще вопрос по таймеру. Бит STOP служит только для принудительного ручного отключения таймера в любых режимах? Должен ли он выставляться при завершении счета в режиме ONESHOT или фактом завершения служит сброшенный бит RUN?
-
? gid - 18.10.2019 16:33
[Бит STOP служит только для принудительного ручного отключения таймера в любых режимах?]
Да, бит STOP просто запрещает счётчику считать. Он не выставляется счётчиком, т.к. это бит управления счётчиком извне.
[или фактом завершения служит сброшенный бит RUN]
Да.
Кстати фактом завершения счёта в режиме ONESHOT удобнее использовать бит 7 (чем бит 4), но этот бит опционален в этом режиме, и поэтому фактом завершения служит сброшенный бит RUN.
Однако, если установить бит 2, то фактом завершения будет служить сброшенный бит 4 и установленный бит 7.
-
? Дмитрий - 19.10.2019 01:38
Кстати, не могу понять почему так долго выполняются (в тактах) команды ветвления, SOB, EMT/TRAP/IOT. Что там такого "долгого"?
-
? gid - 19.10.2019 11:02
Таки там микропрограмма же.
Для SOB надо вычесть из регистра 1 и проверить что получилось перед тем как переходить или не переходить, а чтоб добыть единицу, надо достать константу 1 из специальной таблицы констант, а для этого нужны действия и доп.такты.
А EMT/TRAP/IOT вообще прерывания генерируют. А это процедура вообще затратная, пока обратишься к памяти, пока прочитаешь адрес и PSW, пока всё это установишь, вот время и уходит.
-
? Дмитрий - 19.10.2019 14:56
Судя по таблице в исходниках EMT/TRAP исполняются за 64 такта, а IOT - за 104. С чего вдруг такой разброс? Ведь логика одна и та же - сохранить адрес возврата и PSW, выбрать новый адрес и PSW, установить.
-
? gid - 19.10.2019 16:18
По данным ТО и Зальцману - у IOT,BPT,EMT,TRAP время выполнения одинаковое - 42T+5tn и 68,4 такта (если перевести 22,8 мкс в такты) соответственно.
А когда я измерял время выполнения команд, у меня получалось, что IOT выполняется на 28 тактов дольше чем EMT/TRAP на БК11 4МГц, а на 6МГц уже на 56 тактов дольше, правда потом я заметил, что моя БКшка была модифицирована, чтобы RPLY передавался процессору без задержки на 1-2 такта, так что все мои тесты оказались неправильными (моя БКшка оказывается работала где-то до 20% быстрее стандартной), а заново всё переделывать стало лень. В общем, в любом случае IOT почему-то выполняется дольше, чем EMT/TRAP/BPT. В тестах PAtrona также, только там ОЗУ не так критично влияет, поэтому у него IOT всего на 10 тактов дольше выполняется.
-
? Дмитрий - 19.10.2019 23:13
У Вакуленко сказано про время выполнения, что "tn - время между выдачей DIN/DOUT и приходом RPLY." А чему равно это время в тактах? Я что-то не видел нигде этой инфы. И странно, что (Rn) выполняется дольше, чем (Rn)+ - 21T + 3tn против 20T + 3tn. Мб, конечно, погрешность.
-
? gid - 20.10.2019 10:19
У всех по-разному. На ДВК это постоянная величина, которую можно рассчитать. На БК из-за особенностей работы ВП1-037 это переменная величина, которая зависит от того, в каком состоянии (цикле) находился ВП1-037, когда пришёл запрос DIN/DOUT. Теоретически может равняться 1..8 тактов работы ВП1-037 (6МГц), но из-за не синхронности с частотой процессора, он умудряется проспать цикл ввода-вывода данных и фактически задержка достигает 1..15 тактов 6МГц. Как это пересчитать в такты процессора вообще непонятно. Поэтому-то и невозможен точный эмулятора БК без потактовой эмуляции связки 1801ВМ1+1801ВП1-037
-
? Дмитрий - 20.10.2019 13:34
А если отбросить несинхронность с -037 (и саму 037) и взять только ВМ1, то есть более-менее точная величина tn? И какова она на ДВК?
-
? gid - 20.10.2019 15:39
Так она не от процессора зависит, а от контроллера памяти.
¤
Попробовал сейчас посчитать величину tn для ДВК на основании данных из тестов Patrona
Для команды tst получилось такое:
адресация 0: время 14 тактов, формула 8T+tn, отсюда tn = 6T
1: 29, 21T+3tn, tn = 8T/3 = ~3T
2: 29, 20T+3tn, tn = 3T
3: 42, 27T+4tn, tn = 15T/4 = ~4T
4: 29, 21T+3tn, tn = 8T/3 = ~3T
5: 43, 28T+4tn, tn = 15T/4 = ~4T
6: 42, 27T+4tn, tn = 15T/4 = ~4T
7: 55, 34T+5tn, tn = 21T/5 = ~4T
где T - время одного такта тактовой частоты 5 МГц
¤
Видим, что и тут фиг вычислишь значение.
Щас ещё посмотрел, законспектированное с темы тестов процессора на zx-pk, а то даже саму тему уже найти не могу, там получалось, что практика не совсем совпадала с теорией, и очень все надеялись на результаты реверса. Потом Patron вроде как забил на теоретические формулы и руководствовался практическими результатам при написании своего эмулятора.
-
? Дмитрий - 20.10.2019 16:59
Вот жеж, я даже и не знаю теперь на что ориентироваться. Все команды делать по 1 такту +1 такт на каждый доступ в память (как сделал щас, в тестовом варианте) как-то не комильфо - для проверки еще можно, но на постоянку хотелось бы соблюсти тайминги команд или прийти к какому-то общему знаменателю. Мб пока откинуть этот параметр tn и оставить чистые тайминги в тактах только самого проца?
-
? gid - 21.10.2019 09:26
Можно предположить, что используется 0-тактовое СОЗУ и тогда tn == 1 ну т.е. RPLY с данными выдаётся сразу после запроса DIN/DOUT, соответственно, процессором RPLY принимается через 1 такт после DIN/DOUT.
-
? Дмитрий - 21.10.2019 10:12
Вот тут http://www.emuverse.ru/wiki/%D0%A3%D0%9A%D0%9D%D0%A6_%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4 лежат скрины экрана с УКНЦ с результатами тестов. Не совсем понятно что где и какое число что означает. Плюс они, скорее всего, с учетом tn. Там же есть доки по ДВК, в них очень поверхностно указаны времена выполнения в тактах. У Вакуленко указаны тоже не все команды. Покопаю пдфы от PDP-11, где-то в них я видел таблицу в тактах.
¤
И еще. Вот, допустим, выполняется поток команд без фреймов и т.п. На полной скорости хост-ЦПУ. Вот у меня есть кол-во тактов каждой команды. Как высчитать "частоту" проца по этим тактам? Ведь все выполняется довольно быстро, без учета тактов, они просто как показатель времени выполнения. А эмулируемый код ведь не состоит из одних NOP или MOV R0,R1, где кол-во тактов практически идентично.
-
? gid - 21.10.2019 10:56
[Вот у меня есть кол-во тактов каждой команды. Как высчитать "частоту" проца по этим тактам?]
без фреймирования никак. Нужно посчитать сколько тактов уместилось в заданном интервале времени, допустим 20мкс, и на основании этого посчитать частоту. Она-то от времени зависит, и не имея никаких точек отсчёта времени, частоту никак не посчитать.
-
? Дмитрий - 21.10.2019 11:43
В хэндбуках ПДП11 время выполнения только в мкс или нс, никаких тактов. Придется ковырять имеющиеся данные, где все в тактах. Либо все же забить и сделать время выполнения всех команд усредненно одинаковыми. Мб еще где-то есть таблицы?
¤
>> не имея никаких точек отсчёта времени
Точка отсчета есть. К примеру, суммируем все выполненные команды по тактам с момента запуска ЦПУ. В нужный момент считываем переменную с "выполненными" тактами, отсчитываем время, снова считываем. Разница и будет кол-во выполненных тактов за период. Вроде все норм, но есть закавыка. Разброс по кол-ву тактов на команду часто очень велик. Там, где будут вычисления с MUL/DIV или FPU, "тактовая скорость" будет высокой, а где интенсивная работа с регистрами - наоборот низкой. Потому как хост-проц выполняет команды очень быстро. А это значит, что "частота" будет прыгать вверх-вниз до 10 раз, а мб и больше. Так-то, в принципе, эта скорость чисто для информации, роли она не играет.
-
? Дмитрий - 17.11.2019 14:52
gid, реализация YM2149 выдает сэмплы с учетом частоты дискретизации? Т.е. два вызова
¤
CEMU2149::GetSample(...);
CEMU2149::GetSample(...);
¤
подряд выдадут просто 2 сэмпла или это равносильно коду (с учетом SoundSampleRate)?
¤
CEMU2149::GetSample(...);
delay(1/SoundSampleRate);
CEMU2149::GetSample(...);
¤
И еще. У ковокса частота дискретизации 8кгц, если я правильно понял? Где его сэмпл передискетизируется в 44100 для микширования с сэмплом AY?
-
? gid - 17.11.2019 17:57
CEMU2149::GetSample(...); Выдаёт один сэмпл в соответствии с заданной в настройках эмулятора текущей частотой дискретизации.
да, это равносильно. Т.е. каждый вызов функции выдаёт результат, пригодный для записи в звуковой буфер звукового устройства, открытого и настроенного на заданную частоту дискретизации, чтобы слышать музыку в колонках ПК.
¤
Всё это потому, что работа микросхемы эмулируется и эмулируются её внутренние состояния для заданного дискретного момента времени, а не линейно и непрерывно.
¤
А для ковокса и спикера логика наоборот, надо вызывать функции CCovox::GetSample(...); и CSpeaker::GetSample(...); с той частотой, которая выбрана частотой дискретизации. Считается, что это как бы аналоговые устройства, звучащие линейно и непрерывно, а мы просто вызовом данных функций получаем текущие для заданного момента времени импульсы. Чем чаще вызываются эти функции, тем выше будет считаться частота дискретизации, для полученных сэмплов.
¤
У ковокса 8 кГц - это частота среза ФВЧ результата работы ковокса, а то он уж слишком неприятно звучит, это можно сравнить включением/выключением кнопочки фильтра ковокса.
-
? Дмитрий - 17.11.2019 21:03
А если одновременно звучит AY, ковокс и пиликает спикер, то их сэмплы записаны последовательно в буфер или микшируются в один?
-
? gid - 18.11.2019 10:03
AY и ковокс одновременно звучать не могут, т.к. сидят на одном порту. Одно из них может работать одновременно со спикером.
Но если их рассадить по разным портам, то запросто могут звучать одновременно, алгоритмы эмуляции позволяют.
Сэмплы микшируются по формуле A + B - A*B
где один из источников так же может быть результатом микширования по этой формуле.
Если сэмплы записывать последовательно в буфер, то тогда надо увеличивать частоту дискретизации пропорционально, иначе будет заметно, что тональность звучания отдельных источников не такая, как должно быть. Либо наоборот, делать выборку сэмплов с пропорционально меньшей частотой дискретизации, но тогда будет заметно падение качества звука. (пропорционально количеству источников звучания)
Чтобы не извращаться так, лучше просто микшировать.
-
? Дмитрий - 21.11.2019 11:26
Что-то не догоняю логику. Звучит AY, а в NextTick() AYшки:
¤
void CEMU2149::NextTick()
{
register double L, R;
PSG_calc(L, R);
CDevice::NextTick();
}
¤
генерация в никуда, полученные данные не используются. А в CEMU2149::GetSample тоже есть вызов PSG_calc(L, R), но тут данные уже используются. И для каких целей этот класс CDevice, можно обойтись без него? Его тики использует только спикер.
¤
В эмуле, как я понял, используется PCM 16-bit unsigned, потому как FLOAT_BASE = 65536. А если нужно сделать PCM 16-bit signed, то в чем заключается переделка? Потому как эмуль OPL оперирует signed short в качестве сэмпла канала. Значит и все остальное тоже нужно считывать в таком же формате. Кстати, алгоритм микширования равнозначен для любого типа данных или он подходит только для unsigned 16-bit?
-
? gid - 21.11.2019 13:09
У вас какой-то уж совсем дремучий код. У меня CEMU2149::NextTick() давно выпилено за ненадобностью, и все звуковые устройства наследуются от своего базового класса, где собран только общий для всех устройств код.
Я этот класс CDevice всё таскаю с собой, потому что не знаю, а вдруг он мне пригодится когда-нибудь.
А изначально задумывалось, что все устройства типа матплаты, контроллеров и т.п., которые делают обмен данными по шине будут наследоваться от одного базового класса, вот этого.
¤
Не, в эмуле используется тоже signed 16-bit, и сейчас и раньше, можно посмотреть файл BKSound_Defines.h, там все параметры для звука, и FLOAT_BASE там уже 32768.0
Я однажды задался целью, и перелопатил всю генерацию звука и работу с ним. А то там был бардак и многочисленные переконвертирования из float в short и обратно при синтезе, разные модули работали с разными видами данных.
В результате спикер и AY при генерации звука используют только верхнюю половину амплитуды периода, чтоб не заморачиваться, потому что используются только положительные числа. А раньше я хотел использовать весь диапазон, поэтому амплитуда генерировалась в диапазоне {0..65535}, а потом смещалась на полпериода вниз до {-32768..32767}, поэтому FLOAT_BASE был 65536
¤
Алгоритм микширования подходит к всему. Это просто математическая формула, какого типа данные на входе, такого и на выходе.
-
? Дмитрий - 21.11.2019 20:20
>> У вас какой-то уж совсем дремучий код.
Есть такое. Обновил архив с сырцами. NextTick убран только в 3.10.
¤
Посмотрел код 4.1. Ммм, а зачем FPU сделан отдельным классом? Связывать его с CPU не надо - надо перенести все в класс CPU. Я именно так и сделал. Но поскольку параметры FPU можно менять (точность, округление, маскирование прерываний) перед каждой FPU-инструкцией (в начале TranslateInstruction) записываю слово состояния FPU в хост-проц и восстанавливаю после. Все работает как надо - проблем нет.
-
? gid - 21.11.2019 23:04
Потому что FPU я вообще делал просто потому, что это возможно, и скорее всего в эмуляторе оно использоваться не будет. Оно не только не отлажено, оно даже не работает ещё. Это просто наброски. Поэтому отдельным классом, чтоб в случае чего, просто удалить эти файлы и не мучиться. Ведь есть у меня не до конца доделанная эмуляция AY8830, тоже сидит отдельным классом и нигде не используется. И вопросов не вызывает.
-
? grf - 06.01.2020 08:12
А возможность записи видеоролика экрана не планируется добавить в эмулятор? ;)
-
? grf - 06.01.2020 08:20
А то приходится телефоном снимать для твиттера ))
-
? gid - 06.01.2020 09:59
Экспериментально удалось добавить эту возможность. Только с частотой кадров беда, она задаётся в параметрах командной строки ffmpeg вручную, и не имеет ничего общего с реальностью. Т.е. если накладывать ещё и звук, то будет 100% рассинхрон.
И я пока не знаю, как передавать ffmpegу кроме видео ещё и аудиопоток, чтобы хоть как-то получилось синхронное видео+звук.
И ещё не готовы элементы управления включением/выключением захвата видео. Когда сделаю, тогда и будет выложена новая версия (как есть, без звука).
-
? grf - 06.01.2020 11:56
Ждемс! ))
-
? Дмитрий - 07.01.2020 15:49
gid, вопрос. У FPU есть два регистра FEA (Floating Exception Address) и FEC (Floating Exception Code). Я покопался по хэндбукам PDP, но не нашел расположение этих регистров (если они располагаются в памяти) и как к ним получить доступ (если нет). Плюс у разных машин разные адреса прерывания по ошибке FPU - встречется и 244, и 250. А какой правильный?
-
? Дмитрий - 07.01.2020 15:53
Нашел, команда STST.
-
? gid - 07.01.2020 22:30
можно не отвечать?
¤
[встречется и 244, и 250. А какой правильный?]
Оба правильные, DEC наделала много разных моделей PDP и много разных конфигураций.
-
? Дмитрий - 08.01.2020 02:23
Что-то тест 791402 в части MUL (конкретно тест 245) стопорится:
¤
tst245: cmp @R5, #245
bne err247
inc @R5
mov PC, R1
mov #125252, R0
mul (R3)+, R0
mfps @#$qpsw
cmpb #11, @#$qpsw ; PSW совпадает
beq 1$
error 250
1$: cmp #165252, R0 ; вот тут проблема!!!
beq 2$
error 251
2$: cmp #100000, R1
beq tst246
err252: error 252
¤
тест 125252 * 2 = 252524. В результате умножения IMUL (знаковое умножение) получается R0=177777 (старшая часть) и R1=52524 (младшая часть), а тест с какого-то перепоя проверяет R0=165252. И дальше проверяет 100000 в R1.
-
? Дмитрий - 08.01.2020 12:39
Копипаста зло, а в совокупности с автоматизмом - тем паче. При разворачивании макроса vect где-то и как-то потерял 8 байт нулей.
-
? gid - 08.01.2020 13:23
А зачем разворачивать макросы вручную? для этого же есть кросс компилятор MACRO-11.
Форк от shattered: https://github.com/shattered/macro11
более свежий форк от Rhialto: https://gitlab.com/Rhialto/macro11, где он периодически борется с некоторыми глюками
А если он не справится, есть это: https://zx-pk.ru/threads/24755-emulyator-rt-11.html - оригинальный макро11
¤
Я с его помощью делаю листинг исходника, чтобы с его помощью ориентироваться в бинарнике, который просто прохожу отладчиком в эмуляторе.
-
? Дмитрий - 08.01.2020 14:04
Для моего случая нужен свой компилятор - макро11 не умеет в 32 бита, а в своем я еще не делал макросы, ибо пока лень.
-
? Дмитрий - 08.01.2020 14:08
Кстати, диспетчер прерываний из v4.1 неплохо ускорил поток выполнение команд. Заполнение 16-битным паттерном 1Мб памяти сократилось с 47 до 40-41мс.
-
? grf - 11.01.2020 16:41
И еще хотелось бы горячую клавишу "установить частоту процессора БК на максимум", чтобы быстрее компиляция и линковка происходила :) Сейчас изменяю вручную значение в поле частоты, но это ж неудобно )
-
? gid - 12.01.2020 19:15
А максимум, это сколько?
Он ведь от производительности ПК зависит и у каждого будет своё значение, если сильно задрать частоту, там уже начинаются проблемы с обработкой клавиатуры на БК.
Оказывается, я забыл написать в документации, что для кнопок изменения частоты в панели дампа регистров действуют комбинации модификаторов:
Shift + клик на кнопке: +- 1 Гц
Ctrl + клик на кнопке: +- 10 Гц
Ctrl+Shift + клик на кнопке: +- 100 Гц
Alt + клик на кнопке: +- 1 МГц
Alt+Shift + клик на кнопке: +- 10000 Гц
Ctrl+Alt + клик на кнопке: +- 100000 Гц
Ctrl+Alt+Shift + клик на кнопке: *2 или /2 текущую частоту
¤
Пользуйтесь модификатором Ctrl+Alt+Shift для быстрого наращивания частоты.
-
? grf - 13.01.2020 02:47
Максимум - там, где дальше уже проблемы с обработкой клавиатуры. Спасибо за инфу, попробую использовать доп.клавиши.
-
? grf - 15.01.2020 06:55
Пока ролики приходится такие делать: https://twitter.com/grfmaniak/status/1217114721259794437?s=19
¤
Ждемс, ждемс новой версии)
-
? gid - 15.01.2020 16:52
А есть же просто дохренища программ, которые могут захватывать экран и делать видео из происходящего на экране, платные и бесплатные.
Я так и не смог с помощью ffmpega к видео сразу и звук цеплять, в интернете пишут, что в виндовс универсального способа нет в принципе. Все описанные способы - это какие-либо частные случаи, которые будут работать у одного, и не будут работать у другого. Поэтому сделал экспорт звука в отдельный wav файл. И получил дикий рассинхрон, т.к. никак не могу подобрать нужное значение framerate для видео, генерируемого ffmpegом. Поэтому всю командную строку с параметрами вынес в ini файл. Мучайтесь сами с подбором частоты кадров, когда выложу новую версию.
Ещё есть непобедимый косяк - если закрыть вручную консоль ffmpega или задать ему неправильные параметры, так что он сам после запуска сразу завершится, то эмулятор зависнет намертво, и прибить его можно только из диспетчера задач.
Потому что, как пишут в интернете, в виндовс в принципе невозможно, от дочернего процесса получить сообщение родительскому процессу, что он завершается или завис, из-за чего, когда на одном конце асинхронного pipe пропадает получатель, полностью блокируется вся деятельность передатчика, цикл обмена сообщениями блокируется и всё, только прибивание из диспетчера задач.
Так что новшество получается сомнительное и ненадёжное.
-
? Дмитрий Николаевич - 15.01.2020 21:07
оффтоп: тов. gid, Сергей. Неужели вы даже ICQ прекратили пользоваться? Напомню о каналах по БК:
Телеграм канал: https://t.me/bk0010_11m (активный)
Скайп канал: https://join.skype.com/crU2SBz2E1bp (здесь наблюдается забвение)
ICQ канал: https://icq.im/AoLFsudUBJH8TdAiUGc (только что создаЛЬ, треб. официальный клиент ICQ https://icq.com на мобиле или ПК)
-
? Дмитрий Николаевич - 15.01.2020 21:27
Поправка:
ICQ канала: https://icq.im/AoLFs4hEsAd9G-TD0TE
-
? gid - 15.01.2020 21:53
после того, как сменился протокол ICQ и QIP Infium превратился в тыкву, я больше не пользуюсь вообще никакими мессенджерами.
Ибо ни официальный клиент ICQ, ни Скайп меня не устраивают, а альтернативных нету.
Телеграм мне тоже не нравится.
Если кому чего надо - пишите письма, емайл есть на сайте.
-
? Дмитрий Николаевич - 16.01.2020 00:09
Да, это очень ответственное и взвешенное решение: сидеть взаперти, ни с кем не разговаривать, пишите письма, шлите голубей....
-
? gid - 16.01.2020 09:16
Ну, я не настаиваю, не хотите - не пишите. Есть же ещё и форумы.
А мне очень не нравится, что каким-то владельцам баз данных клиентов месседжера очень нужно знать мой номер телефона, чтобы иметь возможность узнать кто я такой, где нахожусь, отслеживать моё перемещение, и прочие мои действия. Причём без запросов в соответствующие органы, а просто с помощью анализа больших данных. Если бы они просили бы только почтовый ящик - вопросов бы не возникало, и я бы пользовался таким месседжером.
-
? grf - 16.01.2020 10:55
Jabber как раз такой )
-
? gid - 16.01.2020 11:49
Только им никто из предлагальщиков мне присоединиться к сообществу месседжерозависимых не пользуется.
-
? gid - 16.01.2020 11:50
и забыл сказать, новая версия выложена, пробуйте.
-
? Manwe - 16.01.2020 11:54
gid, полностью разделяю Ваше отношение к приватности и цифровой гигиене. Есть хороший способ зарегистрироваться в Telegram не по своей SIM-карте, а по какой-нибудь одноразовой. Например, по туристической в другой стране. Да и в России есть простые способы.
После регистрации Telegram больше никогда не будет обращаться к этому номеру, так что SIM-карту можно смело выкинуть.
-
? Дмитрий - 16.01.2020 16:48
gid, я не совсем понял - у MFPS проверка результата для установки признаков происходит как байта или слова? Там сначала расширяется знак, а потом проверка. Судя по коду - байта. Но для чего расширение знака до слова?
-
? gid - 16.01.2020 18:33
1. В микрокоде ВМ1 установка признаков операнда MFPS обрабатывается почти так же, как и у команды MOVB
2. У меня там по алгоритмам дальше функция установки признаков требует байта, расширенного до слова, так же, как и в функции обработки MOVB, я не стал ничего отдельного изобретать, тем более, что и MFPS работает на шине данных с операндом как словная команда, а внутри, в микрокоде, обрабатывает операнд как байтовая команда, т.е. обрабатывает только младший байт слова PSW, заполняя старший байт знаковым битом младшего байта, а потом это слово записывает туда, куда по режимам адресации положено.
-
? Дмитрий - 17.01.2020 09:52
Я перевожу все выполнение команд и вспомогательные функции на асм ну и походу избавляюсь от лишних чтений/записей в память. К примеру, в Get_Arg_Addr switch линейный. GCC с оптимизацией по скорости -O3 формирует код перехода как:
¤
mov eax,[Meth]
jmp [[table+eax*4]]
...
table: dd meth0,meth1,meth2,meth3,meth4,meth5,meth6,meth7
¤
Я же написал как
¤
mov eax,[Meth]
test al,al
jnz @meth1
¤
@meth1: dec al
jnz @meth2
...
¤
и т.д. По идее код перехода GCC должен быть быстрее, но он оказался заметно медленнее регистрового варианта. Видимо вычислительные конструкции в операндах требуют гораздо больше тактов, чем просты операции и в сумме они оказываются медленнее.
-
? Дмитрий - 27.01.2020 20:33
Переписал все критичное по скорости на асм, пока кроме диспетчера прерываний, FPU и DIV. В итоге тест заполнения 1Мб 16-битным паттерном (фактически вывод картинки 800*600 = 960000 байт) в простом цикле с 40-41 мс сократилось до 25-27 мс. Даже не ожидал такого резкого ускорения. Плюс есть еще резерв - множество обращений к регистрам БК через [FRON+регистр*4]. Надо вынести адрес массива регистров в отдельный регистр и, тем самым, резко сократить обращения в память.
-
? Дмитрий - 31.01.2020 22:34
gid (да и вообще любой кто знает), еще вопросы по FPU.
¤
1) Бит 5 (Floating Chop Mode) округления в слове статуса имеет два значения - Chop (или Truncate) и Round. Truncate понятно - просто отбрасывание дробной части. А вот Round к чему - к ближайшему целому, вверх или вниз? Такой подробности я не нашел.
2) Бит 11 (Interrupt on undefined variable) - перевод какой-то туманный - нифига непонятно. А отсюда вылезает непонятка с каким исключением современных FPU его связать. Денормализованный операнд?
-
? gid - 01.02.2020 10:53
Округление делается стандартно: +.5 и отбрасывание дробной части, т.е. к ближайшему целому вверх или вниз, смотря к чему ближе.
¤
В драйвере эмуляции FPU инструкций для RT-11, который я взял за основу эмуляции инструкций на С, бит 11 не использовался, т.е. там такая ситуация не возникала, там просто считалось - что неопределённая переменная приравнивается к нулю.
Но в мануалах пишут, что это прерывание возникает, если в качестве операнда FPU команд попадает число -0, или такое, где экспонента 0, а в любом из битов мантиссы и знака - хоть один не нулевой бит.
И когда в результате операции получается такое число - тоже возникает это прерывание.
В книжках пишут, что современные процы автоматически нормализуют денормализованный операнд.
Скорее всего, undefined variable - это QNAN, и надо его связывать с этим исключением.
-
? Дмитрий - 01.02.2020 11:22
По поводу бита 11. Проверил. Действительно, в современных процах такого не происходит. При попытке занести с стек число -0 (0x8000000000000000), оно автоматически преобразуется в 0 и никаких исключений не вызывает. Но если занести в стек число 4.94065645841246544176568792868E-324 (0x0000000000000001), то возникает исключение "денормализованный операнд".
-
? Дмитрий - 02.02.2020 16:39
Кстати, если я правильно понял, то FPU PDP ловит NaN перед вычислениями и, если операнд NaN, то возникает исключение и операция не выполняется. А если в результате операции будет NaN, то не возникает, а возникнет при попытке сделать что-то с этим результатом? Потому как у современного FPU операции с NaN не вызывают ничего - равносильно выполнению FNOP. А вот если попробовать что-либо вычислить из Infinity, то в результате возникает NaN и исключение "Недействительная операция". Получается ли, что нужно ловить перед операцией NaN, а после деление на ноль, overflow и underflow?
-
? gid - 02.02.2020 17:24
Вообще без понятия. В коде эмулятора FPU NaN тождественно нулю, поэтом там вообще нет такого понятия как undefined variable. Реальных FPU я не видел и как там всё происходит очень приблизительно знаю только из быстрого чтения мануалов по горизонтали.
-
? gid - 02.02.2020 17:26
да, и NaN в результате операции возникнуть не может, там будет или overflow или underflow
-
? Дмитрий - 05.02.2020 10:02
Убрал нафик прерывание по NaN, перед и после операций проверяю на NaN/Inf и меняю на ноль в случае обнаружения. И код короче и удобнее.
-
? Adam Bazaroff - 07.02.2020 15:24
gid, сделай пожалуйста опциональной фичу, когда драгндропишь на окно эмулятора .bin файл. Зачем перезагружать и менять конфиг? Мне нужно загружать .bin в БОС-11. Она тоже умеет читать с магнитофона.
-
? gid - 07.02.2020 16:47
невозможно. В эмуляторе не сделана эмуляция загрузки с магнитофона для БОС-11, поэтому эмуляция загрузки .bin в среду БОС-11 невозможна. Не сделана потому, что там довольно сложные манипуляции со страницами.
Используйте эмуляцию дисковода. либо грузите бин файлы как wav файлы через магнитофонный вход (там надо просто при чтении выбрать формат бин вместо Wav, и он будет воспроизводиться через спикер)
-
? Дмитрий - 09.02.2020 13:27
gid, я что-то запутался. Каким образом (и зачем) вызывается системное прерывание, если на 160000 у БК ПЗУ контроллера? Да и пультового режима нет.
-
? gid - 09.02.2020 14:52
У процессора есть всё, что надо для организации пультового режима, только сама аппаратная поддержка реализуется внешними средствами, из которых на БК только контроллеры АльтПро.
Каким образом и при каких условиях возникают системные прерывания подробно описано вот там https://github.com/1801BM1/cpu11/blob/master/vm1/doc/1801vm1.pdf на стр.55
¤
ПЗУ контроллера БК на 160000 никак не мешает, потому что из-за отсутствия ОЗУ по адресам 177674, 177676 до чтения вектора просто не доходит. А вот если бы там ОЗУ было, то тогда вместо ПЗУ контроллера тоже было бы или ПЗУ пультового режима, или ОЗУ, как в контроллерах АльтПро А16 и СМК и процедуры пультового режима в нём.
¤
Например, рассмотрим нажатие на клавишу СТОП.
* Нажатие на клавишу СТОП вызывает прерывание IRQ1, если в PSW не установлены биты 10 или 11, если установлены - прерывание не происходит, и ничего из дальнейшего тоже не происходит.
* IRQ1 по документу - Прерывание "аппаратного останова" и перехода в пультовой режим, вектор: 160002, а стек: 177674, 177676
* поскольку по адресам 177674, 177676 пусто, попытка записать PSW по адресу 177676 при выполнении процедуры входа в вектор, приводит к зависанию шины.
* Обработка зависания шины зависит от битов 10 и 11 в PSW, поскольку они у нас не установлены исходя из самого первого условия, то вектор: 4, а стек: SP, иначе вектор: 160002, а стек: 177674, 177676 - это пультовый режим и рассматривать его не будем.
Вот таким образом при нажатии кнопки СТОП получается прерывание по вектору 4.
То же самое с пультовыми прерываниями по векторам 160006, 160012. И-за отсутствия ОЗУ по адресам 177674, 177676 в конце концов происходит прерывание по вектору 4.
-
? Дмитрий - 09.02.2020 21:10
Получается, что раз биты 10 и 11 никогда не установлены (нечем устанавливать/сбрасывать), то и в обработчике прерывания все, что проверяет эти биты и выполняет при их =1, бесполезно?
-
? gid - 10.02.2020 09:33
Биты 10 и 11 это как раз одно из средств для организации пультового режима. Оно работает, но так, что лучше уж этого вообще не было. Пользоваться этим очень неудобно.
Эти биты можно установить только в PSW вектора прерывания, т.е. когда входим вектор, его PSW применяется и биты 10 и 11 если они были заданы, устанавливаются в регистре PSW процессора. Всё. Больше нигде и никак. Но прочитать их нельзя, MFPS читает только мл. байт PSW, поэтому убедиться, что эти биты установлены, можно только опосредованно, по тому, что они маскируют прерывания.
Команды RTI, RTT тоже работают только с мл. байтом PSW, старший байт тупо обнуляют.
команда MTPS, изменяет только мл. байт PSW, но и ст. байт не трогает, т.е. эти биты изменить нельзя, но они и не сбрасываются, если были установлены.
Команды START, STEP тоже могут изменять биты 10,11 чтением PSW из стека, но стек у них только 177674,177676. Так что это тоже пультовые команды и в обычной жизни их использование приводит к прерыванию по вектору 4.
-
? Дмитрий - 13.02.2020 11:12
В Board.cpp в bool CMotherBoard::OnSetSystemRegisterIndirect(WORD num, WORD src, bool bByteOperation) записано:
case 0177660:
mask = 0100;
...
m_reg177660 = (~mask & m_reg177660) | (mask & src);
¤
какой смысл в (mask & src) сбрасывать биты у маски битами содержимого регистра, если у маски всего 1 бит установлен? И что за значение будет у (~mask & m_reg177660)? С точки зрения логики в регистр будет записана неведомая хня. Тут точно не наоборот в обоих случаях надо ставить аргументы? Т.е m_reg177660 = (m_reg177660 & ~mask) | (src & mask)?
-
? gid - 13.02.2020 13:23
Это запись в одну строку вот такой конструкции:
m_reg177660 &= ~mask, src &= mask;
m_reg177660 |= src;
¤
операции & и | коммутативны, т.е. не имеет значения порядок операндов, для классической записи r = a & b:
m_reg177660 = ~mask & m_reg177660; равнозначно m_reg177660 = m_reg177660 & ~mask;
¤
Не знаю, как там с точки зрения логики, но компилятор всё делает правильно, особенно с учётом архитектуры команд x86, там ведь промежуточные вычисления сохраняются в регистрах процессора, и только конечный результат уже записывается в ячейку памяти, где хранится значение m_reg177660.
¤
Я в настройках проекта включил генерацию ассемблерного листинга для релизных сборок, и иногда смотрю, чего там оптимизатор наоптимизировал. Интересно иногда получается, и непонятно.
-
? Adam Bazaroff / Excess team@ - 17.02.2020 17:51
Просьба как-то по-другому реализовать джойстик для «обрезанных», у кого нет Numlock pad'а.
Например на клавишах ASWD/CV. Я сейчас пытаюсь воскресить свой движок игровой, попутно пишу игру для двоих (с поддержкой JoyVox). Предупреждая совет о приобретении клавиатуры с нупадом... Я работаю на MacBook и таскать с собой клаву совсем не хочется. Ну и хорошо бы сразу JoyVox поддержать. Пусть один джойстик останется на нумпаде, а второй где-то слева на клавиатуре. Но в идеале, чтобы это всё можно было настроить в ini файле. Спасибо!
ps. Биты JoyVox:
; Joystick 1 ; Joystick 2
; 177714 bits
; 10 left ; 4000 left
; 2 right ; 1000 right
; 1 up ; 400 up
; 4 down ; 2000 down
; 40 A ; 20000 A
; 100 B ; 40000 B
; 200 select ; 100000 select
; 20 start ; 10000 start
-
? gid - 17.02.2020 19:35
Подумаю. Когда придумаю, как разделить обработку символьных клавиш как клавиш и как эмуляцию джойстика, тогда и что-нибудь сделаю.
А если разнести JoyVox на символьные клавиши и нумпад, то как играть вдвоём там, где нумпада нету? Проще уж оба джойстика на символьные клавиши повесить.
ASWD - направление, CV - это A,B или select, start? И куда вешать вторые две кнопки? На FG? Или они не нужны?
-
? Adam Bazaroff / Excess team@ - 18.02.2020 16:30
FG или QE.
¤
Там где нет нупмпада, второй игрок играет на «БКшной» клавиатуре стрелками, например.
-
? Voland - 19.02.2020 09:54
Подскажите, как с эмулятора снять скриншот в оригинальном разрешении БК 256*256, без всяких интерполяций?
-
? gid - 19.02.2020 11:27
Никак. Это не предусмотрено алгоритмами. Но если воспользоваться средствами инструмента "Карта памяти", то там можно сохранить содержимое страниц памяти, в том числе и экрана как цветную картинку 256х256 или как чёрно-белую 512х256, правда без палитр.
Либо просто уменьшить скриншот до 256х256 в любом просмотрщике картинок без сохранения пропорций и по возможности без интерполяции. Результат будет тот же, но уже с цветами палитр.
-
? Voland - 19.02.2020 11:54
Понял, спасибо!
-
? Adam Bazaroff / Excess team@ - 22.02.2020 21:38
ffmpeg «грабит» видео отлично, но проблема в том, что звуковой трек получается длиннее видеопотока. Т.е. рассинхрон какой-то. С чем это может быть связано и как победить?
-
? gid - 22.02.2020 22:57
С тем, что надо читать заметки к выпуску на сайте. Цитирую:
"Захваченное видео сохраняется в директории Screenshots. Так же туда отдельным файлом сохраняется и звук. Они рассинхронизированы, и мне не удалось их синхронизировать.
¤
Параметры запуска ffmpeg.exe находятся в файле bk.ini в секции [Main] в ключе FFMPEG Cmd Line. Можете сами их менять как хотите, нельзя только менять или удалять параметр "-s %dx%d" - это подставляемое разрешение буфера захватываемого кадра."
¤
Побеждать надо так: Редактируйте в bk.ini параметр FFMPEG Cmd Line, а конкретно: значение ключа -framerate, там я поставил 49, а нужно долго и упорно подбирать какое-то дробное число - 49,5 или с точностью до тысячных или десятитысячных.
¤
Я вообще считаю, что это изначально глупая и мёртворождённая затея. Возьмите лучше прогу OBS Studio https://obsproject.com/ru/download
и с её помощью грабьте видео с окна программы.
-
? Adam Bazaroff / Excess team@ - 22.02.2020 23:42
Никакой заметки в документации я, увы, не видел.
¤
Это очень нужное и необходимое дело. Особенно в таких странных случаях, когда эмулятор запускается в Wine и на экране бывают серьёзные «просадки». Ну и с экрана не получится «сграбить» в этих самых 49,5.Hz. А в будущем, я надеюсь, можно будет туда «передать» данные... скажем так люминофора, чтобы делать «noflic» в записи, получая не дребезжание экрана, а полутона. В эмуляторе Спектрума есть такая опция. И её постоянно используют при записи «демок».
¤
ffmpeg не поддерживает дробные значения, так что подобрать будет несложно.
-
? gid - 23.02.2020 09:11
ffmpeg такая штука, что не высчитывает фреймрейт, а использует тот, что ему задают в параметрах. И дробные значения запросто поддерживает. Я выставлял фреймрейт 48,25 и 49,5 и получал видеофайл, в свойствах которого был задан именно такой фреймрейт. В первом случае видео было медленнее звука, во втором - звук всё таки начинал отставать от видео. И я не знаю, как можно рассчитать точное значение фреймрейта.
¤
Чтобы нивелировать просадки ffmpeg должен уметь захватывать raw данные звука, т.е. передавать ему массив данных звукового буфера, как я сейчас передаю ему raw данные видео - покадровое содержимое буфера кадра. И сам должен уметь считать фреймрейт. Но он этого делать в принципе не умеет. Поэтому я не знаю, как получить синхронное видео со звуком.
-
? Manwe - 23.02.2020 10:21
А нельзя выставить фреймрейт 48.828125 ?
-
? Adam Bazaroff / Excess team@ - 23.02.2020 10:41
48250 или 49500 — это не дробные значения «до тысячной». Я про то, что ffmpeg не поддерживает, например, 48828,125. «,125» отбрасывается.
¤
2manwe: 48828 как раз хочу попробовать в следующий раз.
-
? gid - 23.02.2020 12:20
48828 кадров в секунду не многовато будет?
Сейчас проверил, задал фреймрейт в ини файле 49.125, создался видео файл, в медиаинфо которого так и написано, что FPS 49.125
потом задал 49.8525, создался видео файл, в медиаинфо которого написано, что FPS 49.853 т.е. ffmpeg округляет до тысячных.
-
? gid - 23.02.2020 12:27
если число задавать через запятую, то ffmpeg считает, что параметры командной строки заданы неверно и аварийно завершается, из-за чего эмулятор заклинивает так, что его можно прибить только из диспетчера задач, как и описано в заметке к выпуску на сайте.
Эта проблема нерешаема из-за такой вот реализации микрософтом перенаправления потоков ввода-вывода в оконной подсистеме виндовс. В консольной подсистеме всё гораздо лучше, но эмулятор не консольный.
-
? Adam Bazaroff / Excess team@ - 23.02.2020 13:00
а.. ты про частоту экрана :) я же про звук говорил. Может тогда надо задать разные параметры для видео и звука?
¤
По итогу с предыдущим кейсом, мне удалось перекодировать звук ffmpeg'ом с asetrate=43867. Получилось почти идеально.
Буду экспериментировать дальше.
-
? Manwe - 23.02.2020 20:33
Почему-то экран замыленный в 1024x768. Спасает только Screen Render Mode = DrawDib.
-
? Manwe - 23.02.2020 20:37
Ещё при записи видео внизу появляется надпись «Начать захват видео с помощью внешней утилиты FFMPEG» и программа виснет.
-
? gid - 23.02.2020 21:02
экран замыленный в 1024x768 потому что делается увеличение с 512х256 в 1024x768 средствами OpenGL/Direct2D/Direct3D (смотря что используется в качестве рендера и смотря какие настройки в драйверах) VFW при увеличении не использует никаких замыливаний, но он какой-то дёрганный в Win8/Win10, так что им пользоваться неприятно
¤
программа виснет, потому что ffmpeg'у заданы некорректные параметры командной строки и он сразу завершается из-за чего эмулятор заклинивает так, что его можно прибить только из диспетчера задач, как и описано в заметке к выпуску на сайте.
Эта проблема нерешаема из-за такой вот реализации микрософтом перенаправления потоков ввода-вывода в оконной подсистеме виндовс. В консольной подсистеме всё гораздо лучше, но эмулятор не консольный.
¤
Когда ffmpeg начинает захват, то появляется консольное окошко, в котором в Win10 отображается процесс захвата, а в Win7 - нет, там пустое консольное окно из-за криворукости микрософтовских индусов которые недопилили conhost, но выпилили WinXPшную консоль, и там если перехватить ввод консоли, вывод начинает делаться не в консоль, а в никуда.
-
? Manwe - 23.02.2020 21:26
У меня на Windows 10 даже консольное окно не появляется. А что может быть не так с параметрами ffmpeg? Я ничего не менял в ini-файле.
-
? gid - 24.02.2020 09:21
Оказывается, если директории Screenshots нету, ffmpeg не умеет её создавать, чтобы туда видео сохранять, поэтому он аварийно завершается. У меня не такой шустрый компьютер, поэтому я вижу, как появляется консоль ффмпега, но немного думает и закрывается.
Учту, и в следующем релизе будет пустая директория Screenshots.
-
? Manwe - 24.02.2020 12:21
Спасибо, добавление директории Screenshots помогло.
Но забавно, что записанное видео получилось вверх ногами.
Ещё интересно: демо "Ray Dreams" в одной сцене переключает палитры каждый кадр. В реальном времени это выглядит правильно. А при записи видео возникают пробуксовки и синхронизация сбивается.
-
? Дмитрий - 26.02.2020 14:44
gid, еще пара вопросов:
1) При повышенном приоритете процессора блокируются прерывания клавы по 60/274 и таймеру по 100 вектору. Что еще блокируется? Я так понимаю прерывания по 4/10/14/24/30/34 векторам работают.
2) Что за магическая константа 1330 (728.) в 177664? Число ТВ-строк? Получается записав 730 (472.) мы крутанем экран на все 256 строк вниз, а 1730 на полный экран вверх? Или не так?
-
? gid - 26.02.2020 15:59
1) Бит 7 PSW маскирует все векторные прерывания (VIRQ), какие бы адреса у них ни были, а так же IRQ2 (вектор 100) IRQ3 (вектор 270). И всё, больше ничего не маскирует. Прерывания 4/10/14/24/30/34 - программные, возникают на уровне выполнения микрокода процессора и ничем не маскируются, просто имеют приоритеты друг над другом, если вдруг они возникнут одновременно. Всё это описано в пдфке Vslava.
2) Про эту магическую константу Vslav где-то писал в теме цифровой археологии на zx-pk, это некий счётчик, значение которого подобрано таким, что когда он переходит через 0, означает, что надо начинать вывод первой ТВ строки экрана, или что-то типа того. Счёт ТВ строк - только в мл. байте, т.е. 0330 - нулевая ТВ строка, 0331 - первая и т.д. 0327 - 255.-я
бит 9: 1 - режим полного экрана, 0 - режим 1/4 экрана (расширенной памяти)
Всё это описано во всех трёх книжках по всем трём БКшкам "Руководство системного программиста", а так же ещё в куче мест, где описан регистр 177664
прокрутка экрана вверх:
1$: inc @#177664 ; можно прибавлять число 1..127 чем больше, тем быстрее, тип значения - знаковое байтовое (char)
bis #1000, @#177664 ; устанавливаем бит
br 1$
бит 9 надо устанавливать обратно, т.к. при словной операции, при возникновении переноса старший байт искажается, и бит 9 обнуляется, а при байтовой операции (incb) старший байт тупо теряется.
прокрутка экрана вниз:
1$: dec @#177664 ; можно вычитать число 1..127 чем больше, тем быстрее
bis #1000, @#177664
br 1$
-
? Дмитрий - 26.02.2020 20:29
Про биты я в курсе - меня интересовало откуда такая константа. Еще в 80-е на БК10 исследовал, но так и не въехал, почему именно это число.
-
? Дмитрий - 27.02.2020 16:50
gid, в старых версиях в обработчике прерываний было сказано, что:
¤
//нельзя просто установить бит командой m_pChip->m_reg177716in |= 010;
// т.к в реале делается операция Read-Modify-Write.
m_pChip->SetWord(0177716, m_pChip->GetWord(0177716) | 010);
¤
а в последних версиях эмуля этой записи уже нети выполняется как раз m_reg177716in |= 010. И, кстати, что за бит 3, который устанавливала эта команда? Он вроде не описан.
-
? gid - 27.02.2020 19:26
А это я пересмотрел логику работы с этим битом, чтобы лишних действий не делать и в соответствии с более точным описанием из пдфки Vslavа. Этот бит - один из элементов организации пультового режима внешними устройствами, по сути самый главный - он обозначает, что проц перешёл в пультовый режим. Используется в контроллере динамической памяти 1801ВП1-030, т.е. не в БК. Описание бита в пдфке, начиная со стр.75, пункты 8.3, 8.4
-
? gid - 27.02.2020 19:28
И там в общем-то неправильно, бит надо устанавливать в выходной регистр, а не во входной, но поскольку этот функционал всё равно в БК не используется нигде и никак, я его просто вывел в выходной регистр, чтобы в эмуляторе видеть как процессор входит и выходит в пультовые прерывания.
-
? Дмитрий - 03.03.2020 14:36
gid, столкнулся с интересным моментом. Вывожу изображение из буфера с помощью DrawDibDraw, она расположена в п/п рисования кадра. Если она работает в другом потоке (просто вызов отрисовки, задержка), то все прекрасно - изображение выводится. Но! Стоит не создавать поток, а вызвать отрисовку единичного кадра из основного потока приложения вызовом все той же п/п рисования кадра, то ничего не выводится. DrawDibOpen отрабатывает нормально, CreateDIBSection тоже, DC получается прямо перед вызовом (освобождается сразу после отрисовки), в битовом массиве данные картинки есть, DrawDibDraw возвращает true. А на форме ничего нет. Ничего не меняется, кроме места вызова. Покопался в инете, чет ничего толком не нашел в чем может быть проблема.
-
? Дмитрий - 03.03.2020 14:41
Отрисовал в bitmap единичный вызов - рисует, а на форму - нет.
-
? gid - 03.03.2020 15:12
Не тот контекст что надо выбирается, и рисует в куда-то непонятно куда.
У меня тоже бывало такое, когда я в GetDC передавал не тот хендл, который был нужен. Например, хендл окна, которое было родителем окна, в которое рисовать надо, в результате ничего не рисовалось.
-
? Дмитрий - 03.03.2020 15:16
Так никакие параметры не меняются. Код инициализации тот же, не меняется. Просто вызов DrawFrame не из потока, а по нажатию, допустим, кнопки или пункта меню.
-
? Alexander "Sandro" Tishin@ - 03.03.2020 21:55
По историческим причинам в винде действует правило "кто первым встал, того и тапки". То есть, какой поток первым начал рисовать, такой и числится владельцем прав рисования.
¤
Остальным -- как повезёт.
¤
Везение зависит от версии винды, драйверов видеокарты, фазы Луны и т.д.
¤
Сам попадался на это.
¤
Причиной является то, что GDI внутри однопоточный, и многим потокам исполяемых программ прибивается на ходу системой костылей. Отсюда и проблемы.
-
? Alexander "Sandro" Tishin@ - 03.03.2020 22:06
gid, от мыла в OpenGL спасает параметр фильтрации текстур GL_NEAREST. Тогда будут прямоугольники. Для Direct3D, соответственно, будет D3DTEXF_POINT.
-
? Manwe - 04.03.2020 00:27
Мыло да, всё портит. Главное, видео грабится мыльное, даже если вывод на экран удалось настроить не мыльный.
¤
gid, на счёт грабежа видео вопрос: почему бы не привязывать его к кадровому импульсу?
-
? Alexander "Sandro" Tishin@ - 04.03.2020 01:37
Кстати говоря, да. В принципе, у меня в эмуляторе так и сделано, что по завершению кадра по тикам процессора даётся пинок его достроению до конца (там асинхронно) и готовый буфер 512x256 отдаётся на показ.
¤
Ничто не мешает именно в этот момент сделать скриншот.
¤
Более того, MPEG разрешает неквадратный пиксель в принципе.
¤
(есть идеи даже про lossless MPEG для изображений низкого цветового разрешения, но это уже полное мракобесие).
-
? Дмитрий - 04.03.2020 09:33
>> То есть, какой поток первым начал рисовать, такой и числится владельцем прав рисования.
В том-то и закавыка, что поток, который нормально отрисовывает в первом случае, во втором варианте не создается и ничего не рисует, т.е. тапки достались основному потоку. К тому же либа vfw32, как пишут в инете, использует прямой доступ к видеопамяти для рисования (и рекомндуют создавать буфер для рисования, совпадающий по глубине цвета с десктопом), если не указан ключ DDF_JUSTDRAWIT, который использует GDI. Так что по идее она должна отрисовать где угодно. Но оказалось это не так. Видимо, полученный HDC оказался неверным и отрисовалось на нем "где-то там".
-
? gid - 04.03.2020 11:16
[от мыла в OpenGL спасает параметр фильтрации текстур GL_NEAREST. Тогда будут прямоугольники.]
Это не мыло, а сглаживание при увеличении текстуры 512Х256 в картинку побольше. Это можно выключить, но тогда придут другие люди, и начнут ныть по поводу того, что пиксели очень большие, лесенки глаза режут, неужели нельзя включить сглаживание?
¤
[Главное, видео грабится мыльное, даже если вывод на экран удалось настроить не мыльный]
Уберите из параметров командной строки ffmpegа параметры -vf scale=1024:768 и мыло исчезнет. Правда и картинка станет 512Х256.
Либо читайте доки на ffmpeg и добавьте какую-нибудь фильтрацию, убирающую мыло.
Напомню, что все параметры командной строки находятся в ини файле и любой может их редактировать как душе угодно. Сделайте себе сами немыльное видео.
¤
[на счёт грабежа видео вопрос: почему бы не привязывать его к кадровому импульсу?]
Как? ffmpeg не умеет ни к чему привязываться, он просто берёт кадры, которые скармливаются ему по мере готовности, и всё. К чему их привязывать, решает пользователь с помощью параметров командной строки.
-
? Manwe - 15.03.2020 20:50
>> Уберите из параметров командной строки ffmpegа параметры -vf scale=1024:768 и мыло исчезнет. Правда и картинка станет 512Х256.
¤
Это вариант. Спасибо. Потом можно растянуть командой ./ffmpeg -i input.mp4 -vf scale=1024x768:flags=neighbor -crf 10 output.mp4
¤
>> Либо... добавьте какую-нибудь фильтрацию, убирающую мыло.
¤
А вот это - не вариант :)
-
? gid - 16.03.2020 07:48
[Потом можно растянуть командой]
Э-э-э... можно тупо добавить это в командную строку в инифайле и будет то же самое сразу, без двойных действий.
заменяешь "-vf scale=1024:768" на "-vf scale=1024x768:flags=neighbor -crf 10" разве это не есть моё предложение "Либо... добавьте какую-нибудь фильтрацию, убирающую мыло"?
-
? Manwe - 19.03.2020 11:32
Давно заметил странную особенность: память СМК (или A16) неправильно отображаются в окне просмотра страниц. Начальный адрес страницы приходится не на верхнюю часть картинки, а на середину. Хорошо видно здесь:
https://imageup.ru/img156/3574449/a16m.gif
В реальности картинка хранится не разрезанной пополам, а единым массивом.
-
? Manwe - 19.03.2020 12:20
Для сравнения, та же самая программа, но в 7-ой странице памяти БК0011м отображается правильно (картинка не разрезана):
https://imageup.ru/img156/3574508/bk11page7.gif
-
? gid - 19.03.2020 12:59
Это зависит от того, какой режим используется для доступа к памяти А16М/СМК.
если 160, 160 то там сегменты памяти подключаются нелинейно, если 120, 20 - то линейно.
Особенно хорошо это заметно на таблице режимов контроллера А16М, там всего 4 сегмента по 4Кб. В режимах 160,60 они подключаются как 2,3,0,1, в режиме 120 - как 0,1,2,3. А в окне просмотра страниц отображается просто линейное содержимое памяти, кусками по 16Кб, без учёта режимов, поэтому так и получается.
-
? Manwe - 19.03.2020 22:35
А, понятно... Было бы круто отображать с учётом режима. Так больше соответствовало бы реальности. Полезней для отладки.
-
? Manwe - 07.04.2020 08:59
Почему-то скриншоты грабятся размытыми
-
? gid - 07.04.2020 10:42
У функции CopyImage (https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-copyimage) нет параметров, влияющих на сглаживание при масштабировании. Поэтому она при изменении картинки с 512х256 в 1024х768 применяет своё сглаживание.
¤
Могу сделать опцию, которая будет определять, выдавать ли скриншоты в оригинальном размере, или с нормальными пропорциями 4:3 (но со сглаживанием)
-
? Manwe - 08.04.2020 22:39
В прошлых версиях эмулятора почему-то без сглаживания делались скриншоты в 1024x768.
Нельзя ли после CopyImage растянуть картинку своим методом перед сохранением на диск?
-
? gid - 09.04.2020 09:59
И в прошлых версиях использовался тот же метод. Разве что в сильно прошлых версиях текстура формировалась удвоенного размера 1024х512, может поэтому сглаживания было не заметно.
Я как раз использую CopyImage для того, чтобы изменить размер текстуры 512х256 в 1024х768.
Мне неохота использовать какие-то громоздкие способы, когда это можно сделать одной командой в одной строке.
Я таки лучше опцию сделаю. И ебитесь потом сами с приведением скриншота к нужному размеру.
-
? Manwe - 09.04.2020 21:45
Ну можно и опцию.
¤
Ещё такая неточность: в режиме "Эмулировать клавиатуру БК" шифт всегда изменяет регистр букв. А на реальной БК иначе:
¤
1. заглавные латинские буквы - шифт не влияет
2. строчные латинские буквы - шифт превращает их в заглавные
3. заглавные русские буквы - шифт превращает их в строчные
4. строчные русские буквы - шифт не влияет
-
? Manwe - 19.04.2020 20:57
Поймал глюк в дизассемблере: обратите внимание на команду по адресу 4:
https://imageup.ru/img33/3592588/gid.png
-
? gid - 19.04.2020 22:49
Блин, я-то думал, зачем это я там делал приведения к uint16 результатов операции двух uint16. И убрал их. Вот зачем оказывается.
Верну всё обратно. Это такая фича форматированного вывода, о которой надо просто помнить, чтобы таких казусов не было.
-
? Дмитрий Николаевич - 21.04.2020 21:06
Вот же багодел...
-
? Дмитрий - 03.05.2020 18:40
gid, а как в эмуляторе реализовано выполнение jsr/прерывания как одной команды? Сырцы щас ковырять особо нет времени (тонкости гляну в них позже). У меня не лезет в голову ничего, кроме как при отработке RTS/RTI/RTT взводить признак и выполнять код до тех пор, пока признак не будет взведен. Потому как контролить адрес возврата в регистре не вариант, ибо распространенный способ применения позиционно-независимого JSR R1,PRINT + .ASCII так не сработает.
-
? gid - 03.05.2020 20:06
Никак не реализовано. Всё выполняется покомандно. Но в отладчике можно выполнить jsr/emt/iot и т.п. как одну команду с помощью неявной точки останова. Там для каждой команды рассчитывается предполагаемый следующий адрес, он задаётся как точка останова и запускается выполнение. Поэтому, если внутри подпрограммы или прерывания адрес возврата модифицируется, то отладчик теряет точку останова и прога начинает работать уже сама по себе.
[JSR R1,PRINT + .ASCII так не сработает]
у меня и не срабатывает, надо или вручную ставить точку останова, или заходить внутрь подпрограммы и выполнять команду "Шаг с выходом". Там как раз анализируются RTS/RTI/RTT и после них выполнение останавливается. Но у меня нам серьёзный недостаток - не учитывается вложенность заходов в подпрограммы и выходов из них, поэтому останов будет после первой встреченной команды, а не после той, которая нужна.
Или ставить курсор на нужное место и выполнять команду "Шаг до курсора".
¤
Собственно учёт вложенности вызовов, чтобы останавливаться на нужном, а не на всех подряд реализовать я не смог, т.к. постоянно в программировании на БК применяются такие методы, как заход в emt/trap и выход из них по rts pc, а не rti, или заход в jsr pc и выход из него по mov (sp)+,pc, или ещё по всякому, моv/add/sub nnn,pc, и даже выход из jsr по rtt, и ещё применение rti/rts для перехода в нужное место без всяких jsrов
А ещё бывает jsrов больше, чем rtsов, потому что на каком-то этапе, делается tst (sp)+ и перескок через уровень вложенности. Пример - банальный драйвер магнитофона БК10.
Я не смог придумать правильный алгоритм, который бы учитывал вот это всё и не ломался.
-
? Дмитрий - 03.05.2020 21:44
>> постоянно в программировании на БК применяются такие методы
Черт, точно. В описаннных случаях не только не поймает выход, да еще и все трюки учитывать - голову сломаешь.
¤
>> Я не смог придумать правильный алгоритм, который бы учитывал вот это всё и не ломался.
Я тут ломал голову, до того момента, когда написал вопрос. Есть пока один вариант, который учитывает только классический вариант jsr+rts или прерывание+rti/rtt с учетом вложенности. Примерно так:
¤
1) int Recurse,NeedStop = 0;
2) В процедурах ExecuteRTS/RTI/RTT добавить NeedStop = 1; и Recurse -= 1;
3) В процедурах ExecuteJSR и прерываний добавить Recurse += 1;
¤
далее выполняем код до тех пор, пока не выполнится условие Recurse = 0 && NeedStop = 1;
¤
В итоге имеем следующее: при входе в подпрограмму/прерывание увеличиваем счетчик рекурсии, при выходе взводим флаг необходимости останова и уменьшаем счетчик рекурсии. Если у нас была вложенная подпрограмма, то при встрече выхода из нее, счетчик рекурсии будет =2. А нам надо 0. Поэтому останова не будет. NeedStop можно сделать bool.
-
? Дмитрий - 03.05.2020 21:46
Забыл дописать. Данный прием отлавливать только при нажатии на кнопку "Трассировка без захода" в пошаговом режиме. При выполнении фреймов не проверять.
-
? Alexander "Sandro" Tishin@ - 04.05.2020 14:01
Надо смотреть, как это делают реальные процессоры :)
¤
Для оптимизации возвратов там есть очень короткий аппаратный стек, называется RSB (Return Stack Buffer). При каждом вызове туда пишется, где продолжать исполнение при возврате, и текущее значение SP. С RET всё понятно. Ну а иначе -- если SP оказался выше -- выбрасываем запись, там был какой-то хитрый выход из подпрограммы.
¤
Как адаптировать к отладчику -- очевидно.
-
? Дмитрий - 04.05.2020 23:43
>> При каждом вызове туда пишется, где продолжать исполнение при возврате, и текущее значение SP.
При JSR R1,PRINT + .ASCII адрес возврата в R1 будет изменен, а внутри PRINT иожно сохранить какое-либо значение в стек (для дальнейшего использования) и поменять местами его и содержимое R1 в стеке (мало ли какие трюки могут быть). В итоге стек будет изменен, R1 изменен и что мы получим? RSB паникует и выбрасывает сохраненное значение R1, раз стек не совпадает? А вариант MOV #100000,-(SP) + RET? RSB не использовался - как быть? Кодоизвращения могут быть разными, все не учтешь.
-
? Alexander "Sandro" Tishin@ - 05.05.2020 11:06
Думаю, для отладчика достаточно контролировать глубину стека. Если пошли какие-то хитрые заморочки, то всё равно это придётся разбирать вручную.
-
? Дмитрий - 11.05.2020 14:18
Возник еще один вопрос. Команды MTPS/MFPS работают, учитывая биты признаков. А в случае прерывания из второго слова в PS копируются все биты или только старшие 4 бита (приоритет и Т-бит)? Т.е. если в @#32 записано 201(8), то войдя в прерывание по ЕМТ мы увидим в PSW повышенный приоритет и установленный бит С или только приоритет? БКаха у меня завалена в кладовке, самостоятельно проверить нет возможности в данный момент.
-
? gid - 11.05.2020 16:13
Вообще все биты, разумеется те, которые можно задать в PSW: приоритет, Т, признаки и в том числе биты 11 и 10.
Я в одной проге видел как EMT и TRAP обрабатывались одной подпрограммой по одному адресу, но как раз по биту признаку C определялось, откуда пришло прерывание, с 30 или 34 вектора. Это был какой-то изврат, т.к. реальной надобности в этом не было.
-
? Дмитрий - 13.05.2020 01:25
Еще вопрос. В эмуляторе на время отладки отключается прерывание по вектору @#100?
-
? gid - 13.05.2020 10:30
Нет, не отключается. Просто чтобы оно случилось, в пошаговом режиме нужно сделать очень много шагов. Или выполнить подпрограмму, которая будет длиться больше, чем формирование кадра.
Подпрограмма прерывания, если его время придёт, полностью выполнится во время пошагового исполнения очередной инструкции, т.е. перед ней.
-
? Дмитрий - 13.05.2020 11:21
Кстати, при включении этого таймера первое прерывание происходит сразу после включения или все же по истечению интервала?
-
? gid - 13.05.2020 16:30
Тут недавно Alexander "Sandro" Tishin подробно расписывал, как там всё работает.
Зависит от того, на какой этап отрисовки экрана попало включение. Может сразу, может после отрисовки текущей строки, может тогда, когда задумано.
-
? Сергей Ирюпин@ - 18.05.2020 16:52
Добрый день, интересует формат bin файла в который эмулятор записывает FOCAL программу на диск. Спасибо.
-
? gid - 18.05.2020 22:35
Стандартный, общепринятый формат:
word load_addr; //адрес загрузки файла
word file_length; //размер файла
byte[file_length]; //тело файла
¤
если в .ini файле опция "Use long Bin format" задана в "Yes", то используется полный формат .bin:
word load_addr; //адрес загрузки файла
word file_length; //размер файла
byte[16] = file_name;
byte[file_length]; //тело файла
word crc
¤
эта опция по умолчанию выключена, поэтому скорее всего используется короткий формат.
¤
насчёт структуры самого FOCAL файла - это никто не знает, надо дизассемблировать интерпретатор и разбираться. Но на этот подвиг никто пока не решился.
-
? Manwe - 26.05.2020 09:35
Странный глюк в последней версии эмулятора: постоянный свист при включении Covox.
Причём, проявляется так: если переключиться в любую конфигурацию (например, БК 0011 с МСТД), в которой по умолчанию Covox выключен, то свиста нет. Затем нажимаем кнопку включения Ковокса. Свиста по-прежнему нет! А теперь нажимаем кнопку перезапуска процессора. Свист появляется. И это уже навсегда – при смене конфигурации и повторном возвращении в неё будет пищать с первого раза (если Ковокс включен). Выглядит так, будто конфигурация «портится» после включения Ковокса и перезапуска процессора.
-
? gid - 26.05.2020 12:49
Странно, что это только сейчас заметили. А причём этот кривой код был уже давно.
Там делается попытка сделать так, чтобы беззнаковые 8битные сэмплы смещались на пол амплитуды вниз, чтоб как знаковые выглядело. Из-за чего 0 делался минимальным значением -1 (у меня звук нормализован в диапазоне -1.0 .. 1.0), и так и оставался этим уровнем постоянно, т.к. при ресете в 177714 записывалось 0 и больше не менялось. На моей звуковухе это даёт не свист, а спонтанные попёрдывания, драйверы звуковухи не любят, когда в неё долго суют звуковые буферы со смещением DC, отличным от нуля.
Надо будет исправить это безобразие.
-
? Shestipalov - 27.05.2020 08:46
Добрый день. Похоже, в эмуляторе сломана эмуляци чтения с ленты для конфигурации «БК0011М + МСТД». Для этой конфигурации даже если опция «эмулировать загрузку с ленты» включена, эмулятор всё равно ждет, когда юзер загрузит файл. Конфигурация «БК0010-01» работает нормально, другие не проверял.
-
? gid - 27.05.2020 10:47
Она не сломана. Она просто не реализована.
Забудьте вы это извращение. Хотите магнитофона - пользуйтесь БК10 и не смотрите на БК11, а для БК11 есть эмуляция дисковода, дисковод гораздо удобнее всякой возни с лентами.
-
? Shestipalov - 27.05.2020 10:54
Было бы невредно тогда заблокировать соответствующие пункты в меню для конфигураций, у которых эмуляция записи-чтения на ленту не реализована. А то путаница получается, нехорошо.
-
? gid - 27.05.2020 13:09
Это тест на умение читать документацию. Посылать RTFM гораздо проще, чем придумывать всякие ухищрения в пользовательских интерфейсах.
-
? Terra - 27.05.2020 13:44
Смысл загрузки с ленты на БК0011м видимо в тесте минидемок, чтобы не инициализировать вызовы emt
-
? gid - 27.05.2020 16:30
Таких особенных минидемок, которые используют emt вызовы БОС БК11? Только в этом причина?
А почему не инициализировать вызовы emt так критически важно? Двух слов жалко? Для тестирования можно вставить в начале демки JSR PC,@140010 и пользоваться в удовольствие, без зависимости от эмуляции магнитофона. А в окончательном варианте - убрать, чтоб демка уместилась заданные лимиты.
-
? Terra - 27.05.2020 20:30
Ну да у меня такая мысль и была, плюс ещё надо пзу подключить
-
? gid - 27.05.2020 20:43
Основное ПЗУ по адресу 140000 подключать не надо, а второе ПЗУ теневое, в том его и прелесть, оно само подключается, если подпрограммы emt находятся в нём. Там надо нужные страницы ОЗУ в окна подключать. Там даже экран виртуальный, его страница подключается в окно0 или окно1, в зависимости от emt, только на момент вывода туда текста или графики средствами ПЗУ БОС, а потом отключается.
Из-за этого подключения-отключения по поводу и без, там всё тормознуто, зато с точки зрения БОС, пользователю предоставляется целых 48кб непрерывного адресного пространства. Раздолье для RT-11.
-
? Manwe - 29.05.2020 10:00
Что-то странное происходит: MOV #40000,@#177662 не отключает таймер по 100-му вектору. Трассировал программу и обнаружил: несмотря на попытку отключить таймер, первый же MTPS #0 приводит к прерыванию по вектору 100.
-
? gid - 29.05.2020 15:22
А у меня всё нормально. заставка Андос3.1 на БК11М по таймеру работает и после входа в оболочку глюков нет, хотя там и вектор 100 обнуляется и приоритет #0.
и простенький тест работает как надо:
¤
mov #42400, @#177662
mov #t100, @#100
mov #340, @#102
mtps #0
mov #2400, @#177662
wait
wait
wait
wait
wait
mov #42400, @#177662
mtps #0
1$: wait
nop
br 1$t100: nop
rti .end
Если поставить точку останова на t100, то на первых waitах будет срабатывать точка останова, а потом в цикле с Waitа можно будет уйти при прерывании от клавиатуры, прерывания по таймеру нет.
-
? gid - 29.05.2020 15:25
как интересно асм текст перекорячило. Одинарный \n остался как есть, а \n\n исчез полностью, даже одного не осталось.
-
? Manwe - 30.05.2020 00:57
А поддерживает ли эмулятор обращение к HDD в формате LBA? Я так понимаю, программно нужно устанавливать один бит в том регистре, где задаётся головка, и тогда данные остальных регистров интерпретируется винчестером как единый 28-битный номер блока. http://www.cpcwiki.eu/index.php/SYMBiFACE_II:IDE_registers
-
? gid - 30.05.2020 08:25
Формально - поддерживает LBA 28, такой код в исходнике есть, но на практике не проверялось.
-
? manwe - 31.05.2020 19:27
Всё же подозреваю проблему в эмуляции. В режиме БК0011м+СМК у меня даже такое бывает иногда (а иногда не бывает) сразу после запуска эмулятора:
https://imageup.ru/img151/3613651/emulator-bug.png
-
? Maxvek - 31.05.2020 20:30
Manwe это не эмулятор виноват это каталогу диска настал конец, попробуй удали не нужные файлы и эти крякозяблы возможно отделаешься легким испугом. П. С, За MKDOS замечена такая неприятность с каталогами хотя сама система пишет что все нормально и переполнение каталога нет об ошибке и то что с ним не все в порядке узнаёшь по факту обновления его с диска.
-
? gid - 31.05.2020 21:09
У меня никогда такого не наблюдалось.
А про MKDOS да. у него есть какой-то лимит файлов в каталоге, при превышении которого начинаются подобные глюки.
Причём этот лимит ниже максимально допустимого количества записей в каталоге.
Сейчас уже не помню нужного числа, я однажды сидел и тупо создавал каталог в каталоге до тех пор, пока такое на экран не полезло. А оболочка при этом писала, что ещё есть свободные записи в каталоге, и можно было бы и дальше создавать, но в конце-концов она зависла.
-
? Manwe - 01.06.2020 14:40
Интересное поведение HDD у эмулятора: в паспорте HDD есть регистр, указывающий сколько блоков можно загрузить за раз в буфер HDD. Программа HDD Img Maker создаёт образы, в которых отмечено, что буфер только на 1 блок. Но с такого образа получается считать 8 блоков без возникновения ошибки. Даже больше восьми (кажется, на 11-ом повисает - перестаёт выдавать бит готовности).
-
? Дмитрий - 01.06.2020 21:50
>> Сейчас уже не помню нужного числа
у МКДОС 172 файла макс. АНДОС 112.
-
? gid - 02.06.2020 09:12
>>? Manwe - 01.06.2020
А там код эмуляции довольно кривоватый, он эмулирует а не симулирует HDD и там много условностей.
>>? Дмитрий - 01.06.2020
Не, там глюки с каталогом начинались ещё до достижения максимума. А вот когда - не помню.
-
? Дмитрий - 04.06.2020 01:40
>> А там код эмуляции довольно кривоватый, он эмулирует а не симулирует HDD и там много условностей.
Ну скажем так, код там более-менее нормальный. Я доработал его до LBA48 - все работает отлично. Но скорость маленькая. Все из-за того, что эмулятор читает/пишет каждый сектор по мере передачи данных через регистр. Хочу доработать, чтобы эмулятор считывал весь запрошенный объем в буфер, а затем выдавал его пословно в регистр. И запись точно также - передали весь объем в бефур, записываем. Емнип, винт так и работает - при чтении/записи во внутренней памяти выделяется буфер не на один сектор, а макс. возможный размер. Иначе и на РС скорость была бы копеечной. А она на реальном винте гораздо выше той, что достижима этим алгоритмом. Плюс там очень много лишних операций - в частности seek: нет смысла высчитывать указатель на следующий сектор в пределах одной операции, после чтения/записи данных мы уже стоим на следующем секторе. Нужен только первый вызов, затем просто увеличивать счетчик LBA/CHS.
-
? Alexander "Sandro" Tishin@ - 04.06.2020 09:57
А какая разница? Дисковая подсистема ОС всё равно делает упреждающее чтение и кэширует данные. Ты просто продублируешь и так уже имеющийся функционал.
¤
Собственно, ты же сам об этом и пишешь. Если винт и ОС сами буферизуют данные, зачем это делать в третий раз?
-
? Дмитрий - 04.06.2020 13:48
Я про PIO-чтение/запись - там нет никакого кэширования, вся работа на программисте. На БК ни в одной (емнип) нет никаких кэширований, памяти мало, поэтому есть небольшой буфер для FAT/каталога.
-
? Alexander "Sandro" Tishin@ - 04.06.2020 14:17
Я знаю. Поэтому и спрашиваю -- зачем кэшировать в эмуляторе, если всё равно узкое место -- эмулируемая машина.
-
? Дмитрий - 04.06.2020 14:44
Потому что у меня, на моей машине, текущая реализация контроллера HDD прогоняет примерно 1,5мб/сек. Было меньше, но после того, как я эмуляцию команд сделал на чистом асме (и получил офигенный буст), скорость увеличилась. Теперь думаю, что придется и контроллер переписать на асм. В дополнение к эмуляции команд прибавится буст от контроллера. В теории всю реализацию надо бы переписать на асм, но я пока перепишу основную часть, где есть бутылочное горло.
-
? gid - 04.06.2020 19:14
>>Плюс там очень много лишних операций - в частности seek: нет смысла высчитывать указатель на следующий сектор в пределах одной операции, после чтения/записи данных мы уже стоим на следующем секторе. Нужен только первый вызов, затем просто увеличивать счетчик LBA/CHS.
Посмотрел сейчас код. И не нашёл, чего там оптимизировать. Перед каждой операцией чтения/записи данных нужно делать позиционирование на нужный сектор, потому что может быть рандомное чтение/запись. Так же нужно проверять, не вылезли ли мы за геометрию.
При групповом чтении/записи, опять же нужно заполнять промежуточными значениями регистры по правилам LBA/CHS, не вылазим ли за геометрию посреди групповой операции, так и так у меня выходит нужно выполнять все операции, из которых состоит функция seek.
-
? Дмитрий - 05.06.2020 01:26
>> И не нашёл, чего там оптимизировать
после поступления команды чтения/записи:
1) спозиционировать в файле указатель, соответствующий LBA/CHS
2) считать сектор
3) выдать следующий сектор в регистры
4) выдать данные в регистр данных
5) если есть еще секторы - goto 2
а в текущей реализации goto 1
-
? Дмитрий - 05.06.2020 01:29
В пределах одной операции никаких рандомных операций не может быть. Конманда READ_SECTORS читает указанное число секторов, начиная с указанного.
-
? gid - 05.06.2020 08:52
>>5) если есть еще секторы - goto 2
При этом, если вылезли за геометрию, будем пытаться позиционироваться за конец файла, при этом будут читаться нули и не будет выдаваться флагов ошибок.
¤
Под рандомным чтением/записью имелось в виду последовательность команд чтения одиночных секторов, располагающихся не последовательно друг за другом. Там перед командой надо каждый раз задавать координаты нужного сектора.
-
? Alexander "Sandro" Tishin@ - 05.06.2020 18:14
Честно признаюсь: я вообще не понимаю, в чём проблема. Для БК мало 1,5МБ/сек? У неё команд в секунду в пять раз меньше! Хост выдаёт так мало? Ну так это где-то косяк в софте, современные винты выдают порядка 100 МБ/сек. И дело тут явно не в ЯВУ вместо ассемблера.
¤
В общем, не понимаю.
-
? Дмитрий - 05.06.2020 20:20
>> При этом, если вылезли за геометрию, будем пытаться позиционироваться за конец файла, при этом будут читаться нули и не будет выдаваться флагов ошибок.
А проверка на что перед чтением? Если указатель равен размеру файла, то ошибка.
¤
>> Там перед командой надо каждый раз задавать координаты нужного сектора.
Так после подачи команды и происходит единственное позиционирование. Зачем его вызывать перед каждым сектором?
¤
>> Для БК мало 1,5МБ/сек? У неё команд в секунду в пять раз меньше! Хост выдаёт так мало? Ну так это где-то косяк в софте
Для БК10/11 норм, а для моего симулятора 32-битной - мало. Я же писал, что не ...дцатый эмулятор пишу, текущего за глаза хватает, да плюс твой.
¤
>> современные винты выдают порядка 100 МБ/сек
Это в ДМА. PIO такой скорости не даст.
-
? Manwe - 09.06.2020 14:09
Проблема с кнопкой СТОП связана с виртуальной клавиатурой. Не знаю как с настоящей клавиатурой (у меня нет Pause и Num Lock). Кнопка одноразовая.
-
? gid - 09.06.2020 20:01
Проблема с кнопкой СТОП на виртуальной клавиатуре пофиксена ешё в билде v3.10.2003.7958 от 05.03.2020
-
? Manwe - 10.06.2020 20:38
Ура, починилось! :) У меня была не самая новая версия эмулятора.
-
? Дмитрий - 19.06.2020 15:32
gid, что-то не совсем понятна логика в 2 местах CHDD::write_regs:
¤
1)
case REG_1F0:
if ((m_nDrvHeadReg_1f6 ^ m_nMasterSlave) & 0x10) <== отсеиваем обращение к slave при обращении к master и наоборот?
{
return;
}
¤
2)
case REG_1F7:
if (((m_nDrvHeadReg_1f6 ^ m_nMasterSlave) & 0x10) && (data != 0x90)) <== а тут тоже самое + не команда HDD_IDE_COMMAND_EXECUTE_DEVICE_DIAGNOSTICS?
{
return;
}
-
? gid - 19.06.2020 16:17
Код не мой, я тоже не сильно понимаю, что там, мне главное - чтоб работало.
Я просто взял самый простой и понятный для себя код из 4-х найденных в интернете реализаций, который к тому же можно под себя адаптировать.
как я понимаю, в случае 1) - просто исключается запись в не тот HDD. если у нас есть оба, мастер и слейв, то запись должна делаться только в адресуемый HDD, а не в оба сразу.
а в случае 2) - то же самое, но команда 0x90 всё таки должна подаваться сразу в оба HDD.
Это наверное, чтобы программно определить, есть ли у нас на канале винт или нету.
-
? Дмитрий - 19.06.2020 16:47
Ну вообще реализация этого момента странная. Можно (и нужно) различать кому подается команда по выставленному биту Master/Slave - он к моменту подачи команды накопителю обязательно должен быть выставлен. Соответственно читать/писать регистры тоже, а не смешивать данные из обоих каналов. Диагностическая команда также должна посылаться конкретному винту.
¤
Остался неясным момент в режимах выполнения команд чтения/записи: можно ли писать данные в регистры адресации винта при выполнении операций чтения и записи. К примеру, выставили адресацию, подали команду чтения, винт считал и выдал бит ожидания съема данных, а пользователь, допустим, стал баловаться записью в 1F2-1F5. А в эмуляции защита от этого не предусмотрена и в seek следующий сектор увеличивается прямо в регистрах. И как должен отреагировать винт на подачу команд IDLE/RESET/DIAGNOSTIC/RECALIBRATE/SLEEP/STANDBY? Сброс буфера сектора вместо ожидания съема данных, запись на диск того, что успели передать для записи, отменяется ли команда чтения/записи подачей этих команд?
-
? Дмитрий - 19.06.2020 17:14
проверку STATUS_DRQ проглядел - второй вопрос отпадает.
-
? gid - 19.06.2020 18:24
В других местах, где я смотрел, если подана команда SLEEP, чтение/запись в регистры игнорируются, пока HDD не будет обратно разбужен.
Но разбудить уже обратно не получится, нужно делать ресет устройства извне.
Если поданы команды IDLE и IDLE IMMEDIATE то, выдаётся разный ответ на команду CHECK POWER MODE и больше ни на что не влияет.
Команды STANDBY и STANDBY IMMEDIATE написано в TODO, что должны так же выдавать результат как и IDLE и IDLE IMMEDIATE, но не реализовано.
-
? Дмитрий - 19.06.2020 20:19
Нет, это понятно. Я имел в виду как будет себя вести накопитель, который ждет считывания данных или получения данных для записи и которому в этот момент подают команду ну, допустим, рекалибрации или IDLE. Он отменит текущую незавершенную команду или проигнорирует поданную?
-
? Дмитрий - 22.06.2020 16:42
В данной реализации намешаны стандарты. Если используется бит 7 (HOB) в 3F6, то из оставшихся используются только биты 1 - Interrupt Enable и 2 - Soft Reset, а остальные считаются зарезервированными. Регистр же 3F7 не используется вообще. Вот что о нем пишут:
¤
Регистр адреса устройства DriveAddr (3F7h, 377h) использовался только в первой версии ATA для совместимости со старыми контроллерами, чтением этого регистра можно было определить адресованный привод и головку. Регистр выпадает из блока (он совпадает с диагностическим регистром состояния контроллера НГМД) и рекомендуется, чтобы устройство ATA не отвечало на чтение этого регистра. Если устройство отвечает на чтение, то оно не должно управлять битом DD7 во избежание конфликта с контроллером НГМД, у которого по этой линии передается бит смены носителя. Из-за несоблюдения этого требования могут возникать проблемы, когда контроллер (адаптер) ATA и контроллер НГМД находятся на разных платах.
-
? Дмитрий - 22.06.2020 17:29
Судя по докам, из SLEEP, кроме внешнего сброса, накопитель поднимается командой DEVICE_RESET 0х08.
-
? gid - 23.06.2020 09:41
Не знаю, и разбираться мне в этом неохота, пока в эмуляторе явно не полезут глюки, связанные с работой HDD.
-
? Дмитрий Николаевич - 23.06.2020 12:45
Сергей, правки косметические ( https://yadi.sk/i/o2slufmwU_UNuA ) заберёшь из SVN ?
-
? gid - 23.06.2020 13:16
Заберу.
Только если уж на то пошло, можно не останавливаться на достигнутом и попробовать сделать диалог настроек, возможно с табами, в котором будет разрешено менять максимально возможное количество, в идеале всех, параметров из ини файла.
Я иногда подумываю над этим, но как только начинаю прикидывать, как бы это попроще сделать, сразу расхочивается. Проще вручную в ини файле параметр поправить, чем возиться с диалогом и сочинять код, который будет искать и применять сделанные изменения.
-
? Дмитрий Николаевич - 23.06.2020 13:24
По табам сделаю, давно хотел отделить мух от котлет (железячные параметры с интерфейсными во всяком случае). Насчёт "максимально возможного количества" нужно понять: прям всё-всё из общих параметров эмулятора ([Options], [Main]...), или прям всё-всё из каждой секции в конфигурациях БК тоже?
¤
ЗЫ: на ноутбуке с 10-ткой обновилась недавно 2019, а в ней выпилены SDK Windows 8. Совсем. Так-что кодить могу везде, а собирать только дома, на ББ. Тут 2019 превью, в ней SDK ещё есть. Тут или тебя просить 3D3 от DX-а отделить, говорят есть доступные библиотеки, или ждать пока совсем собираться перестанет.
-
? Дмитрий Николаевич - 23.06.2020 13:29
Забыл уточнить: сейчас, при выборе конфигурации БК в Настройках, поля HDD не заполняются тем что уже есть в выбранной конфигурации. Ещё не доделал :) Но зато чудесно сохраняет туда имеющиеся пути. Кнопка "Х" очищает путь, если потребуется старт с дисководов.
-
? gid - 23.06.2020 15:42
Можно позволить изменять почти прям всё, из каждой секции, просто необходимо как-то дать понять изменяльщикам, что бездумное изменение некоторых параметров может стать фатальным. Но это будет проблемой тех, кому нечем занять руки и кто не любит читать документацию.
Только на данный момент секция [Directories] сделана только по чтению, т.е. изменение параметров в ини файл не сохраняется.
И логика программы не рассчитана на то, что имена директорий будут меняться по ходу работы, если её не переделать, глюки гарантированы.
Секцию [Rom modules] можно редактировать на ходу, после перезапуска конфигурации тогда будут применяться новые ПЗУ.
Единственное, что нельзя давать менять пользователю, это параметр [Main].BK model, иначе начнутся уже глюки с чтением/записью параметров из ини файла, и [Parameters].Sound volume - это начальная установка позиции слайдера громкости при запуске эмулятора, изменение её вручную бессмысленно, или надо придумывать способ, как она должна на громкость влиять, пока её меняешь.
¤
Да и потом можно меню "Опции" уменьшить, если опции переедут в общий диалог настройки параметров. Или оставить дублирование, для быстрого доступа.
¤
У меня SDK Windows 8 осталось ещё с VS 2015, и так и сидит в системе, однако: 1) скачать и установить его с сайта микрософта пока ещё не проблема; 2) вообще нет никакой необходимости привязываться именно к этому SDK. Можно в свойствах проектов выставить SDK вообще любой понравившейся версии. У меня на ноутбуке тоже не было SDK 8, поэтому сейчас у меня во всех проектах выставлена версия 10.0 (последняя установленная версия). А то на разных компьютерах, на которых я собираю эмулятор стоит зоопарк из разных версий SDK 10.
Эмулятор собирается в двух отдельных конфигурациях: основная - без поддержки Windows XP, и там версия SDK вообще не имеет значения, всё равно оно будет работать на Windows 7 и выше.
И конфигурация с поддержкой Windows XP, которая использует только SDK 7.1, и для которой нужны старые компоненты из VS 2017 или VS 2015.
-
? Дмитрий Николаевич - 23.06.2020 16:00
>> Единственное, что нельзя давать менять пользователю, это параметр [Main].BK model, иначе начнутся уже глюки с чтением/записью параметров из ини файла,
¤
Как-раз это я давно сделал, и никаких глюков пока не наблюдаю ни я (https://yadi.sk/i/ExYJ3iJA-CR88A), ни кто-то ещё из телегочата. Применение происходит через кнопку "Сохранить", которая пинает конфигурацию. Ты же это сам доделывал чтоб подобных косяков в будущем не было.
¤
Насчёт SDK - как только я ни изгалялся - включение SDK 10 для проекта вываливает ошибку сборки всего солюшена, ибо 3D3 вываливает ошибку (счас не вспомню какую конкретно, но что-то вроде несовместимая SDK, установите SDK бла-бла-бла), на ноуте удалил 2013, 2015 студии, оставил 2017 и 2019. В 2019 все SDK были, я точно помню, но после обновления - SDK 8 точно исчезла и пока я не нашёл её на сайте мелкософта.
-
? Дмитрий Николаевич - 23.06.2020 16:14
В любом случае, абзац
"Правка параметров проектов, теперь будет использоваться последняя установленная версия Windows SDK, и VS2019 как основной инструмент." тут http://gid.pdp-11.ru/
говорит что SDK 8 вовсе не нужен, но у меня без него сборка не собирается на ноуте, но собирается на ПЦ. Код ясное дело и там и там один.
-
? gid - 23.06.2020 19:45
что-то у меня ничего не забирается из СВН. То ли я забыл как надо делать, то ли что-то не так.
-
? Дмитрий Николаевич - 23.06.2020 20:34
Написал в почту (на яндексе)
-
? gid - 23.06.2020 21:18
да я уже вспомнил, как надо было делать.
-
? Дмитрий - 26.06.2020 17:27
Переписал с небольшой оптимизацией эмулятор IDE на чтение/запись единым блоком - скорость стала ~13...16,7Мб/сек, неплохо.
-
? Manwe - 03.07.2020 18:03
Утилита LBAtest для работы с HDD часто выдаёт timeout при записи секторов. На эмуляторе. Если фоном запустить какую-нибудь ещё программу или если система захочет выдать нотификацию или проверить обновления. На реальной БК такого, конечно, нет.
В утилите стоит небольшое число циклов (83) ожидания бита готовности, но реальной БК этого хватает.
Так что оптимизировать работу эмулятора с диском полезно!
-
? Дмитрий - 05.07.2020 00:11
Я проверял в своей версии - вроде 1 цикл ожидания бита готовности на записи (если не ошибаюсь). Надо будет написать подробный тест (как время появится) и залоггировать кол-во циклов после записи каждого сектора при записи, допустим, 1 мб данных.
-
? Дмитрий - 05.07.2020 00:14
Бутылочное горло - операции с диском. CreateFile с флагом FILE_FLAG_NO_BUFFERING крайне медленно ведет обмен с диском. Пришлось отказаться и открывать с FILE_FLAG_RANDOM_ACCESS.
-
? Manwe - 17.07.2020 11:00
Посмотрите, пожалуйста как эмулятор (не)грузит игру Green с магнитофонной защитой: https://manwe.pdp-11.ru/Tapes
На реальной БК 0010 всё без ошибок. Файл 8 bit mono 12 KHz, но я на всякий случай выложил и вариант 48 КГц: https://manwe.pdp-11.ru/Tapes/Green48.wav
-
? gid - 17.07.2020 14:23
Это не защита, а просто help'оподобный формат записи, чтобы время загрузки сократить.
Если этот Wav взят из архива hobotTapes, то он и не будет загружаться в свежей сборке эмулятора никак, а если взять более ранние сборки, то там будет, но там не будут загружаться игры Бортника с защитой.
Чтобы такие файлы загружались в эмуляторе, нужно в блоке help модуляции увеличить длину синхроимпульса на 1, относительно длины синхроимпульса в стандартной части.
Я перегенерировал все такие файлы в архиве hobotTapes и обновил его, он доступен по прежней ссылке, теперь такие файлы загружаются в эмуляторе.
-
? Manwe - 17.07.2020 15:28
Ого, хитро.
А изначально игра «Green» была с какой-то защитой? Смутно помню, что она не копировалась обычными средствами. Может быть просто начиналась с 400-го адреса?
-
? gid - 17.07.2020 15:42
У меня была когда-то кассета с играми с защитой от копирования, там вроде бы был и GREEN, защиты там были такого типа: размер файла в заголовке был больше реального, и не было блока КС и финишной последовательности, зато файл начинался не то с 400 не то с 600 адреса и там в хитром блоке был код, которому передавалось управление и он сам считал КС, и если она совпадала с заданной, то игра запускалась. Простые копировщики такие игры просто не копировали, они продолжали ожидать чтения после окончания файла.
Я в те времена копировать такие игры не умел и кассета была благополучно зажёвана магнитофоном, игры пропали, но к тому времени уже нашлось у кого скопировать эти же игры, и даже более, без всяких защит.
-
? gid - 17.07.2020 15:45
Т.е. кажется, какой-то своей оригинальной защиты у GREEN не было.
-
? Шестипалов - 19.07.2020 14:41
Сергей, привет. Хотелось бы в эмуляторе иметь возможность в чёрно-белом режиме выбирать оттенок — белый, зелёный, янтарный, синий, как на тогдашних мониторах. Ну или вообще оттенок через параметры RGB задавать.
-
? Manwe - 19.07.2020 15:28
>> Т.е. кажется, какой-то своей оригинальной защиты у GREEN не было.
Но всё равно, описанная защита выглядит интересно (для истории), было бы здорово найти такой WAV.
-
? gid - 19.07.2020 19:23
[Хотелось бы в эмуляторе иметь возможность в чёрно-белом режиме выбирать оттенок]
Физически, практически и с т.з. программирования это не сложно, но я буду хоть что-то делать с эмулятором не раньше конца сентября, начала октября.
-
? Manwe - 20.07.2020 14:53
Не могу понять почему так работает инструкция HALT:
у меня есть вызов инструкции EMT 16, которая печатает код СБР (очистка экрана), эта инструкция EMT 16 расположена в экранной памяти. Соответственно, следом за EMT 16 получается HALT (0) и сама EMT 16 тоже стирается. Так вот эмулятор в режиме трассировки исполняет этот HALT (который уже после EMT 16) и переходит на следующий HALT. И только второй HALT приводит к переходу по 4-му вектору. Почему так?
-
? gid - 20.07.2020 15:05
а первый HALT игнорируется что ли?
-
? gid - 20.07.2020 15:36
В общем почему так? А потому, что HALT вызывает не сразу прерывание по вектору 4, а вызывает системное прерывание по вектору 160002 и сохраняет PS,PC в пультовый стек, 0177676-0177674, что и вызывает прерывание по вектору 4.
Но вызванное прерывание по вектору 4 в эмуляторе обрабатывается не немедленно, а выставляется флаг требования прерывания, и в следующем цикле обработки инструкций флаги опрашиваются, перед обработкой инструкции.
Поэтому отладчик спокойно переходит к выполнению следующей за HALT инструкцией, т.е. второму HALT.
Мы жмём F10, попадаем в цикл обработки инструкций и вот тут-то происходит опрос состояний и выясняется, что нужно сделать прерывание по вектору 4, вызванному предыдущим HALT. Поэтому делается прерывание, а второй HALT уже не обрабатывается.
¤
Если не делать пошаговую отладку, программы ничего такого не замечают и всё работает как по-настоящему.
А в режиме отладки вылазит вот такое. Это единственный случай, т.к. прерывание вызывается не командой а действиями команды, поэтому я не стал городить сложности с прямо хитрой какой-то обработкой HALT в отладчике. Все остальные команды в пошаговом режиме сразу вызывают свои прерывания и выполняют свои действия.
-
? Manwe - 20.07.2020 16:23
А, понятно. Смущает просто, что приходится нажимать клавишу пошаговой трассировки на 1 раз больше, чем реальное число выполненных команд.
-
? grf - 22.07.2020 08:15
А нельзя в эмуляторе как-то убрать звук винды, который раздается при нажатии клавиш с АР2?
-
? gid - 22.07.2020 09:07
Без понятия. Я всегда отключаю в винде системные звуки и даже не знал, что существует звук винды, который раздается при нажатии клавиш с АР2.
-
? Дмитрий Николаевич - 23.07.2020 17:25
Это "Стандартный звук" в звуковой схеме. https://answers.microsoft.com/ru-ru/windows/forum/all/%D0%BD%D0%B5%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%BD/362bb7e4-c0a6-4f46-a544-59c578138085
-
? grf - 25.07.2020 10:52
Спасибо, Дмитрий Николаевич, отрубил наконец-то этот дурацкий звук) Хотя я нигде, кроме эмулятора, его и не слышал.
-
? grf - 17.08.2020 03:02
Судя по доке, в эмуляторе никак не эмулируется мышь "Марсианка"?
-
? gid - 17.08.2020 10:06
Верно. Эмуляция как была в планах, так в планах и осталась. Потому что есть непонятно как реализуемые места, а подглядеть, как у других сделано - негде, или я не знаю где.
-
? Дмитрий Николаевич - 17.08.2020 10:37
> Потому что есть непонятно как реализуемые места
То-есть в регистр @#177714 эмулятор ничего положить не может?
-
? gid - 17.08.2020 13:21
Поскольку эмулятор эмулирует регистр 177714, то и сделать с ним он может абсолютно всё, что угодно. Непонятно другое - механизмы захвата и освобождения ПКшной мыши, движения которой будут эмулировать движения мыши марсианки. Я всю эту фигню в деталях не могу представить и поэтому не могу запрограммировать.
-
? Дмитрий Николаевич - 17.08.2020 21:05
> Я всю эту фигню в деталях не могу представить и поэтому не могу запрограммировать.
Набросай "ловушку", чтобы в неё пулять "число" (в БК-шном виде &Oxxx наверное сразу). Наверное этого должно хватить.
А там разберёмся что туда кидать и как высчитывать движения мыши над Screen окна БК. Может даже курсор виндовый скрывать будем.
Обычно необходимо обработать три сообщения WM_LBUTTONDOWN, WM_MOUSEMOVE, и WM_LBUTTONUP.
-
? Дмитрий Николаевич - 18.08.2020 01:16
^^^ to gid: если есть идеи, намыль в почту. Пока желание кодить и время в наличии, попробую.
-
? grf - 18.08.2020 08:34
DOSBOX ловит мышь, а его исходники открыты :) https://sourceforge.net/projects/dosbox/
-
? gid - 23.08.2020 19:39
Если бы я мог внятно сформулировать идею и задачу, то я бы и сам смог её решить. А пока я просто не понимаю, как сделать захват мыши применительно к внутренней архитектуре эмулятора. Т.е. зафигачить фигню, которая фигово работает то можно.
Ясно, что ловить события от мыши нужно в классе CBKView, там клавиатура эмулируется, там и мышь должна. А потом их надо куда-то транслировать, например классу CMouseEm, который будет отдельным объектом в отдельном потоке сидеть и преобразовывать пойманные события от мыши в сигналы мыши марсианки.
Или можно прямо там, в классе CBKView забабахать эмулятор мыши, по подобию эмуляции там же джойстика.
¤
Там ещё фигня такая - чтобы мышь марсианка что-то выдавала, в неё нужно записывать число 10, это строб данных, после которого мышь выдаёт новые данные. А это опять несовместимость с ковоксом и с блоком нагрузок.
Потому что понавесили всё на один порт, а оно не совсем совместимо между собой.
-
? Дмитрий Николаевич - 24.08.2020 00:14
> нужно в классе CBKView
Я в тестах запихал работу с мышью сразу в CScreen, ибо только там мышь ловится в фрейме окна БК. Правда пока ломаю голову как правильно сделать board->m_reg177716in
¤
> Там ещё фигня такая - чтобы мышь марсианка что-то выдавала, в неё нужно записывать число 10, это строб данных, после которого мышь выдаёт новые данные. А это опять несовместимость с ковоксом и с блоком нагрузок.
Так ведь &o10 пишет сама программа, которая просит коды мыши. В CSIDOS это число постоянно пишется в регистр, поэтому ковокс и пищит. Как-бы всегда так было, вроде никто не жаловался. Говорят это даже лечится вроде как конденсатором (я не специалист, могу соврать)
-
? Дмитрий Николаевич - 24.08.2020 01:52
^ поправка, конечно-же m_reg177714in
-
? Дмитрий Николаевич - 24.08.2020 10:23
https://yadi.sk/d/JZpQ2rKKrIrZPQ (следить за красным курсором мыши В CSIDOS :) )
Без скриншотеров и граберов окна дёргается поменьше. При записи видео оно ещё сильнее дёргается. Наверное потому что фрейм окна БК рисуется реже чем ловится событие мыши ))
-
? gid - 24.08.2020 10:31
[Правда пока ломаю голову как правильно сделать board->m_reg177716in]
Из CScreen, кроме как посылкой сообщений никак, но с сообщениями тоже не всё так просто, там или надо знать, куда посылать, или рассылать широковещательные сообщения всем.
Так что если в CBKView ловить сообщения от мыши не получается из-за того, что мешает CScreen, то надо в CScreen сделать ретрансляцию сообщений мыши родителю, т.е. в CBKView, а уж там поиметь доступ к board->m_reg177714in не проблема.
¤
У меня где-то в D3D была сделана ретрансляция сообщений клавиатуры из экрана в CBKView потому что в полноэкранном режиме экран вдруг брал на себя всю обработку сообщений клавиатуры и в эмуляторе она переставала работать.
-
? Дмитрий - 25.08.2020 22:28
gid, ловить мышь надо прямо на форме, сообщение WM_MOUSEMOVE. Поскольку экран отрисовывается в определенной точке формы, то если координаты курсора "попали" в экран - сравниваем с предыдущими запомненными и вычисляем, какое смещение надо выдать битами в 177714.
-
? Дмитрий Николаевич - 29.08.2020 01:50
> У меня где-то в D3D была сделана ретрансляция сообщений клавиатуры из экрана
Попытался с PreTranslateMessage(), увы ниасилил
¤
>gid, ловить мышь надо прямо на форме
Так и ловим же на форме. Проблема в рассинхронизации из-за своей отрисовки формы (фрейма) окна БК.
-
? Дмитрий - 29.08.2020 02:56
>> Проблема в рассинхронизации из-за своей отрисовки формы (фрейма) окна БК.
А какая там рассинхронизация? Отрисовка формы это одно, а посылка сообщения о перемещениях мыши - другое. У меня тоже отрисовывается экран на форме, но сообщение от мыши без проблем поступают.
-
? Дмитрий - 29.08.2020 02:56
>> Проблема в рассинхронизации из-за своей отрисовки формы (фрейма) окна БК.
А какая там рассинхронизация? Отрисовка формы это одно, а посылка сообщения о перемещениях мыши - другое. У меня тоже отрисовывается экран на форме, но сообщение от мыши без проблем поступают.
-
? Дмитрий Николаевич - 29.08.2020 04:26
> У меня тоже отрисовывается экран на форме, но сообщение от мыши без проблем поступают.
Поделитесь своей реализацией? Файлы Screen, BKView и какие-то ещё в архив закиньте и сюда. Если не жалко конечно :)
-
? Дмитрий - 29.08.2020 13:55
Я не Сишник, поэтому моя реализация никак не адаптируется. В Delphi все уже сделано до нас, все сообщения ловятся, кодеру надо лишь вставить в обработчик свой код.
-
? Дмитрий - 29.08.2020 14:06
Навскидку, можно пойти другим путем. При чтении 177714 (если мышь разрешена в настройках) считать координаты курсора мыши GetCursorPos, преобразовать в координаты формы ScreenToClient, проверить, находится ли курсор над отрисованным "экраном" PtInRect. Если да, то сравнить с предыдущими запомненными координатами, выставить биты смещения и запомнить новые координаты. Никаких доп. обработчиков не надо.
-
? Дмитрий Николаевич - 29.08.2020 22:44
>Навскидку, можно пойти другим путем
Мы видимо о разных вещах говорим. ну да не суть. Как-нибудь подытожим начатое. Надеюсь gid поможет мне ловить мышу как полоджено.
-
? Дмитрий - 29.08.2020 22:59
Почему о разных? Как вычислить смещение курсора особо не играет роли - важен результат. Учитывать нужно накладные расходы. Раз уж все взаимосвязано фреймами, то отвлекаться отдельно на отлов мыши мб нецелесообразным. Подобным образом я сделал таймер - в режиме fullspeed никаких фреймов нет, поэтому приходится вычислять значение счетчика при чтении регистра, а сам счетчик реализован на high precision таймере (QueryPerformanceCounter) - его не надо реализовывать, он не зависит от загруженности проца и пр. Просто пересчет тиков по частоте.
-
? Manwe - 31.08.2020 14:23
Заметил, что BKDE некорректно работает с дисками RT-11 (пробовал на дискетах от Союз-Неона): при попытке записать файл с таким же именем поверх имеющегося, на диске остаётся старый файл. То же происходит, если сперва удалить файл, а потом записать новый - всё равно почему-то старое содержимое на диске.
-
? gid - 01.09.2020 08:48
[Заметил, что BKDE некорректно работает с дисками RT-11]
В текущей версии v2.1.2005.633 я такого не заметил. Всё работает как надо.
-
? Manwe - 02.09.2020 15:35
Глюк с выезжающим окном клавиатуры: https://imageup.ru/img141/3648729/gid-emul-keyboard-window-bug.png
Воспроизводится у меня на двух компьютерах - Windows 7 64-bit и Windows 10 32-bit.
-
? KUVO - 03.09.2020 15:59
Можно ли в BKDE, в окне выбора BIN-файла для добавления в образ, при двойном щелчке по файлу осуществлять выбор, а не запускать эмулятор, как приложение, назначенное на расширение .bin ?
-
? gid - 03.09.2020 20:19
Если научите как, то будет можно. Я в том микрософтовском элементе управления тупо не нашёл, как перехватить событие двойного клика ЛКМ. Поэтому там выполняется действие по умолчанию проводника Виндовс - а именно запуск файла на исполнение.
-
? Adam Bazaroff / Excess team@ - 05.09.2020 10:05
@gid, очень прошу реализовать переназначение джойстика на другие клавиши, для тех, у кого нет намлок-клавиатуры.
-
? gid - 07.09.2020 08:37
Понапокупали новомодных устройств с обгрызанной функциональностью, а теперь мучаетесь.
В простом ноутбуке Aser с 15" экраном и то есть полноценная намлок-клавиатура.
В общем, есть у меня идея, как бы можно было бы сделать переназначение клавиш джойстика на любые пользовательские, надо попробовать сделать, только времени пока недостаточно, чтоб заняться этим.
-
? Maxvel - 07.09.2020 12:26
Это еще фигня, У меня на ноуте вообще нет клавиши scrool lok - так что эта проблема не только огрызков но и полноценных клавиатур на ноутах.
-
? Maxvel - 07.09.2020 12:27
Это еще фигня, У меня на ноуте вообще нет клавиши scrool lok - так что эта проблема не только огрызков но и полноценных клавиатур на ноутах.
-
? stasmas - 09.09.2020 23:38
Manwe пишет:
>Заметил, что BKDE некорректно работает с дисками RT-11 (пробовал на дискетах от Союз-Неона): при попытке записать файл с таким же именем поверх >имеющегося, на диске остаётся старый файл. То же происходит, если сперва удалить файл, а потом записать новый - всё равно почему-то старое >содержимое на диске.
¤
Абсолютно такое же поведение наблюдаю на linux при запуске BKDE из-под wine. На винде не запускал, т.к. не пользуюсь.
-
? gid - 10.09.2020 06:21
Выб хоть версию проги называли, может устаревшей до сих пор пользуетесь.
В текущей версии v2.1.2005.633 я такого не заметил. Всё работает как надо.
-
? Manwe - 19.09.2020 21:41
> Выб хоть версию проги называли
от 26-го мая 2020-го года, размер файла BKDE.exe 4'084'224 байт
¤
А ещё такой вопрос: устанавливаю разные режимы СМК (60,140,100) - эмулятор правильно пишет номера режимов. А когда устанавливаю Hlt11 (20000) - эмулятор пишет 0. Как должно быть?
-
? gid - 20.09.2020 15:56
[от 26-го мая 2020-го года, размер файла BKDE.exe 4'084'224 байт]
Ладно. Если так, то уточню работу с атрибутами записи файла в каталоге. Щас атрибуты выставляются по "или" и видимо нельзя одновременно быть установленным атрибутам PERMANENT и UNUSED. О приоритетности атрибутов в записи файла в RT-11 я нигде ничего не нашёл, поэтому всё делается методом тыка и экспериментов.
¤
[А когда устанавливаю Hlt11 (20000) - эмулятор пишет 0. Как должно быть?]
код режима работы СМК - это три бита: 6-й, 5-й и 4-й, в три бита помещается число 0..7,
код режима Hlt11 - на самом деле 0, а 20000 пишут для человеков, чтобы они не путали код режима Hlt11 со сбросом флагов дисковода или ещё с чем-нибудь, и вообще не знаю, что там в голову пришло разработчикам, и почему они выбрали 20000, а не 40000 или 10000.
В эмуляторе код режима работы СМК хранится в 8-битной переменной, а делать какое-то исключение, чтобы 0 подменялся на 20000 не вижу никакого смысла.
-
? BD - 01.10.2020 15:31
Уважамый gid! Исходки fis/eis для MBR СМК не сохранились? Это важно для написания новых демок ;)
-
? gid - 01.10.2020 19:34
Если нужен именно тот самый драйвер, который устанавливается сервисными прогами АльтПро, то в этом архиве http://gid.pdp-11.ru/src/altpro_service_src.zip есть Исходники сервисных утилит для контроллера АльтПро СМК для работы с жёстким диском, в том числе setmbr - дизассемблированный исходник программы для установки/удаления резидентных модулей в MBR жёсткого диска в формате АльтПро, в нём исходники fis/eis как они есть.
-
? KUVO - 09.10.2020 18:48
Доброго дня и спасибо за поддержку продукта. Возник вопрос. Возможно ли сделать настройку «разнесение каналов AY в пространстве». Ну скажем три бегунка, которые позволят сдвинуть воспроизведение звуков в трёх каналах относительно центра? Как пример, так реализовано в настройках ВортексТрекера. Просто слишком далеко в стороны воспроизводятся звук. И при использовании эхо в соседнем канале, воспринимается как отдельный канал, а не эхо. Витиевато объясню, но иной раз хочется канал сдвинуть чуть ближе к центру.
-
? KUVO - 09.10.2020 18:50
И второй вопрос. Я заметил, что интерфейс эмулятора сохраняет какие-то Настройки в реестр. Как мне быть, если я, скажем хочу свои Настройки интерфейса передать на другое устройство? Выгружать данные ресстра или есть другое решение?
-
? gid - 09.10.2020 21:30
[Возможно ли сделать настройку «разнесение каналов AY в пространстве»]
Возможно. Но для этого придётся сделать ещё одно диалоговое окошко, коих что-то начало плодиться сверх меры.
¤
[Я заметил, что интерфейс эмулятора сохраняет какие-то Настройки в реестр.]
да, это какое-то стандартное поведение стандартного приложения виндовс с пользовательским интерфейсом, реализуемым посредством MFC.
Перехватывать обработчики этого функционала и обрабатывать по-своему я счёл слишком сложным и непонятным. Тем более, что примеров в интернете не нашёл.
Эта падла хранит в реестре вообще всё, даже размещение тулбаров, и читает их оттуда, а не из программы, так что, когда я что-то меняю в них, приходится извращаться и удалять определённые ветки реестра, я для этого даже специальную функцию, проверяльщик создал.
А то новые кнопки или не появляются вообще, или иконки сбиваются.
¤
[Как мне быть, если я, скажем хочу свои Настройки интерфейса передать на другое устройство?]
Пока кто-нибудь не подскажет, как делать по-другому и правильно, то да, только экспорт ветки реестра и импорт её в другом месте вручную. Хотя и этот процесс можно автоматизировать, нужно только научиться экспортировать данные из реестра в файл и импортировать их обратно. Причём, чтобы это было именно то, что нужно, а не что попало постороннее вредоносное.
-
? Дмитрий - 16.10.2020 14:15
gid, вопрос: что-то не могу найти в стандартах - разве при выборе устройства в регистре DrvHeadReg (1F6) не должны выставляться биты готовности или занятости накопителя + биты в регистре статуса, если накопитель отсутствует? Я что-то не могу найти внятного ответа на вопрос - как детектируются винты через порты контроллера? В одном месте посылают команду диагностики, в другом - soft reset.
-
? gid - 16.10.2020 18:13
там же не просто надо бит в регистре 1F6 устанавливать, там ещё и команду подавать надо, код команды - самое главное, а содержимое регистра 1F6 - это входной параметр. И надо смотреть описание для команды - что она принимает и что возвращает в регистрах.
Вот кому-то нравится команда EXECUTE DRIVE DIAGNOSTIC, он её использует.
А кому-то SOFT RESET, судя по описанию, SOFT RESET в процессе всё равно делает EXECUTE DRIVE DIAGNOSTIC кроме каких-то своих действий (обнуление регистров и ещё что-то).
И у этих команд в результате будет свой специальный код ошибки, который возвращается в регистре 1F1. Там не по битам статуса определяются.
-
? KUVO - 20.10.2020 20:57
Уважамый gid! Спасибо за возможность оперировать каналами AY. Удалось протестировать пробную версию ВК с данной функцией. Все замечательно. Теперь можно "женить" каналы и менять их местами.
-
? Дмитрий Николаевич - 28.10.2020 11:46
* тест
-
? Maxvek - 28.10.2020 17:24
Пройдем!
-
? grf - 09.11.2020 08:39
Уважаемый gid! Возможен ли вариант эмулятора с англоязычным интерфейсом? А еще лучше, такой вариант эмулятора, который бы просто запускался с указанным образом диска и ничего не показывал, кроме экрана и виртуальной клавиатуры?
-
? Maxvel - 09.11.2020 10:30
А чем Русский не устраивает?
И зачем такие глупые вопросы?
-
? grf - 09.11.2020 10:31
Меня русский утраивает, иностранцев не устраивает. Так что по поводу глупости вопросов рекомендую глянуть в зеркало)
-
? Maxvel - 09.11.2020 10:39
Так это их проблемы а не наши. пусть учат Русский язык.
Что то те же лимонники не делают русскоязычного интерфейса для эмуля спеки?
-
? Шестипалов - 09.11.2020 11:13
Добрый день, gid.
.
Для БК0010-10 существует музыкальная приставка Менестрель. Хотелось бы, чтобы она присутствовала в твоём эмуляторе. Есть ли возможность её эмулировать, и что для этого надо? В телеграм-канале https://t.me/bk0010_11m по приставке кое-какая информация есть.
-
? gid - 09.11.2020 13:30
[Возможен ли вариант эмулятора с англоязычным интерфейсом?]
Теоретически возможен. Если кто-нибудь захочет приложить к этому усилия.
Я думал однажды над локализацией на другие языки, а потом ещё раз подумал, и передумал. Пусть этим займётся тот, кому нужнее.
¤
[А еще лучше, такой вариант эмулятора, который бы просто запускался с указанным образом диска и ничего не показывал, кроме экрана и виртуальной клавиатуры?]
Вид пользовательского интерфейса настраивается самим пользователем. Если он захочет, то сам сможет отключить ненужные элементы, и расположить нужные в том виде, как ему захочется.
А вот чтоб запускался с указанным образом, можно попробовать сделать, там как раз функционал обработчика параметров командной строки нужно переделать, вот и стимул будет.
¤
[Есть ли возможность её эмулировать, и что для этого надо?]
Есть ли возможность, не известно, потому что нет в публичном доступе ни схемы её, ни технического описания, ни вообще никакой документации, даже руководства пользователя нету.
Будет или схема, или достаточно подробное ТО, из которого будет понятно, как оно устроено, тогда и можно будет рассуждать, есть ли возможность её эмулировать или нет.
-
? Shestipalov - 09.11.2020 13:49
[Есть ли возможность, не известно, потому что нет в публичном доступе ни схемы её, ни технического описания, ни вообще никакой документации, даже руководства пользователя нету.]
.
Схема есть, руководство пользователя есть: https://dropmefiles.com/vBCuT
-
? gid - 09.11.2020 14:51
А вроде же была информация, что менестрель подключается к разъёму МПИ, и в нём было своё ПЗУ. Или это какой-то другой менестрель?
-
? Shestipalov - 09.11.2020 15:27
Нет, Менестрель подключается к УП. К Менестрелю прилагается микросхема ПЗУ, которая может быть установлена в отсеке пользователя. Там записан простейший музыкальный редактор Sinty (дамп есть на образе диска Altpro_Reload.img).
-
? gid - 09.11.2020 19:33
Если сумею сэмулировать 8253, то будет менестрель, если не сумею - то не будет.
Пока что нашёл единственный пример эмуляции в MAME. А оно сложновато для восприятия.
-
? svinka - 09.11.2020 20:53
еще пример https://github.com/simh/simh/tree/master/Intel-Systems/common
-
? Shestipalov - 20.11.2020 13:21
Добрый день. Нашёл опечатку в документации по эмулятору. в таблицах с картой памяти указано, что монитор занимает адреса 100000-177777 https://pastenow.ru/b4c908553d9e95a0bcc226a7ac037e1f
.
Если не ошибаюсь, верхняя граница должна быть 117777.
-
? gid - 20.11.2020 13:56
Спасибо. Удивительно, что хоть кто-то читает документацию.
-
? Shestipalov - 20.11.2020 15:41
«Это был тест на умение читать документацию» © )))
-
? gid - 26.11.2020 14:46
Итак, черновой набросок менестреля готов. По крайней мере, пример: "Запустим 440Гц в 0 счетчике обоих каналов." что-то гудит.
Теперь нужно программу, которая бы что-то играла или использовала какие-то особые возможности менестреля, и аудиофайл того, что при этом звучит из реального менестреля. Для отладки.
Можно даже какую-нибудь мелодию, набранную в редакторе Синти.
И пока не придумал как из порта УП прерывания по вектору 100 делать. В эмуляторе такого функционала нет в принципе.
-
? grf - 28.11.2020 07:04
Перещел на win10pro с 8.1 Заметил странную вещь - если запущен эмулятор и комп гасит монитор (если долго стоит без касания клавы), то звуковуха наичнает яростно скрипеть, трещать. Если коснуться клавиатуры - экран зажигается и звук исчезает. Без запущенного эмулятора винда гасит мониторы беззвучно...
-
? Шестипалов - 28.11.2020 18:47
>Можно даже какую-нибудь мелодию, набранную в редакторе Синти.
.
https://yadi.sk/d/T_gJluVGLaToRQ Ссылка на архив, там аудиофайл воспроизведения всех нот из октав 0-11 на реальном метестреле, плюс образ диска с нотным файлом для Синти, который это дело играет, для сравнения на эмуляторе.
-
? gid - 01.12.2020 15:08
Если заставить звучать один счётчик а канале, ещё хоть что-то более-менее получается, хотя и на самых высоких частотах начинается какая-то непонятная хрень. А вот микс из двух/трёх счётчиков - получается жопа. Что-то плохо получается приспособить эмуляцию из МАМЕ.
Так что пока ничем порадовать не получится. И идей, что делать и как это исправить, пока нет.
-
? Shestipalov - 03.12.2020 11:10
Печально. Остаётся надеяться, что идеи для исправления появятся :-)
-
? gid - 03.12.2020 12:58
Shestipalov, кстати вопрос такой, на этом аудиофайле звучат все счётчики всех каналов одновременно или по одному на каждом?
Просто у меня сейчас счётчики одного канала работают со сдвигом в 1184 такта относительно друг друга, из-за чего звук получается совсем не такой, как должен был. И микширование пока просто сложением амплитуд, из-за чего вместо нормального меандра получаются пирамидки.
Я не знаю, это нормальное поведение i8253 или это такая косячная эмуляция. Нужна двух и трёхголосная мелодия, чтоб было к чему стремиться.
-
? Shestipalov - 03.12.2020 16:07
>на этом аудиофайле звучат все счётчики всех каналов одновременно или по одному на каждом?
.
В терминологии Sinty там один звучит один голос, первый. «Все счётчики всех каналов» — не очень понятно, что такое. Я думал, что один канал и счетчик — это один голос. Видимо, я ошибался.
.
>Нужна двух и трёхголосная мелодия, чтоб было к чему стремиться.
.
В ближайшее время постараюсь сделать.
-
? Shestipalov - 03.12.2020 16:23
Мне пояснили насчёт каналов и счётчиков. Получается, в присланном файле звучит один счётчик в одном, левом канале.
-
? Shestipalov - 03.12.2020 17:14
А стоп. Наврал. Похоже, в присланном файле Синти воспроизводил одни и те же ноты во всех голосах всех каналов, так как на запрос «1-й голос с адреса ...», «2-й голос с адреса ...» указывался один и тот же адрес. Т.е. да, все счётчики всех каналов звучали.
.
Дело в том, что у меня нет реального Менестреля, я набираю нотный текст в эмуляторе. В руководстве сказано, что при воспроизведении можно отключить один канал или больше каналов, но, если я так сделаю — воспроизведение отключается полностью. Скорее всего этого глюк эмуляции. Поэтому приходится пускать одну и ту же мелодию во все каналы.
-
? gid - 03.12.2020 20:00
Я руководствуюсь такой терминологией - в микросхеме i8253 три счётчика, в менестреле две таких микросхемы - по одной на стерео каналы.
Ну там получается по три счётчика на канал, т.е. счётчики 1,3,5 (голоса в терминологии разработчиков менестреля) - правый канал, 2,4,6 - левый.
Я тоже тестирую эмуляцию в эмуляторе, и это синти работает так - оно каждый счётчик программирует последовательно. т.е. значения счётчиков заносятся последовательно в счётчики 1..6. При этом БКшка медленная, пока она задаст значение второму счётчику, первый уже успевает сколько-то отчитать, пока задаст третий - первый и второй опять уже отсчитают сколько-то и т.д., поэтому генерация меандров всеми счётчиками одного канала получается со сдвигом относительно друг-друга. Причём довольно большим, больше чем частота нот 7й октавы. В результате многоголосие у меня не работает как надо.
Вот мне и хотелось услышать звучание реального менестреля. И если там не так, нужно разбираться, что я делаю не так.
-
? gid - 04.12.2020 08:01
>>? grf@ - 28.11.2020 07:04
[Заметил странную вещь - если запущен эмулятор и комп гасит монитор (если долго стоит без касания клавы), то звуковуха наичнает яростно скрипеть, трещать.]
Это неизлечимая фича. Скрип, треск, и скрежет появляется когда ФПС падает до значения примерно 20 и меньше. А фпс в этом случае может падать, когда диспетчер процессов винды решает, что эмулятору надо бы отдавать поменьше ресурсов и времени, т.к. он становится фоновым приложением.
А эмулятор такого к себе отношения не понимает, он всегда и постоянно работает и жрёт процессорные ресурсы. И в звуковуху постоянно выводит звук, даже когда ничего не звучит, он выводит тишину, т.к. по звуковым буферам синхронизируется с реальным временем. И вот когда между выводами звуковых буферов появляются паузы и разрывы - получается треск.
-
? Shestipalov - 04.12.2020 08:21
Сергей, скажи, какие файлы лучше сделать? Допустим,
1 файл: последовательность нот CDEFGAB пускаем только в счётчик 1 (одноголосая мелодия)
2 файл: последовательность нот CDEFGAB в счётчики 1,3,5 (трёхголосая мелодия, только правый канал)
3 файл: последовательность нот CDEFGAB в счётчики 1,2 (двухголосая мелодия, стерео)
.
Норм будет?
-
? grf - 04.12.2020 08:57
лучше не одинаковые ноты в голосах делать, а трезвучие, чтобы заценить реальный аккорд, а не унисон, который ничего не даст понять
-
? gid - 04.12.2020 09:30
Будет норм, только стерео не нужно. Нужны файлы с одним, двумя и тремя голосами в одном канале, любом, левом или правом - не важно.
Причём нужны как звучащие в унисон, это чтобы посмотреть, меандры генерируются со сдвигом или нет, и звучащие аккордом, допустим в каждом счётчике CDEFGAB разной октавы.
И желательно было бы на реальном железе смотреть осциллограмму в точке, где микшируются выходы счётчиков, где все 3 резистора соединяются. Или звук брать оттуда, чтобы конденсаторы фильтров обойти.
-
? Shestipalov - 04.12.2020 22:47
https://yadi.sk/d/CtaG5M0XrGEiiQ
.
1-3-5golosa_2000.wav — в трёх счетчиках правого канала звучит CDEFGAB 5-й октавы
1gol_2000_3gol_3000_5gol_4000.wav — в трёх счетчиках правого канала звучат CDEFGAB 5-й, 6-й и 7-й октав соответственно
1golos_2000.wav — в первом счетчике правого канала CDEFGAB 5-й октавы
.
двухголосые мелодии обещали сделать завтра :-)
.
в img также есть нотный файл Синти, который это играет.
-
? grf - 07.12.2020 13:05
[Это неизлечимая фича. Скрип, треск, и скрежет появляется когда ФПС падает до значения примерно 20 и меньше. А фпс в этом случае может падать, когда диспетчер процессов винды решает, что эмулятору надо бы отдавать поменьше ресурсов и времени, т.к. он становится фоновым приложением.]
¤
Но как-то же в фоне играют всякие виндовые плееры и ничего не трещит )
-
? gid - 07.12.2020 14:08
Я не знаю как. Знал бы - сделал бы.
-
? grf - 07.12.2020 20:24
Странная вещь в эмуляторе при попытке подключить какие-либо страницы СМК512 кроме нулевой и загрузить в них файл в режиме
Это работает:
mov #6,@#177130
mov #60,@#177130
mov #0,@#177130
И файл успешно грузится.
¤
А это нет:
mov #6,@#177130
mov #2060,@#177130
mov #0,@#177130
Здесь все виснет.
Но если этот кусок пройти пошагово в отладчике - все включается и файл читается.
¤
Что это??
-
? gid - 07.12.2020 21:53
Со всеми остальными четырнадцатью страницами то же самое? или только со страницей с кодом 2000?
Нужно больше кода, из того что приведено, совсем не ясно, какая БК, 10 или 11?, чем грузится файл? средствами БОС БК11, МКДОСом, Андосом и тп? Или своим собственным драйвером? И откуда? с дисковода или с HDD?
Страница с кодом 2000 используется драйвером альтпро для своих нужд.
-
? grf - 08.12.2020 04:33
Режим эмулятора - БК11М+СМК512
Гружу файлы с жесткого диска, читая напрямую сектора диска:
¤
работает:
mov #6,@#1777130
mov #60,@#177130
mov #0,@#177130
¤
mov #dd,r0
mov #10000,r1
mov #140000,r2
call read2
¤
Следом сразу идет:
mov #6,@#177130
mov #64,@#177130
mov #0,@#177130
¤
mov #dd+2,r0
mov #4565,r1
mov #140000,r2
call read2
¤
сюда уже не возвращается управление, все виснет
¤
Собственно чтение:
READ2: mov #rwork2,r3 ;раб. область
call @#160004
bcs 0err
ret
0err: jmp @#140000
RWORK2: .+200
-
? grf - 08.12.2020 04:34
Проверил, виснет на всех кодах страницы, кроме нулевой. Эмулятор правильно распознает режим и код страницы, но нифига не грузится.
-
? grf - 08.12.2020 09:04
Похоже, дело в том, что сегмент 7 новой страницы включается с адреса 177000 и это глобально сказывается на чтении данных с винта
-
? gid - 08.12.2020 10:24
Ну да, все параметры HDD, которые хранятся в сегменте 7 нулевой страницы становятся недоступны и всё идёт наперекосяк.
В коде прошивки есть такое:
; перед собственно началом операции с HDD
CALL CRC ; проверяется целостность таблицы разделов в сегменте 7
SUB -(R1),R2
BEQ L11 ; и если КС совпала - целостность не нарушена, идём далее читать/писать.
; а иначе - заново делается попытка чтения таблицы разделов (8-го сектора МБР) в 7й сегмент - тут портятся данные пользователя, которые он неосмотрительно поместил в этот сегмент.
CALL PARTRD ;чт.табл.разд.и CNF
MOVB #13,ERRNUM(R3) ; а потом делается выход из п/п 160004 с ошибкой 13.
EX11: BR EX1
¤
А в п/п READ2 при любой ошибке делается переход по адресу 140000, а в данный момент там находится не ПЗУ БК11 а страница СМК, в результате - зависон или неопределённое поведение.
А надо проверять номер ошибки, и если 13 - то повторить чтение, и если снова ошибка, на этот раз любая, то выход.
¤
А вообще - как показала практика, разработчики контроллера даже не предполагали, что кому-то придёт в голову читать данные с винчестера напрямую в память СМК. Предполагалось всегда читать в ОЗУ БК и потом перемещать в ОЗУ СМК.
¤
И поправка: страница с кодом 2000 используется не драйвером альтпро, а альтбиосом для своих нужд. Но самим альтбиосом никто не пользуется.
¤
По-быстрому набросал проверочную прогу из вышеприведённого кода, и она у меня не работает ни в пошаговом режиме, ни в непошаговом. Так что всё нормально.
-
? grf - 08.12.2020 12:01
В пошаговом иногда срабатывало, иногда нет. Полное ощущение глюкодрома было :) Да, код ошибки я еще вчера выловил, именно 13. Причем в списке ошибок ее нет.
Будем пересылать, что делать теперь. Главное, что прояснилось в чем проблема, а то все эти фразы "работает, но не всегда" как-то мне не нравятся :)
-
? Дмитрий Николаевич - 22.12.2020 16:13
Предлагаю обсуждение поддержки эмулятором 2AY перенести сюда.
Идея примерно такая: взять за основу схему и формат регистров с ZX TurboSound https://velesoft.speccy.cz/turbosound-cz.htm вариантов коих тьма.
¤
Для начала выбран был вариант nedopc, ну да не суть, вот ссылки:
:: Музыкальное расширение Turbo Sound! (2AY) http://www.nedopc.com/TURBOSOUND/ts.php
либо сразу
:: Музыкальное расширение Turbo Sound FM! (2AY+FM генерация 6 каналов) http://www.nedopc.com/TURBOSOUND/ts-fm.php
¤
На данный момент автора эмулятора интересует какой формат регистров использовать, ведь в железе на БК ещё не делали поддержки 2AY.
Обсуждаем.
-
? gid - 23.12.2020 12:47
Да всем насрать. Предлагаю то, что предложил уже. Это:
1) обратно совместимый метод, так же просто работать с точки зрения программирования.
2) легко реализуемый в железе.
-
? Дмитрий Николаевич - 24.12.2020 02:09
> Да всем насрать.
Видимо да. В телегочате однажды разродились на полный аналог с ZX (те-же 16 регистров для обоих AY). Но потом начали изобретать старший байт/младший байт для разных AY, что-то ещё было.
¤
Делай как тебе удобнее, в плеере на БК именно под твой вариант будет (Владимир Кутяков вроде бы согласен дописать pt3 модуль под два AY)
Только не забудь описать реализацию ))
-
? SAM@ - 24.12.2020 09:34
Не всем
мне не насрать.
Но я больше любитель, так что мало что в вашем диалоге понимаю
-
? lvd - 25.12.2020 00:44
Не очень в курсе, есть ли сейчас возможность установить номер регистра=0xFF. Если есть, то наверное можно напрямую turbosound воткнуть вместо аигрека и будут 2шт их.С т.з. софта видимо наилучший метод, это когда пишут байты в один и тот же адрес, а они аппаратно кладутся в последовательные регистры аигрека, от 0 до 13. Ведь плеер как раз каждый фрейм подряд их прописывает. Правда регистр огибающей не всегда прописывает (т.к. его пропись вызывает рестарт огибающей), но он и идёт последним.
-
? gid - 25.12.2020 09:54
turbosound просто так без переделки в БК не воткнуть. А раз всё равно переделывать, то уж сделать по-своему.
Вот, набросал примерную схему подключения двух Ay, как я себе это представляю.
https://yadi.sk/i/86PaZHXewI3Lig
За основу взята классическая схема подключения, опубликованная в журнале ПК БК №1,1995 и модифицированная Mdesk (если я ничего не путаю).
Правда не уверен в том, что будет работать, т.к. нужно собрать её и проверить идею. А у меня есть только один YM2149 и один клон AY-3-8910 от winbond в неизвестном состоянии исправности.
-
? Дмитрий Николаевич - 26.12.2020 13:52
@gid:
> 1) обратно совместимый метод, так же просто работать с точки зрения программирования.
Я правильно понимаю? Первые 16 регистров - первый/ОДИН AY, следующие 16 регистров - второй AY ?
¤
Экземпляр в железе требуется для полной уверенности что все это будет работать как должно? Тогда всё-равно нужен плеер мелодий на БК, который уже ждёт "формат переключения сопр-ов" или "формат массива регистров для AY". Замкнутый круг ))
-
? gid - 26.12.2020 16:38
Протестировать можно и без плеера. Просто программа, которая будет в писать данные в регистры, и смотреть осциллографом и слушать ушами, что происходит. На новогодние праздники, если найду детальки, соберу макетку и проверю, если второй AY окажется исправным.
Ну или если кто-нибудь другой проверит вперёд меня.
-
? Alexander "Sandro" Tishin - 27.12.2020 11:22
Несколько вопросов:
¤
1) Как программа должна распознавать наличие AY и их количество?
2) Почему опять 177714? Адресное пространство закончилось?
3) Кстати, может и Covox нормальный сделать на отдельном порту?
4) АЦП хотя бы 8-бит моно? (У AY есть два параллельных порта, кстати говоря)
5) Почему именно AY? Меандр наше всё?
...
z) На дворе уже 2020 год. Пять дней до 2021. Может, хоть нормальный цифровой синтезатор сделаем? Можно даже на радость ММ сделать исторически-реконструкторскую версию с логикой на 556РТ1 :P
-
? Adam Bazaroff - 27.12.2020 13:01
Насчет магнитофона в БОС-11, понятно. Жаль, что нельзя автоматизировать загрузку драг-н-дропом в 11м. В ситуациях, когда нужно проверять программу после каждой правки, это бы сильно ускорило процесс.
¤
Тогда еще. Можно как-то сделать (пусть опционально, экспериментально, под для угрозой жизни блаблабла), чтобы BKDE и эмулятор не ругались, что образ BKD открыт одним из них. Процесс переноса файла для проверки очень муторный. Отключаем бкд от эмуля, подгружаем бкд в BKED, заливаем новый файл, отключаем образ от BKED, подключаем образ в эмулятор.... аааааа.... Половину времени тратится на эту мутотень, а не на отладку программы. Понятно для чего сделана защита от записи. Но для тех, кто понимает опасность, можно как-то это убрать? Спасибо.
-
? gid - 27.12.2020 14:54
>>Alexander "Sandro" Tishin - 27.12.2020 11:22
1. никак, про это речи не было. Хотели ZX TurboSound, а в нём тоже количество и наличие AY не определяется программно.
2. классика. Как нацепили изначально на этот порт, так и живём.
3,4,5 и тд. SuperMax этим уже занялся и всё сделал https://zx-pk.ru/threads/32102-az-dlya-bk-0011m.html
Я же, как и положено нищеброду, делаю из говна и палок и из того, что найдётся под рукой. Сейчас нашлась схема подключения из ПК БК №1,1995 по которой я когда-то подключил YM2149 к БКшке и немного разных старинных микросхем.
¤
>>Adam Bazaroff - 27.12.2020 13:01
[Можно как-то сделать]
Наверное как-то можно. У меня с наскока не получилось, чтобы две программы открывали один и тот-же файл для записи. Ну я и забил на это. Т.е. есть такие флаги, которыми задаются параметры открытия файла. Но у меня почему-то поведение отличалось от того, что писалось в описании этих флагов.
А ещё я хотел добавить в выпадающее меню для приводов пункт, чтобы открывать текущий образ в BKDE. Но так и не придумал нормальный алгоритм, как там должно происходить отмонтирование образа, и как узнать, что BKDE закрылось и образ нужно примонтировать обратно, и должно ли это делаться асинхронно, или эмулятор на это время нужно приостанавливать.
А пока я не представляю алгоритма, я и запрограммировать ничего не могу.
-
? gid - 27.12.2020 14:59
[Жаль, что нельзя автоматизировать загрузку драг-н-дропом в 11м.]
Вообще-то можно. Нужно только поднапрячься и написать эмуляцию драйвера магнитофона. Просто она на порядок сложнее, чем 10ке. (В смысле соблюдения условий работы. А ещё там страницами манипулировать надо.) И у меня не хватает духа и моральных сил сделать это.
-
? Дмитрий - 29.12.2020 00:56
>> чтобы две программы открывали один и тот-же файл для записи
А что если в эмуляторе сделать экспортируемые функции R/W с образом? Тогда образ, открытый эмулятором, через них может писать и BKDE. А BKDE при запуске будет искать загруженный эмулятор и воспользуется его функциями, если не находит - открывает файл самостоятельно.
-
? Alexander "Sandro" Tishin@ - 31.12.2020 11:01
gid, не надо прибедняться ;) Все мы зачастую делаем, как проще, а не как лучше.
¤
1. А надо. "Распространённость нарушения не оправдывает нарушителя". Какой-то метод обнаружения должен быть. Кстати, это и к JoyVox относится тоже.
TurboSound -- мрак. Вот чего уж точно не стоит клонировать из-за специфической микросхемы FM синтезатора. Её вообще возможно сейчас купить?
¤
2. "Так всегда делали" -- тоже не аргумент. В 177714 всё пихали по историческим причинам и по лени. В релультате у гас там принтер, мышь, джойстик и Covox на одних и тех же битах, и всё конфликтует друг с другом. Этот бардак надо как-то разгрести. И уж точно усугублять его не надо. Можно было бы, например, дополнительно для AY и Covox выделить отдельный порт, ну а из старого адреса подсматривать для совместимости. Ну и раз уж навешивать железо, можно было бы сделать сепаратор команд для AY на 177714/15 порту.
¤
3-5. "SuperMax этим уже занялся и всё сделал" -- ??? Макс только НАЧАЛ делать. И меет смысл, пока ещё не поздно, написать нормальную спецификацию, а не хзчто.
¤
Так что надо бы нормально подойти к вопросу. Во избежание.
¤
PS: Пункта z у Макса нет вовсе. А надо бы, раз уж там доппамять.
-
? Alexander "Sandro" Tishin@ - 03.01.2021 11:20
Был неправ -- физическое железо у Макса есть! Даже на продажу предлагает ;)
¤
Но в любом случае, там ещё копать и копать.
-
? grf - 03.01.2021 11:42
>Был неправ -- физическое железо у Макса есть! Даже на продажу предлагает ;)
¤
Он все продал в первый же день :)
-
? grf - 17.01.2021 11:57
В конфигурации "БК11М+СМК512" восстановление сохраненного состояния происходит некорректно, часто после этого все виснет в самых разных местах. Видимо, только при использовании СМК512...
-
? gid - 17.01.2021 12:21
Думаю, что это из-за того, что не сохраняются регистры HDD.
Я обычно делал сохранение состояния, когда не было никакой дисковой активности.
Хотя, может быть и не из-за этого.
-
? grf - 17.01.2021 13:20
>Думаю, что это из-за того, что не сохраняются регистры HDD.
да нет, сохраняю когда никакой активности винта нет.
-
? grf - 19.01.2021 11:53
Виснет, похоже, при обращении к винту. Причем хитро. Сохранился, восстановился - при обращении к винту зависло. Тут же снова из этого файла восстановился - все работает. Восстановился еще раз - опять в том же месте виснет. Т.е. стабильно все нечетные восстановления виснут, четные - нет.
-
? gid - 19.01.2021 16:21
Нашёл ошибку. Там файл образа винчестера не освобождался эмулятором, когда нужно было. Поэтому заново открыться не мог. Но после, когда уже не нужно - освобождался. Поэтому ровно через раз и работало.
Добавил костылей, теперь прям от души пять раз освобождает файлы, и два раза, а при загрузке конфигурации аж три раза, запускается инициализация HDD и открытие файлов. И главное, хрен этот говнокод исправишь.
Скоро обновление выложу.
-
? grf - 19.01.2021 17:20
ура ))
-
? Shestipalov - 20.01.2021 12:58
Сергей, привет.
Я так понимаю — с эмуляцией Менестреля всё очень грустно? Или есть надежда?
-
? gid - 20.01.2021 14:26
Грустно. Он криво работает, и как эту ситуацию поправить, я вообще без понятия. Вскоре выложу обновление, и сами в этом убедитесь.
-
? gid - 21.01.2021 20:34
Обновление откладывается. Обнаружил ещё одну неприятную ошибку в загрузке сохранений. Если частота дискретизации звука в загружаемом сохранении отличается от текущей, начинаются эпические глюки. Раньше такой фигни не было, значит я когда-то недавно её внёс.
-
? grf - 26.01.2021 12:37
Ура, на новой версии сохранения работают как надо! Спасибочки! ))
-
? grf - 28.01.2021 11:35
Было бы шикарно иметь режим отладки "запись" )) Вот есть трудноповторимый глюк. Берем, включаем такую "запись". Эмулятор начинает писать как изменялись после каждой команды регистры и флаги. Добиваемся глюка, останавливаем. Потом пошагово смотрим, что же произошло ))
-
? gid - 28.01.2021 20:14
Технически такая возможность есть.
Patron когда-то поделился потоковым дизассемблером, который пишет в лог все инструкции, выполняемые процессором, и прочие сопутствующие аргументы и атрибуты.
Подумаю над тем, как его прикрутить, и когда-нибудь сделаю. Но не скоро.
-
? grf - 29.01.2021 09:32
Все инструкции необязательно, достаточно в начале сделать образ памяти "с чего начали", потом записывать состояние R0-R7 и PSW, а потом "воспроизводить" пошагово как двигался PC и что было в регистрах, показывая в том же окне отладчика дизасм с текущего адреса.
-
? gid - 29.01.2021 09:57
А вот это невозможно, т.е. я вообще не представляю, как это делать.
-
? grf - 29.01.2021 10:04
>А вот это невозможно, т.е. я вообще не представляю, как это делать.
Сейчас же состояние регистров выводится на экран при пошаговой отладке, почему же их невозможно брать и сохранять? )
-
? gid - 29.01.2021 12:26
Оно выводится, но нигде не сохраняется.
А тут придётся сперва сохранить массив памяти, потом сохранять набор "шагов" (выполнение одной команды) и содержимое регистров, так сказать снапшот состояния после каждой команды, придумать формат всей этой сложносоставной структуры, а потом ещё придумать плеер всего этого, и как-то умудриться состыковать это с функционалом эмулятора, избегая взаимоисключающих требований.
Я вот так вижу это. Слишком сложная задача для меня.
Лучше я сделаю простой дизасемблерный текстовый лог выполняемых команд. Я уже делал это в своём потактовом эмуляторе 1801ВМ1 на основе верилога.
Количество строчек в нём получается многие тысячи, вес - мегабайты. И найти там что-то сложно, но можно.
-
? Alexander "Sandro" Tishin@ - 30.01.2021 19:31
Когда я отлаживал начальную версию эмулятора, то так и сделал. Текстовый мегадамп с полным отчётом на каждую команду. В принципе, код где-то там ещё жив, и его даже можно активировать.
¤
Кстати, совсем не нужно сравнивать снимки до и после исполнения команды. Достаточно всего лишь протоколировать изменения наблюдаемого состояния машины. То есть записи в память, в регистры (включая PSW), результаты чтения памяти/устройств, ход времени, прерывания.
И это в общем-то всё, в БК даже ПДП нету.
-
? Шестипалов - 14.02.2021 13:27
Сергей, привет.
В BKTurbo8 при генерации lst-файлов некорректно отображаются отрицательные числа. Вот такая конструкция получается:
28 0126460 FLAG =126460
29
30 37777777777 SE$DEF =-1 ;DEFAULT SCREEN EFFECT
31 0000004 PN$DEF =4 ;DEFAULT PAGE
.
PS генерировалось в 64х-битной версии, если это имеет значение.
-
? gid - 14.02.2021 15:15
Это такое форматирование printf, оно требует аккуратности, это не зависит от платформы и влияет только на вывод на экран и в текст.
Но тем не менее, пофиксил методом костыляния, обновил отдельный архив BKturbo8. В состав эмулятора обновлённые версии добавлю при следующем обновлении эмулятора.
-
? grf - 17.02.2021 10:21
Перенес с одного компа на другой сохраненные состояния эмулятора. Загрузил - все ок, работает. Перезапускаю эмулятор - ничего не грузится вообще. Выяснилось, что почему-то перезаписался bk.ini параметрами с того компа, откуда взяты сохранения. А там другие пути к образам дисков. Это зачем так сделано? :)
-
? gid - 17.02.2021 12:49
Образ диска может быть где угодно, а не только в директории IMG рядом с эмулятором. Поэтому, если путь к образу не является путём по умолчанию, то в ини файле сохраняется полный путь к файлу образа. Затем так сделано. Чтобы не примонтировывать каждый раз одни и те же образы, если они находятся в другом месте.
Однако, если при попытке монтирования образа с данными, взятыми из ини, нужный образ не находится по заданному пути, то его запись в ини файле заменяется на <empty>. И всё продолжается, как будто ничего не было.
Т.е. так этот механизм задумывался и работал, и работает, если не сломался.
¤
А если загружаем какое-то сохранение состояния, то все параметры в ини файле перезаписываются параметрами из сохранения, в том числе и пути к образам. И что с ними происходит, если пути неправильные, см.выше.
Т.е. теоретически, по задумке, ини должен был очищаться от неверных путей, но если этого не происходит - то это моя недоработка.
¤
И вообще, надо будет в документации написать, что если хочется иметь переносимость сохранённых состояний, то все образы должны быть в директории по умолчанию.
-
? grf - 17.02.2021 13:05
Я полагал, что сохраняется состояние эмулируемого компа, а не эмулятора вместе со всеми его настройками.
-
? gid - 17.02.2021 13:18
Ну так состояние эмулируемого компа и состоит во многом из параметров, которые находятся в ини файле. В том числе - примонтированные в данный момент образы дисков. Хочешь, не хочешь, а приходится сохранять всё. Причём внутри сохранения состояния находится прямо цельный кусок ини файла, относящийся к текущей конфигурации.
-
? grf - 17.02.2021 13:58
Так не заменяется путь на empty, а заменился на путь, который у меня дома, с другими именами дисков, а потом ничего не нашлось и зависло при загрузке )
-
? gid - 17.02.2021 14:33
Зависло сразу при загрузке сохранения?
Значит будем исправлять.
-
? grf - 17.02.2021 15:39
нет, сам эмулятор не завис. Сохранение загрузилось и работало. Потом я перезапустил виртуальную БК и она осталась в мониторе 11
-
? gid - 17.02.2021 16:44
Ну так это и ожидаемое поведение. Так и должно быть. Исправлять нечего.
-
? grf - 18.02.2021 00:52
Прописав в конфиги несуществующие пути, эмулятор ломает нормальную работу при последующих запусках. По этим путям образов дисков он все равно не найдет, так нафига эе конфиги-то рабочие курочить?
-
? gid - 18.02.2021 08:16
[Прописав в конфиги несуществующие пути]
Почему этот несуществующие? На момент сохранения состояния они были существующие и всё было нормально. Состояние то сохранялось на одном компе, а загружалось на другом, где образов по заданным путям уже не было. Растяпство пользователя - это не проблема эмулятора.
¤
[эмулятор ломает нормальную работу при последующих запусках.]
Не ломает, а предлагает заново выбрать нужные образы, перемещённые в другое, по сравнению с прошлым разом место.
Эмулятор не в состоянии в оффлайне отслеживать манипуляции пользователя. Волшебство там не запрограммирвоано.
¤
[так нафига эе конфиги-то рабочие курочить?]
Какие же они рабочие?
Загрузив сохранение состояния, вы загрузили и конфиг состояния, и если там находятся неверные пути к образам, эмулятор в этом не виноват, он просто исправляет их на нейтральные значения, приводя тем самым конфиг к нейтральному состоянию.
Нейтральный конфиг считается корректным, и позволяет запустить конфигурацию, сохранённую в сохранении. При этом, если бы сразу после этого потребовался дисковый ввод/вывод, вы бы получили уже проблемы, зависящие от ваших программ - от сообщения о дисковой ошибке, до банального неопределённого поведения. Ибо диски-то не примонтировались.
Затем, при корректном закрытии приложения, текущий (тот, что получился при загрузке сохранения, и с удалёнными неверными путями) конфиг сохраняется в ини файл. Потому что, не сохранять конфиг глупо, нафига он тогда нужен вообще?
А между загруженным состоянием и просто обычным запуском эмулятора с определённой конфигурацией нет никакой разницы, по сути это одно и то же.
Никто ничего не курочит, это так функционирует механизм сохранения/загрузки состояний и корректировка неверных значений параметров ини файла.
-
? grf - 18.02.2021 09:26
[Загрузив сохранение состояния, вы загрузили и конфиг состояния, и если там находятся неверные пути к образам, эмулятор в этом не виноват, он просто исправляет их на нейтральные значения, приводя тем самым конфиг к нейтральному состоянию.]
¤
Эмулятор тогда мог бы мне сообщить "для этого образа памяти нужен диск по такому-то пути" и я бы его сразу понял
¤
[Потому что, не сохранять конфиг глупо, нафига он тогда нужен вообще?]
¤
Видимо, я привык к текстовым конфигам в линуксах, которые правит сам юзер, или они сохраняются при явной команде юзера "сохранить". А не просто так на ходу нерабочими путями заполнился и сиди гадай что случилось )
-
? gid - 18.02.2021 09:45
Заглянул сейчас в исходники. И что-то там как-то само собой работает, без моего контроля, хотя и примерно так, как я себе представляю логику работы.
Поправлю логику работы с путями к образам при загрузке/сохранении конфига. Чтоб ни шагу влево/вправо.
¤
А ещё я не очень хочу плодить надоедающие попап окошки с сообщениями типа "Ого, чё-то файлов по заданным путям не находится, чё вы там такое сделали?" или "Вы уже уходите, а конфиг сохранить забыли, вам оно вообще надо?" Ну в смысле более краткие и культурные, но по каждому незначительному поводу.
Предпочитаю делать ненавязчивые системы, которые по возможности втихую исправляют мелкие косяки пользователя и сообщают только о крупных, из-за которых программа вообще работать не сможет.
-
? Shestipalov - 18.02.2021 23:48
Сергей, привет.
.
Хотелось бы иметь возможность в BKDE вставлять файлы в образ через командную строку. Тогда можно будет скомпилированный в кроссассемблере файл вставлять в образ из _make.bat, не кликая мышкой. В эмуляторе останется только кнопку перечитывания каталога нажать. Очень удобно было бы.
-
? gid - 19.02.2021 08:14
Пробовал я когда-то давно добавить в BKDE управление через командную строку, ничего хорошего не получилось.
Надо писать отдельную консольную версию. А пока для этого вдохновения нету.
[В эмуляторе останется только кнопку перечитывания каталога нажать.]
Эмулятор не даст. Он захватывает образ и не даст никому туда ничего писать. Он даже его по чтению не даёт открывать, хотя и должен бы. Я думаю добавить в окно настроек отдельную опцию, которая бы переключала монопольное/общее открытие файлов образов.
-
? Shestipalov - 19.02.2021 11:32
[Эмулятор не даст. Он захватывает образ и не даст никому туда ничего писать. ]
BKDE как-то ухитряется же перехватить запись в образ у эмулятора, почему другие не могут? Буквально на секунду )
-
? gid - 19.02.2021 12:25
BKDE ничего не ухитряется. Эмулятор ему милостиво разрешает. На время работы опции "Открыть в BKDE" эмулятор отмонтирует нужный образ и даёт BKDE поработать с ним, а потом обратно захватывает.
В остальное время, образ, открытый в эмуляторе, доступен всем остальным только по чтению. Таки доступен, как и положено, а когда-то значит был микрософтовский косяк, не дававший доступа даже по чтению.
-
? Alexander "Sandro" Tishin@ - 23.02.2021 22:18
А как это отмонтирует? Файл закрывает? Так этого не нужно. Достаточно передать HANDLE файла, и всё. Разрешение на запись выдаётся хэндлу, а не процессу, насколько я помню.
-
? Дмитрий - 24.02.2021 00:12
Файл по указанному пути открывается с правами, которые указываются при открытии - на основании этих данных возвращается хэндл. При передаче его функциям чтения/записи права не меняются - кто бы этимм хэндлом не пользовался. Можно повторно открыть открытый файл для чтения/записи, если при первом открытии указывалось, что файл могут читать или писать другие программы. Если таких прав не задано, повторное открытие вернет ошибку, т.е. файл открыт эксклюзивно.
-
? grf - 27.02.2021 19:22
У вас на сайте лежит "Дизассемблированный исходник программы Noise Generator для AY-3-8910.". А скомпилированный рабочий вариант есть где-то?
-
? gid - 27.02.2021 20:50
A BKTurbo8 компилирует нерабочий вариант?
-
? grf - 28.02.2021 05:08
[A BKTurbo8 компилирует нерабочий вариант?]
¤
Не знаю, я не пробовал. Посмотрел на гигантские длинные метки в исходниках и подумал, что на БК вроде не было компиляторов с такими метками.
-
? grf - 28.02.2021 08:40
Скомпилировал, спасибо за подсказку :)
-
? BD - 06.03.2021 01:45
.. а у Вас A16m работает как смк512..
https://i.ibb.co/kg4FWzK/p16m.png
-
? BD - 06.03.2021 02:32
/*
Тут вот какая ситуация.
для а16м карта памяти выглядит так
0000000 - 128кб - ОЗУ БК
0400000 - 80кб ПЗУ БК, в том числе и ПЗУ прошивки контроллера FDD, А16М или СМК
0640000 - 16кб ОЗУ А16М - интегрирован для упрощения алгоритмов в основную память БК
0700000 - конец
¤
для смк512 карта памяти выглядит так
0000000 - 128кб - ОЗУ БК
0400000 - 80кб ПЗУ БК, в том числе и ПЗУ прошивки контроллера FDD, А16М или СМК
0640000 - 512кб ОЗУ СМК
участок 0000000-0700000 сохраняется методом SetBlockBaseMemory11M
участок 0700000-02640000 - сохраняется методом SetBlockMemorySMK512, тут сохраняются не 512 кб, как можно
было ожидать, а 512кб - 16 кб
*/
-
? gid - 06.03.2021 12:09
Посмотрел скриншоты и ничего не понял. В чём проявляется работа A16m как смк512 ?
На мой взгляд, оба они работают именно так, как рассказывается в документациях к ним. Или я чего-то не вижу?
-
? BD - 06.03.2021 15:15
ПрЫнц работает исключительно на смк512, 16Кб ему мало )) Тем не менее в конфиге с А16м успешно грузится и работает. Автор тут, если что..
-
? grf - 24.03.2021 04:11
В конфигурации есть пункт включения второго муз.процессора AY, но что-то ничего не включается и он станется недоступным (серым). В описании изменений поиск по "AY" ничего такого не дал. Это работает или нет?
-
? gid - 24.03.2021 06:36
Нет, эту фигню не я придумал, а те люди, которые давно хотят эмуляцию двухAYшного модуля.
Но кроме этой заготовки в окне настроек больше ничего нет. И не будет достаточно долго. Т.к. они не могут, а я всё времени никак не найду. У меня с нового года так и лежит недопаяная макетка.
-
? grf - 24.03.2021 07:33
Жаль, хотел встроить в принца поддержку 2х AY )
-
? Shestipalov - 15.04.2021 11:51
Сергей, привет.
У тебя на сайте выложен модифицированный DESS Михаила Королёва. Я внёс в исходники ещё несколько исправлений, может, выложишь исправленный вариант у себя на сайте?
.
Исправлено следующее:
1. Исправлен экран помощи. На первом экране было слишком много строк, поэтому происходил скролл на 1 строку, после чего экран DESSa отрисовывался с ошибками — например, сдвиг мнемоники текущей команды вверх.
2. Перенёс блок параметров драйвера дисковода для не-Андос систем на с адреса 400 на адрес 500. Теперь в DESSe работает командная строка в МКДОС и ключи в АНДОС. Раньше блок параметров затирал ключи. Это переменная DRVTAB, строка 140.
3. Сделал вид дополнительной информации сразу после запуска в виде двух восьмеричных байтов вместо десятичного значения. ИМХО байты полезнее :-) Это Переменные INFFLG и INF, строки в исходнике 105 и 106.
.
Модифицированный исходник тут:
https://drive.google.com/file/d/1pDYLiBaakwNcv_zLSeajf6ZSPaofLV8P/view?usp=sharing
-
? gid - 15.04.2021 13:12
Выложил.
-
? KUVO@ - 16.04.2021 18:59
Вопрос уважаемому gid. Возможно ли в эмуляторе сделать переназначение горячих клавиш? Проблема в следующем, на ноутбуке нет клавиши ScrollLock и соответственно не могу перейти в полноэкранный режим, точнее перейти можно через меню, а вот вернуться в оконный нет. Насколько сложно реализовать подобное или, как вариант, реализовать другое сочетание клавиш для полноэкранного режима? Спасибо.
-
? gid - 16.04.2021 20:20
Возможно. Это можно делать даже и сейчас, но только до закрытия эмулятора. Для этого, жмём правой кнопкой мыши на меню или тулбарах, выбираем пункт "Настройка", переходим во вкладку "Клавиатура" и назначаем какие угодно свои комбинации горячих клавиш на всё, что там доступно.
На самом деле, все эти изменения сохраняются в реестре и по задумке должны быть доступны постоянно. Но я в эмулятор добавил функцию, которая перед запуском удаляет из реестра все настройки меню, тулбаров (а там можно и свои кнопочки на тулбары выводить и ненужные удалять) и горячих клавиш, и заменяет их дефолтными.
Потому что, как только я в эмуляторе добавляю новую кнопку на тулбар, новую опцию в меню или просто делаю рефакторинг элементов пользовательского интерфейса, в тулбарах начинаются эпические глюки и горячие клавиши путаются, начинают вызывать не то, на что назначены. Из-за того, что все эти настройки хранятся в реестре и перестали совпадать с новой реальностью.
Я не смог решить эту проблему, поэтому очищаю настройки из реестра всегда, а не тогда, когда надо.
¤
Я отключу очистку реестра, но тогда, изредка, при запуске новой версии, когда весь UI заглючит, надо будет заходить в эти настройки и во вкладках нажимать кнопки "Сбросить всё". Полагаю для этого они сделаны.
-
? Дмитрий Николаевич - 18.04.2021 22:19
Сергей, что-то ты SVN забыл обновлять.
Там пара мелких правок по просьбе программистов есть.
-
? gid - 19.04.2021 20:17
Добавил коммитов, но там совсем почти ничего, т.к. вообще мозг не работает. Не хочу пока напрягаться.
А чё за пара мелки правок? Я пока только увидел про второе окно дампа памяти. Правда мне бывает и двух окон мало, но я тупо вручную перемещаюсь каждый раз к нужному адресу, куда мне смотреть надо, делать дубль мне и в голову не приходило. Потому что это не так делается. Там надо делать слайс, или как оно там называется, - жмёшь кнопочку, или пункт контекстного меню, и окошко разделяется на два, а потом жмёшь ещё раз, и половинка делится ещё на два, и так делаешь нужное количество видов дампа, сколько высота экрана позволяет. Но для этого там полностью всё переписать нужно под эту технологию.
-
? grf - 08.05.2021 07:23
Возможно ли из БКшной программы определить, что она запущена под эмулятором? Можно сделать такую возможность, чтобы применять для работы в эмуляторе нужные задержки, если они отличаются от реально требуемых на железной бКшке? Регистр какой-нибудь уникальный добавить, содержащий определенное значение, к примеру )
-
? Дмитрий Николаевич - 08.05.2021 08:45
> Регистр какой-нибудь уникальный добавить
Как раз там есть пачка "никем не занятых пока" регистров, последние пару штук правда Тишин уже заприметил под палитры.
177540 - при старте там нули на реальной БК. Можно эмулятором любой рандом, вплоть до версии эмулятора туда пихать. Вот и будет флаг "шо мы на ББ, тайминги для поллитор юзаем иные".
-
? Дмитрий Николаевич - 08.05.2021 08:54
Упс. Проверил в эмуляторе, на всех конфигурациях КРОМЕ
БК11 + А16М
БК11М + А16М
(в которых по адресу 177540 валяется: 004767 000054)
лежат чистые, девственные нули.
-
? gid - 08.05.2021 09:02
[Возможно ли из БКшной программы определить, что она запущена под эмулятором?]
Возможно. Есть такие регистры, 177700-177704, у меня просто эмулируется их наличие, но не функционал.
На реальной БК если записать что-то в регистр 177702, то он пропадает, т.е. перестаёт быть доступен по чтению, и становится снова доступен после выполнения любой команды EMT. В эмуляторе он доступен по чтению всегда, что запишешь, то и прочитаешь. Т.к. я не вижу смысла эмулировать работу этих регистров, это будет гарантированный способ.
-
? grf - 10.05.2021 14:54
Да, при попытке чтения из регистра 177702 возникает прерывание по вектору 4. Спасибо!
-
? grf - 10.05.2021 17:23
Если запустить в эмуляторе тест СМК (Тест v4.75F) выводятся надписи:
¤
Режим 0020:
Регистр 177130 - блокируется.
Регистр 177132 - блокируется.
¤
Если я запускаю этот тест на своем БК11М новодел с СМК-512 с новой прошивкой, то в этих двух строчках мне тест выдает:
¤
Режим 0020:
Регистр 177130 - не блокируется!
Регистр 177132 - не блокируется!
¤
Это нормально или на свалку все?
-
? gid - 10.05.2021 19:45
Это означает, что CPLD-прошивка не v1.3, а старая, если есть Byte-blaster, можно скачать новую версию и перепрошить плис.
Мне пришлось взяться за модификацию прошивки как раз из-за этого бага, из-за чего не работал бейсик БК10, который 3 ПЗУ занимает.
А если бейсик не нужен, то ничего страшного.
-
? Manwe - 27.07.2021 14:44
Уважаемый gid, не могли бы Вы добавить возможность грабить видео покадрово по 100-му вектору? Этакий особый режим, когда эмулятор дожидается кадрового прерывания и тогда сохраняет кадр. Если при этом всё начнёт тормозить - ничего страшного. Подобный граббер есть на PC, называется kkapture - он заторможивает игру или демку, которую грабит, но зато получается идеально, ничего не мерцает, никаких "попаданий под луч" (полкадра старых, полкадра новых).
-
? gid - 30.07.2021 11:15
Это вопрос из прошлого?
Я ж уже давным-давно это сделал по просьбам некоторых товарищей. Они просили сделать возможность захвата видео через ffmpeg.
И оно так и работает. Как только кадр будет полностью сформирован, он передаётся ффмпегу, и он, уже из этих кадров, делает видео, причём, с постобработкой, если её в параметрах вписать.
Есть два минуса - 1) частота кадров сильно нестандартная получается, 2) ффмпег под виндовс не умеет грабить звук, поэтому создаётся два отдельных файла - видео и звуковой поток, и они рассинхронизированы.
Других способов грабления видео мне никто не предложил, самому мне это совсем не нужно.
-
? Manwe - 01.08.2021 15:10
Странно, у меня демка "Ray Dreams" грабилась неправильно (там переключение палитр каждый кадр по 100-му вектору). Попробую ещё раз на новой версии эмулятора.
-
? Manwe - 01.08.2021 18:06
Вот так получается при записи из эмулятора. Если же поставить брейкпоинт на переход по 100-му вектору, становится видно, что в момент кадрового прерывание изображение в одной палитре, а не две палитры одновременно на одном кадре.
https://imageup.ru/img153/3780625/raydreams1.jpg
https://imageup.ru/img278/3780626/raydreams2.jpg
-
? gid - 01.08.2021 21:56
У меня в коде так:
if (!(m_reg177662out & 040000)) // если бит 14 установлен, таймер не работает.
{
m_cpu.TickIRQ2();
if (m_pAY8910)
{
// для лога дампа регистров AY
m_pAY8910->log_timerTick();
}
}
¤
m_pParent->SendMessage(WM_SCR_DRAW);
¤
Сперва, если разрешено, делается прерывание по вектору 100, а затем - перерисовка очередного кадра экрана. В той же функции прорисовки, кадр, который на экран выводится, передаётся ффмпегу. Пока функция прорисовки не отработает, алгоритм дальше не продвигается, новый кадр формироваться не начинает.
¤
Я тоже получал точно такие же результаты как на скриншотах, правда в какой-то другой демке. Думал, что кадр не вовремя передаётся, или наоборот, пока экран перерисовывается, в буфере начал новый кадр формироваться. Фиг. Всё точно по алгоритму. То ли где-то рассинхрон из-за неточных таймингов, то ли прерывание по вектору 100 и прорисовку экрана надо делать в разное время. Но именно вот в таком варианте у меня полностью работают демки инсульта и TDR. Не работает только совмещение экранов методом их быстрого переключения. Так что пока забил на проблему. Всё равно не знаю как решить.
-
? Manwe - 01.08.2021 22:45
А что подразумевается под "делается прерывание по вектору 100"? Переход на указанный в 100-ой ячейке адрес? Если так, то это неправильно. Нужно перед переходом останавливать эмуляцию и передавать экранную память ffmpeg'у. И лишь потом продолжать эмуляцию с адреса, записанного в 100-м векторе.
¤
А ещё начиная с какой-то версии эмулятор перестал воспроизводить Good Apple. На реальном железе работает, а в эмуляторе зацикливается на инструкциях:
1: BIT #10,@#1777740
BNE 1
-
? gid - 02.08.2021 10:08
[А что подразумевается под "делается прерывание по вектору 100"?]
Подразумевается, что устанавливается запрос на прерывание, и в следующем вызове функции эмуляции команды, этот запрос будет обработан, и уже в следующем цикле - выполнение первой команды прерывания. Всё почти как по-настоящему.
¤
[Нужно перед переходом останавливать эмуляцию и передавать экранную память ffmpeg'у]
Т.е. нужно поменять команды местами. Нет такого понятия, остановка эмуляции. У меня так и не получилось распараллелить операции, поэтому всё выполняется последовательно. Пока прорисовывается экран, всё остальное ждёт (кроме пользовательского интерфейса).
¤
[эмулятор перестал воспроизводить Good Apple]
Интересно. Разберёмся.
-
? gid - 02.08.2021 16:08
Что-то нихера точки останова не срабатывают. Не могу понять, что за команда была перед тем, как начало проверяться
1: BIT #10,@#1777740
BNE 1
С какого хера бит DRQ вдруг не выставляется. По коду, он везде где нужно устанавливается.
-
? gid - 02.08.2021 20:35
Пока что выяснилось, что во время чтения секторов происходит выход за пределы геометрии диска, причём как я подозреваю, это из программы задаются параметры. Почему оно работало раньше, непонятно, но сейчас, когда код эмуляции HDD стар немного строже и точнее, вот такая фигня получается.
-
? Manwe - 03.08.2021 00:03
Код Good Apple определяет геометрию и по идее не должен за неё выходить. Считывает из паспорта HDD число головок, цилиндров и секторов.
-
? gid - 03.08.2021 08:28
Ну не знаю, у меня в VS срабатывает точка останова в обработке ошибки при операции чтения сектора. Делается попытка чтения с головки номер 4, а их всего 4: 0,1,2,3. Поэтому операция чтения сектора завершается ошибкой, бит DRQ соответственно не установлен, и поэтому всё застопоривается на его ожидании. А вот в самом коде Good Apple что-то не получилось эмуляторных точек останова понаставить так, чтобы они в нужное время сработали. Поэтому я не знаю, откуда берётся такой номер головки. Точно не из функции seek - продвижение к следующему сектору, там ассерты не сработали.
-
? Shestipalov - 12.09.2021 12:25
Сергей, приветствую.
Два замечания по поводу новой сборки эмулятора, от сентября 2021 г.
1. Окно с параметрами сохранения дампа памяти может быть размещено частично за правым краем экрана, если окно дампа памяти находится справа. Например: http://ipic.su/img/img7/fs/SaveDump.1631437957.png
2. Очень неудобно, что не сохраняется режим выбранный пользователем режим экрана БК в меню «Вид — Установить размер экрана». Ну например:
- разворачиваем окно эмулятора во весь экран (не Ctrl-Alt-ScrollLock, а кнопкой «Развернуть» в правом верхнем углу).
— Выбираем «Вид—Установить размер экрана—1024х768 (х2)»
— Окно эмулятора уменьшится. Теперь, если я его опять разверну во весь экран, режим «1024х768 (х2)» не сохранится, а переключится на «Свой». Т.е., в новой сборке, если разворачивать окно эмулятора во весь экран, режим экрана БК возможен только «Свой», что очень неудобно, т.к. в этом режиме БКшный экран отрисовывается с искажениями.
Хотелось бы, чтоб выбранный пользователем размер экрана БК сохранялся при любом изменении размеров экрана эмулятора или док-окон, в случае, если ему хватает места. В старой сборке было именно так — можно было распахнуть эмулятор во весь экран и менять размеры док-окон, режим экрана БК не переключался в «Свой» до тех пор, пока ему хватало места.
-
? Дмитрий Николаевич - 12.09.2021 16:05
1-ый пункт пофиксил, 2 коммита в СВН
-
? gid - 12.09.2021 17:38
Я пофиксил по-другому, поменял размеры и расположение контролов в окошках. Они теперь почти квадратные и никуда за окно дампа не вылазят.
По пункту 2 - что смог, сделал. При установке заданного из пресетов размера экрана, данный размер теперь сохраняется при увеличении окна эмулятора, но при уменьшении окна эмулятора, свой кастомный размер экрана теперь не сохраняется.
¤
Дмитрий Николаевич, смотри мой новый коммит.
-
? Дмитрий Николаевич - 12.09.2021 17:45
Угу, видел. Опять кодировку RC-файла поменял ? :)
Через час на работе поближе посмотрю правки, соберу твой билд Шестипалову для тестов
-
? gid - 12.09.2021 19:24
Не менял, она у меня как была по умолчанию в юникоде, так и остаётся. Я пробовал сделать её Windows-1251, но студии это не понравилось и она его конкретно попортила, так что я больше не экспериментирую.
-
? Alexander "Sandro" Tishin@ - 13.09.2021 09:59
А не надо в новом софте вообще применять что-то, кроме юникода. От реликтовых кодировок проблем больше, чем пользы.
¤
Ну, наши любимые эмулируемые машины -- это особый случай, разумеется. КОИ неизбежен, как Третья Мировая Война :D
-
? gid - 13.09.2021 11:56
Конечно не надо, но некоторым хочется. Вот SVN почему-то считает юникодные файлы битстримами и diff файл из них делать не хочет. Т.е. несколько лет назад так было, когда мне надо было с этим повозиться.
-
? gid - 13.09.2021 11:56
Конечно не надо, но некоторым хочется. Вот SVN почему-то считает юникодные файлы битстримами и diff файл из них делать не хочет. Т.е. несколько лет назад так было, когда мне надо было с этим повозиться.
-
? Alexander "Sandro" Tishin@ - 13.09.2021 20:23
Переходи на git. Он реально удобнее. И умнее.
-
? gid - 14.09.2021 08:17
А чё толку? Я всё равно пользоваться им не умею. В визуалстудии есть локальный гит, и я в него коммиты коммичу время от времени. И всё. Все умности до сих пор так и не пригодились.
-
? Alexander "Sandro" Tishin@ - 15.09.2021 06:59
А чего там уметь? Ты же не Линус Торвальдс, чтобы заводить пронкты с тысячей веток разного состояния готовности.
¤
А а так -- всё, что нужно:
¤
git init/clone/pull/push (создание и синхронизация репо)
git status (что у нас происходит вообще?)
git diff (чего это я тут намутил?)
git show (... и уже успел сохранить в репо?)
git add (добавляем файлы в очередной коммит)
git commit
git commit --amend (для случаев забывчивости ;))
git checkout/reset (важно знать разницу!)
¤
git tag (ну надо же оставлять отметки в истории)
¤
git stash save/pop/apply (очень полезная команда!)
¤
ну и ветки:
git branch
git checkout [branch]
git merge
git merge --rebase (для линеаризации истории)
git merge --onto (для хохмы ;) ну и для ленивцев)
git cherry-pick (фигурное перемещение коммитов)
¤
Собственно, это всё. Я больше почти ничем в git и не пользуюсь.
-
? Alexander "Sandro" Tishin@ - 15.09.2021 07:09
Хотя насчёт того, что не пользуюсь -- git внутри позволяет очень много всего. Включая восстановление скрытой истории. Напрмер сделал ты rebase, но не на то, или не так. Зная работу потрохов git, можно сделать обратно. Но для этого уже действительно надо хорошо понимать, как он работает.
-
? Дмитрий Николаевич - 15.09.2021 20:50
В SVN это делается жмаком мыши в пункт меню "Update to revision" и указанием нужной ревизии.
И уж точно нет ничего проще "SVN Update" и "SVN Commit". В последнем правда да, придётся пораскинуть мозгами и сочинить или не сочинить текстовое описание правок.
GIT слишком замудрён, ИМХО.
-
? Manwe - 18.09.2021 10:17
В меню Вид / Панели инструментов и закрепляемые окна есть все окна кроме главного – самого экрана БК. Дело в том, что можно случайно его закрыть. А как от крыть – непонятно. То есть эмулятор ломается раз и навсегда: как бы всё работает, но ничего не отображается, потому что окна нет.
-
? Alexander "Sandro" Tishin@ - 19.09.2021 08:26
ДН> В SVN это делается жмаком мыши в пункт меню "Update to revision" и указанием нужной ревизии.
¤
А вот и нет. В SVN это делается консольной командой svn update. Жмаканье мышкой -- это в графической оболоче. Которые для Git тоже есть, например Tortiose Git. И заодно интеграция во все современные IDE. Которой у SVN нет и скоро совсем не будет.
¤
ДН> И уж точно нет ничего проще "SVN Update" и "SVN Commit". В последнем правда да, придётся пораскинуть мозгами и сочинить или не сочинить текстовое описание правок.
¤
Самокат проще автомобиля. Предложи любому автовладельцу поменять автомобиль на самокат. предсказываю, узнаешь о себе много разного.
¤
ДН>GIT слишком замудрён, ИМХО.
¤
Нет, это SVN слишком убог. К примеру, как в нём поменять точку закрепления ветки? в Git это одна команда: git rebase. А как это сделать в SVN? Правильный ответ: НИКАК!!!
Лично я, когда мне после нескольких лет работы под Git пришлось что-то сделать в SVN -- исплевался весь. Какой же он корявый, неудобный, и лишён необходимейших вещей. Хоть того же rebase. Кстати, bisect в SVN завезли, или нет ещё?
¤
Ну и вообще, накто не мешает использовать git в SVN-образном режиме. Просто это как купить мультул и использовать его только для заточки карандашей. Опять же есть Mercurial, который попроще и с меньшим порогом перехода с SVN, базовые вещи работают так же. Но и в нём есть вся мощь DVCS, которой в SVN нет по определению, она же однопользовательская.
-
? gid - 19.09.2021 14:02
>>? Manwe - 18.09.2021 10:17
[Дело в том, что можно случайно его закрыть.]
Как вы умудрились это сделать? Я так и не нашёл способа закрыть экран.
У меня SDI приложение и экран - основной вид приложения. Его закрытие предполагает закрытие всей программы. И я по возможности блокировал весь функционал new/open/close document
-
? Shestipalov - 19.09.2021 21:56
>Как вы умудрились это сделать? Я так и не нашёл способа закрыть экран.
Окно экрана БК может быть закрыто, если произойдёт какая-нибудь ошибка, связанная с OpenGL или DX. У меня было так пару раз. Можно было открыть заново изменением Screen Render в настройках. Но штатного способа закрыть окно БК таки нет :-)
-
? grf - 30.09.2021 10:53
С джойстиком ничего не сдвинулось? А то пытаюсь переназначить поудобнее, так при нажатии Home (хоть и переназначенного на джойстик) все время вылезает окно с опциями эмулятора. Было бы замечательно иметь возможность вообще выкинуть с нумпада все эти переключения опций эмулятора. Тогда и в дампе можно было бы цифры вводить с доп.цифровой клавиатуры (для чего она, собственно и задумывалась) и джойстик задать там же нормально, без этого неубиваемого Home-окна с опциями.
-
? gid - 30.09.2021 12:37
А что с ним не так? Он с самого начала нормально работал, просто не было возможности переназначить под себя. Теперь есть.
А претензии с кнопкой Home к Дмитрий Николаевичу. Это он в своих сборках неподумавши назначает конфликтные горячие клавиши, которые ему удобны. У меня на num клавиши навешано опций только на цифры. Чтобы с клавишами по умолчанию для джойстика не конфликтовало.
¤
Выкинуть опции с нумпада можно так: в эмуляторе правой кнопкой мыши на любом месте меню, панелей инструментов или пустом месте, выделенном для них -> в контекстном меню самый нижний пункт "Настройка..." -> вкладка "Клавиатура" и там можно изменять сочетания клавиш как душе угодно. До выхода версии эмулятора, которая из-за внутренних структурных изменений сбрасывает все настройки в реестре.
¤
А так, я думаю, можно все эти горячие кнопки поудалять, я ими всё равно не пользуюсь, так и тыкаю мышкой в кнопки панели инструментов или в меню.
-
? grf - 01.10.2021 05:18
>Выкинуть опции с нумпада можно так: в эмуляторе правой кнопкой мыши
Отлично, спасибо! Наконец-то можно набирать цифры с цифровой клавиатуры в окошках дампа )
-
? grf - 01.10.2021 10:47
Рано радовался - в самом дампе клавиши работают, а вот в поле адреса дампа - нет ((
-
? gid - 01.10.2021 11:46
Ну вот и повод снести все акселераторы.
-
? KUVO@ - 02.10.2021 09:45
По сборке от 01.10.2021: Меняю сочетание клавиш для выхода в полный экран: правая кнопка мыши на панели — настройка — клавиатура — вид — во весь экран, новое сочетание Ctrl+Alt+Home. При выполнении этой комбинации происходит выход в полный экран, при повторном нажатии (для выхода из полного экрана) - компьютер виснет, помогает только снятие задачи в диспетчере.
¤
P.S. Меняю сочетание на новое, поскольку клавиши <Scroll lock> нет на ноутбуке. Похоже на большинстве из них.
-
? grf - 03.10.2021 06:05
Ссылка http://gid.pdp-11.ru/f/3.12.2110.8960/BK_v3.11_x64.rar битая
-
? Shestipalov - 03.10.2021 08:40
В новой версии проблемы с полным экраном только если в качестве рендера экрана выбран Direct3D. Рендеры OpenGL и Direct2D работают нормально.
.
Правильная ссылка на скачивание http://gid.pdp-11.ru/f/3.12.2110.8960/BK_v3.12_x64.rar
-
? gid - 03.10.2021 18:55
Вот сколько ноутбуков я видел, у всех была клавиша скрол лок. Обычно она была среди функциональных клавиш, которые через доп.кнопку "Fn" вызывались, это три кнопки - принтскрин, скроллок и пауза/бряк, вся нумпад клавиатура (вот это правда не у всех, а у старых моделей точно было), а так же обычно всякие мультимедийные кнопки и кнопки управления яркостью экрана, тачпадом, и всяким таким ноутбучным.
¤
Ссылки поправил.
¤
А раньше проблем с полным экраном в Direct3D не было? Я код рендеров уже давно не менял.
-
? grf - 16.10.2021 10:08
В новой версии (а может и в старых) не совсем корректно восстанавливается состояние машины из сохраненного. Конкретно не восстанавливается блокировка клавиши "СТОП" на 11М.
Т.е. пишем прогу, которая блокирует СТОП на 11М:
¤
mov #10000,@#177716
1zu: br 1zu
¤
Запускаем, жмем СТОП хоть до посинения - нет реакции. Записываем такое состояние, перезапускаем, загружаем - СТОП срабатывает, хотя в регистре 177716 и стоит значение 10000 в поле ЗпЗ
-
? gid - 16.10.2021 13:25
Этот баг был всегда.
Восстанавливаются только значения регистров, а то, что в некоторых случаях нужно ещё и некоторые функции вызывать, забыл.
Будет исправлено в следующем релизе.
-
? grf - 16.10.2021 13:42
Отлично, спасибо!
-
? grf - 16.10.2021 13:43
Спасибо за шикарный эмулятор! Только благодаря нему и был дописан Принц ))
-
? gid - 16.10.2021 18:57
Там вон https://github.com/andpp/bkemu-QT его на Qt переводят, если осилят, будет ещё шикарнее.
-
? grf - 17.10.2021 11:17
Было бы супер, если бы эмулятор начал поддерживать уже реализованные фичи контроллера AZ - палитры, доступ к памяти, звук :) Можно было бы уже писать игры под него.
-
? Manwe - 10.12.2021 22:45
под Windows 11 на экранах с высоким разрешением съезжает весь интерфейс :(
https://imageup.ru/img25/3853076/windows11-hires.png
-
? gid - 11.12.2021 06:32
Пока ничем не могу помочь.
Win11 пока использовать не планирую, мне её даж на виртуалку установить, чтобы посмотреть, что оно такое времени нету.
Экранов с высоким разрешением у меня нет и возможности самому потестировать внешний вид эмулятора тоже нет.
-
? svinka@ - 12.12.2021 00:51
Manwe, А в microsoft написал? -))
-
? gid - 12.12.2021 12:00
А вообще, думаю, что дело тут не в виндовсе 11, а в масштабе, который рядом с разрешением экрана выбирается.
Когда масштаб отличается от 100% по умолчанию, то интерфейс эмулятора начинает глючить и в виндовс 10 тоже.
Я искал в интернете, как писать проги под мультимониторные конфигурации и мониторы с большими DPI, практических примеров не нашёл,
нашёл только разные описания, как это можно делать, что-то мне показалось слишком сложно всё это и я забил.
Богачи с большими диагоналями пусть страдают.
-
? Manwe - 18.12.2021 11:03
По-моему, на такие случаи хранят разные варианты иконок – в 2 раза больше и в 3 раза больше. Ну и интерфейс собирают так, чтобы не прибивать гвоздями иконки к фиксированным координатам.
-
? gid - 18.12.2021 13:12
Микрософтовский MFC не умеет иконки, не прибитые к фиксированным координатам. В нём вообще каждый элемент интерфейса имеет фиксированные координаты и размеры, это можно посмотреть в файле ресурсов.
Кстати, я таки посмотрел на виндовс 11, красота-то какая, лепота. Ощутил себя хипстером-апплелюбом. И т.к. у меня нету 4к монитора, я просто поигрался там с масштабом.
При работающем эмуляторе, при увеличении масштаба, вот таких вот глюков как на скриншоте не наблюдалось. У меня всё пропорционально увеличивалось, иконки на тулбаре при этом становились мутноватые и единственный глюк - начинало колбасить строку состояния. Туда вместе с текстом начинали вылазить иконки тулбара и вообще всякое непонятное. Причём при возвращении масштаба 100% глюк так и оставался.
Но вот если запускать эмулятор при масштабе больше 100%, а именно с 200% наблюдаются как раз вот такие глюки как на скриншоте. Причём эмулятор собранный с последним СДК под вин10 и с СДК под вин11 ведёт себя по-разному.
Так что хер его знает, как надо делать, пускай микрософт свой MFC исправляет.
-
? gid - 18.12.2021 13:23
Оказалось, что не по разному, оказалось, что Direct2D работает неправильно с масштабом, а OpenGL масштабирование просто игнорирует. А Direct3D вообще не работает.
Понял я, что многое надо переписывать заново. Только х.з. как.
-
? Шестипалов - 05.01.2022 19:13
Сергей, привет!
.
в версии эмулятора от 2021-12-03 (а может, и более ранних) обнаружился глюк. Воспроизводится в конфигурации БК0011М+СМК, другие не проверял, но, очевидно, должно воспроизводиться и там. Алгоритм воспроизведения может быть такой:
1. Открываем окно дампа памяти, стартовый адрес указываем 177700. У меня окно дампа большое, диапазон показываемых адресов переходит через 0.
2. Запускаем что-то, что активно читает или пишет на винчестер. Я проверял на Принце Персии, тот грузит много данных, и ошибки чтения сразу видны.
3. Ошибки могут быть как в виде покорёженной заставки, битых спрайтов или вылетов в процессе игры.
4. Ошибки возникают как по чтению с винчестера, так и по записи на него.
-
? gid - 05.01.2022 20:58
Эта ошибка была всегда.
Я нашёл в чём причина. Вкратце - в отладочной функции используются неотладочные функции чтения регистров, и там делается незапланированное чтение регистров HDD, когда их адреса в области видимости, из-за чего при обмене данными с HDD начинаются всякие разные глюки.
Ошибка получилась из-за того, что мне было неохота плодить множество копипастных функций, незначительно отличающихся друг от друга.
Но теперь видимо, таки придётся.
Исправление скоро будет. Пока что думаю, в течении этой недели, если ничего меня не отвлечёт.
-
? Shestipalov - 06.01.2022 18:08
Проверил сборку эмулятора от 2022-01-06, глюка теперь нет.
-
? gid - 06.01.2022 20:05
Быстрые какие. Я только сегодня патч закоммитил, не проверял толком, убедился только, что запускается, работает, и глюк пропал.
Тогда спешить не буду, свою, так сказать, официальную сборку выложу позже, может сильно позже.
Глюк не критичный, если адресов регистров HDD в окне дампа не видно во время работы HDD, то о нём никто и не узнает.
-
? Shestipalov - 06.01.2022 23:17
>Глюк не критичный, если адресов регистров HDD в окне дампа не видно во время работы HDD, то о нём никто и не узнает.
.
Ну это как сказать. Если будет открыто окно дампа с регистрами HDD во время записи на образ диска — можно обзавестись множеством битых файлов.
-
? BD - 11.01.2022 15:11
вышли Максу актуальный почтовый адрес. он AZ тебе хочет переслать..
-
? BD - 11.01.2022 16:31
..и хватит умирать от инсульта и ковида ))
-
? grf - 12.01.2022 16:58
Можно ли все-таки сделать кнопку с функцией "увеличить скорость проца в 10 раз"? Для компиляции-линковки все время приходится добавлять 0 в поле частоты, а потом жать "нормальная скорость"
-
? gid - 12.01.2022 19:11
Там для кнопок увеличения/уменьшения частоты действуют клавиши-модификаторы: Ctrl, Alt, Shift. Если зажать их все три одновременно, то частота удваивается/уполовинивается. Вот это могу переделать в *10, /10. А чтоб добавить новые кнопки, кто-то должен нарисовать для них иконки, т.к. я не умею рисовать красивые и понятные картинки. Кнопка без иконки будет глядеться чужеродно.
-
? grf - 13.01.2022 02:17
Иконка не нужна, как раз удобнее какая-то клавиша
-
? Shestipalov - 08.02.2022 19:12
Сергей, привет.
.
Нашёл небольшую опечатку в книге Зальцмана на сайте. Сейчас так:
.
126-150 адрес очередного байта текста текущего «ключа».
126-150 - адреса (по порядку) начала текстов программируемых «ключей», соответствующих клавишам «0», «1»,...«9».
.
Надо:
.
124 — адрес очередного байта текста текущего «ключа».
126-150 - адреса (по порядку) начала текстов программируемых «ключей», соответствующих клавишам «0», «1»,...«9».
-
? gid - 09.02.2022 08:15
Спасибо. Поправил. Но не думаю, что это единственная опечатка. Я иногда тоже до сих пор нахожу артефакты распознавания в разных доках. И ладно бы в тексте, иногда бывают в примерах кода, что самое неприятное.
-
? Shestipalov - 10.02.2022 14:02
Ага. И сразу пример опечатки в коде, в той же книге Зальцмана:
.
; Инициализация драйвера
MOV PC,R0 ; Вычислить адрес
ADD (PC)+,R0 ; супервизора
.@SQN+2 ; в перемещаемом формате
MOV R0,@#274 ; Записать новый вектор @#274
HALT ; Стоп
; Супервизорная программа - обработка прерывания по "АР2"
SON: CMPB #17,@#177662 ; Клавиша "ЛАТ" по регистру "АР2"? –
BNE 0 ; Нет - выход
CALL GRK ; Графическая копия экрана
0: JMP @#101362 ; Передача управления в драйвер
; клавиатуры БК-0010
.
Имя метки сначала SQN, потом SON. Не смертельно, но тем не менее.
-
? grf - 16.03.2022 17:49
Мои запросы фич наверное уже задолбали, но нельзя ли сделать возможность "приколотить" вывод дампа куска памяти к определенной странице ОЗУ? К примеру, у меня переменные находятся на странице 4, и мне надо их наблюдать, а программа во время исполнения дергает страницы постоянно и дамп, конечно, показывает не то, что надо...
-
? gid - 16.03.2022 18:55
Теоретически можно.
Но на это потребуется довольно много писанины нового функционала. Т.к. универсального средства нет, и для каждой конфигурации нужно написать свои методы. А потом подумать, как это вкрячить в уже существующее, не поломав ничего.
Быстро не будет.
-
? grf - 17.03.2022 04:17
Спасибо! А как там продвигается поддержка AZ? )
-
? gid - 17.03.2022 08:13
Медленно. И тяжело, из-за отсутствия технических подробностей, которые обычному пользователю вообще не нужны.
Публичная версия будет после того, как будет сделано самое сложное - экран и палитры.
-
? Shestipalov - 17.03.2022 12:49
Сергей, привет.
В версии эмулятора от 9 марта 2022, похоже, перестал работать SERVICE2. После выхода небольшой лаг на несколько секунд и ошибка чтения HDD. Также не работает «Тест накопителя —> Внутренняя диагностика» и тест чтения HDD. Воспроизводится на версии x86.
-
? grf - 17.03.2022 14:39
>Медленно. И тяжело, из-за отсутствия технических подробностей, которые обычному пользователю вообще не нужны.
¤
Ну, это будет бомба! Ваш эмулятор в авангарде! :)
-
? gid - 17.03.2022 15:04
[В версии эмулятора от 9 марта 2022, похоже, перестал работать SERVICE2]
Нашёл ошибку. Скоро выложу исправленную версию.
-
? Shestipalov - 19.03.2022 12:08
И всё-таки что-то не то с эмуляцией HDD. Вот, к примеру, в версии от 17-03-2022 в утилите ANFORM, если выбрать «Verify» диск C, то утилита дойдёт жо 5-й дорожки и остановится, затем опять лаги и ошибки счтывания с HDD. В предыдущих версиях тоже было остановка на 5-й дорожке, но не было лагов и последующих ошибок чтения.
-
? gid - 19.03.2022 13:58
А по моему, что-то не то с программой ANFORM.
Она у меня в принципе не желает проверять разделы HDD пока в дисковод B: (и именно туда) не примонтируешь дискету.
Затем, если выбрать для проверки диск С:, проверка начинается с начала HDD C:0 H:0 S:1
Потом начинает хаотично скакать по головкам и цилиндрам, и очень быстро попадает на значения, выходящие за пределы геометрии диска.
Там прочитать ничего не может и зацикливается в ПЗУ альтпро на ожидании бита DRQ в регистре состояния 1f7
-
? Shestipalov - 19.03.2022 18:43
Возможно, что-то не так с утилитой. Я к тому, что в предыдущих версиях эмулятора она вела себя по-другому, более корректно. Поэтому подозреваю, что с эмуляцией всё-таки что-то неладно.
-
? Shestipalov - 19.03.2022 18:44
По уму, посмотреть бы, как она работает на реальном железе. Но я не могу — нету :-)
-
? gid - 19.03.2022 19:44
С эмуляцией как раз более ладно, теперь, при попытке читать за пределами геометрии возникает ошибка, а раньше - читалось непонятно откуда, там неопределённое поведение было. единственное, что может быть косячно - флаг DRQ не устанавливается везде, где надо.
Потому-что очень многие программы обрабатывают только этот флаг и вообще не смотрят на флаг ERR.
¤
Я на реальном железе запустить пока не смог. у меня сейчас только один дисковод подключен, как А: а надо второй как B: подключить, или шлейфами поиграться, пока сейчас это никак.
Зато я слегка подизассемблировал ANFORM, чтоб посмотреть, что он делает. На беглый взгляд - фигню какую-то.
Там, при выборе любого раздела HDD читается по первых 10 секторов на головках 0 и 1, с шагом цилиндров 16, а проверяемых дорожек по-прежнему считается что должно быть как у дискеты - 80. Соответственно, у HDD должно быть 80 * 16 цилиндров, чтобы не было выхода за геометрию и чтение было без ошибок. Но при этом читается отнюдь не содержимое указанного раздела.
-
? grf - 21.03.2022 08:40
А может это старый ANFORM, который только для дискет и был предназначен?
-
? gid - 21.03.2022 09:35
А другого нету. Этот из комплекта андос 3.30 Он умеет инициализировать раздел HDD, сделать его системным, а больше и не надо.
Можно его дизассемблировать до уровня редактируемого исходника и переписать правильно.
-
? Manwe - 21.03.2022 13:10
Проблемы с эмуляцией HDD начались тогда, когда перестала работать демка Good Apple. На реальном железе она по-прежнему работает.
-
? gid - 21.03.2022 13:56
демка Good Apple перестала работать, потому, что при наличии 4 головок у виртуального HDD, на котором она записана, пытается что-то читать с пятой. Как и почему такое происходит - я не знаю, у меня нету исходников демки и я отслеживаю, только те данные, которые она передаёт в регистры, в каком месте высчитывается неверное значение, я не знаю, а найти путём трассировки - терпения не хватает.
Я верю программе Service2, если в ней тесты проходят, значит я всё делаю правильно.
-
? gid - 21.03.2022 16:12
Однако, признаюсь, что дело не в демке.
Я нашёл причину, почему она перестала работать, но нифига не понимаю, почему надо делать именно так, как надо.
Там счётчик секторов не правильно считал, со сдвигом +1, поэтому демка делала последнее лишнее чтение и вылазила за пределы геометрии.
-
? gid - 23.03.2022 13:37
Добавил в архив с исходниками андос 3.10 исходник проги ANFORM кому интересно. http://gid.pdp-11.ru/src/andos310_src.zip
Изучайте. Форматирование и верификация работает только для дискет. для HDD оно не предназначено.
-
? grf - 06.04.2022 05:56
Эмулятор новой версии стал падать, в основном когда в дампе выбрана страница памяти для просмотра, отличная от дефолтной. Пока точно сценарий не сложился, но я просто загружаю сохраненное (из новой же версии) состояние и почти сразу программа завершает работу. Если же страница в дампе стоит дефолтная, то не падает.
-
? gid - 06.04.2022 15:08
Исправлено. скачайте новую версию.
-
? grf - 06.04.2022 16:14
Отлично! Спасибо!
-
? grf - 08.04.2022 13:21
Все-таки глюк не добит ) Достаточно просто стартовать эмулятор, сохранить состояние, потом тут же загрузить его ДВА раза подряд. Первая загрузка проходит нормально, вторая приводит к падению.
-
? gid - 08.04.2022 14:59
Не подтверждаю. У меня падения не происходит, ни при какой загрузке. Только вот состояние выпадающих списков в дампере сбрасывается в дефолтное.
Это потому, что оказывается, некоторые актуальные данные из ини файла в файл состояния не сохраняются. Этот косяк я только что обнаружил.
-
? grf - 08.04.2022 15:11
Вот видео: https://youtu.be/g12TO_iCLo8
-
? gid - 08.04.2022 16:47
Попробуйте удалить файл bk.ini, запустить эмулятор, закрыть эмулятор, запустить снова, настроить настройки заново.
Для надёжности снова закрыть эмулятор, снова запустить, и потом уже сохранить состояние, и затем загружать его.
Вот моё видео: https://disk.yandex.ru/d/43evWkdWSCsI2Q
-
? KUVO@ - 08.04.2022 17:10
Может стоит сделать "кнопку": вернуть эмулятор к исходному состоянию? Бывает рассинхрон реестра и ini-файла.
-
? gid - 08.04.2022 19:44
Неправда. В ини файле хранятся опции и настройки эмулятора, а в реестре хранятся только параметры пользовательского интерфейса - сугубо микрософтовская МФЦшная хрень, и они никак не пересекаются и друг от друга не зависят. После того, как я изменяю ресурсы или элементы меню/тулбара, я принудительно заставляю эмулятор удалять из реестра некоторые настройки, чтобы они с текущими не конфликтовали.
А "кнопка" такая есть, правда не одна, а несколько - жмём правой кнопкой мыши на тулбаре, в контекстном меню выбираем пункт "настройки", и там во вкладках есть кнопки "Сбросить всё" или просто "Сбросить" - по отдельности тулбары, хоткеи, меню. Заодно, там же, желающие могут как хотят кастомизировать пользовательский интерфейс.
-
? grf - 09.04.2022 04:57
>Попробуйте удалить файл bk.ini, запустить эмулятор, закрыть эмулятор, запустить снова, настроить настройки заново.
>Для надёжности снова закрыть эмулятор, снова запустить, и потом уже сохранить состояние, и затем загружать его.
¤
Проделал, помогло, но через минут 5 опять стал выпадать.
-
? gid - 09.04.2022 10:04
Ну не падает же. Дайте мне тот ини файл, на котором падает. Хоть погляжу, ыдруг я ещё чего-то не учёл.
А пока, скачайте и проверьте ещё более новую версию.
-
? grf - 15.04.2022 11:36
Последняя версия тоже падает.
https://cloud.mail.ru/public/B1RB/qGibL8Fq1
-
? gid - 15.04.2022 14:48
Да уж. Такого я от себя не ожидал. Такой тупейший косяк ещё умудриться проглядеть надо.
Нашёл и исправил. Вот теперь думаю, что точно всё будет работать.
-
? maxvel - 15.04.2022 19:22
А что с иконкой случилось??? На месте БКхи какой-то красная фигня и это поправьте даты а то март то кончился :-)
-
? gid - 15.04.2022 20:51
С иконкой случилось странное. Студия решила, что иконка точки останова - лучше подходит как иконка приложения. Когда я это заметил, я полдня угробил, чтобы понять, как так-то? и зачем это так? И как это назад исправить. Таки понял и исправил. заодно и иконку перегенерировал и она теперь отлично смотрится на больших экранах и в больших масштабах.
А какое марта у вас показывает? 46-е марта? У меня в окошке о программе показывает дату 15 апреля. (Это в свежей текущей версии сборки)
-
? Дмитрий Николаевич - 15.04.2022 22:54
Он имеет ввиду "даты" обновлений https://yadi.sk/i/Ow8rdx0eAMhdVA :)
-
? Maxvel@ - 16.04.2022 00:58
При старте эмулятора нет шахматки верните ее :-)
-
? Maxvel@ - 16.04.2022 01:01
>>>>>>А какое марта у вас показывает? 46-е марта? У меня в окошке о программе показывает дату 15 апреля. (Это в свежей текущей версии сборки)<<<<<<<
Сегодняшнее обновления датируется 15 марта (15,03,2022) на сайте перед версиями...
-
? gid - 16.04.2022 17:11
Вот, как только исправились глюки в проге, сразу нашли какую-то малозначащую фигню, чтоб придраться.
А шахматка пропала только в конфигурациях БК10+любой КНГМД. Это потому что не та виртуальная функция вызывалась. Ничего страшного, потерпите до следующего релиза.
И интересуют отзывы насчёт иконки программы. Она сейчас нормальная или по-прежнему мерзопакостный кружок? А то у меня - нормальная.
-
? grf - 17.04.2022 05:28
>Нашёл и исправил. Вот теперь думаю, что точно всё будет работать.
¤
Теперь все отлично, спасибо!
-
? gid - 18.04.2022 13:40
Сделана начальная эмуляция устройства AZBK. Скачивать для ознакомления там http://gid.pdp-11.ru/betatest.html
Потому что использовать там пока нечего. Так, просто посмотреть и всё.
-
? grf - 21.06.2022 15:23
Попробовал, что-то новые видеорежимы включить записью в регистры не удается.
-
? gid - 21.06.2022 18:45
На экран AZBK переключились? (ПКМ на экране и в контекстном меню выбрать нужный экран)
Если да, и всё равно фигня выходит, то это из-за того, что я делал это из словесного описания SuperMaxa, как он объяснил, так я и сделал.
Если будет более детальное описание, будет и более нормальная эмуляция.
Например сейчас скроллинг только стандартный, без захвата заэкранной области. Потому что я тупо н е представляю алгоритма его работы. Особенно если окно скроллинга меньше размера экрана.
-
? grf - 22.06.2022 00:33
Попробую переключить, я просто не знал, что там появился отдельный экран для AZ))
-
? grf - 22.06.2022 03:01
Работает! Будем разбираться дальше )
-
? grf - 25.06.2022 16:21
Видеорежимы AZ в эмуляторе работают отлично, примеры здесь: https://bk.grfgames.com/
Как насчет уже реализованного в AZ наложения слоев экрана? :)
-
? gid - 26.06.2022 18:35
Чуть позже. У меня перерыв. Мне для тестирования новых фич и исследования имеющихся возможностей AZBK нужно писать тесты. А писать очень лень и неохота, и вообще пока голову напрягать неохота. Я пока поменял вектор приложения своих сил и свободного времени на то, где особо думать не надо.
-
? Shestipalov - 29.06.2022 10:20
Сергей, привет
.
Хоть и перерыв, но всё-же :-) В версии эмулятора от 27-05-2022 изменён порядо страниц в карте памяти, теперь буфера экранов оказались в разных закладках. Сообщество демомейкеров :-) считает, что это неудобно — экраны это логически связанные вещи, и лучше, если можно визуально оценить их содержимое одновременно. Лучше всё-таки им быть на одной закладке.
-
? gid - 29.06.2022 13:34
Это я так не глядя, механически соптимизировал. Забирайте исправленную версию.
-
? Shestipalov - 29.06.2022 13:41
Спасибо! Только на сайте опечатка — написано, версия от 29.09.2022 :-)
-
? grf - 29.06.2022 13:45
> Мне для тестирования новых фич и исследования имеющихся возможностей AZBK нужно писать тесты. А писать очень лень и неохота, и вообще пока голову напрягать неохота
¤
Если вдруг будет желание - я написал тест как раз для трех слоев в режиме 256х192х8, со спрайтами и использованием расширенной памяти AZ.
-
? gid - 29.06.2022 14:50
[Только на сайте опечатка]
Это шестёрку вверх ногами перевернуло почему-то.
[Если вдруг будет желание]
Желание получить то, что неохота делать самому, конечно будет. Однако я ещё тут не совсем понял, слои реализованы в прошивке 00011? Или нет? А то SuperMax выложил эту прошивку, а про слои немного позже написал, а что ещё более новая прошивка появилась, я что-то не видел/слышал.
-
? grf - 29.06.2022 15:29
>Однако я ещё тут не совсем понял, слои реализованы в прошивке 00011? Или нет? А то SuperMax выложил эту прошивку, а про слои немного позже написал, а что ещё более новая прошивка появилась, я что-то не видел/слышал.
¤
Новая прошивка есть, я на ней слои и сделал, на железе они работают отлично ) Выложил ли он ее - не знаю, он хотел там заодно таймер добавить новый.
-
? Макс Багаев@ - 30.06.2022 07:49
Вышла 12ая прошивка
https://forum.maxiol.com/index.php?s=&showtopic=5553&view=findpost&p=56596
-
? BD - 04.07.2022 17:29
https://bk.grfgames.com/download/1121/
не работает
¤
глубокоуважаемый, gid.. не могли Вы поискать баг? ))
-
? Shestipalov - 04.07.2022 17:38
Уточню пост выше. В нескольких последних версиях эмулятора наблюдаются падения в разных ситуациях. Самая простая воспроизводимая ошибка — попытка запуска «Принца Персии», эмулятор валится стопроцентно на окне загрузки.
-
? BD - 04.07.2022 17:53
https://t.me/bk0010_11m/312360
http://mkdos.pdp-11.ru/prince_release1v3.img
дискетка тута *))
-
? gid - 04.07.2022 20:17
Из того, что нашёл - очень неприятная ошибка, попытка обращения к объекту, который не существует.
Ошибка появилась в версии 3.13.хххх, после того как я код эмуляции дискеты выделил в отдельный класс.
Это вызывает падения в конфигурациях с двумя дисководами - А16М и СМК-512, там при обращении к приводам С и D ошибочно выбираются несуществующие дисководы. В СМК - одновременно с разделами HDD. В результате - падение, иногда - рандомное, зависящее от разных других факторов.
Принц персии валится как раз из-за этого.
¤
Чтоб два раза не компилировать, давайте, говорите, где ещё валится, раз ошибки в нескольких последних, значит ещё и в предыдущих 3.12.ххх тоже что-то нашлось?
-
? Shestipalov - 05.07.2022 00:06
3.12 от 15 апреля работает вроде нормально. Следующие уже валятся. Из ещё гарантированных ошибок — эмулятор падает, если с помощью утилиты Manwe LDMount примонтировать логдиск как дисковод A: и загрузиться с него. У меня падает при задании таких параметров: LDMount O:ODNAZDY A: BOOT
-
? grf - 05.07.2022 02:53
На последней версии Принц падает потому что не может просто в СМК писать. Вот тут диск с тестом СМК и исходником: https://cloud.mail.ru/public/2P9Y/tUyfZq44h
Тест просто пишет в СМК, ничего не читая ни с каких дисков. И при попытке писать в 6 сегмент страницы 1 СМК эмулятор падает: https://bk.grfgames.com/wp-content/uploads/2022/07/photo_2022-07-05_01-22-54.jpg
-
? grf - 05.07.2022 03:14
Имеется в виду версия эмулятора v3.13.2206.9851
-
? Shestipalov - 05.07.2022 07:30
уточнение — в версии от 15 апреля 3.12.2204.9393 «Принц» тоже не работает. Загрузка там проходит, но заставка сразу пропускается, загружается игровой экран и нет реакции на нажатия клавиш.
-
? gid - 05.07.2022 09:32
А где скачать утилиту Manwe LDMount ? Где она вообще есть?
-
? Shestipalov - 05.07.2022 10:03
вот отсюда можно забрать https://disk.yandex.ru/d/iSJxDfrskOSVSg
-
? gid - 05.07.2022 13:13
[У меня падает при задании таких параметров: LDMount O:ODNAZDY A: BOOT]
В общем, сейчашняя версия эмулятора, которая у меня, по команде LDMount H:LOG1 A: не падает, более подробно повторить нет терпения. Я в этом дурацком мкдосе не умею копировать файлы, повторяя структуру каталогов. А каждый каталог создавать вручную задалбывает.
Поэтому просто создал новый раздел мкдос, и в нём простой лог диск, дальше сил не хватило.
¤
[Тест просто пишет в СМК, ничего не читая ни с каких дисков. И при попытке писать в 6 сегмент страницы 1 СМК эмулятор падает]
сейчашняя версия эмулятора не падает, всё пишется потом сверяется, а потом, в конце, когда тест зацикливается на br . при нажатии СТОП, вместо выхода в оболочку начинается всякая хрень.
¤
[в версии от 15 апреля 3.12.2204.9393 «Принц» тоже не работает]
В текущей версии такого не наблюдается, значит ну и не зачем искать уже исправленные ошибки в старом билде.
-
? Shestipalov - 05.07.2022 14:18
[В общем, сейчашняя версия эмулятора, которая у меня, по команде LDMount H:LOG1 A: не падает]
.
По поводу LDMount — это я затупил, скорее всего. Очевидно, валит эмулятор не сама LDMount, а демка Однажды, диск с которой я монтирую и с которого я эту демку загружаю. Она (демка) использует СМК, и, видимо, именно попытка работы с СМК валит эмулятор, как и в Принце.
-
? BD - 01.08.2022 15:41
в чате Shestipalov@ заметил хрень, что мтпс не обрабатываются если задан регистр...
https://i.ibb.co/kJZMtqm/2.jpg
¤
https://i.ibb.co/F8YJkHx/photo-2022-08-01-15-34-21.jpg
-
? gid - 01.08.2022 21:47
Технически - MTPS работает как надо, иначе бы не проходил тест ТМОС 791401
Да и я щас перепроверил в отладчике эмулятора - всё работает.
А почему творится хрень в MIRAGE - это вопрос к MIRAGE. Надо его дизассемблировать и посмотреть, что там накодено.
Пусть попробует в PARADISE то же самое сделать.
-
? BD - 02.08.2022 07:36
в эмуляторе Тишина и на андроиде мираж прекрасно трейсит mtps (r0)+
-
? gid - 02.08.2022 12:12
Нашёл косяк. Очень древний. У меня mtps обнуляет бит T, вместо того чтобы не изменять его. Исправление будет осенью.
Или может Scalolaz соберёт, свою сборку, там буквально пара строчек. Коммит я ему отправил.
-
? BD - 08.10.2022 00:27
Многоуважаемый GID!
Сейчас все носятся к БК подлючить ДВА АУ..
Даж демки написали..
Не могли бы Вы, в свободное время, изучить данный вопрос?
|https://disk.yandex.ru/d/7QKl6dsHGfLWpw
¤
https://i.ibb.co/RTtthb6/2.jpg
-
? gid - 09.10.2022 18:43
Могли:
29.09.2022 08:29:36 // Выпущен релиз эмулятора v3.13.2209.9954
1.Исправлена ошибка в эмуляции команды MTPS
2.Добавлена реализация двух-AY'шного звукового модуля...
Скачивать там - https://gid.pdp-11.ru/bkemuc.html?custom=3.13.2209.9954
Если надо изучить ещё как-то более подробно и углублённо, пишите.
-
? Maxvel@ - 25.10.2022 17:27
Понадобилась окошко чтения и записи ленты, но вот досада в меню галочка о том что это окошко включено стоит а самого окошка нетути.
Вообще хотелось бы что бы эта функция была не в том виде в каком она сейчас а в виде не большого плеера со списком файлов в формате бин или вейв, так же с возможностью останова воспроизведения в любой момент и начало другого файла в тех же форматах.
-
? gid - 25.10.2022 20:05
Если заглючил интерфейс, и какие-либо окошки не появляются, удалите в реестре ветку HKCU\SOFTWARE\gid prod.\BKEMUL целиком.
Все настройки интерфейса пересоздадутся заново.
¤
Делать плеер - слишком сложно для меня, мне бы тоже хотелось чтобы было поудобнее, но я не умею. Поэтому подожду, когда кто-нибудь приделает его к эмулятору.
-
? Maxvel@ - 25.10.2022 20:18
Вынес раздел в реестре но увы так и не появилось это окошко ---- печалька.....
-
? Дмитрий - 01.12.2022 21:00
Не подскажет кто - что возвращает команда FPU MODF/MODD после перемножения? Просто разделяет целую и дробную части или раскладывает число как FREXP на 2^x * y? В древних pdf в описании упомянуты оба варианта.
-
? gid - 02.12.2022 09:55
В большинстве мануалов по FP11 написано, что команда умножает источник и приёмник, и разделяет результат на целую часть и дробную.
Целая часть произведения сохраняется в (AC|1), т.е. номер регистра аккумулятора or 1. Дробная часть произведения сохраняется в AC. Если номер регистра аккумулятора нечётный, то сохраняется только дробная часть произведения.
Я смотрел мануалы, начиная с PDP 11/20 и дальше, правда не все, выборочно, и везде, где смотрел, было написано одно и то же.
И у себя в эмуляторе реализовал этот же вариант.
Про тупо разделение на мантиссу и порядок я в документах не видел, где это такое встречалось?
-
? Дмитрий - 02.12.2022 20:03
https://bitsavers.org/pdf/dec/pdp11/handbooks/PDP11_Handbook1979.pdf стр. 363 (по нумерации вьювера).
¤
This instruction generates the product of its two floating point operands, separates the product into
integer and fractional parts and then stores one or both parts as floating point numbers.
Let PROD = (AC)*(FSRC) so that in: <------------------------------------------------------------------ тут все понятно
Floating point: ABS(PROD) = (2**K)*f where 1/2.LE.f.LT.1 and EXP(PROD) = (200+K)s <------------------ смутила эта строка
Fixed Point binary: PROD = N + g, with <-------------------------------------------------------------- а тут уже про целую и дробную
N = INT(PROD)=the integer part of PROD and g = PROD - INT(PROD) = the fractional part of PROD with 0<g<1
Both N and g have the same sign as PROD.
¤
И еще. Если я парвильно понял, в операциях FPU, если метод адресации 0, то это не регистр, а аккумулятор. Но не везде.
-
? gid - 02.12.2022 21:39
Блин. Умеют же написать так, что ничего не понять с первого раза.
В первом же предложении написано, что результат команды - два плавающих числа: одно - целая часть операции (N), то, что перед точкой; второе - дробная часть (g), то, что после точки.
А потом куча непонятного.
Подумавши, я пришёл к выводу, что то, что они пометили "Floating point:" это внутренне представление числа внутри FP-11, оно там сразу разделяется на мантиссу и порядок, и хранится в отдельных аппаратных регистрах, чтобы проще ими манипулировать было.
А "Fixed Point binary:" это то, что выдаётся наружу в регистры или память - 32 или 64 разрядное число в формате с плавающей точкой.
Другого объяснения я не нашёл.
¤
[Если я парвильно понял, в операциях FPU, если метод адресации 0, то это не регистр, а аккумулятор. Но не везде.]
Мгм. Во всех командах с плавающими числами, кроме команд LDFPS, STFPS, STST, STEXP, STCxI,STCxL LDEXP, LDCIx,LDCLx (у которых источник/приёмник - априори не плавающее число, в них адресация 0 - регистр CPU)
-
? Дмитрий - 02.12.2022 22:02
Тогда в догонку еще вопрос: бит в слове состояния - режим округления chop/round. Chopping - это, вроде как, просто отбрасывание дробной части, а округление - оно и есть округление, но какое - round to nearest? Up/Down/ToZero?
-
? gid - 03.12.2022 09:58
Округление всегда вверх.
Там просто прибавляется 1 к биту, который младше самого младшего бита остающейся части мантиссы. Условно говоря, к 31 биту, потом если надо делается выравнивание мантиссы и коррекция порядка.
Всю механику можно посмотреть в исходниках бета версии эмулятора v4.x, там есть эмуляция математического процессора FP11, насколько возможно. Но код выключен на уровне исходников, поэтому в самом эмуляторе этого нету.
На БК эти опкоды активно используются в собственных целях в разных системных программах.
-
? Shestipaloff - 20.01.2023 08:38
Сергей, привет
.
Нашёл небольшую ошибку в документации на BKTurbo8 — в начале написано, что псевдокоманды .ENABL и .DSABL отсутствуют (от старой доки осталось), а ниже в тексте они указаны как действующие.
-
? gid - 20.01.2023 09:31
Я их добавил буквально недавно перед релизом, а доку не откорректировал
Ещё хотел добавить функционал назначения синонима имени регистра типа такого: %6=STEK %7=SK
но возникло затруднение с опознаванием элемента %цифра в качестве имени, ну и пока не стал это делать.
-
? Shestipalov - 20.01.2023 15:29
Переименование регистров, ИМХО, может сильно помочь в плане читаемости программы. Мне было бы полезно, по крайней мере. Ну и ещё такая мысль появилась, насчёт скриптов. Было бы полезно иметь возможность использовать в скриптах системны переменные, типа системной даты, времени, может, ещё чего. Тогда будет возможно автоматически вносить в текст программы дату компиляции, например. Номер версии тоже не помешал бы. Правда, возможный механизм реализации этого я плохо себе представляю, но, может, ты придумаешь :-)
.
PS. И ещё, не помню, предлагал или нет сделать такую штуку в эмуляторе — когда нажимается кнопка «Сохранить состояние эмулятора», он автоматически ставится на паузу. Это будет логично, если учесть, что я хочу сохранить именно тот момент, когда нажал на кнопку «сохранить», а не тот, когда я ввёл имя файла сохранения в диалоговом окне. За это время много чего может произойти, например, в «Принце Персии» ГГ убьют )))
-
? gid - 20.01.2023 16:46
Скрипты не для этого. То, что ты предлагаешь - это модификация исходника. А скрипт модифицирует уже готовый бинарник. И оперирует он чисто с бинарными данными.
То, что ты предлагаешь, делается через definesы, и этого механизма вообще предусмотрено, его ещё придумывать надо.
¤
Второе - предлагал уже, и я вроде бы сделал. Когда нажимается кнопка «Сохранить состояние эмулятора», эмулятор ставится на паузу, а после записи сохранения сразу же запускается обратно.
-
? Shestipalov - 20.01.2023 17:22
>То, что ты предлагаешь - это модификация исходника.
Не совсем. Одно дело в исходнике постоянно руками менять дату компиляции, и совсем другое написать, например, что-то типа такого (на синтаксис и логику внимание не обращать, это только пример для демонстрации идеи):
.LA 1000
MOV #MSG,R1
CLR R2
EMT 20
EMT 6
HALT
DATE: .BLKW 10
.SCRIPT:
MOV ${currentdate},@#DATE
.ENDS
.END
.
Тогда при компиляции можно руками дату в исходнике не менять — сама подставится. Это как раз модификация бинарника. Хотя, наверно, можно как решить эту задачу и без использования скриптов, средствами текстовых редакторов каких-нибудь... Не знаю. В общем, нет так нет, тебе виднее :-)
.
А пауза при сохранении действительно работает, спасибо! )
-
? Manwe@ - 23.01.2023 19:42
Не понял что происходит, может баг в конфигурации БК 0010 + СМК? Во время блокового чтения процедурой по адресу 160004.
Записал видео: manwe.ru/bug.mp4
Там ближе к концу при выполнении обыкновенной команды MOV R2,26(R3) по адресу 160336 вдруг происходит загрузка файла в память и halt (но куда направлен 4-ый вектор, там уже перетёрто загрузкой).
Непонятно как такое может быть, не выполняется же код чтения с диска.
-
? gid - 23.01.2023 21:58
Я посмотрел, что происходит.
Там, с адреса 160372 срабатывает перехватчик - эмуляция дискового обмена.
т.е. после того, как в отладчике выполнится команда по адресу 160366: MOV R2,26(R3), РС станет равным 160372 и тут же срабатывает перехват, до того, как дело доходит до отладочного останова. Таков рабочий цикл, и как его переделать, я не представляю.
И вот что там происходит в перехватчике - я не знаю, у меня например, при загрузке каталога с дискеты андос - всё в порядке, ничего не ломается. Но у меня и версия эмулятора свежая.
Если и со свежей версией глюк повторится, то нужно в отладчике вижуалстудии смотреть, конкретно, что происходит в данном конкретном случае. Может накосячено с представлением знаковых-беззнаковых чисел, может ещё что-то. там единственный вариант halta - попытка записи в ПЗУ.
Либо можно отключить эмуляцию ввода-вывода дисковода и посмотреть, что будет.
¤
Ещё я помню, в каком-то старом билде был косяк в дампе памяти, если там отображались адреса из диапазона 177700-177777 во время дисковой операции происходило что-то не то, что надо.
-
? Shestipalov - 30.01.2023 14:51
Сергей, привет!
.
Вопрос такой. Пытаюсь грузить bin-файл в эмулятортакоф командой:
BK.exe /D MYFILE /L 1000
Экземпляр эмулятора уже запущен, файл грузится, но всегда по адресу, указанному в заголовке bin-файла, параметр /L не имеет никакого значения — что ни указывай, адрес всегда один и тот же — из заголовка. Это я неправильно понял документацию или ошибка в эмуляторе? :-)
-
? gid - 30.01.2023 16:01
Это ошибка в эмуляторе. Не та переменная используется. Будет исправлено.
-
? Shestipalov - 09.02.2023 10:52
Сергей, «и снова здравствуйте» :-)
.
В сборке v3.13.2301.10250 загрузка с диска A: в конфигурации БК11М+СМК512 невозможна. Вывод строку с названием контроллера и виснет.
-
? gid - 09.02.2023 11:22
А у меня работает. Взял пару случайных образов и спокойно с них загрузился.
Если при этом не примонтирован образ HDD, после строки с названием контроллера, происходит довольно долгий цикл ожидания ответа от HDD, а потом загрузка с дискеты.
Если образ HDD примонтирован, то если нажать букву A, а потом нажать кнопку ресет - быстренько так загружается с дискеты.
Может у нас образы разной системы?
Я тут кстати заметил одно неприятное явление - BKDE в какие-то моменты портит образ дискеты, и с неё становится невозможно загрузиться, но при этом файловая система без ошибок. Это я заметил на ANDOSe и вроде бы было на MKDOSe.
Но где, когда и как - вообще не могу отловить. Даже повторить ситуацию не могу.
-
? Shestipalov - 09.02.2023 11:50
Если включена опция «эмулировать ввод-вывод дисковода» — то грузится. Если эта опция выключена — то не грузится.
-
? gid - 09.02.2023 12:32
Вот теперь понятно. Есть там ошибка. Исправлю, когда возможность будет.
-
? Shestipalov - 10.02.2023 11:23
И ещё одно, давно хотел предложить, всё время забывал. В окне «Дамп регистров CPU» есть переключатель DEC/HEX. Предлагаю дополнить его ещё байтовым представлением, чтобы видеть отдельно содержимое старших и младших байтов регистров. Иногда (сильно иногда) бывает полезно.
Просто предложение, на твоё усмотрение, нужно или нет :-)
-
? gid - 10.02.2023 12:15
Там можно не только смотреть, но и редактировать значения.
Вывести байтовое представление не трудно. А вот как его редактировать я пока сходу не могу придумать. Но если придумаю - добавлю.
-
? Shestipalov - 21.02.2023 07:59
Сергей, привет!
.
>20.02.2023 13:21:12 // Исходники игры King's Valley
.
Нету на сайте их. По-крайней мере, я не нашёл.
-
? gid - 21.02.2023 09:16
Как обычно, забыл обновить страницу. У меня часть страниц статические, часть динамические. Вот теперь в два раза больше внимательнее быть надо. Теперь есть ссылка.
-
? maxvel@ - 21.02.2023 12:32
А что случилось с редактором джойстика? пытаюсь его перенастроить под себя, так обязательно пару кнопок не желают работать. да и за чем на серую клавиатуру назначили вывод меню (num7) кому опять лень мышкой до менюшки или иконки дотянуться?
-
? gid - 21.02.2023 13:14
А какие кнопки не работают? Я без фантазии потыкался в цифробуквенные - все переназначаются.
А что за вывод меню? У меня на серую клавиатуру вообще ничего не забиндено, кроме джойстика по умолчанию.
На num7 а точнее на клавишу Home очень любит вешать всякую фигню Скалолаз в своих сборках.
А я именно поэтому не использую ни для чего эту клавишу, потому что вот именно такая фигня с ней происходит.
-
? Shestipalov - 25.02.2023 22:06
Сергей, есть предложение добавить эмуляцию кнопки «Printscreen». Использовалась в разных программах, Snipper, например, Graphix ot RDC. Это которая посылает сигнал прерывания по вектору 100. Схема подключения есть в документации на Snipper. Вот тут скриншот https://pastenow.ru/6d3da0ac150e449351d60b858f08ca6b
-
? gid - 26.02.2023 10:09
Точно по вектору 100 ?
Я когда-то где-то читал, что кто-то предлагал использовать для этого вектор 24, типа он есть, но никем не используется, и просто зря пропадает.
Я подумаю, но что-то пока плохо представляю, как сделать. Зафигачу ещё одну кнопку на тулбаре, назначу ей какую-нибудь горячую клавишу, чтобы, когда на БК нажимаешь какой-нибудь АР2/ВС или АР2/СБР, внезапно ещё делалось ещё и прерывание по вектору 100, ибо свободных горячих клавиш уже и не осталось. А если горячих клавиш не делать, обязательно найдётся человек, которому эта кнопка нужна в полноэкранном режиме.
¤
Результат должен что делать? Сохранять копию экрана в файл на дискету или распечатывать его на принтере?
В чём смысл? Принтер не эмулируется, а файл - не так уж и нужен, потому что уже есть кнопка "Сделать скриншот экрана", без всякой эмуляции векторов, причём тип скриншота тоже регулируется - или нативный, с разрешениями БК как есть, или пропорциональный, как видно на экране.
Т.е. мы уже может получить скриншот экрана без всяких новых кнопок.
-
? Shestipalov@ - 26.02.2023 12:09
>Точно по вектору 100 ?
.
Точно. Эта кнопка вызывает прерывание по вектору 100.
.
>Результат должен что делать? Сохранять копию экрана в файл на дискету или распечатывать его на принтере?
.
Нет, ничего такого. Результатом нажатия на кнопку должно быть просто прерывание по вектору 100 (название «PrintScreen» не совсем корректное, но так уж повелось :-) ). А что должно происходить дальше — зависит от загруженного в данный момент обработчика прерывания. Snipper, например, позволяет текст на экране записать в ТЕКСТОВЫЙ файл, т.е., он сканирует изображение и распознаёт символы. Graphix2 делает графическую копию экрана. Можно сделать любой другой свой обработчик, например, догрузку к Paradise, которая будет передавать управление в отладчик при нажатии кнопки. Или, например, сохранение состояния игры (ну или содержимого памяти) для 10-х игр. Ну или что ещё фантазия подскажет :-)
.
>Т.е. мы уже может получить скриншот экрана без всяких новых кнопок.
.
Так речь идёт не просто о возможности получить скриншот, а об эмуляции доработки реального БК0010-01/0011(М), которая делали на реальных БК. Это такая же доработка, как Covox, AY, кнопка Reset, например. Поэтому было бы невредно иметь и её эмуляцию, раз уж она была в реальности.
-
? Maxvel@ - 26.02.2023 18:04
>>А что за вывод меню? У меня на серую клавиатуру вообще ничего не забиндено<<
при отжатом нунлок нажимаем NUM7(HOME).
-
? gid - 27.02.2023 08:21
>>? Maxvel@ - 26.02.2023 18:04
[при отжатом нунлок нажимаем NUM7(HOME).]
И ничего не происходит. Повторю, что в моих сборках, с моего сайта, ничего на серую клавиатуру не назначено.
А если пользовались сборкой Скалоаза, то его настройки могли в реестре остаться. МФС кеширует в реестре все менюшки, тулбары, конфигурацию докинга, горячие клавиши и т.п.
Чтобы вернуть всё как было нужно кликнуть правой кнопкой мыши в любом месте на тулбарах или свободной области, в контекстом меню выбрать "Настройка...", перейти во вкладку "Клавиатура", выбрать категорию "Все команды", нажать кнопку "Сбросить все".
Ну и там в остальных вкладках можно вернуть к изначальному виду и всё остальное.
-
? Maxvel@ - 27.02.2023 21:47
Попробую Спасибо.
-
? Maxvel@ - 27.02.2023 21:47
Попробую Спасибо.
-
? Дмитрий - 01.03.2023 23:38
gid, вопрос по Турбо8. Как в нем реализовано вычисление выражений с меткой или метками (типа MOV #LABEL+12,R1), которые пока еще не определены? У себя сделал запись таких выражений в таблицу для повторной обработки после прохода по всему тексту. Плюс такие выражения могут быть и в подключаемых файлах - их тоже надо обрабатывать, а в случае ошибки правильно выдать в каком файле, в какой строке и позиции ошибка, если она возникнет. Так-то все работает, но что-то мне не совсем нравится способ - хочу переделать.
-
? gid - 02.03.2023 09:43
Тут в двух словах не ответить, будет многабуков, и не сильно понятно, наверное.
Для простоты будем говорить про старую версию Турбо8, где арифметическое выражение - это просто сумма слагаемых, куда располагать результат этой суммы - становится известно при компиляции, и этот адрес сохраняется в таблице ссылок на метки.
При первом проходе компилятора делаются следующие действия:
1. В таблицу определений собираются все определения меток (из поля меток), с их значениями.
2. Строится код из опкодов и аргументов команд, которые явно определены, то, что нельзя пока вычислить - заменяется нулями, или теми значениями, которые можно вычислить - сумма всех числовых слагаемых выражения.
3. В таблицу ссылок на метки собираются все метки из вот таких арифметических выражений. и ещё задаются атрибуты: "знак минус" - значит надо значение метки не прибавлять, а вычитать, "деление пополам" - фича именно турбо8 и "смещение" - означает, что результат - не абсолютное значение, а смещение до значения.
¤
Тут надо отметить, что есть два режима компиляции: сразу с компоновкой, и компиляция в объектный файл.
Во втором случае, никакие метки компоновать нельзя, т.к. объектный файл может быть потом слинкован с другим объектным файлом по произвольному адресу и нужно делать коррекцию всех меток и ссылок.
А в первом случае - в первом же проходе, если если ссылка на определённую метку, то её значение можно сразу же прибавить к результату арифметического выражения.
¤
Затем, когда все определения меток будут собраны и весь код построен, если мы не компилируем в объектный файл, делается финальный проход по таблице ссылок на метки, и всё что там останется - это ссылки на неопределённые метки.
¤
Как я понял, с объектными файлами заморачиваюсь только я, все остальные делают тупо include.
¤
В новой версии Турбо8 работа с арифметическими выражениями принципиально иная. Там возможны полноценные арифметические выражения со скобками и приоритетами операций, в выражениях возможны ещё не определённые метки и всё это возможно в присваиваниях типа
VAL=<END-BEGIN>/2 и значения меток при этом могут быть ещё не определены, значение VAL может использоваться в других арифм. выражениях. И всё это последовательно вычисляется в процессе определения меток.
¤
У меня сделан пока простейший менеджер ошибок, который был в оригинальном Турбо8, т.е. у меня не показывается, в какой строке текста появилась неопределённая метка, у меня показывается адрес из таблицы ссылок, и выяснять где это, надо по листингу.
А при линковке объектников - вообще никак не узнать. Так что мне ещё предстоит переписывать менеджер ошибок по нормальному.
-
? Дмитрий - 02.03.2023 20:10
Я про то, как сохраняется такое выражение. Как вырезанное в отдельную строку или запоминается ссылка на его первый символ в исходнике? Я сделал сохранение вырезанного выражения в отдельную таблицу доп. прохода, но при инклюдах приходится сохранять еще имя файла и позицию для вывода возможной ошибки, что громоздко. А могут быть и вложенные инклюды. Ведь адрес метки в выражении на момент разбора нам неизвестен и метка помещается в таблицу меток как неопределенная. А в дополнительном проходе по такой таблице все метки нам должны быть известны и встреча неопределенной метки вызовет ошибку, которую и надо сообщить пользователю. Вот думаю либо переделать на ссылки, чтоб не плодить тонну строк, либо также вырезать выражение, но не могу придумать как с минимальными накладными расходами сохранить все (имя файла, позиция в тексте, позиция ошибки, номер строки и указатель на ошибочный идентификатор выражения) для вывода возможных ошибок.
-
? Дмитрий - 02.03.2023 20:19
Да и еще в догонку про команды FPU. Если в командах MULF/DIVF/ADDF/SUBF и других в качестве источника будет указано непосредственное значение: MULF #X,AC0, то как себя будет вести проц? Исключение по неправильной команде или все же выполнит? Я что-то не нашел в описаниях команд такого случая.
-
? gid - 02.03.2023 21:33
Я не сохраняю выражение в текстовом виде. Я его парсю, преобразую в обратную польскую нотацию, из неё создаю цепочку сущностей, где каждая сущность - либо арифметическая операция, либо числовая константа, либо ссылка на метку, либо ссылка на текущий PC (аргумент "точка"). И уже в таблицу ссылок помещаю всю эту цепочку. И потом вычисляю эту цепочку, если она вычисляется.
В общем случае, теперь у меня абсолютно всё - это арифметические выражения, даже единичная числовая константа - это тривиальное арифметическое выражение, которое вычисляется немедленно.
Я очень долго морочился, чтобы сделать возможность генерировать объектные файлы, которые можно линковать как угодно. Чтобы была полная перемещаемость.
Я же говорю, у меня нигде не сохраняется информация о месте, где возникает ошибка. Для этого мне придётся делать специальный файл типа микрософтовского .pdb, где будут храниться строки текста, номера строк и адреса бинарника, к которым эти строки относятся. Концепция ещё на стадии обдумывания и сделана будет не скоро.
В общем скачайте исходники BKTurbo8, там есть текстовые файлы с набросками концепций и структур данных, как я всё делал.
¤
[Если в командах MULF/DIVF/ADDF/SUBF и других в качестве источника будет указано непосредственное значение: MULF #X,AC0, то как себя будет вести проц?]
Как обычно, будет прочитано 16 разрядное плавающее число и преобразовано в 32 или 64-х разрядное путём добивания нулями хвоста мантиссы.
Скачайте исходники бета версии эмулятора v4.х и посмотрите реализацию FPU. Она проходит тесты DEC xxdp: dffpa, dffpb, cffpc
Вот только сами тесты не очень всеохватывающие, они просто проверяют насколько правильно вычисляются вычисления.
-
? Дмитрий - 03.03.2023 00:00
>> у меня абсолютно всё - это арифметические выражения, даже единичная числовая константа - это тривиальное арифметическое выражение, которое вычисляется немедленно.
Я аналогично сделал. Но я не стал делать в виде бинарника. Потому как константа "1" - это байт, а 000001 в двоичном занимает в 2 раза больше. А после "100" уже выгоднее бинарником. Спасибо. Обдумаю на досуге этот вариант.
¤
>> будет прочитано 16 разрядное плавающее число и преобразовано в 32 или 64-х разрядное путём добивания нулями хвоста мантиссы.
т.е.
SETD
MULF (PC)+,AC0
.FLT4 2.0
¤
черта с два выполнится? но 16-разрядное - это же половина float, при добивании нулями потеряется точность. про double вообще молчу. Хотя этот вариант вряд ли будет кто-то использовать. Проще
¤
SETD
MULF D2,AC0
...
D2: .FLT4 2.0
¤
>> Она проходит тесты DEC xxdp: dffpa, dffpb, cffpc
Тесты нашел, но в PDF. А исходников их нет?
-
? gid - 03.03.2023 09:09
Неправильно.
.FLT2 nnn делает 32хразрядное плавающее число, а .FLT4 nnn - 64х разрядное.
Так работать не будет.
SETD
MULF (PC)+,AC0 ; эта команда примет только первое слово аргумента и
.FLT4 2.0 ; затем проц попробует выполнить второе слово аргумента как команду и будет неопределённое поведение
¤
Надо писать так:
SETD
MULD #^F3.1415, AC0
Непосредственный аргумент - только 16 разрядное плавающее число.
Если хочешь точности, не нужно использовать непосредственные аргументы.
¤
SETD
MULD PI,AC0
...
PI: .FLT4 3.1415
¤
а если сделать так:
SETF
MULF PI, AC0
то эта команда просто прочтёт половину числа.
¤
Есть исходники. Я пару месяцев мучился распознавал эти пдфки:
https://disk.yandex.ru/d/yiqZwoLJobiIfw
¤
Там они немного поправлены, чтобы компилировались в обычном macro-11 и чтобы на БК работали. Требуются регистры терминала.
-
? Дмитрий - 07.03.2023 00:11
>> Есть исходники. Я пару месяцев мучился распознавал эти пдфки
Благодарю. Мельком пока глянул. Погляжу на досуге по-подробнее.
¤
Судя по тому как записаны тестовые константы для проверки, запись double осуществляется big endian. Хотя в вики сказано, что у PDP был свой т.н. "PDP-endian". Я почему-то думал, что у PDP тоже little endian, потому как 16-битное слово пишется как раз LE.
-
? BD - 10.03.2023 19:55
Глубоко многоуважаемый GID!
Возможно ли в HDD Image Manager добавить конвертер .hdi в "самарский" формат?
-
? gid - 11.03.2023 10:55
Зачем? HDD Image Manager работает только с образами, он вообще не знает ни про какие форматы.
Для работы с логическими структурами в образах есть утилита BKHDDTool, одой из её функций как раз является конвертация между альтпро и самарским форматами
-
? Дмитрий - 15.03.2023 20:14
Вопрос по STST. Как я понял из описания и сырцов эмулятора, если метод адресации > 0, то получается адрес и последовательно пишется FEC и FEA. Причем независимо от метода, т.е. STST @(R0)+ получает адрес из R0, потом из этого адреса слово и по полученному пишется два слова. Точно также и STST @#1000 - FEC будет записан в @#1000, а FEA - в @#1002. Еще нашел в описании, что STST SP и STST PC вызывают illegal opcode. И непонятно, что выдаст команда, если не было ошибок - оба слова равны 0 или их значение неопределено после старта машины?
-
? gid - 15.03.2023 21:05
Я настолько не углублялся. Я вообще писал код, ориентируясь на драйвер эмулятора FPU-инструкций под RT-11. И только когда встречал там ошибки, смотрел описания по нужным командам в документации.
Точно не знаю, но полагаю, что после старта машины FPU будет проинициализировано и FEC и FEA будут иметь свои начальные значения.
FEC = 0, потому что ещё никаких ошибок не произошло, а FEA - без понятия, может 0, а может ещё что-то начальное, что может прийти в голову DECовцам.
-
? Дмитрий - 26.03.2023 12:08
Опять наткнулся на двоякое толкование. https://bitsavers.org/pdf/dec/pdp11/handbooks/PDP11_Handbook1979.pdf
¤
1) стр. 346 в самом низу.
¤
>> The FER bit is set by the FPP if:
>> 1. Division by zero occurs.
>> 2. Illegal OP code occurs.
>> 3. Anyone of the remaining occurs and the corresponding interrupt is enabled.
¤
т.е. получается, если мы заблокировали прерывание, допустим, по переполнению, то бит ошибки не будет выставлен в случае переполнения при вычислениях? Или все же будет выставлен при ЛЮБОЙ описанной ошибке?
¤
идем дальше. 2) стр. 350 вверху
¤
>> The FEC and FEA registers are updated when one of the following occurs:
>> • divide by zero
>> • illegal OP code
>> • any of the other five exceptions with the corresponding interrupt enabled
¤
опять-таки говорится, что FEC и FEA будут обновлены только, если разрешено прерывание
¤
и там же, чуть ниже:
¤
>> The FEC and FEA are not updated if no exception occurs.
¤
что это значит? Что если вычисление не привело, к примеру, к переполнению, то регистры не обновляются? Это понятно. Или же если при заблокированном прерывании произошло переполнение, но прерывания не происходит (заблокировано), то регистры тоже не обновляются?
¤
Из такого описания получается, что заблокируй прерывание по переполнению и хрен ты когда поймешь, что оно произошло. Бит ошибки не выставлен, регистр ошибок не обновлен, регистр адреса тоже.
¤
В догонку.
¤
1) В simh начальное значение FEC/FEA ноль.
2) Там же заметил, что команда CLRF не читает предыдущее значение как CLR(B), а сразу пишет ноль. В исходниках 4.2 бета читает. По идее можно вычисление адреса CalcArgAddrX воткнуть вместо вызова GetXdef.
-
? gid - 27.03.2023 09:51
Там есть две вещи: флаги FIUV,FIU,FIV,FIC которые разрешают реакцию на возникновение ошибки, если они не выставлены, то ошибка просто игнорируется.
И есть флаг FID, который запрещает генерацию прерывания по вектору 244.
FEC и FEA имеет смысл обновлять, только если флаг FID сброшен, т.е. разрешено делать векторное прерывание, иначе - нет смысла.
А если выставлены флаги FIUV,FIU,FIV,FIC и FID, то соответствующее прерывание происходит, но не генерируется векторное прерывание, просто выставляется флаг ошибки FER.
У меня в коде всё не так, там многое неправильно.
-
? Дмитрий - 10.04.2023 00:21
1) В одном хэндбуке написано, что бит FER сбрасывается только через LDFPS. В другом (PDP11_Handbook1979.pdf) - еще и с помощью RESET. Так на самом деле только LDFPS или еще и RESET? И раз можно сбросить, то можно и установить? Если можно установить, то не поломает ли это логику работы FPP?
2) Непонятно в описании MULF в разделе interrupts:
¤
>> If overflow or underflow occurs and if the corresponding interrupt is enabled, the trap occurs with the faulty results in AC. The fractional parts are correctly stored.
>> The exponent part is too small by 400(8) for underflow, except for the special case of 0, which is correct.
¤
глянул в simh - там тупо обнуляется, а тут написано, что дробная часть сохраняется. Так где правильно? И как понять: дробная часть сохраняется, а экспонента обнуляется чтоль? Умели тогда писать, что черта с два поймешь.
-
? gid - 10.04.2023 08:14
Может, дело в том, что было несколько версий fpp, и а разных хэндбуках написано про разные версии?
-
? Shestipalov@ - 11.05.2023 07:32
Сергей, привет!
.
Вопрос про новую версию эмулятора:
.
>Сэмулировано поведение регистра 177702, теперь, если в него что-нибудь записать, он исчезает, пока не будет выполнена команда EMT или перезагрузка.
.
Вот, к примеру, Prince of Persia (и, возможно, некоторые демы KUVO) по поведению этого регистра определял, на реальной БК он запущен или на эмулируемой, и соответственно, выставлял требуемые тайминги. Способ определения, кстати, посоветовал именно ты :-) Сейчас, получается, корректно определить, на чём запущена программа, не получается (или получится, но другим способом, и Prince окажется в пролёте). Можно ли эмуляцию поведения этого регистра сделать опциональной? И как лучше определять, что программа запущена под эмулятором? Нужен корректный способ, гарантированно работающий во всех версиях эмулятора.
-
? gid - 11.05.2023 08:23
Я не собирался его эмулировать, но в коде сетапа AZBK зачем-то делается проверка этого регистра, и если его поведение не как в реале, то нихера не работает.
У меня в эмуляторе была ошибка - из регистра читалось то, что туда было записано.
Можно сделать так, чтобы в него писать можно было всё, что угодно, но он не пропадал с шины, а из него всегда читалось -1.
-
? Shestipalov@ - 12.05.2023 16:26
Сергей, привет!
.
в версии v3.13.2305.10355 отключение эмуляции поведения регистра 177702 через ini не работает почему-то. В ini так:
Emulate C Bug = Yes
Emulate 177702 behavior = No
Emulate CPU 1801VM1G = No
Emulate EIS Instructions Set = No
Emulate FIS Instructions Set = No
.
но в Принце тайминги всё равно съехавшие. Проверь, пожалуйста. На заставке хорошо видно.
-
? Shestipalov@ - 12.05.2023 18:30
В общем, изменение поведения регистра 177702 работает нормально. Это Принцу надо обязательно прочитать из регистра то, что он туда записал, иначе считает, что работает на реальном железе, поэтому тайминги съезжают.
-
? gid - 12.05.2023 19:38
Ну а как иначе?
Записываем в 177702 любое число.
Потом читаем из 177702, если trap to 4, то реальное железо, если прочиталось не важно что, то эмулятор.
Или повторно записываем любое число, если trap to 4, то реальное железо, если нет - то эмулятор.
На реальном 1801ВМ1 регистр 177702 пропадает с шины после записи туда, пропадает вообще, не отзывается ни на чтение, ни на запись.
-
? KUVO@ - 22.05.2023 18:37
Сергей, доброго дня. Тут появился вопрос по эмулятору. Возможно ли сделать так называемую "перемотку вперед" ? На сегодня в эмуляторе есть изменение тактовой частоты CPU - отлично, полезная функция, но это изменение никак не влияет на кадровый фрейм, он всегда 50(48.8)Гц. Отсюда вопрос, возможно ли реализовать изменение тактовой частоты, которая будет влиять, в том числе и на кадровую задержку? Скажем, жмем на кнопку "перемотка вперед", автоматически выставляется большая (или максимально возможная) частота CPU, отключается стандартная кадровая частота (в ноль) - на экране "мельтешение", смотрим, ждем нужной части, увидели, отключаем "перемотку", автоматически возвращается стандартная частота CPU и восстанавливается кадровая частота отображения. Смотрим далее. Как-то так. Такое возможно?
-
? gid - 23.05.2023 07:55
Теоретически, если отвязаться от синхронизации со звуком, то такое вероятно возможно.
Но как это сделать так, чтобы не поломать вообще всё, я пока не представляю.
-
? litwr - 04.07.2023 21:35
Пришлось столкнуться с СМК-512. Захотел закинуть свои файлы на CF. И как бы, извиняюсь, запутался. :( Не могу понять зачем два формата HDI и IMG, почему бы эмулятору не работать сразу с IMG? Но это риторика, можно не отвечать. Проблема в другом. При конвертации IMG->HDI размер увеличивается примерно вдвое. Но совсем непонятно другое, обратная конвертация дает IMG-файл примерно того же размера, что и исходный HDI, т.е. раза в два больший исходного IMG. Как такой удвоенный файл писать на карту?
-
? gid - 05.07.2023 08:28
СМК-512 работает с HDD только в режиме CHS. То есть, где-то надо хранить параметры геометрии диска. Формат IMG - это линейная последовательность логических блоков, независимая от CHS, и там нигде не хранится информация о геометрии. Поэтому эмулятор принципиально не может работать с IMG поскольку не знает как интерпретировать данные.
формат HDI - это 512 байт заголовка + IMG.
При конвертации IMG->HDI размер увеличивается примерно вдвое потому, что выбраны неверные параметры CHS при конвертации. Размер зависит напрямую от них. А параметры CHS надо смотреть в паспорте CF который он выдаёт на команду идентификации устройства. Только сделать это всё труднее и труднее, поскольку уже никто давно этот режим не использует. Мне только утилиты под ms-dos для работы с HDD на ум приходят.
¤
Правда уже давно разработан формат HDIX, в котором используется обычный img и файл конфигурации к нему, но внедрить его в эмулятор сходу не получилось, и я на это забил пока.
-
? BD - 05.07.2023 10:18
Таблица разделов храниться в 7 блоке (8 секторе) служебной области. Данные идут в сторону уменьшения адресов (все данные слова):
0 - кол-во дорожек
-2 - кол-во головок
-4 - кол-во секторов
-6 - кол-во логических дисков (в старшем байте устройство загрузки по умолчанию A-0...C-2....) Записи о логических дисках идут по порядку, начиная с логического диска с номером 0. Формат записи следующий:
1 слово - номер головки (младшие 4 бита) и номер дорожки (остальные 12 бит)
2 слово - объём логического диска в блоках ( предполагается, что каждый лог. диск начинается с 1 сектора дорожки, определённый 1 словом).
-
? BD - 05.07.2023 10:41
Под служебные нужды отводится нулевая сторона (головка 0)
нулевой дорожки. Первые 7 блоков этой области занимает основной
загрузчик (Master Boot Record - MBR), который при каждой
загрузке с винчестера считывается в ОЗУ с адреса 10000 и
запускается, если его первая команда - NOP.
Каждая перезагрузка с НЖМД вызывает обновление в памяти ко-
пии таблицы разделов, области конфигурации и проверку их CRC.
В седьмом блоке (восьмом секторе) хранится копия области
ОЗУ 176000-177000.
-
? gid - 05.07.2023 11:33
А в самарском формате - всё по другому.
А на неотформатированном HDD вообще ничего нету.
Это я к тому, что параметры геометрии диска всё равно где-то надо хранить вне диска. Программа service2 например берёт их из паспорта HDD. Т.е. паспорт всё равно генерировать нужно. Поэтому проще создать его один раз и прицепить куда-нибудь.
К тому же не забываем, что HDI это не просто формат сам по себе, а часть программной эмуляции сложного устройства - HDD, содержащего внутри себя контроллер, ОЗУ и ПЗУ, в котором хранится управляющая контроллером программа.
-
? BD - 05.07.2023 11:48
..не плачь )) просто в HDDImgMakerDlg.cpp для СМК .hdi-}.img пользуй оригинальный паспорт, а не тот что заголовке .hdi %))
-
? gid - 05.07.2023 12:28
Ты не поверишь, но именно так оно и работает, даже более того, если формат разбивки в IMG не опознан, то сконвертировать его в HDI невозможно.
-
? gid - 05.07.2023 12:55
У меня для тестов есть три IMG образа HDD, два - с реальных старых HDD объёмом 31Мб и 120Мб и образ Volandа с его CF.
И удвоение размера делается только при конвертации образа Volandа потому что там задана какая-то вот такая геометрия диска.
Ладно. Сделаю я тогда такую штуку - не верить геометрии диска, верить фактическому размеру IMG образа.
-
? litwr - 05.07.2023 18:40
Для дисков больше 500 МБ в триаде CHS H=255 и S=63 почти определенно константы, а C определяется элементарной формулой по размеру образа. Нужна некая простая эвристика для определения геометрии, а проблема точности для всех случаев решается ручной вставкой параметров диска при подключении образа. Получается, что два формата - это скорее перебор.
-
? gid@ - 05.07.2023 22:20
Мы вынуждены работать в координатах реального пространства CHS, а не современного логического представления, которое есть просто заглушка. Потому что современные HDD уже просто неспособны работать в режиме CHS.
H не может быть 255, потому что в регистре 1F6 под головки отводится всего 4 бита. так что головок быть может только 16 максимум.
Зато цилиндров может быть 65536, потому что под них отводится два 8битных регистра 1F4 и 1F5
В образ Volanda параметры геометрии диска записаны программой разметки диска Service2 при создании таблицы разделов. Она взяла их из паспорта CF-карты, который выдаётся по ATA команде идентификации устройства. Вот чё там китайцы намудрили, то и выдало.
Я например, раньше на это внимания не обращал.
Теперь вот обратил, и вместо того, чтобы править геометрию, которую выдают HDD, я сделал опцию, чтобы пользователь сам решал, что делать - добивать размер образа в соответствии с геометрией диска, или ориентироваться на фактический размер образа.
Пока я в раздумьях, что делать, то ли перепаковать и обновить архивы с последней версией бинарников эмулятора, то ли сделать ссылку на скачивание отдельного исполняемого файла.
-
? litwr - 06.07.2023 06:00
Конечно, H=16. А у Воланда - https://forum.pk-fpga.ru/viewtopic.php?f=23&t=1555 - все правильно выписано C=1085, H=16, C=63, что даёт 1 ГБ.
-
? litwr - 06.07.2023 06:01
C=1985
-
? gid - 06.07.2023 08:05
У меня воландовский образ 1Gb_CF_dump_2022_11_14.img, там C=3884 H=16 S=63 Вот он превращается в 2 гига из одного.
-
? litwr - 06.07.2023 13:30
Но он же конкретно написал, С=1985, возле именно этого образа по указанной выше ссылке. Какое-то странное непонимание
-
? gid - 06.07.2023 15:57
Отнюдь. он конкретно написал это возле образа 1gb_cf_dump_2019_03_19.rar
А возле образа 1Gb_CF_dump_2022_11_14.rar ничего нету.
А править циферки конкретно в образе мне даже в голову не приходило.
-
? BD - 06.07.2023 17:39
не парься, завтра пересоберу и Voland отправлю.
-
? litwr - 06.07.2023 19:30
Вроде там как бы очевидно, что Воланд просто обновил содержимое, не меняя носитель. И, если бы HDDimgMaker позволял вручную вписать правильное значение, то проблемы бы не было.
-
? litwr - 06.07.2023 20:32
Плохо, что на эмуляторах БК клавиши цифровой клавиатуры не производят цифры, а многие RT11-игры используют именно цифровую клавиатуру.
-
? gid - 06.07.2023 20:40
Может и очевидно, я вот тоже раньше не замечал такой фигни, как удвоение размера. HDDimgMaker оберегает вас от опрометчивых действий. Потому что формат разметки разделов АльтПро жёстко привязан, прям гвоздями прибит к параметрам CHS. Все разделы всегда начинаются с первого сектора нулевой головки цилиндра. И если начать играться с геометрией как хочется, можно добиться гарантированно нерабочего результата.
И это, исходники проги свободно доступны, если код не самоочевиден, он снабжён комментариями. Всегда можно взять и поправить в программе то, что не нравится. Единственную сложность вижу я в том, что Visual Studio весьма жирное в плане размера установленных компонентов, и многие из них надо выбирать вручную, сами они ни за что не установятся. Долго скачивается, долго устанавливается.
И ещё, если у CF-карты параметры геометрии H или S отличаются от того, что в образе, то его бесполезно заливать в CFку, всё равно работать не будет. В этом случае нужно пересобрать образ под свою геометрию программой BKHDDTool.
-
? BD - 06.07.2023 21:13
BKHDDTool не понимает разделы более 1600 блоков (800Кб), если что... Q))
-
? gid - 07.07.2023 08:44
У тебя неправильный BKHDDTool, у меня всё понимает. Вот щас только что разобрал и собрал обратно образ в котором разделы размером 4000 блоков. Результат 1:1 с оригиналом.
Вот с разделами _меньше_ 1600 блоков есть проблема. Они при сборке увеличиваются до 1600.
Я уже не помню, зачем так сделал. Но видимо были причины. Из-за того, что образ дискеты, из которой делается раздел, может быть усечён, а в параметрах записано, что он 1600 блоков. А BKHDDTool считает размер раздела из физической длины образа. И если сделать такой неправильный раздел, он потом запорет следующий за ним.
-
? BD - 07.07.2023 18:04
затыкается на D http://mkdos.pdp-11.ru/1GB_SMK_30042023.rar
проще сам сделай ))
-
? BD - 07.07.2023 18:08
.img до 1гб резал руками
-
? litwr - 07.07.2023 19:25
Почему бы просто не впмсать правильное число 1985 для С?
-
? BD - 07.07.2023 20:00
кто тебе мешает? каждый сам творец своего счастья )) но хотелось бы штатными средствами, а не с https://mh-nexus.de/en/downloads.php?product=HxD20
возиться, ибо кривых образов развелось множество.. ((
-
? BD - 07.07.2023 20:02
купи CFку 2Гб - и отпустит ))
-
? gid - 07.07.2023 20:16
Да скачайте уже таки свежую версию https://gid.pdp-11.ru/f/HDDImageMaker.rar и узбагойтесь наконец
-
? BD - 07.07.2023 22:55
мумлятор надо пускать от админа, шоб в sevice2 "задание конфигурации" -> "встроенная конфигурация" и СОХРАНИТЬ работали..
спасибо!
¤
http://mkdos.pdp-11.ru/1Gb_CF_dump_2023_07_07.hdi.img.rar
-
? litwr - 08.07.2023 07:22
Не понял при чем тут китайский на mh-nexus? А со ссылкой беда - не работает она - https://drive.google.com/file/d/1GklpwHfjfGDlczTy8ywRDmaR5MmO3k15/view?usp=sharing :(
-
? Shestipalov - 31.07.2023 10:03
>Да скачайте уже таки свежую версию https://gid.pdp-11.ru/f/HDDImageMaker.rar и узбагойтесь наконец
.
Не работает ссылка: «Такая страница не найдена. Возможно её даже физически не существует.»
-
? gid - 31.07.2023 14:01
Потому что правильная ссылка вот такая https://gid.pdp-11.ru/f/HDDImgMaker.rar
Я спутал название программы и имя файла программы
-
? Maxvel@ - 07.08.2023 16:18
А что случилось с эмуляцией таймера на @#177706 - при старте программы с использованием этого таймера программа просто висит, после повторного запуска все работает как положено !!!
-
? gid - 07.08.2023 18:34
Не знаю. Я код таймера уже пару-тройку лет не трогал. В игре Kings Valley звук работает, значит таймер работает.
Пример неработающей программы в студию!
-
? Maxvel@ - 07.08.2023 23:18
Демка от муз, редактора Maestro (music3) ну и сами мелодии с исполняемым модулем (4 голосым), по началу думал что эта проблема МК или Андоса но нет на реальной машине все работает.
-
? gid - 08.08.2023 14:29
Оказывается, я таки трогал код таймера. Я там добавил эмуляцию особенностей процессора 1801ВМ1Г и ситуацию, когда бит 7 устанавливается в регистре 177712 только после второго события таймера. Но не учёл каких-то непонятных нюансов.
Именно поэтому "при старте программы с использованием этого таймера программа просто висит, после повторного запуска все работает как положено".
Нифига не могу понять, почему при двойной инициализации таймера всё работает как положено, в коде верилога нет ничего такого, чтобы это срабатывало.
¤
А на процессоре 1801ВМ1Г, если разрешить прерывания, судя по всему бит 7 в 177712 вообще не будет никогда устанавливаться и все проги, работающие с таймером не должны работать.
-
? Shestipalov@ - 04.09.2023 12:16
Сергей, привет!
Не знаю, может, известный глюк, но тем не менее — перезадание битов джойстика не работает. Изменённые данные не сохраняются. Неработающие контролы на картинке: https://ibb.co/wCTf6tD
Изменить можно, только напрямую редактируя ini.
-
? gid - 04.09.2023 13:01
Нет, это не известный, это совершенно новый глюк. Причина - я банально забыл про сохранение переназначенных битов, клавиши сделал, а про биты забыл. А мне никто не напомнил, что там не всё работает.
-
? Alexander "Sandro" Tishin@ - 12.09.2023 10:11
> Экспериментальные изменения со сбросом бита готовности в 177660, он теперь сбрасывается через некоторое время после чтения регистра 177662.
¤
¤
А каков смысл этого? Реальное железо сбрасывает сразу.
-
? gid - 12.09.2023 11:02
Это нужно для игры Bolder Dash 3, у которой в заставке клавиатура в эмуляторе ведёт себя неадекватно из-за того, что разрешены и обрабатываются прерывания от клавиатуры, и делается опрос получения нового кода клавиши в цикле командами tstb @177660 bpl .-4
Чтобы бит 7 в 177660 не успел сброситься при чтении регистра 177662 в обработчике прерывания.
¤
Может причина в чём-то другом, может в не правильной обработке прерываний. Может вообще где-то глюк, из-за которого сбрасывается бит 7 в PSW. Но этот хак улучшает ситуацию.
-
? Alexander "Sandro" Tishin@ - 12.09.2023 23:09
Это какая их проблемных версий болдера? Я в них запутался уже, мне страшно чинить поддержку болдеров ;)
¤
На самом дела на реале в такой ситуации код должен глючить, но таки ловить нажатие примерно в 60% случаев. Так как проверка прерываний происходит при чтении очередного опкода, кто не успел -- ждёт следующей команды. А за время декодирования опкода битик в порту может и перекинуться ...
¤
Но так делать с флагом как бы некорректно. Я бы лично наоборот выставлял прерывание после битика с задержкой на команду. Или даже на две. ИМХО, так корректней.
-
? gid - 13.09.2023 03:01
В этой теме, начиная с этого поста.
https://zx-pk.ru/threads/9907-pomogite-vspomnit-igru-).html?p=1182523&viewfull=1#post1182523
Там дальше и ссылки будут и описание проблемы.
Как ведёт себя игра на реале, я так и не проверил. Но в эмуляторе, нажатие и ловится если быстро-быстро долбить клавишу.
Я не могу выставлять прерывания произвольно. у меня цикл - { проверка запросов на прерывание, и если есть - генерация, если нету - чтение и выполнение опкода }. Попытки как-то модифицировать цикл приводят к разного рода глюкам, так что я его не трогаю.
Запрос на прерывание от клавиатуры генерируется при нажатии на клавишу клавиатуры ПК асинхронно, а обработается тогда, когда в цикле время придёт.
-
? Shestipalov@ - 07.10.2023 17:11
Сергей, привет!
¤
В Руководстве пользователя эмулятора, в Приложении 2 — Описание ключей в файле «bk.ini», там, где приведены названия конфигураций эмулятора, у тебя адская подстава — в названии конфигурации «BK-0011М» М - русская. В результате, если скопировать название конфигурации из Руководства в cmd-файл, получится нехорошо, конфигурация не включится, и гражданин будет ломать голову, почему :-)
-
? gid - 09.10.2023 08:33
А писал бы гражданин собственными ручками, вместо копипастенья, то и проблем бы у него не возникало.
Русская буква попала туда из-за массовой автозамены. В тексте повсеместно упоминается БК-0011М, вот и получилось так, как получилось.
-
? Дмитрий - 24.10.2023 22:23
gid, я уже чет ваще подзабыл - в БК как ведут себя регистры состояния/ошибки при отсутствующем винте? Как определяем, что винта нет? Drive Ready отсутствует - это понятно, а Busy выставлен всегда? Или только регистр падает в бесконечный Busy после посылки любой команды? В сырцы глянул, но не нашел - видать к ночи башка плохо варит.
-
? gid - 25.10.2023 08:41
Регистры ведут себя как обычно, выдают какую-то информацию.
ПЗУ СМК например проверяет наличие винта так:
Ждёт когда пропадёт сигнал BSY в регистре состояния 1F7, и когда пропал, ждёт, когда появится сигнал DRDY, если появился, значит винт есть, если за достаточно долгое время не появился, значит винта нет или неисправен.
Если винта физически нет, то с шины читаются нули, но данные считаются инверсными, т.е. полагается что все биты установлены, т.е. считается что BSY всегда установлен, и до проверки DRDY не доходит, после довольно долгого ожидания, BSY так и не снимается и всё, считается что винта нету.
-
? Шестипалов@ - 06.12.2023 20:42
Сергей, привет.
.
В телеграммовском чате нашли неточность в эмуляторе:
.
На реальной БК11М в режиме БК10 (с загруженным монитором тобишь) комбинация СУ-АР2-Ж включает режим ЗАП.В эмуляторе — нет.
.
Простенькая программа позволяет понять, что реальной БК11М СУ-АР2-Ж вырабатывает код 226, а в эмуляторе код 266.
.LA 1000
1$: EMT 6
MOV R0,R2
CALL OCTOUT ;вывод восьм числа из R2
MOV #12,R0
EMT 16
BR 1$
Есть мнение, что надо исправить. БК0010-01 не проверяли, но очевидно, поведение такое же.
-
? gid - 07.12.2023 09:33
Там дело не в типе БК и не в загруженном мониторе.
Там опечатка, или старый не подчищенный хвост от переделки эмуляции клавиатуры. Ошибка в таблице раскладки виртуальной кнопочной клавиатуры, там сканкод кнопки V/Ж вместо 0126 стоит 0166, т.е. строчная буква, вот всё и не работает. В виртуальной плёночной клавиатуре такой ошибки нет. И если руками комбинации клавиш нажимать, тоже ошибки нету, единственное неудобство - надо смотреть на раскладку клавиатуры, в русской раскладке надо жать СУ-АР2-Ж, в латинской - СУ-АР2-V
¤
Т.е. СУ-АР2-Ж криво работает только в одном единственном случае из трёх возможных вариантов.
Вот неохота из-за такой мелочи новую версию делать.
¤
Тут вот меня на zx-pk на идею натолкнули - в окошке настроек, где монтируются образы дискет и hdd сделать кнопку для генерации новой чистой дискеты, и чтобы она в дисковод монтировалась. (и сразу предупрежу, с hdd это не прокатит, и не просите) Это сделать совсем не трудно, но вот надо ли? Я такие действия в файловом менеджере делаю, просто копирую первый попавшийся образ под новым именем и использую его как новую дискету. Делать такие вещи из-под эмулятора мне и в голову не приходило. Нужна вообще такая фича кому-нибудь?
-
? Shestipalov@ - 12.12.2023 09:12
>Нужна вообще такая фича кому-нибудь?
.
Лично я поступаю так же — копирую существующий образ, потому инициализирую как надо и так далее. Думаю, и остальные делают так же. Т.е., прям вот такой жёсткой необходимости в этом нет. С другой стороны, инструмент, позволяющий создать образ дискеты вообще с нуля — всё-таки наверно нужен. В общем, лично моё мнение — фишка не помешает, но от её отсутствия сильно страдать никто не будет. Есть более важные точки приложения сил в эмуляторе :-)
-
? Manwe - 12.12.2023 11:22
Чистые диски нужны – их плюс в том, что они забиты нулями и хорошо упаковываются. Я часто делаю образы дискет, на которых мало данных (например, записана одна демка), и мне хочется чтобы размер архива отражал реальный размер программы.
А если просто инициализировать каталог старого образа дискеты, она останется забита мусором и не упакуется.
-
? Shestipalov@ - 19.01.2024 07:02
Сергей, привет.
.
Ещё ошибку в эмуляторе нашли — на виртуальной клавиатуре невозможно ввести символ = (знак равенства).
И на плёночной, что кнопочной не получается.
-
? gid - 19.01.2024 08:57
Качайте новую версию. Там этой ошибки уже нету.
-
? Shestipalov@ - 21.01.2024 17:50
Спасибо за новую версию! На сей раз ошибку в документации нашли:
.
https://gid.pdp-11.ru/books/00001-01.32.03.html#_Toc381877523
.
В Приложении 3 (Таблица кодов символов Микро-ЭВМ) не указана клавиша ТАБ (код 200).
-
? gid - 21.01.2024 18:48
Не вижу никаких ошибок. Я просмотрел оба имеющихся у меня варианта бумажных изданий документа 00001-01.32.03. Нигде клавиша ТАБ (код 200) не указана. Значит её официально нет. Это недокументированная фича.
-
? Shestipalov@ - 21.01.2024 19:06
Вот те раз, клавиша есть, а описания — нету. Почти анекдот :-) Ну может имеет смысл в документации вставить строку с кодом ТАБ рядом с ПОВТ (адрес вектора прерывания — 274), и указать, что в оригинальной документации эта строка отсутствует. Это же явная ошибка.
-
? gid - 22.01.2024 08:32
Ну добавить то не трудно. Тем более что я в распознанных документах исправляю опечатки и замеченные ошибки без указаний, что в оригинальном документе тут ошибка или опечатка.
А как насчёт остальных кодов, которых нет в таблице? Мне вот честно говоря было лень перепроверять по исходникам монитора, что там и как.
-
? litwr - 16.07.2024 13:44
Интерсный глюк обозначился. Давно не gid-бк не запускал, больше года. И сразу обнаружился приятный сюрприз, автор смог осилить полный газ, возможно единственный из всех отечественных эмулятороделов. Может автора уже эвакуировали? Но скорее ещё нет, так как глюк. Полный газ сделан явно не на импортных технологиях, которые отлично работают уж лет более 30, а на каких-то аналоговнетных. В АнДОС или МкДОС мой калькулятор числа пи работает с полным газом отлично, но запускаю ОС БК-11 и начинается аналоговнет. Все тайминги на полном газу рушатся. :(
-
? gid - 16.07.2024 14:24
Чорт. Мне так стыдно. Я не знаю, а что такое полный газ?
Итакида, БК - это полный аналоговнет, там есть уникальная микросхема К1801ВП1-037, которой нету больше ни у кого, и на загнивающем западе такое тоже не смогли придумать.
-
? litwr - 17.07.2024 00:23
В старом эмуляторе БК Брухиса полный газ есть, но включается только в командной строке. Прикрутил к нему клавишу, которая переключает нормальную скорость и максимальную. Где-то в телеграме выкладывал сорцы. Так что дело не в уникальных чипах. При полном газе, машинка работает внутренне как обычно, но без синхронизации с реальным временем. Типа нажали на клавишу R быстро, а она раз 50 успевает отжаться RRRRRRRRRRRRRRRRRRRRRR... :) У вас так примерно и работает с большинством программ, а под ОС БК-11 глючит. И это что-то реально аналоговнетное. Типа проц разгоняется в реальном времени, а таймер отмораживается. И не могу понять зачем разгонять в реальном времени, когда есть стандартные реальные частоты 3, 4 и 6?... Кстати, Леонид эвакуировался уж лет 30 как.
- << Форум