Автор Тема: Megadrive Portable  (Прочитано 89184 раз)

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

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #420 : 09 Июль 2018, 20:13:24 »
Разумеется если влепить игры, то я всё это дело на флешку по ёмче запишу. Пока под рукой есть только 2 мегабайта. Разведены адреса вроде A0-A21.

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Megadrive Portable
« Ответ #421 : 09 Июль 2018, 20:16:33 »
Если приставка не портативка, то первым стартует то, что включен.

но мы то говорим сейчас о MD350, а в ней всё иначе, первым всегда стартует встроенный

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #422 : 09 Июль 2018, 20:36:24 »
Да какая, нафиг, разница? Во встроенном ПЗУ есть инциализация дисплея, которой нет в обычном картридже. Если это инициализацию запустить с внешнего картриджа, то эффект будет тем же самым.

Добавлено позже:
первым всегда стартует встроенный
Посади /CART на землю и первым запустится внешний. Только картинка будет неведомо какая, поскольку дисплей не настроен

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Megadrive Portable
« Ответ #423 : 09 Июль 2018, 22:02:35 »
Посади /CART на землю и первым запустится внешний.

то есть в родном MD350 карике он не замкнут на землю?

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #424 : 09 Июль 2018, 22:10:03 »
Ну у "родного" картриджа вообще нет такого контакта. Там свои мелкие картриджи. А вход на ТСТ-6703 да, открыт, то есть лог. "1"

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #425 : 09 Июль 2018, 22:54:20 »
Короче я так понял нужно схему принципиальную в виде картинки выложить.
Чёт я замаялся с этим DVD. Оказывается запаял всё правильно. Сравнил дамп Sonic 3d с заведомо целым ромом. Только вот одна малюсенькая проблемка. Считало только 2 мегабайта. Чтоб работало всё как часы, нужно в файле прописать инфу о флешке. Прописал, а толку ноль

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #426 : 09 Июль 2018, 23:01:06 »
А может он просто физически больше 2М не умеет?

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #427 : 09 Июль 2018, 23:07:46 »
А может он просто физически больше 2М не умеет?
Умеет. Это дефолтный объём, когда флешка не определяется.

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #428 : 09 Июль 2018, 23:09:22 »
По идее для чтения флешку определять нет нужды  :-\

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Megadrive Portable
« Ответ #429 : 09 Июль 2018, 23:35:51 »
давай исходить из того что имеем, а имеем мы пять не известных регистров 0xA13000, 0xA16106, 0xA16302, 0xA16304 и 0xA16306
из 0xA13000 только читаются данные, в 0xA16106 записываются непосредственно перед переключением с внутреннего на внешний, то есть эти регистры никак не относятся ни к джоям ни к дисплею
остаются 0xA16302, 0xA16304 и 0xA16306, как минимум один из них отвечает за джой
едем дальше, запись в эти три рега происходит уже после того как VDP начал выдавать картинку, отсюда вопрос, почему дисплей так поздно проходит инициализацию? может эти реги вообще не имеют никакого отношения к дисплею?

Добавлено позже:
Короче я так понял нужно схему принципиальную в виде картинки выложить.

это было бы просто великолепно

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #430 : 09 Июль 2018, 23:57:32 »
то есть эти регистры никак не относятся ни к джоям ни к дисплею
Почему? Кстати, там есть маппер на старшие адреса, работает по сигналу /TIME, он же использется для внешних многоигровок. Это едва ли не $A13000 (не могу сейчас вспомнить)
почему дисплей так поздно проходит инициализацию?
Ну а кто-то даташит на драйвер видел? Может ему так надо? Дисплей инициализируется по SPI, это однозначно. Есть приставки, где нет встроенной флешки, там капля и serial EEPROM
Вот кусок из Фесты:
Это не всё, меню и шрифты в другой странице.
Основные отличия: а) другой дисплей,  б) встроенные игры, в) джойстик работает в стандартном режиме, используется отдельная микросхема 6-кнопочного джойстика

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #431 : 10 Июль 2018, 00:01:53 »
это было бы просто великолепно
Схема и фотка дисплея минуя ROM. MD Ultimate без ROM вообще картинку на экран не выводит

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #432 : 10 Июль 2018, 00:15:27 »
Да, /TIME $A130xx. В оригинале обычно используется для переключения ПЗУ и ОЗУ
Например Phantasy Star IV
MOVE.B           #$00,$00A130F1
MOVE.B           #$01,$00A130F1
Что значит последний байт - не известно. В меню многоигровок можно найти самые разные значения. Могу предположить, что чтение $A13000 - сброс, то есть отключение маппера и все старшие адреса работают как адреса.

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #433 : 10 Июль 2018, 00:34:38 »
Вот ещё вопросец.
Хотелось бы джой сделать на корпусной микрухе. То что китайцы их делают это точно. Вопрос где взять? Ultimate жалко ломать

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Megadrive Portable
« Ответ #434 : 10 Июль 2018, 00:48:33 »
Вот кусок из Фесты

она на том же проце что и MD350? дамп есть?

