Пока только код от Patron
http://zx-pk.ru/attachment.php?attac...1&d=1359811007
Вид для печати
Пока только код от Patron
http://zx-pk.ru/attachment.php?attac...1&d=1359811007
Сначала лучше загрузку с эмулятора TU58 по С2 наладить - для неё я (в принципе) могу сделать лог всех выполняемых процессором команд.
---------- Post added at 17:09 ---------- Previous post was at 17:01 ----------
А если не грузиться сразу при помощи TU58.SAV, а сначала загрузиться как обычно и дать команду:
DIR/FU/BL/VOL DD:
А потом:
BOOT DD:
---------- Post added at 17:17 ---------- Previous post was at 17:09 ----------
Вообще, насколько я понимаю - разница в работе с последовательным портом между эмуляторами ДВК и УКНЦ в настоящий момент только в том, что в эмуляторе ДВК в принципе невозможен оверран.
Я давал уже раньше здесь код, позволяющий имитировать работу С2 по кабелю с квитированием ( т.е. в принципе без потери байтов ) - пора этот код испытать.
На текущем коде эмулятора (ревизия 482), палитра GRB.
Думаю, этот тест можно считать пройденным.
http://img-fotki.yandex.ru/get/6424/..._7834a066_orig
Beta 38
- Палитра в 128 цветов, из-за этого размер файла скриншота увеличился в два раза
- Интегрирован код работы с COM-портом и код реализации сети через COM-порт от Vamos; работа Стык С2 явно улучшилась; но сеть пока практически не работает
- Для настройки COM-портов сделан диалог редактирования структуры DCB
- Исправление ошибок
http://ukncbtl.googlecode.com/files/...beta38-exe.zip
Благодаря лучшей реализации Стык С2 появилась возможность загрузки и работы с HX Server, связь двух программ на одном PC выполняется через виртуальные порты com0com.
Последняя версия HX Server by Patron: http://zx.pk.ru/showthread.php?p=569515#post569515
Инструкции по настройке: http://zx-pk.ru/showpost.php?p=564797&postcount=160
Запускаем HX Server. После этого запускаем эмулятор, в Settings указываем правильное название и настройки порта. В главном меню УКНЦ выбираем загрузку со Стык С2. Ожидаем загрузки системы.
Выражаю особую благодарность тем, кто активно помогал и содействовал появлению этой версии: Vamos, Patron, Titus и конечно hobot.
У меня сложилось впечатление, что в коде посылки BREAK можно обойтись вообще без Sleep(15)
Код:if (!(m_Port176574 & 01))
{ // BREAK
SetCommBreak( m_hEmulatorComPort );
Sleep(15);
}
Поскольку утилита оказалась востребованной, сделал небольшое улучшение.
Теперь в командной строке можно задать опцию -dcb и указать к ней параметры структуры DCB, например:
UkncComSender.exe COM8 VERT.SAV -dcb "rts=on"
Реализация использует функцию Win32 BuildCommDCB(), которая парсит строку параметров и заполняет DCB: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspxКод:UkncComSender Utility v1.2 by Nikita Zimin [Feb 3 2013 19:57:55]
Serial port name is not specified.
Usage: UkncComSender [<Options>] <PortName> <FileToSendName>
Options:
-dcb "<DcbParams>"
<DcbParams>:
baud=b
parity={n|e|o|m|s}
data={5|6|7|8}
stop={1|1.5|2}
to={on|off}
xon={on|off}
odsr={on|off}
octs={on|off}
dtr={on|off|hs}
rts={on|off|hs|tg}
idsr={on|off}
http://ukncbtl.googlecode.com/files/UkncComSender.zip
nzeemin, вот с таким ini крашится, не знаю, нужно ли что-то поправлять, без него-то работает =)
Скрытый текст
Код:[UKNCBTL]
Toolbar=1
Keyboard=1
Tape=0
ScreenHeightMode=4
Debug=0
Cartridge1=C:\Documents and Settings\User\Мои документы\Dropbox\УКНЦ\UKNCBTL\roms\ide_wdromv0110.bin
Sound=1
Hard2=C:\hdd.img
Parallel=0
Autostart=0
SerialPort=
SoundVolume=27531
[свернуть]
Помучал еще код эмулятора, добился стабильной загрузки TU58, теперь загрузка из сети проходит до стадии загрузки системы а дальше опять облом с переполнением :( .
http://zx-pk.ru/attachment.php?attac...1&d=1360080317
http://zx-pk.ru/attachment.php?attac...1&d=1360080317
Вот код, эмулирующий работу по кабелю с квитированием и полностью исключающий переполнения:
Код:#include <deque>
std::deque<BYTE> CA_OverrunBuf;
BOOL CFirstMemoryController::NetworkInput(BYTE inputByte)
{
if (m_Port176560 & 0200) // Ready?
{
if( bEmulate_CA_Overrun )
{
m_Port176560 |= 010000; // Set Overflow flag
}
else
{
CA_OverrunBuf.push_back( inputByte ); // Store byte..
}
}
else
{
m_Port176562 = (WORD)inputByte;
m_Port176560 |= 0200; // Set Ready flag
if (m_Port176560 & 0100) // Interrupt?
return TRUE;
}
return FALSE;
}
WORD CFirstMemoryController::GetPortWord(WORD address)
{
switch (address) {
case 0176562: // СА: Регистр данных приемника
case 0176563: // нижние 8 бит доступны по чтению
m_Port176560 &= ~010200; // Reset bit 12 and bit 7
if( CA_OverrunBuf.size() )
{
WORD uPrev = m_Port176562;
m_Port176562 = (WORD)CA_OverrunBuf.front();
CA_OverrunBuf.pop_front();
m_Port176560 |= 0200; // Set Ready flag
if( m_Port176560 & 0100 )
m_pCPU->InterruptVIRQ(9, 0360);
return (uPrev + m_NetStation);
}
return (m_Port176562 + m_NetStation);
}
}
Кстати - при переполнении в регистре данных остаётся старый байт, а не появляется новый.