Приставки > Портативные
Megadrive Portable
<< < (23/31) > >>
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 КБ - загружено 129 раз.)
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 на землю), то скорость нормальная становится.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии