Приставки > Портативные
Megadrive Portable
Rumata:
Очень любопытно. Тоже DW-16. А то такая U8?
demolition.nick:
--- Цитата: Rumata от 10 Июль 2018, 21:02:02 ---Очень любопытно. Тоже DW-16. А то такая U8?
--- Конец цитаты ---
Та самая KXD638, на которой 6 кнопок реализованы
Rumata:
Понятно. Я про неё и забыл. Значит 24 ноги. У моей бескорпусной 22. Хотя у бескорпусной модно делать сколько угодно
demolition.nick:
--- Цитата: Rumata от 10 Июль 2018, 21:15:50 ---Понятно. Я про неё и забыл. Значит 24 ноги. У моей бескорпусной 22. Хотя у бескорпусной модно делать сколько угодно
--- Конец цитаты ---
Там есть возможность посадки корпусной микры?
Я вот тут жумаю над питанием. То что для нормального картртджа желательно 5 вольт это понятно. А как с логическими уровнями? Как-то ж работает зараза
Rumata:
--- Цитата: demolition.nick от 10 Июль 2018, 21:44:14 ---Там есть возможность посадки корпусной микры?
--- Конец цитаты ---
Ну шаг вроде 1,25 :-\
--- Цитата: demolition.nick от 10 Июль 2018, 21:44:14 --- А как с логическими уровнями?
--- Конец цитаты ---
Ну во-первых многие микросхемы имеют запас по логическим уровням. Во-вторых, можно поставить в разрез сигнальных линий резисторы. Что мы и имеем на приведённых выше фото. Резисторные сборки RP1 - RP4, стоящие на шине данных, как раз для этого и предназначены. На адреса ничего не нужно, это выходные сигналы, и в принципе уровень +3,3 В должен быть воспринят как лог. "1"
megavolt85:
--- Код: (Festa.c) ---#define ROM_CARTRIDGE 0x000000
#define VDP_DATA 0xC00000
#define VDP_CONTROL 0xC00004
#define VDP_PSG76489 0xC00011
#define SYSTEM_Z80 0xA00000
#define SYSTEM_VERSION 0xA10001
#define SYSTEM_IO_DATA_J2 0xA10004
#define SYSTEM_IO_CTRL_J2 0xA1000A
#define SYSTEM_IO_SMODE_J2 0xA10018
#define CONTROL_Z80_BUS 0xA11100
#define CONTROL_Z80_RESET 0xA11200
#define SYSTEM_IO_UNK 0xA13000
#define SYSTEM_IO_CART 0xA16106
#define SYSTEM_IO_UNK0 0xA16300
#define SYSTEM_IO_UNK1 0xA16302
#define SYSTEM_IO_UNK2 0xA16304
#define SYSTEM_IO_UNK3 0xA16306
#define SYSTEM_IO_UNK8 0xA16310
#define SYSTEM_IO_UNK9 0xA16312
#define SYSTEM_IO_UNK10 0xA16314
#define SYSTEM_IO_UNK11 0xA16316
#define RAM_BASE 0xFF0000
uint16_t params[3] = { 0x8000, 0x3FFF, 0x100 }; // d5-d7
uint32_t regs[5] = { SYSTEM_Z80, CONTROL_Z80_BUS, CONTROL_Z80_RESET, VDP_DATA, VDP_CONTROL}; // a0-a4
uint8_t vdp_init_data[24] =
{
0x04, 0x14, 0x30, 0x3C, 0x07, 0x6C, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00, 0x81, 0x37, 0x00, 0x01,
0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x80
};
uint32_t write_vram_dma = 0x40000080;
uint8_t z80_init_data[38] =
{
0xAF, 0x01, 0xD9, 0x1F, 0x11, 0x27, 0x00, 0x21,
0x26, 0x00, 0xF9, 0x77, 0xED, 0xB0, 0xD0, 0xE1,
0xFD, 0xE1, 0xED, 0x47, 0xED, 0x4F, 0xD1, 0xE1,
0xF1, 0x08, 0xD9, 0xC1, 0xD1, 0xE1, 0xF1, 0xF9,
0xF3, 0xED, 0x56, 0x36, 0xE9, 0xE9
};
uint32_t params2[3] = { 0x81048F02, 0xC0000000, 0x40000010 };
uint8_t psg76489_init_data[4] = { 0x9F, 0xBF, 0xDF, 0xFF };
void main() // sub_4B000
{
*(uint16_t *) SYSTEM_IO_CART = 0;
sub_4B08E();
*(uint16_t *) VDP_CONTROL = 0x8144; // enable out to display
sub_4B0C0();
*(uint16_t *) VDP_CONTROL = 0x8104; // disable out to display
*(uint16_t *) SYSTEM_IO_SMODE_J2 = 0;
*(uint16_t *) SYSTEM_IO_CTRL_J2 = 4;
if (((*(uint16_t *) SYSTEM_IO_DATA_J2) & 3) == 0)
{
/* если на втором джое нажаты UP+DOWN
* то мы попадаем сюда, это своего рода принудительный запуск с карика */
*(uint16_t *) SYSTEM_IO_CTRL_J2 = 0;
uint16_t *src = (uint16_t *) 0x4B078,
*dst = (uint16_t *) RAM_BASE + 0x2000;
for (int i = 0; i < 11; i++)
{
dst[i] = src[i];
}
typedef void (*function)(void);
function start_from_ram = dst;
start_from_ram();
}
/* loc_1EA10 */
if (((*(uint8_t *) SYSTEM_VERSION) & 0xF) != 0)
{
*(uint32_t *) 0xA14000 = (uint32_t) "SEGA";
}
(void) *(uint16_t *) VDP_CONTROL;
reg[USP] = NULL; // clear User Stack Pointer
uint16_t val = params[0]; // 0x8000
for (int i = 0; i < 24; i++)
{
*(uint16_t *) VDP_CONTROL = (val & 0xFF00) | vdp_init_data[i];
val += 0x100;
}
*(uint32_t *) VDP_CONTROL = write_vram_dma;
*(uint16_t *) VDP_DATA = 0;
*(uint16_t *) CONTROL_Z80_BUS = 0x100;
*(uint16_t *) CONTROL_Z80_RESET = 0x100;
while ((*(uint16_t *) CONTROL_Z80_BUS) != 0) ;
for (int i = 0; i < 38; i++)
{
((uint8_t *) SYSTEM_Z80)[i] = z80_init_data[i];
}
*(uint16_t *) CONTROL_Z80_RESET = 0;
*(uint16_t *) CONTROL_Z80_BUS = 0;
*(uint16_t *) CONTROL_Z80_RESET = 0x100;
/* clear RAM */
for (int i = 0, int *ram = 0; i < 0x4000; i++) // i <= params[1]
{
--*ram = 0;
}
*(uint32_t *) VDP_CONTROL = params2[0];
*(uint32_t *) VDP_CONTROL = params2[1];
for (int i = 0; i < 32; i++)
{
*(uint32_t *) VDP_DATA = 0;
}
*(uint32_t *) VDP_CONTROL = params2[2];
for (int i = 0; i < 20; i++)
{
*(uint32_t *) VDP_DATA = 0;
}
for (int i = 0; i < 4; i++)
{
*(uint8_t *) VDP_PSG76489 = psg76489_init_data[i];
}
*(uint16_t *) CONTROL_Z80_RESET = 0;
/* на этом и закончим, дальше идёт код относящийся меню, он нам не интересен */
}
void sub_4B08E()
{
*(uint16_t *) CONTROL_Z80_BUS = 0x100;
*(uint8_t *) VDP_PSG76489 = 0x9F;
*(uint8_t *) VDP_PSG76489 = 0xBF;
*(uint8_t *) VDP_PSG76489 = 0xDF;
*(uint8_t *) VDP_PSG76489 = 0xFF;
*(uint16_t *) CONTROL_Z80_BUS = 0;
}
void sub_4B0C0()
{
*(uint16_t *) SYSTEM_IO_UNK1 = 0x4000;
*(uint16_t *) SYSTEM_IO_UNK2 = 0x4F9;
*(uint16_t *) SYSTEM_IO_UNK3 = 0xA0D;
*(uint16_t *) SYSTEM_IO_UNK8 = 5;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x90C1;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x9BC1;
delay();
*(uint16_t *) SYSTEM_IO_UNK8 = 11;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x90C1;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x9BC1;
delay();
*(uint16_t *) SYSTEM_IO_UNK8 = 5;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x90C1;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x9BC1;
delay();
*(uint16_t *) SYSTEM_IO_UNK8 = 11;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x90C1;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x9BC1;
delay();
*(uint16_t *) SYSTEM_IO_UNK8 = 15;
*(uint16_t *) SYSTEM_IO_UNK9 = 0x10A4;
*(uint16_t *) SYSTEM_IO_UNK10 = 0x2001;
*(uint16_t *) SYSTEM_IO_UNK11 = 0x6001;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x90C3;
*(uint16_t *) SYSTEM_IO_UNK0 = 0x9BC3;
}
void delay() // sub_4B182
{
for (int i = 0; i < 2; i++)
{
short cnt = 0x2000;
do
{
asm("nop\n");
asm("nop\n");
}
while (cnt--)
}
}
void start_from_ram()
{
*(uint16_t *) SYSTEM_IO_CART = 0x20;
reg[SP] = reg[USP] = ((uint32_t *) ROM_CARTRIDGE)[0];
typedef void (*function)(void);
function run_from_cartridge = ((uint32_t *) ROM_CARTRIDGE)[1];
run_from_cartridge();
}
--- Конец кода ---
вот теперь можно проанализировать :)
в принципе всё упрощается тем, что функция запуска карика расположена близко к началу программы
на самом старте происходит запись в регистр который я в прошлый раз обозвал SYSTEM_IO_CART, пишется в него 0 и я подозреваю что это переключатель на внутренний ром, переместимся к функции start_from_ram, в фесте она намного проще, вновь запись значения 0x20 в рег 0xA16106 и сразу после этого обращение к внешнему карику, так что сомнений по поводу того что это переключатель с внутреннего на внешний ROM у меня не осталось и полагаю что обнулив bit5 произойдёт обратное переключение
сравнивая два дизасма явно прослеживается закономерность, функция sub_4B0C0 у фесты и sub_540 у MD350 вызываются сразу после включения вывода изображения, причём у фесты после этого картинка сразу отключается, такое поведение характерно для инициализации дисплея
итого, единственный оставшийся вариант который может рулить режимом джоев это bit7 регистра 0xA16106
demolition.nick, вот исправленный ром MD350_ROM_tst2.7z (4.09 КБ - загружено 227 раз.)
demolition.nick:
megavolt85, Спасибо конечно за старания, но пока протестить нет возможности
megavolt85:
demolition.nick, ну как будет, пиши. если надумаешь менять память, то тоже пиши, можно в фэстовском дампе поправить инициализацию дисплея и залить в MD350, будет со встроенными играми, но конечно придётся память поменять и распаять микруху джоя
кстати ты так и не написал что за память напаяна
так же интересно, есть ли у тебя возможность прошивать карики
Rumata:
--- Цитата ---/* если на втором джое нажаты UP+DOWN
* то мы попадаем сюда, это своего рода принудительный запуск с карика */
--- Конец цитаты ---
То есть не попадём никогда. Потому, что а) второго джойстика нет и некуда подключить, б) на джойстике физически не возможно нажать UP+DOWN
megavolt85:
--- Цитата: Rumata от 12 Июль 2018, 20:11:22 ---То есть не попадём никогда.
--- Конец цитаты ---
не известно для чего это вообще оставлено в коде, но этот код можно с лёгкостью заменить на любое другое сочетание первого джоя
Rumata:
Это в любом случае бессмысленная вещь. Ибо в портативках нет второго джойстика, а стационарных переключение происходит аппаратно
megavolt85:
--- Цитата: demolition.nick от 10 Июль 2018, 00:01:53 ---MD Ultimate без ROM вообще картинку на экран не выводит
--- Конец цитаты ---
тоже на ТСТ-6703? дамп есть?
demolition.nick:
--- Цитата: megavolt85 от 13 Июль 2018, 16:05:35 ---тоже на ТСТ-6703? дамп есть?
--- Конец цитаты ---
TCT-6803, но думаю это дела не меняет. Дампа нет, т.к. DVD на отрез отказывается флешки определять. Наверное что-то где-то накосячил.
А у TCT-6803 из координальных отличий только большее количество адресных линий (A1-A26)
Rumata:
Ну адресных линий больше быть не может, могут быть старшие разряды маппера
demolition.nick:
--- Цитата: Rumata от 13 Июль 2018, 19:41:54 ---Ну адресных линий больше быть не может, могут быть старшие разряды маппера
--- Конец цитаты ---
Ну скорее всего так и есть. Просто встроенный маппер. Но линии для удобства я пронумеровал именно так
demolition.nick:
АЛИЛУЯ МАТЬ ЕЁ
Не смог с одной платой разобраться, разобрался со второй.
Итог - слил ром с MDP Ultimate.
Флешка MX29LV800BTC-90
1 Мегабайт, занято примерно 50 Килобайт
megavolt85:
demolition.nick, не хилая там карусель в коде, но закономерность с переключением карика никуда не делась
demolition.nick:
--- Цитата: megavolt85 от 14 Июль 2018, 19:27:48 ---demolition.nick, не хилая там карусель в коде, но закономерность с переключением карика никуда не делась
--- Конец цитаты ---
В том коде единственное что я хочу изменить, это замуты с регионом. Короче хочу нормальные 60 герц
megavolt85:
--- Цитата: demolition.nick от 14 Июль 2018, 19:30:39 ---Короче хочу нормальные 60 герц
--- Конец цитаты ---
как правило такое замыканием ног проца делается
demolition.nick:
--- Цитата: megavolt85 от 14 Июль 2018, 20:14:14 ---как правило такое замыканием ног проца делается
--- Конец цитаты ---
Как правило...
Здесь не по правилам. Я уже писал об этом. Короче говоря если загрузиться в обход ROM (CART на землю), то скорость нормальная становится.
Навигация
Перейти к полной версии