Обновил эмулятор до версии 2752:
- исправлена эмуляция флагов процессора IFF1/IFF2
- исправлен маппинг памяти для QUORUM
- исправлены тайминги для NMI/RESET
http://savepic.org/3562669.png
Вид для печати
Обновил эмулятор до версии 2752:
- исправлена эмуляция флагов процессора IFF1/IFF2
- исправлен маппинг памяти для QUORUM
- исправлены тайминги для NMI/RESET
http://savepic.org/3562669.png
На радостях допилил маппинг DirectInput-джойстика на кемпстон.
А можно добавить второй HDD, Master/Slave в Profi.
Обновил до версии 2753:
- дебагер: добавлен индикатор LPC (значение PC последней выполененной инструкции - удобно для поиска откуда произошел вызов подпрограммы)
- добавлена поддержка джойстика (за что благодарим Eltaron'а :))
- изменено расширение файла CMOS PENTEVO на "cmos" (вместо "eeprom")
- добавлен монитор аппаратных значений (см. Memory Map для PENTEVO/ATM/PROFI)
http://savepic.org/3543977.png
---------- Post added at 02:41 ---------- Previous post was at 02:38 ----------
можно, он будет добавлен, когда прикручу гуй для настройки IDE
понял, спасибо.
и ещё тогда вопрос (т.к. в данный момент проверить не могу):
можно ли назначить Kempston-джойстик на определённый номер DirectInput-девайса в системе?
например, у меня три геймпада Xbox 360, первые два у меня замаплены на Sinlcair 1 и 2 через Joy2Key, а третий я бы замаппил на Kempston через сам ZXMAK2.
сейчас запустил 2753, чтобы посмотреть реализацию Kempston-джойстика.
в дефолтной конфигурации Pentagon'а его нет, что есть хорошо. добавляется отдельным девайсом из Others.
Вот как-то так.
Но код пока что переполнен вызовами статических методов и мне за него стыдно :)
ZXMAK, а есть возможность из экземпляра устройства достучаться до виртуальной машины? Мне надо сказать ей какой именно джойстик опрашивать. Я бы мог, конечно, опрашивать все, но не уверен, что это не вызовет конфликта, если джойстик уже занят тем же Joy2Key.
А хотя даже не до виртуальной машины, а до хоста надо добраться. Ну нафиг, проще событие назначить.
можно идентифицировать джойстики по имени. Имя сохранять в конфиге. Но нужно будет продумать как оптимальнее сканирование сделать чтобы сканить только джойстики которые реально используются.
Кстати, давно напрашивается мысль сделать все порты девайсов настраиваемыми через конфиг.
Здравствуй, интернет :)
http://zx.pk.ru/picture.php?albumid=117&pictureid=783
Это-то уже работает. Там архитектурная проблема в виде необходимости увеличить связность кода.
А скриншот выше - это Hayes-модем заэмулированный. Вот он скромненький по архитектуре, даже в виде плагина скомпилировался :)
А с джойстиком так и не могу придумать способа красиво его встроить. Всё одно выходит, что надо или экземпляр виртуальной машины вниз к устройствам пробрасывать, или BusManager нагружать дополнительными методами, притянутыми за уши. Ни тот, ни другой способы мне не нравятся, а глубоко всё рефакторить не вижу смысла, так как всё равно автору видней, как и куда эмулятор развивать.
В принципе, оно и так работает :)
добавил выбор джойстика и хаес модем.
Довольно сильно поменялся код джойстиков, нужно проверить как работает.
При выборе джойстика можно также выбрать "Keyboard Numpad" для эмуляции джойстика на нумпадной клавиатуре
Проверьте, жду результатов, если все ок, зачекиню и сделаю релиз.
джойстик работает нормально
http://i.imgur.com/ypG88ri.png
это норма?
В этом списке отображаются COM порты хост машины, если ком портов на машине нет, то так и будет
---------- Post added at 03:55 ---------- Previous post was at 02:10 ----------
Обновил эмулятор до версии 2754:
- добавлен хаес-модем написанный Eltaron;
- добавлена возможность выбора джойстика хост-машины
- добавлена возможность выбора джойстика на клавиатурном нумпаде.
http://savepic.org/3583645.png
С джойстиками замечено два бага:
1. От этого падает если в системе два или больше джойстиков:
Скрытый текст
Error 13:53:04.953 Exception System.Reflection.TargetInvocationException: Адресат вызова создал исключение.
в System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
в System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
в System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
в System.Activator.CreateInstance(Type type, Boolean nonPublic)
в System.Activator.CreateInstance(Type type)
в ZXMAK2.Controls.FormMachineSettings.CreateConfigScreenControl(BusManager bmgr, Object objTarget) в c:\Projects\zxmak2-clean\ZXMAK2\Controls\FormMachineSettings.cs:строка 404
в ZXMAK2.Controls.FormMachineSettings.initWorkBus() в c:\Projects\zxmak2-clean\ZXMAK2\Controls\FormMachineSettings.cs:строка 460
InnerException System.InvalidOperationException: Сбой при сравнении двух элементов массива.
в System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
в System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
в System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
в System.Collections.Generic.List`1.Sort()
в ZXMAK2.MDX.DirectJoystick.Select() в c:\Projects\zxmak2-clean\ZXMAK2\MDX\DirectJoystick.cs:строка 352
в ZXMAK2.Controls.Configuration.CtlSettingsJoystick.BindTypeList() в c:\Projects\zxmak2-clean\ZXMAK2\Controls\Configuration\CtlSettingsJoystick.cs:строка 28
в ZXMAK2.Controls.Configuration.CtlSettingsJoystick..ctor() в c:\Projects\zxmak2-clean\ZXMAK2\Controls\Configuration\CtlSettingsJoystick.cs:строка 22
InnerException System.ArgumentException: По крайней мере в одном объекте должен быть реализован интерфейс IComparable.
в System.Collections.Comparer.Compare(Object a, Object b)
в System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)
в System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[] keys, IComparer`1 comparer, Int32 a, Int32 b)
в System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer)
в System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
---
Full StackTrace:
в ZXMAK2.LogAgent.Error(Exception ex)
в ZXMAK2.Controls.FormMachineSettings.initWorkBus()
в ZXMAK2.Controls.FormMachineSettings.Init(VirtualMachine vm, RenderVideo renderVideo)
в ZXMAK2.Controls.FormMain.menuVmOptions_Click(Object sender, EventArgs e)
в System.Windows.Forms.MenuItem.OnClick(EventArgs e)
в System.Windows.Forms.MenuItem.MenuItemData.Execute()
в System.Windows.Forms.Command.Invoke()
в System.Windows.Forms.Command.DispatchID(Int32 id)
в System.Windows.Forms.Control.WmCommand(Message& m)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ScrollableControl.WndProc(Message& m)
в System.Windows.Forms.ContainerControl.WndProc(Message& m)
в System.Windows.Forms.Form.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.Run(Form mainForm)
в ZXMAK2.Program.Main(String[] args)
[свернуть]
Фикс простой:
Скрытый текст
Код:Index: HostDeviceInfo.cs
===================================================================
--- HostDeviceInfo.cs (revision 26670)
+++ HostDeviceInfo.cs (working copy)
@@ -2,7 +2,7 @@
namespace ZXMAK2.Entities
{
- public class HostDeviceInfo
+ public class HostDeviceInfo : IComparable
{
public string Name { get; private set; }
public string HostId { get; private set; }
@@ -17,5 +17,10 @@
{
return Name;
}
+
+ public int CompareTo(object obj)
+ {
+ return ToString().CompareTo(obj.ToString());
+ }
}
}
[свернуть]
2. От этого не падает, но джойстики просто не работают в некоторых случаях:
Скрытый текст
Error 14:01:17.332 Exception System.InvalidOperationException: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "FormMain" не из того потока, в котором он был создан.
в System.Windows.Forms.Control.get_Handle()
в Microsoft.DirectX.DirectInput.Device.SetCooperativeLevel(Control parent, CooperativeLevelFlags flags)
в ZXMAK2.MDX.DirectJoystick.CaptureHostDevice(String hostId) в c:\Projects\zxmak2-clean\ZXMAK2\MDX\DirectJoystick.cs:строка 101
---
Full StackTrace:
в ZXMAK2.LogAgent.Error(Exception ex)
в ZXMAK2.MDX.DirectJoystick.CaptureHostDevice(String hostId)
в ZXMAK2.Engine.InputAggregator.Capture()
в ZXMAK2.Engine.InputAggregator..ctor(IHostKeyboard hostKeyboard, IHostMouse hostMouse, IHostJoystick hostJoystick, IKeyboardDevice[] keyboards, IMouseDevice[] mouses, IJoystickDevice[] joysticks)
в ZXMAK2.Engine.VirtualMachine.runThreadProc()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
[свернуть]
Фикс:
Скрытый текст
Код:Index: DirectJoystick.cs
===================================================================
--- DirectJoystick.cs (revision 26670)
+++ DirectJoystick.cs (working copy)
@@ -69,6 +69,13 @@
}
}
+ // Should be executed in the FormMain thread
+ public delegate void FormMainDelegate(Form form, Device joystick);
+ public static void SetCooperativeLevel(Form form, Device joystick)
+ {
+ joystick.SetCooperativeLevel(form, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
+ }
+
public void CaptureHostDevice(string hostId)
{
try
@@ -98,7 +105,8 @@
var joystick = new Device(deviceInstance.InstanceGuid);
try
{
- joystick.SetCooperativeLevel(m_form, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
+ // multithreaded joystick.SetCooperativeLevel analogue
+ m_form.Invoke(new FormMainDelegate(SetCooperativeLevel), m_form, joystick);
joystick.SetDataFormat(DeviceDataFormat.Joystick);
joystick.Acquire();
}
[свернуть]
---------- Post added at 14:27 ---------- Previous post was at 14:17 ----------
Ага. Или модем, или сотовый через шнурок, или сотовый через блютуз. В двух последних случаях только надо чтоб при этом виртуальный COM-порт создавался.
---------- Post added at 14:41 ---------- Previous post was at 14:27 ----------
И наверное есть смысл сделать так:
Скрытый текст
Код:Index: CtlSettingsJoystick.cs
===================================================================
--- CtlSettingsJoystick.cs (revision 26670)
+++ CtlSettingsJoystick.cs (working copy)
@@ -37,7 +37,7 @@
m_bmgr = bmgr;
m_device = device;
- cbxType.SelectedIndex = -1;
+ cbxType.SelectedIndex = 0;
for (var i = 0; i < cbxType.Items.Count; i++)
{
var hdi = (HostDeviceInfo)cbxType.Items[i];
[свернуть]
Иначе если запустить эмулятор, а перед запуском отключить тот джойстик, который прописан в конфиге, то при входе в Settings и нажатии Apply вылетает окошко про NullReferenceException.
Неа, поток-то всё равно другой остался. Падает с той же ошибкой, разве что Stacktrace уменьшился на одну строчку.
Скрытый текст
Error 14:50:26.667 Exception System.InvalidOperationException: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "FormMain" не из того потока, в котором он был создан.
в System.Windows.Forms.Control.get_Handle()
в ZXMAK2.MDX.DirectJoystick.CaptureHostDevice(String hostId) в c:\Projects\zxmak2-clean\ZXMAK2\MDX\DirectJoystick.cs:строка 101
[свернуть]
ах ну да, а если хэндл окна в конструкторе сохранять и потом использовать готовый, без обращения к mainform?
Haldle же всего лишь объект ядра, число. Оно вроде неизменное на всём протяжении работы программы.
Но счас попробую.
Ошибся, не число, а IntPtr это. Работает! :)
---------- Post added at 15:49 ---------- Previous post was at 15:34 ----------
Еще баг - если вытащить джойстик во время работы, то падает в районе DirectJoystick.cs:43 с разными ошибками. Было и "Коллекция была изменена; невозможно выполнить операцию перечисления", и что-то про невозможность перечисления пустой коллекции. Эмулятор при этом прекращает работу.
Ой, строка 43 - это же у меня после разных изменений :) В общем, тут падает:
Код:var guidList = m_devices.Keys;
foreach (var guid in guidList)
Счас когда выдергиваю, в логе гигантское количество
Скрытый текст
Error 16:20:14.646 Exception Microsoft.DirectX.DirectInput.NotAcquiredException: Ошибка в приложении.
в Microsoft.DirectX.DirectInput.Device.Poll()
в ZXMAK2.MDX.DirectJoystick.ScanDevice(String hostId)
---
Full StackTrace:
в ZXMAK2.LogAgent.Error(Exception ex)
в ZXMAK2.MDX.DirectJoystick.ScanDevice(String hostId)
в ZXMAK2.MDX.DirectJoystick.Scan()
в ZXMAK2.Engine.InputAggregator.Scan()
в ZXMAK2.Engine.VirtualMachine.runThreadProc()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
[свернуть]
Но сам эмулятор при этом продолжает работать.
обновил эмулятор до версии 2755
- исправлен опрос джойстиков
http://savepic.org/3564216.png
Обновил эмулятор до версии 2756:
- исправлен баг чтения CSW
- исправлен баг декомпрессии CSW V2
- файлы CSW/WAV при открытии разбиваются на двух-секундные блоки, для удобства навигации
- добавлено отображение описания файла для CSW V2
- улучшена точность чтения CSW/WAV (теперь читаются даже те WAV, которые не читабельны в Spectaculator)
- добавлено сохранение последней рабочей папки Save/Open
http://savepic.org/3639692.png
http://savepic.org/3627396.png
Cool, now while WAV loading possible make pause :-)
Вложение 42115
ZXMAK, а реально сделать поддержку TS-Conf?
ZXMAK, я гонял свой код в последней версии эмулятора и обратил внимание, что у вас есть конфигурации ULA "128к ранняя модель" и "128к поздняя модель". Я, если честно, ни разу не слышал об таком подразделении. По времянкам, насколько я второпях понял, "поздняя модель" - это просто +2.
Не подскажете, где вы брали информацию по этим машинам? Хочется понять какой из этих вариантов важнее поддерживать (т.е. какой из них больше распространён).