-
- ? Дмитрий
- 13.07.2020 10:32
Благодарю, поковыряю на досуге.
- ? Дмитрий
- 26.06.2020 17:27
Переписал с небольшой оптимизацией эмулятор IDE на чтение/запись единым блоком - скорость стала ~13...16,7Мб/сек, неплохо.
- ? Дмитрий
- 22.06.2020 17:29
Судя по докам, из SLEEP, кроме внешнего сброса, накопитель поднимается командой DEVICE_RESET 0х08.
- ? Дмитрий
- 22.06.2020 16:42
В данной реализации намешаны стандарты. Если используется бит 7 (HOB) в 3F6, то из оставшихся используются только биты 1 - Interrupt Enable и 2 - Soft Reset, а остальные считаются зарезервированными. Регистр же 3F7 не используется вообще. Вот что о нем пишут:
¤
Регистр адреса устройства DriveAddr (3F7h, 377h) использовался только в первой версии ATA для совместимости со старыми контроллерами, чтением этого регистра можно было определить адресованный привод и головку. Регистр выпадает из блока (он совпадает с диагностическим регистром состояния контроллера НГМД) и рекомендуется, чтобы устройство ATA не отвечало на чтение этого регистра. Если устройство отвечает на чтение, то оно не должно управлять битом DD7 во избежание конфликта с контроллером НГМД, у которого по этой линии передается бит смены носителя. Из-за несоблюдения этого требования могут возникать проблемы, когда контроллер (адаптер) ATA и контроллер НГМД находятся на разных платах.
- ? Дмитрий
- 19.06.2020 17:14
проверку STATUS_DRQ проглядел - второй вопрос отпадает.
- ? Дмитрий
- 19.06.2020 16:47
Ну вообще реализация этого момента странная. Можно (и нужно) различать кому подается команда по выставленному биту Master/Slave - он к моменту подачи команды накопителю обязательно должен быть выставлен. Соответственно читать/писать регистры тоже, а не смешивать данные из обоих каналов. Диагностическая команда также должна посылаться конкретному винту.
¤
Остался неясным момент в режимах выполнения команд чтения/записи: можно ли писать данные в регистры адресации винта при выполнении операций чтения и записи. К примеру, выставили адресацию, подали команду чтения, винт считал и выдал бит ожидания съема данных, а пользователь, допустим, стал баловаться записью в 1F2-1F5. А в эмуляции защита от этого не предусмотрена и в seek следующий сектор увеличивается прямо в регистрах. И как должен отреагировать винт на подачу команд IDLE/RESET/DIAGNOSTIC/RECALIBRATE/SLEEP/STANDBY? Сброс буфера сектора вместо ожидания съема данных, запись на диск того, что успели передать для записи, отменяется ли команда чтения/записи подачей этих команд?
- ? Дмитрий
- 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;
}
- ? Дмитрий
- 18.06.2020 16:39
Мои соболезнования
- ? Дмитрий
- 13.05.2020 11:21
Кстати, при включении этого таймера первое прерывание происходит сразу после включения или все же по истечению интервала?
- ? Дмитрий
- 04.03.2020 09:33
>> То есть, какой поток первым начал рисовать, такой и числится владельцем прав рисования.
В том-то и закавыка, что поток, который нормально отрисовывает в первом случае, во втором варианте не создается и ничего не рисует, т.е. тапки достались основному потоку. К тому же либа vfw32, как пишут в инете, использует прямой доступ к видеопамяти для рисования (и рекомндуют создавать буфер для рисования, совпадающий по глубине цвета с десктопом), если не указан ключ DDF_JUSTDRAWIT, который использует GDI. Так что по идее она должна отрисовать где угодно. Но оказалось это не так. Видимо, полученный HDC оказался неверным и отрисовалось на нем "где-то там".
- ? Дмитрий
- 03.03.2020 15:16
Так никакие параметры не меняются. Код инициализации тот же, не меняется. Просто вызов DrawFrame не из потока, а по нажатию, допустим, кнопки или пункта меню.
- ? Дмитрий
- 03.03.2020 14:41
Отрисовал в bitmap единичный вызов - рисует, а на форму - нет.
- ? Дмитрий
- 03.03.2020 14:36
gid, столкнулся с интересным моментом. Вывожу изображение из буфера с помощью DrawDibDraw, она расположена в п/п рисования кадра. Если она работает в другом потоке (просто вызов отрисовки, задержка), то все прекрасно - изображение выводится. Но! Стоит не создавать поток, а вызвать отрисовку единичного кадра из основного потока приложения вызовом все той же п/п рисования кадра, то ничего не выводится. DrawDibOpen отрабатывает нормально, CreateDIBSection тоже, DC получается прямо перед вызовом (освобождается сразу после отрисовки), в битовом массиве данные картинки есть, DrawDibDraw возвращает true. А на форме ничего нет. Ничего не меняется, кроме места вызова. Покопался в инете, чет ничего толком не нашел в чем может быть проблема.
- ? Дмитрий
- 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, который устанавливала эта команда? Он вроде не описан.
- ? Дмитрий
- 27.02.2020 09:42
Добавьте в ассемблер псевдокоманду, к примеру, .RAM X,Y и .ROM X для подключения соответствующих страниц, а транслятор переведет ее в MOV #константа,@#177716
- ? Дмитрий
- 26.02.2020 14:44
gid, еще пара вопросов:
1) При повышенном приоритете процессора блокируются прерывания клавы по 60/274 и таймеру по 100 вектору. Что еще блокируется? Я так понимаю прерывания по 4/10/14/24/30/34 векторам работают.
2) Что за магическая константа 1330 (728.) в 177664? Число ТВ-строк? Получается записав 730 (472.) мы крутанем экран на все 256 строк вниз, а 1730 на полный экран вверх? Или не так?
- ? Дмитрий
- 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)?
- ? Дмитрий
- 05.02.2020 10:02
Убрал нафик прерывание по NaN, перед и после операций проверяю на NaN/Inf и меняю на ноль в случае обнаружения. И код короче и удобнее.
- ? Дмитрий
- 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 должен быть быстрее, но он оказался заметно медленнее регистрового варианта. Видимо вычислительные конструкции в операндах требуют гораздо больше тактов, чем просты операции и в сумме они оказываются медленнее.
- ? Дмитрий
- 16.01.2020 16:48
gid, я не совсем понял - у MFPS проверка результата для установки признаков происходит как байта или слова? Там сначала расширяется знак, а потом проверка. Судя по коду - байта. Но для чего расширение знака до слова?
- ? Дмитрий
- 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?
- ? Дмитрий
- 21.10.2019 11:43
В хэндбуках ПДП11 время выполнения только в мкс или нс, никаких тактов. Придется ковырять имеющиеся данные, где все в тактах. Либо все же забить и сделать время выполнения всех команд усредненно одинаковыми. Мб еще где-то есть таблицы?
¤
>> не имея никаких точек отсчёта времени
Точка отсчета есть. К примеру, суммируем все выполненные команды по тактам с момента запуска ЦПУ. В нужный момент считываем переменную с "выполненными" тактами, отсчитываем время, снова считываем. Разница и будет кол-во выполненных тактов за период. Вроде все норм, но есть закавыка. Разброс по кол-ву тактов на команду часто очень велик. Там, где будут вычисления с MUL/DIV или FPU, "тактовая скорость" будет высокой, а где интенсивная работа с регистрами - наоборот низкой. Потому как хост-проц выполняет команды очень быстро. А это значит, что "частота" будет прыгать вверх-вниз до 10 раз, а мб и больше. Так-то, в принципе, эта скорость чисто для информации, роли она не играет.
- ? Дмитрий
- 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, где кол-во тактов практически идентично.
- ? Дмитрий
- 18.10.2019 15:49
Еще вопрос по таймеру. Бит STOP служит только для принудительного ручного отключения таймера в любых режимах? Должен ли он выставляться при завершении счета в режиме ONESHOT или фактом завершения служит сброшенный бит RUN?
- ? Дмитрий
- 30.07.2019 10:18
s160000
- ? Дмитрий
- 18.06.2019 11:51
Как говорится, дело было не в бобине... Использовал другой эмулятор чипа - там все отлично звучит. генерацию потока сделал как и раньше через QueryPerformance. Сначала ступил - сделал съем показаний перед задержкой, но ПОСЛЕ генерации сэмпла. Звучит также, но данные в wav отличаются. Переставил съем ПЕРЕД генерацией и теперь даже звуковые данные в wav идентичны.
- ? Дмитрий
- 17.06.2019 17:00
Не, вариант с частотой чипа не работает - воспроизводятся отдельные ноты с большими паузами. Частота 14,3Мгц, дискретизация 44100, 16 бит, моно.
- ? Дмитрий
- 17.06.2019 16:34
Там задержки по-другому сделаны. Есть насколько вариантов формата. В данном музоне используется 280Гц цикл (в других 560 и 700Гц). В 1 сек 280 тактов. Так вот задержка указывается как число этих 1/280 тактов. Да и музон так, для проверки. Запись в регистры будет осуществляться из программы в эмуляторе, а я в потоке формирую звуковые буферы. Я пока пишу поток заполнения, проверяю его этим музоном, а потом в эмуляторе напишу программу записи этого дампа в регистры и опять проверю как выводится звук.
- ? Дмитрий
- 17.06.2019 14:07
gid, нужен совет. К чему привязываться при генерации звука, если я убрал фреймы? Никаких счетчиков нет. У OPL, как и у AY, своя частота дискретизации звука. И для его получения нужно 44100 (или 48000) раз в секунду генерировать сэмплы от эмулятора чипа. Но поскольку я понятия не имею как программировать AY (не говоря уже про OPL, у которого 200+ регистров) и как заполнять буфер, стал искать пути проверки. Нашел музон от старой игрушки, там тупо дамп регистров с задержками. Попробовал написать тестовое приложение. В нем в потоке привязался к таймеру QueryPerformance и в цикле генерирую сэмпл, жду задержку и снова генерирую. Музон вроде звучит, но как-то не так. Причем в DOSBox't в игре он же звучит сочно и отлично. В двух других плеерах он звучит по-другому, у меня звучит примерно как в них, но отличается. Чую, что я неверно снимаю сэмплы с эмулятора - видимо где-то пропуск и ноты звучат как-то отрывисто. Я в генерации звука чайник еще тот, ни разу не сталкивался до этого.
- ? Дмитрий
- 17.05.2019 00:41
У микроконтроллера, скорее всего, своя прошивка - без нее он бесполезен.
- ? Дмитрий
- 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
- ? Дмитрий
- 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 09:44
Насчет ADC(B)/SBC(B). В доках по ПДП написано, что у ADC бит V устанавливается, если результат до сложения был равен 077777 и бит С=1. А бит С устанавливается в случае dst=177777 и С=1. У SBC аналогично, но другие значения. Так вот вопрос состоит в том, что для словных и байтовых операций проверяется одно и тоже значение (хотя это бред при байтовой операции проверять 077777) или же соответствующее байтовое значение (для 077777 это 177, для 177777 - 377)?
- ? Дмитрий
- 21.03.2019 15:34
Кстати, ASHC тест у меня полностью проходит, но я не увидел там циклического сдвига (аналог ROL/ROR интела) при нечетном регистре. MOV #-1,R3 + ASHC #20,R3 тест проверяет R3=0, а ROL/ROR дал бы тоже самое число - 177777.
- ? Дмитрий
- 20.03.2019 14:20
В дизассемблированном исходнике теста ошибка (тест ASHC)
¤
; apar0 - значение младшего слова для сдвига
; apar1 - значение старшего слова для сдвига
; apar2 - параметр сдвига
; apar3 - значение младшего слова для контроля
; apar4 - значение старшего слова для контроля
; apar5 - контрольное PSW для сравнения
¤
apar0/apar3 - СТАРШЕГО, а apar1/apar4 - младшего. Иначе при реализации неверное размещение данных вызовет ошибку в #102 тесте (установятся N и V), контрольное PSW равно 0.
- ? Дмитрий
- 14.03.2019 21:13
Чуток допилил у себя асм-версию - теперь все 52 теста пройдены.
- ? Дмитрий
- 14.03.2019 16:15
Блин, в 47 тесте 177777 сдвигается. Выходит, бит V учитывается после каждого сдвига.
- ? Дмитрий
- 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 01:08
Глянул исходник. Да, припоминаю - тут малех пришлось руками переписать exit() и integer(single). Однако после этого все собирается Д7 и раотает. И приложенный готовый exe также работает нормально - я проверял им правильность.
¤
>> Даже подкачки нет.
Вот поэтому и не работает. Включить обратно, но поставить размер свой, а не по выбору системы. Диспетчер памяти винды не работает нормально без файла подкачки.
- ? Дмитрий
- 14.03.2019 00:55
У меня этот релиз и есть. Он работает на ура, компилирует тестовые (другие не пробовал).
- ? Дмитрий
- 14.03.2019 00:41
Хз, у меня все работает, Д7 его компилит на ура.
- ? Дмитрий
- 13.03.2019 22:08
>> но на дельфе прожечки кодить. под этот бэээка
http://mads.atari8.info/ поляки забабахали паскаль для 6502, довольно развесистый. У меня не хватило сил раскорвырять его. Мб вам удасться?
- ? Дмитрий
- 13.03.2019 21:13
>> Gcc собирать PDP-11-ый
Нафик мне пдпшный? К тому же он Vslav'ом собран давно. Я про 32-битную БК - для нее бэкэнд забабахать. Не на асме же писать всю дорогу, хотя асм мне больше по душе.
- ? Дмитрий
- 13.03.2019 19:51
>> порою решалась прыжочками на другие джампы
Вот этот огород я не хотел городить. Поэтому сделал 16-битное смещение.
¤
>> И как обычно я нихрена не понял как сделан там, этот фронт энд генератора кода
Только не фронтэнду, а бэкэнду. Я тоже не понял. Код вообще недокументирован, инфы нет, руководства по добавлению своей архитектуры нет. Проще в gcc добавить и собрать - там хоть в коде комменты есть что зачем почем для чего.
- ? Дмитрий
- 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, но расширен.
- ? Дмитрий
- 13.03.2019 16:35
>> А команда MOV PC,R1 нужна только для того, чтобы узнать, если нарушен порядок тестов, где именно он нарушен.
То есть в самих тестах как параметр он не участвует?
¤
>> MUL-то не факт что работал в к1801вм1"Г", как надо. И то, там эмуляция чтоли была
Я другое делаю - 32-битную БК, там все "аппаратно", если можно так выразиться.
¤
Ошибку нашел, продвинулся до 11(8) ошибки.
- ? Дмитрий
- 13.03.2019 14:58
Тест 791402 жестко привязан к адресам? Там используется часто MOV PC,R1. А то у меня ошибка 1 уже на первом тесте.
- ? Дмитрий
- 13.03.2019 10:38
Кстати, и у делителя тоже такая же петушня.
- ? Дмитрий
- 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?
- ? Дмитрий
- 11.03.2019 22:38
>> Старый добрый прямой вывод на экран
Я как раз primary поверхность и пользовал. Работал на НВ. Но я выводил 16-битное изображение прямым копированием в битовый массив поверхности.
-
1 | 2 | 3 | 4 | 5 | ... | 9 | »
?