the cutting room mirror

Mahjong (PlayStation)

The imaginatively named Mahjong (or Hyper Value 2800: Mahjong, to give its full name) is a budget mahjong game where you can use your winnings to buy women's clothing, which you can then make your female opponents wear when you defeat them.

So when you think about it, it's the exact opposite of the strip mahjong games that were so popular in Japan at the time.

Mahjong not your thing? Don't worry, the same devs released a hanafuda game on the same day.

Dummy File#

The game contains a file titled DMY, which, when read as signed 16-bit PCM audio, reveals itself to be an audio track from Diver's Dream.

(Source: tikal.)

Uncompiled Source Code#

The game's main file repository, CD_DATA.BIN, contains some source code fragments:

0x4E5E00

ong *scratch);
   PACKET *GsTMDfastTG3M(TMD_P_TG3 *op, VERT *vp, VERT *np, PACKET *pk, 
                       int n, int shift, GsOT *ot, u_long *scratch);
   PACKET *GsTMDfastTG3MFG(TMD_P_TG3 *op, VERT *vp, VERT *np, PACKET *pk, 
                       int n, int shift, GsOT *ot, u_long *scratch);
   PACKET *GsTMDfastF4GL(TMD_P_F4G *op, VERT *vp, VERT *np, PACKET *pk,
                       int n, int shift, GsOT *ot, u_long *scratch);
   PACKET *GsTMDfastF4GLFG(TMD_P_F4G *op, VERT *vp, VERT *np, PACKET *pk,
                       int n, int shift, GsOT *ot, u_long *scrat

0x4E8E00

ght);
extern void SpuGetCommonMasterVolumeAttr (short *mvol_left, short *mvol_right,
                      short *mvolmode_left,
                      short *mvolmode_right);
extern void SpuGetCommonCDMix (long *cd_mix);
extern void SpuGetCommonCDVolume (short *cd_left, short *cd_right);
extern void SpuGetCommonCDReverb (long *cd_reverb);

extern long SpuSetReverbModeType (long mode);
extern void SpuSetReverbModeDepth (short depth_left, short depth_right);
extern void SpuSetReverbModeDelayTime (long delay);
extern void SpuSet

0x4F4A00

 7 *2) /2) + 12 +80 +18 +8+j-1 ].disp_off=0 ;
            } else {
                obj_w[ 0 * ((380+ 7 *2) /2) + 12 +80 +18 +8+j-2 ].disp_off=1 ;
                obj_w[ 0 * ((380+ 7 *2) /2) + 12 +80 +18 +8+j-1 ].disp_off=1 ;
            }
        }
        obj_set_2d2_new(12 +80 +18 +32,
            0, 137, 81, &t_km_r_tbl[0],
                &t_km_entry[5 ], &t_km_anim[3 ]);
        obj_set_2d2_new(12 +80 +18 +33,
            0, 137+ 3 , 81+ 2 , &t_km_r_tbl[0],
                &t_km_entry[37 ], &t_km_anim[3 ]);
    }
    if (flg == 1){
        j=0;
        if (t_flg[t_ocsr] == 0){
            obj_set_2d2_new_fade(12 +80 +18 +8+(t_ocsr*2), 0, 64, &t_km_entry[21 +t_ocsr]);
        } else {
            obj_set_2d2_new_fade(12 +80 +18 +8+(t_ocsr*2), 0, 32, &t_km_entry[21 +t_ocsr]);
        }
        if (t_flg[t_csr] == 0){
            obj_set_2d2_new_fade(12 +80 +18 +8+(t_csr*2), 0, 128, &t_km_entry[21 +t_csr]);
        } else {
            obj_set_2d2_new_fade(12 +80 +18 +8+(t_csr*2), 0, 64, &t_km_entry[21 +t_csr]);
        }
        for (i=0; i<12; i++){
            t_cdx[i]+=x;
            if ((t_cdx[i] >= -7) && (t_cdx[i] < 305)){
                obj_w[ 0 * ((380+ 7 *2) /2) + 12 +80 +18 +8+j ].disp_off=0 ;
                obj_pos_set(12 +80 +18 +8+j, 0, t_cdx[i]+16, t_cdy+16, 0);
                j++;
                obj_w[ 0 * ((380+ 7 *2) /2) + 12 +80 +18 +8+j ].disp_off=0 ;
                obj_pos_set(12 +80 +18 +8+j, 0, t_cdx[i]+ 3 +16, t_cdy+ 2 +16, 0);
                j++;
            } else {
                obj_w[ 0 * ((380+ 7 *2) /2) + 12 +80 +18 +8+j ].disp_off=1 ;
                j++;
                obj_w[ 0 * ((380+ 7 *2) /2) + 12 +80 +18 +8+j ].disp_off=1 ;
                j++;
            }
            if (t_cdx[i] >= 480) t_cdx[i]-=480;
        }
    }
    if (flg == 2){
        j=0;
        if (t_flg[t_ocsr] == 0){
            obj_

0x50F600

scl    8;  .type   0x3;    .endef
   .def    anime_t_dt; .val    44; .scl    8;  .tag    _ANIME_T_DT;    .size   4;  .type   0x18;   .endef
   .def    anime_timer;    .val    48; .scl    8;  .type   0x3;    .endef
   .def    anime_no;   .val    50; .scl    8;  .type   0x3;    .endef
   .def    ext_timer;  .val    52; .scl    8;  .type   0x3;    .endef
   .def    anime_dt;   .val    56; .scl    8;  .tag    _ANIME_DT;  .size   4;  .type   0x18;   .endef
   .def    obj_dt; .val    60; .scl    8;  .type   0x1c;   .endef
   .def    object; .val    64; .scl    8;  .tag    .60fake;    .size   16; .type   0x18;   .endef
   .def    rotate3d;   .val    68; .scl    8;  .tag    .2

0x512400

    .def    offset; .val    8;  .scl    8;  .type   0xf;    .endef
    .def    color;  .val    12; .scl    8;  .type   0x1f;   .endef
    .def    .eos;   .val    16; .scl    102;    .tag    _SPRITE_W;  .size   16; .endef
    .def    SPRITE_W;   .scl    13; .tag    _SPRITE_W;  .size   16; .type   0x8;    .endef
    .def    _TEX_UVWH_W;    .scl    10; .type   0x8;    .size   6;  .endef
    .def    u0; .val    0;  .scl    8;  .type   0xc;    .endef
    .def    v0; .val    1;  .scl    8;  .type   0xc;    .endef
    .def    w;  .val    2;  .scl    8;  .type   0x3;    .endef
    .def    h;  .val    4;  .scl    8;  .type   0x3;    .endef
    .def    .eos;   .val    6;  .scl    102;    .tag    _TEX_UVWH_W;    .size   6;  .endef
    .def    TEX_UVWH_W; .scl    13; .tag    _TEX_UVWH_W;    .size   6;  .type   0x8;    .endef
    .def    _TEX_UVWHT_W;   .scl    10; .type   0x8;    .size   8;  .endef
    .def    u0; .val    0;  .scl    8;  .type   0xc;    .endef
    .def    v0; .val    1;  .scl    8;  .type   0xc;    .endef
    .def    w;  .val    2;  .scl    8;  .type   0x3;    .endef
    .def    h;  .val    4;  .scl    8;  .type   0x3;    .endef
    .def    tpage;  .val    6;  .scl    8;  .type   0xd;    .endef
    .def    .eos;   .val    8;  .scl    102;    .tag    _TEX_UVWHT_W;   .size   8;  .endef
    .def    TEX_UVWHT_W;    .scl    13; .tag    _TEX_UVWHT_W;   .size   8;  .type   0x8;    .

0x6B7410

p4(SVECTOR *v0,SVECTOR *v1,SVECTOR *v2,SVECTOR *v3,
           long *sxy0,long *sxy1,long *sxy2,long *sxy3,
           long *p,long *otz,long *flag);
extern long RotColorDpq(SVECTOR *v0,SVECTOR *v1,CVECTOR *v2,
           long *sxy,CVECTOR *v3,long *flag);
extern long RotColorDpq3(SVECTOR *v0,SVECTOR *v1,SVECTOR *v2,
           SVECTOR *v3,SVECTOR *v4,SVECTOR *v5,CVECTOR *v6,
           long *sxy0,long *sxy1,long *sxy2,
           CVECTOR *v7,CVECTOR *v8,CVECTOR *v9,long *flag);
extern long RotAverageNclipColorDpq3(SVECTOR *v0,SV

0x6D7C84

ラーメッセージ=表示
エラー音=鳴らす
入力文字数=100
スペースキー=11100
先読み変換=する
解析スレッド使用=する
カナ入力時次候補選択=選択
確定語保存=メモリ

[辞書・学習]
基本辞書セットNo=1
辞書共有=しない

[辞書セット1]
辞書セット名称="標準辞書"
システム辞書=C:\JUST\ATOK11\ATOK11.DIC
ユーザー辞書=C:\JUST\ATOK11\ATOK11U1.DIC
補助辞書1=
補助辞書2=
補助辞書3=

0x6E175E

FT4;                

typedef struct {
   u_long  tag;
   u_char  r0, g0, b0, code;
   short   x0,     y0;
   u_char  r1, g1, b1, pad1;
   short   x1, y1;
   u_char  r2, g2, b2, pad2;
   sh

0x816A80

return(d0);
}
/*------ 対対和チェック ------------------------------------------------*/
int toichk(u_short *a0)
{
int d0=0,d1=1,d2=0,d3=0,d4=0;
u_short d5=0;
while (d1<7)
    {
    d5=a0[d1];
    if ((d5>>8)>2) d2++;
    if (((d5>>8)==3)||((d5>>8)==5)) d3++;
    if ((d5>>8)>4) d4++;
    d1++;
    }
if (d2==4)
    {
    d0=TOITOI;
    yakuct=yakuct+2;
    }
if (d3==3)
    {
    d0=d0|ANKO3;
    yak

0x835180

トレーが空けられた後CDを抜いて */
                           break;                              /* トレーを閉めるとこうなる(はず) */
       }
   }


/*-----------------

0x858640

 = 0;
    static char     I_wno2 = 0;
    static char     sute_check = 0;

    if (I_wcheck != w_no || at_ch(IC_JSCORE) || (plnum != 3 && window & 0x0039))
    {
        I_wcheck = w_no;

        for (l = 0; l < 22; l++)
        {
            if (p2hou[l])
            {
                /* 段毎にリーチ時の座標修正 */
                if (l == 0 || l == 11)  control = 0;

                o_pat = set_haitype(p2hou[l], IO_SU_T);     /* 牌種類チェック */

                /* 喰われた牌の色替え */
                if (p2hou[l]&0x40)                  o_pat+=4;

    

0x8D2E80

==========================*/
/*  Local Define                                                     */
/*===================================================================*/
Ushort v_cnt;
Ushort v_cnt_wrk, v_cnt_wrk2;
Ushort init_count;

Vlong DCnt;

static VUshort process_end = 0;
int time_over = 0,stbar_wrk2;

int value = 0;                      /* 測定実験用 */

/*=========================================================

0x977300

ト生をする */
extern int SndStopCdXaBGM(void);                       /* BGM扱いのCD-XAの再生をやめる */

/*
#####################################################################
#                                                                  #
#              ローカル関数プロトタイプ宣言                      #
#                                                                  #

(Source: tikal.)

References#


  1. GAME Data Room - PlayStation Software List 2000↩︎