Эмуляция > Эмуляторы консолей 6 поколения и выше
NullDC - Эмулятор Sega Dreamcast (продолжение)
Tetsujin:
Новые сборки у меня не позволяют монтировать многие образы игр - "ошибка загрузки образа" при запуске. При этом эти же образы прекрасно работают на 1.0.3 и также хорошо работали на ранних версиях сборок 1.0.4, точно не припомню последнюю рабочую версию. Бивис и флеш везде использовал и от 1.0.3 и заменял на другие, с ними всё также работало. А сейчас скачал кучу новых сборок - от r78 до оптимизированной r110, в последней уже вшит бивис с флешем, но ошибка одна и таже, как при кривом образе, запустился Шенми с GDI и с CDI/MDS - грузится меню (с музыкой больше глюков нет), но новую игру начать нельзя - раздаётся звук, как при попытке загрузить игру в отсутствие сейвов.
Это чем-то лечится? Перепробовал биосы и флеши других регионов, но толку нет.
UPD: Скачал r71 - там всё прекрасно работает, а на r72 и старше получаю свою ошибку. Исправления в r72 такие: "imgreader rewrite, part 1, Only gdis work for now", т.е. далее r72 поддерживается только GDI ?? Но на примере GDI Шенми в последней сборке r110 можно сказать, что и там оно не работает нормально - начать новую игру нельзя, к тому же тот же Шенми загрузился и с CDI и с MDS.
Silver 746:
На новой r110 многие игры стали работать лучше, особенно серия Sonic Adventure, в командной строке пропали почти все замечания о ошибочной записи памяти.
Wind:
LOL, вот что я называю реальный LOL, когда человек говорит и сам не понимает, что он сказал, я вот чес слово под стол закотился со смеху...
~Scorpion-:
--- Цитата: Silver 746 от 14 Декабря 2010, 18:06:06 ---На новой r110 многие игры стали работать лучше, особенно серия Sonic Adventure, в командной строке пропали почти все замечания о ошибочной записи памяти.
--- Конец цитаты ---
Так в коде были вырублены все эти системы оповещения об ошибках, я так понял, чтоб глаза не мозолили. А то то, что сообщений об ошибках нет, ещё не значит, что они исправлены ;)
Silver 746:
Я говорю про ошибочное обращение к памяти, в старых ревах было много замечаний, так или иначе по каким либо причинам игра функционирует не полностью, не может добавить всю музыку в список (Sound Test) не позволяет выбирать темы оформлении, итд...
Все эти мелкие ошибки связаны с памятью.
В новой реве всего одно замечание с обращением памяти - Error in dc\mem\sh4_internal_reg.cpp:RegSRead:87
Wind:
Жги дальше, реально смешно же...
wolfer:
Wind, не все же эмуляторы разрабатывают, зачем над человеком стебаться :)
CaH4e3:
но почему-то все эксперты лол
MetalliC:
wolfer, дык, например, GTScorpion эмуляторы не разрабатывает, но смысл понял, и написал
а некоторые местные не способны даже прочитать чего им пишут ;)
Silver 746:
в новой реве было много изменений в памяти.
...
28 28 // much empty space
29 29
30 30
31 +
31 32 //0x005F6800 SB_C2DSTAT RW ch2-DMA destination address
32 33 u32 SB_C2DSTAT = 0;
33 34 //0x005F6804 SB_C2DLEN RW ch2-DMA length
...
327 328 u32 sb_ReadMem(u32 addr,u32 sz)
328 329 {
329 330 u32 offset = addr-SB_BASE;
331 + register u32 rflags;
332 + RegisterStruct* reg;
330 333 #ifdef TRACE
331 334 if (offset & 3/*(size-1)*/) //4 is min allign size
332 335 {
...
335 338 #endif
336 339
337 340 offset>>=2;
341 + reg = &sb_regs[offset];
342 + rflags = reg->flags;
338 343
339 344 #ifdef TRACE
340 - if (sb_regs[offset].flags & sz)
345 + if (rflags & sz)
341 346 {
342 347 #endif
343 - if (sb_regs[offset].flags & REG_READ_DATA )
344 - {
345 - if (sz==4)
346 - return *sb_regs[offset].data32;
347 - else if (sz==2)
348 - return *sb_regs[offset].data16;
349 - else
350 - return *sb_regs[offset].data8;
348 + #ifdef SB_MAP_UNKNOWN_REGS
349 + if(reg->unk)
350 + log("Read from unk-mapped SB reg : addr=%x\n",addr);
351 + #endif
352 +
353 + if (rflags & REG_READ_DATA )
354 + {
355 + switch(sz)
356 + {
357 + case 2:
358 + return *reg->data16;
359 +
360 + case 4:
361 + return *reg->data32;
362 +
363 + default:
364 + return *reg->data8;
365 + }
351 366 }
352 367 else
353 368 {
354 - if (sb_regs[offset].readFunction)
355 - return sb_regs[offset].readFunction();
369 + if (reg->readFunction)
370 + return reg->readFunction();
356 371 else
357 372 {
358 - if (!(sb_regs[offset].flags& REG_NOT_IMPL))
359 - EMUERROR("ERROR [readed write olny register]");
373 + if (!(rflags& REG_NOT_IMPL))
374 + EMUERROR("ERROR [readed write olny register]\n");
360 375 }
361 376 }
362 377 #ifdef TRACE
363 378 }
364 379 else
365 380 {
366 - if (!(sb_regs[offset].flags& REG_NOT_IMPL))
381 + if (!(rflags& REG_NOT_IMPL))
367 382 EMUERROR("ERROR [wrong size read on register]");
368 383 }
369 384 #endif
370 - if ((sb_regs[offset].flags& REG_NOT_IMPL))
371 - EMUERROR2("Read from System Control Regs , not implemented , addr=%x",addr);
385 + if ((rflags& REG_NOT_IMPL))
386 + EMUERROR2("Read from System Control Regs , not implemented , addr=%x\n",addr);
387 +
372 388 return 0;
373 389 }
374 390
375 391 void sb_WriteMem(u32 addr,u32 data,u32 sz)
376 392 {
377 393 u32 offset = addr-SB_BASE;
394 + register u32 rflags;
395 + RegisterStruct* reg;
378 396 #ifdef TRACE
379 397 if (offset & 3/*(size-1)*/) //4 is min allign size
380 398 {
381 399 EMUERROR("unallinged System bus register write");
382 400 }
383 401 #endif
384 - offset>>=2;
402 +
403 + offset>>=2;
404 + reg = &sb_regs[offset];
405 + rflags = reg->flags;
406 +
385 407 #ifdef TRACE
386 - if (sb_regs[offset].flags & sz)
408 + if (rflags & sz)
387 409 {
388 410 #endif
389 - if (sb_regs[offset].flags & REG_WRITE_DATA)
390 - {
391 - if (sz==4)
392 - *sb_regs[offset].data32=data;
393 - else if (sz==2)
394 - *sb_regs[offset].data16=(u16)data;
395 - else
396 - *sb_regs[offset].data8=(u8)data;
411 + #ifdef SB_MAP_UNKNOWN_REGS
412 + if(reg->unk)
413 + log("Write to unk-mapped SB reg : addr=%x,data=%x\n",addr,data);
414 + #endif
415 +
416 + if (rflags & REG_WRITE_DATA)
417 + {
418 + switch(sz)
419 + {
420 + case 2:
421 + *reg->data16=(u16)data;
422 + return;
423 +
424 + case 4:
425 + *reg->data32=data;
426 + return;
427 +
428 + default:
429 + *reg->data8=(u8)data;
430 + return;
431 + }
432 +
397 433 return;
398 434 }
399 435 else
400 436 {
401 - if (sb_regs[offset].flags & REG_CONST)
402 - EMUERROR("Error [Write to read olny register , const]");
437 + if (rflags & REG_CONST)
438 + EMUERROR("Error [Write to read olny register , const]\n");
403 439 else
404 440 {
405 - if (sb_regs[offset].writeFunction)
406 - {
407 - sb_regs[offset].writeFunction(data);
441 + if (reg->writeFunction)
442 + {
443 + reg->writeFunction(data);
408 444 return;
409 445 }
410 446 else
411 447 {
412 - if (!(sb_regs[offset].flags& REG_NOT_IMPL))
448 + if (!(rflags & REG_NOT_IMPL))
413 449 EMUERROR("ERROR [Write to read olny register]");
414 450 }
415 451 }
...
418 454 }
419 455 else
420 456 {
421 - if (!(sb_regs[offset].flags& REG_NOT_IMPL))
457 + if (!(rflags & REG_NOT_IMPL))
422 458 EMUERROR4("ERROR :wrong size write on register ; offset=%x , data=%x,sz=%d",offset,data,sz);
423 459 }
424 460 #endif
425 - if ((sb_regs[offset].flags& REG_NOT_IMPL))
426 - EMUERROR3("Write to System Control Regs , not implemented , addr=%x,data=%x",addr,data);
461 + if ((rflags & REG_NOT_IMPL))
462 + EMUERROR3("Write to System Control Regs , not implemented , addr=%x,data=%x\n",addr,data);
427 463 }
428 464
429 465 u32 SB_FFST_rc;
...
445 481 log("SOFT RESET REQUEST FAILED\n");
446 482 }
447 483 }
484 +
485 + #ifdef SB_MAP_UNKNOWN_REGS
486 + static u32 sb_unk[256] = {0};
487 + static u32 sb_unk_ptr = 0;
488 +
489 + void sb_implement_unk(u32 loc,u32 base,const u32 size = 4)
490 + {
491 + base = (loc - base) >> 2;
492 +
493 + if(base >= 0x540)
494 + {
495 + log("sb_implement_unk : base(%u) out of range\n",base);
496 + return;
497 + }
498 +
499 + switch(size)
500 + {
501 + case 2:
502 + sb_regs[base].flags=REG_16BIT_READWRITE | REG_READ_DATA | REG_WRITE_DATA;
503 + sb_regs[base].data16=(u16*)(sb_unk + (sb_unk_ptr++));
504 + break;
505 +
506 + case 4:
507 + sb_regs[base].flags=REG_32BIT_READWRITE | REG_READ_DATA | REG_WRITE_DATA;
508 + sb_regs[base].data32=(u32*)(sb_unk + (sb_unk_ptr++));
509 + break;
510 +
511 + default:
512 + sb_regs[base].flags=REG_8BIT_READWRITE | REG_READ_DATA | REG_WRITE_DATA;
513 + sb_regs[base].data8=(u8*)(sb_unk + (sb_unk_ptr++));
514 + break;
515 + }
516 +
517 + sb_regs[base].readFunction=0;
518 + sb_regs[base].writeFunction=0;
519 + sb_regs[base].unk = 1;
520 + }
521 + #endif
522 +
448 523 void sb_Init()
449 524 {
450 525 sb_regs.Zero();
451 526
452 527 for (u32 i=0;i<sb_regs.Size;i++)
453 528 {
454 529 sb_regs.flags=REG_NOT_IMPL;
455 - }
530 +
531 + #ifdef SB_MAP_UNKNOWN_REGS
532 + sb_regs.unk = 0;
533 + #endif
534 + }
535 +
536 + #ifdef SB_MAP_UNKNOWN_REGS
537 + {
538 + //Unknown regs
539 + sb_unk_ptr = 0;
540 +
541 + sb_implement_unk(0x005f68a4,SB_BASE);
542 + sb_implement_unk(0x005f68ac,SB_BASE);
543 + sb_implement_unk(0x005f68a0,SB_BASE);
544 + sb_implement_unk(0x005f74a0,SB_BASE);
545 + sb_implement_unk(0x005f74a4,SB_BASE);
546 + sb_implement_unk(0x005f74a8,SB_BASE);
547 + sb_implement_unk(0x005f74ac,SB_BASE);
548 + sb_implement_unk(0x005f74b0,SB_BASE);
549 + sb_implement_unk(0x005f74b4,SB_BASE);
550 + sb_implement_unk(0x005f74e4,SB_BASE);
551 + sb_implement_unk(0x005f78a0,SB_BASE);
552 + sb_implement_unk(0x005f78a4,SB_BASE);
553 + sb_implement_unk(0x005f78a8,SB_BASE);
554 + sb_implement_unk(0x005f78ac,SB_BASE);
555 + sb_implement_unk(0x005f78b0,SB_BASE);
556 + sb_implement_unk(0x005f78b4,SB_BASE);
557 + sb_implement_unk(0x005f78b8,SB_BASE);
558 +
559 + sb_implement_unk(0x005f6b80,SB_BASE);
560 + sb_implement_unk(0x005f6b8c,SB_BASE);
561 + }
562 + #endif
456 563
457 564 sb_regs[((SB_C2DSTAT_addr-SB_BASE))>>2].flags=REG_32BIT_READWRITE | REG_READ_DATA | REG_WRITE_DATA;
458 565 sb_regs[((SB_C2DSTAT_addr-SB_BASE))>>2].readFunction=0;
...
CaH4e3:
но ты не умеешь их читать и вообще не понимаешь для чего эти изменения и что они на самом деле "исправляют"
wolfer:
--- Цитата: CaH4e3 от 14 Декабря 2010, 18:59:09 ---но почему-то все эксперты лол
--- Конец цитаты ---
Ну чтоб стать экспертом в том, что поправили в новых ревизиях эмулятора, нужно смотреть изменения в сорцах нула и быть в теме, имхо. А Вы эксперт, кто ж спорит;)
MetalliC, после такого и я понял, что кто-то не прав:)
CaH4e3:
Ну так сначала надо смотреть и быть в теме, а потом говорить... а пока лучше жевать лол хотя ради смеху то конечно можно, все будет веселей поржать
Silver 746:
Хе, Sonic Adventure 2 все равно добавляет музыку в список через зад. :lol:
wolfer:
--- Цитата: CaH4e3 от 14 Декабря 2010, 19:17:21 ---Ну так сначала надо смотреть и быть в теме, а потом говорить...
--- Конец цитаты ---
Я полностью согласен, хотя это рядовому эмуляторщику и не нужно, имхо.
--- Цитата: CaH4e3 от 14 Декабря 2010, 19:17:21 ---а пока лучше жевать лол
--- Конец цитаты ---
Сильно сказано :)
CaH4e3:
блин, ты следишь за моей мыслью то? никого не волнует кому что надо. каждый решает сам что ему и сколько надо. эмуляторщик он или не эмуляторщик. это вообще вопрос спорный, "что нужно эмуляторщику, чтобы быть эмуляторщиком". мы говорим о том, что надо говорить о том, о чем ты уже понимаешь, о том, что у тебя уже есть...
Silver 746:
Весело, что еще могу сказать.
Эту незначительную ошибку возможно пофиксят лет через 20, проблема не мешает завершить игру на 100%, как только проблему устранят, я потеряю интерес к игре. :)
MetalliC:
Silver 746,
[21:15] <@drk> but keep in mind that stuff thats not according to spec will get removed in the long run ;)
[21:15] <@drk> (the dc spec)
[21:15] <@drk> even if they end up braking games
[21:17] <@drk> documented code comes much much before game compat
[21:17] <@drk> (docuemtned as: folowing the documentation)
Silver 746:
--- Цитата: MetalliC от 14 Декабря 2010, 19:53:38 ---Silver 746,
[21:15] <@drk> but keep in mind that stuff thats not according to spec will get removed in the long run ;)
[21:15] <@drk> (the dc spec)
[21:15] <@drk> even if they end up braking games
[21:17] <@drk> documented code comes much much before game compat
[21:17] <@drk> (docuemtned as: folowing the documentation)
--- Конец цитаты ---
У деда мороза грамматика хромает, неудивительно что Nulldc считает 1, 3, 5, 7 вместо 1, 2, 3, 4, 5, 6, 7, примерно так и плей лист музыки заполняется в игре. :lol:
wolfer:
--- Цитата: CaH4e3 от 14 Декабря 2010, 19:28:06 ---блин, ты следишь за моей мыслью то? ... мы говорим о том, что надо говорить о том, о чем ты уже понимаешь, о том, что у тебя уже есть...
--- Конец цитаты ---
Именно с этим и согласился
--- Цитата: CaH4e3 от 14 Декабря 2010, 19:28:06 ---никого не волнует кому что надо. каждый решает сам что ему и сколько надо. эмуляторщик он или не эмуляторщик. это вообще вопрос спорный, "что нужно эмуляторщику, чтобы быть эмуляторщиком".
--- Конец цитаты ---
Что касается "никого не волнует...", то это палка о 2-х концах, т.к. простые пользователи ПО исходя из данного принципа могут "тупо" чего-то требовать, просить устранить незначительные или вообще отсутствующие недостатки, повторяться не по одному разу и т.п., они ведь Вам ничего не должны :) Это лирика, тут я полностью на стороне разработчиков...
Навигация
Перейти к полной версии