| Приставки > Портативные |
| Megadrive Portable |
| << < (19/31) > >> |
| megavolt85:
Rumata, по какому оффсету заставка? не 0x3886 случаем, размер 0x870000 даташит на дисплей есть? |
| Rumata:
Не помню. Точнее даже подробно не выяснял. Она не пожатая, любым вьюером видно Добавлено позже: Смотри файл MD350_ROM_TRIMMED.bin, там всего 16к. Судя по дампу графика начинается где-то с $0754 |
| demolition.nick:
--- Цитата: megavolt85 от 06 Июль 2018, 12:41:23 ---Rumata, по какому оффсету заставка? не 0x3886 случаем, размер 0x870000 даташит на дисплей есть? --- Конец цитаты --- |
| Rumata:
Этот даташит мало чего даёт. Нужен апликейшн, даташит на драйвер. |
| demolition.nick:
--- Цитата: Rumata от 06 Июль 2018, 13:43:42 ---Этот даташит мало чего даёт. Нужен апликейшн, даташит на драйвер. --- Конец цитаты --- Этот даташит как минимум даёт название дисплея :lol: |
| Rumata:
Но не даёт название драйвера :( |
| demolition.nick:
--- Цитата: Rumata от 06 Июль 2018, 14:32:49 ---Но не даёт название драйвера :( --- Конец цитаты --- Тут ещё хоть что-то. На Ultimate вообще еле нашёл такой даташит, а как начал его читать, понял что не оно. Диагональ не та, распиновка тоже. |
| Rumata:
Даже интересно, почему это всё идёт как конфиденциальное? |
| demolition.nick:
--- Цитата: Rumata от 06 Июль 2018, 14:53:58 ---Даже интересно, почему это всё идёт как конфиденциальное? --- Конец цитаты --- Сам не понимаю. Вот допустим я проектирую свою систему. Мне недостаточно знать интерфейсы дисплея. И то продавцы бывает не пишут их. В идеале понакачал даташитов на более-менее подходящие дисплеи и читаешь. А тут кетайцы сами себе могилу роют |
| Rumata:
У меня на Фесте один раз MOVE.W #$0020,$00A16106 при том, что там джойстик 6-кнопочный на отдельной микросхеме И куча строк типа: MOVE.W #$4000,$00A16302 MOVE.W #$04F9,$00A16304 MOVE.W #$0A0D,$00A16306 MOVE.W #$0005,$00A16310 MOVE.W #$90C1,$00A16300 MOVE.W #$9BC1,$00A16300 Скорее всего это настройка дисплея (дисплей другой) |
| demolition.nick:
Rumata, а чё за чип в той фесте? 6703 или 6803? Просто Hamy HG-806 есть и такие и сякие |
| Rumata:
У меня 6703 |
| demolition.nick:
--- Цитата: Rumata от 06 Июль 2018, 19:05:11 ---У меня 6703 --- Конец цитаты --- А дисплей там на те же ноги идёт что и у меня? |
| Rumata:
Ну вроде как да, 39 - 47. Только про него ничего не известно. Вроде как LG48238QS45-1A, 2,4" 320x234 |
| demolition.nick:
--- Цитата: Rumata от 06 Июль 2018, 20:25:36 ---Ну вроде как да, 39 - 47. Только про него ничего не известно. Вроде как LG48238QS45-1A, 2,4" 320x234 --- Конец цитаты --- Что-то мне подсказывает что на них информация одинаковая идёт. Проведу эксперимент по скрещиванию Ultimate и 350 на днях... А на Ultimate я вроде как нашёл даташит. Экран там AUO A025BN02 VB и V9 (так написано на переходной плате). Я вроде нашёл V5. По распиновке всё сходится. |
| Rumata:
Сам интерфейс serial RGB одинаков, даже стандартен, а вот инициализация через SPI разная |
| megavolt85:
Rumata, нету ли случаем описания формата картинки? P.S. дамп кстати работает в эмуляторе, картинка во всяком случае отображается |
| Rumata:
--- Цитата: megavolt85 от 07 Июль 2018, 18:38:12 ---нету ли случаем описания формата картинки? --- Конец цитаты --- В смысле? Обычная картинка, сеговская.. Наверно где-то в доках есть описание формата. --- Цитата: megavolt85 от 07 Июль 2018, 18:38:12 ---дамп кстати работает в эмуляторе, картинка во всяком случае отображается --- Конец цитаты --- А чего бы ему не работать? Это реальное железо, все доп. регистры работают только на запись. Собственно скриншот заставки я откуда брал? |
| megavolt85:
--- Цитата: Rumata от 07 Июль 2018, 19:06:37 ---Собственно скриншот заставки я откуда брал? --- Конец цитаты --- честно говоря думал что вытащил из дампа --- Цитата: Rumata от 07 Июль 2018, 19:06:37 ---Обычная картинка, сеговская.. --- Конец цитаты --- не имел я раньше дел с genisis/megadrive, ладно буду искать, может кто пнёт в нужном направлении, нужно описание формата или исходник какого нибудь конвертера |
| megavolt85:
в общем как то так --- Код: ---#define ROM_CARTRIDGE 0x000000 #define VDP_DATA 0xC00000 #define VDP_CONTROL 0xC00004 #define VDP_HWCOUNTER 0xC00008 #define VDP_PSG76489 0xC00010 #define SYSTEM_IO_UNK0 0xA13000 #define SYSTEM_IO_CART 0xA16106 #define SYSTEM_IO_UNK1 0xA16302 #define SYSTEM_IO_UNK2 0xA16304 #define SYSTEM_IO_UNK3 0xA16306 void main() // sub_400 { reset_VDP(); write_cram(0, &dword_754); sub_6A2(1, 0x3122, &dword_764); sub_6D6(1, 0x870000, &dword_3886); *(uint16_t *) VDP_CONTROL = 0x8144; sub_540(); delay(16); uint16_t *src = word_47C; uint16_t *dst = (uint16_t *) 0xFF0000; // RAM /* Copy SUBROUTINE to RAM*/ for (int i = 0; i < 98; i++) { dst[i] = src[i]; } typedef void (*function)(void); function start_from_ram = dst; start_from_ram(); } void sub_540() { *(uint16_t *) SYSTEM_IO_UNK1 = 0x3000; *(uint16_t *) SYSTEM_IO_UNK2 = 0xF0CC; *(uint16_t *) SYSTEM_IO_UNK3 = 0x7813; } void delay(int cnt) // sub_574 { do { for (int i = 0; i <= 0xFFFF; i++); } while (cnt--) } void reset_VDP() // sub_58A { clear_vram(); clear_vsram(); clear_cram(); sub_622(); } void clear_cram() // sub_5A4 { *(uint16_t *) VDP_CONTROL = 0x8F02; *(uint32_t *) VDP_CONTROL = 0xC0000000; for (int i = 0; i < 32; i++) { *(uint32_t *) VDP_DATA = 0; } } void clear_vram() // sub_5CE { *(uint16_t *) VDP_CONTROL = 0x8F02; *(uint32_t *) VDP_CONTROL = 0x40000000; for (int i = 0; i < 0x4000; i++) { *(uint32_t *) VDP_DATA = 0; } } void clear_vsram() // sub_5F8 { *(uint16_t *) VDP_CONTROL = 0x8F02; *(uint32_t *) VDP_CONTROL = 0x40000010; for (int i = 0; i < 20; i++) { *(uint32_t *) VDP_DATA = 0; } } void sub_622() { uint16_t val = 0x8000; for (int i = 0; i < 24; i++) { val = (val & 0xFF00) | byte_64A[i]; *(uint16_t *) VDP_CONTROL = val; val += 0x100; } } uint8_t byte_64A[24] = { 0x04, 0x04, 0x38, 0x34, 0x06, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x02, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x80 }; void write_cram(uint32_t d0, uint32_t *a0) // sub_662 { uint32_t *data = (uint32_t *) ((d0 << 5) & 0x60) + a0; d0 = (((d0 >> 3) & 0x60) | 0xC000) << 16; *(uint16_t *) VDP_CONTROL = 0x8F02; *(uint32_t *) VDP_CONTROL = d0; for (int i = 0; i < 8; i++) { *(uint32_t *) VDP_DATA = data[i]; } } void sub_6A2(uint16_t d0, uint16_t d1, uint16_t *a0) { uint32_t val = (((d0 << 5) & 0xFFFE) << 2); val = (((uint16_t) val) >> 2) | 0x4000; val = (val >> 16) | (val << 16); *(uint32_t *) VDP_CONTROL = val; uint16_t cnt = (d1 / 2) - 1; uint16_t *data = a0 + 2; for (int i = 0; i < cnt; i++) { *(uint16_t *) VDP_DATA = data[i]; } } void sub_6D6(uint16_t d0, uint32_t d1, uint16_t *a0) { uint16_t tmp; // d2 int cnt; // d3 uint16_t orval; // d4 int cnt2; // d5 tmp = (d1 & 0x3F) << 1; d1 = (((d1 & 0x1F00) >> 1) + tmp) | (d1 & 0xFFFF0000); d1 = (d1 << 16) | (d1 >> 16); orval = (uint16_t) d1; orval = (orval << 7) & 0x8000; d1 = (d1 & 7) | (d1 & 0xFFFF0000); tmp = (uint16_t) d1; tmp = (tmp & 1) | (tmp & 0xFF00); tmp = (tmp >> 3) | (tmp << 13); d1 = ((d1 >> 1) & 0xFF) | (d1 & 0xFFFFFF00); d1 += ((tmp + 0x4000) << 16); *(uint16_t *) VDP_CONTROL = 0x8F02; *(uint32_t *) VDP_CONTROL = d1; tmp = *a0++; cnt = *a0++; cnt = (cnt >> 8) | (cnt << 8); cnt2 = (tmp >> 8) | (tmp << 8); for (int i = 0; i < cnt; i++) { for (int n = 0; n < cnt2; n++) { *(uint16_t *) VDP_DATA = (((d0 + *a0++) & 0x7FFF) | orval); } d1 += 0x800000; *(uint32_t *) VDP_CONTROL = d1; } } uint32_t dword_764 = 0x40000L; void start_from_ram() // sub_FF0000 { (void) *(uint16_t *) SYSTEM_IO_UNK0; *(uint16_t *) SYSTEM_IO_CART = 0x20; // FIXME switch from internal ROM to cartridge ROM *(uint16_t *) SYSTEM_IO_CART = 0xA0; // FIXME reset cartridge ROM for (int i = 0; i < 0x10000; i++) // simple delay { asm("nop\n"); asm("nop\n"); } if (((uint8_t *) ROM_CARTRIDGE)[0x100] != 'S') { /* cartridge not present */ while(1); // infinite loop } *(uint16_t *) VDP_CONTROL = 0x8104; reg[SR] = 0x2700; *(uint16_t *) VDP_CONTROL = 0x8F02; *(uint32_t *) VDP_CONTROL = 0xC0000000; for (int i = 0; i < 32; i++) { *(uint32_t *) VDP_DATA = 0; } *(uint32_t *) VDP_CONTROL = 0x40000000; for (int i = 0; i < 0x4000; i++) { *(uint32_t *) VDP_DATA = 0; } *(uint16_t *) VDP_CONTROL = 0x8104; *(uint16_t *) SYSTEM_IO_CART = 0xA0; // FIXME reset cartridge ROM asm("nop\n"); asm("nop\n"); asm("nop\n"); asm("nop\n"); 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(); } --- Конец кода --- |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |