From 57a609f97433cd328ee0c8b3ac5a2c915c90c835 Mon Sep 17 00:00:00 2001 From: dkeruza-neo Date: Sat, 4 Jan 2025 02:08:58 +0100 Subject: [PATCH] MJ4 support and Rambo res patch. --- src/lindbergh/baseboard.c | 1 - src/lindbergh/config.c | 26 +++ src/lindbergh/config.h | 6 +- src/lindbergh/hook.c | 13 ++ src/lindbergh/input.c | 94 ++++++++ src/lindbergh/patch.c | 77 +++++++ src/lindbergh/resolution.c | 35 ++- src/lindbergh/sdlcalls.c | 28 +-- src/lindbergh/serial.c | 83 -------- src/lindbergh/serial.h | 3 - src/lindbergh/shader_patches.c | 15 ++ src/lindbergh/shader_work/mj4.h | 319 ++++++++++++++++++++++++++++ src/lindbergh/shader_work/shaders.h | 1 + 13 files changed, 582 insertions(+), 119 deletions(-) delete mode 100644 src/lindbergh/serial.c delete mode 100644 src/lindbergh/serial.h create mode 100644 src/lindbergh/shader_work/mj4.h diff --git a/src/lindbergh/baseboard.c b/src/lindbergh/baseboard.c index 9615303..a5c3cae 100644 --- a/src/lindbergh/baseboard.c +++ b/src/lindbergh/baseboard.c @@ -10,7 +10,6 @@ #include "config.h" #include "jvs.h" -#include "serial.h" #include "passthrough.h" #define SERIAL_STRING "FE11-X018012022X" diff --git a/src/lindbergh/config.c b/src/lindbergh/config.c index b075190..447da67 100644 --- a/src/lindbergh/config.c +++ b/src/lindbergh/config.c @@ -860,6 +860,28 @@ static int detectGame(uint32_t elf_crc) } break; + case MJ4_REVG: + { + config.gameTitle = "SEGA Network Taisen Mahjong MJ4"; + config.gameDVP = "DVP-0049G"; + config.gameID = "SBPN"; + config.gameStatus = WORKING; + config.gameType = MAHJONG; + return 0; + } + break; + + case MJ4_EVO: + { + config.gameTitle = "SEGA Network Taisen Mahjong MJ4 Evolution"; + config.gameDVP = "DVP-0081"; + config.gameID = "SBTA"; + config.gameStatus = WORKING; + config.gameType = MAHJONG; + return 0; + } + break; + default: { config.crc32 = UNKNOWN; @@ -1042,6 +1064,9 @@ int readConfig(FILE *configFile, EmulatorConfig *config) else if (strcmp(command, "PRIMEVAL_HUNT_MODE") == 0) config->phMode = atoi(getNextToken(NULL, " ", &saveptr)); + else if (strcmp(command, "MJ4_ENABLED_ALL_THE_TIME") == 0) + config->phMode = atoi(getNextToken(NULL, " ", &saveptr)); + else if (strcmp(command, "TEST_KEY") == 0) config->keymap.test = atoi(getNextToken(NULL, " ", &saveptr)); @@ -1308,6 +1333,7 @@ int initConfig() config.fpsTarget = 60; config.noSDL = 0; config.phMode = 1; + config.mj4EnabledAtT = 0; memset(&config.arcadeInputs.analogue_deadzone_start, 0, sizeof(config.arcadeInputs.analogue_deadzone_start)); memset(&config.arcadeInputs.analogue_deadzone_middle, 0, sizeof(config.arcadeInputs.analogue_deadzone_middle)); memset(&config.arcadeInputs.analogue_deadzone_end, 0, sizeof(config.arcadeInputs.analogue_deadzone_end)); diff --git a/src/lindbergh/config.h b/src/lindbergh/config.h index 9a6c1aa..8c42a2a 100644 --- a/src/lindbergh/config.h +++ b/src/lindbergh/config.h @@ -34,6 +34,8 @@ #define LETS_GO_JUNGLE 0xb1c8c901 // DVP-0011 #define LETS_GO_JUNGLE_REVA 0xc697c4fb // DVP-0011A #define LETS_GO_JUNGLE_SPECIAL 0x240beedc // DVP-0036A +#define MJ4_REVG 0x57813a7 // DVP-0049G +#define MJ4_EVO 0xb785a0e9 // DVP-0081 #define OUTRUN_2_SP_SDX 0x92c196d5 // DVP-0015 #define OUTRUN_2_SP_SDX_REVA 0x4debd5f0 // DVP-0015A #define OUTRUN_2_SP_SDX_REVA_TEST 0x6b2d5c46 // DVP-0015A @@ -112,7 +114,8 @@ typedef enum DRIVING, HARLEY, FIGHTING, - ABC + ABC, + MAHJONG } GameType; typedef enum @@ -254,6 +257,7 @@ typedef struct int lgjRenderWithMesa; int noSDL; int phMode; + int mj4EnabledAtT; ArcadeInputs arcadeInputs; int inputMode; // 0 = both, 1 = SDL/X11 only, 2 = EVDEV only int skipOutrunCabinetCheck; diff --git a/src/lindbergh/hook.c b/src/lindbergh/hook.c index a6f3002..bc1869a 100644 --- a/src/lindbergh/hook.c +++ b/src/lindbergh/hook.c @@ -1031,6 +1031,19 @@ char *__strdup(const char *string) return ___strdup(string); } +struct tm *localtime_r(const time_t *timep, struct tm *result) +{ + struct tm *(*_localtime_r)(const time_t *, struct tm *) = + (struct tm * (*)(const time_t *, struct tm *)) dlsym(RTLD_NEXT, "localtime_r"); + + if ((getConfig()->crc32 == MJ4_REVG || getConfig()->crc32 == MJ4_EVO) && getConfig()->mj4EnabledAtT == 1) + { + time_t target_time = 1735286445; + struct tm *res = _localtime_r(&target_time, result); + return res; + } + return _localtime_r(timep, result); +} /** * @brief Prints formatted text in a way that avoids spamming identical lines. diff --git a/src/lindbergh/input.c b/src/lindbergh/input.c index 05a6de9..48425c6 100644 --- a/src/lindbergh/input.c +++ b/src/lindbergh/input.c @@ -654,6 +654,97 @@ void sdlEventABC(SDL_Event *event) } } +void sdlEventMahjong(SDL_Event *event) +{ + switch (event->type) + { + case SDL_KEYDOWN: + case SDL_KEYUP: + { + if (event->key.keysym.sym == SDLK_t) + setSwitch(SYSTEM, BUTTON_TEST, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_s) + setSwitch(PLAYER_1, BUTTON_SERVICE, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_5) + incrementCoin(PLAYER_1, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_1) + setSwitch(PLAYER_1, BUTTON_START, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_a) + setSwitch(PLAYER_1, BUTTON_RIGHT, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_b) + setSwitch(PLAYER_1, BUTTON_LEFT, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_c) + setSwitch(PLAYER_1, BUTTON_UP, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_d) + setSwitch(PLAYER_1, BUTTON_DOWN, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_e) + setSwitch(PLAYER_1, BUTTON_1, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_f) + setSwitch(PLAYER_1, BUTTON_2, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_g) + setSwitch(PLAYER_1, BUTTON_3, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_h) + setSwitch(PLAYER_1, BUTTON_4, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_i) + setSwitch(PLAYER_1, BUTTON_5, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_j) + setSwitch(PLAYER_1, BUTTON_6, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_k) + setSwitch(PLAYER_1, BUTTON_7, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_l) + setSwitch(PLAYER_2, BUTTON_RIGHT, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_m) + setSwitch(PLAYER_2, BUTTON_LEFT, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_n) + setSwitch(PLAYER_2, BUTTON_UP, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_o) + setSwitch(PLAYER_2, BUTTON_DOWN, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_p) + setSwitch(PLAYER_2, BUTTON_1, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_q) + setSwitch(PLAYER_2, BUTTON_2, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_r) + setSwitch(PLAYER_2, BUTTON_3, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_u) + setSwitch(PLAYER_2, BUTTON_4, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_v) + setSwitch(PLAYER_2, BUTTON_5, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_w) + setSwitch(PLAYER_2, BUTTON_6, event->type == SDL_KEYDOWN); + + else if (event->key.keysym.sym == SDLK_x) + setSwitch(PLAYER_2, BUTTON_7, event->type == SDL_KEYDOWN); + } + break; + default: + break; + } +} + void handleSdlEvents(SDL_Event *event) { // Return now if we're not emulating JVS or if EVDEV-only mode is enabled @@ -675,6 +766,9 @@ void handleSdlEvents(SDL_Event *event) case ABC: sdlEventABC(event); break; + case MAHJONG: + sdlEventMahjong(event); + break; default: // return XNextEventShooting(display, event_return, returnValue); break; diff --git a/src/lindbergh/patch.c b/src/lindbergh/patch.c index fd564ed..9fec36c 100644 --- a/src/lindbergh/patch.c +++ b/src/lindbergh/patch.c @@ -2932,6 +2932,83 @@ int initPatch() detourFunction(0x0807a9dc, gl_XGetProcAddressARB); } break; + case MJ4_REVG: + { + setVariable(0x0acf85d4, 2); + setVariable(0x0acf85d0, 2); + setVariable(0x0acf85cc, 2); + setVariable(0x0acf85c8, 2); + setVariable(0x0acf85c0, 2); + setVariable(0x0acf85bc, 2); + + // Security + detourFunction(0x08710c0a, amDongleInit); + detourFunction(0x0870f6c5, amDongleIsAvailable); + detourFunction(0x0870f6e2, amDongleIsDevelop); + detourFunction(0x087100bb, amDongleUpdate); + + // Fixes and patches to bypss network check + amDipswContextAddr = (void *)0x0ad224fc; // Address of amDipswContext + detourFunction(0x0870f458, amDipswInit); + detourFunction(0x0870f4dc, amDipswExit); + detourFunction(0x0870f551, amDipswGetData); + detourFunction(0x0870f5c7, amDipswSetLed); + + // detourFunction(0x080e286a, stubRetZero); // skip checks + // detourFunction(0x080ed7f8, stubRetZero); + // patchMemory(0x080e954b, "75"); + // patchMemory(0x08a4cb90, "00"); + // patchMemory(0x080e955d, "909090909090"); // test skip countdown + + // setVariable(0x08534a33, 30); + // setVariable(0x08534a42, 2); + + patchMemory(0x080e2891, "eb"); + patchMemory(0x080ea049, "05"); + patchMemory(0x08a4cb90, "00"); + + patchMemory(0x0872bc4d, "2e2f72616d2f746f2e74787400"); // Patch /home/disk2 folder + patchMemory(0x0872bc64, "2e2f72616d2f66726f6d2e74787400"); // Patch /home/disk2 folder + patchMemory(0x0872bc7d, "2e2f72616d2f2e746d7000"); // Patch /home/disk2 folder + patchMemory(0x0872bccd, "2e2f72616d00"); // Patch /home/disk2 folder + patchMemory(0x0872bcdd, "2e2f666f6f3100"); // Patch /home/disk2 folder + patchMemory(0x0872bcee, "2e2f666f6f3200"); // Patch /home/disk2 folder + patchMemory(0x0872f3de, "2e2f72616d2f746d7000"); // Patch /home/disk2 folder + patchMemory(0x08732fd3, "2e2f00"); // Patch /home/disk2 folder + + // Mesa Patches + if (getConfig()->GPUVendor != NVIDIA_GPU) + { + detourFunction(0x08050ebc, gl_ProgramStringARB); + } + } + break; + case MJ4_EVO: + { + detourFunction(0x08840b61, amDongleInit); + detourFunction(0x0883f3ed, amDongleIsAvailable); + detourFunction(0x0883f40a, amDongleIsDevelop); + detourFunction(0x0883ff0e, amDongleUpdate); + + // Fixes and patches to bypss network check + amDipswContextAddr = (void *)0x0af8ff3c; // Address of amDipswContext + detourFunction(0x0883f180, amDipswInit); + detourFunction(0x0883f204, amDipswExit); + detourFunction(0x0883f279, amDipswGetData); + detourFunction(0x0883f2ef, amDipswSetLed); + + patchMemory(0x080ea0d1, "909090909090"); + detourFunction(0x080e327c, stubRetZero); // skip checks + detourFunction(0x080ee4fa, stubRetZero); + patchMemory(0x080ea0bf, "75"); + patchMemory(0x08c035b8, "00"); + + if (getConfig()->GPUVendor != NVIDIA_GPU) + { + detourFunction(0x08051314, gl_ProgramStringARB); + } + } + break; default: break; } diff --git a/src/lindbergh/resolution.c b/src/lindbergh/resolution.c index 9d6a9e1..38646e6 100644 --- a/src/lindbergh/resolution.c +++ b/src/lindbergh/resolution.c @@ -2167,15 +2167,15 @@ int initResolutionPatches() case RAMBO: { patchMemory(0x080c70d0, "9090909090"); // setresolutiontype - patchMemory(0x08416df0, "5005"); // render res + setVariable(0x08416df0, getConfig()->width); // render res + setVariable(0x08416d60, getConfig()->width); // main res + setVariable(0x08416d64, getConfig()->height); + patchMemory(0x08416d68, "5005"); // Allwinres + patchMemory(0x08416d6c, "0003"); - // With this method you can get FullHD, but is very buggy. - // patchMemory(0x080c70d0, "9090909090"); // setresolutiontype - // patchMemory(0x08416df0, "8007"); // render res - // patchMemory(0x08416d60, "8007"); // main res - // patchMemory(0x08416d64, "3804"); - // patchMemory(0x08416d68, "8002"); // Allwinres - // patchMemory(0x08416d6c, "E001"); + patchMemory(0x080ef960, "66ff"); // 2d + patchMemory(0x0806b510, "b6"); // proper marker fix + // patchMemory(0x0806b4f6, "c3"); //get rid of shot marker } break; case TOO_SPICY: @@ -2338,6 +2338,25 @@ int initResolutionPatches() replaceCallAtAddress(0x0816355d, hummerRespatch); } break; + case MJ4_REVG: + { + // Not Supported yet. + // patchMemory(0x080524a1, "01"); // Enable Anti Alias + // patchMemory(0x08053668, "b80a000000"); // Skips resolution set by the Dip Switches. + // vf5FSwidth = (getConfig()->height * 4) / 3; + // setVariable(0x08901598, vf5FSwidth); + // setVariable(0x0890159c, getConfig()->height); + // setVariable(0x089015a4, vf5FSwidth); + + // setVariable(0x089015a8, getConfig()->height); + + // setVariable(0x08901544, vf5FSwidth); + // setVariable(0x08901548, getConfig()->height); + + // setVariable(0x0890158c, vf5FSwidth); + // setVariable(0x08901590, getConfig()->height); + } + break; default: break; } diff --git a/src/lindbergh/sdlcalls.c b/src/lindbergh/sdlcalls.c index 9f9aca4..d0cfdf6 100644 --- a/src/lindbergh/sdlcalls.c +++ b/src/lindbergh/sdlcalls.c @@ -77,11 +77,11 @@ void glutInitSDL(int *argcp, char **argv) SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); // Set the alpha size to 8 bits if (gId == AFTER_BURNER_CLIMAX || gId == AFTER_BURNER_CLIMAX_REVA || gId == AFTER_BURNER_CLIMAX_REVB || gId == AFTER_BURNER_CLIMAX_SDX || gId == AFTER_BURNER_CLIMAX_SDX_REVA || gId == AFTER_BURNER_CLIMAX_SE || - gId == AFTER_BURNER_CLIMAX_SE_REVA || gId == R_TUNED || gId == VIRTUA_FIGHTER_5 || - gId == VIRTUA_FIGHTER_5_REVA || gId == VIRTUA_FIGHTER_5_REVB || gId == VIRTUA_FIGHTER_5_REVE || - gId == VIRTUA_FIGHTER_5_EXPORT || gId == VIRTUA_FIGHTER_5_R || gId == VIRTUA_FIGHTER_5_R_REVD || gId == VIRTUA_FIGHTER_5_R_REVG || - gId == VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVA || gId == VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVB || - gId == VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVB_6000 || gId == GHOST_SQUAD_EVOLUTION || gId == SEGA_RACE_TV) + gId == AFTER_BURNER_CLIMAX_SE_REVA || gId == R_TUNED || gId == VIRTUA_FIGHTER_5 || gId == VIRTUA_FIGHTER_5_REVA || + gId == VIRTUA_FIGHTER_5_REVB || gId == VIRTUA_FIGHTER_5_REVE || gId == VIRTUA_FIGHTER_5_EXPORT || gId == VIRTUA_FIGHTER_5_R || + gId == VIRTUA_FIGHTER_5_R_REVD || gId == VIRTUA_FIGHTER_5_R_REVG || gId == VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVA || + gId == VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVB || gId == VIRTUA_FIGHTER_5_FINAL_SHOWDOWN_REVB_6000 || gId == GHOST_SQUAD_EVOLUTION || + gId == SEGA_RACE_TV || gId == MJ4_REVG || gId == MJ4_EVO) { SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); } @@ -105,18 +105,6 @@ void glutInitSDL(int *argcp, char **argv) exit(1); } - // glEnable(GL_DEBUG_OUTPUT); - // glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); // Make the callback synchronous - - // // Set the callback function - // glDebugMessageCallback(openglDebugCallback2, NULL); - - // // Example: generate a test message (optional, remove in production) - // glDebugMessageInsert( - // GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 1, GL_DEBUG_SEVERITY_HIGH, -1, - // "Test message from " - // "application!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1"); - printf(" SDL RESOLUTION: %dx%d\n\n", getConfig()->width, getConfig()->height); if (getConfig()->fullscreen) @@ -154,12 +142,6 @@ void pollEvents() { SDL_Quit(); } - // if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) - // { - // int newWidth = event.window.data1; - // int newHeight = event.window.data2; - // handleResize(newWidth, newHeight); - // } break; default: break; diff --git a/src/lindbergh/serial.c b/src/lindbergh/serial.c deleted file mode 100644 index 1b137eb..0000000 --- a/src/lindbergh/serial.c +++ /dev/null @@ -1,83 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "serial.h" - -#define TIMEOUT_SELECT 200 - -int setSerialAttributes(int fd, int myBaud) -{ - struct termios options; - int status; - tcgetattr(fd, &options); - - cfmakeraw(&options); - cfsetispeed(&options, myBaud); - cfsetospeed(&options, myBaud); - - options.c_cflag |= (CLOCAL | CREAD); - options.c_cflag &= ~PARENB; - options.c_cflag &= ~CSTOPB; - options.c_cflag &= ~CSIZE; - options.c_cflag |= CS8; - options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); - options.c_oflag &= ~OPOST; - - options.c_cc[VMIN] = 0; - options.c_cc[VTIME] = 0; // One seconds (10 deciseconds) - - tcsetattr(fd, TCSANOW, &options); - - ioctl(fd, TIOCMGET, &status); - - status |= TIOCM_DTR; - status |= TIOCM_RTS; - - ioctl(fd, TIOCMSET, &status); - - usleep(100 * 1000); // 10mS - - struct serial_struct serial_settings; - - ioctl(fd, TIOCGSERIAL, &serial_settings); - - serial_settings.flags |= ASYNC_LOW_LATENCY; - ioctl(fd, TIOCSSERIAL, &serial_settings); - - tcflush(fd, TCIOFLUSH); - usleep(100 * 1000); // Required to make flush work, for some reason - - return 0; -} - -int readBytes(int fd, unsigned char *buffer, int amount) -{ - fd_set fd_serial; - struct timeval tv; - - FD_ZERO(&fd_serial); - FD_SET(fd, &fd_serial); - - tv.tv_sec = 0; - tv.tv_usec = TIMEOUT_SELECT * 1000; - - int filesReadyToRead = select(fd + 1, &fd_serial, NULL, NULL, &tv); - - if (filesReadyToRead < 1) - return 0; - - if (!FD_ISSET(fd, &fd_serial)) - return 0; - - return read(fd, buffer, amount); -} diff --git a/src/lindbergh/serial.h b/src/lindbergh/serial.h deleted file mode 100644 index b82e4b0..0000000 --- a/src/lindbergh/serial.h +++ /dev/null @@ -1,3 +0,0 @@ - -int setSerialAttributes(int fd, int myBaud); -int readBytes(int fd, unsigned char *buffer, int amount); diff --git a/src/lindbergh/shader_patches.c b/src/lindbergh/shader_patches.c index b60428c..223ad2c 100644 --- a/src/lindbergh/shader_patches.c +++ b/src/lindbergh/shader_patches.c @@ -990,6 +990,21 @@ void gl_ProgramStringARB(int target, int program_fmt, int program_len, char *pro program = newProgram; program_len = newProgramLen; } + else if (gId == MJ4_REVG || gId == MJ4_EVO) + { + char *newProgram; + if (target == GL_VERTEX_PROGRAM_ARB) + { + newProgram = replaceInBlock(program, mj4VsMesa, mj4VsMesaCount, "", ""); + } + else if (target == GL_FRAGMENT_PROGRAM_ARB) + { + newProgram = replaceInBlock(program, mj4FsMesa, mj4FsMesaCount, "", ""); + } + int newProgramLen = strlen(newProgram); + program = newProgram; + program_len = newProgramLen; + } glProgramStringARB(target, program_fmt, program_len, program); if ((gId == VIRTUA_FIGHTER_5 || gId == VIRTUA_FIGHTER_5_REVA || gId == VIRTUA_FIGHTER_5_REVB || diff --git a/src/lindbergh/shader_work/mj4.h b/src/lindbergh/shader_work/mj4.h new file mode 100644 index 0000000..ed966b0 --- /dev/null +++ b/src/lindbergh/shader_work/mj4.h @@ -0,0 +1,319 @@ +#ifndef MJ4_H +#define MJ$_H + +#include "common.h" + +// Fragment +SearchReplace mj4FsMesa[] = { + {"OPTION NV_fragment_program2;", ""}, + {"SHORT TEMP", "TEMP"}, + {"SHORT OUTPUT", "OUTPUT"}, + + {"ADDR ", "ADD "}, + {"DP3R ", "DP3 "}, + {"RSQR ", "RSQ "}, + {"MADR ", "MAD "}, + {"MULR ", "MUL "}, + {"LITR ", "LIT "}, + {"MOVR ", "MOV "}, + {"MINR ", "MIN "}, + {"MAXR ", "MAX "}, + {"SEQR ", "#SEQR "}, + {"RCPR ", "RCP "}, + {"SLTR ", "SLT "}, + {"FLRR ", "FLR "}, + + {"SGERC ", "SGE "}, + {"SEQRC ", "#SEQRC "}, + {"SLTRC ", "SLT "}, + {"MULXC ", "MUL "}, + {"MOVXC ", "MOV "}, + {"SEQX ", "#SEQX "}, + {"MULX ", "MUL "}, + + {"MOVH ", "MOV "}, + {"MINH ", "MIN "}, + {"ADDH ", "ADD "}, + {"MADH ", "MAD "}, + {"MULH ", "MUL "}, + {"DP4H ", "DP4 "}, + {"RSQH ", "RSQ "}, + {"RCPH ", "RCP "}, + {"DP3H ", "DP3 "}, + {"LITH ", "LIT "}, + /*{"DP2H ", "#DP2H "},*/ + + {"MULH_SAT ", "MUL_SAT "}, + {"MULR_SAT ", "MUL_SAT "}, + + {"KIL ", "#KIL "}, + {"(NE.x)", " "}, + {"IF ", "#IF "}, + {"ELSE;", " "}, + {"ENDIF;", " "}, + {"(NE)", " "}, + {"(EQ)", " "}, + {"(EQ.x)", " "}, + + {"POWR ", "POW "}, // MJ4Evo + {"POWH ", "POW "}, + {"MAXH ", "MAX "}, + {"NRMH H4.xyz, fragment.texcoord[4];", + "DP3 H1.x, fragment.texcoord[4], fragment.texcoord[4];RSQ H1.x, H1.x;MUL H4.xyz, fragment.texcoord[4], H1.x;"}, + {"NRMH H6.xyz, fragment.texcoord[3];", + "DP3 H1.x, fragment.texcoord[3], fragment.texcoord[3];RSQ H1.x, H1.x;MUL H6.xyz, fragment.texcoord[3], H1.x;"}, + + {"NRMH H0.xyz, H7;", "DP3 H4.x, H7, H7;RSQ H4.x, H4.x;MUL H0.xyz, H7, H4.x;MOV H0.w, 0.0;"}, + {"NRMH H0.xyz, H8;", "DP3 H4.x, H8, H8;RSQ H4.x, H4.x;MUL H0.xyz, H8, H4.x;MOV H0.w, 0.0;"}, + {"NRMH H1.xyz, H7;", "DP3 H4.x, H7, H7;RSQ H4.x, H4.x;MUL H1.xyz, H7, H4.x;MOV H1.w, 0.0;"}, + {"NRMH H1.xyz, H8;", "DP3 H4.x, H8, H8;RSQ H4.x, H4.x;MUL H1.xyz, H8, H4.x;MOV H1.w, 0.0;"}, + {"NRMH H2.xyz, H6;", "DP3 H4.x, H6, H6;RSQ H4.x, H4.x;MUL H2.xyz, H6, H4.x;MOV H2.w, 0.0;"}, + {"NRMH H2.xyz, H7;", "DP3 H4.x, H7, H7;RSQ H4.x, H4.x;MUL H2.xyz, H7, H4.x;MOV H2.w, 0.0;"}, + {"NRMH H2.xyz, H8;", "DP3 H4.x, H8, H8;RSQ H4.x, H4.x;MUL H2.xyz, H8, H4.x;MOV H2.w, 0.0;"}, + {"NRMH H3.xyz, H6;", "DP3 H2.x, H6, H6;RSQ H2.x, H2.x;MUL H3.xyz, H6, H2.x;MOV H3.w, 0.0;"}, + {"NRMH H3.xyz, H7;", "DP3 H2.x, H7, H7;RSQ H2.x, H2.x;MUL H3.xyz, H7, H2.x;MOV H3.w, 0.0;"}, + {"NRMH H4.xyz, H7;", "DP3 H3.x, H7, H7;RSQ H3.x, H3.x;MUL H4.xyz, H7, H3.x;MOV H4.w, 0.0;"}, + {"NRMH H4.xyz, H8;", "DP3 H3.x, H8, H8;RSQ H3.x, H3.x;MUL H4.xyz, H8, H3.x;MOV H4.w, 0.0;"}, + {"NRMH H5.xyz, H0;", "DP3 H2.x, H0, H0;RSQ H2.x, H2.x;MUL H5.xyz, H0, H2.x;MOV H5.w, 0.0;"}, + {"NRMH H5.xyz, H2;", "DP3 H4.x, H2, H2;RSQ H4.x, H4.x;MUL H5.xyz, H2, H4.x;MOV H5.w, 0.0;"}, + {"NRMH H5.xyz, H7;", "DP3 H4.x, H7, H7;RSQ H4.x, H4.x;MUL H5.xyz, H7, H4.x;MOV H5.w, 0.0;"}, + {"NRMH H5.xyz, H8;", "DP3 H4.x, H8, H8;RSQ H4.x, H4.x;MUL H5.xyz, H8, H4.x;MOV H5.w, 0.0;"}, + + {"NRMH H6.xyz, H0;", "DP3 H3.x, H0, H0;RSQ H3.x, H3.x;MUL H6.xyz, H0, H3.x;MOV H6.w, 0.0;"}, + {"NRMH H6.xyz, H1;", "DP3 H3.x, H1, H1;RSQ H3.x, H3.x;MUL H6.xyz, H1, H3.x;MOV H6.w, 0.0;"}, + {"NRMH H6.xyz, H2;", "DP3 H3.x, H2, H2;RSQ H3.x, H3.x;MUL H6.xyz, H2, H3.x;MOV H6.w, 0.0;"}, + {"NRMH H6.xyz, H5;", "DP3 H3.x, H5, H5;RSQ H3.x, H3.x;MUL H6.xyz, H5, H3.x;MOV H6.w, 0.0;"}, + {"NRMH H6.xyz, H8;", "DP3 H3.x, H8, H8;RSQ H3.x, H3.x;MUL H6.xyz, H8, H3.x;MOV H6.w, 0.0;"}, + {"NRMH H6.xyz, H10;", "DP3 H3.x, H10, H10;RSQ H3.x, H3.x;MUL H6.xyz, H10, H3.x;MOV H6.w, 0.0;"}, + + {"NRMH H7.xyz, H0;", "DP3 H1.x, H0, H0;RSQ H1.x, H1.x;MUL H7.xyz, H0, H1.x;MOV H7.w, 0.0;"}, + {"NRMH H7.xyz, H1;", "DP3 H1.x, H1, H1;RSQ H1.x, H1.x;MUL H7.xyz, H1, H1.x;MOV H7.w, 0.0;"}, + {"NRMH H7.xyz, H5;", "DP3 H1.x, H5, H5;RSQ H1.x, H1.x;MUL H7.xyz, H5, H1.x;MOV H7.w, 0.0;"}, + {"NRMH H7.xyz, H6;", "DP3 H1.x, H6, H6;RSQ H1.x, H1.x;MUL H7.xyz, H6, H1.x;MOV H7.w, 0.0;"}, + {"NRMH H7.xyz, H7;", "DP3 H1.x, H7, H7;RSQ H1.x, H1.x;MUL H7.xyz, H7, H1.x;MOV H7.w, 0.0;"}, + {"NRMH H7.xyz, H9;", "DP3 H1.x, H9, H9;RSQ H1.x, H1.x;MUL H7.xyz, H9, H1.x;MOV H7.w, 0.0;"}, + + {"NRMH H8.xyz, H3;", "DP3 H1.x, H3, H3;RSQ H1.x, H1.x;MUL H8.xyz, H3, H1.x;MOV H8.w, 0.0;"}, + {"NRMH H8.xyz, H8;", "DP3 H1.x, H8, H8;RSQ H1.x, H1.x;MUL H8.xyz, H8, H1.x;MOV H8.w, 0.0;"}, + {"NRMH H9.xyz, H9;", "DP3 H1.x, H9, H9;RSQ H1.x, H1.x;MUL H9.xyz, H9, H1.x;MOV H9.w, 0.0;"}, + {"NRMH H10.xyz, H10;", "DP3 H1.x, H10, H10;RSQ H1.x, H1.x;MUL H10.xyz, H10, H1.x;MOV H10.w, 0.0;"}, + + {"NRMH H6.xyz, c[7];", "DP3 H2.x, c[7], c[7];RSQ H2.x, H2.x;MUL H6.xyz, c[7], H2.x;"}, + {"NRMH H6.xyz, c[10];", "DP3 H3.x, c[10], c[10];RSQ H3.x, H3.x;MUL H6.xyz, c[10], H3.x;"}, + {"NRMH H7.xyz, c[10];", "DP3 H3.x, c[10], c[10];RSQ H3.x, H3.x;MUL H7.xyz, c[10], H3.x;"}, + + {"NRMH H0.xyz, H1.xzww;", + "MOV H5.x, H1.x; MOV H5.y, H1.z; MOV H5.z, H1.w; MOV H5.w, H1.w; DP3 H4.x, H5, H5; RSQ H4.x, H4.x; MUL H0.xyz, H5, H4.x;"}, + {"NRMH H0.xyz, H5.xzww;", + "MOV H1.x, H5.x; MOV H1.z, H5.y; MOV H1.z, H5.w; MOV H1.w, H5.w; DP3 H3.x, H1, H1; RSQ H3.x, H3.x; MUL H0.xyz, H1, H3.x;"}, + {"NRMH H0.xyz, H6.xyww;", + "MOV H1.x, H6.x; MOV H1.z, H6.y; MOV H1.z, H6.w; MOV H1.w, H6.w; DP3 H3.x, H1, H1; RSQ H3.x, H3.x; MUL H0.xyz, H1, H3.x;"}, + {"NRMH H1.xyz, H2.xyww;", + "MOV H2.x, H2.x; MOV H2.y, H2.y; MOV H2.z, H2.w; MOV H2.w, H2.w; DP3 H3.x, H2, H2; RSQ H3.x, H3.x; MUL H1.xyz, H2, H3.x;"}, + {"NRMH H1.xyz, H3.xyww;", + "MOV H2.x, H3.x; MOV H2.y, H3.y; MOV H2.z, H3.w; MOV H2.w, H3.w; DP3 H3.x, H2, H2; RSQ H3.x, H3.x; MUL H1.xyz, H2, H3.x;"}, + {"NRMH H2.xyz, H4.xyww;", + "MOV H1.x, H4.x; MOV H1.y, H4.y; MOV H1.z, H4.w; MOV H1.w, H4.w; DP3 H0.x, H1, H1; RSQ H0.x, H0.x; MUL H2.xyz, H1, H0.x;"}, + {"NRMH H2.xyz, H5.xyww;", + "MOV H1.x, H5.x; MOV H1.y, H5.y; MOV H1.z, H5.w; MOV H1.w, H5.w; DP3 H0.x, H1, H1; RSQ H0.x, H0.x; MUL H2.xyz, H1, H0.x;"}, + {"NRMH H2.xyz, H6.xyww;", + "MOV H1.x, H6.x; MOV H1.y, H6.y; MOV H1.z, H6.w; MOV H1.w, H6.w; DP3 H0.x, H1, H1; RSQ H0.x, H0.x; MUL H2.xyz, H1, H0.x;"}, + + {"DP2H H0.x, H5.yxzw, H5.yxzw;", "MUL HC.x, H5.y, H5.y; MUL HC.y, H5.x, H5.x; ADD H0.x, HC.x, HC.y;"}, + {"DP2H H0.w, H6.yxzw, H6.yxzw;", "MUL HC.x, H6.y, H6.y; MUL HC.y, H6.x, H6.x; ADD H0.w, HC.x, HC.y;"}, + {"DP2H H1.w, H0.yxzw, H0.yxzw;", "MUL HC.x, H0.y, H0.y; MUL HC.y, H0.x, H0.x; ADD H1.w, HC.x, HC.y;"}, + {"DP2H H1.x, H1.yxzw, H1.yxzw;", "MUL HC.x, H1.y, H1.y; MUL HC.y, H1.x, H1.x; ADD H1.x, HC.x, HC.y;"}, + {"DP2H H1.y, H5.yxzw, H5.yxzw;", "MUL HC.x, H5.y, H5.y; MUL HC.y, H5.x, H5.x; ADD H1.w, HC.y, HC.y;"}, + {"DP2H H1.w, H1.yxzw, H1.yxzw;", "MUL HC.x, H1.y, H1.y; MUL HC.y, H1.x, H1.x; ADD H1.w, HC.x, HC.y;"}, + {"DP2H H1.x, H3.yxzw, H3.yxzw;", "MUL HC.x, H3.y, H3.y; MUL HC.y, H3.x, H3.x; ADD H1.x, HC.x, HC.y;"}, + {"DP2H H1.w, H6.yxzw, H6.yxzw;", "MUL HC.x, H6.y, H6.y; MUL HC.y, H6.x, H6.x; ADD H1.w, HC.x, HC.y;"}, + {"DP2H H2.w, H4.yxzw, H4.yxzw;", "MUL HC.x, H4.y, H4.y; MUL HC.y, H4.x, H4.x; ADD H2.w, HC.x, HC.y;"}, + {"DP2H H2.w, H5.yxzw, H5.yxzw;", "MUL HC.x, H5.y, H5.y; MUL HC.y, H5.x, H5.x; ADD H2.w, HC.x, HC.y;"}, // MJ4Evo + + {"DP2H H0.w, H0.yxzw, H0.yxzw;", "MUL HC.x, H0.y, H0.y; MUL HC.y, H0.x, H0.x; ADD H0.w, HC.x, HC.y;"}, + {"DP2H H0.x, H0.yxzw, H0.yxzw;", "MUL HC.x, H0.y, H0.y; MUL HC.y, H0.x, H0.x; ADD H0.x, HC.x, HC.y;"}, + {"DP2H H0.w, H1.yxzw, H1.yxzw;", "MUL HC.x, H1.y, H1.y; MUL HC.y, H1.x, H1.x; ADD H0.w, HC.x, HC.y;"}, + {"DP2H H0.w, H2.yxzw, H2.yxzw;", "MUL HC.x, H2.y, H2.y; MUL HC.y, H2.x, H2.x; ADD H0.w, HC.x, HC.y;"}, + {"DP2H H0.w, H3.yxzw, H3.yxzw;", "MUL HC.x, H3.y, H3.y; MUL HC.y, H3.x, H3.x; ADD H0.w, HC.x, HC.y;"}, + {"DP2H H0.y, H3.yxzw, H3.yxzw;", "MUL HC.x, H3.y, H3.y; MUL HC.y, H3.x, H3.x; ADD H0.y, HC.x, HC.y;"}, + {"DP2H H0.w, H4.yxzw, H4.yxzw;", "MUL HC.x, H4.y, H4.y; MUL HC.y, H4.x, H4.x; ADD H0.w, HC.x, HC.y;"}, + {"DP2H H0.x, H4.yxzw, H4.yxzw;", "MUL HC.x, H4.y, H4.y; MUL HC.y, H4.x, H4.x; ADD H0.x, HC.x, HC.y;"}, + {"DP2H H0.y, H4.yxzw, H4.yxzw;", "MUL HC.x, H4.y, H4.y; MUL HC.y, H4.x, H4.x; ADD H0.y, HC.x, HC.y;"}, + {"DP2H H0.w, H5.yxzw, H5.yxzw;", "MUL HC.x, H5.y, H5.y; MUL HC.y, H5.x, H5.x; ADD H0.w, HC.x, HC.y;"}, + + {"DP2H H1.w, H2.yxzw, H2.yxzw;", "MUL HC.x, H2.y, H2.y; MUL HC.y, H2.x, H2.x; ADD H1.w, HC.x, HC.y;"}, + {"DP2H H1.w, H3.yxzw, H3.yxzw;", "MUL HC.x, H3.y, H3.y; MUL HC.y, H3.x, H3.x; ADD H1.w, HC.x, HC.y;"}, + {"DP2H H1.w, H4.yxzw, H4.yxzw;", "MUL HC.x, H4.y, H4.y; MUL HC.y, H4.x, H4.x; ADD H1.w, HC.x, HC.y;"}, + {"DP2H H1.y, H4.yxzw, H4.yxzw;", "MUL HC.x, H4.y, H4.y; MUL HC.y, H4.x, H4.x; ADD H1.y, HC.x, HC.y;"}, + {"DP2H H1.w, H5.yxzw, H5.yxzw;", "MUL HC.x, H5.y, H5.y; MUL HC.y, H5.x, H5.x; ADD H1.w, HC.x, HC.y;"}, + {"DP2H H2.x, H2.yxzw, H2.yxzw;", "MUL HC.x, H2.y, H2.y; MUL HC.y, H2.x, H2.x; ADD H2.x, HC.x, HC.y;"}, + {"DP2H H2.x, H5.yxzw, H5.yxzw;", "MUL HC.x, H5.y, H5.y; MUL HC.y, H5.x, H5.x; ADD H2.x, HC.x, HC.y;"}, + + {"NRMH H0.xyz, c[4];", "DP3 H2.x, c[4], c[4];RSQ H2.x, H2.x;MUL H0.xyz, c[4], H2.x;"}, + {"NRMH H1.xyz, c[4];", "DP3 H2.x, c[4], c[4];RSQ H2.x, H2.x;MUL H1.xyz, c[4], H2.x;"}, + {"NRMH H2.xyz, c[4];", "DP3 H1.x, c[4], c[4];RSQ H1.x, H1.x;MUL H2.xyz, c[4], H1.x;"}, + {"NRMH H3.xyz, c[4];", "DP3 H2.x, c[4], c[4];RSQ H2.x, H2.x;MUL H3.xyz, c[4], H2.x;"}, + {"NRMH H4.xyz, c[4];", "DP3 H3.x, c[4], c[4];RSQ H3.x, H3.x;MUL H4.xyz, c[4], H3.x;"}, + {"NRMH H5.xyz, c[4];", "DP3 H4.x, c[4], c[4];RSQ H4.x, H4.x;MUL H5.xyz, c[4], H4.x;"}, + + {"NRMH H0.xyz, c[7];", "DP3 H2.x, c[7], c[7];RSQ H2.x, H2.x;MUL H0.xyz, c[7], H2.x;"}, + {"NRMH H1.xyz, c[7];", "DP3 H2.x, c[7], c[7];RSQ H2.x, H2.x;MUL H1.xyz, c[7], H2.x;"}, + {"NRMH H2.xyz, c[7];", "DP3 H1.x, c[7], c[7];RSQ H1.x, H1.x;MUL H2.xyz, c[7], H1.x;"}, + {"NRMH H3.xyz, c[7];", "DP3 H2.x, c[7], c[7];RSQ H2.x, H2.x;MUL H3.xyz, c[7], H2.x;"}, + {"NRMH H4.xyz, c[7];", "DP3 H3.x, c[7], c[7];RSQ H3.x, H3.x;MUL H4.xyz, c[7], H3.x;"}, + {"NRMH H5.xyz, c[7];", "DP3 H2.x, c[7], c[7];RSQ H2.x, H2.x;MUL H5.xyz, c[7], H2.x;"}, + + {"NRMH H0.xyz, c[10];", "DP3 H1.x, c[10], c[10];RSQ H1.x, H1.x;MUL H0.xyz, c[10], H1.x;"}, + {"NRMH H1.xyz, c[10];", "DP3 H2.x, c[10], c[10];RSQ H2.x, H2.x;MUL H1.xyz, c[10], H2.x;"}, + {"NRMH H2.xyz, c[10];", "DP3 H3.x, c[10], c[10];RSQ H3.x, H3.x;MUL H2.xyz, c[10], H3.x;"}, + {"NRMH H3.xyz, c[10];", "DP3 H2.x, c[10], c[10];RSQ H2.x, H2.x;MUL H3.xyz, c[10], H2.x;"}, + {"NRMH H4.xyz, c[10];", "DP3 H3.x, c[10], c[10];RSQ H3.x, H3.x;MUL H4.xyz, c[10], H3.x;"}, + {"NRMH H5.xyz, c[10];", "DP3 H3.x, c[10], c[10];RSQ H3.x, H3.x;MUL H5.xyz, c[10], H3.x;"}, + + {"NRMH H0.xyz, fragment.texcoord[4];", + "DP3 H1.x, fragment.texcoord[4], fragment.texcoord[4];RSQ H1.x, H1.x;MUL H0.xyz, fragment.texcoord[4], H1.x;"}, + {"NRMH H1.xyz, fragment.texcoord[4];", + "DP3 H2.x, fragment.texcoord[4], fragment.texcoord[4];RSQ H2.x, H2.x;MUL H1.xyz, fragment.texcoord[4], H2.x;"}, + {"NRMH H2.xyz, fragment.texcoord[4];", + "DP3 H1.x, fragment.texcoord[4], fragment.texcoord[4];RSQ H1.x, H1.x;MUL H2.xyz, fragment.texcoord[4], H1.x;"}, + {"NRMH H3.xyz, fragment.texcoord[4];", + "DP3 H1.x, fragment.texcoord[4], fragment.texcoord[4];RSQ H1.x, H1.x;MUL H3.xyz, fragment.texcoord[4], H1.x;"}, + + {"NRMH H0.xyz, fragment.texcoord[3];", + "DP3 H1.x, fragment.texcoord[3], fragment.texcoord[3];RSQ H1.x, H1.x;MUL H0.xyz, fragment.texcoord[3], H1.x;"}, + {"NRMH H1.xyz, fragment.texcoord[3];", + "DP3 H2.x, fragment.texcoord[3], fragment.texcoord[3];RSQ H2.x, H2.x;MUL H1.xyz, fragment.texcoord[3], H2.x;"}, + {"NRMH H2.xyz, fragment.texcoord[3];", + "DP3 H1.x, fragment.texcoord[3], fragment.texcoord[3];RSQ H1.x, H1.x;MUL H2.xyz, fragment.texcoord[3], H1.x;"}, + {"NRMH H3.xyz, fragment.texcoord[3];", + "DP3 H1.x, fragment.texcoord[3], fragment.texcoord[3];RSQ H1.x, H1.x;MUL H3.xyz, fragment.texcoord[3], H1.x;"}, + {"NRMH H4.xyz, fragment.texcoord[3];", + "DP3 H1.x, fragment.texcoord[3], fragment.texcoord[3];RSQ H1.x, H1.x;MUL H4.xyz, fragment.texcoord[3], H1.x;"}, + {"NRMH H5.xyz, fragment.texcoord[3];", + "DP3 H1.x, fragment.texcoord[3], fragment.texcoord[3];RSQ H1.x, H1.x;MUL H5.xyz, fragment.texcoord[3], H1.x;"}, + + {"NRMH H0.xyz, H1.xyww;", + "MOV H5.x, H1.x; MOV H5.y, H1.y; MOV H5.z, H1.w; MOV H5.w, H1.w; DP3 H4.x, H5, H5; RSQ H4.x, H4.x; MUL H0.xyz, H5, H4.x;"}, + {"NRMH H0.xyz, H2.xyww;", + "MOV H5.x, H2.x; MOV H5.y, H2.y; MOV H5.z, H2.w; MOV H5.w, H2.w; DP3 H4.x, H5, H5; RSQ H4.x, H4.x; MUL H0.xyz, H5, H4.x;"}, + {"NRMH H0.xyz, H3.xyww;", + "MOV H1.x, H3.x; MOV H1.y, H3.y; MOV H1.z, H3.w; MOV H1.w, H3.w; DP3 H2.x, H1, H1; RSQ H2.x, H2.x; MUL H0.xyz, H1, H2.x;"}, + {"NRMH H0.xyz, H4.xyww;", + "MOV H1.x, H4.x; MOV H1.y, H4.y; MOV H1.z, H4.w; MOV H1.w, H4.w; DP3 H3.x, H1, H1; RSQ H3.x, H3.x; MUL H0.xyz, H1, H3.x;"}, + + {"NRMH H1.xyz, H0.xyww;", + "MOV H2.x, H0.x; MOV H2.y, H0.y; MOV H2.z, H0.w; MOV H2.w, H0.w; DP3 H3.x, H2, H2; RSQ H3.x, H3.x; MUL H1.xyz, H2, H3.x;"}, + {"NRMH H1.xyz, H4.xyww;", + "MOV H2.x, H4.x; MOV H2.y, H4.y; MOV H2.z, H4.w; MOV H2.w, H4.w; DP3 H3.x, H2, H2; RSQ H3.x, H3.x; MUL H1.xyz, H2, H3.x;"}, + {"NRMH H1.xyz, H5.xyww;", + "MOV H4.x, H5.x; MOV H4.y, H5.y; MOV H4.z, H5.w; MOV H4.w, H5.w; DP3 H3.x, H4, H4; RSQ H3.x, H3.x; MUL H1.xyz, H4, H3.x;"}, + + {"NRMH H2.xyz, H3.xyww;", + "MOV H1.x, H3.x; MOV H1.y, H3.y; MOV H1.z, H3.w; MOV H1.w, H3.w; DP3 H0.x, H1, H1; RSQ H0.x, H0.x; MUL H2.xyz, H1, H0.x;"}, + + {"NRMH H4.xyz, H2.xyww;", + "MOV H1.x, H2.x; MOV H1.y, H2.y; MOV H1.z, H2.w; MOV H1.w, H2.w; DP3 H3.x, H1, H1; RSQ H3.x, H3.x; MUL H4.xyz, H1, H3.x;"}, + {"NRMH H4.xyz, H3.xyww;", + "MOV H1.x, H3.x; MOV H1.y, H3.y; MOV H1.z, H3.w; MOV H1.w, H3.w; DP3 H2.x, H1, H1; RSQ H2.x, H2.x; MUL H4.xyz, H1, H2.x;"}, + + {"NRMH H5.xyz, H2.xyww;", + "MOV H1.x, H2.x; MOV H1.y, H2.y; MOV H1.z, H2.w; MOV H1.w, H2.w; DP3 H3.x, H1, H1; RSQ H3.x, H3.x; MUL H5.xyz, H1, H3.x;"}, + {"NRMH H5.xyz, H3.xyww;", + "MOV H4.x, H3.x; MOV H4.y, H3.y; MOV H4.z, H3.w; MOV H4.w, H3.w; DP3 H3.x, H4, H4; RSQ H3.x, H3.x; MUL H5.xyz, H4, H3.x;"}, + {"NRMH H5.xyz, H4.xyww;", + "MOV H2.x, H4.x; MOV H2.y, H4.y; MOV H2.z, H4.w; MOV H2.w, H4.w; DP3 H3.x, H2, H2; RSQ H3.x, H3.x; MUL H5.xyz, H2, H3.x;"}, + + {"NRMH H6.xyz, H3.xyww;", + "MOV H1.x, H3.x; MOV H1.y, H3.y; MOV H1.z, H3.w; MOV H1.w, H3.w; DP3 H2.x, H1, H1; RSQ H2.x, H2.x; MUL H6.xyz, H1, H2.x;"}, + {"NRMH H6.xyz, H4.xyww;", + "MOV H2.x, H4.x; MOV H2.y, H4.y; MOV H2.z, H4.w; MOV H2.w, H4.w; DP3 H3.x, H2, H2; RSQ H3.x, H3.x; MUL H6.xyz, H2, H3.x;"}, + + {"NRMH H0.xyz, H4.xzww;", + "MOV H1.x, H4.x; MOV H1.y, H4.z; MOV H1.z, H4.w; MOV H1.w, H4.w; DP3 H3.x, H1, H1; RSQ H3.x, H3.x; MUL H0.xyz, H1, H3.x;"}, + {"NRMH H4.xyz, H2.yzww;", + "MOV H1.x, H2.y; MOV H1.y, H2.z; MOV H1.z, H2.w; MOV H1.w, H2.w; DP3 H3.x, H1, H1; RSQ H3.x, H3.x; MUL H4.xyz, H1, H3.x;"}, + + {"NRMH H0.xyz, H0;", "DP3 H2.x, H0, H0;RSQ H2.x, H2.x;MUL H0.xyz, H0, H2.x;MOV H0.w, 0.0;"}, + {"NRMH H0.xyz, H1;", "DP3 H2.x, H1, H1;RSQ H2.x, H2.x;MUL H0.xyz, H1, H2.x;MOV H0.w, 0.0;"}, + {"NRMH H0.xyz, H2;", "DP3 H1.x, H2, H2;RSQ H1.x, H1.x;MUL H0.xyz, H2, H1.x;MOV H0.w, 0.0;"}, + {"NRMH H0.xyz, H3;", "DP3 H2.x, H3, H3;RSQ H2.x, H2.x;MUL H0.xyz, H3, H2.x;MOV H0.w, 0.0;"}, + {"NRMH H0.xyz, H4;", "DP3 H2.x, H4, H4;RSQ H2.x, H2.x;MUL H0.xyz, H4, H2.x;MOV H0.w, 0.0;"}, + {"NRMH H0.xyz, H5;", "DP3 H1.x, H5, H5;RSQ H1.x, H1.x;MUL H0.xyz, H5, H1.x;MOV H0.w, 0.0;"}, + {"NRMH H0.xyz, H6;", "DP3 H4.x, H6, H6;RSQ H4.x, H4.x;MUL H0.xyz, H6, H4.x;MOV H0.w, 0.0;"}, + + {"NRMH H1.xyz, H0;", "DP3 H2.x, H0, H0;RSQ H2.x, H2.x;MUL H1.xyz, H0, H2.x;MOV H1.w, 0.0;"}, + {"NRMH H1.xyz, H1;", "DP3 H2.x, H1, H1;RSQ H2.x, H2.x;MUL H1.xyz, H1, H2.x;MOV H1.w, 0.0;"}, + {"NRMH H1.xyz, H2;", "DP3 H0.x, H2, H2;RSQ H0.x, H0.x;MUL H1.xyz, H2, H0.x;MOV H1.w, 0.0;"}, + {"NRMH H1.xyz, H3;", "DP3 H2.x, H3, H3;RSQ H2.x, H2.x;MUL H1.xyz, H3, H2.x;MOV H1.w, 0.0;"}, + {"NRMH H1.xyz, H4;", "DP3 H3.x, H4, H4;RSQ H3.x, H3.x;MUL H1.xyz, H4, H3.x;MOV H1.w, 0.0;"}, + {"NRMH H1.xyz, H5;", "DP3 H2.x, H5, H5;RSQ H2.x, H2.x;MUL H1.xyz, H5, H2.x;MOV H1.w, 0.0;"}, + {"NRMH H1.xyz, H6;", "DP3 H4.x, H6, H6;RSQ H4.x, H4.x;MUL H1.xyz, H6, H4.x;MOV H1.w, 0.0;"}, + + {"NRMH H2.xyz, H0;", "DP3 H1.x, H0, H0;RSQ H1.x, H1.x;MUL H2.xyz, H0, H1.x;MOV H2.w, 0.0;"}, + {"NRMH H2.xyz, H1;", "DP3 H0.x, H1, H1;RSQ H0.x, H0.x;MUL H2.xyz, H1, H0.x;MOV H2.w, 0.0;"}, + {"NRMH H2.xyz, H2;", "DP3 H1.x, H2, H2;RSQ H1.x, H1.x;MUL H2.xyz, H2, H1.x;MOV H2.w, 0.0;"}, + {"NRMH H2.xyz, H3;", "DP3 H1.x, H3, H3;RSQ H1.x, H1.x;MUL H2.xyz, H3, H1.x;MOV H2.w, 0.0;"}, + {"NRMH H2.xyz, H4;", "DP3 H1.x, H4, H4;RSQ H1.x, H1.x;MUL H2.xyz, H4, H1.x;MOV H2.w, 0.0;"}, + {"NRMH H2.xyz, H5;", "DP3 H4.x, H5, H5;RSQ H4.x, H4.x;MUL H2.xyz, H5, H4.x;MOV H2.w, 0.0;"}, + + {"NRMH H3.xyz, H0;", "DP3 H2.x, H0, H0;RSQ H2.x, H2.x;MUL H3.xyz, H0, H2.x;MOV H3.w, 0.0;"}, + {"NRMH H3.xyz, H1;", "DP3 H4.x, H1, H1;RSQ H4.x, H4.x;MUL H3.xyz, H1, H4.x;MOV H3.w, 0.0;"}, + {"NRMH H3.xyz, H2;", "DP3 H1.x, H2, H2;RSQ H1.x, H1.x;MUL H3.xyz, H2, H1.x;MOV H3.w, 0.0;"}, + {"NRMH H3.xyz, H3;", "DP3 H2.x, H3, H3;RSQ H2.x, H2.x;MUL H3.xyz, H3, H2.x;MOV H3.w, 0.0;"}, + {"NRMH H3.xyz, H4;", "DP3 H1.x, H4, H4;RSQ H1.x, H1.x;MUL H3.xyz, H4, H1.x;MOV H3.w, 0.0;"}, + {"NRMH H3.xyz, H5;", "DP3 H2.x, H5, H5;RSQ H2.x, H2.x;MUL H3.xyz, H5, H2.x;MOV H3.w, 0.0;"}, + + {"NRMH H4.xyz, H0;", "DP3 H2.x, H0, H0;RSQ H2.x, H2.x;MUL H4.xyz, H0, H2.x;MOV H4.w, 0.0;"}, + {"NRMH H4.xyz, H1;", "DP3 H0.x, H1, H1;RSQ H0.x, H0.x;MUL H4.xyz, H1, H0.x;MOV H4.w, 0.0;"}, + {"NRMH H4.xyz, H2;", "DP3 H3.x, H2, H2;RSQ H3.x, H3.x;MUL H4.xyz, H2, H3.x;MOV H4.w, 0.0;"}, + {"NRMH H4.xyz, H3;", "DP3 H2.x, H3, H3;RSQ H2.x, H2.x;MUL H4.xyz, H3, H2.x;MOV H4.w, 0.0;"}, + {"NRMH H4.xyz, H4;", "DP3 H2.x, H4, H4;RSQ H2.x, H2.x;MUL H4.xyz, H4, H2.x;MOV H4.w, 0.0;"}, + {"NRMH H4.xyz, H5;", "DP3 H2.x, H5, H5;RSQ H2.x, H2.x;MUL H4.xyz, H5, H2.x;MOV H4.w, 0.0;"}, + {"NRMH H4.xyz, H6;", "DP3 H3.x, H6, H6;RSQ H3.x, H3.x;MUL H4.xyz, H6, H3.x;MOV H4.w, 0.0;"}, + + {"NRMH H5.xyz, H1;", "DP3 H2.x, H1, H1;RSQ H2.x, H2.x;MUL H5.xyz, H1, H2.x;MOV H5.w, 0.0;"}, + {"NRMH H5.xyz, H3;", "DP3 H1.x, H3, H3;RSQ H1.x, H1.x;MUL H5.xyz, H3, H1.x;MOV H5.w, 0.0;"}, + {"NRMH H5.xyz, H4;", "DP3 H3.x, H4, H4;RSQ H3.x, H3.x;MUL H5.xyz, H4, H3.x;MOV H5.w, 0.0;"}, + {"NRMH H5.xyz, H5;", "DP3 H2.x, H5, H5;RSQ H2.x, H2.x;MUL H5.xyz, H5, H2.x;MOV H5.w, 0.0;"}, + {"NRMH H5.xyz, H6;", "DP3 H4.x, H6, H6;RSQ H4.x, H4.x;MUL H5.xyz, H6, H4.x;MOV H5.w, 0.0;"}, + + {"NRMH H6.xyz, H4;", "DP3 H1.x, H4, H4;RSQ H1.x, H1.x;MUL H6.xyz, H4, H1.x;MOV H6.w, 0.0;"}, + {"NRMH H6.xyz, H6;", "DP3 H4.x, H6, H6;RSQ H4.x, H4.x;MUL H6.xyz, H6, H4.x;MOV H6.w, 0.0;"}, + {"NRMH H6.xyz, H7;", "DP3 H3.x, H7, H7;RSQ H3.x, H3.x;MUL H6.xyz, H7, H3.x;MOV H6.w, 0.0;"}, + + {"NRMH H7.xyz, H4;", "DP3 H1.x, H4, H4;RSQ H1.x, H1.x;MUL H7.xyz, H4, H1.x;MOV H7.w, 0.0;"}}; + +int mj4FsMesaCount = sizeof(mj4FsMesa) / sizeof(SearchReplace); + +// Vertex +SearchReplace mj4VsMesa[] = {{"OPTION NV_vertex_program3;", "#OPTION NV_vertex_program3;"}, + + {"BB1:", " "}, + {"BB2:", " "}, + {"BB3:", " "}, + {"BB4:", " "}, + {"BB5:", " "}, + {"BB6:", " "}, + {"BB7:", " "}, + {"BB8:", " "}, + {"BB9:", " "}, + /*{"MUL_SAT ", "MUL "},*/ + + {"MUL_SAT R0.w, R1.x, R0;", "MUL R0.w, R1.x, R0;MAX R0.w, R0.w, 0.0;MIN R0.w, R0.w, 1.0;"}, + {"MUL_SAT R1.x, R1, R0.w;", "MUL R1.x, R1, R0.w;MAX R1.x, R1.x, 0.0;MIN R1.x, R1.x, 1.0;"}, + {"MUL_SAT R1.w, R2, R1;", "MUL R1.w, R2, R1;MAX R1.w, R1.w, 0.0;MIN R1.w, R1.w, 1.0;"}, + {"MUL_SAT R1.w, R1.x, R0;", "MUL R1.w, R1.x, R0;MAX R1.w, R1.w, 0.0;MIN R1.w, R1.w, 1.0;"}, + {"MUL_SAT R2.w, R2, R1;", "MUL R2.w, R2, R1;MAX R2.w, R2.w, 0.0;MIN R2.w, R2.w, 1.0;"}, + {"MUL_SAT R3.x, R2.w, R1.w;", "MUL R3.x, R2.w, R1.w;MAX R3.x, R3.x, 0.0;MIN R3.x, R3.x, 1.0;"}, + + {"BRA ", "#BRA "}, + {"MOVC ", "MOV "}, + + {"ARL A0.x, vertex.attrib[15];", "ARL A0.x, vertex.attrib[15].x;"}, + {"(NE.x)", " "}, + {"(NE)", " "}, + {"SEQC", "#SEQC "}}; + +int mj4VsMesaCount = sizeof(mj4VsMesa) / sizeof(SearchReplace); + +#endif \ No newline at end of file diff --git a/src/lindbergh/shader_work/shaders.h b/src/lindbergh/shader_work/shaders.h index 055bc1d..2ce2021 100644 --- a/src/lindbergh/shader_work/shaders.h +++ b/src/lindbergh/shader_work/shaders.h @@ -10,6 +10,7 @@ #include "hummer.h" #include "id.h" #include "lgj.h" +#include "mj4.h" #include "or2.h" #include "primeval.h" #include "rambo.h"