1
0
mirror of synced 2025-02-23 21:53:11 +01:00

MJ4 support and Rambo res patch.

This commit is contained in:
dkeruza-neo 2025-01-04 02:08:58 +01:00
parent a31c1a98c4
commit 57a609f974
13 changed files with 582 additions and 119 deletions

View File

@ -10,7 +10,6 @@
#include "config.h"
#include "jvs.h"
#include "serial.h"
#include "passthrough.h"
#define SERIAL_STRING "FE11-X018012022X"

View File

@ -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));

View File

@ -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;

View File

@ -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.

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -1,83 +0,0 @@
#include <fcntl.h>
#include <linux/serial.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <termios.h>
#include <time.h>
#include <unistd.h>
#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);
}

View File

@ -1,3 +0,0 @@
int setSerialAttributes(int fd, int myBaud);
int readBytes(int fd, unsigned char *buffer, int amount);

View File

@ -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 ||

View File

@ -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

View File

@ -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"