| Приставки > Портативные |
| 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 на землю), то скорость нормальная становится. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |