#!/usr/local/bin/bash
#
# ツールのソースは /project/ZELDA/tool/src/Pressにある
#
# $Log: zelda_press,v $
# Revision 1.1.1.1  2003/06/09 19:12:09  wheeler
# Majora's Mask tree from Nintendo
#
# Revision 2.25  2000-09-05 19:13:18+09  soejima
# *** empty log message ***
#
# Revision 2.24  2000-07-14 14:05:41+09  soejima
# *** empty log message ***
#
# Revision 2.23  2000-07-14 13:18:36+09  soejima
# *** empty log message ***
#
# Revision 2.22  2000-04-25 11:58:17+09  hayakawa
# *** empty log message ***
#
# Revision 2.21  2000-04-24 17:39:35+09  hayakawa
# schedule_dma_static_test
#
# Revision 2.20  2000-04-21 15:47:07+09  hayakawa
# *** empty log message ***
#
# Revision 2.19  2000-04-21 11:31:32+09  hayakawa
# 圧縮変更
#
# Revision 2.18  2000-02-24 10:36:37+09  hayakawa
# 日付表示修正
#
# Revision 2.17  2000-02-22 12:48:27+09  soejima
# *** empty log message ***
#
# Revision 2.16  2000-02-21 21:58:24+09  soejima
# *** empty log message ***
#
# Revision 2.15  2000-02-19 16:20:05+09  hayakawa
# 圧縮できないセグメント schedule_static.d 追加
#
# Revision 2.14  2000-02-08 10:56:13+09  hayakawa
# *** empty log message ***
#
# Revision 2.13  2000-02-07 14:54:22+09  hayakawa
# *** empty log message ***
#
# Revision 2.12  2000-02-04 16:10:56+09  hayakawa
# kaleido_map_grand_static2_test.d
#
# Revision 2.11  2000-02-03 19:29:34+09  hayakawa
# map_name_static_test
#
# Revision 2.10  2000-02-03 19:08:24+09  hayakawa
# *** empty log message ***
#
# Revision 2.9  2000-02-03 17:02:38+09  hayakawa
# icon_item_static.dは圧縮するようにした
# いくつか追加＆削除
#
# Revision 2.8  2000-02-02 21:35:03+09  hayakawa
# *** empty log message ***
#
# Revision 2.7  1999-08-31 15:16:43+09  soejima
# d2_＊_pal_staticの非圧縮
#
# Revision 2.6  1999-08-31 13:40:04+09  matutani
# kaleido_map_grand_static2追加
#
# Revision 2.5  1999-07-28 17:01:20+09  soejima
# *** empty log message ***
#
# Revision 2.4  1999-05-27 14:27:20+09  soejima
# week_static
#
# Revision 2.3  1999-04-02 18:31:09+09  matutani
# map_grand_static2.d追加
#
# Revision 2.2  1998-10-29 16:31:56+09  soejima
# ＰＡＬ変更
#
# Revision 2.1  1998-10-22 21:31:42+09  zelda
# ＲＯＭ出しバージョン(NTSC)
#
# Revision 1.76  1998/10/01 03:29:44  hayakawa
# *** empty log message ***
#
# Revision 1.75  1998-10-01 11:56:08+09  hayakawa
# 32Mちょうどばーじょん
#
# Revision 1.74  1998-09-11 22:21:19+09  soejima
# *** empty log message ***
#
# Revision 1.73  1998-09-11 22:19:03+09  zelda
# *** empty log message ***
#
# Revision 1.72  1998-09-09 22:58:26+09  zelda
# *** empty log message ***
#
# Revision 1.71  1998-08-24 21:34:14+09  hayakawa
# *** empty log message ***
#
# Revision 1.70  1998-08-24 21:09:01+09  hayakawa
# z_segment.declテスト
#
# Revision 1.69  1998-08-12 14:42:28+09  soejima
# *** empty log message ***
#
# Revision 1.68  1998-08-12 14:10:14+09  zelda
# n64dd.d圧縮するとなぜか動かない？？？
#
# Revision 1.67  1998-08-11 09:23:29+09  zelda
# *** empty log message ***
#
# Revision 1.66  1998-08-08 21:17:02+09  zelda
# *** empty log message ***
#
# Revision 1.65  1998-07-31 11:42:40+09  hayakawa
# *** empty log message ***
#
# Revision 1.64  1998-07-30 20:35:27+09  zelda
# 圧縮するファイルを増加
#
# Revision 1.63  1998-07-25 16:28:55+09  soejima
# *** empty log message ***
#
# Revision 1.62  1998-07-16 12:04:19+09  hayakawa
# 圧縮するファイルを増やした
#
# Revision 1.61  1998-07-03 17:16:17+09  soejima
# *** empty log message ***
#
# Revision 1.60  1998-06-09 13:39:07+09  zelda
# 圧縮ファイル追加
#
# Revision 1.59  1998-05-18 14:14:46+09  hayakawa
# makemaskは省略します
#
# Revision 1.58  1998-05-14 13:20:01+09  soejima
# *** empty log message ***
#
# Revision 1.57  1998-04-24 11:49:26+09  hayakawa
# ＶＲボックスのパレットデータは圧縮効率が悪いので圧縮しないようにした
#
# Revision 1.56  1998-04-15 21:07:22+09  hayakawa
# ツールのソースは /project/ZELDA/tool/src/Pressにある
#
# Revision 1.55  1998-04-15 21:02:25+09  hayakawa
# ツールの復帰値をチェックするようにした
#
# Revision 1.54  1998-04-03 18:37:12+09  hayakawa
# 分割ＤＭＡicon_item_24_static追加
#
# Revision 1.53  1998/04/02  07:20:19  hayakawa
# vr_*_static.dを消してしまっていた
#
# Revision 1.52  1998/04/02  06:26:19  hayakawa
# sceneをp1で圧縮するようにした
#
# Revision 1.51  1998/03/19  02:48:42  hayakawa
# test01_*.d 圧縮しません（ツールテスト用）
#
# Revision 1.50  1998/03/18  08:05:55  hayakawa
# メッセージ追加
#
# Revision 1.49  1998/03/17  02:01:54  nisiwaki
# 圧縮ファイルを*_room*.dまで増加
#
# Revision 1.48  1998/03/16  05:37:45  soejima
# *** empty log message ***
#
# Revision 1.47  1998/03/10  02:30:02  hayakawa
# *** empty log message ***
#
# Revision 1.46  1998/03/10  02:27:49  hayakawa
# 圧縮しないときに圧縮キャッシュをクリアするようにした
#
# Revision 1.45  1998/03/09  12:39:25  hayakawa
# ベリファイフラグ新設
#
# Revision 1.44  1998/03/09  08:22:00  soejima
# ???
#
# Revision 1.43  1998/03/07  10:07:08  soejima
# *** empty log message ***
#
# Revision 1.42  1998/03/07  08:51:04  soejima
# *** empty log message ***
#
# Revision 1.41  1998/03/06  07:38:01  hayakawa
# 圧縮ファイル増やした
#
# Revision 1.40  1998/03/06  01:49:19  hayakawa
# dmadata のマップ情報は dmadata.map に出力されます
#
# Revision 1.39  1998/02/26  12:05:04  sasaki
# p1で32Mを超えたので圧縮するファイルを増やした
#
# Revision 1.38  1998/02/26  04:18:16  hayakawa
# cmppass を cflags に変更
# p1で32Mを超えたので圧縮するファイルを増やした
#
# Revision 1.37  1998/02/23  05:16:27  hayakawa
# ディレクトリの指定がまずかったのを修正
# いまのところ rom_d でぃれくとりでしか動かない
#
# Revision 1.36  1998/02/23  03:01:45  tarukado
# Error をとった
#
# Revision 1.35  1998/02/23  02:54:53  hayakawa
# 細々修正
# p1で圧縮するファイルを増やした
# カレントディレクトリで作業するように変更
#
# Revision 1.34  1998/02/21  08:42:03  hayakawa
# もう一度 make し直してください
# のときに exit 1 するようにした
#
# Revision 1.33  1998/02/20  01:43:49  hayakawa
# 圧縮しないファイルをしていた
#
# Revision 1.32  1998/02/18  08:43:38  hayakawa
# *** empty log message ***
#
# Revision 1.31  1998/02/17  09:29:00  hayakawa
# *** empty log message ***
#
# Revision 1.30  1998/02/16  04:34:05  okajima
# *** empty log message ***
#
# Revision 1.29  1998/02/16  02:41:29  okajima
# *** empty log message ***
#
# Revision 1.28  1998/02/16  02:24:39  soejima
# *** empty log message ***
#
# Revision 1.27  1998/02/16  01:55:14  hayakawa
# 分割ＤＭＡmessage_data_static.d追加
#
# Revision 1.26  1998/01/29  02:22:47  hayakawa
# リダイレクトファイルの拡張子を .out から .stdout に変更
#
# Revision 1.25  1998/01/27  07:04:01  hayakawa
# z_segment_decl.cの先頭に Don't check in this file!! をつけるようにしてみた
#
# Revision 1.24  1997/10/30  00:48:22  hayakawa
# *** empty log message ***
#
# Revision 1.23  1997/10/16  11:20:15  hayakawa
# rom.map名前変更
#
# Revision 1.22  1997/10/07  14:15:38  hayakawa
# -p3追加
#
# Revision 1.21  1997/10/02  07:06:57  hayakawa
# 分割ＤＭＡmessage_static追加
#
# Revision 1.20  1997/09/24  00:38:03  hayakawa
# -pオプション追加
#
# Revision 1.19  1997/09/10  11:00:59  hayakawa
# rommap_new導入
#
# Revision 1.18  1997/09/05  11:03:37  hayakawa
# *** empty log message ***
#
# Revision 1.17  1997/09/05  11:02:28  hayakawa
# makemaskするようにした
#
# Revision 1.16  1997/09/05  04:49:23  hayakawa
# 一部を除き全部のセグメントを圧縮するようにした
#
# Revision 1.15  1997/09/05  01:02:40  hayakawa
# エラーチェックの強化など
#
# Revision 1.14  1997/09/02  00:52:14  hayakawa
# $PATHに依存しないようにした
#
# Revision 1.13  1997/08/27  01:43:23  iwawaki
# データ追加
#
# Revision 1.12  1997/08/23  08:09:45  hayakawa
# *** empty log message ***
#
# Revision 1.11  1997/08/22  13:50:42  hayakawa
# szs対応
#
# Revision 1.10  1997/08/20  09:22:56  hayakawa
# *** empty log message ***
#
# Revision 1.9  1997/08/20  09:08:42  hayakawa
# *** empty log message ***
#
# Revision 1.8  1997/08/20  01:43:26  hayakawa
# ４Ｍラムでの圧縮解凍テスト
#
# Revision 1.7  1997/08/19  10:10:03  hayakawa
# *** empty log message ***
#
# Revision 1.6  1997/08/19  09:40:58  hayakawa
# *** empty log message ***
#
# Revision 1.5  1997/08/19  06:22:02  umemiya
# *** empty log message ***
#
# Revision 1.4  1997/08/18  12:37:33  hayakawa
# *** empty log message ***
#
# Revision 1.3  1997/08/18  12:27:41  hayakawa
# *** empty log message ***
#
# Revision 1.2  1997/08/18  11:50:49  hayakawa
# *** empty log message ***
#
# Revision 1.1  1997/08/18  11:49:05  hayakawa
# Initial revision
#

ZELDA_TOOL_BIN=$ZELDA_ROOT/tool/bin
#PATH=$ZELDA_TOOL_BIN:$PATH
PATH=/usr/bin

ROMFILL=$ZELDA_TOOL_BIN/romfill
ROMADDRESS=$ZELDA_TOOL_BIN/romaddress
ROMALIGN=$ZELDA_TOOL_BIN/romalign
ROMDIVIDE=$ZELDA_TOOL_BIN/romdivide
ROMMAP=$ZELDA_TOOL_BIN/rommap
ROMMAP_NEW=$ZELDA_TOOL_BIN/rommap_new
SLICNV=$ZELDA_TOOL_BIN/slicnv
SLIENC=$ZELDA_TOOL_BIN/sliencV11
SLIDEC=$ZELDA_TOOL_BIN/slidec
MAKEMASK=/usr/sbin/makemask

echo -n "Tool checking ..."
for tool in $ROMADDRESS $ROMALIGN $ROMDIVIDE $ROMMAP $SLICNV $SLIENC $SLIDEC $ROMFILL
do
  echo -n "$(basename $tool) "
  if [ ! -x $tool ]; then
    echo $tool not exist
    exit 1
  fi
done
echo "ok"

#
#
#
date_HMS() {
    date +%H:%M:%S
}

#
# 行を消去し、カーソルを復帰する
#
clearline() {
  echo -n -e "\r\033[K" >&2
}

#
# *.d を連結する。
# *.szpが存在すれば、*.dの代わりに連結する
# *.szsが存在すれば、*.szpの代わりに連結する
#
szpcat() {
  for dfile in $*
  do
    szpfile=${dfile%.d}.szp
    szsfile=${dfile%.d}.szs
    clearline
    if [ -f $szsfile ]; then
      echo -n "$szsfile" >&2
      cat $szsfile
    elif [ -f $szpfile ]; then
      echo -n "$szpfile" >&2
      cat $szpfile
    else
      echo -n "$dfile" >&2
      cat $dfile
    fi
  done
  echo >&2
}

#
# 引数の拡張子を .d に変更し、_DECL_(ファイル名.d) として表示する
#
echodecl() {
  for segment in $*
  do
    echo "_DECL_(${segment%.d})"
  done
}

#
# .d ファイルを圧縮し、 .szp ファイルを作成する
# 既に正当な .szp ファイルが存在している場合は圧縮しません
#  .szp ファイルは１６の倍数になります。
# 引数は一つだけ
#
d2szp1() {

  dfile=$1
  ddfile=${dfile%.d}.dd
  szpfile=${dfile%.d}.szp
  
  if [ ! -f $dfile ]; then
    echo " $dfile は存在しません" >&2
    return 1;
  fi
  if [ -f $szpfile ]; then
    if [ $cflag = 1 ]; then return 0; fi
    echo -n " 解凍 "
    $SLIDEC $szpfile $ddfile
    echo -n " 比較 "
    cmp $dfile $ddfile
    r=$?
    rm -f ${ddfile}
    if [ $r = 0 ]; then 
      echo -n " 一致 "
      return 0;
    fi
  fi
  echo -n " 圧縮 "
  $SLIENC $dfile > /dev/null 2>&1
  $ROMALIGN 16 $szpfile
}

