コグノスケ


link 未来から過去へ表示  link 過去から未来へ表示(*)

link もっと前
2023年7月12日 >>> 2023年8月11日
link もっと後

2023年7月12日

自宅のサーバーとPHP

目次: 自宅サーバー

自宅のファイルサーバー兼WebサーバーでPHPが動かなくなっていました。

素のPHP 8すら動かないので、おそらくPHP 5の寿命が尽きたときにPHP周りの設定が全部吹っ飛んで動かなくなったと思われます。自宅のWebサーバーは自宅から見えないので、長らく気づいていませんでした……。あれまあ。

まずはPHP CGIや日記システムで使っているGDやmbstringをインストールします。

PHPのインストール
# apt-get install php-cgi php-gd libapache2-mod-php8.2 php8.2-mbstring

Apache 2の設定ファイルを変更してPHP 8.2を有効にします。

Apache 2でPHP 8.2を有効にする
# cd /etc/apache2/mods-enabled
# ln -s ../mods-available/php8.2.conf
# ln -s ../mods-available/php8.2.load

# systemctl restart apache2

Apache 2はユーザーディレクトリといって /home/username/public_html/ ディレクトリに置いたファイルが、URL /~username/ で見える仕組みがありまして、日記システムはユーザーディレクトリに配置しています。

初期状態のphp8.2.confだとユーザーディレクトリの配下にあるPHPスクリプトは動きません。わざと無効化してあります。

php 8.2のユーザーディレクトリの設定

# /etc/apache2/mods-enabled/php8.2.conf

#...略...

# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_flag engine Off
    </Directory>
</IfModule>

コメントにある通りIfModuleタグごと全てコメントにして、Apache 2を再起動しましょう。これできっとPHP 8が動くはずです。

編集者:すずき(2024/01/13 14:29)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年7月13日

PHP 8への道のり

目次: 自宅サーバー

この日記システムをPHPの最新バージョンPHP 8に対応させました。

きっかけはさくらインターネットから「PHP 5を使うのは危険だよ」というメールが来たことです。PHP 5.6のEOLは2018年なので5年くらい放置していたんですね。さすがにサボりすぎました。

PHP 5とPHP 7は互換性が保たれていて(PHP 6は欠番らしい)おり1文字も変更することなくPHPのバージョンアップに対応できました。ところがPHP 8は古い機能を色々と廃止したようで全く動きませんでした。

PHP 8で動かなくなった機能達

PHP 8で動かなくなった機能達のエラーメッセージや直し方(正しいかどうか知らない)を順不同で紹介したいと思います。

get_magic_quotes_gpc() 関数は廃止
PHP Fatal error:  Uncaught Error: Call to undefined function get_magic_quotes_gpc()

この関数は説明を見ても常にfalseを返すと書いてあり、もはや存在しようがしなかろうが呼ぶ意味がありません。この関数を呼んでいるコードごと消しました。

クラスのコンストラクタが曲者でした。PHP 7までクラスと同名の関数がコンストラクタ扱いされましたが、PHP 8から __construct() がコンストラクタ扱いされます。この変更の影響であらゆるクラスの初期化が実行されなくなって、訳のわからないエラーを引き起こしました。デバッグが一番面倒くさかったです。

波括弧のオフセット指定は廃止
PHP Fatal error:  Array and string offset access syntax with curly braces is no longer supported

PHP 8では波括弧 {} によるオフセットの指定が廃止されたので、角括弧 [] に置き換える必要があります。難しくはないですが、地味に使っている箇所が多く修正が大変でした……。

each() 関数は廃止
PHP Fatal error:  Uncaught Error: Call to undefined function each()

PHP 8ではeach() 関数が廃止されました。これも複数ヶ所で使っていて修正が面倒でした。

修正例

// 修正前
reset($array);
list($a, $b) = each($array);

// 修正後
reset($array);
$a = key($array);
$b = current($array);

上記のように先頭のキーと値を取り出すためだけに使っていたので、単純にkey() とcurrent() 関数で書き換えました。

mb_strrpos() の引数
PHP Fatal error:  Uncaught TypeError: mb_strrpos(): Argument #3 ($offset) must be of type int, string given

PHP 7はmb_strrpos() 関数の3番目の引数(offsetの位置)にencodeを指定してもエラーにならなかったのですが、PHP 8ではoffset, encodeを指定しないとエラーになるようです。PHPは良くわかりませんなあ。

編集者:すずき(2024/01/13 14:29)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年7月14日

AndesのCPUコアが搭載されたRISC-V SoCボードを購入

目次: RISC-V

先日6月14日に発売開始されたRenesas RZ/Five(R9A07G043F01GBG)搭載のボードAP-RZFV-0A製品紹介サイトへのリンク)を購入しました。

SoCはRenesas製で、CPUコアは台湾Andes TechnologyのAX45MP(製品紹介サイトへのリンク)です。

追加部品を購入

ボードだけ購入するとACアダプタが付属していません。全部入りが良ければLinux開発キットを併せて購入すると良いかと思います。

秋月にて5VセンタープラスのACアダプタATS012S-W050U(製品紹介サイトへのリンク)を購入しました。700円です。安い。何も考えず2A出力のアダプタにしましたが、出力が足りなかったらまた考えます。

ボード上のJTAG端子CN3を見ると、ハーフピッチと呼ばれる1.27mm間隔の10ピンヘッダでした。このヘッダに接続できるJTAGケーブルを持っていないので、Strawberry LinuxにてJTAG変換基盤ARM-JTAG-20-10(製品紹介サイトへのリンク)を購入しました。800円くらいです。これも安い。

電源に関してはACアダプタ以外にも、安定化電源やUSBから取る方法(ジャンパ端子J18を半田付けでショートさせる必要あり)があります。ボードのマニュアルをご参照ください。

JTAGを繋ぐ

JTAGコネクタCN3にJTAG変換基盤ARM-JTAG-20-10のハーフピッチコネクタを接続します。ケーブルの赤い線が1番ピン側(ボード上の白い三角マークがある、LANコネクタなどがある方)です。写真も載せておきます。


AP-RZFV-0A CN3にJTAGケーブルを接続

ボードのマニュアルを見るとわかりますが、SoCにDEBUGENという端子があり [1]DebugModeと [0]NormalMode(出荷時設定)があるそうです。ボード上のDIPスイッチ(SW2の3番)をOFFにするとDebugModeに切り替わりJTAGが繋がるようになります。

OpenOCDにて接続

お持ちのJTAGによって設定がやや違いますが、SEGGER J-Linkの場合はOpenOCDの設定ファイルはこんな感じです。

OpenOCD設定ファイルfor RZ/Five
adapter speed 1000
reset_config trst_and_srst
 
set _CHIPNAME riscv
set _DAP_TAPID 0x1000563d
 
jtag newtap $_CHIPNAME dap -irlen 5 -ircapture 0x01 -irmask 0x03 \
        -expected-id $_DAP_TAPID
 
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME.0 riscv -chain-position $_CHIPNAME.dap -coreid 0

設定をファイルに保存したら、J-Linkの設定ファイルとともに指定して起動しましょう。

OpenOCD起動ログ
$ sudo ./src/openocd -c 'bindto 0.0.0.0' -f tcl/interface/jlink.cfg -f ~/openocd_renesas_rzv.cfg

Open On-Chip Debugger 0.11.0+dev-00551-gaad871805 (2022-01-16-22:30)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.
0
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : J-Link V11 compiled Jul  3 2020 10:47:34
Info : Hardware version: 11.00
Info : VTarget = 1.812 V
Info : clock speed 1000 kHz
Info : JTAG tap: riscv.dap tap/device found: 0x1000563d (mfg: 0x31e (Andes Technology Corporation), part: 0x0005, ver: 0x1)
Info : datacount=4 progbufsize=8
Info : Examined RISC-V core; found 1 harts
Info :  hart 0: XLEN=64, misa=0x800000000094312d
Info : starting gdb server for riscv.cpu.0 on 3333
Info : Listening on port 3333 for gdb connections

無事CPUが認識されました。よきかなよきかな。

編集者:すずき(2023/07/19 08:54)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年7月20日

RISC-Vも完璧じゃない

目次: RISC-V

RISC-Vは最後発の命令セットだけあって、従来の命令セットで評判の悪かった部分は改善されている場合が多いです。しかし人の作るものですからミスや見落としはあります。

例としてわかりやすいのがRV64I命令セットの32bit unsignedと64bit unsigned加算処理です。下記のようなコードを書いたとします。

32bit unsignedと64bit unsigned加算処理のサンプルコード

unsigned int __attribute__((noinline)) something(int n)
{
	return n * n;
}

int test(unsigned int num)
{
	unsigned long long sum = 0;

	for (int i = 0; i < num; i++) {
		sum += something(i);    //32bit unsigned + 64bit unsigned
	}

	return sum;
}

下記のようにコンパイルします。RV64GCはRV64IMAFDCの略(M: Multiplication and Division, A: Atomic, F: Single-Precision Floating-Point, D: Double-Precision Floating-Point, C: Compressed)です。RV64I以外のMAFDCの各命令も出てきますが、話題と関係ないので気にしないでください。RV64GCが基本的な命令セットくらいの認識でOKです。

RV64GCでコンパイル
$ riscv64-unknown-elf-gcc -g -O2 -march=rv64gc -mabi=lp64d -c -o rv64gc.o a.c

逆アセンブルを見ると変なシフト命令(アドレス24, 26)が2つ出力されます。

RV64GCを使用したときの逆アセンブル

000000000000001a <.L5>:
                sum += something(i);
  1a:   8522                    mv      a0,s0         # s0: i, s1: sum
  1c:   00000097                auipc   ra,0x0
  20:   000080e7                jalr    ra            # call something()
  24:   1502                    slli    a0,a0,0x20    # a0: something() の返り値
  26:   9101                    srli    a0,a0,0x20    # shift x 2で上位32ビットを0埋め
        for (int i = 0; i < num; i++) {
  28:   2405                    addiw   s0,s0,1
                sum += something(i);
  2a:   94aa                    add     s1,s1,a0      # shift x 2 + add
        for (int i = 0; i < num; i++) {
  2c:   ff2417e3                bne     s0,s2,1a <.L5>

RV64Iには32bit unsigned向けの加算命令がなく、32bit unsignedを64bit unsignedにゼロ拡張してから加算する必要があるためです。さらに悲しいことにゼロ拡張する命令もなく、32bit左シフト命令+32bit右論理シフト命令でゼロ拡張するヘボい処理になります。

SiFiveあなたもか

シフト命令2つくらい何だというのか?ケチケチするなよ?という感覚が普通かもしれませんが、余計な命令が出ると特にローエンドのCPUでは性能への影響が無視できません。どうやらCoreMarkのような典型的なベンチマークにも影響が出ていたようで、

SiFiveが公開しているCoreMarkの型定義(一部抜粋)

// GitHub: sifive/benchmark-coremark
// freedom-metal/core_portme.h

typedef signed short ee_s16;
typedef unsigned short ee_u16;
typedef signed int ee_s32;
typedef double ee_f32;
typedef unsigned char ee_u8;
typedef signed int ee_u32;     //★★★u32なのに "signed" intになっている★★★
typedef signed long ee_u64;    //★★★u64なのに "signed" longになっている★★★
#if __riscv_xlen == 32
typedef ee_u32 ee_ptr_int;
#else
typedef ee_u64 ee_ptr_int;
#endif
typedef signed int ee_size_t;

RISC-Vの盟主たるSiFiveすらも「unsigned型をsigned型にすりかえて性能を上げるぞい!」というCoreMarkハックを行っていた(該当箇所へのリンク)ほどです……。

RISC-Vパッチワーク

当然RV64Iのまずい点はRISC-Vの方々も気づいており、B拡張(Bit-manipulation extensions)を追加したときに上記の問題は修正されました(RISC-V Bitmanipulation extension規格書へのリンク)。

B拡張はZba, Zbb, Zbc, Zbsの4つがあります。

  • Zba: Address generation instructions
  • Zbb: Basic bit-manipulation
  • Zbc: Carry-less multiplication
  • Zbs: Single-bit instructions

この中のZba拡張にて32bit unsigned加算命令であるadd.uw命令が追加されました。他にも1, 2, 3bitシフト&加算命令なんかも追加されています。unsigned加算や1, 2, 3bitシフト&加算は配列の要素のアドレスを計算する際に頻出で、Address generation instructionsというグループ名にしたのでしょう。

Zba拡張を使うとどのように改善されるか確認します。

RV64GCとZba拡張でコンパイル
$ riscv64-unknown-elf-gcc -g -O2 -march=rv64gc_zba -mabi=lp64d -c -o rv64gcb.o a.c

逆アセンブルを見ると変なシフト命令は消滅し、新たにadd.uw命令が出力されていることが分かると思います。

RV64GCとZba拡張を使用したときの逆アセンブル結果

000000000000001a <.L5>:
                sum += something(i);
  1a:   8522                    mv      a0,s0       # s0: i, s1: sum
  1c:   00000097                auipc   ra,0x0
  20:   000080e7                jalr    ra          # call something()
        for (int i = 0; i < num; i++) {
  24:   2405                    addiw   s0,s0,1
                sum += something(i);
  26:   089504bb                add.uw  s1,a0,s1    # shift x 2は消滅、add.uwのみ
        for (int i = 0; i < num; i++) {
  2a:   ff2418e3                bne     s0,s2,1a <.L5>

めでたしめでたし。なんですけど、人によっては色々言いたいこともあると思います。Bit-manipulationとAddress generation全然関係ないぞ?とかね。

しかし冒頭にも書いたとおり、何事も最初から完璧なものはないです。命令セットが汚くなっていくのはRISC-Vが実用段階に入った証であり、むしろ良いことだと個人的には思います。

編集者:すずき(2023/07/23 17:11)

コメント一覧

  • hdkさん(2023/07/21 22:45)
    x86脳なので、mov %eax,%eax (32ビット→ゼロ拡張64ビット) とか、movzwl %ax,%eax (16ビット→ゼロ拡張32ビット) とか、そういうのに相当する何かがありそうに思ってしまいますが、わざわざシフト命令2個生成されるところをみると、ないんですね... intとintptr_tのサイズが同じならよかったんでしょうけど、違うと確かに厳しそう...
  • すずきさん(2023/07/23 17:10)
    x86はもちろん、先代であるMIPSにさえこの手のミスはないらしい(詳しくは知らない)んですが、RISC-Vは命令削減にこだわり過ぎたのか、見落としたのかなんだか知らんのですが、ミスってるんですよねー……。
open/close この記事にコメントする



2023年7月24日

OpenOCDで独自のCSRを追加してアクセスする

目次: OpenOCD

OpenOCDにRISC-Vの独自(もしくは標準に準拠しているものの新しすぎるなど)のCSR(Control and Status Register)を定義してアクセスする方法をメモしておきます。

前回はexpose_csrsを使って独自のレジスタを定義しました。この機能はOpenOCDの改造が不要で手軽な反面、2つの問題があります。1つ目の問題はSMPモードだと使えないことで、SMPモードと併用すると下記のように怒られCSRにアクセスできません。

SMPモードとexpose_csrsを併用したときの警告
Warn : Register csrNNN does not exist in riscv.cpu.0, which is part of an SMP group where this register does exist.

2つ目の問題点は名前がわかりづらいことです。csrNNNのようなほぼ番号同然の名前を暗記するのは正直言って辛いですよね。

独自のCSRを定義

CSR名を新たに追加するにはOpenOCDにパッチを当てて、再ビルドする必要があります。OpenOCDのビルド方法は以前書きました(2023年6月28日の日記参照)のでそちらに任せるとして、今回はパッチについて紹介しましょう。

前回同様、題材はRNMI CSRを使います。RISC-V Privileged Architectures V20211203(RISC-V Instruction Set Manual の2023-05-23のリリースページからダウンロードできます)を見ると、RNMIでは4つのCSRが定義されています。


Resumable NMI CSR

書き起こしておくと、

  • 0x740: mnscratch
  • 0x741: mnepc
  • 0x742: mncause
  • 0x744: mnstatus

となります。OpenOCDを変更すべき箇所はsrc/target/riscv/encoding.hというヘッダファイルだけです。

OpenOCDにRNMI CSRを追加するパッチ

diff --git a/src/target/riscv/encoding.h b/src/target/riscv/encoding.h
index c2da4e676..6c3f9cc12 100644
--- a/src/target/riscv/encoding.h
+++ b/src/target/riscv/encoding.h
@@ -2992,6 +2992,10 @@
 #define CSR_PMPADDR61 0x3ed
 #define CSR_PMPADDR62 0x3ee
 #define CSR_PMPADDR63 0x3ef
+#define CSR_MNSCRATCH 0x740
+#define CSR_MNEPC 0x741
+#define CSR_MNCAUSE 0x742
+#define CSR_MNSTATUS 0x744
 #define CSR_MSECCFG 0x747
 #define CSR_TSELECT 0x7a0
 #define CSR_TDATA1 0x7a1
@@ -4714,6 +4718,10 @@ DECLARE_CSR(pmpaddr60, CSR_PMPADDR60)
 DECLARE_CSR(pmpaddr61, CSR_PMPADDR61)
 DECLARE_CSR(pmpaddr62, CSR_PMPADDR62)
 DECLARE_CSR(pmpaddr63, CSR_PMPADDR63)
+DECLARE_CSR(mnscratch, CSR_MNSCRATCH)
+DECLARE_CSR(mnepc, CSR_MNEPC)
+DECLARE_CSR(mncause, CSR_MNCAUSE)
+DECLARE_CSR(mnstatus, CSR_MNSTATUS)
 DECLARE_CSR(mseccfg, CSR_MSECCFG)
 DECLARE_CSR(tselect, CSR_TSELECT)
 DECLARE_CSR(tdata1, CSR_TDATA1)

CSR番号とDECLARE_CSRを追加するだけで良いみたいです。さすがOpenOCD便利な作りですね。

NS31を使って動作確認

前回同様、RNMIを実装しているCPUの例としてNSITEXE NS31を用いてRNMI CSRを読み出してみましょう。

新たに追加したCSR名を指定してNS31のRNMI CSRを読み出す
(gdb) info reg mnscratch mnepc mncause mnstatus

mnscratch      0x0      0
mnepc          0x0      0
mncause        0x80000000       -2147483648
mnstatus       0x8      8

無事読み出すことができました。やはり名前が付いているとわかりやすいですね。

編集者:すずき(2023/09/24 09:19)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年7月28日

PHP 8への道のり、デバッグ編

目次: 自宅サーバー

以前(2023年7月13日の日記参照)この日記システムをPHPの最新バージョンPHP 8に対応させました。このとき実はコメントがついた日記の一部がエラーになって真っ白ページしか出なくなっていました。私も気づいていなかったくらいなので、誰も気づかなかったはず。たぶん。

エラーメッセージから原因がよくわからず、真面目にデバッグしてみたところ、タグを変換するための設定を思いっきり間違っていました。存在しないキーでハッシュを参照しまくっておりエラー多発です。これは動かないですね。

PHP 8の動きには納得ですけど、PHP 5はこれで動いていたことが逆に不思議です。PHP 5はおおらかなプログラミング言語ですね……。

編集者:すずき(2024/01/13 14:29)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年7月30日

PHP 8への道のり、PukiWiki編

目次: 自宅サーバー

以前(2023年7月28日2023年7月13日の日記参照)この日記システムをPHPの最新バージョンPHP 8に対応させました。日記システムは恐らく移行できたと思います。

このサイトはもう一つ主要なシステムとして、PukiWikiを設置していますが、バージョンアップをサボっていてPHP 8に未対応のバージョンの1.5.0か何かのままだったため、エラーになって真っ白ページになっていました。色々イカンので最新版の1.5.4にアップデートしました。

OSSの維持は大変そう

PukiWikiといえば2006年頃に1.4.x系のリリースが止まりました。私はいちユーザーでプロジェクトの内情は知らないですが、開発者の方々(※)が会話しているWikiを確認すると結構荒れてました。2010年頃には、メンテナに対して退けなんて意見を言っている人までいます(開発談義/10 - PukiWiki-devにログが残っています)。ひぇー、こわ……。

開発者不足で困っているPukiWikiプロジェクトですが、2014年に新たなコミッターさんが参加され、今は2年くらいに一度1.5.x系がリリースされています。

  • 1.5.4: 2022-03-30
  • 1.5.3: 2020-03-30
  • 1.5.2: 2019-03-01
  • 1.5.1: 2016-03-07
  • 1.5.0: 2014-07-19
  • 1.4.7_notb: 2006-10-21

コミットログを見ると1.5.x系の開発(PHP 5対応やPHP 8対応なども)はその新たなコミッターさんが頑張っていらっしゃるようです。10年続けているのは凄いですね。

(※)OSDNはプロジェクトメンバー = コミッターでしたっけ?PukiWikiのプロジェクトメンバーは メンバーリスト - PukiWiki - OSDN で確認できます。

編集者:すずき(2024/01/13 14:30)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年8月7日

Might and Magic Book Oneのキャラクター情報

目次: Might and Magicファミコン版

解析というほどでもないですが、残そうと思ってサボっていたメモのまとめです。キャラクターのステータス保存アドレスの一覧です。日本版と英語版はキャラクターの名前や職業が全然違います。いつも分からなくなりますね。

アドレス日本版英語版
0x6f00主人公 主人公
0x6f80ミラード RIGEL
0x7000オーウェインSAGE
0x7080ギデオン SONJA
0x7100ジェローム LILAC
0x7180ユーリエールVYRANA
0x7200バスティアンAZALEA
0x7280ポラリス KIRIE
0x7300テーミス FLINT
0x7380アデレード JHARED
0x7400エレクトラ BULZAI
0x7480ガーデニア ZORA
0x7500ゼノビア THORAK
0x7580デアトリス TIKRA
0x7600ポーリーン CHAROB
0x7680モードリアンHAMMER

キャラクターのステータスです。私も良くわからない部分がありますので、ご参考程度です。

オフセット意味
+0x00 性別(0x01: おとこ、0x02: おんな)
+0x01-02真の性格 / 性格(01: ローフル、02: カオティック、03: ニュートラル)
+0x03 種族(01: 人間、02: エルフ、03: ドワーフ、04: ノーム、05: 半オーク)
+0x04 職業(01: 騎士、02: 戦士、03: 弓使い、04: 僧侶、05: 魔法使い、06: 盗賊)
+0x05-06真の知性 / 現在の知性
+0x07-08真の力 / 現在の力
+0x09-0a真の魅力 / 現在の魅力
+0x0b-0c真の耐性 / 現在の耐性
+0x0d-0e真の素早さ / 現在の素早さ
+0x0f-10真の技能 / 現在の技能
+0x11-12真の幸運 / 現在の幸運
+0x13-14真のレベル / 現在のレベル
+0x15 年齢
+0x16 日数(100日で 1歳増える)
+0x17-19経験値(3バイト)
+0x1a
+0x1b-1c現在のMP(2バイト)
+0x1d-1e最大のMP(2バイト)
+0x1f-20真のML / 現在のML(魔法レベル)
+0x21-22GEM(2バイト)
+0x23-24現在のHP(2バイト)
+0x25-28真の最大HP(2バイト)/ 現在の最大 HP(2バイト)
+0x29 GOLD(3バイト)
+0x2c
+0x2d AC
+0x2e 防御力?
+0x2f FOOD
+0x30 状態(bit0: 眠り、1: 闇、2: 無言、3: 病気、4: 毒、5: 麻痺、6: 気絶、7: 下記参照)
bit7 をセットすると、動きが変わる。0xa0〜: 石、0xc0〜: 死亡、0xff: 灰
+0x31-36装備品(1バイト x 6)
+0x37-3cバックパック(1バイト x 6)
+0x3d-42装備品 魔法使用回数(1バイト x 6)
+0x43-48バックパック 魔法使用回数(1バイト x 6)
+0x49-4a真の耐魔法 / 現在の耐魔法
+0x4b-4c真の耐炎 / 現在の耐炎
+0x4d-4e真の耐寒 / 現在の耐寒
+0x4f-50真の耐電気 / 現在の耐電気
+0x51-52真の耐酸 / 現在の耐酸
+0x53-54真の耐恐怖 / 現在の耐恐怖
+0x55-56真の耐毒 / 現在の耐毒
+0x57-58真の耐眠 / 現在の耐眠
+0x59 武器攻撃力、ダイス(計算式dX+YのX)
+0x5a 武器攻撃力、追加(計算式dX+YのY)
+0x5b 弓の攻撃力、ダイス(計算式dX+YのX)
+0x5c 弓の攻撃力、追加(計算式dX+YのY)
+0x5d 盗賊の技能、初期値と1Lv分の上昇値は以下の通り。
  • 騎士0x00, +2
  • 戦士 未調査
  • 弓使い 未調査
  • 僧侶0x01, +2
  • 魔法使い0x01, +2
  • 盗賊0x32, +2、盗賊の合鍵を装備すると+20

クエストの管理フラグ系。

オフセット意味
+0x5e 受注したクエスト
  • 0x00: なし
  • 0x01-07: ロード・アイアンフィスト(ホワイトウルフ城)
  • 0x08-0e: ロード・インスペクトロン(ブラックリッジノース城)
  • 0x0f-15: ロード・ハッカー(ブラックリッジサウス城)
  • 0xff: アラマー王(アラマー城)
    「カーメンカのクリプトを探せ」はクリア不可能、僧侶ML3「ちゅうし」でキャンセル
+0x5f
+0x60
+0x61 メインクエストフラグ
  • bit0: 手紙(コーラック、ソーピガル地下)
  • bit1: 手紙(アガール、エルキューンの町)
  • bit2: 手紙(テルゴラン、ダスクの町)
  • bit3: 兄弟(ゾム、アルガリーの町)
  • bit4: 兄弟(ザム、ポートスミスの町)
  • bit5: ルビーの笛(C1)兄弟のフラグがクリアされる
  • bit6: 魔法の砦入場
  • bit7: 金の鍵(魔法の砦B2)全フラグが消える
+0x62 囚人のクエストフラグ
  • bit0: ラナローの依頼(コリンブルッフ洞窟)
  • bit1: ドラガデューン城
  • bit2: デューム城
  • bit3: アラマー城
  • bit4: ホワイトウルフ城
  • bit5: ブラックリッジノース城
  • bit6: ブラックリッジサウス城
  • bit7: E1の審判の巨人を訪れた(クリアできなくてもセット、他のフラグが消える)
+0x63 4匹のビーストクエストフラグ
  • bit0: 海のビースト
  • bit1: 砂漠のビースト
  • bit2: 空のビースト
  • bit3: 森のビースト
  • bit4: ?
  • bit5: ?
  • bit6: ?
  • bit7: 車輪を回した
+0x64
+0x65 オーラの色クエストフラグ
  • 0x00: 未確定
  • 0x01: あか
  • 0x02: あお
  • 0x03: みどり
  • 0x04: きいろ
  • 0x05: むらさき
  • 0x06: オレンジ
  • 0x07: くろ
  • 0x08: しろ
  • 0x0f: きんいろ
  • 0x40: E2でロボットに会った(ロード・アイアンフィストに会うと消える)
  • 0x80: A4で最果ての島の問いに正解した
+0x66 ロード・インスペクトロン(ブラックリッジノース城)条件達成フラグ
  • bit0: 森のあばら家
  • bit1: ブリセス・ピーク
  • bit2: サボテンのワイン
  • bit3: オクザールの神殿
  • bit4: ドラガデューンの GOLD を経験に変える泉
  • bit5: レイバン砦のクリスタルの謎を解け
  • bit6: 魔法の砦を征服せよ
  • bit7: 全部クリアするとセット
+0x67 ロード・ハッカー(ブラックリッジサウス城)条件達成フラグ
アイテム所持が条件の場合、王に話しかけた瞬間にフラグセットされる。
  • bit0: にんにく
  • bit1: とりかぶと
  • bit2: ベラドンナ
  • bit3: メデューサの首
  • bit4: ウィバーンの目
  • bit5: ドラゴンの牙
  • bit6: オクリムの指輪
  • bit7: 全部クリアするとセット
+0x68 ロード・アイアンフィスト(ホワイトウルフ城)条件達成フラグ
  • bit0: レイバン砦
  • bit1: ロード・キルバーンを探せ(さばくのちず、が条件)
  • bit2: ポートスミスの秘密を暴け
  • bit3: 海賊の秘密の洞窟を探せ
  • bit4: ジョリー・レイバンを探せ
  • bit5: 幽霊海賊船アナーキストを滅ぼせ
  • bit6: レイバン砦を征服せよ
  • bit7: 全部クリアするとセット
+0x69 ロード・インスペクトロン(ブラックリッジノース城)クリアフラグ
ビットの意味は条件達成フラグと同じ。
+0x6a ロード・ハッカー(ブラックリッジサウス城)クリアフラグ
ビットの意味は条件達成フラグと同じ。
+0x6b ロード・アイアンフィスト(ホワイトウルフ城)クリアフラグ
ビットの意味は条件達成フラグと同じ。
+0x6c 能力アップの泉クエストフラグ
  • bit0: 耐性(A1)
  • bit1: 魅力(D2)
  • bit2: 知性(E2)
  • bit3: 力(ポートスミス地下)
  • bit4: 技能(ダスク地下)
  • bit5: 素早さ(ダスク地下)
  • bit6: 幸運(ドラガデューン城)
  • bit7: 南のクレリック(ドラガデューン城B3)
+0x6d アストラルクエストフラグ
  • bit0: 封印1(アストラル)
  • bit1: 封印2(アストラル)
  • bit2: 封印3(アストラル)
  • bit3: 封印4(アストラル)
  • bit4: 封印5(アストラル)
  • bit5: 聖域(聖域でセット、イドの迷宮が未踏破扱いになる、2回聖域に行かせないため?)
  • bit6: イドの迷宮クリア
  • bit7: 聖域(ゲームクリアフラグ)
+0x6e
+0x6f 滞在中の町、パーティーメンバーのみ、セーブ時に更新
+0x70
+0x71-76仲間のID(1バイト x 6)セーブ時に更新
即変更が効く値はアドレス0xa7-acにある。
+0x77 パーティー人数
即変更が効く値はアドレス0xa6にある。
+0x78
+0x79
+0x7a
+0x7b
+0x7c
+0x7d
+0x7e
+0x7f チェックサム(詳細は未調査)
編集者:すずき(2023/09/29 23:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年8月8日

Might and Magic Book Oneの実行時情報

目次: Might and Magicファミコン版

残そうと思ってサボっていたMight and Magic book oneの解析メモです。ゲーム実行時の情報を保存しているアドレスの一覧です。予想も含まれるので間違っていたらごめんなさい。

マップIDは2021年10月17日の日記を参照してください。

モンスターID(モンスターの種類Aと種類Bの意味)は2023年8月9日の日記を参照してください。

アドレス意味
0x008b プロテクト「きょうふ」
0x008c プロテクト「さむさ」
0x008d プロテクト「ほのお」
0x008e プロテクト「どく」
0x008f プロテクト「さんのどく」
0x0090 プロテクト「でんげき」
0x0091 プロテクト「まほう」
0x0092 ひかりの残りポイント(1歩1P減る)
0x0093 プロテクト「バリア」
0x0094 プロテクト「よちのうりょく」
0x0095 プロテクト「すいじょうほこう」
0x0096 プロテクト「まぼろしのいぬ」
0x0097 プロテクト「せいしんぼうぎょ」
0x0098 プロテクト「かみのしゅくふく」
0x0099 プロテクト「とうめいフィールド」
0x009a プロテクト「くうちゅうシールド」
0x009b プロテクト「パワーシールド」
0x009c プロテクト「のろいのしょうきょ」
0x009e 現在のマップID
0x009f 現在のX座標
0x00a0 現在のY座標
0x00a6 パーティーの人数
0x00a7-00acパーティーメンバーID x 6
0x00ad 宝箱、罠の有無
0x00ae 宝箱の種類
0x00af-00b1宝箱の中のアイテム x 3
0x00b2-00b3宝箱の中のGOLD(2バイト)
0x00b4 宝箱の中のGEM
0x00b5 モンスターの数
0x00b6-00c4モンスターの種類A x 6
0x00c5-00d3モンスターの種類B x 6
0x03f0-03f5モンスターのHP x 6
編集者:すずき(2023/10/06 23:09)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年8月9日

Might and Magic Book OneのモンスターID情報

目次: Might and Magicファミコン版

残そうと思ってサボっていたメモのまとめです。モンスターIDの一覧です。

種類Aと種類Bがどこに書いてあるかについては2023年8月8日の日記を参照してください。

種類A種類B日本語名英語名
0x010x01しにくくらい FLESH EATER
0x010x02ミューラット BATTLE RAT
0x010x03つちのせいれい SLITHER BEAST
0x010x04ノーム GNOME
0x010x05ゴブリンおに GOBLIN
0x010x06グレムリン GREMLIN
0x010x07あくまのへいし GUARDSMAN
0x010x08コボルド KOBOLD
0x010x09ミュースライム MUTANT LARVA
0x010x0aオークおに ORC
0x010x0bおんりょう POLTERGEIST
0x010x0cジャッカル RABID JACKAL
0x010x0dスケルトン SKELETON
0x010x0eおろち SNAKE
0x010x0fようせい SPRITE
0x020x00ミューバット VAMPIRE BAT
0x020x01マイナーデモン MINOR DEMON
0x020x02デビルドッグ DEMON DOG
0x020x03ダンビートル DUNG BEETLE
0x020x04ひふきあり FIRE ANT
0x020x05グール GHOUL
0x020x06ノール GNOLL
0x020x07やまんば HAG
0x020x08キラービートル LOCUST PLAGUE
0x020x09リーダーオーク ORC LEADER
0x020x0aきょうせんし RABID LEPER
0x020x0bあくりょう ROTTING CORPSE
0x020x0cサベージスルー SAVAGE SHREW
0x020x0dビオランテン MANGORADRA
0x020x0eとうぞく THIEF
0x020x0fげんしじん TROGLODYTE
0x030x00ゾンビ ZOMBIE
0x030x01どくスライム ACIDIC BLOB
0x030x02ケンタウロス CENTAUR
0x030x03クレリック CLERIC
0x030x04マイナーデビル MINOR INCUBUS
0x030x05ひふきこがね FIRE BEETLE
0x030x06ガーゴイル GARGOYLE
0x030x07ひとくいあり GARGANTU ANT
0x030x08おおとかげ DINOLIZARD
0x030x09どくぐも GIANT SPIDER
0x030x0aハルピュイア HARPY
0x030x0bヒッポグリフ HIPPOGRIFF
0x030x0cさつじんばち KILLER BEES
0x030x0dペガサス PEGASUS
0x030x0eかげのせいれい SHADOW BEAST
0x030x0fワイルドボー WILD BOAR
0x040x00くろあなぐま WOLVERINE
0x040x01バーバリアン CAVE MAN
0x040x02デモンガード CARYATID GUARD
0x040x03コッカトライス COCKATRICE
0x040x04サイクロプス CYCLOPS
0x040x05ドルイド DRUID
0x040x06ライノビートル RHINO BEETLE
0x040x07ミュービートル CENTIPEDE
0x040x08まじゅつし MAGICIAN
0x040x09せんし MILITIAMAN
0x040x0aチーフオーク ORC
0x040x0bオグル CHIEFTAIN OGRE
0x040x0cサテュロス SATYR
0x040x0dつかいま SWARMING WASPS
0x040x0eユニコーン UNICORN
0x040x0fおおかみおとこ WEREWOLF
0x050x00ワイト WIGHT
0x050x01ザメリアン CAVE MAN CHIEF
0x050x02バジリスク BASILISK
0x050x03ミュースタッグ CELESTIAL STAG
0x050x04ダストデモン DUST DEMON
0x050x05おおさそり GIANT SCORPION
0x050x065つくびヒドラ 5 HEADED HYDRA
0x050x07ケルベロス WARRIOR CAT
0x050x08ミノタウロス MINOTAUR
0x050x09リーダーオグル OGRE CHIEF
0x050x0aまぼろしのきり PANTHRO MIST
0x050x0bゆうれい PHANTOM
0x050x0cけんし SWORDSMAN
0x050x0dトロル TROLL
0x050x0eきのゴーレム WOOD GOLEM
0x050x0fしりょう WRAITH
0x060x00ゆきおとこ YETI
0x060x01どくふきそう DEADLY SPORES
0x060x02まじょ ENCHANTRESS
0x060x03ひふきトカゲ FIRE LIZARD
0x060x04スロース GIANT SLOTH
0x060x05グリフィン GRIFFIN
0x060x06パイロヒドラ PYRO HYDRA
0x060x07あくむのししゃ MONONOKE
0x060x08マンティコア MANTICORE
0x060x09メデューサ MEDUSA
0x060x0aラクシャシャ RAKSHASHA
0x060x0bいしのゴーレム STONE GOLEM
0x060x0cケイブトロル CAVE TROLL
0x060x0dヒルトロル HILL TROLL
0x060x0eウォーロック WARLOCK
0x060x0fくまおとこ WEREBEAR
0x070x00くろまじゅつし WICKED WITCH
0x070x01あんさつしゃ ASSASSIN
0x070x02なきおんな BANSHEE
0x070x03つちのきょじん CAVE GIANT
0x070x04ぬえ CHIMERA
0x070x05たいきのせい AIR ELEMENTAL
0x070x06くびきりおとこ EXECUTIONER
0x070x07ゴーゴン GORGON
0x070x08レッサーデモン LESSER DEMON
0x070x09レッサーデビル LESSER INCUBUS
0x070x0aミイラおとこ MUMMY
0x070x0bしびとつかい NECROMANCER
0x070x0cスペクター SPECTER
0x070x0dホワイトウルフ WHITE WOLF
0x070x0eウィバーン WYVERN
0x070x0fもりのドラゴン GREEN DRAGON
0x080x00ブルードラゴン BLUE DRAGON
0x080x01イーブルアイ EVIL EYE
0x080x02だいちのせい EARTHELEMENTAL
0x080x03ぼうれい GHOST
0x080x04ゆきのきょじん FROST GIANT
0x080x05いしのきょじん STONE GIANT
0x080x068くびヒドラ 8 HEADED HYDRA
0x080x07ひのせいれい LAVA BEAST
0x080x08マンテスウォリアMANTIS WARRIOR
0x080x09ナーガ NAGA
0x080x0aダイノビートル DINOBEETLE
0x080x0bスフィンクス SPHINX
0x080x0cバンパイア VAMPIRE
0x080x0dとうし WARRIOR
0x080x0eウィザード WIZARD
0x080x0fゆきのドラゴン WHITE DRAGON
0x090x00いわのドラゴン GRAY DRAGON
0x090x01アーチドルイド ARCH DRUID
0x090x02こんとんのきし CHAOTIC KNIGHT
0x090x03グレートデモン GREATER DEMON
0x090x04グレートデビル GREAT INCUBUS
0x090x05ほのおのせい FIRE ELEMENTAL
0x090x06しゅごれい GUARDIAN
0x090x07らいじん STORM GIANT
0x090x0812くびヒドラ 12HEADED HYDRA
0x090x09みえざるキバ INVISIBLE EYES
0x090x0aまどうし MAGE
0x090x0bとうぞくのおさ MASTER THIEF
0x090x0cてつのゴーレム STEEL GOLEM
0x090x0dミイラまどう MUMMY
0x090x0eやみのドラゴン BLACK DRAGON
0x090x0fほのおのドラゴンRED DRAGON
0x0a0x00X!XX!X! XX!XX!XX!XX
0x0a0x01くろきし BLACK KNIGHT
0x0a0x02デモンロード DEMON LORD
0x0a0x03アーチデビル ARCH INCUBUS
0x0a0x04シェンロン GOLD DRAGON
0x0a0x05おいたるドラゴンSILVER DRAGON
0x0a0x06ダイヤゴーレム DIAMOND GOLEM
0x0a0x0716くびヒドラ 16HEADED HYDRA
0x0a0x08ハイクレリック HIGH CLERIC
0x0a0x09きりん KIRIN
0x0a0x0aリッチ LICH
0x0a0x0bアーチメイジ ARCH MAGE
0x0a0x0cハイアーチャー MASTER ARCHER
0x0a0x0dフェニックス PHOENIX
0x0a0x0eロックちょう ROC
0x0a0x0fサンドウォーム SAND WORM
0x0b0x00タイタン TITAN
0x0b0x01アルガりゅう ALGAE BEAST
0x0b0x02ふかきもの WATER RAT
0x0b0x03ランプリー LAMPREY
0x0b0x04リーチ GIANT LEECH
0x0b0x05クロコダイル CROCODILE
0x0b0x06ミュークラブ GIANT CRAB
0x0b0x07バラクーダ BARRACUDA
0x0b0x08ミュースクイド GIANT SQUID
0x0b0x09エレイール ELECTRIC EEL
0x0b0x0aうみぼうず SEA HAG
0x0b0x0bテンタクルズ HIPPOCAMPUS
0x0b0x0cわにざめ SHARK
0x0b0x0dセイレーン SIREN
0x0b0x0eみずのせい WATERELEMENTAL
0x0b0x0fうみへび SEA SERPENT
0x0c0x00かいりゅう SEA DRAGON
0x0c0x01さばくのビーストSCORPION
0x0c0x02もりのビースト DARK RIDER
0x0c0x03そらのビースト WINGED BEAST
0x0c0x04うみのビースト SEA BEAST
0x0c0x05デモンキング DEMON KING
0x0c0x06サカバスクイーンSUCCUBUS QUEEN
0x0c0x07チラノザウルス TYRANNOSAURUS
0x0c0x08エイリアン ALIEN
0x0c0x09ボルカノせんし NATIVES
0x0c0x0aかざんのかみ VOLCANO GIANT
0x0c0x0bポールピード PAUL PEAD
0x0c0x0cかいぞく PIRATE
0x0c0x0dかいぞくのおさ PIRATE CAPTAIN
0x0c0x0eGミノタウロス GRAY MINOTAUR
0x0c0x0fアーチャーおう LORD ARCHER
0x0d0x00レッドチラノ BRONTASAURUS
0x0d0x01ブルーチラノ STEGOSAURUS
0x0d0x02キャダバー KILLER CADAVER
0x0d0x03オクリム OKRIM
0x0d0x04シェルテム SHELTEM
編集者:すずき(2023/09/29 23:47)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2023年8月10日

Might and Magic Book Oneのエンカウント予想

目次: Might and Magicファミコン版

残そうと思ってサボっていたメモのまとめです。エンカウント予想スクリプトです。

スクリプトの仕組みは2021年10月8日の日記に書いたものと同一ですが、

  • 新しいBizHawkで動くように更新(Luaのビット演算記法が変わった)
  • 敵が出るタイミングでエミュレータ実行を止める

以上の2点を更新しており、TAS作成の際に少し便利です。常にスクリプトを動かすと戦闘と関係ないシーンでエミュレータ実行が何度も止まって鬱陶しいので、エンカウント予測したいとき以外は無効にしておくと良いと思います。

ソースコード

ソースコードはこちらからどうぞ。

編集者:すずき(2023/10/06 23:32)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2023年7月12日 >>> 2023年8月11日
link もっと後

管理用メニュー

link 記事を新規作成

<2023>
<<<07>>>
------1
2345678
9101112131415
16171819202122
23242526272829
3031-----

最近のコメント5件

  • link 24年6月17日
    すずきさん (06/23 00:12)
    「ありがとうございます。バルコニーではない...」
  • link 24年6月17日
    hdkさん (06/22 22:08)
    「GPSの最初の同期を取る時は見晴らしのい...」
  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」
  • link 24年5月17日
    すずきさん (05/20 13:16)
    「そうですねえ、普通はStandardなの...」

最近の記事3件

  • link 24年4月12日
    すずき (07/05 10:40)
    「[台湾東部沖地震に寄付] ささやかではありますが台湾東部沖地震に寄付しました。日本の赤十字社→台湾の赤十字(正式名称...」
  • link 24年4月16日
    すずき (07/05 10:40)
    「[Zephyr SDKのhosttoolsは移動してはいけない、その2 - インストール時のバイナリ書き換え] 目次: Zep...」
  • link 24年4月17日
    すずき (07/05 10:39)
    「[VSCodeとMarkdownとPlantUMLのローカルサーバー] 目次: LinuxVSCodeのPlantUML Ex...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 07/05 10:40