ممر الهندسة العكسية: سجل مايكل جوردان في الدوري الاميركي للمحترفين


في الصيف الماضي ، دعيت لحضور حفلة في سانيفيل. اتضح أن مالكي المرآب يمتلكون آلة لعبة NBA JAM Tournament Edition لأربعة لاعبين. على الرغم من أن اللعبة تجاوز عمرها 25 عامًا (تم إصدارها في عام 1993) ، إلا أنها مازالت مثيرة للاهتمام للغاية ، خاصة بالنسبة للجماهير المتحمسة.

لقد فوجئت بلائحة شيكاغو بولز للاعبين التي لم تشمل مايكل جوردان. وفقًا للمصادر [1] ، حصلت MJ على ترخيصها الخاص ولم تكن جزءًا من الصفقة التي تمت في منتصف الطريق مع NBA.

بعد أن سألت صاحب الجهاز ، علمت أن المتسللين أصدروا وزارة الدفاع لـ SNES "NBA Jam 2K17" ، والتي تسمح للاعبين الجدد و MJ باللعب ، لكن لا أحد كان يحلل كيفية عمل إصدار الأركيد. لذلك ، كان علي بالتأكيد أن أنظر إلى الداخل.

قبل التاريخ


لا تبدأ قصة مربى الدوري الاميركي للمحترفين بلعبة كرة السلة ، ولكن مع جان كلود فان دام. في نفس الوقت الذي تم فيه إطلاق Universal Soldier ، طورت Midway Games تقنية لمعالجة العفاريت الكبيرة والرقمية والواقعية التي تشبه الممثلين الحقيقيين. لقد كان إنجازًا تكنولوجيًا هائلاً: الرسوم المتحركة التي تحتوي على 60 إطارًا في الثانية ، والتي كانت غير مرئية مسبقًا بحجم 100 × 100 بكسل ، وكان لكل منها لوحه 256 لونًا.

استخدمت الشركة هذه التكنولوجيا بنجاح كبير في إطلاق النار الشهير "المنهي 2: يوم القيامة" [2] ، لكنها لم تتمكن من الحصول على ترخيص لـ "Universal Soldier" (كانت الظروف المالية لـ JCVD ​​غير مقبولة بالنسبة إلى Midway [3] ). عندما انتهت المفاوضات بالفشل ، غيرت Midway مسارها وبدأت في تطوير لعبة قتال عملاقة من كابكوم في عام 1991 تسمى Street Fighter II: The World Warrior.

تم تجميع فريق مكون من أربعة أشخاص (كتب Ed Boone الكود ، وجون توبياس قام بالفن والكتابة ، وجون فوغل رسم رسومات ، وكان دان فوردن مهندس صوت). بعد عام من العمل الشاق [4] أطلقت Midway مورتال كومبات في عام 1992.

كان الأسلوب البصري مختلفًا تمامًا عن فن البكسل المعتاد ، وكان تصميم اللعبة "أقل إثارة للجدل". أصبحت اللعبة التي تحتوي على لتر من الدم على الشاشة و "الوفاة" بجنون على الفور ناجحة عالميا وحققت ما يقرب من مليار دولار في السنة [5] .


SF2: 384 × 224 بألوان 4،096.


عضو الكنيست: 400 × 254 بألوان 32768.

حقيقة مثيرة للاهتمام: كما هو الحال في وضع VGA 0x13 على جهاز الكمبيوتر ، في هذه الألعاب لم تكن البيكسل مربعة. على الرغم من أن حجم إطار Mortal Kombat المؤقت يبلغ 400 × 254 ، إلا أنه يمتد إلى نسبة 4: 3 من شاشة CRT ، مما يوفر دقة 400 × 300 [6]

منتصف الطريق تي وحدة المعدات


تبين أن الأجهزة التي طورتها Midway for Mortal Kombat جيدة جدًا. جيد جدًا لدرجة أنه حصل على اسمه T-Unit وأعيد استخدامه في الألعاب الأخرى.

  • مورتال كومبات.
  • مورتال كومبات الثاني.
  • جام الدوري الاميركي للمحترفين.
  • الدوري الاميركي للمحترفين جام بطولة الطبعة.
  • القاضي دريد (لم يفرج عنه).