#
# .d ファイルを圧縮し、 .szs ファイルを作成する
# 既に正当な .szs .szp ファイルが存在している場合は圧縮しません
#  .szs ファイルは１６の倍数になります。
# 引数は一つだけ
#
d2szs1() {

  dfile=$1
  ddfile=${dfile%.d}.dd
  szpfile=${dfile%.d}.szp
  szsfile=${dfile%.d}.szs

  if [ ! -f $dfile ]; then
    echo "$dfile は存在しません" >&2
    return 1;
  fi
  if [ -f $szsfile ]; then 
    if [ $cflag = 1 ]; then
      echo -n " 解凍比較省略 "
      return 0
    fi
    echo -n " 解凍 "
    $SLIDEC $szsfile $ddfile
    echo -n " 比較 "
    echo -e -n "\033[33m"
    cmp $dfile $ddfile
    r=$?
    echo -e -n "\033[m"
    rm -f ${ddfile}
    if [ $r = 0 ]; then 
      echo -n " 一致 "
      return 0;
    fi
  fi
  if [ -f $szpfile ]; then 
    if [ $cflag = 1 ]; then
      echo -n " 解凍比較省略 "
      return 0
    fi
    echo -n " 解凍 "
    $SLIDEC $szpfile $ddfile
    echo -n " 比較 "
    cmp $dfile $ddfile
    r=$?
    rm -f ${ddfile}
    if [ $r != 0 ]; then 
      echo -n " 圧縮 "
      $SLIENC $dfile > /dev/null 2>&1
    fi
  else
    echo -n " 圧縮 "
    $SLIENC $dfile > /dev/null 2>&1
  fi
  echo -n " 変換 "
  $SLICNV $szpfile $szsfile
  rm -f $szpfile
  $ROMALIGN 16 $szsfile
}

rmv() {
  for file in $*
  do
    if [ -f $file ]; then
      echo " $file を削除します " >&2
      rm -f $file
    fi
  done
}

#
# *.d を圧縮する。
#
sli() {
  no=1
  for dfile in $*
  do
    clearline
    echo -n "$no/$#:$dfile" >&2
    szpfile=${dfile%.d}.szp
    szsfile=${dfile%.d}.szs
    ddfile=${dfile%.d}.dd
    case ${dfile} in
      schedule_dma_static.d | icon_item_static.d | icon_item_24_static.d | anime_model_[1-6]_static.d | anime_texture_[1-6]_static.d | softsprite_matrix_static.d | gameplay_object_exchange_static.d )
        echo " ROM使用しません（削除） " >&2
        rmv $szpfile $szsfile $dfile
	touch $dfile
        ;;
      makerom.d | boot.d | dmadata.d | Audiobank.d | Audioseq.d | Audiotable.d )
        echo " 圧縮しません（対象外） " >&2
        rmv $szpfile $szsfile
        ;;
      kanji.d | link_animetion.d | *_static_test.d | *_static2_test.d | do_action_static.d | nes_do_action_static.d | ger_do_action_static.d | fra_do_action_static.d | spa_do_action_static.d | message_static.d | *message_data_static.d | *usa_message_data_static.d | *ger_message_data_static.d | *fra_message_data_static.d | *spa_message_data_static.d | *usa_message_table_static.d | *ger_message_table_static.d | *fra_message_table_static.d | *spa_message_table_static.d | message_texture_static.d | nes_font_static.d | map_grand_static2.d | week_static.d )
        echo " 圧縮しません（分割ＤＭＡ） " >&2
        rmv $szpfile $szsfile
        ;;
      test01_*.d )
        echo " 圧縮しません（ツールテスト用） " >&2
        rmv $szpfile $szsfile
        ;;
      gameplay_object_exchange_static.d | anime_*_*_static.d )
        echo " 圧縮しません（非効率） " >&2
        rmv $szpfile $szsfile
        ;;
      title_static.d | \
      *_scene.d | *_room_*.d | object_*.d | gameplay_*.d | \
      icon_item_field_static.d | icon_item_dungeon_static.d | icon_item_jpn_static.d | icon_item_nes_static.d | icon_item_ger_static.d | icon_item_fra_static.d | icon_item_spa_static.d | \
      nintendo_rogo_static.d | \
      code.d | z_select_static.d | ovl_*.d )
        if [ $pflag = 2 -o $pflag = 1 ]; then
          d2szs1 $dfile
        else
          echo " 圧縮しません（高速化） " >&2
          rmv $szpfile $szsfile
        fi
        ;;
      * )
        if [ $pflag = 2 ]; then
          d2szs1 $dfile
        else
          echo " 圧縮しません（高速化） " >&2
          rmv $szpfile $szsfile
        fi
        ;;
    esac
    if [ -f $szpfile -a ! -f $szsfile ]; then
      echo "$szpfile があるのに $szsfile がない" >&2
    fi
    if [ $bflag != 1 -a -f $szsfile ]; then
      echo -n " ベリファイ " >&2
      $SLIDEC $szsfile ${ddfile}
      cmp ${dfile} ${ddfile}
      if [ $? != 0 ]; then 
        echo " ＮＧ！？ $szsfile を削除します " >&2
        rm -f $szsfile
      else
        echo " ＯＫ！ " >&2
      fi
      rm -f ${ddfile}
    else
        echo " ベリファイ省略！ " >&2
    fi
    no=$((no+1))
  done
  echo >&2
}

#
# *.d を連結する。
# *.szpが存在すれば、*.dの代わりに連結する
#
sli_scene() {
  for scene in $*
  do
    sli ${scene}_scene.d ${scene}_room_*.d
  done
}

#
# ファイルのチェック
#
read_check() {
  for file in $*
  do
    if [ ! -f $file ]; then
      echo $file がありません
      exit 1
    elif [ ! -r $file ]; then
      echo $file が読めません
      exit 1
    fi
  done
}

#
# オプション解析
#
optana() {
  pflag=0 # 動作モード
  cflag=0 # 1:圧縮キャッシュの整合性をチェックしない
  bflag=1 # 1:ベリファイしない
  while getopts ":p:c:b:" opt; do
    case $opt in
      p ) pflag=$OPTARG ;;
      c ) cflag=$OPTARG ;;
      b ) bflag=$OPTARG ;;
      \? ) echo 'usage: zelda_press [-p #] [-c #] [-b #]'
           echo '-p0 : *圧縮せずにテーブルだけをつくる'
           echo '-p1 : 高速に圧縮する'
           echo '-p2 : 完全に圧縮する'
           echo '-p3 : 分割だけを行う'
           echo '-c1 : 圧縮キャッシュの整合性をチェックしない'
           echo '-c0 : *圧縮キャッシュの整合性をチェックする'
           echo '-b1 : *ベリファイしない'
           echo '-b0 : ベリファイする'
           return 1 ;;
    esac
  done
}

optana $* || exit 1

ZELDA_INFO=zelda_makerom.stdout
ROMIMG=rom
ROMPAK=romP
ROMPAK32=romPP

echo $(date_HMS) "7 $ZELDA_INFO を解析し、rom.map を作成"
read_check $ZELDA_INFO
work=$(grep "Creating segment symbol source file in" $ZELDA_INFO)
work=${work#"Creating segment symbol source file in "}
read_check $work
$ROMMAP_NEW $work > rom.map
if [ $? != 0 ]; then echo "ERROR!!";exit 1; fi

SEGDCL=z_segment.decl
SEGBAK=z_segment.decl.bak
SEGTMP=z_segment.decl.tmp
echo $(date_HMS) "6 rom.map を解析し $SEGDCL を作成"
dfiles=$(tail +2 rom.map|cut -d" " -f1)
#(echo "/* Don't check in this file!! */"; echodecl $dfiles) > $SEGTMP
echodecl $dfiles > $SEGTMP

if ! cmp $SEGDCL $SEGTMP
then
  echo 
  echo "＊圧縮に必要なテーブルを更新しました"
  echo "＊圧縮ROMをつくるためにはこのテーブルを組み込む必要があります"
  echo "＊もう一度 make し直してください＊"
  echo 
  mv $SEGDCL $SEGBAK
  mv $SEGTMP $SEGDCL
  exit 1
fi

if [ $pflag = 0 ]; then exit 0; fi

echo $(date_HMS) '5 $ROMIMG を分割し、*.d を作成'
read_check $ROMIMG
$ROMDIVIDE rom.map $ROMIMG
if [ $? != 0 ]; then echo "ERROR!!";exit 1; fi

if [ $pflag = 3 ]; then exit 0; fi

echo $(date_HMS) '4 *.d を圧縮し、 *.szp を作成'
sli *.d

echo $(date_HMS) '3 *.d *.szp のサイズを調べ、dmadata.d を作成'
read_check dmadata.d
cp dmadata.d dmadata.d.bak
echo "dmadata のマップ情報は dmadata.map に出力されます"
$ROMADDRESS rom.map dmadata.d > dmadata.map
if [ $? != 0 ]; then echo "ERROR!!";exit 1; fi
#ls -l dmadata.d dmadata.d.bak

echo $(date_HMS) '2 *.d *.szp を連結して 圧縮 $ROMIMG を作成'
read_check makerom.d
szpcat makerom.d $dfiles > $ROMPAK

echo " makemaskは省略します "
##echo " makemaskするとgloadできなくなる "
##$MAKEMASK $ROMPAK
if [ $? != 0 ]; then echo "ERROR!!";exit 1; fi

# ７−１ マスタデータのターゲット容量への切り上げ（ランクＡ）
#
echo $(date_HMS) "1 ロムサイズ調整＆結果表示 (32M=33554432)"
$ROMFILL $ROMPAK $ROMPAK32 33554432
ls -l $ROMIMG $ROMPAK $ROMPAK32

echo $(date_HMS) "0 後始末"
#\rm $ROMPAK *.d *.dd *.szp
