![]() |
Quote:
Поэтому я и предложил пускай пользователь имеет возможность либо определить путь сохранения в ini файле или допустим в буфер системы ? Quote:
|
|
1 Attachment(s)
На текущий момент мыслей по поводу реализации прерываний нет, поэтому пока то что есть: работающий С2 и СА оба пока не работают по прерываниям.
По С2 можно загрузиться с НХ сервера, по СА загрузка останавливается с ошибкой, но тоже результат :) . Для связи используется программа сом0сом http://sourceforge.net/projects/com0com/ Все остальное в ветках "Сеть УКНЦ" и "УКНЦ загрузка через стык С2" Для сети запуск копий из разных папок. |
Затащил к себе код от Vamos, и озаботился настройкой COM-портов -- уже жаловались что приходится менять код под себя. Не доделал ещё, но будет примерно так: отдельный диалог на редактирование структуры DCB. Если какие-либо ещё параметры DCB нужно вытащить в редактор -- скажите, сделаю.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx -- DCB structure http://img-fotki.yandex.ru/get/5642/..._dc87e392_orig |
Наверное это лишнее, в реале УКНЦ кроме скорости стыка С2 все жёстко определено.
|
nzeemin, если будет возможность - посмотри пожалуйста ещё раз про звук для свежей компиляции UKNCBTL. Штука такая - на обычном DESKTOPE у меня бортовой звук и там все норм работает, а на ноуте UKNCBTL портит настройку так, что приходиться лазить поправлять иначе такое в колонках шипение при запуске других приложений пугающее ))) Впрочем я привык уже после запуска эмулятора лазить автоматом в звук.настройки ноута ))) Проблема в том, что минимальное значение ползунка почему то на звуковухе бука вызывает перегруз в купе с переключением на (только) левый канал. Какие ещё доработки планируются?
Возможно ли ожидать Load State в обозримом будущем и в целом любые новости по этому проекту всегда очень интересно ! |
Для реализации прерываний портов СА и С2 нужно модифицировать не только функцию void CFirstMemoryController::SetPortWord(WORD address, WORD word), но и void CFirstMemoryController::SetPortByte(WORD address, BYTE byte), которая в данный момент выглядит довольно бледно:
Code:
void CFirstMemoryController::SetPortByte(WORD address, BYTE byte)---------- Post added at 10:56 ---------- Previous post was at 10:29 ---------- Code:
void CFirstMemoryController::SetPortByte(WORD address, BYTE byte)Настоящая УКНЦ действительно преобразует байт в слово перед записью в порт ? |
Patron, видимо nzeemin еще не затащил код, у меня там все прописано.
Но толку пока от этих прерываний мало, DLTST показывает что все хорошо, а загрузка как не шла так и не идет TU58 в том числе. |
Quote:
|
Quote:
---------- Post added at 12:09 ---------- Previous post was at 12:05 ---------- Quote:
|
Quote:
|
Quote:
... Исправленный исходник требует дальнейших улучшений: 1. При установке разрешения прерывания в готовом регистре приёмника - прерывание возникает так же, как в передатчике, а регистры приёмников почему-то остались неисправленными: Code:
void CFirstMemoryController::SetPortWord(WORD address, WORD word)2. Приоритеты IRQ портов СА и С2 в файле Board.cpp остались неправильными: Code:
m_pCPU->InterruptVIRQ(3, 0370);---------- Post added at 11:31 ---------- Previous post was at 11:22 ---------- Запись байта в регистр данных передатчиков СА и С2 обрабатывается так: Code:
void CFirstMemoryController::SetPortByte(WORD address, BYTE byte)Как записываемый в регистр данных С2 байт попадает в переменную m_Port176576 ? Правильно ли, что при записи байта в регистр данных передатчика С2 - бит готовности в слове состояния не сбрасывается ? ---------- Post added at 11:38 ---------- Previous post was at 11:31 ---------- Ещё ошибка: Code:
m_pProcessor->InterruptVIRQ(8, 0364);Code:
m_pProcessor->InterruptVIRQ(10, 0364); |
Quote:
Меня смущает вот это m_Port176564 &= ~128; // Reset bit 7 (Ready) я думаю должно быть так m_Port176564 &= ~0200; // Reset bit 7 (Ready) |
У всех прерываний должны быть разные приоритеты IRQ ( для С2 - приемник 7, передатчик 8, для СА - приемник 9, передатчик 10 ), иначе прерывания могут теряться.
---------- Post added at 11:42 ---------- Previous post was at 11:40 ---------- Quote:
Но лучше, конечно, везде писать 0200 - тогда легче понять о чём речь. |
Quote:
|
Quote:
|
Quote:
|
Quote:
|
Quote:
|
Quote:
Мало того, видел много исходников на Си, встречаются шестнадцатиричные числа 0x..., но чтобы восьмеричные встретить - никогда такого не было) |
Quote:
Хотя сейчас посмотрев на некоторые исходники Макро11, это конечно стилем называется, но помоему это очень много букв. |
Quote:
|
Quote:
|
Quote:
|
Quote:
|
Quote:
|
Quote:
---------- Post added at 13:31 ---------- Previous post was at 13:28 ---------- Quote:
|
Quote:
1. Добавлены две специальные функции "конструктор" и "деструктор", которые всегда (ну, или почти всегда) автоматически вызываются при создании и уничтожении такой "классной" структуры. 2. Членами могут быть не только данные, но и функции (их называют "методы"), и даже автоматически разыменуемые указатели на функции ( их называют "виртуальные методы" ). 3. Алгоритмы всех операций, автоматически совершаемых компилятором над такой структурой ( например - копирование ) могут быть явно изменены. Если никакие из этих возможностей не использовать - объект класса C++ будет ничем не отличим от экземпляра обычной структуры C. |
Quote:
У меня, например, EmuStido написан практически на чистом Си, и прекрасно и удобно выглядит и работает) |
И для того чтобы сделать простую вещь, передать значение переменной, нужно прописать кучу указателей по всем этим классам и объектам т.е. почесать правой рукой за левым ухом легче.
|
Quote:
Например: Code:
struct Point {Если хочется дополнительно иметь возможноcть явно задавать начальные значения членов при создании структуры - можно сделать так: Code:
struct Point {Code:
Point A; |
Quote:
|
Quote:
Важно лишь с самого начала понимать, что все без исключения возможности С++ - это практически всё тот же "чистый ассемблер" без каких-либо "наворотов". |
Quote:
Программировал и на С++ с классами когда-то, и на чистом Си, и для меня просто Си очень дружественный, а ООП - нет. |
Quote:
На самом деле программа, использующая объекты - это лишь упрощённый вариант программы без объектов. Вот пример класса LockVarType, создающего объекты быстрой межпоточной синхронизации размером в одно слово: Code:
#define DWORD_ALIGN __declspec(align(4))Сделать межпоточную синхронизацию легче и проще вряд ли реально. |
Quote:
|
Quote:
Например, чтобы включить, а потом выключить межпоточную блокировку пользователь пишет: Code:
LockVar.Lock();Code:
while( InterlockedCompareExchange( &dwLockVar, 1, 0 ) ) { Sleep(0); } |
Quote:
|
Quote:
---------- Post added at 16:26 ---------- Previous post was at 16:23 ---------- Вот и получается, что разница между LockVar( &dwLockVar ) и LockVar.Lock() только в том, что при переносе кода из одного проекта в другой - не надо думать, что относится к блокировке, а что нет - всё необходимое уже "упаковано" в описание объекта. ---------- Post added at 16:41 ---------- Previous post was at 16:26 ---------- Важное преимущество C++ перед C, которое заставляет писать даже C-программы в формате C++ - это возможность объявлять любую переменную там, где она нужна, а не в начале функции. Когда пишешь функцию на несколько экранов ( а у меня они почти все такие ) - лазить каждый раз в самое начало, чтобы добавить новую переменную - очень утомляет. А можно в ANSI C задавать переменную цикла прямо в операторе for ? Code:
for( int i = 0 ; i < 100 ; i++ ) |
Quote:
Так же в Си++ удобно, что можно писать преобразование типов, скажем, не k = (long)i, а k = long(i). Для наглядности иногда удобней. Вот и все, чем я пользуюсь из Си++ ) |
| All times are GMT +4. The time now is 02:55. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.