Автор Тема: Вопросы новичков  (Прочитано 202206 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 215
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
Вопросы новичков
« Ответ #150 : 04 Апреля 2023, 23:50:32 »
Zzmey, все верно, 90 -> B0. Но у тебя там несколько записей в этот регистр. Как минимум самая последняя из них, которая выполняется ежекадрово, должна включать этот режим.
Турниры по ретро играм - https://vk.com/nekketsu
Мои исходники NES игр - https://github.com/cyneprepou4uk/NES-Games-Disassembly

Онлайн Zzmey

  • Пользователь
  • Сообщений: 379
    • Просмотр профиля
Вопросы новичков
« Ответ #151 : 27 Апреля 2023, 11:17:19 »
Подскажите, плиз, как избежать моргания при перерисовке тайлов?

Прилагается пример, проект на С, там при нажатии А или Б тайлы моргают.
Перебрал все варианты, которые в голову пришли, менял PPUMASK и PPUCTRL, переставлял местами, запускал и в цикле и без цикла, не помогает.

Оффлайн Марат

  • Пользователь
  • Сообщений: 561
  • Пол: Мужской
    • Просмотр профиля
Вопросы новичков
« Ответ #152 : 27 Апреля 2023, 16:40:38 »
Надо выключать экран при перерисовке
При нажатии клавиш, у вас вызываются функции top и top2, в этих функциях у вас почему-то закомментированы функции All_Off, All_On. Надо их раскомментировать.
void top (void){
//All_Off(); // turn off screen
//Load_Palette();
summ_tile();
//All_On(); // turn on screen
}


void top2 (void){
//All_Off(); // turn off screen
//Load_Palette();
summ_tile2();
//All_On(); // turn on screen
}

Онлайн Zzmey

  • Пользователь
  • Сообщений: 379
    • Просмотр профиля
Вопросы новичков
« Ответ #153 : 28 Апреля 2023, 10:00:56 »
дрыганье устранено, на дрыганье влияло два фактора

1) цикл присваивания PPU_DATA
2) отсутствие Reset_Scroll

по первой проблеме - убедился что одинокая переменная выводится без дрыгания, а цикл выводится с дрыганьем, взял и тупо вывел все переменные без цикла.
по второй проблеме - включаю Reset_Scroll - не дрыгается, выключаю - снова дрыгается.


Еще другие аспекты:

- обязательно нужен вот этот счетчик, его положение в процедуре менял произвольно, положение не влияет ни на что, похоже.
   while (NMI_flag == 0); // wait till NMI
      NMI_flag = 0;

- к удивлению, оказывается не стало нужно включать и выключать экран.

- еще автор писал по поводу моргания вот что:
В идеале, надо ждать V-blank перед вызовом All_On(), иначе один кадр после него будет искажен, и экран будет мерцать.
я даже нашел пример такого кода
   Wait_Vblank();   // don't turn on screen until in v-blank
   All_On();

но он почему-то не понадобился.

прилагется код без дрыганий.
« Последнее редактирование: 28 Апреля 2023, 11:51:33 от Zzmey »

