〜 ナンバー 〜
16進数値でAsciiコードの取得と設定

様々なページで「文字と、その文字のコードの関係」を一覧で表示しているページがありますが、
16進数は1バイトを「00」〜「FF」までの丁度2桁で表現でき、
上位・下位バイトがそれぞれ幾らなのかを一目で把握できる為に、
10進数より、16進数で表記している方が多いのだと思います。
しかし、HSP上で文字コードの取得や設定は10進数値で行います。
スクリプトに直接埋め込む場合は「$」や「0x」を数値の前に付けることで16進数にできますが、
プログラム上では自前で変換する必要がありますので、ココではコードの取得から16進数化するところまで、
16進数値をそのままコードとして設定できるようなラッパー命令・関数のサンプルとなっています。
尚、通常のpeek命令・poke命令は数値をコード、文字列をそのまま文字列として埋め込みますが、
このサンプルモジュールの渡せるコードは、16進数を前提とした文字列コードのみです。
また、HSP2版は、モジュールの制約(数値以外の変数・文字列は最初の2パラメータしか設定不可)により、
poke系命令のパラメータ2と3を逆に設定しています

peek16 受取先変数, 取得元変数, インデクス
受取先変数取得した16進数コードの受取先変数を指定する。
取得元変数コード取得元の変数を指定する。
インデクス取得位置を指定する。

wpeek16 受取先変数, 取得元変数, インデクス
受取先変数取得した16進数コードの受取先変数を指定する。
取得元変数コード取得元の変数を指定する。
インデクス取得位置を指定する。

poke16 設定先変数, 書き込む値, インデクス
設定先変数16進数コードの書き込み先変数を指定する。
書き込む値書き込む16進数コードを指定する。
通常のpoke命令と異なり、パラメータ順が先になっているので気をつけること。
インデクス設定先変数の書き込むインデクスを指定する。
通常のpoke命令と異なり、パラメータ順が後になっているので気をつけること。

wpoke16 設定先変数, 書き込む値, インデクス
設定先変数16進数コードの書き込み先変数を指定する。
書き込む値書き込む16進数コードを指定する。
通常のwpoke命令と異なり、パラメータ順が先になっているので気をつけること。
インデクス設定先変数の書き込むインデクスを指定する。
通常のwpoke命令と異なり、パラメータ順が後になっているので気をつけること。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#module
#deffunc peek16 val, val, int
	mref v1, 24 : mref v2, 25 : mref index, 2
	tmp = 0
	peek tmp, v2, index
	str tmp, 16
	v1 = tmp
	return

#deffunc wpeek16 val, val, int
	mref v1, 24 : mref v2, 25 : mref index, 2
	tmp = 0
	wpeek tmp, v2, index
	str tmp, 16
	v1 = tmp
	return

#deffunc poke16 val, str, int
	mref v, 24 : mref string, 33 : mref index, 2
	tmp = "$" + string
	int tmp
	poke v, index, tmp
	return

#deffunc wpoke16 val, str, int
	mref v, 24 : mref string, 33 : mref index, 2
	tmp = "$" + string
	int tmp
	wpoke v, index, tmp
	return
#global

	sdim tmp, 4
	data = "16進数で処理するTest"
	pos  10, 10 : mes "◎対象ワード[" + data + "]"
	font "MS 明朝", 13
	pos  10, 40 : mes "16進数"
	pos 100, 40 : mes "10進数"
	pos 200, 40 : mes "データ"
	strlen len , data
	repeat len
		peek16 hex, data, cnt
		peek dec, data, cnt
		pos  10, cnt * 20 + 70 : mes "$" + hex
		pos 100, cnt * 20 + 70 : mes dec
		// 前回全角文字ならデータを表示しない
		peek chk, tmp, 1
		if chk = 0 {
			if (dec > 128 & (dec < 160)) | (dec > 223) {
			  wpeek16 tmp2, data, cnt
			  wpoke16 tmp, tmp2
			  pos 200, cnt * 20 + 70 : mes tmp
			} else {
			  poke16 tmp, hex
			  pos 200, cnt * 20 + 70 : mes tmp
			}
		} else {
			memset tmp, , 4
		}
	loop
	stop

受取先 = peek16(取得元変数, インデクス)
受取先取得した16進数コードの受取先を指定する。
取得元変数コード取得元の変数を指定する。
インデクス取得位置を指定する。

受取先 = wpeek16(取得元変数, インデクス)
受取先取得した16進数コードの受取先を指定する。
取得元変数コード取得元の変数を指定する。
インデクス取得位置を指定する。

poke16 設定先変数, インデクス, 書き込む値
設定先変数16進数コードの書き込み先変数を指定する。
インデクス設定先変数の書き込むインデクスを指定する。
書き込む値書き込む16進数コードを指定する。

wpoke16 設定先変数, インデクス, 書き込む値
設定先変数16進数コードの書き込み先変数を指定する。
インデクス設定先変数の書き込むインデクスを指定する。
書き込む値書き込む16進数コードを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#module
#defcfunc peek16 var v, int index
	return strf("%x", peek(v, index))

#defcfunc wpeek16 var v, int index
	return strf("%x", wpeek(v, index))

#deffunc poke16 var v, int index, str string
	poke v, index, int("$" + string)
	return

#deffunc wpoke16 var v, int index, str string
	wpoke v, index, int("$" + string)
	return
#global

	sdim tmp, 4
	data = "16進数で処理するTest"
	pos  10, 10 : mes "◎対象ワード[" + data + "]"
	font msmincho, 13
	pos  10, 40 : mes "16進数"
	pos 100, 40 : mes "10進数"
	pos 200, 40 : mes "データ"
	repeat strlen(data)
		hex = peek16(data, cnt)
		dec = peek(data, cnt)
		pos  10, cnt * 20 + 70 : mes "$" + hex
		pos 100, cnt * 20 + 70 : mes dec
		// 前回全角文字ならデータを表示しない
		if peek(tmp, 1) = 0 {
			if (dec > 128 & dec < 160) | dec > 223 {
			  wpoke16 tmp, , wpeek16(data, cnt)
			  pos 200, cnt * 20 + 70 : mes tmp
			} else {
			  poke16 tmp, , hex
			  pos 200, cnt * 20 + 70 : mes tmp
			}
		} else {
			memset tmp, , 4
		}
	loop