يتكون T- وحدة من اثنين من لوحات. معظمهم يتعاملون مع منطق اللعبة والرسومات.


لوحة معالج NBA JAM TE Edition (حوالي 40 × 40 سم ، أو 15 بوصة).


اللوحة الأخرى أقل تعقيدًا ، ولكنها أيضًا قادرة على ذلك كثيرًا. إنه مصمم للصوت ، لكنه لا يمكنه تشغيل الموسيقى فقط باستخدام توليف FM ، ولكن أيضًا الصوت الرقمي.

بطاقة الصوت متصلة بمصدر طاقة وبطاقة رسومات مثبتة في الخلف. انتبه إلى المبرد الضخم الموجود في الركن الأيسر العلوي.

تحتوي هاتان اللوحتان معًا على أكثر من مائتي شرائح ومقاومات و EPROM. لفهم كل هذا فقط على أساس الأرقام التسلسلية سيستغرق وقتا طويلا جدا. ولكن من المثير للدهشة أنه في بعض الأحيان في الأجهزة من وثائق التسعينيات يتم اكتشافها بطريق الخطأ. وفي حالة NBA Jam ، كانت رائعة.

منتصف الطريق تي وحدة الهندسة المعمارية


أبحث عن البيانات ، صادفت مجموعة المربى NBA. مستوى تفاصيل هذا المستند مذهل [7] . من بين أشياء أخرى ، تمكنت من العثور على وصف مفصل للاتصالات الأسلاك ، بما في ذلك EPROMs ورقائق البطاطس.


سمحت لنا المعلومات الواردة في المستند برسم رسم تخطيطي للوحات وتحديد وظيفة كل جزء. لمساعدتك في العثور على المكونات ، يكون للوحة الإحداثيات مع البدء في الزاوية اليمنى السفلى (UA0) ، مع زيادة إلى الزاوية اليسرى العليا (UJ26).


قلب اللوحة الرئيسية هو Texas Instrument TMS34010 (UB21) بتردد 50 MHz ورمز 1 ميغا بايت في EPROMs و 512 kibibytes DRAM [8] . 34010 عبارة عن شريحة 32 بت مع ناقل 16 بت ، والذي يحتوي على تعليمات بيانية رائعة مثل PIXT و PIXBLT [9] . في أوائل التسعينيات ، تم استخدام هذه الشريحة في العديد من بطاقات تسريع الأجهزة [10] ، واعتقدت أنها تتعامل مع قدر كبير من التأثيرات الرسومية. والمثير للدهشة أنه يتعامل فقط مع منطق اللعبة ولا يرسم شيئًا.

في الواقع ، تحولت رقاقة UE13 المسماة "DMA2" إلى وحش جرافيك. وفقًا للرسومات التوضيحية من الوثائق ، يوجد بها ناقل بيانات مثير للإعجاب (في ذلك الوقت) 32 بت وحافلة عناوين 32 بت ، وهذا هو السبب في أنه أصبح أكبر شريحة على السبورة. هذه الدائرة المتكاملة المتخصصة (ASIC) قادرة على العديد من العمليات الرسومية ، والتي سأناقشها أدناه.

يتم تعيين جميع الرقائق (ذاكرة الوصول العشوائي للنظام ، GFX EPROM ، Palette SDRAM ، Code ، Video Banks) إلى مساحة عنوان 32 بت واحدة ومتصلة بنفس الناقل. لم أتمكن من العثور على أي معلومات حول بروتوكول الناقل ، لذلك إذا كنت تعرف أي شيء عن ذلك ، فاكتب إلى البريد الإلكتروني.

انتبه إلى خدعة: يتم استخدام أحد مكونات EPROM (باللون الأزرق) لإنشاء نظام تخزين آخر (وتوفير المال). تحتوي هذه الأجهزة EPROM ذات 512 كيلوبايت على دبابيس عناوين 32 بت ودبابيس بيانات 8 بت. بالنسبة إلى 34010 ، وهو ما يتطلب ناقل بيانات 16 بت ، يتم توصيل جهازي EPROMs (J12 و G12) بمضاعفة العناوين ، مما يخلق ذاكرة 1 mebibyte. وبالمثل ، يتم ربط الموارد الرسومية بتبادل أربعة أضعاف من العناوين لتشكيل عنوان 32 بت مع نظام تخزين 32 بت يحتوي على 8 mebibytes.

على الرغم من أنني سأعتبر في هذه المقالة بشكل أساسي خط أنابيب الرسومات ، لا أستطيع مقاومة الإغراء ، وبالتالي سأتحدث باختصار عن نظام الصوت.


يعرض الرسم التخطيطي لبطاقة الصوت موتورولا 6809 (U4 بتردد 2 ميجاهرتز) ، والذي يتلقى تعليمات من EPROM (U3) للتحكم في الموسيقى والمؤثرات الصوتية.

تقوم شريحة توليف FM من Yamaha's 2151 (3.5 MHz) بإنشاء موسيقى مباشرة من الإرشادات الواردة من 6809 (تستخدم الموسيقى نطاق ترددي صغير إلى حد ما).

OKI6295 (1 ميجا هرتز) مسؤول عن تشغيل الصوت الرقمي بتنسيق ADPCM (على سبيل المثال ، "Boomshakalaka الأسطوري" [11] تيم كيتسو).

لاحظ أنه على اللوحة الرئيسية ، يتم استخدام نفس EPROM 32a / 8d الأزرق بسرعة 512 كيلوبايت في نظام 16 بت مع تشذير مزدوج لعناوين لتخزين الأصوات الرقمية ، ولكن للحصول على بيانات / عناوين تعليمات 8 بت من Motorola 6809 لا يتم تشذيرها.

الإطار الحياة


تتم فهرسة شاشة NBA Jam بأكملها في لوحة 16 بت. يتم تخزين الألوان بتنسيق xRGB 1555 في لوحة 64 كيلو بايت. لوحة مقسمة إلى 128 كتل (256 * 16 بت) من 512 بايت. يتم تمييز العفاريت المخزنة في EPROM على أنها "GFX". يحتوي كل شبح على لوح ألوان خاص به يصل إلى 256 × 16 بت. غالبًا ما يستخدم العفريت كتلة لوحة كاملة ، لكن لا تستخدم أكثر من كتلة. يتم إرسال إشارة CRT إلى الشاشة باستخدام RAMDAC ، الذي يقرأ الفهرس من مصارف Video DRAM لكل وحدة بكسل ويقوم بإجراء بحث ملون في اللوحة.

تستمر حياة كل رتل من فيديو NBA Jam على النحو التالي:

  1. يتكون منطق اللعبة من دفق من الإرشادات 16 بت التي يتم إرسالها من J12 / G12 إلى 34010.
  2. 34010 يقرأ إدخال اللاعب ، ويحسب حالة اللعبة ، ثم يرسم الشاشة.
  3. للرسم على الشاشة ، يجد 34010 أولاً كتلة غير مستخدمة في اللوحة ويكتب لوحة العفريت هناك (يتم تخزين لوحات العفريت جنبًا إلى جنب مع التعليمات 34010 في J12 / G12).
  4. 34010 تقدم طلبًا إلى DMA2 ، والذي يتضمن عنوان وحجم العفريت ، وكتلة لوح الألوان 8 بت المستخدمة ، والتقطيع ، والقياس ، وطريقة معالجة البكسلات الشفافة ، وما إلى ذلك.
  5. يقرأ DMA2 مؤشرات العفريت 8 بت من رقاقة J14-G23 GFX ROM ، ويجمع هذه القيمة مع فهرس كتلة لوحة 8 بت ويكتب فهرس 16 بت إلى بنوك الفيديو. يمكن اعتبار DRAM2 blitter التي تقرأ قيم 8 بت من GFX EPROM وتكتب قيم 16 بت إلى بنوك الفيديو
  6. يتم تكرار الخطوات 3-5 حتى يتم الانتهاء من جميع الطلبات لرسم العفاريت.
  7. عندما يتعلق الأمر بتحديث الشاشة ، تقوم RAMDAC بتحويل البيانات الموجودة في بنوك الفيديو إلى إشارة يمكن أن يفهمها جهاز CRT. بحيث يكون النطاق الترددي كافياً لتحويل فهرس 16 بت إلى RGB 16 بت ، يتم تخزين اللوحة في SRAM باهظة الثمن وسريعة للغاية.


