Приставки > Портативные
Megadrive Portable
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();
}
--- Конец кода ---
Навигация
Перейти к полной версии