С атмеги надо вывести как минимум MAGIC, TURBO ON/OFF (тут вариант - или триггером, или импульсом), ещё 1-2 сигнала на усмотрение пользователя. Сейчас эти сигналы есть практически у всех новоделов.
Вид для печати
С атмеги надо вывести как минимум MAGIC, TURBO ON/OFF (тут вариант - или триггером, или импульсом), ещё 1-2 сигнала на усмотрение пользователя. Сейчас эти сигналы есть практически у всех новоделов.
Вопрос по SJP v2.
Пока я застопорился на прошивке атмеги, появился вопрос: а кемпстон тут реализован выдачей 0 или 1 при нажатой кнопке с платы на порт компа? На скорпионе для кемпстона общий +5В, потому я не знаю, подключать его к этой плате или надо инвертор добавить?
Фьюзы для AVRDUDE прописаны в файле prog_bat_file.bat:
Кемпстон реализован выдачей 0 при нажатии. Подключать через инверторы.Код:avrdude -p atmega48 -c FT232_AVR_PROG -P ft0 -B 4800 -U lfuse:w:0xef:m -U hfuse:w:0xdc:m -F
avrdude -p atmega48 -c FT232_AVR_PROG -P ft0 -e -U flash:w:SUPER_JOYSTICK_PORT_2.hex -F
PAUSE 0
Итак, заменил Atmega48PA на Atmega48, программатор сразу стал её видеть, всё чудесно прошиватеся-стирается-проверяется. Но всё равно не работает: при включении все индикаторы зажигаются-гаснут и более не реагируют ни на что. Должны ли CaspLock/MumLock/ScrolLock зажигать их без контроллера?
Клавиатура прекрасно работает с ZXMC2 по сканкодам Set3, но тут реализован Set2. Другой клавиатуры у меня под руками нет, потому думаю как в прошивке FLASH_DATA.asm поменять Set2 на Set3. Не совсем понятно, что делать с куском раскладок с префиксом E0. Какие будут советы?
Запустил платку, разбираюсь с прошивками. Добавил специфичную команду для Scorpion'a - холодный сброс (Курсор Влево и Reset).
Разбираюсь с Magic. Проблема в автоповторе: контроллер иногда успевает дважды отправить нажатие. Думаю над тем, как убрать вообще автоповтор при нажатии только нужной кнопки.
Вообще, контроллер интересный, прошивка хорошо откоментирована, можно легко менять раскладку, НО если не нужно специфических комбинаций кнопок. Вот с ними пока не всё понятно.
Добавлено:
- Выдача NMI (Magic). Сидит на ScrollLock. Дребезга не замечено, проверял в нескольких программах.
Не совсем понятны нюансы:
Почему макрос "PRESS NULL" ставится только между кавычками? Когда его имеет смысл ставить, а когда нет? В другой команде это макрос стоит и после второй кавычки.Код:PRESS CS+KEY_L
PRESS CS+KEY_O
PRESS CS+KEY_A
PRESS CS+KEY_D
PRESS SS+KEY_P
PRESS NULL ; отпускание всех кнопок
PRESS SS+KEY_P
PRESS KEY_EN
Сейчас уже не помню. Этот макрос для ПЗУ Open SE BASIC. Там команда LOAD вводится по буквам. Возможно две ковычки подряд программа в ПЗУ считала как долгое нажатие и вводила больше двух ковычек. Или просто для красоты - чтобы была пауза между двумя кавычками.
Не получается выдать команду на клавиатуру для зажигания светодиода. Кусок кода взят из соседней темы "контроллер на атмеге48". Контроллер либо виснет, либо ничего (?) не происходит. Думаю плюнуть на этот момент, хотя было бы удобно.
Не понятно как реализовать Pause, слишком мудрёно получается. Ну и оказалось в городе не найти сеговского джойстика, эта часть тоже отложена на потом. Джойстик мне особо и не актуален, но интересно попробовать. Классический дискретный джойстик, подключенный к контроллеру, не заработал. Хотя надеялся, что тупо ВНЛПО контроллер выдаст.
Как надо чтобы работала пауза ? Можно нажатием кнопки PAUSE останавливать игру и ею же продолжать.
но тут сделан wait не на отдельном бите атмеги, а на сдвиговом регистре. Если бы был бит - я бы просто инвертировал его с каждым нажатием так же, как сделал управление турбо. А тут надо по нажатию кнопки зациклить выдачу wait до следующего нажатия. Но опрос клавиш по прерыванию происходит в одном месте, а бесконечный цикл надо делать в другом. Что произойдёт, если атмегу зациклить в блоке макросов команд?
Я подумаю, как это сделать. Если WAIT подключен через регистр, значит я считал, что с помощью него можно останавливать Z80.
"SUPER JOYSTICK PORT 2" можно подпаять к клонам "Ленинград", "Pentagon", "Scorpion" и подобных на логических микросхемах и имеющих порт для подключения механической клавиатуры. Планировалось обеспечить легкость подключения к "ZX-Evolution", поэтому разъем для подключения имеет такую же цоколевку, но затем выяснилось, что сигналы, формируемые ZX-Evo на разъеме не соответствуют логике работы в указанных выше компьютерах. Если логика работы в ZX-Evo будет передалана, то данный адаптер можно будет подключить и к этому компьютеру.
Для выбора типа джойстика используются комбинации кнопок:
SELECT + A = SINCLAIR 1
SELECT + B = SINCLARI 2
SELECT + C = KEMPSTON
SELECT + X = CURSOR
SELECT + Y = QAOPM
SELECT + Z = ELITE
У нас в городе геймпады найти оказалось нереально, потому заказал с наебея. Качество конечно не особо в сравнении с былыми, но самый подвох в том, что у них нет кнопки MODE! Я так понимаю, что это она названа в прошивке и описании как SELECT и на которую завязан выбор раскладки.
Подключил к контроллеру и обнаружил, что работают только кнопки АВС, влево, вниз и старт.
Заменил в прошивке переключение раскладок - вместо SELECT должна работать START. Получил странный эффект - раскладки частично переключаются, но макрос по нажатию START всё равно вводится, хоть я закомментил переход на эту метку.
Буду разбираться дальше.
Есть подозрение, что проблемы с джойстиком в процедуре опроса. По некоторым причинам я перевёл контроллер на внутренний кварц 8МГц, а задержки в модуле SEGA пока не менял. Надо подумать как лучше поступить.
Отправлено с моего Redmi Note 4 через Tapatalk
Планирую добавить в свой безвайтовый адаптер клавиатуры и джойстиков режим REDEFINE KEYS для курсора клавиатуры и геймпадов. Настраисаться будут курсор и 6 кнопок на геймпаде или 6 кнопок над курсором клавиатуры.
Порядок настройки будет такой. Нажимаем кнопку F4, затем кнопку на геймпаде или курсоре клавиатуры и кнопку на клавиатуре, которую надо закрепить.
Выбор Синклер джойстиков и Кемпстона для геймпадов и курсора клавиатуры будет нажатием кнопок F1-F3 и цифры 1-7.
В новой версии прошивки планируются изменения:
Настройка типа джойстика с клавиатуры нажатием кнопкик F1-F5, а затем цифры.
F1 - первый джойстик
F2 - второй джойстик
F3 - курсор на PC клавиатуре
Цифры задают тип джойстика:
1 - SINCLAIR1
2 - SINCLAIR2
3 - KEMPSTON
4 - CURSOR
5 - QAOPM
6 - ELITE
0 - DEFINE
F9 - режим REDEFINE KEYS
F10 - сохранение настроенной комбинации кнопок
F11 - восстановление сохраненной комбинации
Комбинаций может быть до 10. Номер указывается нажатием цифры после F10 или F11.
Я решил поменять ник на zx-kit и фамилию на "Robinson" как у известного изобретателя из мультфильма "В гости к Робинсонам"!
Я тоже люблю изобретать.
Предлагаю подумать над переводом атмеги на внутренний генератор с пересчётом задержек и особенно опроса джойстиков. А то вот у меня с внешним какие-то грабли и она просто не запускается и программатором не определяется. Чтобы программатор её смог оживить придётся долго и упорно повтор прошивания делать и тогда чудо может произойти. С внутренним генератором всё пока работало стабильно даже в турборежиме. Правда почти год уже как не включал скорп - времени совсем нет, так на опросе джоя и застрял.
Обновленная монтажная схема
Номиналы некоторых резисторных сборок уменьшены до 4.7 К.
Сейчас прошивка дорабатыватся для работы с механическим джойстиком. Выбор типа будет осуществляться с PS/2 клавиатуры. К джойстику нужно припаять гнездо DB-09F со следующей распайкой:
1 - UP
2 - DOWN
3 - LEFT
4 - RIGHT
5 -
6 - FIRE1
7 -
8 - GND
9 - FIRE2
Fire вроде надо на 6 для совместимости со стандартом Atari.
Для облегчения подключения к компьютерам "SCORPION" и "LENINGRAD", у которых общий провод KEMPSTON джойстика подключался к +5V, данные на KEMPSTON будут идти с инверсией. Но инверсию можно будет отключить, ести установить джампер между 1 и 2 контактами разъема, который раньше назывался UART.
Думаю, что как джойстик лучше использовать курсор на цифровой клавиатуре справа - он похож на крестовину.
У всех джойстиков перепрограммируемыми сделать стрелки и FIRE.
Добавил в комплектацию красную кнопку и разъем IDC-10F для возможности RESTART и восстановления настроек по умолчанию.
В комплекте шлейфы 10 и 20 жил по 20 см и разъемы IDC для подключения к компу и 10 жил 10 см для подключения красной кнопки.
Кварц остается в комплектации "для красоты", но генератор будет использоваться внутренний.
Надеюсь, в прошивке можно будет переопределить кнопки для джоя? А то на миниклавиатурах нет отдельного цифроблока.
Код:.def temp = r16 ; временный регистр для основной программы и подпрограмм, кроме п/п прерываний
.def delay_cnt = r19 ; счётчик для задержки времени
.def cnt = r20 ; регистр для счетчиков циклов
- - - Добавлено - - -Код:;
***********************************************************************************************************************
;* 170930-03 ВРЕМЕННАЯ ЗАДЕРЖКА 1 мс (1мсек=8МГЦ / 5 / 1000 = 0x000640)
;***********************************************************************************************************************
Delay1mS:
push temp
push cnt
push delay_cnt
ldi temp,243 ; для 8 МГц
ldi cnt, 107 ; для 8 МГц
mov delay_cnt,temp
Delay1ms_1:
inc cnt
breq Delay1ms_exit
mov temp,delay_cnt
Delay1ms_2:
inc temp
breq Delay1ms_1
rjmp Delay1ms_2
Delay1ms_exit:
pop delay_cnt
pop cnt
pop temp
ret
;***********************************************************************************************************************
;* 170806-03 ВРЕМЕННАЯ ЗАДЕРЖКА 5 мс
;***********************************************************************************************************************
Delay5mS:
rcall Delay1mS
rcall Delay1mS
rcall Delay1mS
rcall Delay1mS
rcall Delay1mS
ret
;***********************************************************************************************************************
;* 170806-03 ВРЕМЕННАЯ ЗАДЕРЖКА 50 мс
;***********************************************************************************************************************
Delay50mS:
push temp
ldi temp,50
Delay50mS_10:
rcall Delay1mS
dec temp
brne Delay50mS_10
pop temp
ret
;***********************************************************************************************************************
;* 150409-02 ВРЕМЕННАЯ ЗАДЕРЖКА 100 мс
;***********************************************************************************************************************
Delay100mS:
push temp
ldi temp,100
Delay100mS_10:
rcall Delay1mS
dec temp
brne Delay100mS_10
pop temp
ret
;***********************************************************************************************************************
;* 150409-02 ВРЕМЕННАЯ ЗАДЕРЖКА 1 СЕК
;***********************************************************************************************************************
Delay1S:
rcall Delay100mS
rcall Delay100mS
rcall Delay100mS
rcall Delay100mS
rcall Delay100mS
rcall Delay100mS
rcall Delay100mS
rcall Delay100mS
rcall Delay100mS
rcall Delay100mS
ret
;***********************************************************************************************************************
; короткая задержка
;***********************************************************************************************************************
SMALL_WAIT:
nop
ret
Вроде бы для организации WAIT через разъём UART я ещё аппаратно припаивал диод или резистор на данный контроллер, счас не помню, а скорп убран.Код:
;***********************************************************************************************************************
;* 170805-03 Cold Reset (CurLeft+RESET) (COM+00: PrnScr)
;***********************************************************************************************************************
Command_00:
PRESS CS+KEY_5
rcall Delay100mS ; время нажатия одной кнопки 100 милисекунд
PRESS Z80_RESET ; включение сигнала RESET
PRESS NULL ; отпускание всех кнопок
ret
;***********************************************************************************************************************
;* 170723-03 Magic (NMI) (COM+15: ScrollLock)
;***********************************************************************************************************************
Command_15:
PRESS Z80_NMI
PRESS NULL ; отпускание всех кнопок и выключение NMI
rcall Delay1S ; время нажатия одной кнопки 1 секунда
ret
;***********************************************************************************************************************
;* 170925-03 Turbo On/Off (COM+16: NumLock)
;***********************************************************************************************************************
Command_16:
PRESS Z80_TURBO
PRESS NULL ; отпускание всех кнопок
rcall Delay100mS ; время нажатия одной кнопки 1 милисекунда
ret
;***********************************************************************************************************************
;* 180604-03 PAUSE, пауза /WAIT (COM+18))
;***********************************************************************************************************************
Command_18:
sbis PORTD,PD1 ; проверяем состояние бита 1
rjmp BIT_IS_LO ; если бит в 0, то включаем его
cbi PORTD,PD1 ; иначе выключаем его
rjmp WAIT_EXIT
BIT_IS_LOW:
sbi PORTD,PD1 ;включили бит
WAIT_EXIT:
PRESS NULL ; отпускание всех кнопок
rcall Delay100mS ; время нажатия одной кнопки 100 милисекунд
ret
Если быстро нажать-отпустить PrnScr, то получается "тёплый старт" как простой сброс, если нажать-чуть подержать-отпустить, то срабатывает полноценный макрос "холодный старт" с инициализацией скорпиона. Почему так получается, если написан только один макрос - не понимаю.
Кнопки надо было нажимать после ресета.
Код:;***********************************************************************************************************************
;* 170805-03 Cold Reset (CurLeft+RESET) (COM+00: PrnScr)
;***********************************************************************************************************************
Command_00:
PRESS Z80_RESET ; включение сигнала RESET
PRESS CS+KEY_5
rcall Delay1S
PRESS NULL ; отпускание всех кнопок
ret
Мммм, не знаю, может быть. Как дети подрастут немного и у меня появится свободного времени больше, проверю. Но текущий удобнее - холодный старт дольше идёт и реже нужен.
Вновь нашлось время посидеть поразбираться.
1) Холодный рестарт переделал как указано выше. Замапил его на SHIFT + PrnScr. По обычному PrnScr просто выдаём RESET и выполняем тёплый рестарт.
2)Проблема с геймпадом - не работают XYZ, LDU при нажатии одновременно в ZX передают как будто нажаты 2 кнопки. Причём эта кнопка-призрак всегда 1 или 2 или 3. Временно решено отключением опроса кнопок XYZ в файле INTERRUPTS. Сразу прекрасно заработал опрос UDLRABC, START. Работает переключение раскладок для геймпада. Может у меня геймпад не исправен, но проверить его не на чем.Заработало.
3) Механический джойстик тоже работает (чего бы ему не работать, ведь опрос UDLRBC идёт не зависимо от сигнала SEL).
4) Самая главная проблема. Так как кнопки обоих геймпадов кидаются в буфер клавиатуры, который ограничен 4 кнопками, то поиграть вдвоём получится только если один назначен как KEMPSTON. Ведь одновременное нажатие 2 направлений + огонь на обоих геймпадах дадут 6 кнопок! Так что получается второй порт этого контроллера можно захардкодить на KEMPSTON, а переключаемым сделать только первый порт. Либо надо увеличивать буфер клавиатуры.
5) Кстати, ограничение буфера клавиатуры не даёт вводить всякие чит-коды в играх одновременным нажатием. Но тут ещё ограничение от самого контроллера в PS/2-клавиатуре.
6) Интересен функционал назначения раскладок джойстиков на курсорные кнопки клавиатуры. Буду думать как это настроить.
7) Надо подумать как оживить индикаторы на клавиатуре.
А что, больше данный контроллер никого не заинтересовал?
Зря, слот не требуется, PS/2 подключается вместо классической клавиатуры, ещё и джойстики можно на лету менять, пусть и с ограничениями.
Хотя да, счас USB актуальнее.