Могу предположить, что чтение $A13000 - сброс

в нашем случае оттуда только читается word, при этом прочитанное никак не используется

Добавлено позже:
фотка дисплея минуя ROM

как ROM отключил? CART на землю посадил?

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #435 : 10 Июль 2018, 00:53:12 »
Вопрос где взять?
Ну наверно в Китае. Хотя на Али даже ТСТ-6801 нет. Может Алибаба или Таобао :neznayu:
она на том же проце что и MD350?
Естественно.
в нашем случае оттуда только читается word, при этом прочитанное никак не используется
А его и не надо использовать. Достаточно просто обращения к адресу

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #436 : 10 Июль 2018, 01:07:16 »
как ROM отключил? CART на землю посадил?
ну

Добавлено позже:
Ну наверно в Китае. Хотя на Али даже ТСТ-6801 нет. Может Алибаба или Таобао
Перефразирую вопрос. Какие бывают корпусные клоны чипа 6-ти кнопочного джоя? Маркировки?
 

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #437 : 10 Июль 2018, 02:04:44 »
Какие бывают корпусные клоны чипа 6-ти кнопочного джоя? Маркировки?
По моему никакие. Ни разу таковых не видел и интернетах не встречал

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #438 : 10 Июль 2018, 13:53:56 »
По моему никакие. Ни разу таковых не видел и интернетах не встречал
Хреново.
Прикол в том что он у меня есть, но жертвовать MD Ultimate раде него неохота

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #439 : 10 Июль 2018, 18:09:19 »
Распаял плату MDP Ultimate и отсканил. Если кому надо, то сканы прилагаю. На них дорисованы дорожки, которые скрыты под краской

Добавлено позже:
Интересно что в Ultimate ROM стоит на 1 мегабайт. Хотя в нём поидее ничего кроме меню, мегакея и управления дисплеем нет
« Последнее редактирование: 10 Июль 2018, 19:50:37 от demolition.nick »

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #440 : 10 Июль 2018, 21:02:02 »
Очень любопытно. Тоже DW-16. А то такая U8?

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #441 : 10 Июль 2018, 21:08:29 »
Очень любопытно. Тоже DW-16. А то такая U8?
Та самая KXD638, на которой 6 кнопок реализованы

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #442 : 10 Июль 2018, 21:15:50 »
Понятно. Я про неё и забыл. Значит 24 ноги. У моей бескорпусной 22. Хотя у бескорпусной модно делать сколько угодно

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #443 : 10 Июль 2018, 21:44:14 »
Понятно. Я про неё и забыл. Значит 24 ноги. У моей бескорпусной 22. Хотя у бескорпусной модно делать сколько угодно
Там есть возможность посадки корпусной микры?
Я вот тут жумаю над питанием. То что для нормального картртджа желательно 5 вольт это понятно. А как с логическими уровнями? Как-то ж работает зараза

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #444 : 10 Июль 2018, 23:45:24 »
Там есть возможность посадки корпусной микры?
Ну шаг вроде 1,25 :-\

А как с логическими уровнями?
Ну во-первых многие микросхемы имеют запас по логическим уровням. Во-вторых, можно поставить в разрез сигнальных линий резисторы. Что мы и имеем на приведённых выше фото. Резисторные сборки RP1 - RP4, стоящие на шине данных, как раз для этого и предназначены. На адреса ничего не нужно, это выходные сигналы, и в принципе уровень +3,3 В должен быть воспринят как лог. "1"

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Megadrive Portable
« Ответ #445 : 12 Июль 2018, 01:16:35 »
Код: (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 КБ - загружено 178 раз.)
« Последнее редактирование: 12 Июль 2018, 02:29:19 от megavolt85 »

Оффлайн demolition.nick

  • Пользователь
  • Сообщений: 776
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Megadrive Portable
« Ответ #446 : 12 Июль 2018, 15:21:24 »
megavolt85, Спасибо конечно за старания, но пока протестить нет возможности

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Megadrive Portable
« Ответ #447 : 12 Июль 2018, 19:14:07 »
demolition.nick, ну как будет, пиши. если надумаешь менять память, то тоже пиши, можно в фэстовском дампе поправить инициализацию дисплея и залить в MD350, будет со встроенными играми, но конечно придётся память поменять и распаять микруху джоя
кстати ты так и не написал что за память напаяна
так же интересно, есть ли у тебя возможность прошивать карики

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Megadrive Portable
« Ответ #448 : 12 Июль 2018, 20:11:22 »
Цитата
/* если на втором джое нажаты UP+DOWN
       * то мы попадаем сюда, это своего рода принудительный запуск с карика */
То есть не попадём никогда. Потому, что а) второго джойстика нет и некуда подключить, б) на джойстике физически не возможно нажать UP+DOWN

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Megadrive Portable
« Ответ #449 : 12 Июль 2018, 20:19:16 »
То есть не попадём никогда.

не известно для чего это вообще оставлено в коде, но этот код можно с лёгкостью заменить на любое другое сочетание первого джоя