the cutting room mirror

Hanafuda (PlayStation)

The imaginatively named Hanafuda (or Hyper Value 2800: Hanafuda, to give its full name) is a budget hanafuda game, and probably the only hanafuda game ever to allow you to purchase and assemble truck parts with your winnings.

Hanafuda not your cup of tea? Don't worry, the same devs released a mahjong 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#

CD_DATA.BIN, which is the game's main file repository, contains several snippets of uncompiled source code:

0x290600

op, VERT *vp, VERT *np, PACKET *pk,
                       int n, int shift, GsOT *ot, u_long *scratch);
   PACKET *GsTMDfastG3GLFG(TMD_P_G3G *op, VERT *vp, VERT *np, PACKET *pk,
                       int n, int shift, GsOT *ot, u_long *scratch);
   PACKET *GsTMDfastG3GNL(TMD_P_G3G *op, VERT *vp, VERT *np, PACKET *pk,
                       int n, int shift, GsOT *ot, u_long *scratch);
   PACKET *GsPrstF3GL(TMD_P_F3G *op, VERT *vp, VERT *np, PACKET *pk,
                       int n, int shift, GsOT *ot, u_long *scratch);
   PACKET *GsPrstF3GLFG(TMD_P_F3G *op, VERT *vp, VER

0x292400

} SpuEnv;



 






extern void SpuInit (void);
extern void SpuInitHot (void);
extern void SpuStart (void);
extern void SpuQuit (void);
extern long SpuSetMute (long on_off);
extern long SpuGetMute (void);
extern void SpuSetEnv (SpuEnv *env);

extern long SpuSetNoiseClock (long n_clock);
extern long SpuGetNoiseClock (void);
extern unsigned long SpuSetNoiseVoice (long on_off, unsigned long voice_bit);
extern unsigned long SpuGetNoiseVoice (void);

extern long SpuSetReverb (long on_off);
extern long SpuGetReverb (void);
extern long SpuSetReverbModeParam (SpuReverbAttr *attr);
extern void SpuGetReverbModeParam (SpuReverbAttr *attr);
extern long SpuSetReverbDepth (SpuReverbAttr *attr);
extern long SpuReserveReverbWorkArea (long on_off);
extern long SpuIsReverbWorkAreaReserved (long on_off);
extern unsigned long SpuSetReverbVoice (long on_off, unsigned long voice_bit);
extern unsigned long SpuGetReverbVoice (void);
extern long SpuClearReverbWorkArea (long mode);

extern unsigne

0x296E00

Uchar  now_p;               
Uchar   saisen;              
Uchar   kai_fg;              
Uchar   req;                 
Uchar   r3_pt[2];            
Uchar   p_mem[3];            
Uchar   p_mem2[3];           
Uchar   pl_st[8];            
                             
                             
                             
Uchar   b_ct;                
                             
                             
                             
                             
                             
Ushort  medal_now[8];        
Ushort  medal[8];            
                             
                             
                             
                             
Ushort  pl_n_pt[8];          
Ushort  pl_al_pt[8];         
Uchar   pl_battle[7][8];     
Uchar   pl_next[3];          
} MULTI_PL;
 
 
 



typedef struct {
Uchar   pda_id[8];           
U

0x297E00

winlim;                 
extern int curnum;               
 
 
extern u_char dast[48];          
extern u_char dastct[12];        
extern u_char ent_flg[12];       
extern u_char huda_flg[12];

extern u_char m_point[16];       
extern u_char huda_ent[10];      
extern u_char chk_huda[10];      
extern u_char p1kaku[10];        
extern u_char p2kaku[10];        
extern u_char p3kaku[10];        
extern u_char comload[4];        
extern u_char *topclrc[17];
extern u_char topcnt[17];
extern u_char rule1;
extern u_char rule2;
extern u_char gamesele;          
ex

0x29D600

ize    8;  .type   0x18;   .endef
   .def    u;  .val    8;  .scl    8;  .tag    .2fake; .size   8;  .type   0x18;   .endef
   .def    c;  .val    12; .scl    8;  .tag    .3fake; .size   4;  .type   0x18;   .endef
   .def    lenv;   .val    16; .scl    8;  .type   0xf;    .endef
   .def    lenh;   .val    20; .scl    8;  .type   0xf;    .endef
   .def    .eos;   .val    24; .scl    102;    .tag    .15fake;    .size   24; .endef
   .def    QMESH;  .scl    13; .tag    .15fake;    .size   24; .type   0x8;    .endef
   .file   1 "HANA/k_fkoi.c"
   .file   1 "c:/psx/include\\libgpu.h"
   .def    .16fake;    .scl    10; .type   0x8;    .size   8;  .endef
   .def    x;  .v

0x29EC00

   .val    18; .scl    8;  .type   0x3;    .endef
    .def    u1; .val    20; .scl    8;  .type   0xc;    .endef
    .def    v1; .val    21; .scl    8;  .type   0xc;    .endef
    .def    tpage;  .val    22; .scl    8;  .type   0xd;    .endef
    .def    x2; .val    24; .scl    8;  .type   0x3;    .endef
    .def    y2; .val    26; .scl    8;  .type   0x3;    .endef
    .def    u2; .val    28; .scl    8;  .type   0xc;    .endef
    .def    v2; .val    29; .scl    8;  .type   0xc;    .endef
    .def    pad1;   .val    30; .scl    8;  .type   0xd;    .endef
    .def    .eos;   .val    32; .scl    102;    .tag    .25fake;    .size   32; .endef
    .def    POLY_FT3;   .scl    13; .tag    .25fake;    .size   32; .type   0x8;    .endef
    .def    .26fake;    .scl    10; .type   0x8;    .size   40; .endef
    .def    tag;    .val    0;  .scl    8;  .type   0xf;    .endef
    .def    r0; .val    4;  .scl    8;  .type   0xc;    .endef
    .def    g0; .val    5;  .scl    8;  .type   0xc;    .endef
    .def    b0; .val    6;  .scl    8;  .type   0xc;    .endef
    .def    code;   .val    7;  .scl    8;  .type   0xc;    .endef
    .def    x0; .val    8;  .scl    8;  .type   0x3;    .endef
    .def    y0; .val    10; .scl    8;  .type   0x3;    .endef
    .def    u0; .val    12; .scl    8;  .type   0xc;    .endef
    .def    v0; .val    13; .scl    8;  .type   0xc;    .endef
    .def    clut;   .val    14

0x305600

g,
            short Xoffset,short Zoffset,short m,short n,
            DVECTOR *base);
extern long RotAverage3(SVECTOR *v0,SVECTOR *v1,SVECTOR *v2,
            long *sxy0,long *sxy1,long *sxy2,long *p,long *flag);
extern long RotAverage4(SVECTOR *v0,SVECTOR *v1,SVECTOR *v2,SVECTOR *v3,
            long *sxy0,long *sxy1,long *sxy2,long *sxy3,
            long *p,long *flag);
extern long RotNclip3(SVECTOR *v0,SVECTOR *v1,SVECTOR *v2,
            long *sxy0,long *sxy1,long *sxy2,long *p,long *otz,
            long *flag);
extern long RotNclip4(SVECTOR *v0,SVEC

0x30C400

;

typedef struct {
    u_char  out, in, dummy, cd;
    u_char  r0, g0, b0, code;
    u_char  r1, g1, b1, p1;
    u_char  r2, g2, b2, p2;
    u_short v0, v1;
    u_short v2, p;
}       TMD_P_NG3;

typedef struct {
    u_char  out, in, dummy, cd;
    u_char  r0, g0, b0, code;
    u_short n0, v0;
    u_short v1, v2;
    u_short v3, p;
}       TMD_P_F4;

typedef struct {
    u_char  out, in, dummy, cd;
    u_char  r0, g0, b0, code;
    u_short n0, v0;
    u_short n1, v1;
    u_short n2, v2;
    u_short n3, v3;
}       TMD_P_G4;

typedef struct {
    u_char  out, in, dummy, cd;
    u_char  r0, g0, b0, code;
    u_char  r1, g1, b1, dummy1;
    u_char  r2, g2, b2, dummy2;
    u_char  r3, g3, b3, dummy3;
    u_short n0, v0;
    u_short v1, v2;
    u_short v3, dummy4;
}       TMD_P_F4G;

typedef struct {
    u_char  out, in, dummy, cd;
    u_char  r0, g0, b0, code;
    u_char  r1, g1, b1, dummy1;
    u_char  r2, g2, b2, dummy2;
    u_char  r3, g3, b3, dummy3;
    u_short n0, v0;
    u_short n1, v1;
    u_short n2, v2;
    u_short n3, v3;
}       TMD_P_G4G;

typedef struct {
    

0x311600

MATRIX_ORG;     
extern long HWD0, VWD0;      
extern MATRIX GsLIGHTWSMATRIX;   
extern MATRIX GsIDMATRIX;    
extern MATRIX GsIDMATRIX2;   
extern PACKET *GsOUT_PACKET_P;   
extern long GsADIVZ;         
extern short GsADIVW, GsADIVH;   
extern int GsLIGHT_MODE;     
extern u_long GsMATE_C, GsLMODE, GsLIGNR, GsLIOFF, GsZOVER, GsBACKC, GsNDIV;
extern u_long GsTRATE, GsTON, GsDISPON;


# 1133 "c:/psx/include\\libgs.h" 3


# 1244 "c:/psx/include\\libgs.h" 3


# 1355 "c:/psx/include\\libgs.h" 3


# 1466 "c:/p

0x48D400

T
 800463AC  HUDA
 8005BFA0  HUDA_ENT
 80046414  HUDA_FLG
 8008941C  HWD0
 8004640C  HWINLIM
 8001B500  H_BZERO
 8001B520  H_BZERO2
 80014090  H_CDLOADS
 80014254  H_CDSEEK
 8001B4E8  H_LABS
 8001B540  H_MEMCPY
 8001B568  H_MEMCPY2
 8001B590  H_MEMSET
 8001B5B0  H_MEMSET2
 80013FD0  H_PCLOAD
 8001AED0  H_SORTSPRITE
 8001B664  H_STRCAT
 8001B5D0  H_STRCPY
 8001B638  H_STRLEN
 8001B6BC  H_STRNCAT
 8001B600  H_STRNCPY
 80046394  INDEX
 80033D94  INITCARD
 800342B4  INITCARD2
 80012564  INITFILESYSTEM
 80029494  INITGEOM
 8002119C  INITHEAP
 80033F10  INITPAD
 80034164  INITPAD2
 8007D534  INIT_COUNT
 800A1198  INIT_SIKO
 8002158C  INTERRUPTCALLBACK
 8002A0F8  INTPL
 8004AE86  IN_GAME
 800179B8  IO_CHECK
 80017320  IO_READ
 800A07B8  I_ALBUM_MAIN
 800A1DD0  I_ALBUM_PIC
 800AFE84  I_ALL_COORD
 800B0CF0  I_AL_PARTS
 800AFDC0  I_BG_DATA
 8001D4B8  I_CHANGE_WIN
 800AFE64  I_CITY_COORD
 800B00CC  I_CITY_ROUTE
 800B0CE8  I_COUNT
 800B0CEC  I_CUR_ST
 800A347C  I_DRAW_FONT

0x48EA00

 800A8DD8  K_FGOLD_OFS
 800A8DFC  K_FGOLD_OFS_SET
 800A93EC  K_FGOLD_POS
 800A8D58  K_FGOLD_SET_FACE
 800A8D30  K_FGOLD_SET_MODE
 800A8D80  K_FGOLD_SET_SCORE
 800A8CF8  K_FGOLD_WORK
 800A981C  K_FKAO_CONTROL
 800AA1F8  K_FKAO_DISP
 800A9A4C  K_FKAO_EXEC
 800AA57C  K_FKAO_FADE
 800A984C  K_FKAO_INIT
 800A97F8  K_FKAO_STATUS
 800A99C0  K_FKAO_SUB_SET
 800AA5A0  K_FKAO_WINDOW
 800A97EC  K_FKAO_WORK
 800AAD70  K_FKOI_BIG
 800AA77C  K_FKOI_DISP
 800AAD4C  K_FKOI_ERASE
 800AA674  K_FKOI_EXEC
 800AA62C  K_FKOI_INIT
 800AA620  K_FKOI_WORK
 800AAF04  K_FMON_DISP
 800AB088  K_FMON_ERASE
 800AB35C  K_FMON_FADE
 800AAE98  K_FMON_INIT
 800AB158  K_FMON_NUM
 800AB0D4  K_FMON_POS
 800AAEC4  K_FMON_SET_SCORE
 800AAE8C  K_FMON_WORK
 800ABE60  K_FMOVE_BAFUDA_3CHECK
 800ABDF8  K_FMOVE_BAFUDA_4CHECK
 800ABB5C  K_FMOVE_BAFUDA_ADD
 800AC370  K_FMOVE_BAFUDA_COUNT
 800AC314  K_FMOVE_BAFUDA_LOAD
 800AC138  K_FMOVE_BAFUDA_LOOK
 800AC1AC  K_FMOVE_BAFUDA_LOOK_OPT
 800ABDA8  K_FMOVE_BAFUDA_MATCH_COUNT
 800ABDCC  K_FMOVE_BAFUDA_MATCH_POS
 800ABF34  K_FMOVE_BAFUDA_NULL_POS
 800AC15C  K_FMOVE_BAFUDA_PULL
 800AC238  K_FMOVE_BAFUDA_PULL_OPT
 800AC180  K_FMOVE_BAFUDA_PUSH
 800AC2B8  K_FMOVE_BAFUDA_SAVE
 800ABB04  K_FMOVE_BAFUDA_SET
 800AC390  K_FMOVE_BAFUDA_VIEW
 800AB38C  K_FMOVE_COPY
 800AB3BC  K_FMOVE_COUNT
 800AC438  K_FMOVE_FUDA_CODE_CHANGE
 800AC470  K_FMOVE_FUDA_CODE_CHANGE_ALL
 800AB7F4  K_FMOVE_INIT
 800AB43C  K_FMOVE_LOOK
 800AB524  K_FMOVE_LOOK_TOP
 800AB60C  K_FMOVE_MATCH_COUNT
 

0x497400

 DEMO_MAIN
 80014D48  DEMO_INIT
 80014FC0  DEMO_SD_CHECK
 80014FD8  GO_GAME_MODE
 800150C8  GO_MAP_MODE
 800150F0  FADE_IN_SET
 8001512C  FADE_IN_CHECK
 8001517C  FADE_OUT_SET
 80015190  FADE_OUT_CHECK
 800151FC  FADE_IN_SET_W
 80015238  FADE_IN_CHECK_W
 80015288  FADE_OUT_SET_W
 8001529C  FADE_OUT_CHECK_W
 80015308  FADE_SET
 80015398  FADE_SET_W
 8001542C  TILE_DISP
 800155A8  LINE_DISP
 800156A0  TEX_DISP_FS
 80015818  TEX_DISP_S
 80015974  TEX_DISP_SM
 80015A7C  TEX_DISP_F
 80015BF0  TEX_DISP
 80015D50  TEX_TPAGE_SET
 80015DFC  TEX_DISPS
 80015E90  TEX_DISPS_S
 80015F28  TEX_DISPS_F
 80015FC0  TEX_DISPS_FS
 80016488  POLY_DISP_FT4
 80016668  POLY_DISP_FT4_S
 80016848  LOADTIMF
 800169EC  FLASH_SET
 80016BB0  DISP_BGS_MAIN
 80016C38  DISP_W_CLEAR_ALL
 80016C6C  COLD_RESET_INIT
 80016CC8  WARM_RESET_INIT
 80016DA0  SYSTEM_INIT
 80016DAC  GRAPH_INIT
 80017030  GRAPH_FB_INIT
 80017058  GRAPH_INIT_16
 8001717C  GS_INIT
 80017280  VRAM_STAY_SET
 80017320  IO_READ
 80017

0x498A00

8001F9B4  SOUNDCLEAR2
 8001F9BC  SNDCTRLALLOFF
 8001F9E4  SNDCTRLSETMOVIEVOLUME
 8001FA24  SNDCTRLCLEARMOVIEVOLUME
 8001FA5C  I_HANA_MAIN
 8001FB90  I_MAP_MAIN
 8001FCAC  I_SHOP_MAIN
 8001FD8C  S_MEM_SAVE
 8001FF9C  S_MEM_LOAD
 80020178  S_MEM_AUTOLOAD
 80020394  S_MEM_PDA
 800210D8  __MAIN
 800210E0  __SN_ENTRY_POINT
 800210E0  STUP2
 80021104  STUP1
 80021180  STUP0
 8002119C  INITHEAP
 800211AC  KROM2RAWADD
 800211BC  CHANGECLEARPAD
 800211CC  SETRCNT
 80021268  GETRCNT
 800212A0  STARTRCNT
 800212D0  STOPRCNT
 80021304  RESETRCNT
 8002133C  VSYNC
 8002154C  CHANGECLEARRCNT
 8002155C  RESETCALLBACK
 8002158C  INTERRUPTCALLBACK
 800215BC  DMACALLBACK
 800215EC  VSYNCCALLBACK
 80021620  VSYNCCALLBACKS
 80021650  STOPCALLBACK
 80021680  RESTARTCALLBACK
 800216B0  CHECKCALLBACK
 800216C0  GETINTRMASK
 800216D8  SETINTRMASK
 80021C24  _96_REMOVE
 80021C3C  RETURNFROMEXCEPTION
 80021C4C  RESETENTRYINT
 80021C5C  HOOKENTRYINT
 80021C6C  ENTERCRITICALSECTION
 80021C7C  EXITCRITICALSECTION
 80021C8C  STARTINTRVSYNC
 80021DAC  STARTINTRDMA
 8002204C  SETGEOMOFFSET
 8002206C  RESETGRAPH
 800221E0  SETGRAPHDEBUG
 8002223C  SETGRAPHQUEUE
 800222E0  GETGRAPHDEBUG
 800222F0  DRAWSYNCCALLBACK
 80022350  SETDISPMASK
 800223E8  DRAWSYNC
 8002256C  CLEARIMAGE
 800225FC  CLEARIMAGE2
 80022694  LOADIMAGE
 800226F4  STOREIMAGE
 80022754  MOVEIMAGE
 8002280C  CLEAROTAG
 800228D4  CLEAROTAGR
 80022980  DRAWPRIM
 800229DC  DRAWOTAG
 80022A4C  PUTDRAWENV
 80022B0C  DRAWOTA

0x4A1600

019C  _HANA_BSS_OBJEND
 800B01A4  _HANA_ORGEND
 800B01A4  _HANA_OBJEND
 800B01A4  _HANA_DTORS_ORGEND
 800B01A4  _HANA_DTORS_ORG
 800B01A4  _HANA_DTORS_OBJEND
 800B01A4  _HANA_DTORS_OBJ
 800B01A4  _HANA_CTORS_ORGEND
 800B01A4  _HANA_CTORS_ORG
 800B01A4  _HANA_CTORS_OBJEND
 800B01A4  _HANA_CTORS_OBJ
 800B065C  K_SDISP_LDTBL0
 800B071C  K_SDISP_LDTBL1
 800B073C  K_SDISP_BGDATA
 800B07FC  K_SDISP_WINDOW_ODATA
 800B0A64  K_SDISP_NUM_ODATA
 800B0B7C  K_SDISP_ETC_ODATA
 800B0BB4  K_SDISP_PARTS_ODA

(Source: tikal.)

References#


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