حقيقة مثيرة للاهتمام: البرامج الثابتة فلاش EPROM ليست هذه عملية بسيطة. قبل الكتابة إلى الشريحة ، يجب عليك مسح جميع محتوياته تمامًا.

للقيام بذلك ، يجب تشعيع رقاقة مع ضوء الأشعة فوق البنفسجية. تحتاج أولاً إلى إزالة الملصق من أعلى EPROM لفتح الرسم التخطيطي الخاص به. ثم يتم وضع EPROM في جهاز ممحاة خاص به مصباح UV.

بعد 20 دقيقة ، سيتم تعبئة EPROM بالأصفار وجاهز للتسجيل.

وثائق مامي


بعد معرفة المعدات ، أدركت مجموعة EPROM التي يمكنك كتابتها إلى Michael Jordan (يتم تخزين اللوحة في Code EPROMs ، والمؤشرات في GFX EPROMs). ومع ذلك ، ما زلت لا أعرف الموقع الدقيق أو التنسيق المستخدم.

الوثائق المفقودة الموجودة في MAME.

إذا كنت لا تعرف كيف يعمل هذا المحاكي المذهل ، فسأشرح ذلك بإيجاز. يعتمد MAME على مفهوم "برامج التشغيل" ، والتي هي تقليد للوحة. يتكون كل سائق من مكونات تحاكي (عادة) كل شريحة. في حالة Midway T-Unit ، نحن مهتمون بالملفات التالية:

  مامي / يشمل / midtunit.h
 mame / src / mame / video / midtunit.cpp
 مامي / src / مامي / السائقين / midtunit.cpp
 مامي / src / مامي / آلة / midtunit.cpp
 وحدة المعالجة المركزية / tms34010 / tms34010.h 

إذا نظرت إلى برامج التشغيل / midtunit.cpp ، سنرى أن كل شريحة ذاكرة هي جزء من مساحة عنوان واحدة 32 بت. يمكن أن نرى من الكود المصدري لبرنامج التشغيل أن اللوحة تبدأ عند 0x01800000 ، وتبدأ gfxrom في 0x02000000 ، وتبدأ رقاقة DMA2 في 0x01a80000. لمتابعة مسار البيانات ، نحتاج إلى اتباع وظائف C ++ المنفذة عندما يكون كائن عملية القراءة أو الكتابة هو عنوان الذاكرة.

void midtunit_state::main_map(address_map &map) { map.unmap_value_high(); map(0x00000000, 0x003fffff).rw(m_video, FUNC(midtunit_vram_r), FUNC(midtunit_vram_w)); map(0x01000000, 0x013fffff).ram(); map(0x01400000, 0x0141ffff).rw(FUNC(midtunit_cmos_r), FUNC(midtunit_cmos_w)).share("nvram"); map(0x01480000, 0x014fffff).w(FUNC(midtunit_cmos_enable_w)); map(0x01600000, 0x0160000f).portr("IN0"); map(0x01600010, 0x0160001f).portr("IN1"); map(0x01600020, 0x0160002f).portr("IN2"); map(0x01600030, 0x0160003f).portr("DSW"); map(0x01800000, 0x0187ffff).ram().w(m_palette, FUNC(write16)).share("palette"); map(0x01a80000, 0x01a800ff).rw(m_video, FUNC(midtunit_dma_r), FUNC(midtunit_dma_w)); map(0x01b00000, 0x01b0001f).w(m_video, FUNC(midtunit_control_w)); map(0x01d00000, 0x01d0001f).r(FUNC(midtunit_sound_state_r)); map(0x01d01020, 0x01d0103f).rw(FUNC(midtunit_sound_r), FUNC(midtunit_sound_w)); map(0x01d81060, 0x01d8107f).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); map(0x01f00000, 0x01f0001f).w(m_video, FUNC(midtunit_control_w)); map(0x02000000, 0x07ffffff).r(m_video, FUNC(midtunit_gfxrom_r)).share("gfxrom"); map(0x1f800000, 0x1fffffff).rom().region("maincpu", 0); /* mirror used by MK*/ map(0xff800000, 0xffffffff).rom().region("maincpu", 0); } 

في نهاية نفس الملف "drivers / midtunit.cpp" ، نرى كيف يتم تحميل محتويات EPROMs في ذاكرة الوصول العشوائي. في حالة الموارد الرسومية "gfxrom" (المرتبطة بالعنوان 0x02000000) ، يمكننا أن نرى أنها امتدت 8 ميغا بايت من مساحة العنوان في كتل من الرقائق مع تناوب أربعة أضعاف من العناوين. لاحظ أن أسماء الملفات تتوافق مع موقع الرقائق (على سبيل المثال ، UJ12 / UG12). تعرف مجموعة ملفات EPROM هذه في عالم المحاكيات باسم "ROM".

 ROM_START( nbajamte ) ROM_REGION( 0x50000, "adpcm:cpu", 0 ) /* sound CPU*/ ROM_LOAD( "l1_nba_jam_tournament_u3_sound_rom.u3", 0x010000, 0x20000, NO_DUMP) ROM_RELOAD( 0x030000, 0x20000 ) ROM_REGION( 0x100000, "adpcm:oki", 0 ) /* ADPCM*/ ROM_LOAD( "l1_nba_jam_tournament_u12_sound_rom.u12", 0x000000, 0x80000, NO_DUMP) ROM_LOAD( "l1_nba_jam_tournament_u13_sound_rom.u13", 0x080000, 0x80000, NO_DUMP) ROM_REGION16_LE( 0x100000, "maincpu", 0 ) /* 34010 code*/ ROM_LOAD16_BYTE( "l4_nba_jam_tournament_game_rom_uj12.uj12", 0x00000, 0x80000, NO_DUMP) ROM_LOAD16_BYTE( "l4_nba_jam_tournament_game_rom_ug12.ug12", 0x00001, 0x80000, NO_DUMP) ROM_REGION( 0xc00000, "gfxrom", 0 ) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_ug14.ug14", 0x000000, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_uj14.uj14", 0x000001, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_ug19.ug19", 0x000002, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_uj19.uj19", 0x000003, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_ug16.ug16", 0x200000, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_uj16.uj16", 0x200001, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_ug20.ug20", 0x200002, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_uj20.uj20", 0x200003, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_ug17.ug17", 0x400000, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_uj17.uj17", 0x400001, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_ug22.ug22", 0x400002, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_uj22.uj22", 0x400003, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_ug18.ug18", 0x600000, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_uj18.uj18", 0x600001, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_ug23.ug23", 0x600002, 0x80000, NO_DUMP) ROM_LOAD32_BYTE( "l1_nba_jam_tournament_game_rom_uj23.uj23", 0x600003, 0x80000, NO_DUMP) ROM_END 

حقيقة مثيرة للاهتمام: في مثال التعليمة البرمجية أعلاه ، تم استبدال المعلمة الأخيرة من الدالة بـ "NO_DUMP" بحيث يمكن تحميل EPROMs المعدلة. عادة ما تكون هذه الحقول [12] تجزئة CRC / SHA1 لمحتويات EPROM. هذه هي الطريقة التي تحدد بها MAME اللعبة التي تنتمي إلى ROM وتتيح لك معرفة أن أحد الأقراص المدمجة في المجموعة مفقود أو تالف.

محرك فيديو القلب: DMA2


