Выбор читателей
Популярные статьи
Сегодня расскажу вам как совместить две обычные вещи в один оригинальный подарок. В сети есть такой иностранный персонаж как AVGN, который занимается обзорами старых игровых приставок и игр к ним. Так вот есть у него довольно забавный агрегат, под названием Nintoaster. Представляет он собой приставку NES в корпусе тостера. Почесав репу, я подумал, а чем я хуже него и решил собрать подобный девайс себе. Но так как про NES у нас в стране в основном никто и слыхом не слыхивал, а все знали только тайваньско-китайский клон японского Famicom под названием Dendy. Поэтому аппарат решено было назвать Dentoaster.
Все началось с поисков подходящего тостера на корпус. Через месяц ожидания на барахолке нашелся старый российский тостер и выглядел он вот так (фото с объявления).
На дне тостера красовались характеристики агрегата, что сделан он в 1995 году и мощностью на 800 Ватт. Несмотря на свой почтенный возраст, тостер исправно выполнял свою основную функцию.
А вот годы использования сказались на нем довольно плачевно. Аппарат был весь в нагаре и каплях масла. Благо средство для чистки газовых плит с нагаром и жиром справилась на ура. Фото всего этого безобразия увы не сделал, ибо сразу побежал его от этого дела отмывать. Зато есть фото поддона с крошками, которые все 18 использования тостера копились и присыхали там навсегда. То еще зрелище, но все так же решилось простым отмыванием.
Ладно, корпус пока оставим и займемся изъятием лишних потрохов. Убираем нагревательные элементы вместе со слюдяной термоизоляцией и направляющие грили для хлеба.
Теперь удаляем часть механизма опускания хлеба – две волнообразные металлические полоски. Благо все было на точечной сварке и отделилось довольно легко.
Временно отвинчиваем контактную группу с таймером.
И в сухом остатке получаем вот такую конструкцию.
Очищаем контактную группу от пыли и отпаиваем остатки родных проводов.
И привинчиваем ее к конструкции обратно.
Левая и правая стенки потрохов были скреплены продольными планками, но конструкция ходила ходуном. Поэтому было решено спаять планки боковушками. Сначала снаружи.
А потом и изнутри.
Порывшись в закромах нашел вот такие миниатюрные петли, которые как нельзя кстати подошли ко всему этому делу.
Временно прихватил петли на пайку и суперклей.
А в качестве механизма возврата приделал пружинку.
Вот так это выглядело после первых прикидок.
Вот только цвет у тостера не подходящий, поэтому решено было его перекрасить.
После перекраски стало выглядеть намного симпатичнее.
Соответственно и заглушки было решено покрасить в тот же цвет.
Панель под разъемы джойстиков и кнопки reset сделал из такой же заглушки.
Отпиливаем от нее лишнее и размечаем будущие отверстия.
И любым доступным способом проделываем их. Я пользовался дремелем и надфилями.
А затем красим.
В качестве декоративной части кнопки reset было решено пожертвовать единственным джоем, который у меня с 95 года остался. Все равно он уже свое отжил и половина кнопок не работала. Да и провода перепаивать лень было. Про саму же кнопку писать особо нечего, так как это просто китайская кнопка на замыкание, без фиксации положения. Такие например в китайские лазерные указки ставят.
Короче приклеиваем на супреклей декоративную часть к кнопке.
Из обрезков пластика и текстолита про помощи того же суперклея делаем импровизированное крепление для кнопки.
И закрепляем всю конструкцию на положенном ей месте.
В итоге получаем вот такой результат.
Теперь разбираем нашу приставку.
Потроха у новодела не чета старым консолям, но работаем с тем, что имеем. Хорошо видны контакты кнопок power и reset, к которым надо будет подпаяться.
Временно отпаиваем шлейф от платы со стабилизатором напряжения и разъемами подключения кабелей.
Закрепляем на термоклей плату с разъемами джойстиков и кнопками включения и reset. Родные кнопки решил не выпаивать, ибо они не мешались внутри корпуса.
А плату с разъемом под картридж крепим сначала на винты (благо в родных боковушках тостера отверстия уже были), а потом закрепляем на “Полиморфус”.
На те же термоклей и полиморфус крепим панель с разъемами и кнопкой. Вот так это безобразие выглядит снаружи.
Первым делом читаем, как происходит взаимодействием с ним. А происходит оно через запись по определённым адресам, их 8 групп: $8000-$9FFE (чётные), $8001-$9FFF (нечётные), $A000-$BFFE (чётные), $A001-$BFFF (нечётные), $C000-$DFFE (чётные), $C001-$DFFF (нечётные), $E000-$FFFE (чётные) и $E001-$FFFF (нечётные). Запись по любому адресу внутри группы равнозначна. Видите закономерность? Регистр выбирается с помощью трёх адресных бит: A0 , A13 и A14 , остальные же значения не имеют.
Попробуем же имитировать работу маппера с помощью ПЛИС. Код я пишу на языке Verilog. Он тут не подсвечивается, прошу прощения за это.
Сначала описываем наши регистры, которые хранят текущее состояние:
reg bank_select;
reg prg_mode;
reg chr_mode;
reg r ;
reg mirroring;
reg ram_protect;
reg irq_latch;
reg irq_counter;
reg a12_low_time;
reg irq_reload;
reg irq_reload_clear;
reg irq_enabled;
Описываем реакцию на запись по соответствующим адресам. Возрастающий сигнал /ROMSEL
говорим о том что было обращение к памяти картриджа, т.е. по адресам $8000-$FFFF
, нам надо реагировать именно в этот момент.
always @ (posedge romsel)
begin
// Но только если это была запись
if (cpu_rw_in == 0)
begin
// Рассматриваем состояние A14, A13 и A0, обновляем соответствующие регистры
case ({cpu_addr_in, cpu_addr_in})
3"b000: begin // $8000-$9FFE, even
bank_select <= cpu_data_in;
prg_mode <= cpu_data_in;
chr_mode <= cpu_data_in;
end
3"b001: r <= cpu_data_in; // $8001-$9FFF, odd
3"b010: mirroring <= cpu_data_in; // $A000-$BFFE, even
3"b011: ram_protect <= cpu_data_in; // $A001-$BFFF, odd
3"b100: irq_latch <= cpu_data_in; // $C000-$DFFE, even
3"b101: irq_reload <= 1; // $C001-$DFFF, odd
3"b110: irq_enabled <= 0; // $E000-$FFFE, even
3"b111: irq_enabled <= 1; // $E001-$FFFF, odd
endcase
end
if (irq_reload_clear)
irq_reload <= 0;
end
Теперь же опишем, какой должен выбираться банк при обращении к соответствующей части памяти в зависимости от наших регистров.
Переключаются они в соответствии с такой таблицей:
Где $8000 & #$40
- это у нас prg_mode, а -2 и -1 - это предпоследний и последний банк соответственно. Получается такой код:
// PRG banking
always @ (*)
begin
case ({cpu_addr_in, prg_mode})
// $8000-$9FFF
3"b000: cpu_addr_out <= r;
3"b001: cpu_addr_out <= 6"b111110; // Предпоследний банк
// $A000-$BFFF
3"b010,
3"b011: cpu_addr_out <= r;
// $C000-$DFFF
3"b100: cpu_addr_out <= 6"b111110; // Предпоследний банк
3"b101: cpu_addr_out <= r;
// $E000-$FFFF - всегда является последним банком
default: cpu_addr_out <= 6"b111111;
endcase
// A12 у MMC3 на выходе всегда как на входе, он идёт напрямую в память
cpu_addr_out <= cpu_addr_in;
end
Теперь CHR. Там такая схема:
Где $8000 & #$40
- это chr_mode. Получается так:
// CHR banking
always @ (*)
begin
if (ppu_addr_in == chr_mode)
ppu_addr_out <= {r, ppu_addr_in};
else
ppu_addr_out <= r];
// Максимальный размер CHR у MMC3 - 256 килобайт, поэтому A18 всегда 0.
ppu_addr_out <= 0;
end
Режим зеркалирования описывается всего одной строкой. В зависимости от него мы замыкаем вывод картриджа CIRAM A10
либо на A10
, либо на A11
:
assign ppu_ciram_a10 = mirroring ? ppu_addr_in : ppu_addr_in;
Дальше сложнее. MMC3 умеет генерировать прерывания, когда на экране рисуется определённая строка. Это весьма полезно, и игры часто это используют. Строки на экране считаются с помощью обращений к A12 у PPU. При типичных настройках сигнал на A12 переходит из логического 0 в логическую 1 ровно один раз за строку, если не считать кратковременные переходы в 0. А их надо не считать, это всё немного усложняет:
// Включаем прерывания только тогда, когда на A12 низкий уровень always @ (*) begin if (!irq_enabled) begin irq_ready = 0; irq <= 1"bZ; end else if (irq_enabled && !irq_value) irq_ready = 1; else if (irq_ready && irq_value) irq <= 1"b0; end // Сам счётчик always @ (posedge ppu_addr_in) begin if (a12_low_time == 3) // Время низкого уровня A12 должно быть не менее 3 циклов CPU begin if ((irq_reload && !irq_reload_clear) || (irq_counter == 0)) begin irq_counter = irq_latch; if (irq_reload) irq_reload_clear <= 1; end else irq_counter = irq_counter-1; if (irq_counter == 0 && irq_enabled) irq_value = 1; else irq_value = 0; end if (!irq_reload) irq_reload_clear <= 0; end // Время низкого уровня A12 должно быть не менее 3 циклов CPU always @ (posedge m2, posedge ppu_addr_in) begin if (ppu_addr_in) a12_low_time <= 0; else if (a12_low_time < 3) a12_low_time <= a12_low_time + 1; end
Ах да, MMC3 поддерживает ещё подключение дополнительной оперативной памяти по адресу $6000-$7FFF
! Надо не забыть и это описать:
assign cpu_wr_out = cpu_rw_in || ram_protect;
assign cpu_rd_out = ~cpu_rw_in;
assign cpu_sram_ce = !(cpu_addr_in && cpu_addr_in && m2 && romsel && ram_protect);
Вот и всё, наш MMC3 готов! Полный код можно посмотреть тут.
1.3. Принципиальная схема
1.3.1. Модуль процессора
Многокристальный вариант
Принципиальная схема первого варианта игровой приставки DENDY, изготовленного с применением нескольких микросхем различной степени интеграции, приведена на рис. 1.12.
Итак, основой игровой приставки является микросхема центрального процессора (IC1). Работа процессора синхронизируется внешним генератором тактовых импульсов, выполненным на транзисторах Q1 и Q2, частота которого стабилизирована кварцем X1 (21,251465 МГц).
Сигналы всех внутренних шин (адреса A0 - А15, данных DO - D7 и управления) игровой приставки выведены на разъем XS1, к которому подключается картридж. Шины данных (выводы IC1/21-28), адреса (выводы IС1/4-19) и управления (выводы IС1/31,34) соединяют центральный процессор (IC1) с микросхемой ОЗУ (IC3) и видеопроцессором (IC2).
Дешифратор адреса на микросхеме 74LS139 (IC8) вырабатывает сигналы, разрешающие другим микросхемам обмениваться данными с центральным процессором. На входы дешифратора поступают три старших разряда шины адреса А13 - А15 (выводы IС8/2,3,13) и сигнал М2 (вывод IC8/14). Если процессор работает с памятью, установленной в картридже, то сигнал ВЗ на выводе IC8/9 имеет низкий уровень. Когда обмен данными происходит с встроенным ОЗУ приставки (IC3), низкий уровень принимает сигнал АО на выводе IC8/4. Сигнал низкого уровня на выводе IC8/5 свидетельствует о том, что центральный процессор задействует микросхему видеопроцессора IC2.
На одном кристалле с центральным процессором расположены также звуковой процессор игровой приставки и схема дешифратора адреса портов ввода/вывода.
Каждый раз, когда процессор производит чтение из порта с адресом 4016h, па выходе СК1 (вывод IС1 /36) появляется импульс низкого уровня. А если процессор читает из порта с адресом 4017h, аналогичный импульс формируется на выходе СК2 (вывод IC1/35).
Выходные сигналы игровых пультов и светового пистолета передаются на шину данных через два буферных регистра IC6 и IC7 (типа 74НС368).
Микросхема видеопроцессора IC2 совместно с микросхемой видеопамяти IC4 выдает полный
Теперь мы вкратце расскажем об основных отличиях от базовой схемы, присутствующих в других моделях. Все они касаются используемых разъемов и назначения отдельных выводов.
Существуют два основных варианта конструкции рассматриваемой игровой системы. Приставка NES оснащается 72-контактным разъемом для подключения картриджа, 48-контактным разъемом расширения и 7-контактными разъемами для подключения игровых пультов. Игровая приставка FAMICOM (DENDY) программно полностью совместима с приставкой NES, но использует 60-контактный разъем для подключения картриджа, 15-контактный разъем расширения и 9-контактные разъемы для подключения игровых пультов.
Разводка всех разъемов игровой приставки DENDY приведена на рис. 1.13а-в, а приставки NES - на рис. 1.13г-е.
Однокристальный вариант
Принципиальная схема однокристального варианта игровой приставки DENDY приведена на рис. 1.14.
Здесь функции центрального процессора, видеопроцессора и памяти выполняет одна БИС типа UM6561. Частоту внутреннего тактового генератора стабилизирует кварцевый резонатор XI (26,601712 МГц). Иногда схема тактового генерато¬ра содержит также транзистор.
Большинство выходных сигналов подаются непосредственно на разъем картриджа XS4. Часть сигналов поступает на разъемы для подключения игровых пультов XS1, XS2 и разъем расширения XS3.
Видео- и аудиосигналы передаются на выходные разъемы игровой приставки и на вход модулятора, иногда через транзисторные усилители.
Выходные разъемы
В приставке DENDY имеются два или три разъема для подключения пультов, светового пистолета и других периферийных устройств. Разъемы могут быть трех типов: 7-, 9- и 15-контактные.
Игровые пульты разрешается подсоединять к 7-1 или 9-контактному разъему для подключения пульта или к 15-контактному разъему расширения приставки, световой пистолет - только к 7- или 15-контактному разъему, другие устройства - к 15-контактному разъему.
Для подключения пультов служат два 9-контактных разъема и один 15-контактный разъем расширения. Картридж приставки DENDY использует 60-контактный разъем, расположенный сверху.
В игровой приставке NES для игровых пультов предназначены два 7-контактных разъема и один 48-контактный разъем расширения.
Для подключения картриджа в приставке NES применяется 72-контактный разъем, отличающийся от 60-контактного наличием дополнительных цепей, соединенных с разъемом расширения. На этот разъем выведены сигналы шин видеопроцессора и центрального процессора.
Внешний вид разъемов игровой приставки DENDY и назначение отдельных контактов приведены на рис. 1.13. Разъем расширения (рис. 1.136) рассматривается ниже, поскольку именно он наиболее
удобен для подключения различных дополнительных устройств.
На контакт 2 (AUDIO IN) подается звуковой сигнал, который смешивается с выходными сигналами звукового процессора.
Контакты 4-8 (J2 DO - J2 D4) представляют собой входы соответствующих разрядов порта второго джойстика. Коды сигналов с этих входов можно получить из порта 4017h командой LDA $4017.
Вход J1 D1 (контакт 13) подсоединен к разряду D1 порта 4016h.
При обращении центрального процессора к портам с адресами 4016h и 4017h на выходах CLK1 (контакт 14) и CLK2 (контакт 9) формируются кратковременные импульсы низкого уровня. На выходы OUT0 -OUT2 (контакты 10-12) передаются разряды DO -D2 слова, записываемого в порт 4 016h.
На вход IRQ (контакт 3) поступает сигнал запроса прерывания.
1.3.2. Картридж
адреса VA12 и VA13 формирует микросхема контроллера страниц памяти IC3.
Выбор микросхемы ПЗУ происходит при наличии сигнала низкого уровня на входе CS (вывод IC1/20), подключенном к линии VA13 шины адреса видеопроцессора. Данные передаются с выходов ПЗУ на контакты разъема XS1.
Микросхема IC2 (KONAMI ROM 1Mbit) представляет собой масочное ПЗУ с записанной в нем программой емкостью 1 Мбит (128 Кб). Младшие разряды адреса А0 - А13 поступают с соответствующих контактов картриджа, а старшие разряды адреса А14 - А16 генерирует контроллер страниц памяти IC3. Сигнал CS, разрешающий работу ПЗУ IC2, также передается с микросхемы IC3.
IC3 является программируемым дешифратором адреса, формирующим старшие разряды адреса для микросхем ПЗУ IC1 и IC2. Она также вырабатывает сигнал VA10", от уровня которого зависит выбор режима отражения экранных страниц.
В рассматриваемом картридже часть выходов не подключена, поэтому возможности микросхемы используются не полностью.
1.3.3. Модулятор
1.3.4. Игровые пульты
Стандартный игровой пульт
Стандартный игровой пульт для приставки DENDY состоит из подвижной крестовины и четырех
отдельных кнопок. Внутри пульта установлена бескорпусная микросхема регистра сдвига, являющаяся аналогом микросхемы HEF4021B. В случае отсутствия оригинальной микросхемы можно использовать практически любой 8-разрядный регистр сдвига.
Принципиальная схема стандартного пульта приведена на рис. 1.17.
Турбо-пульт
Принципиальная схема турбо-пульта для игровой приставки DENDY приведена на рис. 1.18.
Единственное отличие турбо-пульта от стандартного заключается в наличии дополнительного выхода Т6 Hz у микросхемы сдвигового регистра и двух дополнительных кнопок TURBO А и TURBO В, соединенных с этим выходом.
Внутренний генератор микросхемы пульта формирует на выходе Т последовательность импульсов частотой 6-10 Гц. Таким образом, нажатие и удерживание кнопки TURBO А аналогично нажатию и отпусканию кнопки А с интенсивностью 6 раз в секунду. Применение данных кнопок уменьшает износ клавиш пульта, поскольку кнопки А и В обычно используются в игре при стрельбе.
Адаптер для подключения четырех пультов
В некоторых играх могут участвовать до четырех игроков. В этом случае четыре игровых пульта параллельно подключаются к разъемам игровой приставки через специальный адаптер.
Принципиальная схема адаптера приведена на рис. 1.19.
Как видно из принципиальной схемы, основной задачей адаптера является обеспечение считывания информации с пультов 1 и 3 во время поступления первых восьми синхроимпульсов, и с пультов 2 и 4 -при следующих восьми.
Сигнал синхронизации, поданный по линии STRB, фиксирует состояние пультов в их внутренних регистрах и осуществляет начальную установку схем адаптера.
В течение первых восьми синхроимпульсов на выходах Q8 счетчиков IC1 и IC2 формируются сигналы низкого логического уровня, что обеспечивает поступление синхроимпульсов на пульты 1 и 3, а также передачу информации от этих пультов на входы игровой приставки.
После восьмого синхроимпульса, пересылаемого от игровой приставки при чтении из порта ввода/ вывода, на выходе Q8 соответствующей микросхемы (IC1 или IC2) появляется сигнал высокого логического уровня (лог. 1), что приводит к переключению коммутатора IC3 или IC4 и подсоединению к разъемам приставки пультов 2 или 4 соответственно.
Световой пистолет
На рис. 1.20 приведены возможные варианты принципиальной схемы светового пистолета игровой приставки DENDY.
В качестве светочувствительного элемента здесь используется фототранзистор. В самых дешевых приставках его иногда заменяют фотодиодом, что приводит к ухудшению чувствительности устройства.
Сигнал с выхода фотодиода через разделительный конденсатор С1 поступает на усилитель, выполненный на транзисторе Q1. С коллектора этого транзистора инвертированный сигнал через контакт 5 по цепи D4 передается в процессорный модуль игровой приставки.
Если пистолет направлен на телевизионный экран, то на выходе D4 формируется импульсный сигнал с частотой, равной периоду кадровой развертки.
Курок светового пистолета соединен с кнопкой с нормально замкнутыми контактами. Если курок отпущен, контакт разъема D3 соединен с общим проводом. При нажатии курка контакты размыкаются, и на входе D3 появляется сигнал высокого логического уровня, который обеспечивается за счет подключения этой цепи внутри игровой приставки через резистор 10-51 кОм к шине +5 В.
1.3.5. Блок питания
Задачей внешнего сетевого адаптера является преобразование сетевого напряжения ~220 В в постоянное напряжение 9-12 В, которое передается на внутренний стабилизатор игровой приставки.
Принципиальная схема сетевого адаптера DENDY представлена на рис. 1.21.
При ремонте блока следует помнить, что на выходном разъеме центральный контакт соединен с общим проводом.
Нестабилизированное напряжение с адаптера поступает на внутренний стабилизатор игровой приставки, выполненный на микросхеме AN7805 или на транзисторе и расположенный в процессорном модуле. На выходе стабилизатора формируется постоянное напряжение +5 В.
Принципиальные схемы двух вариантов стабилизатора напряжения питания игровой приставки DENDY приведены на рис. 1.22 и в дополнительном описании не нуждаются.
1.4. Характерные неисправности
Приставка работает нестабильно
Возможные причины: неисправность внешнего сетевого адаптера или внутреннего стабилизатора; загрязнение контактов разъема подключения картриджа.
1. Проверить выходное напряжение сетевого адаптера. Часто сбой возникает из-за малой нагрузочной способности адаптера, поставляемого в комплекте с игровой приставкой. Проблема решается I подключением более мощного адаптера.
2. Проверить надежность контактных соединений в разъемах приставки. Разъем подключения картриджа необходимо осмотреть особенно тщательно. Протереть контакты спиртом.
3. Проверить внутренний стабилизатор игровой приставки. Полезно установить микросхему или силовой транзистор стабилизатора на радиатор с до-статочной площадью рассеивания (около 10 см2).
4.Установить дополнительные конденсаторы в цепи питания, например номиналом 100,0 мкФ х 16 В и 0,01 мкФ на каждой из плат приставки и в картридже.
Не работает световой пистолет
Возможные причины: обрыв в соединительном кабеле или плохие контакты в разъеме; неисправность фотодиода или транзистора светового пистолета; неисправность контактов курка в световом пистолете.
Алгоритм поиска неисправности:
2. Проверить транзистор в световом пистолете и контакты под курком. Удостовериться в наличии замыкания контактов при нажатом курке, поскольку поломка, как правило, происходит в механической части пистолета.
3. Низкая чувствительность пистолета часто объясняется смещением фокусирующей линзы, установленной в стволе. В этом случае необходимо установить линзу на место и закрепить ее. Регулировка места крепления линзы позволяет улучшить характеристики даже работающего светового пистолета.
4.Исправность внутренних цепей светового пистолета свидетельствует о необходимости замены всего процессорного модуля игровой приставки.
Не работает пульт
Возможные причины: обрыв в соединительном кабеле или плохой контакт в разъеме; загрязнение кнопок; неисправность микросхемы пульта.
Алгоритм поиска неисправности:
1. Проверить целостность соединительного кабеля и надежность соединения в разъеме. В случае выхода из строя разъема заменить его вместе с ответной частью на любой 7-контактный разъем, имеющийся в наличии.
2. Проверить входные сигналы РЕ и STROBE. Отсутствие сигналов свидетельствует о необходимости замены центрального процессора.
3. Проверить выходной сигнал микросхемы, установленной в пульте. При отсутствии сигнала заменить пульт.
Не работают некоторые кнопки пульта
Возможные причины: загрязнение пульта или неисправность микросхемы.
Алгоритм поиска неисправности:
1. Протереть спиртом плату пульта и резиновую прокладку с токопроводящими площадками.
2. Если неисправны токопроводящие площадки на резиновой прокладке, восстановить их, наклеив кусочки фольги. Удобнее использовать фольгу от сигаретных пачек: она имеет бумажную основу, что обеспечивает лучшее приклеивание к резине.
3. В случае нарушения токопроводящего покрытия на плате восстановить его с помощью очищенного монтажного провода, припаянного к дорожкам печатной платы.
4. Если все контактные площадки исправны, необходимо заменить микросхему, установленную в пульте, или весь пульт.
Нет ВЧ сигнала на выходе модулятора
Возможные причины: нарушение настройки генератора, неисправность задающего генератора или смесителя.
Алгоритм поиска неисправности:
1. Убедиться, что неисправный элемент находится в схеме ВЧ модулятора, проверив наличие видео аудиосигналов на НЧ выходе. Отсутствие какого-либо из этих сигналов свидетельствует о поломке процессорного модуля.
2. Если нет ни звука, ни изображения, наиболее вероятна неисправность задающего генератора. Для проверки генератора следует измерить частоту выходного сигнала: она должна находиться в пределах 170-230 МГц. Отсутствие сигнала позволяет сделать вывод о необходимости замены транзистора Q2. В случае выхода частоты генератора за указанные границы необходимо проверить элементы LI, С8 -С11, R10, R11.
3. Убедившись в исправности задающего генератора, проверить смеситель (диоды D1, D2 и трансформатор Т2), а также согласующую цепь L2. С13, С14.
4.Отсутствие аудиосигнала при нормальном изображении свидетельствует о сбое генератора под-несущей звуковой частоты. В этом случае проверить соответствие частоты генератора ПЧ звука телевизионному стандарту (5,5 или 6,5 МГц) и при необходимости подстроить генератор вращением сердечника трансформатора Т1. При отсутствии сигнала на выходе генератора заменить транзистор Q1.
Сначала я и не думал писать статью на эту тему, но похоже, что это уже часть целого цикла статей на Денди-тематику. И да, на этот раз речь в первую очередь именно про отечественную Денди, а не про оригинальные консоли - Famicom или NES. Просто я делал устройство в подарок одному человеку, который снимает очень интересные видеоролики про Денди, и ориентировался на совместимость именно с этим клоном.
Дело в том, что и для Famicom, и для NES выходили самые разные аксессуары: 3D очки, клавиатуры, роботы, считыватели штрих-кодов, всякие игровые контроллеры и очень многое другое . До нас же дошёл только световой пистолет. Передо мной стояла задача собрать устройство, которое совмещало бы в себе разветвитель на четыре игрока (да, были такие игры) и Arkanoid-контроллер.
С точки зрения игр порты ввода-вывода представляют из себя два регистра с адресами $4016 и $4017 , которые ассоциированы соответственно с двумя портами, куда всё и подключается. Но на стандартных контроллерах для чтения данных используется только один провод - D0 , данные с которого соответственно доступны через младший (нулевой) бит в каждом из регистров: $4016.0 и $4017.0 . Аналогично используется один провод на запись, его обычно называют STROBE (или LATCH ), который сбрасывает счётчик внутри геймпада, и который доступен через запись в $4016.0 (да, для обоих контроллеров он общий).
Проще говоря, чтобы получить состояние кнопок на первом контроллере надо сначала записать 1 в $4016.0 , сразу же записать туда же 0, сбросив таким образом счётчик, а потом прочитать $4016 и $4017 восемь раз (для каждой из кнопок), получая данные о кнопках из младшего бита. Но для чего же остальные биты в этих регистрах, куда идут эти линии? Рассмотрим порт контроллера у NES:
Да, на него на самом деле идут D3 и D4 ! Именно они и доступны через $4016.3 , $4016.4 у первого порта и $4017.3 , $4017.4 у второго, и именно они используются для нестандартных контроллеров.
Что же касается его японского собрата - Famicom, там нет этих портов, да и сами игровые контроллеры не отсоединяются от консоли, но у него есть порт расширения, который представляет из себя разъём DB-15.
Знакомо выглядит, правда? Да, когда китайцы проектировали нашу Денди (я сомневаюсь, что её проектировали у нас), и им нужно было сделать отсоединяющиеся контроллеры, они решили взять за основу именно порт расширения, ведь в нём есть контакты для второго контроллера, и он на Famicom расположен чуть правее центра. Им тут даже распиновку менять не пришлось. Что же касается первого контроллера, они взяли тот же DB-15, расположили его слева и поменять распиновку так, чтобы можно было подключать первый контроллер. И только его.
Сравните сами передние порты у Famicom и у нашей Денди:
Вот такая вот странная история этих пятнадцатипиновых разъёмов у геймпадов, которые используются в нашей стране.
Но давайте посмотрим, что же выведено на этот порт расширения у Famicom?
(скриншот с сайта wiki.nesdev.com)
Да, на него идут ещё $4016.1 (на ввод), $4017.0-4 (на ввод), $4017.0-2 (на вывод), внешнее прерывание и даже звук! Я был очень приятно удивлён, когда разобрал Денди и увидел, что всё это есть и там:
Правда, не во всех моделях, как выяснилось позже. Но если это есть, значит есть и полная совместимость с аксессуарами для Famicom, и их могут использовать соответствующие японские игры. Но напомню, что Денди - это очень странная смесь NES и Famicom, PAL и NTSC. Пираты выпускали для неё и японские, и американские игры, которые по сути на 100% совместимы, если не брать в рассчёт эти аксессуары и разный формат картриджей.
Итого: в некоторых Денди есть все те же выводы, что и на Фамикоме, которые при этом включают в себя часть выводов доступных на NES. Отсутствует доступ к $4016.3 и $4016.4 , но они используются крайне редко. В виде таблички для наглядности:
Японский аналог для Famicom устроен гораздо проще. Третий и четвёртый контроллеры подключаются напрямую в порт расширения и доступны через $4016.1 и $4017.1 . Соответственно для такого переходника нам уже нужен полноценный порт расширения у Денди, иначе поиграть вчетвером в японские игры не получится.
Arkanoid-контроллер, как ясно из названия, используется для игры Arkanoid и представляет из себя ручку-крутилку и одну кнопку. Внутри же это аналого-цифровой преобразователь и сдвиговый регистр, который так же последовательно выдаёт положение ручки. Разница между японской и американской версией только в способе подключения. Японская версия игры читает положение ручки и состояние кнопки из $4016.1 и $4017.1 , а американская версия из $4016.3 и $4016.4 соответственно. Получается, что для японского Арканоида нужен полноценный порт расширения, а для американского подойдёт любая денди, где работает световой пистолет (он использует те же выводы).
Если уж на то пошло, я решил совсем не мелочиться и поставить в устройство ещё и какой-то экран, на котором показывались бы текущий режим и меню с настройками, к тому же у меня давно валялся без дела один знакосинтезирующий «16x2» дисплей. Вот для работы с ним уже нужен микроконтроллер, и я выбрал ATMEGA16 .
Мне всегда было сложнее всего придать устройству приятный внешний вид. Всё-таки я программист, а не дизайнер, но именно при изготовлении устройства в подарок хотелось сделать его максимально красивым и удобным. Тем более это чуть ли не единственный способ как-то показать другим своё произведение искусства: фотографии и видео - это не то, по готовым схемам и 3D моделькам такие вещи воссоздают единицы, серийное производство наладить тяжело, а вот подарок - самое то.
Итак, требования к внешнему виду были такие: четыре порта для стандартных DB-15 контроллеров от Денди, четыре кнопки для их выбора и настройки, кнопка «режим», кнопка «настройки», удобная ручка для Arkanoid и кнопка для него же, которые должны располагаться достаточно удобно и не мешаться. Помимо этого хотелось сделать, чтобы активные порты подсвечивались светодиодами и как-то интуитивно связывались с соответствующими кнопками, логичнее всего при этом расположить разъёмы в ряд, но эти дурацкие DB-15 слишком огромные для этого. Помимо всего устройство должно удобно лежать в руках, ведь оно само по себе игровой контроллер для Arkanoid. В итоге я пришёл примерно к такому виду:
Кнопки в ряд, порты друг над другом, ручка сбоку, кнопка для Arkanoid сзади слева.
Получается, что места внутри достаточно много. Поэтому ПЛИС с разъёмами под провода и гнёзда я решил вынести на одну плату, а микроконтроллер с экраном и кнопками - на другую. Соединяются они при этом простейшим последовательным интерфейсом.
Плата с ПЛИС (первая версия):
Вторая плата:
Код для ПЛИС я писал на Verilog. Для каждого режима он получается достаточно простым. В первую очередь для многих из них нам надо считать обращения к каждому из портов, т.е. импульсы на проводе clock:
Reg counter1;
reg counter2;
always @ (posedge strobe_in, posedge clock1_in)
begin
if (strobe_in)
counter1 <= 1;
else if (counter1 < 31)
counter1 <= counter1 + 1;
end
always @ (posedge strobe_in, posedge clock2_in)
begin
if (strobe_in)
counter2 <= 1;
else if (counter2 < 31)
counter2 <= counter2 + 1;
end
(простите, хабр не умеет подсвечивать Verilog)
Где strobe_in - это strobe (один на оба порта), а clock1_in и clock2_in - это соответственно clock на каждом из портов. Внутри консоли стоит логика: clock = R/W nand (адрес == $4016/$4017), т.е. на clock логический ноль, когда консоль читает данные по соответствующему адресу.
Режим имитации американского разветвителя на четверых игроков выглядит так:
always @ (*)
begin
// Strobe соединяем напрямую - входы с выходами
assign strobe_out = strobe_in;
assign strobe_out = strobe_in;
assign strobe_out = strobe_in;
assign strobe_out = strobe_in;
// Дёргаем clock у каждого геймпада в зависимости от того, в который раз читает данные консоль
clock_out <= (counter1 <= 8) ? clock1_in: 1;
clock_out <= (counter2 <= 8) ? clock2_in: 1;
clock_out <= (counter1 > 8 && counter1 <= 16) ? clock1_in: 1;
clock_out <= (counter2 > 8 && counter2 <= 16) ? clock2_in: 1;
if (counter1 <= 8)
// Первый контроллер
joy1_data_out <= joy_data;
else if (counter1 <= 16)
// Третий контроллер
joy1_data_out <= joy_data;
// Сигнатура
else if (counter1 == 20)
joy1_data_out <= 0;
else
joy1_data_out <= 1;
// Второй контроллер
if (counter2 <= 8)
joy2_data_out <= joy_data;
// Четвёртый контроллер
else if (counter2 <= 16)
joy2_data_out <= joy_data;
// Сигнатура
else if (counter2 == 19)
joy2_data_out <= 0;
else
joy2_data_out <= 1;
// Неиспользуемые выводы оставляем в высокоимпедансном состоянии, они подтягиваются к VCC внутри самой консоли
joy1_data_out <= 1"bZ;
joy2_data_out <= 4"bZZZZ;
end
В режиме японского же разветвителя на четверых нужно просто соединить входы с выходами напрямую:
always @ (*)
begin
clock_out <= clock1_in;
clock_out <= clock2_in;
clock_out <= clock1_in;
clock_out <= clock2_in;
joy1_data_out <= joy_data;
joy2_data_out <= joy_data;
joy1_data_out <= joy_data;
joy2_data_out <= joy_data;
// Неиспользуемые выводы оставляем в высокоимпедансном состоянии, они подтягиваются к VCC внутри самой консоли
joy2_data_out <= 3"bZZZ;
end
Самым сложным оказалось сделать возможность менять местами кнопки A и B, ведь считываются они последовательно, т.е. нужно заранее знать значение B, когда консоль запрашивает A, но оно выдаётся как раз только после A. Сначала я думал как-то ускоренно считывать данные с контроллера, используя какой-то внешний тактовый генератор, но в итоге решил просто брать значение от предыдущего считывания. Это даёт задержку, но она абсолютно незаметна. Тем более игры обычно читают состояние кнопок по несколько раз подряд.
Само собой, все эти режимы и настройки надо как-то задавать. Для этого я определил 12-битный регистр control
, данные в который записываются через последовательное соединение, с дополнительным битом для проверки чётности:
reg control;
reg control_parity;
reg control_receiver;
reg control_counter;
always @ (posedge control_strobe, posedge control_clock)
begin
if (control_strobe)
begin
control_counter = 0;
control_parity = 0;
end else begin
if (control_counter <= 11)
begin
control_receiver = control_data;
control_parity = control_parity ^ control_data;
end;
if (control_counter < 12)
control_counter = control_counter + 1;
end
end
always @ (posedge strobe_in)
begin
if (control_counter == 12 && !control_parity)
control = control_receiver;
end
Соответственно со стороны микроконтроллера код (весьма грязный) выглядит вот так:
void control_send(uint16_t data)
{
set_bit(CTRL_PORT, CTRL_STROBE_PIN); // Strobe
_delay_us(10);
unset_bit(CTRL_PORT, CTRL_STROBE_PIN); // Strobe
_delay_us(10);
int b;
char parity = 0;
for (b = 0; b < 11; b++)
{
if (data & (1<
В остальном в коде микроконтроллера нет ничего особенного: работа с дисплеем на контроллере HD44780, кнопки, светодиоды, простенькая менюшка и работа с аналого-цифровой преобразователем для определения угла поворота ручки.
Я всё отладил, убедился в работоспособности и уже начал упихивать компоненты в корпус…
Но перед закрытием крышки решил проверить на оригинальном Famicom, ведь с ним устройство тоже будет использоваться. Увы, режимы, где нужно было считать импульсы clock, работали неправильно. С помощью логического анализатора выяснилось, что с линии данных идут наводки на линию clock:
Это помеха длительностью всего в несколько десятков наносекунд всё портит. Я решил посмотреть своим простеньким осциллографом, что же происходит на линии clock у Денди:
А вот что там же у Фамикома:
Видно, что эта линия подтянута к VCC, при чём очень сильно у Денди и весьма слабо у оригинального Фамикома. Я начал экспериментировать с обвеской. Вскоре стало ясно, что на результат лучше смотреть не логическим анализатором, а самой консолью. Пришлось вспоминать ассемблер для 6502 процессора, писать простенькую программу для тестирования и записать её на картридж:
На ней сразу стало всё наглядно видно, а заодно можно было протестировать сразу все режимы, не меняя игры. ROM можно скачать
Статьи по теме: | |
Как правильно выращивать декоративный перец в домашних условиях
Цвет и форма плодов растения самая разная, независимо от оказываемого... Как сохранить купленные зимой корневища и луковицы цветов Как сохранить лилейник до посадки весной
Началось… На календаре еще февраль, а в магазины, торгующие посадочным... Пальма юкка уход в домашних условиях размножение и обрезка пересадка юкки фото видов Пальма юкка уход в домашних условиях болезни
Как повысить стрессоустойчивость растения? Что делать, если проблем... |