User Tag List

Страница 5 из 8 ПерваяПервая 12345678 ПоследняяПоследняя
Показано с 41 по 50 из 107

Тема: Вопросы по архитектуре "Специалиста"

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Обучил я в своём эмуляторе виртуальную ВВ55 двум командам - 0x82 и 0x91. Порадовался, что игры и клавиатурный тест ivagor работают как часы. Правда попутно нашёл и обезвредил баг с клавишей НР. Но потом запустил тест Рюмика и жёстко обломался - он мою клавиатуру вообще не видит. Только клавиша НР при нажатии залипла и всё на этом. Полез в недра теста и увидел, что конкретно тест клавиатуры посылает в РУС три команды: 0x82, 0x0B и 0x0A. Про две из которых моя ВВ55 ничего не знает. Пришлось лезть за информацией в Интернет, по сути изучать вопрос заново, так как всё забылось. И вот тут снова возникли вопросы.

    1. ВВ55 может работать в трёх режимах. В газете Nicron #24 нашёл следующую информацию:

    ВВ55 может работать в трех режимах, различающихся назначением отдельных разрядов портов и портов в целом. В режимах 1 и 2 адаптер способен в ограниченных пределах самостоятельно поддерживать протоколы передачи/приема данных, например, путем выставления специальных флагов или сигналов запросов на прерывания, под которые выделяются соответствующие линии некоторых портов. Для нас эти режимы особого интереса не представляют, так как в "Спектруме" их реализация затруднена да и вообще мало полезна. В режиме 0 адаптер работает как 3 параллельных порта ввода-вывода, в которые можно просто записывать данные или считывать оттуда. В режиме 0 порты A и B программируются либо на ввод, либо на вывод как 8-разрядные регистры, а порт C делится на два 4-битных регистра, каждый из которых может либо принимать, либо передавать данные.
    Вопрос: А что со Специалистом, работают ли режимы 1 и 2 на нём?

    2. Команды 0x0A и 0x0B, которые подаёт тест Рюмика в РУС не используют бит Флага управления:



    Вопрос: Я правильно понимаю, что Флаг управления (D7) используется только для использования совместно с битами Выбора режима (D6, D5 и D2), а направление каналов можно задавать и без D7?
    Последний раз редактировалось CityAceE; 08.10.2023 в 17:34.
    С уважением, Станислав.

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

  3. #2

    Регистрация
    01.12.2020
    Адрес
    п. Заволжский
    Сообщений
    33
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    10 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Post

    Цитата Сообщение от CityAceE Посмотреть сообщение
    А что со Специалистом, работают ли режимы 1 и 2 на нём?
    Нет. Специалист под режимы 1 и 2 не запаян. Эти режимы для работы с оборудованием типо принтера и т.п.
    МС ВВ55 — аналог Intel 8255, значит и документацию лопатить на него.
    В спойлере реализация на C, но только режим 0 (т.е. что требуется).

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


    bb55ppi.h:
    Код:
    #ifndef __BB55PPI_H
    #define __BB55PPI_H
    
    typedef struct _BB55
    {
    	char ain;
    	unsigned char a;
    	char bin;
    	unsigned char b;
    	char clin;
    	char chin;
    	unsigned char c;
    } BB55;
    
    void BB55Reset (BB55 *pbb55);
    int BB55Wr (BB55 *pbb55, int port, int val);
    int BB55Rd (BB55 *pbb55, int port);
    int BB55Set (BB55 *pbb55, int row, int val);
    int BB55Get (BB55 *pbb55, int row);
    
    #endif
    bb55ppi.c:
    Код:
    #include "bb55ppi.h"
    
    void BB55Reset (BB55 *pbb55)
    {
    	pbb55->ain  = -1;
    	pbb55->bin  = -1;
    	pbb55->clin = -1;
    	pbb55->chin = -1;
    	pbb55->a = pbb55->b = pbb55->c = 0;
    }
    
    int BB55Wr (BB55 *pbb55, int port, int val)
    {
    	switch(port & 0x3) {
    	case 0:	if (pbb55->ain)
    			return -1;
    		pbb55->a = (unsigned char) val;
    		break;
    	case 1:	if (pbb55->bin)
    			return -1;
    		pbb55->b = (unsigned char) val;
    		break;
    	case 2:	if (pbb55->chin)
    			val &= 0x0f;
    		if (pbb55->clin)
    			val &= 0xf0;
    		pbb55->c |= val;
    		if (pbb55->clin || pbb55->chin)
    			return (int)(unsigned char)val | (-1&~0xff);
    		break;
    	case 3:	if (val & 0x80)	{
    			if (val & 0x10)
    				pbb55->ain = -1;
    			else {
    				pbb55->ain = 0;
    				pbb55->a   = 0;
    			}
    			if (val & 0x02)
    				pbb55->bin = -1;
    			else {
    				pbb55->bin = 0;
    				pbb55->b   = 0;
    			}
    			if (val & 0x08)
    				pbb55->chin = -1;
    			else {
    				pbb55->chin = 0;
    				pbb55->c &= 0x0f;
    			}
    			if (val & 0x01)
    				pbb55->clin = -1;
    			else {
    				pbb55->clin = 0;
    				pbb55->c &= 0xf0;
    			}
    			break;
    		}
    		if ((val & 0x0e) >= 8)
    			if (pbb55->chin)
    				return -1;
    			else {
    				unsigned char mask = 1<<((val & 0x0e)>>1);
    				pbb55->c &= ~mask;
    				pbb55->c |= val & 0x01 ? mask : 0;
    			}
    		else	if (pbb55->clin)
    				return -1;
    			else {
    				unsigned char mask = 1<<((val & 0x0e)>>1);
    				pbb55->c &= ~mask;
    				pbb55->c |= val & 0x01 ? mask : 0;
    			}
    		break;
    	}
    	return (unsigned char) val;
    }
    
    int BB55Rd (BB55 *pbb55, int port)
    {
    	switch (port & 0x3) {
    	case 0:	return pbb55->a | (pbb55->ain ? 0 : -1&~0xff);
    	case 1:	return pbb55->b | (pbb55->bin ? 0 : -1&~0xff);
    	case 2:	return pbb55->c | (pbb55->clin && pbb55->chin ? 0 : -1&~0xff);
    	case 3:	return (pbb55->ain ? 0x10 : 0) | (pbb55->bin ? 0x02 : 0) |
    			(pbb55->clin ? 0x01 : 0) | (pbb55->chin ? 0x08 : 0);
    	}
    	return 0;
    }
    
    int BB55Set (BB55 *pbb55, int row, int val)
    {
    	switch (row & 0x3) {
    	case 0:	if (!pbb55->ain)
    			return -1;
    		pbb55->a = (unsigned char) val;
    		break;
    	case 1:	if (!pbb55->bin)
    			return -1;
    		pbb55->b = (unsigned char) val;
    		break;
    	case 2:	if (!pbb55->clin)
    			return -1;
    		pbb55->c &= 0xf0;
    		pbb55->c |= (unsigned char)val & 0x0f;
    		break;
    	case 3:	if (!pbb55->chin)
    			return -1;
    		pbb55->c &= 0x0f;
    		pbb55->c |= (unsigned char)val &0xf0;
    		break;
    	}
    	return 0;
    }
    
    int BB55Get (BB55 *pbb55, int row)
    {
    	switch (row & 0x3) {
    	case 0:	return pbb55->a | (pbb55->ain ? -1&~0xff : 0);
    	case 1:	return pbb55->b | (pbb55->bin ? -1&~0xff : 0);
    	case 2:	return (pbb55->c & 0x0f) | (pbb55->clin ? -1&~0xff : 0);
    	case 3:	return (pbb55->c & 0xf0) | (pbb55->chin ? -1&~0xff : 0);
    	}
    	return -1;
    }
    [свернуть]


    Цитата Сообщение от CityAceE Посмотреть сообщение
    направление каналов можно задавать и без D7
    D7=1 — признак записи управляющего слова в регистр управления (а значит и направления передачи).
    D7=0 — оперирование битами.
    Последний раз редактировалось lexarr; 08.10.2023 в 18:38.

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

    CityAceE(08.10.2023)

  4. #3

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от lexarr Посмотреть сообщение
    Специалист под режимы 1 и 2 не запаян. Эти режимы для работы с оборудованием типа принтера и т.п.
    ОК. И тогда как должна себя вести ВВ55 при подаче команды на переключения в 1-й или 2-й режим?

    Цитата Сообщение от lexarr Посмотреть сообщение
    МС ВВ55 — аналог Intel 8255, значит и документацию лопатить на него.
    Да, спасибо. Пользовался в том числе и этой статьёй при изучении вопроса.

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Я правильно понимаю, что Флаг управления (D7) используется только для использования совместно с битами Выбора режима (D6, D5 и D2), а направление каналов можно задавать и без D7?
    Уже понял, что это не так. Но оно и по описанию было понятно. Просто смутило, что тест Рюмика пишет в РУС без указания D7. А опытным путём я понял, что это программирование звука. Правда пока не очень ясно, почему записывая в ВУС мы получаем запись в старшую тетраду канала С. Смутно помню, что что-то по этому вопросу было, но не нашёл инфу.

    Сейчас получается, что тест Рюмика у меня не работает из-за некоей ошибки в моём коде. Этот тест каким-то образом в своей работе обходится только режимом 0x82, а у меня он реализован. Значит, я что-то не учитываю или где-то ошибся...
    С уважением, Станислав.

  5. #4

    Регистрация
    30.12.2018
    Адрес
    г. Москва
    Сообщений
    1,375
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    384
    Поблагодарили
    346 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    ОК. И тогда как должна себя вести ВВ55 при подаче команды на переключения в 1-й или 2-й режим?
    как описано в даташите. будет ли оно иметь практический смысл в применении к Специалисту - большой вопрос.


    Уже понял, что это не так. Но оно и по описанию было понятно. Просто смутило, что тест Рюмика пишет в РУС без указания D7. А опытным путём я понял, что это программирование звука. Правда пока не очень ясно, почему записывая в ВУС мы получаем запись в старшую тетраду канала С. Смутно помню, что что-то по этому вопросу было, но не нашёл инфу.
    в даташите подробно все описано. запись в РУС при сброшенном D7 - манипуляция с битами порта С. при этом D0 - то что надо записать в нужный бит, D1-D3 - номер бита, D4-D6 - dont care.
    это используется в подпрограммах звука и записи на ленту если не ошибаюсь.

    Зверинецъ

    Специалист (был когда-то "совсем стандарт") - 1988-2023
    Ленинград1 +256К +AY+BDI+VGA выход +Ethernet (Speccyboot) +Xmodem (115200)+divmmc
    Ленинград2 + CF карта
    Платформа 8085+Z80+CPLD (Специалист МХ2 +SD +FDD +PS/2kbd)
    БК0010-01 стоковый
    [свернуть]

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

    CityAceE(08.10.2023)

  6. #5

    Регистрация
    01.12.2020
    Адрес
    п. Заволжский
    Сообщений
    33
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    10 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    ОК. И тогда как должна себя вести ВВ55 при подаче команды на переключения в 1-й или 2-й режим?
    Всё что угодно. Может и замкнуть. Эти режимы не используются на спеце вообще, их можно не реализовывать.

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Да, спасибо. Пользовался в том числе и этой статьёй при изучении вопроса.
    Больше половины статьи можно не изучать (посвящено 1-му и 2-му режимам), нужно лишь знать, как порты переключаются на ввод/вывод и щёлкаются отдельные ножки.

    Цитата Сообщение от CityAceE Посмотреть сообщение
    что-то по этому вопросу было, но не нашёл инфу
    Нет, там есть всё, разбираться нужно.

  7. #6

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Значит, я что-то не учитываю или где-то ошибся...
    Ошибся Снова при определённых условиях портилась регистровая пара BC, а за одно и флаги. Всё из-за того, что вовремя не делал 32-х битному регистру AND A,#FF. В итоге лишние единицы, которые появлялись в верхних разрядах при определённых условиях портили B, C и F. Теперь тест Рюмика работает, как положено. Зато снова много про ВВ55 почитал
    С уважением, Станислав.

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

    parallelno(09.10.2023)

  8. #7

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    И снова я с вопросами. На этот раз не по архитектуре, а по логике работы клавиатуры.

    Тест клавиатуры C.Рюмика работает исключительно в режиме #82 ППИ ВВ55: каналы A и младший С на запись, а В на считывание. Очевидно, что он поочерёдно засылает в каждый бит портов А и С нули, а потом их встречает в порту В. Где пересечение, там кнопка и нажата. Так ведь? И это отлично работает при одной нажатой клавише. Но при таком методе, если нажать 3 клавиши по углам квадрата, то автоматически "нажмётся" и 4-я:



    И я в этом убедился, когда реализовал этот подход при подключении матричной клавиатуры к эмулятору. Для экспериментов подключил клавиатуру от Ардуино 4x4. Вот такую:



    Нажатые клавиши у меня хранятся в матрице 4x4. Это 16-ти битное число, где каждый включенный бит - это нажатая клавиша. И всё вроде хорошо, кроме вот этого эффекта.

    Однако в тесте Рюмика ничего подобного не происходит! Как он этого добился? Не могу сообразить.
    С уважением, Станислав.

  9. #8
    HardWareMan
    Гость

    По умолчанию

    CityAceE, ты прав, развязки (диодов) нет, все косяки и опасности присутствуют. Если интересует, как именно опрашивает клавишу Рюмик - просто дизассемблируй его тест. Найти код, обращающийся к ППА не вызовет проблем.

  10. #9

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    развязки (диодов) нет
    Я никак не соображу чем диоды в данном случае смогут помочь помимо защиты порта от выгорания?

    Диоды если только так ставить, на каждую клавишу, а не на линию:


    Цитата Сообщение от HardWareMan Посмотреть сообщение
    просто дизассемблируй его тест
    Я думал, что существует какой-то известный алгоритм. Но глядя на рисунок я вижу и понимаю, что это просто невозможно. И тем не менее Рюмик работает! Это просто какая-то магия!

    Погуглил и выгуглил, что проблема довольно известна в любом клавиатуростроении и называется ghosting. Решается кардинально только диодами на каждой клавише. Но такой метод практически не применяется, а применяется умная разводка клавиатуры, чтобы максимально разнести клавиши, которые могут быть одновременно нажаты, а также в бой идут разнообразные алгоритмы для искусственного блокирования левых нажатий.

    Тем интереснее стало узнать, как же это организовано у Рюмика.
    Последний раз редактировалось CityAceE; 10.10.2023 в 23:06.
    С уважением, Станислав.

  11. #10
    HardWareMan
    Гость

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Диоды если только так ставить, на каждую клавишу, а не на линию:
    Не обязательно. Получается монтажное И. Главное, чтобы диоды были на порту, что настраивается на выход. А у Специалсита нет диодов и можно опрашивать порты как 6х12 так и 12х6.

Страница 5 из 8 ПерваяПервая 12345678 ПоследняяПоследняя

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

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

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

Похожие темы

  1. RK-КНГМД для "Специалиста"
    от zx_ в разделе Специалист
    Ответов: 136
    Последнее: 14.09.2025, 07:03
  2. Плёночная клавиатура Специалиста "Экспресс"
    от HardWareMan в разделе Специалист
    Ответов: 1
    Последнее: 06.02.2023, 22:59
  3. Симуляция "ЛИКа" (модификации Специалиста)
    от apofig в разделе Специалист
    Ответов: 27
    Последнее: 06.06.2022, 20:31
  4. Ответов: 5
    Последнее: 03.07.2015, 00:22
  5. Продам плату ПК "УЦА" (клон "Специалиста")
    от riogen в разделе Барахолка (архив)
    Ответов: 2
    Последнее: 25.01.2011, 11:02

Ваши права

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