المفتاح لفهم تنسيق الرسومات هو الوظيفة التي تعالج كتابة / قراءة DMA في سجلات DMA2 256 الموجودة في العناوين من 0x01a80000 إلى 0x01a800ff. تم بالفعل تنفيذ كل العمل الجاد للهندسة العكسية من قبل مطوري MAME. حتى أنهم استغرقوا الوقت لتوثيق شكل القيادة بشكل ممتاز.

  سجلات DMA
  ------------------

   تسجيل |  بت |  تطبيق
  ---------- + - FEDCBA9876543210 - + ------------
      0 |  xxxxxxxx -------- |  تجاهل بكسل في بداية كل صف
            |  -------- xxxxxxxx |  تجاهل بكسل في نهاية كل صف
      1 |  x --------------- |  تمكين التسجيل (أو مسح إذا كان الصفر)
            |  -421 ------------ |  صور bpp (0 = 8)
            |  ---- 84 ---------- |  حجم النجاح بعد = (1 << س)
            |  ------ 21 -------- |  تمرير حجم يصل إلى = (1 << س)
            |  -------- 8 ------- |  تمكين تخطي قبل / بعد
            |  --------- 4 ------ |  تمكين اقتطاع
            |  ---------- 2 ----- |  y النسخ المتطابق
            |  ----------- 1 ---- |  النسخ المتطابق
            |  ------------ 8 --- |  نقل بكسل غير الصفر كألوان
            |  ------------- 4-- |  يحيل صفر بكسل كألوان
            |  -------------- 2- |  انتقال غير الصفر بكسل
            |  --------------- 1 |  انتقال صفر بكسل
      2 |  xxxxxxxxxxxxxxxx |  عنوان المصدر كلمة منخفضة
      3 |  xxxxxxxxxxxxxxxx |  عنوان مصدر كلمة عالية
      4 |  ------- xxxxxxxxx |  س المتلقي
      5 |  ------- xxxxxxxxx |  ذ المستلم
      6 |  ------ xxxxxxxxxx |  أعمدة الصور
      7 |  ------ xxxxxxxxxx |  خطوط الصورة
      8 |  xxxxxxxxxxxxxxxx |  لوحة
      9 |  xxxxxxxxxxxxxxxx |  اللون
     10 |  --- xxxxxxxxxxxxx |  س مقياس
     11 |  --- xxxxxxxxxxxxx |  مقياس ذ
     12 |  ------- xxxxxxxxx |  تقليم أعلى / اليسار
     13 |  ------- xxxxxxxxx |  تقليم أسفل / اليمين
     14 |  ---------------- |  الاختبار
     15 |  xxxxxxxx -------- |  بايت صفر الكشف
            |  -------- 8 ------- |  صفحة إضافية
            |  --------- 4 ------ |  حجم المستلم
            |  ---------- 2 ----- |  اختيار الحافة العلوية / السفلية أو اليسرى / اليمنى للتسجيل 12/13 

حتى أن هناك وظيفة تصحيح الأخطاء التي تسمح لك بحفظ العفاريت الأصلية في عملية نقلها إلى DMA2 (تمت كتابة الوظيفة بواسطة مشارك قديم في مشروع MAME ، Ryan Holtz [13] ). كان كافياً بالنسبة لي أن ألعب اللعبة ببساطة بحيث يتم حفظ جميع الملفات ذات البيانات التعريفية على القرص.

اتضح أن العفاريت تتكون من عناصر بسيطة من لوحة 16 بت دون ضغط. ومع ذلك ، ليس كل العفاريت لديها نفس عدد الألوان. تستخدم بعض العفاريت 16 لونًا فقط مع مؤشرات ألوان 4 بت ، بينما تستخدم بعضها الآخر 256 لونًا وتتطلب مؤشرات ألوان 8 بت.

الترقيع


الآن أعرف موقع وشكل العفاريت ، لذلك يبقى أداء الحد الأدنى من الهندسة العكسية. كتبت برنامجًا صغيرًا عن Golang للقضاء على تناوب "كود" EPROMs و "gfx". من خلال التخلص من الشريط ، من السهل البحث عن ASCII أو القيم المعروفة ، لأنني عملت تمامًا بما يبدو عليه RAM أثناء تنفيذ البرنامج.