Оффлайн FireFox Фан

  • Пользователь
  • Сообщений: 1670
  • Пол: Мужской
  • Огнелис
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Вопросы новичков
« Ответ #154 : 28 Апреля 2023, 11:44:57 »
Nik Pi, не могу открыть "Battle City" для NGB. Точнее YY-CHR игру открыл, но в отличии от NES версии не могу сложить картину и вижу только кашу.
« Последнее редактирование: 28 Апреля 2023, 12:32:25 от FireFox Фан »
[15.6" Ноутбук Neobihier ZX-I7-10750H, Intel Core i7-10750H (2.6 ГГц), RAM 16 ГБ, SSD, 1024 ГБ Intel UHD Graphics 630, Windows 11 Pro, Российская клавиатура]

Оффлайн Nik Pi

  • Пользователь
  • Сообщений: 149
    • Просмотр профиля
Вопросы новичков
« Ответ #155 : 29 Апреля 2023, 18:28:11 »
Nik Pi, не могу открыть "Battle City" для NGB. Точнее YY-CHR игру открыл, но в отличии от NES версии не могу сложить картину и вижу только кашу.
Ты уверен что выбрал правильные параметры? Попробуй через TileLayerPro или FaTILEty, там есть специальный параметр для открытия GB игр.
С YY-CHR не знаком  :lol:
Можешь кинуть скрин того что у тебя?

Оффлайн 881x113

  • Пользователь
  • Сообщений: 202
  • Техноманьяк
    • Просмотр профиля
Вопросы новичков
« Ответ #156 : 10 Мая 2023, 00:51:38 »
Texmod

Указываю путь к .ехе файлу , указываю путь к файлу мода .tpf, если после этого нажать Run, то игра запустится и будет нормально работать с этим модом, но я не хочу перед каждым запуском игры делать все эти манипуляции, а если просто запустить игру, то запускается без мода, как сделать чтобы настройки сохранились и игра всегда запускалась с модом?
« Последнее редактирование: 10 Мая 2023, 17:34:26 от paul_met »

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #157 : 15 Мая 2023, 12:24:38 »
Хочу заменить игры на пиратской многоигровке. Но пока нет программатора, чтобы снять дамп с нее, поэтому решил потренироваться на "готовом" ROM-е. Взял Sega Radica! Volume 1, так как там схема переключения почти та же самая, что и в моей многоигровке. Для проверки "вытащил" все игры из ROM-а, заработали все, кроме первой - Kid Chameleon. Стало интересно, почему. Сравнил с хорошим дампом этой игры - не совпадают буквально 3 байта:



Для чего нужны эти изменения?


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5754
    • Просмотр профиля
Вопросы новичков
« Ответ #158 : 15 Мая 2023, 13:37:14 »
Для чего нужны эти изменения?
Это адрес начала кода, он указывает на меню, очевидно.
UPD: Вот в коде эмулятора об этом: https://github.com/ekeeke/Genesis-Plus-GX/blob/f0c8f839268ba2806fca47187555f084c1a04ad9/core/cart_hw/md_cart.c#L1905. Эмулятор определяет маппер по указанной и реальной контрольной сумме из заголовка рома https://github.com/ekeeke/Genesis-Plus-GX/blob/f0c8f839268ba2806fca47187555f084c1a04ad9/core/cart_hw/md_cart.c#L120, так что, если будете проверять вставку через Genesis Plus GX, нужно либо специально подбирать контр. сумму рома или изменить код эмулятора.
UPD2: Подобрать контр. сумму просто, это сумма всех чисел, представляя ром как массив 2 байтных Big-Endian беззнаковых, кроме заголовка, поэтому нужно в самом конце рома добавить число до суммы 0xFC84.
« Последнее редактирование: 15 Мая 2023, 14:15:57 от Sharpnull »

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #159 : 15 Мая 2023, 14:12:01 »
Sharpnull, на Sega Radica меню в отдельном банке. Вот на этой картинке указано расположение всех игр:



По идее, код меню "лежит" в отдельном банке и никак не "пересекается" с кодом остальных игр. По идее, изменение адреса нужно, только если меню "вшито" в одну из игр, как это описано здесь. Или я чего-то не понимаю?


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5754
    • Просмотр профиля
Вопросы новичков
« Ответ #160 : 15 Мая 2023, 14:20:07 »
Talking_Sword, запуск рома с начального банка от Kid Chameleon, поэтому указывается адрес на код, который переключает банки на меню, иначе в банках останется Kid Chameleon. При замене Kid Chameleon вам нужно снова ставить адрес 00 3F 03 00.
UPD: Так как нужен начальный адрес 1-й игры чтобы её запустить, он хранится в коде меню - 0x3F06F4 в роме, для Kid Chameleon там 00 00 04 B0, а для заменяемой игры нужно взять с позиции 0x4-0x7 от его рома. Другие начальные адреса тоже могут хранится в меню, но такое не нужно. UPD2: Они всё-таки не тупые, нужно менять только для 1-й игры:
2078 0004      movea.l $00000004,a0
4ED0            jmp.l (a0)
« Последнее редактирование: 15 Мая 2023, 17:28:52 от Sharpnull »

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #161 : 15 Мая 2023, 17:56:48 »
В принципе, до того, как писал сообщение догадывался, что что это как-то связано с переключением на меню. сейчас проверил - после подачи питания на выводах Q1-Q6 74LS174 действительно нули, значит будет включен банк самой первой игры. Значит эти изменения нужны, чтобы на выходах 74LS174 было 111111? Тогда не понимаю другого. Уже до этого экспериментировал - игры переключаются по сигналу /TIME, прочитал здесь, что сигнал /TIME срабатывает при доступе к адресам 0xA13000-0xA130FF. Поставил в отладчике точку останова на доступ к этим адресам, пробовал запускать меню отдельно (вырезанное из ROM-а). При выборе игры в меню, точка останова срабатывает. Но вот если запустить этот самый Kid Chameleon, у которого в начале 3F 03 00, то точка останова не срабатывает.


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5754
    • Просмотр профиля
Вопросы новичков
« Ответ #162 : 15 Мая 2023, 20:27:28 »
прочитал здесь, что сигнал /TIME срабатывает при доступе к адресам 0xA13000-0xA130FF
Я давал ссылку на код эмулятора, там действительно читается A13000-A130FF. Интересно, что OR (ИЛИ) с базовым индексом банка, поэтому 0xA1307E, который переключает на меню установит все банки одним банком меню (каждые 64КБ).
Поставил в отладчике точку останова на доступ к этим адресам, пробовал запускать меню отдельно (вырезанное из ROM-а). При выборе игры в меню, точка останова срабатывает. Но вот если запустить этот самый Kid Chameleon, у которого в начале 3F 03 00, то точка останова не срабатывает.
Не знаю каким эмулятором вы пользуетесь, но в вырезке только нет первого чтения A1307E (для меню). Код чтения A130xx выполняется в RAM по понятной причине, может это вас сбило.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #163 : 16 Мая 2023, 14:16:39 »
Sharpnull, честно говоря, с трудом могу понять что написано в вашем сообщении. Сразу говорю, вовсе не имею в виду, что вы плохо пишете, просто умений в этой области у меня нет.

Лучше спрошу так:

1. Чтобы заменить первую игру на многоигровке, нужно в "новой" игре значение по адресам 0x04-0x07 заменть на значение из "родной" игры?
2. А в коде меню что-то менять придется? Ну кроме текста, естественно.
Не знаю каким эмулятором вы пользуетесь
Gens r57shell mod.


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5754
    • Просмотр профиля
Вопросы новичков
« Ответ #164 : 16 Мая 2023, 16:25:48 »
1. Чтобы заменить первую игру на многоигровке, нужно в "новой" игре значение по адресам 0x04-0x07 заменть на значение из "родной" игры?
Допустим вы не будете заменять на игру больше 1МиБ с позиции 0x0 (т. е. вместо Kid Chameleon, конечно можно меньше без доп. изменений или сделать все игры разного размера при редактировании кода), тогда после вставки нового рома как минимум нужно: на место 0x4-0x7: 00 3F 03 00 (для меню), а байты, что были на месте 0x4-0x7 от "новой игры", скопировать с 0x3F06F4 (UPD: т. е. в это место), например у Kid Chameleon это было 00 00 04 B0. Второе нужно чтобы меню при выборе 1-й игры перекинуло на код "новой игры".
Gens r57shell mod.
Я тоже им пользуюсь по безысходности, много чего нет и пара инструкций неправильно отображаются в M68k Debug, как раз здесь код выполняемый в RAM не отображается, ещё последняя версия в сети без исходного кода - Gens11svnr665. Ну так он не запускает "Sega Radica! Volume 1 BIOS (U).gen", не поддерживает маппер, я подумал вы запустили эмулятор, он дошёл до меню, но там почему-то не сработал breakpoint при выборе игры. Обрезок только из меню работает, потому что регистр маппера используется при выборе игры, а в начале не нужно переключаться.
Кстати, я не понимаю почему меню расположили в конце из-за чего нужно 1-ю игру редактировать, от Radica есть многоигровка где меню в начале и ничего переключать не нужно. Я только предполагаю для удобства, что в начале файле, или чтобы легко кто-то не достал их меню для своих игр, но вряд ли. Можно было бы сделать круче: на железе с маппером меню и все игры, а без маппера запуск 1-й игры без меню и без других игр.
« Последнее редактирование: 16 Мая 2023, 16:43:34 от Sharpnull »

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #165 : 16 Мая 2023, 21:34:35 »
а байты, что были на месте 0x4-0x7 от "новой игры", скопировать с 0x3F06F4 (UPD: т. е. в это место), например у Kid Chameleon это было 00 00 04 B0.
0x3F06F4 - это по идее адрес в области меню, то есть само меню тоже нужно править. Боюсь, что не получится у меня заменить первую игру. С другой стороны, на замену можно попробовать подобрать игру, у которой это значение будет как и у старой игры, тогда и надобность в редактировании кода меню отпадет.


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5754
    • Просмотр профиля
Вопросы новичков
« Ответ #166 : 17 Мая 2023, 06:36:12 »
С другой стороны, на замену можно попробовать подобрать игру, у которой это значение будет как и у старой игры, тогда и надобность в редактировании кода меню отпадет.
Проверил 1699 ромов No-Intro (старый ромсет), подходит только Chameleon Kid (Japan).md :) Если речь про другую многоигровку, то как повезёт.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #167 : 17 Мая 2023, 10:48:10 »
Если речь про другую многоигровку
Да. Как уже говорил, мне нужно заменить игры на другой многоигровке, ROM Sega Radica использовал только для того, чтобы потренироавться, ROM-а нужной мне многоигровки у меня нет "на руках", так как пока нет программатора (но скоро будет), чтобы сдампить свою многоигровку.

В моей многоигровке первым, скорее всего, будет Ultimate Mortal Kombat 3. Его можно будет заменить на на Toy Story, так как подходит по размеру. Посмотрел - и там, и там значения совпадают - 00 00 02 00.
Проверил 1699 ромов No-Intro (старый ромсет)
Ради моих вопросов это слишком большие трудозатраты. Надо было мне сразу написать, что Radica не нужна.


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5754
    • Просмотр профиля
Вопросы новичков
« Ответ #168 : 17 Мая 2023, 12:27:12 »
Ради моих вопросов это слишком большие трудозатраты
Мне было интересно, для 00 00 02 00 - 943 из 1699, вот скрипт на Python 3:
Класть в папку с ромами, отобразит все подходящие ромы.
« Последнее редактирование: 17 Мая 2023, 12:36:30 от Sharpnull »

Оффлайн free.gen

  • Пользователь
  • Сообщений: 298
  • Пол: Мужской
    • Просмотр профиля
Вопросы новичков
« Ответ #169 : 21 Мая 2023, 18:09:33 »
Хочу изменить кое какую отсебятину в переводе игры Crusader of Centy [SMD].
Текст оригинала (U) удалось найти с помощью Translhextion, там все буквально в пару кликов через Scan Relative. Находит закодированный текст и создает таблицу.
А вот с переведенной версией он уже не хочет искать ничего (В поиск ввожу кириллицу). Выделяет не то что нужно. То есть как бы не находит этот переведенный текст, как в оригинале.
Может что-то не так делаю? В настройках пробовал менять кодировку, все равно не ищет.
Хочу сделать правильную таблицу для этого перевода, так чтобы в редакторе все отображалось как и в игре - на русском. Это возможно?
Прошу советов и тд, как лучше и проще это все сделать.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5754
    • Просмотр профиля
Вопросы новичков
« Ответ #170 : 21 Мая 2023, 21:10:39 »
Хочу сделать правильную таблицу для этого перевода
Для диалогов графика шрифта с F5000 - 8x16px, 1bpp. Из CrystalTile2:
« Последнее редактирование: 22 Мая 2023, 14:35:50 от Sharpnull »

Оффлайн free.gen

  • Пользователь
  • Сообщений: 298
  • Пол: Мужской
    • Просмотр профиля
Вопросы новичков
« Ответ #171 : 22 Мая 2023, 02:28:54 »
Sharpnull, действительно, сам не допер просто сопоставить шрифты.  :blush:
Таблица готова, однако все равно в Translhextion кракозябры и пробелы. Отображаются только спецсимволы.

Разобрался. Таблицу нужно создать в кодировке OEM 866.
Спасибо.
« Последнее редактирование: 22 Мая 2023, 02:36:48 от free.gen »

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #172 : 16 Июня 2023, 06:54:22 »
Есть вопрос, но он с некоторым уклоном в железо, не совсем уверен, будет ли это уместно в этой теме.

Программы для работы с файлами на компьютере, такие как HEX-редакторы в основном оперируют байтами, в которых 8 бит, соответственно, конкретный адрес в файле указывает на конкретный байт. Но есть ПЗУ с 16-битной шиной, у них на одном адресе "лежит" уже 16 бит, получается что адресов будет меньше в два раза.

Как перевести адрес из файла в адрес, который будет на шине адреса ПЗУ и обратно? Просто поделить на 2? А если нужно наоборот, перевести адрес из ПЗУ в адрес в файле, то умножить на 2?


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Беларус

  • Модератор
  • Сообщений: 1728
    • ВКонтакте
    • Steam
    • Просмотр профиля
Вопросы новичков
« Ответ #173 : 17 Июня 2023, 00:45:07 »
Действительно, слишком железно, слишком непонятно.
конкретный адрес в файле указывает на конкретный байт.
Этот адрес может состоять из любого количества байт - 1, 2, 4, 8. Он может быть с "большим" удобством для глаз (Big Endian - 1234), а может быть с "маленьким" (Little Endian - 3412).
есть ПЗУ с 16-битной шиной, у них на одном адресе "лежит" уже 16 бит, получается что адресов будет меньше в два раза.
Т.е. к таким ПЗУ можно обращаться только по адресам, кратным двум байтам? Судя по твоим сообщениям, это связано с Сегой?
Как перевести адрес из файла в адрес, который будет на шине адреса ПЗУ и обратно?
Т.е. в файле адрес однобайтный? И не достаточно расширить его до двух байт, заполнив второй нулём?

