User Tag List

Страница 8 из 40 ПерваяПервая ... 456789101112 ... ПоследняяПоследняя
Показано с 71 по 80 из 399

Тема: Контроллер псевдо КМД+дисковод для УКНЦ (на SD карте)

  1. #71

    Регистрация
    10.04.2019
    Адрес
    г. Фокино, Брянская обл.
    Сообщений
    401
    Спасибо Благодарностей отдано 
    52
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    65 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SuperMax Посмотреть сообщение
    реально идет прямой выбор и работает 4ре устройства
    На вашей схеме 38,39 выводы висят в воздухе. Читаем первый даташит:

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


    0 (DS0) – запись "1" приводит к выбору накопителя 0;
    1 (DS1) – запись "1" приводит к выбору накопителя 1;
    2 (DS2) – запись "1" приводит к выбору накопителя 2;
    3 (DS3) – запись "1" приводит к выбору накопителя 3;
    [свернуть]

    второй:

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


    Запись "1" в 0-й разряд РСН <DS0> вызывает выбор 0-го привода накопителя.
    Запись "1" в 1-й разряд РСН <DS1> вызывает выбор 1-го привода накопителя.
    Запись "1" одновременно в 0-й и 1-й разряды вызывает выбор 2-го привода накопителя.
    Запись "0" во 2-й и 3-й разряды РСН <DS2, DS3> вызывает включение нулевых задержек..
    [свернуть]

    А по факту и то и то не верно. тк в реальности 0 привод это 0011, 1 привод 0010, 2 привод 0001.

  2. #72

    Регистрация
    20.12.2005
    Адрес
    Москва
    Сообщений
    2,051
    Спасибо Благодарностей отдано 
    1,142
    Спасибо Благодарностей получено 
    1,472
    Поблагодарили
    524 сообщений
    Mentioned
    20 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ZPilot Посмотреть сообщение
    А по факту и то и то не верно. тк в реальности 0 привод это 0011, 1 привод 0010, 2 привод 0001.
    В эмуляторе так - инвертированные первые два бита. А "не так" наверное опять из-за инверсии на шине.
    Код:
    uint16_t newdrive = (cmd & 3) ^ 3;

    Этот пользователь поблагодарил nzeemin за это полезное сообщение:

    ZPilot(15.04.2020)

  3. #73

    Регистрация
    10.04.2019
    Адрес
    г. Фокино, Брянская обл.
    Сообщений
    401
    Спасибо Благодарностей отдано 
    52
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    65 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от nzeemin Посмотреть сообщение
    В эмуляторе так
    Благодаря вашему эмулятору я и отлавливаю ошибки и неточности в описаниях. Насчет инверсии, у меня шина и так инвертирована на ВА87, а биты все равно приходят инверсные.
    С 3-м приводом разобрался, я оказывается, мало того что пишу с ашипками, так еще и считаю так же
    А 3-й привод действительно сидит на 10 бите?

    Эти 2 пользователя(ей) поблагодарили ZPilot за это полезное сообщение:

    hobot(15.04.2020), nzeemin(16.04.2020)

  4. #74

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Вот работа с FDD из моего эмулятора УКНЦ EmuStudio. Написано еще в 2006, и с тех пор не менялось. Не смотря на то, что эмуляция не побитная, ни одной программы, не работающей с ним пока что не встречалось.

    Код:
    
    
    
    
    
    static UINT16 PPU_FDD_STATE;		// Регистр состояния Floppy-диска
    
    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 MotTimer;		// Таймер остановки мотора (если 0, то мотор остановлен)
    			   UINT32 CurrPos;		// Текущая позиция в словах внутри сектора (0..511) либо внутри межсекторного пространства (0..nnnn)
    			   UINT8 *ImagePTR;		// Указатель на образ диска (образ 819200 байт)
    			   UINT16 ControlSp[50];// Массив для размещения текущей межсекторной служебной информации
    			  } Floppy[4];
    
    static const MaxTrack = 79;			// Максимальный разрешенный номер трека
    
    
    
    
    	for (i=3; i!=-1; i--) {					// Для всех дисков
    
    		Floppy[i].Motor = 0;				// Двигатель выключен
    		Floppy[i].Mode = 0;					// Режим 'бездействие' (для цветовой индикации)
    		Floppy[i].Track = 0;				// Трек 0
    		Floppy[i].Ready = 1;				// Данные готовы
    		Floppy[i].MotTimer = 0;				// Таймер мотора сброшен, мотор выключен
    		memset(Floppy[i].ControlSp,0,sizeof(Floppy[i].ControlSp)); // Заполнить пробелы
    
    		Floppy[i].ControlSp[0] = 0x1234;	// Терминатор псевдо-пробела (если сектор заполнен нулями)
    		Floppy[i].ControlSp[1] = 0x1234;	// 
    
    		Floppy[i].ControlSp[20] = 0xA1A1;	// Синхропоследовательность перед заголовком сектора
    		Floppy[i].ControlSp[21] = 0xA1FE;	// (не менять положение, завязано с фунцией чтения)
    
    		Floppy[i].ControlSp[40] = 0xA1A1;	// Синхропоследовательность перед сектором
    		Floppy[i].ControlSp[41] = 0xA1FB;	//
    
    	}
    
    
    
    
    
    
    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;							        //		
    
    //			printf("Spaces found inside sector, jump to next marker\n");
    		}
    		else												// Если находимся на межсекторном пространстве
    		{			
    															// Доделать индекс для программы TS.SAV
    			//if ((Floppy[Numb].CurrPos == 20) &&			// Если находимся в самом начале межсекторного
    			//	(Floppy[Numb].Sector == 1))					// пространства перед сектором 0, то
    			//{
    			//	State |= 0x8000;							// установить флаг INDEX
    			//	printf("Index Marker\n");
    			//}
    
    			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;				// сектора
    
    //					printf("Marker not found, found data\n");
    				}
    			}
    		}
    	}
    
    	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)				// Если достигли конца сектора
    		{			
    //			printf("Track: %d, Side %d, Sector %d\n", 
    //				   Floppy[Numb].Track, Floppy[Numb].Side, Floppy[Numb].Sector);
    
    			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;						// сектора
    		}
    
    	}
    
    
    	return(Value);
    
    }
    
    
    
    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	
    
    			Floppy[Numb].MotTimer = 200;					// Таймер остановки мотора (только для GUI)
    		}
    		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);
    
    //				printf("Step to -> %d\n", Floppy[Numb].Track);
    			}
    			else											// Иначе направление от центра
    			{											
    				if (Floppy[Numb].Track > 0)
    					Floppy[Numb].Track -= 1;
    
    //				printf("Step to -> %d\n", Floppy[Numb].Track);
    			}
    		}
    
    		Floppy[Numb].ControlSp[22] = (Floppy[Numb].Track << 8) |		// Прописываем в служебное поле
    									 Floppy[Numb].Side;					// номер трека / головки
    		Floppy[Numb].ControlSp[23] = ((Floppy[Numb].Sector + 1) << 8) | // номер сектора / длина
    									 2;									// (необходимо после шага или смены стороны)		
    
    		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;
    
    }

    Эти 3 пользователя(ей) поблагодарили Titus за это полезное сообщение:

    Alex_K(17.04.2020), hobot(15.04.2020), ZPilot(16.04.2020)

  5. #75

    Регистрация
    10.04.2019
    Адрес
    г. Фокино, Брянская обл.
    Сообщений
    401
    Спасибо Благодарностей отдано 
    52
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    65 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Вот работа с FDD из моего эмулятора УКНЦ
    Смотрю на эту роскошь и радуюсь, не то что у меня.
    Вот генерация трека:

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


    .macro NEXTPOS
    add r9, r6, r4, lsl #9 //sec*len_sect+(pos)//sec<<9+pos
    add r9,#1
    ldrh r3,=FLOPPY_RAWTRACKSIZE
    cmp r9,r3
    it hs
    andhs r9,#0
    strh r9,[r1]
    .endm
    //----------------------------------------
    //uint8_t fast_datatrack(void *data,void *pos, void *isSync);
    //----------------------------------------
    .section .text.fast_datatrack
    .global fast_datatrack
    .type fast_datatrack, %function
    fast_datatrack:
    push {r3-r9,lr}
    ldrh r8,=VAR_ADM
    ldrh r5,=SEC_LEN
    ldrh r6,[r1] //pos
    udiv r4,r6,r5 //number sector
    mls r6,r4,r5,r6 //position in sector
    //Sync?
    ldrb r7,[r2]
    tst r7,#1
    beq fast_datatrack_loop

    bic r7,#1
    strb r7,[r2]

    //pos=<marker0
    cmp r6,MARKER0_POS
    itt ls
    ldrbls r6,=MARKER0_POS
    bls fast_datatrack_loop
    //marker0<pos=<marker1
    cmp r6,MARKER1_POS
    it ls
    ldrbls r6,=MARKER1_POS
    bls fast_datatrack_loop
    //pos>marker1 to next sector marker 1
    add r4,#1
    cmp r4,#10
    it hs
    andhs r4,#0
    ldrb r6,=MARKER0_POS
    fast_datatrack_loop:
    //GAP0
    cmp r6,#SYNC0_POS
    itttt lo
    ldrblo r0,=0x4E
    //set index bit
    ldrhlo r3,[r8,#RSN_RDM]
    orrlo r3,#0x8000
    strhlo r3,[r8,#RSN_RDM]
    blo fast_datatrack_end

    ////reset index bit
    ldrh r3,[r8,#RSN_RDM]
    bic r3,#0x8000
    strh r3,[r8,#RSN_RDM]

    //SYNC0
    cmp r6,#MARKER0_POS
    it lo
    ldrblo r0,=0x00
    blo fast_datatrack_end

    //MARKER0
    cmp r6,#FE_POS
    itttt lo
    ldrblo r0,=0xA1
    //reset CRC bit
    ldrhlo r3,[r8,#RSN_RDM]
    biclo r3,#0x4000
    strhlo r3,[r8,#RSN_RDM]
    blo fast_datatrack_end

    //FE
    cmp r6,#CYL_POS
    it lo
    ldrblo r0,=0xFE
    blo fast_datatrack_end

    //CYL
    cmp r6,#SIDE_POS
    it lo
    ldrblo r0,[r0,SZ_TRACK] //track no
    blo fast_datatrack_end

    //SIDE
    cmp r6,#SEC_POS
    it lo
    ldrblo r0,[r0] //Side no #0
    blo fast_datatrack_end

    //Sector
    cmp r6,#SECSZ_POS
    it lo
    //andlo r5,#0
    addlo r0,r4,#1 //Sector match in r4
    blo fast_datatrack_end

    //Sector size
    cmp r6,#CRC0_POS
    it lo
    ldrblo r0,=2

    //CRC header
    cmp r6,#GAP1_POS
    itttt lo
    ldrblo r0,=12
    //andlo r0,#0
    //set CRC bit
    ldrhlo r3,[r8,#RSN_RDM]
    orrlo r3,#0x4000
    strhlo r3,[r8,#RSN_RDM]
    blo fast_datatrack_end

    //GAP1
    cmp r6,#SYNC1_POS
    it lo
    ldrblo r0,=0x4E
    blo fast_datatrack_end

    //SYNC1
    cmp r6,#MARKER1_POS
    it lo
    ldrblo r0,=0x00
    blo fast_datatrack_end

    //MARKER1
    cmp r6,#FB_POS
    itttt lo
    andlo r5,#0 //It's sey: load data
    addlo r5,#0x02
    strblo r5,[r2]
    ldrblo r0,=0xA1
    //reset CRC bit
    ittt lo
    ldrhlo r3,[r8,#RSN_RDM]
    biclo r3,#0x4000
    strhlo r3,[r8,#RSN_RDM]

    blo fast_datatrack_end

    //FB
    cmp r6,#DATA_POS
    it lo
    ldrblo r0,=0xFB
    blo fast_datatrack_end

    //set CRC bit
    ldrh r3,[r8,#RSN_RDM]
    orr r3,#0x4000
    strh r3,[r8,#RSN_RDM]

    //DATA
    cmp r6,#CRC1_POS
    itttt lo
    addlo r0,#SZ_TBUFF //set addr currenttrack
    sublo r9,r6,#DATA_POS //pos_in_data=pos-data_pos
    addlo r7, r9, r4, lsl #9 //sec*len_sect+(pos_in_data)
    ldrblo r0,[r0,r7]
    blo fast_datatrack_end

    //CRC data
    ldrh r7,=GAP2_POS
    cmp r6,r7
    it lo
    ldrhlo r0,=18
    //andlo r0,#0
    /*//set CRC bit
    ldrhlo r3,[r8,#RSN_RDM]
    orrlo r3,#0x4000
    strhlo r3,[r8,#RSN_RDM]*/
    blo fast_datatrack_end

    ldrb r0,=0x4E

    fast_datatrack_end:
    //set data ok bit
    ldrh r3,[r8,#RSN_RDM]
    orr r3,#0x80
    strh r3,[r8,#RSN_RDM]

    //NEXTPOS
    ldr r5,=SEC_LEN
    //add r9, r6, r4, lsl #9 //sec*len_sect+(pos)//sec<<9+pos
    mla r9,r4,r5,r6 //sec*len_sec+pos_sec
    add r9,#1
    ldrh r3,=FLOPPY_RAWTRACKSIZE
    cmp r9,r3
    it hs
    andhs r9,#0
    strh r9,[r1]

    pop {r3-r9,lr}
    bx lr
    [свернуть]


    А вот это работа с регистрами статуса/команды и данных

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


    //---------------------------------------
    .macro ENDIRQSTATUS
    ldrb r7,[r6,SET_OPERM]
    orr r7,r8
    strb r7,[r6,SET_OPERM]

    ldr r7,=EXTI_ADM
    EXTICLEARFLAG r7,r8,EXTI_LINE_6
    pop {r5-r8,lr}
    bx lr
    .endm
    //----------------------------------------------
    // EXTI9_5_IRQHandler //RSN o177130
    //----------------------------------------------
    .section .text.EXTI9_5_IRQHandler
    .global EXTI9_5_IRQHandler
    .type EXTI9_5_IRQHandler, %function
    EXTI9_5_IRQHandler:
    push {r5-r8,lr}
    ldr r5,=PORT_ADM
    ldr r6,=VAR_ADM
    ldrh r8,[r6,#RSN_RDM]
    irq5_start:
    READPORT_R5 r7,PRT_B @read from port B
    tst r7,#(SYNC|DIN)
    beq irq5_rsn_din
    tst r7,#(SYNC|DOUT)
    beq irq5_rsn_dout
    tst r7,#(SYNC)
    beq irq5_start
    //--------------------------------------------
    irq5_rsn_din:
    RESETGPIO_R5 r7,PRT_B,#(VA87DIR)
    SETPORT_R5 r7,PRT_C,MODER,moder_c_o
    SETODRPORT_R5 r8,PRT_C
    RESETGPIO_R5 r7,PRT_B,#(RPLY)
    irq5_din_rsn_h_wait:
    READPORT_R5 r7,PRT_B
    tst r7,#(DIN)
    beq irq5_din_rsn_h_wait

    ldrb r8,=0
    SETPORT_R5 r7,PRT_C,MODER,moder_c_i
    SETGPIO_R5 r7,PRT_B,#(RPLY|VA87DIR)
    ENDIRQSTATUS
    //--------------------------------------------
    irq5_rsn_dout:
    RESETGPIO_R5 r7,PRT_B,#(RPLY)
    SETPORT_R5 r7,PRT_C,MODER,moder_c_i
    irq5_rsn_dout_h_wait:
    READPORT_R5 r7,PRT_C
    READPORT_R5 r8,PRT_B
    tst r8,#(DOUT)
    beq irq5_rsn_dout_h_wait

    strh r7,[r6,#RSN_WRM]
    tst r7,#0x100 //GOR?
    ite eq
    ldrbeq r8,=1 //cmd
    ldrbne r8,=2 //synchro search
    beq EXTI9_5_IRQHandler_end
    ldrh r7,=0
    strh r7,[r6,#RSN_RDM] //RSN_RD=0
    strh r7,[r6,#RDN_RDM] //RDN_RD=0
    EXTI9_5_IRQHandler_end:
    SETGPIO_R5 r7,PRT_B,#(RPLY)
    ENDIRQSTATUS
    //--------------------------------------------

    //--------------------------------------------
    //--------------------------------------------
    .macro ENDIRQDATA
    ldrh r7,[r6,#RSN_RDM]
    bic r7,#0x80 // 7 bit (TR)
    strh r7,[r6]
    //reset exti port
    ldr r7,=EXTI_ADM
    EXTICLEARFLAG r7,r8,EXTI_LINE_11
    pop {r5-r8,lr}
    bx lr
    .endm
    //----------------------------------------------
    // EXTI15_10_IRQHandler // RDN o177132
    //----------------------------------------------
    .section .text.EXTI15_10_IRQHandler
    .global EXTI15_10_IRQHandler
    .type EXTI15_10_IRQHandler, %function
    EXTI15_10_IRQHandler:
    push {r5-r8,lr}
    ldr r5,=PORT_ADM
    ldr r6,=VAR_ADM
    ldrh r8,[r6,#RDN_RDM] @load r8 DATA
    irq10_start:
    READPORT_R5 r7,PRT_B @read from port B
    tst r7,#(SYNC|DIN)
    beq irq10_rdn_din
    tst r7,#(SYNC|DOUT)
    beq irq10_rdn_dout
    tst r7,#(SYNC)
    beq irq10_start

    irq10_rdn_din:
    RESETGPIO_R5 r7,PRT_B,#(VA87DIR)
    SETPORT_R5 r7,PRT_C,MODER,moder_c_o
    SETODRPORT_R5 r8, PRT_C
    RESETGPIO_R5 r7,PRT_B,#(RPLY)
    irq10_din_rdn_h_wait:
    READPORT_R5 r7,PRT_B
    tst r7,#(DIN)
    beq irq10_din_rdn_h_wait

    SETPORT_R5 r7,PRT_C,MODER,moder_c_i
    SETGPIO_R5 r7,PRT_B,#(RPLY|VA87DIR)
    ENDIRQDATA

    irq10_rdn_dout:
    RESETGPIO_R5 r7,PRT_B,#(RPLY)
    SETPORT_R5 r7,PRT_C,MODER,moder_c_i
    irq10_rdn_dout_h_wait:
    READPORT_R5 r7,PRT_C
    READPORT_R5 r8,PRT_B
    tst r8,#(DOUT)
    beq irq10_rdn_dout_h_wait

    strh r7,[r6,#RDN_WRM]
    SETGPIO_R5 r7,PRT_B,#(RPLY)
    ENDIRQDATA
    [свернуть]


    По сути - это весь мой эмулятор КГМД и флопов. Вернее даже не так, последний листинг, тот где описана работа с регистрами - это основа всего эмулятора, дальнейшее, можно делать как угодно. И этот кусок кода просто огромный гемморой, тк он должен выстрельнуть за время положенное на RPLY.

    - - - Добавлено - - -

    Цитата Сообщение от Titus Посмотреть сообщение
    Терминатор псевдо-пробела
    А что вот это значит?
    Последний раз редактировалось ZPilot; 16.04.2020 в 00:37.

    Этот пользователь поблагодарил ZPilot за это полезное сообщение:

    Alex_K(17.04.2020)

  6. #76

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZPilot Посмотреть сообщение
    А что вот это значит?
    А вот этого уже не помню. Терминатор - это значит что-то завершающее. Возможно, это было сделано для отладки. Т.к 1234 - это отфонарное число, просто для того, чтобы отличаться от нуля.

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

  8. #77

    Регистрация
    20.12.2005
    Адрес
    Москва
    Сообщений
    2,051
    Спасибо Благодарностей отдано 
    1,142
    Спасибо Благодарностей получено 
    1,472
    Поблагодарили
    524 сообщений
    Mentioned
    20 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Titus, а это о чём?
    // Доделать индекс для программы TS.SAV

  9. #78

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от nzeemin Посмотреть сообщение
    Titus, а это о чём?
    Не помню уже) Возможно, есть какая-то программа на УКНЦ, которая использует сигнал от индексного отверстия, а у меня это не поддерживается.

  10. #79

    Регистрация
    30.08.2011
    Адрес
    Зеленоград
    Сообщений
    7,161
    Спасибо Благодарностей отдано 
    2,979
    Спасибо Благодарностей получено 
    374
    Поблагодарили
    311 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    !ts.sav - цепочка тестов
    и насколько я знаю "индексное отверстие" как-то использует PAFCOM и ещё какие-то утилиты.
    Архив программ для УК-НЦ, ДВК и БК.

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

  11. #80

    Регистрация
    10.04.2019
    Адрес
    г. Фокино, Брянская обл.
    Сообщений
    401
    Спасибо Благодарностей отдано 
    52
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    65 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Уважаемые гуру, а не подскажите поведение УКНЦ если ВП1-128 выставляет в статусном регистре (о177130) ноль?
    Последний раз редактировалось ZPilot; 17.04.2020 в 19:19.

Страница 8 из 40 ПерваяПервая ... 456789101112 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Ответов: 713
    Последнее: 13.05.2025, 11:42
  2. Ответов: 327
    Последнее: 03.12.2019, 22:49
  3. Куплю КМД для УКНЦ
    от Feral в разделе Барахолка (архив)
    Ответов: 32
    Последнее: 07.06.2012, 13:31
  4. Продам МС5310 блок дисководов к УКНЦ+КМД УКНЦ
    от Mad Killer/PG в разделе Барахолка (архив)
    Ответов: 7
    Последнее: 19.03.2012, 11:27
  5. Контроллер КМД-УКНЦ, АУКЦИОН
    от tntpro в разделе Барахолка (архив)
    Ответов: 9
    Последнее: 23.06.2011, 16:32

Ваши права

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