بعد ذلك ، يمكنك بسهولة العثور على خصائص اللاعب. اتضح أنه تم تخزينهم جميعًا واحدًا تلو الآخر بتنسيق endian الكبير غير الموقّع 16 بت (وهو منطقي جدًا ، لأن 34010 يعمل مع endian كبير). أضفت بتشر لتعديل سمات اللاعب. لم أكن حريصًا حقًا على كرة السلة ، فقد دخلت SPEED = 9 و 3 PTS = 9 و DUNKS = 9 و PASS = 9 و POWER = 9 و STEAL = 9 و BLOCK = 9 و CLTCH = 9.

كتبت أيضًا رمز ترقيع اللعبة باستخدام نقوش جديدة مع التقييد الوحيد - يجب أن يكون العفاريت الجديدة بنفس أحجام الأحجام القابلة للاستبدال. بالنسبة لصورة MJ ، قمت بإنشاء PNG مفهرسة 256 لونًا (يمكنك رؤيته هنا ).

أخيرًا ، أضفت رمزًا لتحويل التنسيق الوسيط إلى التنسيق المتشابك للكتابة إلى ملفات EPROM الفردية.

ابدأ اللعبة



بعد تصحيح محتويات EPROM ، أظهرت أداة التشخيص NBAJam أن محتويات بعض الرقائق محددة بأنها "BAD". كنت أتوقع هذا لأنني قمت فقط بتصحيح محتويات EPROMs ، لكن لم أكن عناء البحث عن تنسيق CRC وحتى موقع التخزين الخاص بها.

علامات GFX EPROM باللون الأحمر (UG16 / UJ16 ، UG17 / UJ17 ، UG18 / UJ18 ، UG20 / UJ20 ، UG22 / UJ22 و UG23 / UJ23) ، لأنها تحتوي على صور قمت بتغييرها. اللونان EPROMs اللذان يتم فيهما تخزين الإرشادات (UG12 و UJ12) باللون الأحمر أيضًا لأن هناك لوحات.

لحسن الحظ ، لا يتم استخدام CRCs هنا للحماية من المحتوى المعدل ، وهناك حاجة فقط للتحقق من سلامة الرقائق. لقد بدأت اللعبة. وحصل!


هاستا لا فيستا ، بيبي!



بعد الانتهاء من الصعوبات التقنية ، فقدت الاهتمام بالأداة وتوقفت عن تطويرها. أفكار لأولئك الذين يرغبون في اللعب مع الكود:

  • أضف إلى المؤتمر الشرقي تورونتو رابتورز.
  • إضافة القدرة على تغيير أسماء اللاعب. لسوء الحظ ، فهي لا تتكون من ASCII ، ولكنها صور تم إنشاؤها مسبقًا.

كتاب عن الدوري الاميركي للمحترفين جام


إذا كنت من محبي بطولة الدوري الاميركي للمحترفين ، فقد كتبت ريان علي كتابًا كاملاً عنها [14] . يمكنك شرائه هنا .

شفرة المصدر


إذا كنت ترغب في المساهمة أو مجرد رؤية كيفية عمل كل شيء ، فسيتم تحميل المصدر الكامل إلى github هنا .

مراجع


[1] المصدر: "NJA Jam" بقلم ريان علي

[2] المصدر: "NJA Jam" بقلم ريان علي

[3] المصدر: "NJA Jam" بقلم ريان علي

[4] المصدر: مورتال كومبات 1 وراء الكواليس

[5] المصدر: "NJA Jam" بقلم ريان علي

[6] المصدر: 4: 3 مقابل Square Pixels

[7] التعليق: لسوء الحظ ، فإن عصر هذه الوثائق الممتازة قد مرت فترة طويلة

[8] المصدر: شاشة بدء تشغيل Mame NBA Jam

[9] المصدر: مجموعة التعليمات TMS34010

[10] المصدر: دليل مستخدم T34010

[11] المصدر: NBA Jam - BoomShakaLaka video

[12] المصدر: MAME T-Unit driver.cpp

[13] المصدر: ارتكب "midtunit.cpp: أضيف عارضًا DMA-blitter اختياريًا"

[14] المصدر: "NAM JAM Book" للكاتب ريان علي

Source: https://habr.com/ru/post/ar473660/


All Articles