Скорее всего, тебе к Кластеру (на Хабре).

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #174 : 17 Июня 2023, 06:53:22 »
Действительно, слишком железно, слишком непонятно.
Ну вот смотрите. Вот у нас есть ПЗУ. Пускай это будет S29GL512P:



У него есть адресные выводы - A0-A24, на них можно в двоичном виде выставить адрес. Данные будут выдаваться на шине данных - DQ0-DQ15. Всего адресных выводов получается 25 (так как нумерация с нуля) 2^25 получается 33554432, 32 миллиона, но вмещает наше ПЗУ 64 мегабайта, то есть байт в два раза больше, чем адресов, но выводов данных у нас 16, поэтому на них будет сразу два байта.

Нельзя просто так взять адрес из HEX-редактора и выставить его на шине адреса, чтобы получить нужные данные. В HEX-редакторе крайний адрес будет 3FFFFFF, на S29GL512P адрес будет 1FFFFFF (если перевести из двоичного в шестнадцатеричное).

Нужно понять, как "перевести" значение адреса из файла, чтобы его можно было выставить на шине адреса ПЗУ, чтобы получить те же данные.
Т.е. к таким ПЗУ можно обращаться только по адресам, кратным двум байтам?
Не знаю.
Судя по твоим сообщениям, это связано с Сегой?
Да.


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Марат

  • Пользователь
  • Сообщений: 561
  • Пол: Мужской
    • Просмотр профиля
Вопросы новичков
« Ответ #175 : 17 Июня 2023, 07:13:37 »
Насколько я понимаю шина данных в 16 бит, лишь означает, что можно считывать/записывать сразу два байта за одну операцию. А можно и по одному байту читать/записывать. А если адресов не хватает, видимо, есть какой то маппер, который переключает банки.

Добавлено позже:
Ну вот из даташит: в режиме побайтного доступа вывод dq15/a1 используется в качестве младшего бита при адресации. Таким образом будет уже 2^26 степени.
А в режиме чтения вордами, как вы и говорили, видимо, доступ будет по чётным адресам.
« Последнее редактирование: 17 Июня 2023, 07:41:51 от Марат »

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 1029
  • Happy Games Only!
    • Просмотр профиля
Вопросы новичков
« Ответ #176 : 17 Июня 2023, 20:27:58 »
А можно и по одному байту читать/записывать.
Это если свой код писать наверно нужно учитывать. А мне нужно просто адрес из файла превратить в комбинацию бит, которые можно будет выставить на шине адреса ПЗУ.
А если адресов не хватает, видимо, есть какой то маппер, который переключает банки.
Мимо! У большинства картриджей нет ничего кроме ПЗУ. Там наоборот нужна дополнительная логика, чтобы подключить 8-битное ПЗУ. Есть у меня один странноватый картридж для Mega Drive с 8-битным ПЗУ, там еще стоит 74LS374, похоже при помощи него как-то "адаптируют" 8-битную шину к 16-битной, но я не разбирался, как это работает.
Ну вот из даташит: в режиме побайтного доступа вывод dq15/a1 используется в качестве младшего бита при адресации. Таким образом будет уже 2^26 степени.
А в режиме чтения вордами, как вы и говорили, видимо, доступ будет по чётным адресам.
Про вывод /BYTE вообще не в тему, он на картриджах для Mega Drive вообще не используется и подтянут к лог. "1".


Girls exclusively sell cute poses, only girls can do it, boys can't do it.

Оффлайн Марат

  • Пользователь
  • Сообщений: 561
  • Пол: Мужской
    • Просмотр профиля
Вопросы новичков
« Ответ #177 : 17 Июня 2023, 21:10:04 »
Про мегадрайв в вашем сообщении нет упоминания

Оффлайн Turbo2000

  • Пользователь
  • Сообщений: 104
  • Пол: Мужской
    • Просмотр профиля
Вопросы новичков
« Ответ #178 : 10 Июля 2023, 00:28:26 »
А что за регистр такой VDP_PSG? 0x00C00011
Нигде не могу найти упоминания

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5754
    • Просмотр профиля
Вопросы новичков
« Ответ #179 : 10 Июля 2023, 01:03:46 »
Turbo2000, регистр 0xC00011 для 68K для работы с SN76489: https://www.smspower.org/Development/SN76489.