Advertisement
xiahanlu

gbz80dis.c

Oct 9th, 2018
1,167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 61.55 KB | None | 0 0
  1. #include "conf.h"
  2. #include "gameboy.h"
  3. #include "list.h"
  4.  
  5. #ifdef _WIN32
  6. # include <Windows.h>
  7. #endif
  8.  
  9. static char *g_lutctype[256];
  10. static char *g_lutanclic[256];
  11. static char *g_lutcurlic[256];
  12.  
  13. struct romheader {
  14.   char title[16];
  15.   short curlic;
  16.   char sgb;
  17.   unsigned char ctype;
  18.   unsigned char promsize;
  19.   unsigned char ramsize;
  20.   unsigned char targetcode;
  21.   unsigned char anclic;
  22.   unsigned char maskver;
  23.   unsigned char hdcrc;
  24.   unsigned short gcrc;
  25. };
  26.  
  27. static
  28. void kinit (void) {
  29.  
  30.   static int _init = 0;
  31.  
  32.   if (_init != 0)
  33.     return ;
  34.   else
  35.     _init = 1;
  36.  
  37.   memset (g_lutctype, 0, sizeof (g_lutctype));
  38.   memset (g_lutanclic, 0, sizeof (g_lutanclic));
  39.   memset (g_lutcurlic, 0, sizeof (g_lutcurlic));
  40.  
  41.   g_lutctype[0x00] = "ROM ONLY";
  42.   g_lutctype[0x01] = "ROM+MBC1";
  43.   g_lutctype[0x02] = "ROM+MBC1+RAM";
  44.   g_lutctype[0x03] = "ROM+MBC1+RAM+Battery";
  45.   g_lutctype[0x05] = "ROM+MBC2";
  46.   g_lutctype[0x06] = "ROM+MBC2+Battery";
  47.   g_lutctype[0x08] = "ROM+RAM";
  48.   g_lutctype[0x09] = "ROM+RAM+Battery";
  49.   g_lutctype[0x0B] = "ROM+MMM01";
  50.   g_lutctype[0x0C] = "ROM+MMM01+RAM";
  51.   g_lutctype[0x0D] = "ROM+MMM01+RAM+Battery";
  52.   g_lutctype[0x0F] = "ROM+MBC3+Battery+Timer";
  53.   g_lutctype[0x10] = "ROM+MBC3+RAM+Battery+Timer";
  54.   g_lutctype[0x11] = "ROM+MBC3";
  55.   g_lutctype[0x12] = "ROM+MBC3+RAM";
  56.   g_lutctype[0x13] = "ROM+MBC3+RAM+Battery";
  57.   g_lutctype[0x15] = "ROM+MBC4";
  58.   g_lutctype[0x16] = "ROM+MBC4+RAM";
  59.   g_lutctype[0x17] = "ROM+MBC4+RAM+Battery";
  60.   g_lutctype[0x19] = "ROM+MBC5";
  61.   g_lutctype[0x1A] = "ROM+MBC5+RAM";
  62.   g_lutctype[0x1B] = "ROM+MBC5+RAM+Battery";
  63.   g_lutctype[0x1C] = "ROM+MBC5+Rumble";
  64.   g_lutctype[0x1D] = "ROM+MBC5+RAM+Rumble";
  65.   g_lutctype[0x1E] = "ROM+MBC5+RAM+Battery+Rumble";
  66.   g_lutctype[0x22] = "ROM+MBC5+Tilt";
  67.   g_lutctype[0xFC] = "Nintendo Pocket Camera";
  68.   g_lutctype[0xFD] = "Bandai TAMA5";
  69.   g_lutctype[0xFE] = "Hudson HuC-3";
  70.   g_lutctype[0xFF] = "Hudson HuC-1";
  71.  
  72.   /* Settings old licensee desc init --*/
  73.   g_lutanclic[0x00] = "None";
  74.   g_lutanclic[0x01] = "Nintendo"; /* homepage:https://www.nintendo.com */
  75.   g_lutanclic[0x08] = "Capcom"; /* homepage:http://www.capcom.com*/
  76.   g_lutanclic[0x09] = "Hot B Games"; /* wiki:https://en.wikipedia.org/wiki/Category:Hot_B_games */
  77.   g_lutanclic[0x0A] = "Jaleco"; /* wiki:https://en.wikipedia.org/wiki/Jaleco*/
  78.   g_lutanclic[0x0B] = "Coconuts Japan"; /* misc link:https://www.genkivideogames.com/japanese_imported_video_games.asp?pagetoshow=search&keywordtext=Coconuts%20Japan&searchtype=publisher*/
  79.   g_lutanclic[0x0C] = "Elite Systems";/*wiki: https://en.wikipedia.org/wiki/Elite_Systems*/
  80.   g_lutanclic[0x13] = "EA"; /*homepage: https://www.ea.com/zh-cn */
  81.   g_lutanclic[0x18] = "Hudson Soft"; /*homepage: http://www.hudsonsoft.net/what-we-do/ */
  82.   g_lutanclic[0x19] = "ITC Entertainment"; /*wiki: https://en.wikipedia.org/wiki/ITC_Entertainment */
  83.   g_lutanclic[0x1A] = "Yanoman"; /* MobyGames:https://www.mobygames.com/company/yanoman-corporation */
  84.   g_lutanclic[0x1D] = "Nippon Clary"; /* giantbomb:https://www.giantbomb.com/nippon-clary-business/3010-6837/ */
  85.   g_lutanclic[0x1F] = "Virgin"; /* wiki:https://en.wikipedia.org/wiki/Virgin_Interactive */
  86.                                              /* homepage: https://www.virgingames.com/quick-login */
  87.   g_lutanclic[0x24] = "PCM Complete"; /* https://segaretro.org/PCM_Complete | https://www.mobygames.com/company/pcm-complete */
  88.   g_lutanclic[0x25] = "San-X"; /* homepage http://www.san-x.jp*/
  89.   g_lutanclic[0x28] = "Kotobuki Systems";/*wiki: https://en.wikipedia.org/wiki/Kemco*/
  90.   g_lutanclic[0x29] = "SETA"; /*wiki: https://en.wikipedia.org/wiki/SETA_Corporation */
  91.   g_lutanclic[0x30] = "Atari,SA"; /*wiki: https://en.wikipedia.org/wiki/Atari,_SA */
  92.   g_lutanclic[0x31] = "Nintendo"; /* homepage:https://www.nintendo.com */
  93.   g_lutanclic[0x32] = "Bandai"; /*homepage: http://www.bandai.com */
  94.   g_lutanclic[0x33] = "GameBoyColor"; /*new licensee */
  95.   g_lutanclic[0x34] = "Konami"; /*homepage: https://www.konami.com/en/*/
  96.   g_lutanclic[0x35] = "Hector"; /*N/A */
  97.   g_lutanclic[0x38] = "Capcom"; /* homepage:http://www.capcom.com*/
  98.   g_lutanclic[0x39] = "Banpresto"; /* homepage:http://www.banpresto.jp/prize/0008.html*/
  99.   g_lutanclic[0x3C] = "Entertainment i"; /* truncated, see http://gbdev.gg8.se/wiki/articles/Gameboy_ROM_Header_Info#Licensee*/
  100.   g_lutanclic[0x3E] = "Gremlin"; /* wiki: https://en.wikipedia.org/wiki/Gremlin_Interactive */
  101.   g_lutanclic[0x41] = "Ubisoft"; /*homepage: https://www.ubisoft.com/en-US/ */
  102.   g_lutanclic[0x42] = "Atlus"; /*homepage: https://atlus.com*/
  103.   g_lutanclic[0x44] = "Malibu"; /*swiki: https://strategywiki.org/wiki/Category:Malibu*/
  104.   g_lutanclic[0x46] = "Angel"; /*N/A*/
  105.   g_lutanclic[0x47] = "Spectrum HoloByte"; /*wiki: https://en.wikipedia.org/wiki/Spectrum_HoloByte*/
  106.   g_lutanclic[0x49] = "Irem"; /* wiki: https://en.wikipedia.org/wiki/Irem */
  107.   g_lutanclic[0x4A] = "Virgin"; /* wiki:https://en.wikipedia.org/wiki/Virgin_Interactive */
  108.                                              /* homepage: https://www.virgingames.com/quick-login */
  109.   g_lutanclic[0x4D] = "Malibu"; /*swiki: https://strategywiki.org/wiki/Category:Malibu*/
  110.   g_lutanclic[0x4F] = "US.Gold"; /*wiki: https://en.wikipedia.org/wiki/U.S._Gold */
  111.   g_lutanclic[0x50] = "Absolute"; /*homepgae:http://www.absolutegamez.com */
  112.   g_lutanclic[0x51] = "Acclaim"; /*wiki: https://en.wikipedia.org/wiki/Acclaim_Games*/
  113.   g_lutanclic[0x52] = "Activision"; /*homepage: https://www.activision.com*/  
  114.   g_lutanclic[0x53] = "Sammy"; /*wiki: https://en.wikipedia.org/wiki/Sammy_Corporation*/
  115.   g_lutanclic[0x54] = "GameTek"; /*wiki: https://en.wikipedia.org/wiki/GameTek*/
  116.   g_lutanclic[0x55] = "Park Place"; /*maybe???: https://en.wikipedia.org/wiki/List_of_Jurassic_Park_video_games*/
  117.   g_lutanclic[0x56] = "LJN"; /*avgn: http://avgn.wikia.com/wiki/LJN*/  
  118.   g_lutanclic[0x57] = "MATCHBOX"; /*homepage: http://play.matchbox.com/en_US/*/
  119.   g_lutanclic[0x59] = "Milton Bradley"; /*wiki: https://en.wikipedia.org/wiki/Milton_Bradley_Company*/
  120.   g_lutanclic[0x5A] = "Mindscape"; /*wiki: https://en.wikipedia.org/wiki/Mindscape*/
  121.   g_lutanclic[0x5B] = "Romstar"; /*wiki: https://en.wikipedia.org/wiki/Romstar*/  
  122.   g_lutanclic[0x5C] = "Kaga Create"; /*wiki: https://en.wikipedia.org/wiki/Kaga_Create*/
  123.   g_lutanclic[0x5D] = "Tradewest"; /*wiki: https://en.wikipedia.org/wiki/Tradewest*/
  124.   g_lutanclic[0x60] = "Titus"; /*wiki: https://en.wikipedia.org/wiki/Titus_Interactive*/
  125.   g_lutanclic[0x61] = "Virgin"; /* wiki:https://en.wikipedia.org/wiki/Virgin_Interactive */
  126.                                              /* homepage: https://www.virgingames.com/quick-login */
  127.   g_lutanclic[0x67] = "Ocean"; /*wiki: https://en.wikipedia.org/wiki/Ocean_Software*/  
  128.   g_lutanclic[0x69] = "EA"; /*homepage: https://www.ea.com/zh-cn */
  129.   g_lutanclic[0x6E] = "Elite Systems";/*wiki: https://en.wikipedia.org/wiki/Elite_Systems*/
  130.   g_lutanclic[0x6F] = "Electro Brain";/*wiki: https://en.wikipedia.org/wiki/Electro_Brain*/
  131.   g_lutanclic[0x70] = "Atari,SA"; /*wiki: https://en.wikipedia.org/wiki/Atari,_SA */
  132.   g_lutanclic[0x71] = "Interplay"; /*wiki: https://en.wikipedia.org/wiki/Interplay_Entertainment*/
  133.   g_lutanclic[0x72] = "Brøderbund"; /*moby: https://www.mobygames.com/company/brderbund-software-inc*/  
  134.   g_lutanclic[0x73] = "Sculptured"; /*maybe??: http://closinglogogroup.wikia.com/wiki/Sculptured_Software,_Inc.*/
  135.   g_lutanclic[0x75] = "SCi Games"; /*wiki: https://en.wikipedia.org/wiki/SCi_Games*/  
  136.   g_lutanclic[0x78] = "THQ"; /*source is:t*hq wiki: https://en.wikipedia.org/wiki/THQ*/
  137.   g_lutanclic[0x79] = "Accolade"; /*wiki: https://en.wikipedia.org/wiki/Accolade_(game_company)*/
  138.   g_lutanclic[0x7A] = "Triffix"; /*wiki: https://en.wikipedia.org/wiki/Triffix_Entertainment*/
  139.   g_lutanclic[0x7C] = "MicroProse"; /*homepage: http://www.microprose.com*/  
  140.   g_lutanclic[0x7F] = "Kemco";/*wiki: https://en.wikipedia.org/wiki/Kemco*/
  141.   g_lutanclic[0x80] = "Misawa"; /*nseen64: https://www.unseen64.net/tag/misawa-entertainment/*/
  142.   g_lutanclic[0x83] = "LOZC G"; /*wiki: https://en.wikipedia.org/wiki/Category:LOZC_G._Amusements_games*/
  143.   g_lutanclic[0x86] = "Tokuma Shoten"; /*wiki: https://en.wikipedia.org/wiki/Tokuma_Shoten*/  
  144.   g_lutanclic[0x8B] = "Blue Planet"; /*wiki: https://en.wikipedia.org/wiki/Blue_Planet_Software*/
  145.   g_lutanclic[0x8C] = "Tokai Communications"; /*wiki: https://en.wikipedia.org/wiki/Tokai_Communications*/
  146.   g_lutanclic[0x8E] = "APE Games"; /*homepage: http://www.apegames.com*/
  147.   g_lutanclic[0x8F] = "I'Max"; /*No find infos */  
  148.   g_lutanclic[0x91] = "Spike Chunsoft"; /*wiki: https://en.wikipedia.org/wiki/Spike_Chunsoft*/
  149.   g_lutanclic[0x92] = "Video System"; /*No find infos*/  
  150.   g_lutanclic[0x93] = "Tsuburava"; /*No find infos */
  151.   g_lutanclic[0x95] = "Varie"; /*wiki: https://en.wikipedia.org/wiki/Varie*/  
  152.   g_lutanclic[0x96] = "Yonezawa PR21"; /*wiki: https://en.wikipedia.org/wiki/Yonezawa_PR21*/
  153.   g_lutanclic[0x97] = "Kaneko"; /*wiki: https://en.wikipedia.org/wiki/Kaneko*/
  154.   g_lutanclic[0x99] = "Arcade"; /*wiki: https://en.wikipedia.org/wiki/Arcade_game*/
  155.   g_lutanclic[0x9A] = "Nihon Bussan"; /*wiki: https://en.wikipedia.org/wiki/Nihon_Bussan*/  
  156.   g_lutanclic[0x9B] = "Tecmo"; /*wiki: https://en.wikipedia.org/wiki/Tecmo*/
  157.   g_lutanclic[0x9C] = "Disney"; /*wiki: https://en.wikipedia.org/wiki/Walt_Disney_Imagineering*/
  158.   g_lutanclic[0x9D] = "Banpresto"; /* homepage:http://www.banpresto.jp/prize/0008.html*/
  159.   g_lutanclic[0x9F] = "Nova"; /*No find infos*/
  160.   g_lutanclic[0xA1] = "Hori Electric"; /* https://www.giantbomb.com/hori-electric-co-ltd/3010-5917/*/  
  161.   g_lutanclic[0xA2] = "Bandai"; /*homepage: http://www.bandai.com */
  162.   g_lutanclic[0xA4] = "Konami"; /*homepage: https://www.konami.com/en/*/  
  163.   g_lutanclic[0xA6] = "Kawada"; /*No find infos*/
  164.   g_lutanclic[0xA7] = "Takara"; /*wiki: https://en.wikipedia.org/wiki/Takara**/
  165.   g_lutanclic[0xA9] = "Technōs Japan"; /*wiki: https://en.wikipedia.org/wiki/Technōs_Japan*/
  166.   g_lutanclic[0xAA] = "Brøderbund"; /*moby: https://www.mobygames.com/company/brderbund-software-inc*/  
  167.   g_lutanclic[0xAC] = "Toei Animation"; /*homepage: http://toei-animation-usa.com*/  
  168.   g_lutanclic[0xAD] = "Toho"; /*No find infos*/
  169.   g_lutanclic[0xAF] = "Namco"; /*homepage: https://www.bandainamcoent.com*/  
  170.   g_lutanclic[0xB0] = "Acclaim"; /*wiki: https://en.wikipedia.org/wiki/Acclaim_Games*/
  171.   g_lutanclic[0xB1] = "ASCII|Nexoft"; /*moby: http://www.mobygames.com/company/nexoft-corporation*/
  172.   g_lutanclic[0xB2] = "Bandai"; /*homepage: http://www.bandai.com */
  173.   g_lutanclic[0xB4] = "Enix"; /*homepage: https://en.wikipedia.org/wiki/Enix*/  
  174.   g_lutanclic[0xB6] = "HAL"; /*wiki: https://en.wikipedia.org/wiki/HAL_Laboratory*/
  175.   g_lutanclic[0xB7] = "SNK"; /*wiki: https://en.wikipedia.org/wiki/SNK*/
  176.   g_lutanclic[0xB9] = "Pony Canyon"; /*wiki: https://en.wikipedia.org/wiki/Pony_Canyon*/
  177.   g_lutanclic[0xBA] = "Culture Brain"; /*wiki: https://en.wikipedia.org/wiki/Culture_Brain*/  
  178.   g_lutanclic[0xBB] = "Sunsoft"; /*wiki: https://en.wikipedia.org/wiki/Sunsoft*/
  179.   g_lutanclic[0xBD] = "Sony Imagesoft"; /*wiki: https://en.wikipedia.org/wiki/Sony_Imagesoft*/
  180.   g_lutanclic[0xBF] = "Sammy"; /*wiki: https://en.wikipedia.org/wiki/Sammy_Corporation*/
  181.   g_lutanclic[0xC0] = "Taito"; /*wiki: https://en.wikipedia.org/wiki/Taito*/  
  182.   g_lutanclic[0xC2] = "Kemco";/*wiki: https://en.wikipedia.org/wiki/Kemco*/
  183.   g_lutanclic[0xC3] = "Square"; /*wiki: https://en.wikipedia.org/wiki/Square_(company)*/
  184.   g_lutanclic[0xC4] = "Tokuma Shoten"; /*wiki: https://en.wikipedia.org/wiki/Tokuma_Shoten*/  
  185.   g_lutanclic[0xC5] = "Data East"; /*wiki: https://en.wikipedia.org/wiki/Data_East*/  
  186.   g_lutanclic[0xC6] = "Tonkin House"; /*wiki: https://en.wikipedia.org/wiki/Category:Tonkin_House_games*/
  187.   g_lutanclic[0xC8] = "Koei"; /*wiki: https://en.wikipedia.org/wiki/Koei*/  
  188.   g_lutanclic[0xC9] = "UFL"; /*No find infos*/
  189.   g_lutanclic[0xCA] = "Ultra"; /*wiki: https://en.wikipedia.org/wiki/Ultra_Games*/
  190.   g_lutanclic[0xCB] = "VAP"; /*wiki: https://en.wikipedia.org/wiki/VAP_%28company%29*/  
  191.   g_lutanclic[0xCC] = "Use"; /*No Find infos*/
  192.   g_lutanclic[0xCD] = "Meldac"; /*wiki: https://en.wikipedia.org/wiki/Meldac*/
  193.   g_lutanclic[0xCE] = "Pony Canyon"; /*wiki: https://en.wikipedia.org/wiki/Pony_Canyon*/
  194.   g_lutanclic[0xCF] = "Angel"; /*N/A*/
  195.   g_lutanclic[0xD0] = "Taito"; /*wiki: https://en.wikipedia.org/wiki/Taito*/
  196.   g_lutanclic[0xD1] = "SOFEL"; /*wiki: https://en.wikipedia.org/wiki/SOFEL*/
  197.   g_lutanclic[0xD2] = "Quest"; /*No find infos*/  
  198.   g_lutanclic[0xD3] = "Sigma Enterprises"; /*maybe?: http://sigma-enterprises.com*/
  199.   g_lutanclic[0xD4] = "Ask Kodansha"; /*https://www.giantbomb.com/ask-kodansha/3010-3528/*/
  200.   g_lutanclic[0xD6] = "Kaga Create"; /*wiki: https://en.wikipedia.org/wiki/Kaga_Create*/
  201.   g_lutanclic[0xD7] = "Copya Systems"; /*wiki: https://en.wikipedia.org/wiki/Category:Copya_Systems_games*/
  202.   g_lutanclic[0xD9] = "Banpresto"; /* homepage:http://www.banpresto.jp/prize/0008.html*/
  203.   g_lutanclic[0xDA] = "Tomy"; /*wiki: https://en.wikipedia.org/wiki/Tomy*/  
  204.   g_lutanclic[0xDB] = "LJN"; /*avgn: http://avgn.wikia.com/wiki/LJN*/  
  205.   g_lutanclic[0xDD] = "Masaya Games"; /*wiki: https://en.wikipedia.org/wiki/Masaya_Games*/
  206.   g_lutanclic[0xDE] = "Human"; /*No find infos */  
  207.   g_lutanclic[0xDF] = "Altron"; /*wiki: https://en.wikipedia.org/wiki/Altron*/
  208.   g_lutanclic[0xE0] = "Jaleco"; /* wiki:https://en.wikipedia.org/wiki/Jaleco*/
  209.   g_lutanclic[0xE1] = "Towa Chiki"; /*wiki: https://en.wikipedia.org/wiki/Towa_Chiki*/  
  210.   g_lutanclic[0xE2] = "Uutaka"; /*No find infos*/
  211.   g_lutanclic[0xE3] = "Varie"; /*wiki: https://en.wikipedia.org/wiki/Varie*/  
  212.   g_lutanclic[0xE5] = "Epoch"; /*wiki: https://en.wikipedia.org/wiki/Epoch_Co.*/
  213.   g_lutanclic[0xE7] = "Athena"; /*wiki: https://en.wikipedia.org/wiki/Athena_(company)*/
  214.   g_lutanclic[0xE8] = "Asmik ACE"; /*wiki: https://en.wikipedia.org/wiki/Asmik_Ace*/  
  215.   g_lutanclic[0xE9] = "Natsume"; /*Homepage: http://www.natsume.com*/
  216.   g_lutanclic[0xEA] = "King_Records"; /*wiki: https://en.wikipedia.org/wiki/King_Records_(Japan)*/
  217.   g_lutanclic[0xEB] = "Atlus"; /*homepage: https://atlus.com*/
  218.   g_lutanclic[0xEC] = "Epic Records"; /*wiki: https://en.wikipedia.org/wiki/Epic_Records_Japan*/
  219.   g_lutanclic[0xEE] = "IGS"; /*wiki: https://en.wikipedia.org/wiki/International_Games_System*/  
  220.   g_lutanclic[0xF0] = "a wave"; /*No find infos*/
  221.   g_lutanclic[0xF3] = "Extreme Entertainment"; /**Moby: https://www.mobygames.com/company/extreme-entertainment-group-inc */
  222.   g_lutanclic[0xFF] = "LJN"; /*avgn: http://avgn.wikia.com/wiki/LJN*/
  223.  
  224.   g_lutcurlic[0] = "None";
  225.   g_lutcurlic[1] = "Nintendo"; /* homepage:https://www.nintendo.com */
  226.   g_lutcurlic[8] = "Capcom"; /* homepage:http://www.capcom.com*/
  227.   g_lutcurlic[13] = "EA"; /*homepage: https://www.ea.com/zh-cn */
  228.   g_lutcurlic[18] = "Hudson Soft"; /*homepage: http://www.hudsonsoft.net/what-we-do/ */
  229.   g_lutcurlic[19] = "B-AI";  
  230.   g_lutcurlic[20] = "KSS"; /* wiki: https://en.wikipedia.org/wiki/KSS_(company) */
  231.   g_lutcurlic[22] = "POW";                                      /* homepage: https://www.virgingames.com/quick-login */
  232.   g_lutcurlic[24] = "PCM Complete"; /* https://segaretro.org/PCM_Complete | https://www.mobygames.com/company/pcm-complete */
  233.   g_lutcurlic[25] = "San-X"; /* homepage http://www.san-x.jp*/
  234.   g_lutcurlic[28] = "Kemco Japan";/*homepage: https://kemco-games.com/global/index.html*/
  235.   g_lutcurlic[29] = "SETA"; /*wiki: https://en.wikipedia.org/wiki/SETA_Corporation */
  236.   g_lutcurlic[30] = "Viacom"; /*wiki: https://en.wikipedia.org/wiki/Viacom */
  237.   g_lutcurlic[31] = "Nintendo"; /* homepage:https://www.nintendo.com */
  238.   g_lutcurlic[32] = "Bandai"; /*bandia? homepage: http://www.bandai.com */
  239.   g_lutcurlic[33] = "Ocean"; /*wiki: https://en.wikipedia.org/wiki/Ocean_Software*/  
  240.   g_lutcurlic[34] = "Konami"; /*homepage: https://www.konami.com/en/*/
  241.   g_lutcurlic[35] = "Hector"; /*N/A */
  242.   g_lutcurlic[37] = "Taito"; /*wiki: https://en.wikipedia.org/wiki/Taito*/  
  243.   g_lutcurlic[38] = "Hudson"; /*homepage: http://www.hudsonsoft.net/what-we-do/ */
  244.   g_lutcurlic[39] = "Banpresto"; /* homepage:http://www.banpresto.jp/prize/0008.html*/
  245.   g_lutcurlic[41] = "Ubisoft"; /*homepage: https://www.ubisoft.com/en-US/ */
  246.   g_lutcurlic[42] = "Atlus"; /*homepage: https://atlus.com*/
  247.   g_lutcurlic[44] = "Malibu"; /*swiki: https://strategywiki.org/wiki/Category:Malibu*/
  248.   g_lutcurlic[46] = "Angel"; /*N/A*/
  249.   g_lutcurlic[47] = "Pullet-Proof";
  250.   g_lutcurlic[49] = "Irem"; /* wiki: https://en.wikipedia.org/wiki/Irem */
  251.   g_lutcurlic[50] = "Absolute"; /*homepgae:http://www.absolutegamez.com */
  252.   g_lutcurlic[51] = "Acclaim"; /*wiki: https://en.wikipedia.org/wiki/Acclaim_Games*/
  253.   g_lutcurlic[52] = "Activision"; /*homepage: https://www.activision.com*/  
  254.   g_lutcurlic[53] = "American Sammy"; /*wiki: https://en.wikipedia.org/wiki/Sammy_Corporation*/
  255.   g_lutcurlic[54] = "Konami"; /*homepage: https://www.konami.com/en/*/
  256.   g_lutcurlic[55] = "Hi-TECH";
  257.   g_lutcurlic[56] = "LJN"; /*avgn: http://avgn.wikia.com/wiki/LJN*/  
  258.   g_lutcurlic[57] = "MATCHBOX"; /*homepage: http://play.matchbox.com/en_US/*/
  259.   g_lutcurlic[58] = "Mattel"; /*wiki: https://en.wikipedia.org/wiki/Mattel*/
  260.   g_lutcurlic[59] = "Milton Bradley"; /*wiki: https://en.wikipedia.org/wiki/Milton_Bradley_Company*/
  261.   g_lutcurlic[60] = "Titus"; /*wiki: https://en.wikipedia.org/wiki/Titus_Interactive*/
  262.   g_lutcurlic[61] = "Virgin"; /* wiki:https://en.wikipedia.org/wiki/Virgin_Interactive */
  263.                                              /* homepage: https://www.virgingames.com/quick-login */                                        
  264.   g_lutcurlic[64] = "LucasArts";/*wiki: https://en.wikipedia.org/wiki/LucasArts*/
  265.   g_lutcurlic[67] = "Ocean"; /*wiki: https://en.wikipedia.org/wiki/Ocean_Software*/  
  266.   g_lutcurlic[69] = "EA"; /*homepage: https://www.ea.com/zh-cn */
  267.   g_lutcurlic[70] = "Atari,SA"; /*wiki: https://en.wikipedia.org/wiki/Atari,_SA */
  268.   g_lutcurlic[71] = "Interplay"; /*wiki: https://en.wikipedia.org/wiki/Interplay_Entertainment*/
  269.   g_lutcurlic[72] = "Brøderbund"; /*moby: https://www.mobygames.com/company/brderbund-software-inc*/  
  270.   g_lutcurlic[73] = "Sculptured"; /*maybe??: http://closinglogogroup.wikia.com/wiki/Sculptured_Software,_Inc.*/
  271.   g_lutcurlic[75] = "SCi Games"; /*wiki: https://en.wikipedia.org/wiki/SCi_Games*/  
  272.   g_lutcurlic[78] = "THQ"; /*source is:t*hq wiki: https://en.wikipedia.org/wiki/THQ*/
  273.   g_lutcurlic[79] = "Accolade"; /*wiki: https://en.wikipedia.org/wiki/Accolade_(game_company)*/
  274.   g_lutcurlic[80] = "Misawa"; /*nseen64: https://www.unseen64.net/tag/misawa-entertainment/*/
  275.   g_lutcurlic[83] = "LOZC G"; /*wiki: https://en.wikipedia.org/wiki/Category:LOZC_G._Amusements_games*/
  276.   g_lutcurlic[86] = "Tokuma Shoten"; /*wiki: https://en.wikipedia.org/wiki/Tokuma_Shoten*/  
  277.   g_lutcurlic[87] = "Tsukuda Original"; /*https://segaretro.org/Tsukuda_Original*/
  278.   g_lutcurlic[91] = "Spike Chunsoft"; /*wiki: https://en.wikipedia.org/wiki/Spike_Chunsoft*/
  279.   g_lutcurlic[92] = "Video System"; /*No find infos*/  
  280.   g_lutcurlic[93] = "Ocean"; /*wiki: https://en.wikipedia.org/wiki/Ocean_Software*/  
  281.   g_lutcurlic[95] = "Varie"; /*wiki: https://en.wikipedia.org/wiki/Varie*/  
  282.   g_lutcurlic[96] = "Yonezawa PR21"; /*wiki: https://en.wikipedia.org/wiki/Yonezawa_PR21*/
  283.   g_lutcurlic[97] = "Kaneko"; /*wiki: https://en.wikipedia.org/wiki/Kaneko*/
  284.   g_lutcurlic[99] = "Pack-In-Video"; /*wiki: https://en.wikipedia.org/wiki/Pack-In-Video*/
  285. }
  286.  
  287. /*
  288. |||||| -------------- BANK-ID :%d START -------------- ||||||
  289. >% abs $% cc
  290. %fece sub_ffff:    >%ffff >%fffe >%fffc >%ffed
  291. %fece long_ffff:   >%ffff >%fffe >%fffc >%ffed
  292. %fece              ld $bc, %ff @@ this is comment
  293. %fecf loc_fecf:    >%ffff >%fffe >%fffc >%ffed
  294. %fecf              ld ($hl), $bc
  295. %fed0              ld ($hl), $sp  
  296. %fed2              dec a
  297. %fed4              jrnz loc_fecf
  298. %fed7              jp %ffff
  299.  
  300. @--------------------------------------------------------------
  301. ||||||| -------------- BANK-ID :%d END   -------------- |||||||
  302. call/jr/jp/ret/reti proc mark. jp mark again.
  303. */
  304.  
  305. struct addrmark_n {
  306.   ks_bool ccbranch;
  307.   ks_uint16 addr;
  308. };
  309. struct addrmark {
  310.   ks_uint16 baddr;
  311.   struct list_ *reflong_tracker;
  312.   struct list_ *refcall_tracker;
  313.   struct list_ *refshort_tracker;
  314. };
  315. struct instr_sec {
  316.   ks_uint16 addr;
  317.   ks_uint16 instr_len;
  318.   ks_uint8 opcode[2];
  319.   ks_int8 opdesc[32];
  320.   struct addrmark *attach;
  321. };
  322. struct bank_disassembler {
  323.   struct list_ *instr_list;
  324.   struct list_ *armark_list;
  325.  
  326.   union { struct { ks_uint16 F; ks_uint16 A; }; ks_uint32 AF; };
  327.   union { struct { ks_uint16 C; ks_uint16 B; }; ks_uint32 BC; };
  328.   union { struct { ks_uint16 E; ks_uint16 D; }; ks_uint32 DE; };
  329.   union { struct { ks_uint16 L; ks_uint16 H; }; ks_uint32 HL; };
  330. };
  331. static const uint8_t cpu_lens[256] = {
  332. /*--  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F   --*/
  333. /*0*/ 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, /*0*/
  334. /*1*/ 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, /*1*/
  335. /*2*/ 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, /*2*/
  336. /*3*/ 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, /*3*/
  337. /*4*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*4*/
  338. /*5*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*5*/
  339. /*6*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*6*/
  340. /*7*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*7*/
  341. /*8*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*8*/
  342. /*9*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*9*/
  343. /*A*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*A*/
  344. /*B*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*B*/
  345. /*C*/ 1, 1, 3, 3, 3, 1, 2, 1, 1, 1, 3, 2, 3, 3, 2, 1, /*C*/
  346. /*D*/ 1, 1, 3, 1, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1, /*D*/
  347. /*E*/ 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1, /*E*/
  348. /*F*/ 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1  /*F*/
  349. /*--  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F   --*/
  350. };
  351. int
  352. lr35902_getaddrmark (char *babuf, int bankid, struct list_ *armark_list /* inited */) {
  353.  
  354.   ks_uint8 *tempBank;
  355.   ks_int32 addrcount;
  356.   ks_uint8 opcode;
  357.  
  358.   tempBank = (ks_uint8 *) & babuf[bankid*0x4000];
  359.   addrcount = 0;
  360.   while (addrcount <= 0x3FFF) {
  361.     ks_bool ccdone;
  362.     ks_uint16 addrTemp;
  363.     ks_int32 id;
  364.     ks_int32 adid;
  365.     struct addrmark *amnk;
  366.     struct list_v *am;
  367.     struct addrmark_n *amm;
  368.     opcode = tempBank[addrcount];
  369.     if (addrcount <= 0x3FFD)
  370.       addrTemp = *(ks_uint16 *)& tempBank[addrcount+1];
  371.     else
  372.       addrTemp = 0;
  373.     ccdone = ks_true;
  374.     adid = -1;
  375.     switch (opcode) {
  376.       /* jmp/jcc branch opcode case **/
  377.  // case 0xE9:/* JP(HL) */
  378.     case 0xC3:/* JP   */
  379.       ccdone = ks_false;
  380.     case 0xC2:/* JPNZ */
  381.     case 0xD2:/* JPNC */
  382.     case 0xCA:/* JPZ   */
  383.     case 0xDA:/* JPC */
  384.       adid = 0;
  385.       break;
  386.       /* call/ccc branch opcode case **/
  387.     case 0xCD:/* CALL   */
  388.       ccdone = ks_false;
  389.     case 0xC4:/* CALLNZ */
  390.     case 0xD4:/* CALLNC */
  391.     case 0xCC:/* CALLZ   */
  392.     case 0xDC:/* CALLC */
  393.       adid = 1;
  394.       break;
  395.       /* jr/jcc short branch opcode case **/
  396.     case 0x18:/* JR   */
  397.       ccdone = ks_false;
  398.     case 0x20:/* JRNZ */
  399.     case 0x30:/* JRNC */
  400.     case 0x28:/* JRZ   */
  401.     case 0x38:/* JRC */
  402.       adid = 2;
  403.       addrTemp = (addrcount +2) + ((char)tempBank[addrcount+1]);
  404.       addrTemp &= 0xFFFF;
  405.     default:
  406.       break;
  407.     }
  408.     if (adid >= 0)
  409.     {
  410.       LIST_FOREACH (armark_list, id, am) {
  411.         amnk = (struct addrmark *)am->obj;
  412.         if (amnk->baddr == addrTemp)
  413.           goto skip;
  414.         else ;
  415.       }
  416.       /* alloc chunk  struct addrmark * */
  417.       amnk =(struct addrmark *)malloc (sizeof (struct addrmark));
  418.       amnk->baddr = addrTemp;
  419.       list_init (& amnk->refcall_tracker);
  420.       list_init (& amnk->reflong_tracker);
  421.       list_init (& amnk->refshort_tracker);
  422.       list_insert (armark_list, -1, amnk);
  423.   skip:
  424.       amm = (struct addrmark_n *)malloc (sizeof (struct addrmark_n));
  425.       amm->addr = addrcount;
  426.       amm->ccbranch = ccdone;
  427.       if (adid == 0)
  428.         list_insert (amnk->reflong_tracker, -1, amm);
  429.       else if (adid == 1)
  430.         list_insert (amnk->refcall_tracker, -1, amm);
  431.       else
  432.         list_insert (amnk->refshort_tracker, -1, amm);
  433.     }
  434.     addrcount += cpu_lens[opcode];
  435.   }
  436. }
  437.  
  438. int
  439. lr35902_bankdis (char *babuf, int bankid, struct bank_disassembler *bankdis) {
  440.  
  441.   ks_uint8 *tempBank;
  442.   ks_int32 addrcount;
  443.   ks_uint8 opcode;
  444.   ks_uint8 opcode2 ;
  445.  
  446.   tempBank = (ks_uint8 *) & babuf[bankid*0x4000];
  447.   opcode2 = 0;
  448.   addrcount = 0;
  449.   while (addrcount <= 0x3FFF) {
  450.     ks_uint16 addrTemp16;
  451.     ks_uint8 addrTemp8;
  452.     struct instr_sec *isec;
  453.     opcode = tempBank[addrcount];
  454.     if (addrcount <= 0x3FFD)
  455.       addrTemp16 = *(ks_uint16 *)& tempBank[addrcount+1];
  456.     else
  457.       addrTemp16 = 0;
  458.     addrTemp8 = (ks_uint8)addrTemp16;
  459.     isec = (struct instr_sec *)malloc (sizeof (struct instr_sec));
  460.     isec->attach = ks_null;
  461.     memset (isec->opdesc, 0, sizeof (isec->opdesc));
  462.  
  463. #define BUFCOPY(desc,...)\
  464.     do {  \
  465.       int n = sprintf ((char *)isec->opdesc, desc, __VA_ARGS__);\
  466.       isec->opdesc[n] = 0;\
  467.     } while (0)
  468.  
  469.     /* check register write */
  470.     switch (opcode) {
  471.     case 0xDB:
  472.     case 0xEB:
  473.     case 0xEC:
  474.     case 0xFC:
  475.     case 0xDD:
  476.     case 0xED:
  477.     case 0xFD:
  478.     case 0xF4:
  479.     case 0xE4:
  480.     case 0xD3:
  481.     case 0xE3: BUFCOPY("undefined"); break;
  482.     case 0x00: BUFCOPY("nop"); break;
  483.     case 0x10: BUFCOPY("stop"); break;
  484.     case 0x76: BUFCOPY("halt"); break;
  485.     case 0xFB: BUFCOPY("ei"); break;
  486.     case 0xF3: BUFCOPY("di"); break;
  487.     case 0x07:  BUFCOPY("rlca"); break;
  488.     case 0x17:  BUFCOPY("rla"); break;
  489.     case 0x27:  BUFCOPY("daa"); break;
  490.     case 0x37:  BUFCOPY("scf"); break;
  491.     case 0x07+8:  BUFCOPY("rrca"); break;
  492.     case 0x17+8:  BUFCOPY("rra"); break;
  493.     case 0x27+8:  BUFCOPY("cpl"); break;
  494.     case 0x37+8:  BUFCOPY("ccf"); break;
  495.     /* LD $reg, d16 */
  496.     case 0x01: BUFCOPY("ld bc, %%%04x", addrTemp16); break;
  497.     case 0x11: BUFCOPY("ld de, %%%04x", addrTemp16); break;
  498.     case 0x21: BUFCOPY("ld hl, %%%04x", addrTemp16); break;
  499.     case 0x31: BUFCOPY("ld sp, %%%04x", addrTemp16); break;  
  500.     /* LD $reg,  d8*/
  501.     case 0x06: BUFCOPY("ld b, %%%02x", addrTemp8); break;
  502.     case 0x16: BUFCOPY("ld d, %%%02x", addrTemp8); break;
  503.     case 0x26: BUFCOPY("ld h, %%%02x", addrTemp8); break;
  504.     case 0x36: BUFCOPY("ld (hl), %%%02x", addrTemp8); break;  
  505.     case 0x06+8: BUFCOPY("ld c, %%%02x", addrTemp8); break;
  506.     case 0x16+8: BUFCOPY("ld e, %%%02x", addrTemp8); break;
  507.     case 0x26+8: BUFCOPY("ld l, %%%02x", addrTemp8); break;
  508.     case 0x36+8: BUFCOPY("ld a, %%%02x", addrTemp8); break;  
  509.     /* LD ($reg),a | LD a, ($reg) */
  510.     case 0x06-4: BUFCOPY("ld (bc), a"); break;
  511.     case 0x16-4: BUFCOPY("ld (de), a"); break;
  512.     case 0x26-4: BUFCOPY("ld (hl+), a"); break;
  513.     case 0x36-4: BUFCOPY("ld (hl-), a"); break;  
  514.     case 0x06+8-4: BUFCOPY("ld a, (bc)"); break;
  515.     case 0x16+8-4: BUFCOPY("ld a, (de)"); break;
  516.     case 0x26+8-4: BUFCOPY("ld a, (hl+)"); break;
  517.     case 0x36+8-4: BUFCOPY("ld a, (hl-)"); break;
  518.    
  519.     /* LD martix */  
  520.     case 0x40+0x00+0: BUFCOPY("ld b, b"); break;  
  521.     case 0x40+0x00+1: BUFCOPY("ld b, c"); break;  
  522.     case 0x40+0x00+2: BUFCOPY("ld b, d"); break;  
  523.     case 0x40+0x00+3: BUFCOPY("ld b, e"); break;  
  524.     case 0x40+0x00+4: BUFCOPY("ld b, h"); break;  
  525.     case 0x40+0x00+5: BUFCOPY("ld b, l"); break;  
  526.     case 0x40+0x00+6: BUFCOPY("ld b, (hl)"); break;  
  527.     case 0x40+0x00+7: BUFCOPY("ld b, a"); break;  
  528.     case 0x40+0x00+0+8: BUFCOPY("ld c, b"); break;  
  529.     case 0x40+0x00+1+8: BUFCOPY("ld c, c"); break;  
  530.     case 0x40+0x00+2+8: BUFCOPY("ld c, d"); break;  
  531.     case 0x40+0x00+3+8: BUFCOPY("ld c, e"); break;  
  532.     case 0x40+0x00+4+8: BUFCOPY("ld c, h"); break;  
  533.     case 0x40+0x00+5+8: BUFCOPY("ld c, l"); break;  
  534.     case 0x40+0x00+6+8: BUFCOPY("ld c, (hl)"); break;  
  535.     case 0x40+0x00+7+8: BUFCOPY("ld c, a"); break;  
  536.  
  537.     case 0x40+0x10+0: BUFCOPY("ld d, b"); break;  
  538.     case 0x40+0x10+1: BUFCOPY("ld d, c"); break;  
  539.     case 0x40+0x10+2: BUFCOPY("ld d, d"); break;  
  540.     case 0x40+0x10+3: BUFCOPY("ld d, e"); break;  
  541.     case 0x40+0x10+4: BUFCOPY("ld d, h"); break;  
  542.     case 0x40+0x10+5: BUFCOPY("ld d, l"); break;  
  543.     case 0x40+0x10+6: BUFCOPY("ld d, (hl)"); break;  
  544.     case 0x40+0x10+7: BUFCOPY("ld d, a"); break;  
  545.     case 0x40+0x10+0+8: BUFCOPY("ld e, b"); break;  
  546.     case 0x40+0x10+1+8: BUFCOPY("ld e, c"); break;  
  547.     case 0x40+0x10+2+8: BUFCOPY("ld e, d"); break;  
  548.     case 0x40+0x10+3+8: BUFCOPY("ld e, e"); break;  
  549.     case 0x40+0x10+4+8: BUFCOPY("ld e, h"); break;  
  550.     case 0x40+0x10+5+8: BUFCOPY("ld e, l"); break;  
  551.     case 0x40+0x10+6+8: BUFCOPY("ld e, (hl)"); break;  
  552.     case 0x40+0x10+7+8: BUFCOPY("ld e, a"); break;  
  553.    
  554.     case 0x40+0x20+0: BUFCOPY("ld h, b"); break;  
  555.     case 0x40+0x20+1: BUFCOPY("ld h, c"); break;  
  556.     case 0x40+0x20+2: BUFCOPY("ld h, d"); break;  
  557.     case 0x40+0x20+3: BUFCOPY("ld h, e"); break;  
  558.     case 0x40+0x20+4: BUFCOPY("ld h, h"); break;  
  559.     case 0x40+0x20+5: BUFCOPY("ld h, l"); break;  
  560.     case 0x40+0x20+6: BUFCOPY("ld h, (hl)"); break;  
  561.     case 0x40+0x20+7: BUFCOPY("ld h, a"); break;  
  562.     case 0x40+0x20+0+8: BUFCOPY("ld l, b"); break;  
  563.     case 0x40+0x20+1+8: BUFCOPY("ld l, c"); break;  
  564.     case 0x40+0x20+2+8: BUFCOPY("ld l, d"); break;  
  565.     case 0x40+0x20+3+8: BUFCOPY("ld l, e"); break;  
  566.     case 0x40+0x20+4+8: BUFCOPY("ld l, h"); break;  
  567.     case 0x40+0x20+5+8: BUFCOPY("ld l, l"); break;  
  568.     case 0x40+0x20+6+8: BUFCOPY("ld l, (hl)"); break;  
  569.     case 0x40+0x20+7+8: BUFCOPY("ld l, a"); break;  
  570.    
  571.     case 0x40+0x30+0: BUFCOPY("ld (hl), b"); break;  
  572.     case 0x40+0x30+1: BUFCOPY("ld (hl), c"); break;  
  573.     case 0x40+0x30+2: BUFCOPY("ld (hl), d"); break;  
  574.     case 0x40+0x30+3: BUFCOPY("ld (hl), e"); break;  
  575.     case 0x40+0x30+4: BUFCOPY("ld (hl), h"); break;  
  576.     case 0x40+0x30+5: BUFCOPY("ld (hl), l"); break;  
  577.     case 0x40+0x30+7: BUFCOPY("ld (hl), a"); break;  
  578.     case 0x40+0x30+0+8: BUFCOPY("ld a, b"); break;  
  579.     case 0x40+0x30+1+8: BUFCOPY("ld a, c"); break;  
  580.     case 0x40+0x30+2+8: BUFCOPY("ld a, d"); break;  
  581.     case 0x40+0x30+3+8: BUFCOPY("ld a, e"); break;  
  582.     case 0x40+0x30+4+8: BUFCOPY("ld a, h"); break;  
  583.     case 0x40+0x30+5+8: BUFCOPY("ld a, l"); break;  
  584.     case 0x40+0x30+6+8: BUFCOPY("ld a, (hl)"); break;  
  585.     case 0x40+0x30+7+8: BUFCOPY("ld a, a"); break;  
  586.  
  587.     /* LD misc */
  588.     case 0xE0: BUFCOPY("ld (%%%02x), a", 0xFF00+addrTemp8); break;
  589.     case 0xF0: BUFCOPY("ld a, (%%%02x)", 0xFF00+addrTemp8); break;
  590.     case 0xE0+2: BUFCOPY("ld (%%ff00+c), a"); break;
  591.     case 0xF0+2: BUFCOPY("ld a, (%%ff00+c)"); break;
  592.     case 0xF8: BUFCOPY("ld hl, sp+%%%01x", addrTemp8); break;
  593.     case 0xF9: BUFCOPY("ld sp, hl"); break;
  594.     case 0xFA: BUFCOPY("ld a, (%%%04x)", addrTemp16); break;
  595.     case 0xEA: BUFCOPY("ld (%%%04x), a", addrTemp16); break;
  596.     case 0x08: BUFCOPY("ld (%%%04x), sp", addrTemp16); break;
  597.     /* large alu */
  598.     case 0x80+0x00+0: BUFCOPY("add a, b"); break;  
  599.     case 0x80+0x00+1: BUFCOPY("add a, c"); break;  
  600.     case 0x80+0x00+2: BUFCOPY("add a, d"); break;  
  601.     case 0x80+0x00+3: BUFCOPY("add a, e"); break;  
  602.     case 0x80+0x00+4: BUFCOPY("add a, h"); break;  
  603.     case 0x80+0x00+5: BUFCOPY("add a, l"); break;  
  604.     case 0x80+0x00+6: BUFCOPY("add a, (hl)"); break;  
  605.     case 0x80+0x00+7: BUFCOPY("add a, a"); break;  
  606.     case 0x80+0x00+0+8: BUFCOPY("adc a, b"); break;  
  607.     case 0x80+0x00+1+8: BUFCOPY("adc a, c"); break;  
  608.     case 0x80+0x00+2+8: BUFCOPY("adc a, d"); break;  
  609.     case 0x80+0x00+3+8: BUFCOPY("adc a, e"); break;  
  610.     case 0x80+0x00+4+8: BUFCOPY("adc a, h"); break;  
  611.     case 0x80+0x00+5+8: BUFCOPY("adc a, l"); break;  
  612.     case 0x80+0x00+6+8: BUFCOPY("adc a, (hl)"); break;  
  613.     case 0x80+0x00+7+8: BUFCOPY("adc a, a"); break;  
  614.  
  615.     case 0x80+0x10+0: BUFCOPY("sub a, b"); break;  
  616.     case 0x80+0x10+1: BUFCOPY("sub a, c"); break;  
  617.     case 0x80+0x10+2: BUFCOPY("sub a, d"); break;  
  618.     case 0x80+0x10+3: BUFCOPY("sub a, e"); break;  
  619.     case 0x80+0x10+4: BUFCOPY("sub a, h"); break;  
  620.     case 0x80+0x10+5: BUFCOPY("sub a, l"); break;  
  621.     case 0x80+0x10+6: BUFCOPY("sub a, (hl)"); break;  
  622.     case 0x80+0x10+7: BUFCOPY("sub a, a"); break;  
  623.     case 0x80+0x10+0+8: BUFCOPY("sbc a, b"); break;  
  624.     case 0x80+0x10+1+8: BUFCOPY("sbc a, c"); break;  
  625.     case 0x80+0x10+2+8: BUFCOPY("sbc a, d"); break;  
  626.     case 0x80+0x10+3+8: BUFCOPY("sbc a, e"); break;  
  627.     case 0x80+0x10+4+8: BUFCOPY("sbc a, h"); break;  
  628.     case 0x80+0x10+5+8: BUFCOPY("sbc a, l"); break;  
  629.     case 0x80+0x10+6+8: BUFCOPY("sbc a, (hl)"); break;  
  630.     case 0x80+0x10+7+8: BUFCOPY("sbc a, a"); break;  
  631.    
  632.     case 0x80+0x20+0: BUFCOPY("and a, b"); break;  
  633.     case 0x80+0x20+1: BUFCOPY("and a, c"); break;  
  634.     case 0x80+0x20+2: BUFCOPY("and a, d"); break;  
  635.     case 0x80+0x20+3: BUFCOPY("and a, e"); break;  
  636.     case 0x80+0x20+4: BUFCOPY("and a, h"); break;  
  637.     case 0x80+0x20+5: BUFCOPY("and a, l"); break;  
  638.     case 0x80+0x20+6: BUFCOPY("and a, (hl)"); break;  
  639.     case 0x80+0x20+7: BUFCOPY("and a, a"); break;  
  640.     case 0x80+0x20+0+8: BUFCOPY("xor a, b"); break;  
  641.     case 0x80+0x20+1+8: BUFCOPY("xor a, c"); break;  
  642.     case 0x80+0x20+2+8: BUFCOPY("xor a, d"); break;  
  643.     case 0x80+0x20+3+8: BUFCOPY("xor a, e"); break;  
  644.     case 0x80+0x20+4+8: BUFCOPY("xor a, h"); break;  
  645.     case 0x80+0x20+5+8: BUFCOPY("xor a, l"); break;  
  646.     case 0x80+0x20+6+8: BUFCOPY("xor a, (hl)"); break;  
  647.     case 0x80+0x20+7+8: BUFCOPY("xor a, a"); break;  
  648.    
  649.     case 0x80+0x30+0: BUFCOPY("or a, b"); break;  
  650.     case 0x80+0x30+1: BUFCOPY("or a, c"); break;  
  651.     case 0x80+0x30+2: BUFCOPY("or a, d"); break;  
  652.     case 0x80+0x30+3: BUFCOPY("or a, e"); break;  
  653.     case 0x80+0x30+4: BUFCOPY("or a, h"); break;  
  654.     case 0x80+0x30+5: BUFCOPY("or a, l"); break;  
  655.     case 0x80+0x30+6: BUFCOPY("or a, (hl)"); break;  
  656.     case 0x80+0x30+7: BUFCOPY("or a, a"); break;  
  657.     case 0x80+0x30+0+8: BUFCOPY("cp a, b"); break;  
  658.     case 0x80+0x30+1+8: BUFCOPY("cp a, c"); break;  
  659.     case 0x80+0x30+2+8: BUFCOPY("cp a, d"); break;  
  660.     case 0x80+0x30+3+8: BUFCOPY("cp a, e"); break;  
  661.     case 0x80+0x30+4+8: BUFCOPY("cp a, h"); break;  
  662.     case 0x80+0x30+5+8: BUFCOPY("cp a, l"); break;  
  663.     case 0x80+0x30+6+8: BUFCOPY("cp a, (hl)"); break;  
  664.     case 0x80+0x30+7+8: BUFCOPY("cp a, a"); break;
  665.  
  666.       /* inc /decv wordreg */
  667.     case 0x03: BUFCOPY("inc bc"); break;
  668.     case 0x13: BUFCOPY("inc de"); break;
  669.     case 0x23: BUFCOPY("inc hl"); break;
  670.     case 0x33: BUFCOPY("inc sp"); break;
  671.     case 0x03+8: BUFCOPY("dec bc"); break;
  672.     case 0x13+8: BUFCOPY("dec de"); break;
  673.     case 0x23+8: BUFCOPY("dec hl"); break;
  674.     case 0x33+8: BUFCOPY("dec sp"); break;
  675.       /* inc /decv sreg */
  676.     case 0x03+1: BUFCOPY("inc b"); break;
  677.     case 0x13+1: BUFCOPY("inc d"); break;
  678.     case 0x23+1: BUFCOPY("inc h"); break;
  679.     case 0x33+1: BUFCOPY("inc (hl)"); break;
  680.     case 0x03+8+1: BUFCOPY("inc c"); break;
  681.     case 0x13+8+1: BUFCOPY("inc e"); break;
  682.     case 0x23+8+1: BUFCOPY("inc l"); break;
  683.     case 0x33+8+1: BUFCOPY("inc a"); break;
  684.     case 0x03+1+1: BUFCOPY("dec b"); break;
  685.     case 0x13+1+1: BUFCOPY("dec d"); break;
  686.     case 0x23+1+1: BUFCOPY("dec h"); break;
  687.     case 0x33+1+1: BUFCOPY("dec (hl)"); break;
  688.     case 0x03+8+1+1: BUFCOPY("dec c"); break;
  689.     case 0x13+8+1+1: BUFCOPY("dec e"); break;
  690.     case 0x23+8+1+1: BUFCOPY("dec l"); break;
  691.     case 0x33+8+1+1: BUFCOPY("dec a"); break;
  692.  
  693.     /* add word */
  694.     case 0x09: BUFCOPY("add hl, bc"); break;
  695.     case 0x19: BUFCOPY("add hl, de"); break;
  696.     case 0x29: BUFCOPY("add hl, hl"); break;
  697.     case 0x39: BUFCOPY("add hl, sp"); break;
  698.  
  699.     /* jr */
  700.     case 0x18:/* JR   */ BUFCOPY("jr loc_%04x", (((addrcount + 2) + (char)addrTemp8)) & 0xFFFF); break;
  701.     case 0x20:/* JRNZ */ BUFCOPY("jrnz loc_%04x", (((addrcount + 2) + (char)addrTemp8)) & 0xFFFF); break;
  702.     case 0x30:/* JRNC */ BUFCOPY("jrnc loc_%04x", (((addrcount + 2) + (char)addrTemp8)) & 0xFFFF); break;
  703.     case 0x28:/* JRZ   */ BUFCOPY("jrz loc_%04x", (((addrcount + 2) + (char)addrTemp8)) & 0xFFFF); break;
  704.     case 0x38:/* JRC */ BUFCOPY("jrc loc_%04x", (((addrcount + 2) + (char)addrTemp8)) & 0xFFFF); break;
  705.     /* call */
  706.     case 0xCD:/* CALL   */ BUFCOPY("call sub_%04x", addrTemp16); break;
  707.     case 0xC4:/* CALLNZ */ BUFCOPY("callnz sub_%04x", addrTemp16); break;
  708.     case 0xD4:/* CALLNC */     BUFCOPY("callnc sub_%04x", addrTemp16); break;
  709.     case 0xCC:/* CALLZ   */   BUFCOPY("callz sub_%04x", addrTemp16); break;
  710.     case 0xDC:/* CALLC */ BUFCOPY("callc sub_%04x", addrTemp16); break;
  711.    /* jp */
  712.     case 0xE9:/* JP(HL) */ BUFCOPY("jp (hl)"); break;
  713.     case 0xC3:/* JP   */ BUFCOPY("jp long_%04x", addrTemp16); break;
  714.     case 0xC2:/* JPNZ */ BUFCOPY("jpnz long_%04x", addrTemp16); break;
  715.     case 0xD2:/* JPNC */  BUFCOPY("jpnc long_%04x", addrTemp16); break;
  716.     case 0xCA:/* JPZ   */ BUFCOPY("jpz long_%04x", addrTemp16); break;
  717.     case 0xDA:/* JPC */  BUFCOPY("jpc long_%04x", addrTemp16); break;
  718.       /* ret */
  719.     case 0xC0:/*RETNZ */  BUFCOPY("retnz", addrTemp16); break;
  720.     case 0xD0:/*RETNC */  BUFCOPY("retnc", addrTemp16); break;
  721.     case 0xC0+8:/*RETZ */  BUFCOPY("retz", addrTemp16); break;
  722.     case 0xD0+8:/*RETC */  BUFCOPY("retc", addrTemp16); break;
  723.     case 0xC0+8+1:/*RET */  BUFCOPY("ret", addrTemp16); break;
  724.     case 0xD0+8+1:/*RETI */  BUFCOPY("reti", addrTemp16); break;
  725.       /* push pop */
  726.     case 0xC5:  BUFCOPY("push bc", addrTemp16); break;
  727.     case 0xD5:  BUFCOPY("push de", addrTemp16); break;
  728.     case 0xE5:  BUFCOPY("push hl", addrTemp16); break;
  729.     case 0xF5:  BUFCOPY("push af", addrTemp16); break;
  730.     case 0xC1:  BUFCOPY("pop bc", addrTemp16); break;
  731.     case 0xD1:  BUFCOPY("pop de", addrTemp16); break;
  732.     case 0xE1:  BUFCOPY("pop hl", addrTemp16); break;
  733.     case 0xF1:  BUFCOPY("pop af", addrTemp16); break;
  734.       /* rst */
  735.     case 0xC7:  BUFCOPY("rst %%00", addrTemp16); break;
  736.     case 0xD7:  BUFCOPY("rst %%10", addrTemp16); break;
  737.     case 0xE7:  BUFCOPY("rst %%20", addrTemp16); break;
  738.     case 0xF7:  BUFCOPY("rst %%30", addrTemp16); break;
  739.     case 0xC7+8:  BUFCOPY("rst %%08", addrTemp16); break;
  740.     case 0xD7+8:  BUFCOPY("rst %%18", addrTemp16); break;
  741.     case 0xE7+8:  BUFCOPY("rst %%28", addrTemp16); break;
  742.     case 0xF7+8:  BUFCOPY("rst %%38", addrTemp16); break;
  743.       /* alu d8*/
  744.     case 0xC6: BUFCOPY("add a, %%%02x", addrTemp8); break;
  745.     case 0xD6: BUFCOPY("sub a, %%%02x", addrTemp8); break;
  746.     case 0xE6: BUFCOPY("and a, %%%02x", addrTemp8); break;
  747.     case 0xF6: BUFCOPY("or a, %%%02x", addrTemp8); break;
  748.     case 0xC6+8: BUFCOPY("adc a, %%%02x", addrTemp8); break;
  749.     case 0xD6+8: BUFCOPY("sbc a, %%%02x", addrTemp8); break;
  750.     case 0xE6+8: BUFCOPY("xor a, %%%02x", addrTemp8); break;
  751.     case 0xF6+8: BUFCOPY("cp a, %%%02x", addrTemp8); break;
  752.       /* misc */
  753.     case 0xE8:  BUFCOPY("add esp, %%%02x", addrTemp8); break;
  754.     case 0xCB:
  755.       /* perix cb */
  756.       opcode2 = tempBank[addrcount+1];
  757.       switch (opcode2) {
  758.       case 0x00+0x00+0: BUFCOPY("rlc, b"); break;  
  759.       case 0x00+0x00+1: BUFCOPY("rlc, c"); break;  
  760.       case 0x00+0x00+2: BUFCOPY("rlc, d"); break;  
  761.       case 0x00+0x00+3: BUFCOPY("rlc, e"); break;  
  762.       case 0x00+0x00+4: BUFCOPY("rlc, h"); break;  
  763.       case 0x00+0x00+5: BUFCOPY("rlc, l"); break;  
  764.       case 0x00+0x00+6: BUFCOPY("rlc, (hl)"); break;  
  765.       case 0x00+0x00+7: BUFCOPY("rlc, a"); break;  
  766.       case 0x00+0x00+0+8: BUFCOPY("rrc, b"); break;  
  767.       case 0x00+0x00+1+8: BUFCOPY("rrc, c"); break;  
  768.       case 0x00+0x00+2+8: BUFCOPY("rrc, d"); break;  
  769.       case 0x00+0x00+3+8: BUFCOPY("rrc, e"); break;  
  770.       case 0x00+0x00+4+8: BUFCOPY("rrc, h"); break;  
  771.       case 0x00+0x00+5+8: BUFCOPY("rrc, l"); break;  
  772.       case 0x00+0x00+6+8: BUFCOPY("rrc, (hl)"); break;  
  773.       case 0x00+0x00+7+8: BUFCOPY("rrc, a"); break;  
  774.  
  775.       case 0x00+0x10+0: BUFCOPY("rl, b"); break;  
  776.       case 0x00+0x10+1: BUFCOPY("rl, c"); break;  
  777.       case 0x00+0x10+2: BUFCOPY("rl, d"); break;  
  778.       case 0x00+0x10+3: BUFCOPY("rl, e"); break;  
  779.       case 0x00+0x10+4: BUFCOPY("rl, h"); break;  
  780.       case 0x00+0x10+5: BUFCOPY("rl, l"); break;  
  781.       case 0x00+0x10+6: BUFCOPY("rl, (hl)"); break;  
  782.       case 0x00+0x10+7: BUFCOPY("rl, a"); break;  
  783.       case 0x00+0x10+0+8: BUFCOPY("rr, b"); break;  
  784.       case 0x00+0x10+1+8: BUFCOPY("rr, c"); break;  
  785.       case 0x00+0x10+2+8: BUFCOPY("rr, d"); break;  
  786.       case 0x00+0x10+3+8: BUFCOPY("rr, e"); break;  
  787.       case 0x00+0x10+4+8: BUFCOPY("rr, h"); break;  
  788.       case 0x00+0x10+5+8: BUFCOPY("rr, l"); break;  
  789.       case 0x00+0x10+6+8: BUFCOPY("rr, (hl)"); break;  
  790.       case 0x00+0x10+7+8: BUFCOPY("rr, a"); break;  
  791.    
  792.       case 0x00+0x20+0: BUFCOPY("sla, b"); break;  
  793.       case 0x00+0x20+1: BUFCOPY("sla, c"); break;  
  794.       case 0x00+0x20+2: BUFCOPY("sla, d"); break;  
  795.       case 0x00+0x20+3: BUFCOPY("sla, e"); break;  
  796.       case 0x00+0x20+4: BUFCOPY("sla, h"); break;  
  797.       case 0x00+0x20+5: BUFCOPY("sla, l"); break;  
  798.       case 0x00+0x20+6: BUFCOPY("sla, (hl)"); break;  
  799.       case 0x00+0x20+7: BUFCOPY("sla, a"); break;  
  800.       case 0x00+0x20+0+8: BUFCOPY("sra, b"); break;  
  801.       case 0x00+0x20+1+8: BUFCOPY("sra, c"); break;  
  802.       case 0x00+0x20+2+8: BUFCOPY("sra, d"); break;  
  803.       case 0x00+0x20+3+8: BUFCOPY("sra, e"); break;  
  804.       case 0x00+0x20+4+8: BUFCOPY("sra, h"); break;  
  805.       case 0x00+0x20+5+8: BUFCOPY("sra, l"); break;  
  806.       case 0x00+0x20+6+8: BUFCOPY("sra, (hl)"); break;  
  807.       case 0x00+0x20+7+8: BUFCOPY("sra, a"); break;  
  808.    
  809.       case 0x00+0x30+0: BUFCOPY("swap, b"); break;  
  810.       case 0x00+0x30+1: BUFCOPY("swap, c"); break;  
  811.       case 0x00+0x30+2: BUFCOPY("swap, d"); break;  
  812.       case 0x00+0x30+3: BUFCOPY("swap, e"); break;  
  813.       case 0x00+0x30+4: BUFCOPY("swap, h"); break;  
  814.       case 0x00+0x30+5: BUFCOPY("swap, l"); break;  
  815.       case 0x00+0x30+6: BUFCOPY("swap, (hl)"); break;  
  816.       case 0x00+0x30+7: BUFCOPY("swap, a"); break;  
  817.       case 0x00+0x30+0+8: BUFCOPY("srl, b"); break;  
  818.       case 0x00+0x30+1+8: BUFCOPY("srl, c"); break;  
  819.       case 0x00+0x30+2+8: BUFCOPY("srl, d"); break;  
  820.       case 0x00+0x30+3+8: BUFCOPY("srl, e"); break;  
  821.       case 0x00+0x30+4+8: BUFCOPY("srl, h"); break;  
  822.       case 0x00+0x30+5+8: BUFCOPY("srl, l"); break;  
  823.       case 0x00+0x30+6+8: BUFCOPY("srl, (hl)"); break;  
  824.       case 0x00+0x30+7+8: BUFCOPY("srl, a"); break;
  825.  
  826.       case 0x40+0x00+0: BUFCOPY("bit b, 0"); break;  
  827.       case 0x40+0x00+1: BUFCOPY("bit c, 0"); break;  
  828.       case 0x40+0x00+2: BUFCOPY("bit d, 0"); break;  
  829.       case 0x40+0x00+3: BUFCOPY("bit e, 0"); break;  
  830.       case 0x40+0x00+4: BUFCOPY("bit h, 0"); break;  
  831.       case 0x40+0x00+5: BUFCOPY("bit l, 0"); break;  
  832.       case 0x40+0x00+6: BUFCOPY("bit (hl), 0"); break;  
  833.       case 0x40+0x00+7: BUFCOPY("bit a, 0"); break;  
  834.       case 0x40+0x00+0+8: BUFCOPY("bit b, 1"); break;  
  835.       case 0x40+0x00+1+8: BUFCOPY("bit c, 1"); break;  
  836.       case 0x40+0x00+2+8: BUFCOPY("bit d, 1"); break;  
  837.       case 0x40+0x00+3+8: BUFCOPY("bit e, 1"); break;  
  838.       case 0x40+0x00+4+8: BUFCOPY("bit h, 1"); break;  
  839.       case 0x40+0x00+5+8: BUFCOPY("bit l, 1"); break;  
  840.       case 0x40+0x00+6+8: BUFCOPY("bit (hl), 1"); break;  
  841.       case 0x40+0x00+7+8: BUFCOPY("bit a, 1"); break;  
  842.  
  843.       case 0x40+0x10+0: BUFCOPY("bit b, 2"); break;  
  844.       case 0x40+0x10+1: BUFCOPY("bit c, 2"); break;  
  845.       case 0x40+0x10+2: BUFCOPY("bit d, 2"); break;  
  846.       case 0x40+0x10+3: BUFCOPY("bit e, 2"); break;  
  847.       case 0x40+0x10+4: BUFCOPY("bit h, 2"); break;  
  848.       case 0x40+0x10+5: BUFCOPY("bit l, 2"); break;  
  849.       case 0x40+0x10+6: BUFCOPY("bit (hl), 2"); break;  
  850.       case 0x40+0x10+7: BUFCOPY("bit a, 2"); break;  
  851.       case 0x40+0x10+0+8: BUFCOPY("bit b, 3"); break;  
  852.       case 0x40+0x10+1+8: BUFCOPY("bit c, 3"); break;  
  853.       case 0x40+0x10+2+8: BUFCOPY("bit d, 3"); break;  
  854.       case 0x40+0x10+3+8: BUFCOPY("bit e, 3"); break;  
  855.       case 0x40+0x10+4+8: BUFCOPY("bit h, 3"); break;  
  856.       case 0x40+0x10+5+8: BUFCOPY("bit l, 3"); break;  
  857.       case 0x40+0x10+6+8: BUFCOPY("bit (hl), 3"); break;  
  858.       case 0x40+0x10+7+8: BUFCOPY("bit a, 3"); break;  
  859.    
  860.       case 0x40+0x20+0: BUFCOPY("bit b, 4"); break;  
  861.       case 0x40+0x20+1: BUFCOPY("bit c, 4"); break;  
  862.       case 0x40+0x20+2: BUFCOPY("bit d, 4"); break;  
  863.       case 0x40+0x20+3: BUFCOPY("bit e, 4"); break;  
  864.       case 0x40+0x20+4: BUFCOPY("bit h, 4"); break;  
  865.       case 0x40+0x20+5: BUFCOPY("bit l, 4"); break;  
  866.       case 0x40+0x20+6: BUFCOPY("bit (hl), 4"); break;  
  867.       case 0x40+0x20+7: BUFCOPY("bit a, 4"); break;  
  868.       case 0x40+0x20+0+8: BUFCOPY("bit b, 5"); break;  
  869.       case 0x40+0x20+1+8: BUFCOPY("bit c, 5"); break;  
  870.       case 0x40+0x20+2+8: BUFCOPY("bit d, 5"); break;  
  871.       case 0x40+0x20+3+8: BUFCOPY("bit e, 5"); break;  
  872.       case 0x40+0x20+4+8: BUFCOPY("bit h, 5"); break;  
  873.       case 0x40+0x20+5+8: BUFCOPY("bit l, 5"); break;  
  874.       case 0x40+0x20+6+8: BUFCOPY("bit (hl), 5"); break;  
  875.       case 0x40+0x20+7+8: BUFCOPY("bit a, 5"); break;  
  876.    
  877.       case 0x40+0x30+0: BUFCOPY("bit b, 6"); break;  
  878.       case 0x40+0x30+1: BUFCOPY("bit c, 6"); break;  
  879.       case 0x40+0x30+2: BUFCOPY("bit d, 6"); break;  
  880.       case 0x40+0x30+3: BUFCOPY("bit e, 6"); break;  
  881.       case 0x40+0x30+4: BUFCOPY("bit h, 6"); break;  
  882.       case 0x40+0x30+5: BUFCOPY("bit l, 6"); break;  
  883.       case 0x40+0x30+6: BUFCOPY("bit (hl), 6"); break;  
  884.       case 0x40+0x30+7: BUFCOPY("bit a, 6"); break;  
  885.       case 0x40+0x30+0+8: BUFCOPY("bit b, 7"); break;  
  886.       case 0x40+0x30+1+8: BUFCOPY("bit c, 7"); break;  
  887.       case 0x40+0x30+2+8: BUFCOPY("bit d, 7"); break;  
  888.       case 0x40+0x30+3+8: BUFCOPY("bit e, 7"); break;  
  889.       case 0x40+0x30+4+8: BUFCOPY("bit h, 7"); break;  
  890.       case 0x40+0x30+5+8: BUFCOPY("bit l, 7"); break;  
  891.       case 0x40+0x30+6+8: BUFCOPY("bit (hl), 7"); break;  
  892.       case 0x40+0x30+7+8: BUFCOPY("bit a, 7"); break;
  893.  
  894.       case 0x80+0x00+0: BUFCOPY("res b, 0"); break;  
  895.       case 0x80+0x00+1: BUFCOPY("res c, 0"); break;  
  896.       case 0x80+0x00+2: BUFCOPY("res d, 0"); break;  
  897.       case 0x80+0x00+3: BUFCOPY("res e, 0"); break;  
  898.       case 0x80+0x00+4: BUFCOPY("res h, 0"); break;  
  899.       case 0x80+0x00+5: BUFCOPY("res l, 0"); break;  
  900.       case 0x80+0x00+6: BUFCOPY("res (hl), 0"); break;  
  901.       case 0x80+0x00+7: BUFCOPY("res a, 0"); break;  
  902.       case 0x80+0x00+0+8: BUFCOPY("res b, 1"); break;  
  903.       case 0x80+0x00+1+8: BUFCOPY("res c, 1"); break;  
  904.       case 0x80+0x00+2+8: BUFCOPY("res d, 1"); break;  
  905.       case 0x80+0x00+3+8: BUFCOPY("res e, 1"); break;  
  906.       case 0x80+0x00+4+8: BUFCOPY("res h, 1"); break;  
  907.       case 0x80+0x00+5+8: BUFCOPY("res l, 1"); break;  
  908.       case 0x80+0x00+6+8: BUFCOPY("res (hl), 1"); break;  
  909.       case 0x80+0x00+7+8: BUFCOPY("res a, 1"); break;  
  910.  
  911.       case 0x80+0x10+0: BUFCOPY("res b, 2"); break;  
  912.       case 0x80+0x10+1: BUFCOPY("res c, 2"); break;  
  913.       case 0x80+0x10+2: BUFCOPY("res d, 2"); break;  
  914.       case 0x80+0x10+3: BUFCOPY("res e, 2"); break;  
  915.       case 0x80+0x10+4: BUFCOPY("res h, 2"); break;  
  916.       case 0x80+0x10+5: BUFCOPY("res l, 2"); break;  
  917.       case 0x80+0x10+6: BUFCOPY("res (hl), 2"); break;  
  918.       case 0x80+0x10+7: BUFCOPY("res a, 2"); break;  
  919.       case 0x80+0x10+0+8: BUFCOPY("res b, 3"); break;  
  920.       case 0x80+0x10+1+8: BUFCOPY("res c, 3"); break;  
  921.       case 0x80+0x10+2+8: BUFCOPY("res d, 3"); break;  
  922.       case 0x80+0x10+3+8: BUFCOPY("res e, 3"); break;  
  923.       case 0x80+0x10+4+8: BUFCOPY("res h, 3"); break;  
  924.       case 0x80+0x10+5+8: BUFCOPY("res l, 3"); break;  
  925.       case 0x80+0x10+6+8: BUFCOPY("res (hl), 3"); break;  
  926.       case 0x80+0x10+7+8: BUFCOPY("res a, 3"); break;  
  927.    
  928.       case 0x80+0x20+0: BUFCOPY("res b, 4"); break;  
  929.       case 0x80+0x20+1: BUFCOPY("res c, 4"); break;  
  930.       case 0x80+0x20+2: BUFCOPY("res d, 4"); break;  
  931.       case 0x80+0x20+3: BUFCOPY("res e, 4"); break;  
  932.       case 0x80+0x20+4: BUFCOPY("res h, 4"); break;  
  933.       case 0x80+0x20+5: BUFCOPY("res l, 4"); break;  
  934.       case 0x80+0x20+6: BUFCOPY("res (hl), 4"); break;  
  935.       case 0x80+0x20+7: BUFCOPY("res a, 4"); break;  
  936.       case 0x80+0x20+0+8: BUFCOPY("res b, 5"); break;  
  937.       case 0x80+0x20+1+8: BUFCOPY("res c, 5"); break;  
  938.       case 0x80+0x20+2+8: BUFCOPY("res d, 5"); break;  
  939.       case 0x80+0x20+3+8: BUFCOPY("res e, 5"); break;  
  940.       case 0x80+0x20+4+8: BUFCOPY("res h, 5"); break;  
  941.       case 0x80+0x20+5+8: BUFCOPY("res l, 5"); break;  
  942.       case 0x80+0x20+6+8: BUFCOPY("res (hl), 5"); break;  
  943.       case 0x80+0x20+7+8: BUFCOPY("res a, 5"); break;  
  944.    
  945.       case 0x80+0x30+0: BUFCOPY("sres b, 6"); break;  
  946.       case 0x80+0x30+1: BUFCOPY("sres c, 6"); break;  
  947.       case 0x80+0x30+2: BUFCOPY("sres d, 6"); break;  
  948.       case 0x80+0x30+3: BUFCOPY("sres e, 6"); break;  
  949.       case 0x80+0x30+4: BUFCOPY("sres h, 6"); break;  
  950.       case 0x80+0x30+5: BUFCOPY("sres l, 6"); break;  
  951.       case 0x80+0x30+6: BUFCOPY("sres (hl), 6"); break;  
  952.       case 0x80+0x30+7: BUFCOPY("sres a, 6"); break;  
  953.       case 0x80+0x30+0+8: BUFCOPY("res b, 7"); break;  
  954.       case 0x80+0x30+1+8: BUFCOPY("res c, 7"); break;  
  955.       case 0x80+0x30+2+8: BUFCOPY("res d, 7"); break;  
  956.       case 0x80+0x30+3+8: BUFCOPY("res e, 7"); break;  
  957.       case 0x80+0x30+4+8: BUFCOPY("res h, 7"); break;  
  958.       case 0x80+0x30+5+8: BUFCOPY("res l, 7"); break;  
  959.       case 0x80+0x30+6+8: BUFCOPY("res (hl), 7"); break;  
  960.       case 0x80+0x30+7+8: BUFCOPY("res a, 7"); break;
  961.  
  962.       case 0xC0+0x00+0: BUFCOPY("set b, 0"); break;  
  963.       case 0xC0+0x00+1: BUFCOPY("set c, 0"); break;  
  964.       case 0xC0+0x00+2: BUFCOPY("set d, 0"); break;  
  965.       case 0xC0+0x00+3: BUFCOPY("set e, 0"); break;  
  966.       case 0xC0+0x00+4: BUFCOPY("set h, 0"); break;  
  967.       case 0xC0+0x00+5: BUFCOPY("set l, 0"); break;  
  968.       case 0xC0+0x00+6: BUFCOPY("set (hl), 0"); break;  
  969.       case 0xC0+0x00+7: BUFCOPY("set a, 0"); break;  
  970.       case 0xC0+0x00+0+8: BUFCOPY("set b, 1"); break;  
  971.       case 0xC0+0x00+1+8: BUFCOPY("set c, 1"); break;  
  972.       case 0xC0+0x00+2+8: BUFCOPY("set d, 1"); break;  
  973.       case 0xC0+0x00+3+8: BUFCOPY("set e, 1"); break;  
  974.       case 0xC0+0x00+4+8: BUFCOPY("set h, 1"); break;  
  975.       case 0xC0+0x00+5+8: BUFCOPY("set l, 1"); break;  
  976.       case 0xC0+0x00+6+8: BUFCOPY("set (hl), 1"); break;  
  977.       case 0xC0+0x00+7+8: BUFCOPY("set a, 1"); break;  
  978.  
  979.       case 0xC0+0x10+0: BUFCOPY("set b, 2"); break;  
  980.       case 0xC0+0x10+1: BUFCOPY("set c, 2"); break;  
  981.       case 0xC0+0x10+2: BUFCOPY("set d, 2"); break;  
  982.       case 0xC0+0x10+3: BUFCOPY("set e, 2"); break;  
  983.       case 0xC0+0x10+4: BUFCOPY("set h, 2"); break;  
  984.       case 0xC0+0x10+5: BUFCOPY("set l, 2"); break;  
  985.       case 0xC0+0x10+6: BUFCOPY("set (hl), 2"); break;  
  986.       case 0xC0+0x10+7: BUFCOPY("set a, 2"); break;  
  987.       case 0xC0+0x10+0+8: BUFCOPY("set b, 3"); break;  
  988.       case 0xC0+0x10+1+8: BUFCOPY("set c, 3"); break;  
  989.       case 0xC0+0x10+2+8: BUFCOPY("set d, 3"); break;  
  990.       case 0xC0+0x10+3+8: BUFCOPY("set e, 3"); break;  
  991.       case 0xC0+0x10+4+8: BUFCOPY("set h, 3"); break;  
  992.       case 0xC0+0x10+5+8: BUFCOPY("set l, 3"); break;  
  993.       case 0xC0+0x10+6+8: BUFCOPY("set (hl), 3"); break;  
  994.       case 0xC0+0x10+7+8: BUFCOPY("set a, 3"); break;  
  995.    
  996.       case 0xC0+0x20+0: BUFCOPY("set b, 4"); break;  
  997.       case 0xC0+0x20+1: BUFCOPY("set c, 4"); break;  
  998.       case 0xC0+0x20+2: BUFCOPY("set d, 4"); break;  
  999.       case 0xC0+0x20+3: BUFCOPY("set e, 4"); break;  
  1000.       case 0xC0+0x20+4: BUFCOPY("set h, 4"); break;  
  1001.       case 0xC0+0x20+5: BUFCOPY("set l, 4"); break;  
  1002.       case 0xC0+0x20+6: BUFCOPY("set (hl), 4"); break;  
  1003.       case 0xC0+0x20+7: BUFCOPY("set a, 4"); break;  
  1004.       case 0xC0+0x20+0+8: BUFCOPY("set b, 5"); break;  
  1005.       case 0xC0+0x20+1+8: BUFCOPY("set c, 5"); break;  
  1006.       case 0xC0+0x20+2+8: BUFCOPY("set d, 5"); break;  
  1007.       case 0xC0+0x20+3+8: BUFCOPY("set e, 5"); break;  
  1008.       case 0xC0+0x20+4+8: BUFCOPY("set h, 5"); break;  
  1009.       case 0xC0+0x20+5+8: BUFCOPY("set l, 5"); break;  
  1010.       case 0xC0+0x20+6+8: BUFCOPY("set (hl), 5"); break;  
  1011.       case 0xC0+0x20+7+8: BUFCOPY("set a, 5"); break;  
  1012.    
  1013.       case 0xC0+0x30+0: BUFCOPY("set b, 6"); break;  
  1014.       case 0xC0+0x30+1: BUFCOPY("set c, 6"); break;  
  1015.       case 0xC0+0x30+2: BUFCOPY("set d, 6"); break;  
  1016.       case 0xC0+0x30+3: BUFCOPY("set e, 6"); break;  
  1017.       case 0xC0+0x30+4: BUFCOPY("set h, 6"); break;  
  1018.       case 0xC0+0x30+5: BUFCOPY("set l, 6"); break;  
  1019.       case 0xC0+0x30+6: BUFCOPY("set (hl), 6"); break;  
  1020.       case 0xC0+0x30+7: BUFCOPY("set a, 6"); break;  
  1021.       case 0xC0+0x30+0+8: BUFCOPY("set b, 7"); break;  
  1022.       case 0xC0+0x30+1+8: BUFCOPY("set c, 7"); break;  
  1023.       case 0xC0+0x30+2+8: BUFCOPY("set d, 7"); break;  
  1024.       case 0xC0+0x30+3+8: BUFCOPY("set e, 7"); break;  
  1025.       case 0xC0+0x30+4+8: BUFCOPY("set h, 7"); break;  
  1026.       case 0xC0+0x30+5+8: BUFCOPY("set l, 7"); break;  
  1027.       case 0xC0+0x30+6+8: BUFCOPY("set (hl), 7"); break;  
  1028.       case 0xC0+0x30+7+8: BUFCOPY("set a, 7"); break;
  1029.       default:
  1030.         assert (0);
  1031.       }
  1032.       break;
  1033.     default:
  1034.       assert (0);
  1035.     }
  1036.     isec->addr = addrcount;
  1037.     isec->instr_len = cpu_lens[opcode];
  1038.     isec->opcode[0] = opcode;
  1039.     isec->opcode[1] = opcode2;
  1040.     addrcount += cpu_lens[opcode];
  1041.     list_insert (bankdis->instr_list, -1, isec);
  1042.   }
  1043.   return 0;
  1044. }
  1045.  
  1046. int lr35902_bankout (FILE *output /* offset setted */, struct bank_disassembler *bankdis, int bankid) {
  1047.  
  1048.   /* set attach */
  1049.   struct list_v *p;
  1050.   ks_int id;
  1051.  
  1052.   LIST_FOREACH (bankdis->armark_list, id, p) {
  1053.     struct addrmark *mk = (struct addrmark *) p->obj;
  1054.     struct list_v *p2;
  1055.     ks_int id2;
  1056.     LIST_FOREACH (bankdis->instr_list, id2, p2) {
  1057.       struct instr_sec *is  = (struct instr_sec *) p2->obj;
  1058.       if (is->addr >= mk->baddr) {
  1059.         if (is->addr == mk->baddr)
  1060.           is->attach = mk;
  1061.         break;
  1062.       }
  1063.     }
  1064.   }
  1065.   /* output distext */
  1066.   fprintf (output, "================ BANK %d Start ================ \n", bankid);
  1067.   LIST_FOREACH (bankdis->instr_list, id, p) {
  1068.     struct instr_sec *is  = (struct instr_sec *) p->obj;
  1069.     struct addrmark_n *amn;
  1070.     struct list_v *p2;
  1071.     ks_int id2;
  1072.     if (is->attach != ks_null) {
  1073.       /* out ref list */
  1074.       if (is->attach->refcall_tracker != ks_null && is->attach->refcall_tracker->nums > 0) {
  1075.         fprintf (output, "%%%d:%04x sub_%04x: ", bankid, is->addr, is->addr);
  1076.         LIST_FOREACH (is->attach->refcall_tracker, id2, p2) {
  1077.           amn = (struct addrmark_n *) p2->obj;
  1078.           if (amn->ccbranch != ks_false)
  1079.             fprintf (output, "$%%%04x ", amn->addr);
  1080.           else
  1081.             fprintf (output, ">%%%04x ", amn->addr);
  1082.         }
  1083.         fprintf (output, "\n");
  1084.       }
  1085.       if (is->attach->reflong_tracker != ks_null && is->attach->reflong_tracker->nums > 0) {
  1086.         fprintf (output, "%%%d:%04x long_%04x: ", bankid, is->addr, is->addr);
  1087.         LIST_FOREACH (is->attach->reflong_tracker, id2, p2) {
  1088.           amn = (struct addrmark_n *) p2->obj;
  1089.           if (amn->ccbranch != ks_false)
  1090.             fprintf (output, "$%%%04x ", amn->addr);
  1091.           else
  1092.             fprintf (output, ">%%%04x ", amn->addr);
  1093.         }
  1094.         fprintf (output, "\n");
  1095.       }
  1096.       if (is->attach->refshort_tracker != ks_null && is->attach->refshort_tracker->nums > 0) {
  1097.         fprintf (output, "%%%d:%04x loc_%04x: ", bankid, is->addr, is->addr);
  1098.         LIST_FOREACH (is->attach->refshort_tracker, id2, p2) {
  1099.           amn = (struct addrmark_n *) p2->obj;
  1100.           if (amn->ccbranch != ks_false)
  1101.             fprintf (output, "$%%%04x ", amn->addr);
  1102.           else
  1103.             fprintf (output, ">%%%04x ", amn->addr);
  1104.         }
  1105.         fprintf (output, "\n");
  1106.       }
  1107.     }
  1108. # if 0
  1109.     fprintf (output, "%%%04x %02x ", is->addr, is->opcode[0]);
  1110.     if (is->instr_len == 2)
  1111.       fprintf (output, "%02x ", is->opcode[1]);
  1112.     fprintf (output, "%s \n", is->opdesc);
  1113. #else
  1114.     fprintf (output, "%%%d:%04x ", bankid, is->addr);
  1115.     fprintf (output, "                %s \n", is->opdesc);
  1116. #endif
  1117.   }
  1118.   fprintf (output, "================ BANK %d End ==================\n", bankid);
  1119.   return 0;
  1120. }
  1121.  
  1122. int
  1123. lr35902_disassembler2 (host_char *path_r, host_char *path_w) {
  1124.  
  1125.   struct bank_disassembler bkdis;
  1126.   struct romheader *prh;
  1127.   int sig = -1;
  1128.   FILE *output = ks_null;
  1129.   ks_int promsize;
  1130.   ks_int sramsize;
  1131.   ks_int id;
  1132.   ks_uint8 *buf = ks_null;
  1133.   ks_int32 fsize = -1;
  1134.   ks_bool sgb_done, dmg_done, cgb_done;
  1135.   char cac;
  1136.   char title16[17];
  1137.   char title15[16];
  1138.   char title11[12];
  1139.   char *ctype = "no adapter";
  1140.   char *lic = "no adapter";
  1141.  
  1142.   static ks_uint8 nintendo_magicnumber[] =
  1143.   { 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D,
  1144.     0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E, 0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99,
  1145.     0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E };
  1146.  
  1147. # if defined (_WIN32)
  1148.   HANDLE win32fd = INVALID_HANDLE_VALUE;
  1149.   HANDLE win32mmap = INVALID_HANDLE_VALUE;
  1150.   DWORD dwCalcLow,dwCalcHigh;
  1151. # endif
  1152.  
  1153. # if defined (_WIN32)
  1154.   if ( (win32fd = CreateFile (  path_r,
  1155.                       GENERIC_READ, /*source only read */
  1156.                       FILE_SHARE_READ,  
  1157.                       NULL,      
  1158.                       OPEN_EXISTING,
  1159.                       FILE_ATTRIBUTE_READONLY,    
  1160.                       NULL )) == INVALID_HANDLE_VALUE)
  1161.     return -1;
  1162.   if ((dwCalcLow = GetFileSize (win32fd, & dwCalcHigh)) <= 0x4000) {
  1163.     CloseHandle (win32fd);
  1164.     return -1;
  1165.   }
  1166.   win32mmap = CreateFileMappingW
  1167.        ( win32fd, NULL, PAGE_READONLY,
  1168.           dwCalcHigh,      
  1169.           dwCalcLow,  
  1170.           NULL );
  1171.   assert (win32mmap != INVALID_HANDLE_VALUE);
  1172.   buf = (ks_uint8 *)MapViewOfFile (win32mmap, FILE_MAP_READ, 0, 0, 0);
  1173.   assert (buf != NULL);
  1174.   prh = (struct romheader *)& buf[0x134];
  1175.   if (memcmp (& buf[0x104],
  1176.                 nintendo_magicnumber, sizeof (nintendo_magicnumber) != 0))
  1177.     goto __cleanup;
  1178.   else ;
  1179.  
  1180.   switch (prh->promsize) {
  1181.   case 0x00: promsize = 2; break;
  1182.   case 0x01: promsize = 4; break;
  1183.   case 0x02: promsize = 8; break;
  1184.   case 0x03: promsize =16; break;
  1185.   case 0x04: promsize =32; break;
  1186.   case 0x05: promsize =64; break;
  1187.   case 0x06: promsize =128; break;
  1188.   case 0x07: promsize =256; break;
  1189.   case 0x08: promsize =512; break;
  1190.   case 0x52: promsize =72; break;
  1191.   case 0x53: promsize =80; break;
  1192.   case 0x54: promsize =96; break;
  1193.   default : goto __cleanup;
  1194.   }
  1195.  
  1196.   if (dwCalcLow != (0x4000 * promsize))
  1197.     goto __cleanup;
  1198.   else ;
  1199.  
  1200. #ifdef UCS2
  1201.   output = _wfopen (path_w,  L"wb");
  1202. #else
  1203.   output = fopen (path_w,  "wb"));
  1204. #endif
  1205.   if (output == NULL)
  1206.     goto __cleanup;
  1207.   else ;
  1208.   memset (title16, 0, sizeof (title16));
  1209.   memset (title15, 0, sizeof (title15));
  1210.   memset (title11, 0, sizeof (title11));
  1211.  
  1212.   /* get title */
  1213.   for (id = 0; id != 16; id++) {
  1214.     title16[id] = prh->title[id];
  1215.     title16[id] &= 0x7F;
  1216.     if (id < 15)
  1217.       title15[id] = title16[id];
  1218.     if (id < 11)
  1219.       title11[id] = title16[id];
  1220.   }
  1221.   /* assert cgb */
  1222.   cac = prh->title[15];
  1223.   if (cac & 0x80) {
  1224.     cgb_done = ks_true;
  1225.     if (cac & 0x40)
  1226.       dmg_done = ks_false;
  1227.     else
  1228.       dmg_done = ks_true;
  1229.   } else {
  1230.     cgb_done = ks_false;
  1231.     dmg_done = ks_true;
  1232.   }
  1233.   /* assert sgb */
  1234.   if (prh->sgb == 3)
  1235.     sgb_done = ks_true;
  1236.   else
  1237.     sgb_done = ks_false;
  1238.   /*
  1239.    * get cart type */
  1240.   kinit ();
  1241.   ctype = g_lutctype[prh->ctype];
  1242.   if (prh->anclic == 0x33) {
  1243.     // new lic
  1244.     char v[3];
  1245.     v[2] = 0;
  1246.     *((short *)v) = prh->curlic;
  1247.     lic = g_lutcurlic[atoi (v)];
  1248.   } else {
  1249.     lic = g_lutanclic[prh->anclic];
  1250.   }
  1251.   switch (prh->ramsize) {
  1252.   case 0x00: sramsize = 0; break;
  1253.   case 0x01: sramsize =-1; break; /* 2K */
  1254.   case 0x02: sramsize = 1; break;
  1255.   case 0x03: sramsize = 4; break;
  1256.   case 0x04: sramsize =16; break;
  1257.   case 0x05: sramsize = 8; break;
  1258.   default : goto __cleanup;
  1259.   }
  1260.   fprintf (output,
  1261.    ">!\n"\
  1262.    "  KS3578:: GBZ80 Static Disassembler - moecmks\n"\
  1263.    "  |\n"\
  1264.    "  rominfos:\n"\
  1265.    "     \\.__ title16:%s\n"\
  1266.    "     \\.__ title15:%s\n"\
  1267.    "     \\.__ title11:%s\n"\
  1268.    "     \\.__ manufacturer code: %08X\n"\
  1269.    "     \\.__ cgbbyte: %02X\n"\
  1270.    "     \\.__ cartridge type:%s\n"\
  1271.    "     \\.__ licensee:%s\n"\
  1272.    "     \\.__ promsize:%d\n"\
  1273.    "     \\.__ ramsize:%d\n"\
  1274.    "     \\.__ target code:%s\n"\
  1275.    "     \\.__ dmg support:%s\n"\
  1276.    "     \\.__ cgb support:%s\n"\
  1277.    "     \\.__ sgb support:%s\n"\
  1278.    "     \\.__ markv:%02x\n"\
  1279.    "     \\.__ hdcrc:%02x\n"\
  1280.    "     \\.__ gcrc:%04x\n"\
  1281.    "  |____________________________________\n"\
  1282.    "!<\n\n",
  1283.    title16, /* title */
  1284.    title15, /* title */
  1285.    title11, /* title */
  1286.    *(unsigned int *)& title16[11],
  1287.    (unsigned char)prh->title[15],
  1288.    ctype,
  1289.    lic, /* licensee*/
  1290.    promsize,
  1291.    sramsize,
  1292.    (prh->targetcode == 0) ? "japanese" :"non-japanese",
  1293.    dmg_done ? "true" : "false",
  1294.    cgb_done ? "true" : "false",
  1295.    sgb_done ? "true" : "false",
  1296.    prh->maskver,
  1297.    prh->hdcrc,
  1298.    prh->gcrc);
  1299.    
  1300.   /* disbanlk */
  1301.   for (id = 0; id != promsize; id++ ){
  1302.  
  1303.     list_init (& bkdis.armark_list);
  1304.     list_init (& bkdis.instr_list);
  1305.  
  1306.     lr35902_getaddrmark ((char *)buf, id, bkdis.armark_list);
  1307.     lr35902_bankdis ((char *)buf, id, & bkdis);
  1308.     lr35902_bankout (output, & bkdis, id);
  1309.   }
  1310. __cleanup:
  1311.   if (buf != NULL)
  1312.     UnmapViewOfFile (buf);
  1313.   if (win32mmap != NULL)
  1314.     CloseHandle (win32mmap);
  1315.   if (win32fd != NULL)
  1316.     CloseHandle (win32fd);
  1317.   if (output != NULL)
  1318.     fclose (output);
  1319.   return sig;
  1320.  
  1321.  
  1322. # endif
  1323.   return sig;
  1324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement