コグノスケ


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

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

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年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年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月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月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月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月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月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月8日

日本語文字コードのメモ

昔、文字コードを調べたときのメモです。文字コードは詳しいサイトがたくさんあって、私が書けることはほとんどないんですが……詳しいサイトが一部消えてしまったようなので、メモを残しておきます。

JIS区点番号

JIS X 0208:1997を見ると、漢字集合を94個の区、94個の点(区点番号)で定義しています。全部で94x94 = 8336字あります。区点番号をどのバイト値として表現するか?を符号化方式とか符号化表現と言いまして、普及している方式がいくつかあります。

ISO/IEC 2022に出てくる用語G0やGL/GRやエスケープシーケンスを説明なしに使います。私もマスターという訳ではなく、調べて説明するのもしんどいので、他の詳しいサイト様を参照くださいませ。

RFC 1468(いわゆるISO-2022-JP, JISコード)

RFC 1468(リンク)で定義された符号化方式です。JISだとJIS X 0208付属書2に規定があります。MIMEではISO-2022-JPという名前で、JISコードと呼ぶ人もいますが、ISO規格でもJIS規格でもなく、RFCです。変な名前ですね……。

7bitで符号化し、第1、第2バイトともに、0x21〜0x7E(94個)の範囲を使用します。全部で94x94 = 8836字となります。区点番号と同じで素直ですね。文字集合は4つあり、エスケープシーケンスで切り替えます。

RFC 1468 (ISO-2022-JP) の使用する文字集合とエスケープシーケンス
Esc Seq    Character Set                  ISOREG

ESC ( B    ASCII                             6
ESC ( J    JIS X 0201-1976 ("Roman" set)    14
ESC $ @    JIS X 0208-1978                  42
ESC $ B    JIS X 0208-1983                  87

ISO/IEC 2022的に見ると、G0がASCII、GLにG0がロッキングシフトされている初期状態です。7bitコードなのでGRは使いません。呼び出しInvokeは使いませんのでGLはずっとG0のままです。エスケープシーケンスESC ( はG0への94文字集合(ASCIIなど)の指示Designateで、ESC $ はG0への94n文字集合(漢字など)の指示です。

  • GL領域: G0固定
  • GR領域: なし
  • G0: ASCII, JIS X 0201ローマ字, JIS X 0208
  • G1: 使わない
  • G2: 使わない
  • G3: 使わない

7bit文字しか理解できないサーバーなどを経由して文章を交換しても、情報が欠落しないように工夫された方式です。その代償と言うのかJIS X 0201片仮名、いわゆる「半角カナ」が使えません。表現する方法がないからです。

EUC-JP(Extended Unix Code)

EUC-JPが最初に規格化された場所は調べても良くわかりませんでした……。JISだとJIS X 0213付属書3に参考として表記されている符号化方式です。EUC-JIS-2004と呼ばれます。

8bitで符号化し、第1、第2バイトともに0xA1〜0xFE(94個)の範囲を使用します。全部で94x94 = 8836字となり、これも区点番号と同じで素直ですね。半角カナも対応しています。え、要らない?そう?

ISO/IEC 2022的に見ると、文字集合は4つあり、シングルシフトを使ってシフトの直後1文字分だけ切り替えます。エスケープシーケンスは使いません。

  • GL領域: G0固定
  • GR領域: G1, G2 (シングルシフト2、SS2で切り替え), G3 (シングルシフト3、SS3で切り替え)
  • G0: ASCII
  • G1: JIS X 0208
  • G2: JIS X 0201片仮名
  • G3: JIS X 0212補助漢字

ASCIIと漢字以外の文字、例えば半角片仮名を連発すると「シングルシフト+文字」のペアが連発されることになって容量的に効率が悪いですが、EUC-JPには大きな利点があります。

  • エスケープシーケンスによる漢字集合の指示を使わないので、G0〜G3に指示された漢字集合を覚える必要がない
  • ロッキングシフトによる呼び出しを使わないので、GLやGR領域に呼び出されたバッファを覚える必要がない

もっと平たく言いましょう。ISO-2022-JPは同じバイト列でも文字の種類(ASCIIか漢字か)がわかりません。最後に出てきたエスケープシーケンス次第で変わるためです。EUC-JPは文字列の途中から読みだしても文字の種類が判定できますので、文字列処理を行う際にはありがたい方式と言えるでしょう。

Shift JIS

元々はMicrosoftによる符号化方式です。JISだとJIS X 0208:1997付属書1に規定されています。「シフト符号化表現」が正式名称ですが、大抵Shift JISと呼びます。昔はJIS規格ではありませんでしたが、途中でJIS規格に取り込まれたのだとか。

第1バイトに0x81〜0x9F(31個)、0xE0〜0xEF(16個)が現れたら、第2バイト0x40〜0x7E(63個)、0x80〜0xFC(125個)が続きます。全部で47x188 = 8836字で、総数は同じですがちょっと変則的です。

ISO/IEC 2022的にはそもそも規格に沿っていないため特に何もないですね……。文字集合の切り替えやエスケープシーケンスのような仕組みは一切ありません。

Shift JISはEUC-JPと似たような特徴を持っていて、文字列の途中から読みだしても文字の種類が判定できます。また第1バイトの範囲は、英数字 (ASCII、0x21〜0x7E)や1バイト仮名(半角カナ、0xA1〜0xDF)と重複しないように配置され、シングルシフトのような仕組みなしに漢字と半角片仮名が使えます。

ISO/IEC 2022のような複雑な仕組みを理解する必要がない反面、拡張性が低いという大きな欠点があります。Shift JIS制定後にJIS X 0213が増えたとき、第1バイトの未使用領域0xF0〜0xFCで凌いだ(Shift JIS 2004)ものの、残された領域はもうありません。

編集者:すずき(2023/07/29 12:34)

コメント一覧

  • hdkさん(2023/07/10 08:35)
    ISO-2022-JPでもJIS X 0201片仮名はESC ( Iで表せばいいと思うんですけど、単にそれは使わないきまりにしたっぽいですよね。昔は電子メールでよくISO-2022-JPが使われていましたが、ESC ( IだったりSS2だったり、各クライアントが好き勝手な方法で表現していたような... 未だにiso-2022-jpといいながらESC ( Iでカタカナ入れて送ってくるコストコなんて店もありますが... (^^;
  • すずきさん(2023/07/10 11:22)
    ISO-2022-JP の独自改変は詳しくなかったんで、そんなクライアントあるんだ……とためになりました。RFC 1468 の G2 は未定義で SS2 は明らかに間違ってる気がしますね。EUC-JP と勘違いか、間違っているのを知っていて借りてきたんですかねえ?

    JIS X 0208 に片仮名(いわゆる全角カナ)はあるので、要らんと言えば要らんのですが、まあそんな単純な話じゃなかったってのは面白いところだなあと思います。
open/close この記事にコメントする



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

管理用メニュー

link 記事を新規作成

<2023>
<<<08>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント5件

  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」
  • link 24年10月1日
    hdkさん (10/03 08:30)
    「おー、面白いですね。xrdpはすでに立ち...」
  • link 14年6月13日
    2048player...さん (09/26 01:04)
    「最後に、この式を出すのに紙4枚(A4)も...」

最近の記事3件

  • link 24年10月3日
    すずき (10/06 01:33)
    「[Ubuntu 20.04 LTSでxrdpのエラーを再現できるか挑戦] 目次: Linux先日(2024年10月1日の日記参...」
  • link 23年4月10日
    すずき (10/05 15:09)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年10月2日
    すずき (10/05 15:08)
    「[VirtualBoxでxrdpのエラーを再現できるか挑戦] 目次: Linux昨日(2024年10月1日の日記参照)のUbu...」
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

最終更新: 10/06 03:41