| Разработка и ромхакинг > Ромхакинг и программирование |
| разогнал эмуль генс11а. (генсмуви) |
| << < (4/6) > >> |
| Segaman:
Добавить тада как в з80 банк тайлов :) Добавлено позже: И ваапще, скажите, что нужно, шоб эмуль скомпилить. у мя есть рес кмода, попробую тоже добавить рам |
| Ti_:
--- Цитата: KABAL от 14 Октябрь 2009, 14:58:45 ---А базы в Дюне как спрайты считаются или как SCROLL A или SCROLL B ? --- Конец цитаты --- здания scroll A как и земля. а скролл B кстати "туман войны" только заметил) чит) sprites low - юниты, sprites high -радар. Добавлено позже: --- Цитата: Segaman от 14 Октябрь 2009, 20:11:28 ---И ваапще, скажите, что нужно, шоб эмуль скомпилить. у мя есть рес кмода, попробую тоже добавить рам --- Конец цитаты --- ну как бы 2гига вижл студии) |
| Segaman:
--- Цитата: Ti_ от 14 Октябрь 2009, 20:15:20 ---ну как бы 2гига вижл студии) --- Конец цитаты --- 0_o лушиб ниспрашивал, терь кашмары сница будут :D |
| Марат:
По-моему, разгадка кроется в файле star.c, который в папке starscream. Там есть функции чтения/записи байт, слов и двойных слов. Например, вот эта: --- Код: --- static void gen_readbw(int size) { align(32); emit("readmemory%s:\n",sizename[size]); emit("readmemorydec%s:\n",sizename[size]); if (size == 1) { emit("\tmov [__access_address], edx\n"); emit("\tand edx, 0xFFFFFF\n"); emit("\txor ecx, ecx\n"); emit("\tcmp edx, 0xE00000\n"); emit("\tjb short .Not_In_Ram\n"); emit("\tand edx, 0xFFFF\n"); emit("\txor edx, byte 1\n"); emit("\tmov cl, [Ram_68k + edx]\n"); emit("\tmov edx, [__access_address]\n"); emit("\tret\n"); emit("align 4\n"); emit(".Not_In_Ram\n"); emit("\tpush eax\n"); emit("\tpush edx\n"); emit("\tmov [__io_cycle_counter], edi\n"); emit("\tmov [__io_fetchbase], ebp\n"); emit("\tmov [__io_fetchbased_pc], esi\n"); emit("\tcall M68K_RB\n"); // emit("\tmov eax, [esp]\n"); // emit("\tpush ebx\n"); // emit("\tmov ebx, eax\n"); // emit("\tand eax, 0xF80000\n"); // emit("\tshr eax, 17\n"); // emit("\tand ebx, 0xFFFFFF\n"); // emit("\tcall [M68K_Read_Byte_Table + eax]\n"); emit("\tmov ebp, [__io_fetchbase]\n"); emit("\tmov cl, al\n"); emit("\tmov edi, [__io_cycle_counter]\n"); emit("\tadd esp, byte 4\n"); emit("\tmov esi, [__io_fetchbased_pc]\n"); emit("\tmov edx, [__access_address]\n"); emit("\tpop eax\n"); emit("\tret\n"); } if (size == 2) { emit("\tmov [__access_address], edx\n"); emit("\tand edx, 0xFFFFFF\n"); emit("\txor ecx, ecx\n"); emit("\tcmp edx, 0xE00000\n"); emit("\tjb short .Not_In_Ram\n"); emit("\tand edx, 0xFFFF\n"); emit("\tmov cx, [Ram_68k + edx]\n"); emit("\tmov edx,[__access_address]\n"); emit("\tret\n"); emit("align 4\n"); emit(".Not_In_Ram\n"); emit("\tpush eax\n"); emit("\tpush edx\n"); emit("\tmov [__io_cycle_counter], edi\n"); emit("\tmov [__io_fetchbase], ebp\n"); emit("\tmov [__io_fetchbased_pc], esi\n"); emit("\tcall M68K_RW\n"); emit("\tmov edi, [__io_cycle_counter]\n"); emit("\tadd esp, byte 4\n"); emit("\tmov ebp, [__io_fetchbase]\n"); emit("\tmov cx, ax\n"); emit("\tmov esi, [__io_fetchbased_pc]\n"); emit("\tmov edx, [__access_address]\n"); emit("\tpop eax\n"); emit("\tret\n"); } } --- Конец кода --- как я понял, читает байт или слово (в зависимости от size). Обратите внимание, там идет проверка адреса, если он меньше 0xE00000, то происходит переход на метку not_in_ram и используются функции M68K_RB, M68K_RW, a если больше или равно, то адрес берется по маске 0xFFFF и просто читается из массива Ram_68k --- Код: ---emit("\tand edx, 0xFFFF\n"); emit("\tmov cx, [Ram_68k + edx]\n"); --- Конец кода --- . Из-за маски 0xFFFF сколько бы мы не увеличивали память, она все равно будет читаться/записываться в первы 64 кб. Ну, естественно, нужно будет сделать изменения в файле CPU_68K.c. |
| GManiac:
Интересная находка, скорей всего, дело в этом. Но это крайне неверный подход к написанию ядра CPU, т.к. CPU вообще не должен знать о каких-то памятях и масках. У него есть шина адреса, он выставляет на неё адрес, а куда физически пойдёт обращение, уже решает диспетчер памяти. Удивили они меня такой глупостью. Интересно, это уже в генсе так было (в старскриме вряд ли, он же под сегу не заточен) или это добавили в ГенсТрейсере? (лень смотреть). Наверно, это добавили в Трейсере для упрощения отладки или ещё чего-то. |
| Марат:
Вообще, я забыл сказать, что это я нашел в исходниках gens kmod. Поэтому возможно в gens tracer добавили. Вожможно, это сделали для более точной эмуляции, так как в sega tech overview написано, что область $FF0000 - $FFFFFF отражается в область $Е00000 - $Е0FFFF, $E10000 - $E1FFFF и т.д. |
| GManiac:
Это так работало во всех генсах и без редактирования ядра CPU, помнишь, мы же сначала нашли маску в Mem_68k. Вот там и только там и должна находиться маска. В переводе Sega_Tech HardWareMan пишет, что на железе можно расширить память, поставив нужную планку. |
| KABAL:
Можно сделать так при обращении к памяти RAM: в машинном коде при обращении в RAM пишется адрес от 00 FF 00 00 до 00 FF FF FF - если добавить новый блок памяти - задать ему адрес от 00 FE 00 00 до 00 FE FF FF; и пусть эмулятор копирует не по 64 kb а по 128 кб , начиная с E0 00 00 до FF FF FF, видимо нужно объяснить эмулятору, что область от 00 FE 00 00 до 00 FE FF FF находится в пределах не 64 а 128 копируемых Килобайт, наверное нужно везде, где написано 00 FF 00 00 - 00 FF ff ff написать 00 FE 00 00 - 00 FF FF FF, а где пишется 00 00 - ff ff написать 00 00 00 - 01 FF FF, и при этом объяснить, что 00 FF 00 00 - 00 FF FF FF соответствует 00 00 00 - 00 FF FF RAM, 00 FE 00 00 - 00 FE FF FF соответствует 01 00 00 - 01 FF FF RAM |
| Segaman:
По моему лучше будет если адрес в 2 байта будет, то обращение в 00FFXXXX, а в 4е там де надо. и ваапще, нельзя ли копирование убрать и всю область от E000000 до FFFFFFFF под рам отвести? или там сложнее всё? Добавлено позже: Кстате на википедии прочёл, что карики с размером больше 4 мегов работают с песеключением банков http://ru.m.wikipedia.org/wiki/Sega_Mega_Drive?wasRedirected=true#cite_note-1 |
| Ti_:
--- Цитата: Segaman от 19 Октябрь 2009, 17:53:27 ---По моему лучше будет --- Конец цитаты --- лучше? надо чтобы хоть как-то было))0 у меня после изменений в star.c почти все перестает работать, память отобржает как нули. игры некоторые работают но без изображения. вопрос что там писать заместо FFFF? прбовал 2варианта - 7FFFF и FFFFF везде где про рам68к сказано. вот после этого такие глюки. попробую 1FFFFF еще и все 4 блока прописать. (в мем68к не менял , просто 7ffff писал) |
| Марат:
--- Цитата: Ti_ от 19 Октябрь 2009, 19:05:17 ---лучше? надо чтобы хоть как-то было))0 у меня после изменений в star.c почти все перестает работать, память отобржает как нули. игры некоторые работают но без изображения. вопрос что там писать заместо FFFF? прбовал 2варианта - 7FFFF и FFFFF везде где про рам68к сказано. вот после этого такие глюки. попробую 1FFFFF еще и все 4 блока прописать. (в мем68к не менял , просто 7ffff писал) --- Конец цитаты --- Вот 1FFFFF как раз и надо писать. |
| Ti_:
--- Цитата: Марат от 19 Октябрь 2009, 19:17:17 ---Вот 1FFFFF как раз и надо писать. --- Конец цитаты --- ничего не изменилось вообщем-то :( а что насчет cpu68k.c ? |
| Марат:
Вот попробуй замени свои файлы этими файлами.Star.c and CPU_68K.c Файл star.c из папки Starscream/Main68K. |
| Ti_:
--- Цитата: Марат от 19 Октябрь 2009, 20:11:15 ---Вот попробуй замени свои файлы этими файлами.Star.c and CPU_68K.c Файл star.c из папки Starscream/Main68K. --- Конец цитаты --- уже лучше) RRR не пашет, а Dune пашет. сейчас изменю код в RRR как тогда).(т.к. мемтест у меня там) опять тоже самое... все 65кб (E0xxxx- FFxxxx) куски дублируются.. хотя вот еще что было: Cpu_68k.c .\Cpu_68k.c(157) : warning C4029: declared formal parameter list different from definition Generating Main68k Starscream Assembly STARSCREAM version M0.26d Unrecognized option: "-quiet" Project : error PRJ0019: A tool returned an error code from "Generating Main68k Starscream Assembly" Build log was saved at "file://c:\gens11a\svnblah\Gens\Starscream\Main68k\Release\BuildLog.htm" MainStar - 1 error(s), 0 warning(s) |
| Марат:
Хм, а ты батник comp_m68k запусканшь, перед компиляцией? |
| Ti_:
--- Цитата: Марат от 19 Октябрь 2009, 21:25:44 ---Хм, а ты батник comp_m68k запусканшь, перед компиляцией? --- Конец цитаты --- сча, глянем. я его ток 1раз запускал когда первый раз собирал. наверн из-за этого |
| Марат:
--- Цитата: Ti_ от 19 Октябрь 2009, 21:13:45 --- хотя вот еще что было: Cpu_68k.c .\Cpu_68k.c(157) : warning C4029: declared formal parameter list different from definition Generating Main68k Starscream Assembly STARSCREAM version M0.26d Unrecognized option: "-quiet" Project : error PRJ0019: A tool returned an error code from "Generating Main68k Starscream Assembly" Build log was saved at "file://c:\gens11a\svnblah\Gens\Starscream\Main68k\Release\BuildLog.htm" MainStar - 1 error(s), 0 warning(s) --- Конец цитаты --- Наверное, мой файл отличается от твоего. У меня ведь с gens kmod'a. Дай мне свои. |
| Ti_:
--- Цитата: Марат от 19 Октябрь 2009, 21:29:19 ---Наверное, мой файл отличается от твоего. У меня ведь с gens kmod'a. Дай мне свои. --- Конец цитаты --- Добавлено позже: --- Цитата: Ti_ от 19 Октябрь 2009, 21:27:36 ---сча, глянем. я его ток 1раз запускал когда первый раз собирал. наверн из-за этого --- Конец цитаты --- теперь эффект заметнее.-заглючило много че)))-точнее графа и ток во время гонки однако мемтест уже другой) ну что-то нулю было равно либо(значит пашет) или не прошла запись. трасе лог сломался поэтому точно узнать нельзя. Добавлено позже: --- Цитата: Марат от 19 Октябрь 2009, 21:29:19 ---Наверное, мой файл отличается от твоего. У меня ведь с gens kmod'a. Дай мне свои. --- Конец цитаты --- ну как удалось мои изменить? Добавлено позже: я уже сам изменил ) правда ток один и кажись мем заработала) сейчас буду тест прогонять узнаем. по чтению нули идут уже) 10:0000 0C B9 CMPI.L #$00000000,($00F00000) 10:000A 66 00 BNE #$0058 [10:0064] 10:000E 0C B9 CMPI.L #$00000000,($00F12345) 10:0018 66 00 BNE #$004A [10:0064] |
| Марат:
Вот http://narod.ru/disk/14290530000/Cpu_68k.c.html |
| Ti_:
заработала память 10:0000 23 FC MOVE.L #$12345678,($00FF0002) - запись 10:000A 0C B9 CMPI.L #$12345678,($00FF0002) - чтение 10:0014 66 00 BNE #$0012 [10:0028] - равно. 10:0018 0C B9 CMPI.L #$12345678,($00E00002) - E00002 теперь заместо FF0002 (память, пришлось в игре код менять) 10:0022 66 00 BNE #$0004 [10:0028] - E00002 неравно FF0002 - не дублируется! 10:0028 4E 71 NOP 10:002A 4E 75 RTS Добавлено позже: --- Цитата: Марат от 19 Октябрь 2009, 22:30:51 ---Вот --- Конец цитаты --- сейчас с этим попробую надеюсь графа вернется в игру ) не помогло . может M68K_Fetch[1].offset = (unsigned)&Ram_68k[0] - 0xE00000; все таки FF0000 должен быть? |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |