Важная информация

User Tag List

Страница 5 из 120 ПерваяПервая 123456789 ... ПоследняяПоследняя
Показано с 41 по 50 из 1192

Тема: Эмулятор УКНЦ - EmuStudio

  1. #41
    Guru
    Регистрация
    07.10.2007
    Адрес
    п.Пудость Гатчинского р-на Лен.обл.
    Сообщений
    3,208
    Спасибо Благодарностей отдано 
    346
    Спасибо Благодарностей получено 
    607
    Поблагодарили
    399 сообщений
    Mentioned
    46 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    В смысле - для приёмника
    Возможно перепутал. Тогда тоже скажу аббревиатурой - DST.
    Пример: в R0 - 1000, в R1 - 2000.
    По команде MOV @R0,@R1 сначала читается по адресу 1000, а затем производится запись по адресу 2000. По команде MOVB @R0,@R1 сначала производится чтение по адресу 1000, затем чтение по адресу 2000, а затем байтовая запись по адресу 2000.

  2. #42
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,554
    Спасибо Благодарностей отдано 
    1,219
    Спасибо Благодарностей получено 
    1,754
    Поблагодарили
    683 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex_K Посмотреть сообщение
    Исходников нет, да и отладчика тоже, сказать сложно.
    Дисковод писал очень давно, и совсем про него не помню. Хочешь, сам посмотри.
    Код:
    static struct {						// Определить структуру, описывающую дисководы
    			   UINT8 Track,			// Номер трека (00..79, при over-позицировании > 79)
    					 Side,			// Сторона (0 - нижняя головка, 1 - верхняя головка)
    				     Motor,			// Мотор (00 - выключен, иначе включен)
    					 PrevMotor,		// Предыдущее состояние мотора (для иконок дискет)
    					 Mode,			// Режим (00 - нет чтения/записи, 01 - чтение, 02 - запись)
    					 Ready;			// Готовность данных (00 - нет данных, иначе есть данные)
    			   UINT8 PosType,		// Текущее положение на треке (00 - межсекторное пространство, иначе сектор)
    					 Sector;		// Текущий сектор (0..9)
    			   UINT32 CurrPos;		// Текущая позиция в словах внутри сектора (0..511) либо внутри межсекторного пространства (0..nnnn)
    			   UINT8 *ImagePTR;		// Указатель на образ диска (образ 819200 байт)
    			   UINT16 ControlSp[50];// Массив для размещения текущей межсекторной служебной информации
    			  } Floppy[4];
    
    UINT16 FASTC	PPU_RdW_FDD_STATE(void) {					// Регистр состояния Floppy-диска
    
    	UINT16	State = 0;
    	UINT8	Numb = 3 - (PPU_FDD_STATE & 0x3);				// Numb - номер дисковода (0..3)
    
    	if (Floppy[Numb].Track == 0)							// Если трек = 0, то
    		State |= 0x0001;									// устанавливаем бит TR0
    
    	State |= 0x0002;										// Дисковод готов к работе (всегда)
    	
    //	State |= 0x0004;										// [T] Запись на диск запрещена
    	
    	if (Floppy[Numb].Ready)									// Если есть готовность данных 
    		State |= 0x0080; 
    	else {													// Иначе, если нет готовности данных, то синхронизация
    		if (Floppy[Numb].PosType) {							// Если находимся на секторе, то автоматом
    															// перепозицируемся на следующую за сектором
    															// первую синхропоследовательность $A1A1
    															// (синхро заголовка сектора)
    			Floppy[Numb].CurrPos = 20;						// Позицируемся на первую $A1A1
    			Floppy[Numb].PosType = 0;						// межсекторного пространства
    			if ((Floppy[Numb].Sector +=1) > 9)				// Перейти к следующему сектору
    				Floppy[Numb].Sector = 0;					// Если достигли сектора 10, то переход к сектору 0
    			Floppy[Numb].ControlSp[22] = (Floppy[Numb].Track << 8) |		// Прописываем в служебное поле
    										Floppy[Numb].Side;					// номер трека / головки
    			Floppy[Numb].ControlSp[23] = ((Floppy[Numb].Sector + 1) << 8) | // номер сектора / длина
    										2;							        //		
    		}
    		else {												// Если находимся на межсекторном пространстве
    			if (Floppy[Numb].ControlSp[Floppy[Numb].CurrPos] == 0xA1A1) { // Если достигли синхропоследовательности
    				Floppy[Numb].Ready = 1;						// то устанавливаем готовность данных
    				State |= 0x0080;
    			}
    			else {
    				if ((Floppy[Numb].CurrPos += 1) > 41)	{	// Если достигли конца служебной области
    					Floppy[Numb].CurrPos = 0;				// Позицируемся на начало
    					Floppy[Numb].PosType = 1;				// сектора
    				}
    			}
    		}
    	}
    
    	State |= 0x4000;										// [T] Контрольная сумма всегда правильная
    
    	return(State);
    
    }
    
    UINT16 FASTC	PPU_RdW_FDD_DATA(void) {					// Регистр данных Floppy-диска
    
    	UINT16 Value;
    	UINT8	Numb = 3 - (PPU_FDD_STATE & 0x3);				// Numb - номер дисковода (0..3)
    
    	if (Floppy[Numb].PosType) {								// Если находимся на секторе (сектор 512 байт)
    
    		Value = *(UINT16*)(Floppy[Numb].ImagePTR +			// Слово данных
    						   ((Floppy[Numb].Track << 1) + Floppy[Numb].Side) * 5120 + 
    						   (Floppy[Numb].CurrPos << 1) +
    						   Floppy[Numb].Sector * 512);
    
    		Value = (Value >> 8) | ((Value & 0x00FF) << 8);		// Обмен байтов в слове
    
    		Floppy[Numb].Mode = 1;								// Режим 'чтение' (для цветовой индикации)
    
    		if ((Floppy[Numb].CurrPos += 1) > 255) {			// Если достигли конца сектора
    			Floppy[Numb].CurrPos = 0;						// Позицируемся на начало
    			Floppy[Numb].PosType = 0;						// межсекторного пространства
    			if ((Floppy[Numb].Sector +=1) > 9)				// Перейти к следующему сектору
    				Floppy[Numb].Sector = 0;					// Если достигли сектора 10, то переход к сектору 0
    			Floppy[Numb].ControlSp[22] = (Floppy[Numb].Track << 8) |		// Прописываем в служебное поле
    										 Floppy[Numb].Side;					// номер трека / головки
    			Floppy[Numb].ControlSp[23] = ((Floppy[Numb].Sector + 1) << 8) | // номер сектора / длина
    										 2;							        //		
    			Floppy[Numb].Mode = 0;							// Режим 'бездействие' (для цветовой индикации)
    		}
    
    	}
    	else {													// Иначе находимся на межсекторном пространстве
    
    		Value = Floppy[Numb].ControlSp[Floppy[Numb].CurrPos]; // Слово данных
    	
    		if ((Floppy[Numb].CurrPos += 1) > 41)	{			// Если достигли конца служебной области
    			Floppy[Numb].CurrPos = 0;						// Позицируемся на начало
    			Floppy[Numb].PosType = 1;						// сектора
    		}
    
    	}
    
    
    void FASTC	PPU_WrW_FDD_STATE(UINT16 Data) {				// Регистр состояния Floppy-диска
    
    	UINT8	Numb;
    
    	if (Data & 0x400) {										// Если активен бит выбора дисковода (REZ)
    
    		Numb = 3 - (Data & 0x3);							// Numb - номер дисковода (0..3)
    
    		if ((!(PPU_FDD_STATE & 0x200)) && (Data & 0x200)) { // Если смена бита WM 0->1,
    			Floppy[Numb].Mode = 2;							// то включаем режим записи
    			Floppy[Numb].CurrPos = -1;						// Текущая позиция в секторе -1 (для пропуска
    															// первого синхрослова $FBA1
    		}
    
    		PPU_FDD_STATE = Data;
    
    		if (PPU_FDD_STATE & 0x10)							// Если включен двигатель дисковода
    			 Floppy[Numb].Motor = 1;						// то Motor = 1, иначе Motor = 0	
    		else Floppy[Numb].Motor = 0;
    
    		Floppy[Numb].Side = (PPU_FDD_STATE & 0x20) >> 5;	// Выбор номера головки
    
    		if (PPU_FDD_STATE & 0x80) {							// Если установлен бит шага (ST), то
    			PPU_FDD_STATE &= 0xFF7F;						// Сбросить бит шага
    			Floppy[Numb].Mode = 0;							// Режим 'перемещение' (для цветовой индикации)
    			if (PPU_FDD_STATE & 0x40) {						// Если направление шага к центру, то
    				if (Floppy[Numb].Track < MaxTrack)
    					Floppy[Numb].Track += 1;
    				else printf("Wrong Track: %d\n", Floppy[Numb].Track + 1);
    			}
    			else {											// Иначе направление от центра
    				if (Floppy[Numb].Track > 0)
    					Floppy[Numb].Track -= 1;
    			}
    		}
    
    		if  (PPU_FDD_STATE & 0x100) {						// Если установлен бит инициализации (GOR)
    			 Floppy[Numb].Ready = 0;						// Сбросить бит готовности данных
    		}
    
    	}
    	
    	return;
    
    }
    
    void FASTC	PPU_WrW_FDD_DATA(UINT16 Data) {					// Регистр данных Floppy-диска
    
    	UINT8	Numb = 3 - (PPU_FDD_STATE & 0x3);				// Numb - номер дисковода (0..3)
    
    	if (Floppy[Numb].Mode == 2) {							// Если активен режим записи
    
    		if ((SINT32)Floppy[Numb].CurrPos >= 0)	{			// Если позиция внутри сектора >= 0
    
    			*(UINT16*)(Floppy[Numb].ImagePTR				// Записать слово на образ
    			+ ((Floppy[Numb].Track << 1) + Floppy[Numb].Side) * 5120
    			+ (Floppy[Numb].CurrPos << 1)
    			+ Floppy[Numb].Sector * 512) = Data;
    
    		}
    
    		if ((Floppy[Numb].CurrPos += 1) > 255) {			// Если достигли конца сектора
    			Floppy[Numb].CurrPos = 0;						// Позицируемся на начало
    			Floppy[Numb].PosType = 0;						// межсекторного пространства
    			if ((Floppy[Numb].Sector +=1) > 9)				// Перейти к следующему сектору
    				Floppy[Numb].Sector = 0;					// Если достигли сектора 10, то переход к сектору 0
    			Floppy[Numb].ControlSp[22] = (Floppy[Numb].Track << 8) | // Прописываем в служебное поле
    										Floppy[Numb].Side;			 // номер трека / головки
    			Floppy[Numb].ControlSp[23] = ((Floppy[Numb].Sector + 1) << 8) | // номер сектора / длина
    										2;							        //		
    			Floppy[Numb].Mode = 0;							// Режим 'бездействие'
    		}
    
    	}
    
    	return;
    
    }
    Последний раз редактировалось Titus; 03.02.2012 в 15:30.

  3. #43
    Guru
    Регистрация
    07.10.2007
    Адрес
    п.Пудость Гатчинского р-на Лен.обл.
    Сообщений
    3,208
    Спасибо Благодарностей отдано 
    346
    Спасибо Благодарностей получено 
    607
    Поблагодарили
    399 сообщений
    Mentioned
    46 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    Проверить это довольно просто - запустить тест времянок для команд MOV, MOVB, BIS и BISB ( с адресацией типа MOV R0, @#ADDR ) и сравнить время выполнения каждой из команд.
    Зачем такие сложности. Я проверял на регистрах каналов 0, 1, 2, а также на стыке С2. Там регистр данных приемника на запись не реагирует, выдает только RPLY. Готовность приемника можно сбросить только чтением его регистра данных. Так вот командами MOVB,CLRB и MTPS это удавалось делать.

    Ну а время исполнения будет естественно больше из-за лишнего чтения.

    ---------- Post added at 15:34 ---------- Previous post was at 15:32 ----------

    Цитата Сообщение от Titus Посмотреть сообщение
    Дисковод писал очень давно, и совсем про него не помню. Хочешь, сам посмотри.
    Спасибо! Гляну. Исходники в UKNCBTL я бы все-таки не рекомендовал использовать в качестве примера. Может там и получше, но есть еще чего дорабатывать.

  4. #44
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,554
    Спасибо Благодарностей отдано 
    1,219
    Спасибо Благодарностей получено 
    1,754
    Поблагодарили
    683 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от hobot Посмотреть сообщение

    Скрытый текст



    [свернуть]
    Вот эти цвета от игры с какого образа?

  5. #45
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex_K Посмотреть сообщение
    Зачем такие сложности.
    Сравнение времянок - простой, наглядный и универсальный способ изучения эмулируемого процессора.

    Жаль, что сравнивая времянки - невозможно определить, как процессорные такты распределяются внутри отдельных циклов шины (для этого нужен логический анализатор).

    До сих пор ни один из обладателей тестового стенда процессоров ВМ - не поинтересовался это сделать.

    А без этого невозможно установить связь длительности цикла шины с задержкой выборки адресуемой памяти.

  6. #46
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,554
    Спасибо Благодарностей отдано 
    1,219
    Спасибо Благодарностей получено 
    1,754
    Поблагодарили
    683 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от hobot Посмотреть сообщение
    ИТОшные сборнички заработают? И wd-rom можно будет юзать? )))
    ИТОшные сборники, кстати, застревают именно на этапе загрузки. Может тоже дело в дисководе. Какое-нибудь нестандартное обращение.

    ---------- Post added at 15:44 ---------- Previous post was at 15:43 ----------

    Цитата Сообщение от Patron Посмотреть сообщение
    До сих пор ни один из обладателей тестового стенда процессоров ВМ - не поинтересовался это сделать.

    А без этого невозможно установить связь длительности цикла шины с задержкой выборки адресуемой памяти.
    Циклы должны быть хорошо описаны в техническом описании. Разве нет?

  7. #46
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #47
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Циклы должны быть хорошо описаны в техническом описании. Разве нет?
    Раскладки циклов на такты нет ни в одном описании. Нужно подключить к шине логический анализатор, прогнать одну и ту же команду с разными типами памяти ( ОЗУ, ПЗУ, регистр устройства ) и сравнить растактовки основных сигналов шины.

  9. #48
    Guru
    Регистрация
    07.10.2007
    Адрес
    п.Пудость Гатчинского р-на Лен.обл.
    Сообщений
    3,208
    Спасибо Благодарностей отдано 
    346
    Спасибо Благодарностей получено 
    607
    Поблагодарили
    399 сообщений
    Mentioned
    46 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    Жаль, что сравнивая времянки - невозможно определить, как процессорные такты распределяются внутри отдельных циклов шины (для этого нужен логический анализатор).
    Согласен. Поэтому я и стал исследовать это на других регистрах, благо их хватало. Смотрел, чтобы чип не обрабатывал WTBT, ну и чтобы регистры не реагировали на запись (как раз подходят регистры данных приемника). Таких в УКНЦ на шине ЦП нашлось аж целых четыре штуки. Результаты получились одинаковые.
    Думаю, что если сравните команды по времени выполнения, то у MOVB должно быть более длительное время.

  10. #49
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,554
    Спасибо Благодарностей отдано 
    1,219
    Спасибо Благодарностей получено 
    1,754
    Поблагодарили
    683 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Еще на счет турбобейсика.
    При старте с системы, что на том же диске, турбобейсик во время загрузки пишет что-то типа 'rror reading overlay'. Иногда даже без буквы 'E' даже. На этой системе стоит какой-то Virtual Memory Driver by Alpharog. Причем, когда буквы 'E' нету, видно, что в момент ошибки идет много записи в регистр управления адресным пространством ПП. А именно биты 1-3 (биты выбора кассеты ПЗУ!). И головка дисковода на этой дискете перемещается раза в 4 медленнее, чем на других.

    Тогда как при старте с другой системы, но при запуске этого же турбобейсика, с этой же дискеты, все грузится прекрасно. Значит от положения на диске и размера глюк не зависит.

  11. #50
    R.I.P. Аватар для hobot
    Регистрация
    30.08.2011
    Адрес
    Зеленоград
    Сообщений
    7,161
    Спасибо Благодарностей отдано 
    2,979
    Спасибо Благодарностей получено 
    370
    Поблагодарили
    309 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Вот эти цвета от игры с какого образа?
    я понял, игра со сборника игр для UKNCBTL просто загрузочная дискета другая была, там на старте палитра меняется, ВОТ(!). Titus - это все лишь картинки, не надо так нервничать ))) И повторюсь движок форума так устроен ( я сам недавно заметил ) что когда я захожу просто без рега - да выглядит страшновато, захожу под своим аккаунтом - всё просто сногшибенно красиво ! ))) Опять же не я придумал что бы было так )))
    А вот планируется ли возможность режима ЧБ-монитора для УКНЦ игр? ну типа как по F6 - врубаются желтенькие буковки (КЦГД), может быть как то так сделать оттенки серого? Было бы классно для некоторых игр (ИМХО:KNIGHT и ИТО-сборники лучше гораздо глядятся в ЧБ)
    Архив программ для УК-НЦ, ДВК и БК.

    Ищу игру "СТРАНА МОНСТРОВ" [monstr.sav] для ДВК.

Страница 5 из 120 ПерваяПервая 123456789 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Эмулятор УКНЦ - UKNCBTL
    от nzeemin в разделе Эмуляторы отечественных компьютеров
    Ответов: 1113
    Последнее: 12.11.2023, 18:44
  2. PS/2 клавиатура в УКНЦ
    от balu_dark в разделе ДВК, УКНЦ
    Ответов: 83
    Последнее: 10.01.2021, 10:51
  3. Как проверить УКНЦ и КМД ? Help
    от Andrey_Ak в разделе ДВК, УКНЦ
    Ответов: 37
    Последнее: 23.07.2020, 15:50
  4. УКНЦ и шина МПИ
    от KALDYH в разделе ДВК, УКНЦ
    Ответов: 18
    Последнее: 14.03.2014, 14:30
  5. Продаю УКНЦ
    от Gryphon в разделе Барахолка (архив)
    Ответов: 10
    Последнее: 01.04.2009, 10:22

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •