文字入力での数値の作り方

文字コード対応表も参考に。

任意コード実行で数値を扱う際、入力不能文字に悩まされることがある。
実際のコードでどのように解決しているかを見てみると面白い。

表の赤字は(初代での)入力不能文字を表すが、第二世代のメールでのみ入力可能なものは赤強調で表す。

ローテート・シフトを使う

rlc

[8Ah]
1000 1010

0001 0101
[15h]

rrc

[E3h]
1110 0011

1111 0001
[F1h]

rlcは左方向へのローテート。2バイト命令だが、aレジスタに対しては1バイトで行えるようになっている。
偶数を作りたい場合はその数値の半分を用意すればいいが、奇数を作りたい場合は1引いた値の半分に80hを足すようにする。(あまりやらないが)
80h以上の数値に使用するとキャリーフラグが立つ。「だ」(jrnc,xx)などの相対ジャンプに影響が出る点に注意。
基本的に使うのはrlcaぐらいだが、rlc lを使って入力不能文字があるアドレスを指定することもあるだろう。
キャリーフラグにのみ溢れた桁を格納するrl命令もあるが、現在のキャリーフラグをしっかり管理しないといけないため少々使いづらいか。(rlaは入力不能)
応用として「ひ空」(bit 7,a)の代わりに使用することでプログラムのコード長を短縮したり、「ョダ」のようにxor aと組み合わせることでccfの代わりにし、「だ」(jr nc,xx)を確実に成功させるというテクニックもある。
もっとも、キャリーフラグを折るだけなら「そ」(cp a)でも十分なため、「ョ」を飛ばして「ダ」に飛んでくるようなコードでないと無駄になってしまうが。

rrcは右方向へのローテート。こちらもaレジスタに対しては1バイトで行える。
こちらは数値を半減させる感覚で使えるが、奇数に対して使うと80hが足されて面倒なことになる。
rlcでは微妙に作りづらい40h台の数値を使ったりする際に便利。
こちらも基本的に使うのはrrcaぐらいだが、rrc lも覚えておくと便利。
rr命令も当然あるが、キャリーフラグの管理がやはり難しい。(rraも入力不能)
「ひぺ」(bit 0,a)の代わりにしてコード短縮を図るという応用法も。

ローテート命令
レジスタ b c d e h l (hl) a
rlc [00h] [01h] [02h] [03h] [04h] ひガ ひギ
rrc ひゲ ひゴ ひザ ひジ ひズ ひゼ ひゾ

sla

[8Ah]
1000 1010

0001 0100
[14h]

srl

[E3h]
1110 0011

0110 0001
[71h]

sra

[E3h]
1110 0011

1011 0001
[B1h]

slaは左方向へのシフト。
rlcと違い、bit0は必ず0になる。(80h以上の数値に使うとキャリーフラグが立つのは同じ)
純粋に数値を倍にしたい場合はこちらを使うのが無難。(特に元の数値に何が入るかわからない場合)
入力不能文字が多すぎるが、aレジスタには使えるのが救い。(大抵はrlcaで十分だが)

srlは右方向へのシフト。
rrcと違い、bit7は必ず0になる。(奇数に使うとキャリーフラグが立つのは同じ)
純粋に数値を半分にしたい場合はこちらを使うのが無難。(端数は切り捨てになるが)
一番の問題は(入力不能文字のため)aレジスタに使えないことだろうか。
bit7を変化させないsraというのもある。(80h以上ある場合は80hを引いてから半分にし、そこに80hを足すと計算しやすい)
入力不能文字の間接的な代入という用途では全く使えない(大抵rrcで十分なため)が、こちらはすべて入力可能なため、直前の値次第では使える場合も。

シフト命令
レジスタ b c d e h l (hl) a
sla [20h] [21h] [22h] [23h] [24h] [25h] ひが ひぎ
srl [38h] [39h] ひば ひび ひぶ ひべ ひぼ [3Fh]
sra ひぐ ひげ ひご ひざ ひじ ひず ひぜ ひぞ

桁の反転を使う

swap

[81h]
1000 0001

0001 1000
[18h]

swap命令を使うと、上桁と下桁の数値を反転させることができる。
ただ、aレジスタやlレジスタに使えないのが痛いため、deレジスタによるアドレス指定の補助に使われていることがあるぐらいか。

swap命令
b c d e h l (hl) a
ひだ ひぢ ひづ ひで ひど [35h] [36h] [37h]

足し算、引き算を使う

入力不能文字が絡む分をインクリメント(+1)やデクリメント(-1)で補うケースは少なくない。
(例:「ぜどじじ」[ld l,34→inc l→inc l]でlレジスタに36hを入れる等)

aレジスタの場合は他のレジスタとの加減算が可能なため、xor aで00hにしてから他レジスタの数値を足す(例:「ョア」[xor a→add b])ことで代入の代わりにしたり、
即値を足せる「に」(add a,xx)や「よ」(sub a,xx)を駆使して前回の値から数値を作るといった工程がたびたび見られる。
キャリーフラグの値を足すadc命令や引くsbc命令もあるが、純粋な計算で使う機会はほぼ無い。

変わったものでは「ぞ」(cpl)でaレジスタのビットをすべて反転させる(FFhから引くと計算しやすい)というのもある。

「ゴ」(add hl,bc)あたりは(bレジスタの操作がしやすいこともあって)アイテムを追加したいときなどに役立つ。
(例:「ョどぷぽぺズゴべづ」[xor a→inc (hl)→ld b,(hl)→ld c,b→ld b,a→inc c→add hl,bc→dec a→ldd(hl),a]で下にFFhを追加しながら末尾を指す)

加減算
レジスタ bc b c de d e hl h l (hl) a
inc [03h] [04h] [14h] [23h] [24h]
dec [15h] [1Dh] [25h] [15h]
add      
sub      

特定のビットを立てる/折る

set命令やres命令を使用することで、特定のビットを操作して数値を確保する。

set x,yでyレジスタのbit xを立て(0→1)、res x,yでyレジスタのbit xを折る(1→0)。

指定したビットがすでに立っていたり折れていたりすると効果が無いため単純な加減算としては使えないが、swap命令が使えないlレジスタにおいては大きな効果を発揮する。

ビットの順番は上から 7、6、5、4、3、2、1、0となっている点に注意。

ビットの立て折り
ビット (80h)
7
(40h)
6
(20h)
5
(10h)
4
(08h)
3
(04h)
2
(02h)
1
(01h)
0
b set [F0h] [E8h] ひゃ ひリ ひみ ひね ひた
res ひく ひロ ひメ ひノ ひチ ひケ ひア
c set [F1h] ひゅ ひる ひむ ひの ひち
res ひけ ひあ ひワ ひモ ひハ ひツ ひコ ひイ
d set [F2h] ひょ ひれ ひめ ひは ひつ
res ひこ ひい ひヤ ひヒ ひテ ひサ ひウ
e set ひー ひろ ひも ひひ ひて
res ひさ ひう ひン ひユ ひフ ひト ひシ ひエ
h set [ECh] [E4h] ひわ ひや ひふ ひと
res ひし ひえ ひッ ひヨ ひホ ひナ ひス ひオ
l set [F5h] [EDh] [E5h] ひゆ ひへ ひな
res ひす ひお ひャ ひラ ひマ ひニ ひセ ひカ
(hl) set [EEh] ひん ひよ ひほ ひに
res ひせ ひか ひュ ひル ひミ ひヌ ひソ ひキ
a set [EFh] ひっ ひら ひま ひぬ
res ひそ ひき ひョ ひレ ひム ひネ ひタ ひク

数値の作り方(aレジスタ)

aレジスタへの入力不能文字が絡む数値の入れ方。(ld a xxの使用をベースに)

キャリーフラグが立つ場合はcを付ける。

あくまで単体で入れる場合のため、前回の値次第では加減算で行った方が文字数を減らせる場合もある。

aレジスタ代入例
数値
(10進)
数値
(16進)
文字 代入例 rlca元 rrca元 cpl元 備考
0 00 (無効) (無し) (無し) xor aで00にできる。(aとaが異なるビットが1になるが、同じものの比較なのでなるわけがない)
ここから「ぺ」(ld b,a)でbレジスタを00に、「ぽ」(ld c,b)でcレジスタを00にもできる。
1 01 イ゛ ョぶ c [02h] 00からinc aで01に。
2 02 ウ゛ ョぶぶ [01h] [04h] 01からさらにinc a。
3 03 エ゛ ぼギダ c  
4 04 オ゛ ぼガべ [02h] 05からdec aで04に。
「ョひら」で00からset 2,aで作る手も。
20 14 ナ゛ ぼドぶ 13からinc aで14に。
道具所持数を20にしたいときにも。
21 15 ニ゛ ぼごダ c  
22 16 ヌ゛ ぼじダ  
23 17 ネ゛ ぼぜダ c [E8h]  
24 18 ノ゛ ぼバべ 19からdec aで18に。
29 1D マ゛ ぼボぶ c 1Cからinc aで1Dに。
30 1E ミ゛ ぼぶダ ボックス預け数やサファリボールの個数を30にしたいときにも。
31 1F ム゛ ぼぼダ c  
32 20 ィ゛ ぼヂグ  
33 21 あ゛ ぼプダ c 42からrrcaで21に。
34 22 い゛ ぼヅグ  
35 23 (無効) ぼぷダ c 「う゛」っぽいのになぜか無効。
36 24 え゛ ぼデグ  
37 25 お゛ ぼがべ c [4Ah] 26からdec aで25に。
53 35 な゛ ぼどぶ c [6Ah] 34からinc aで35に。
「ぜどじ」(ld l 34→inc l)とかの方が使うかもしれない…
54 36 に゛ ぼブグ [6Ch] 1Bからrlcaで36に。
55 37 ぬ゛ ぼねぞ c [6Eh]  
56 38 ね゛ ぼボグ [70h] 1Cからrlcaで38に。
57 39 の゛ ぼばべ c [72h] 3Aからdec aで39に。
63 3F ま゛ ぼぼぶ c [7Eh] 3Eからinc aで3Fに。
「ぼパべ」で40からdec aで作ってもいい。
73 49 ま゜ ぼぽぶ c 48からinc aで49に。
74 4A み゜ ぼナダ [25h]  
75 4B (文字送り) ぼヌダ c  
76 4C (自動送り) ぼノダ  
77 4D も゜ ぼヒダ c  
78 4E (1行改行) ぼホダ メールで使われる改行はこれ。
79 4F (改行) ぼミダ c 終端文字を利用して、50からdec aで作る手も。
80 50 (終端) ぼメダ ニックネームの5文字目等、末尾に「ぼ」を入れられると無駄がない。
81 51 (文字送り) ぼヤダ c A2からrrcaで51に。
82 52 (主人公) ぼヨダ A4からrrcaで52に。
83 53 (ライバル) ぼルダ c  
84 54 ポケモン ぼロダ  
85 55 (文字送り) ョよンc ヲc 00からsub a,ABで55に。キャリーフラグが立つ点に注意。
初代だと「ヲ」が入力できないため、rrca、rlca、cplいずれでも作れない。
86 56 …… ぼッダ ACからrrcaで56に。
87 57 (無効) ぼュダ c AEからrrcaで57に。
88 58 (改ページ) ぼじグ B0からrrcaは…初代だと「ィ」が入力できない。
89 59 (ポケモン名) ぼいダ c  
90 5A てきの (ポケモン名) ぼえダ  
91 5B パソコン ぼかダ c  
92 5C わざマシン ぼくダ  
93 5D トレーナー ぼこダ c 初代の交換NPCも実はこの1文字
94 5E ロケットだん ぼしダ  
95 5F 、、゜ ぼせダ c 表現が難しい謎の文字
96 60 A ぼたダ  
97 61 B ぼつダ ィc この辺りはHPゲージ周りだったり
98 62 C ぼとダ 「HP:|」のPの途中からが一文字になっている。
99 63 D ぼにダ c  
100 64 E ぼねダ 「てEん」とかでよく見るやつ
101 65 F ぼはダ c  
102 66 G ぼふダ  
103 67 H ぼほダ c  
104 68 I ぼみダ  
105 69 V ぼめダ c ポケスタでは「J」
106 6A S ぼやダ [35h] ポケスタでは「K」。つまりGBのVSは64のJK。
107 6B L ぼよダ c  
108 6C M ぼリダ [36h]  
109 6D ぼれダ c ポケスタでは「N」
110 6E ぼわダ [37h] 実はひらがなの「ぁぃぅぇぉ」は第二世代でも入力不能。
ステータス画面や戦闘ではレベルの「:L」
111 6F ぼんダ c 戦闘では味方のポケモンを指す左とんがりに。
112 70 ぼゃダ [38h] E0をrrcaで70に。
どくややけどの「ど」を見る機会が多すぎて鍵括弧がまともに使われている試しがない。
ポケスタでは「Q」
113 71 ぼょダ c E2をrrcaで71に。
「HP:|」のPの縦線(?)までが一文字になっている。
ポケスタでは「R」
114 72 ぼセぞ [39h] [E4h] 8Dをcplで72に。
「ョよソ」(xor a→sub a,8E)でもいい。
ポケスタでは「S」
115 73 ぼスぞ c 8Cをcplで73に。初代でキャリーフラグを立てないようにするにはこんな感じか。
「ョよセ」(xor a→sub a,8D)でもいい。
「ID」で表示される機会が多くて閉じかっこはあまり見ない。
ポケスタでは「T」
116 74 ぼばグ [E8h] 3Aをrlcaで74に。
「No」で表示される機会が多い。
ポケスタでは「U」
117 75 ぼサぞ c 8Aをcplで75に。
ポケスタでは「V」
118 76 ぼびグ [ECh] 3Bをrlcaで76に。
ステータス画面や戦闘では矢印につく棒?みたいな感じ。
119 77 ぼケぞ c [EEh] 88をcplで77に。
ステータス画面や戦闘では「」(上につく太線?)
120 78 ぼぶグ [F0h] 3Cをrlcaで78に。
戦闘では敵ポケモンを指す右とんがりに。
121 79 ぼキぞ c [F2h] ウインドウ左上角
第二世代ではせっていで変えた枠が適用される。
122 7A ぼべグ 3Dをrrcaで7Aに。
ウインドウ横線
123 7B ぼオぞ c ウインドウ右上角
124 7C || ぼぼグ 3Eをrrcaで7Cに。
ウインドウ縦線
125 7D ぼウぞ c ウインドウ左下角
126 7E ぼ空べ [3Fh] 7Fからdec aで7Eに。
ウインドウ右下角
170 AA ぼワぶ [55h] [55h]c [55h] A9からinc aでAAに。
第二世代では普通に入力可能。
176 B0 ぼあべ [58h] [61h]c [4Fh] B1からdec aでB0に。
第二世代では普通に入力可能。
221 DD ぼわぶ [EEh]c c [22h] DCからinc aでDDに。
第二世代では普通に入力可能。
228 E4 ぼーぶ [72h] c E3からinc aでE4に。
後ろに置いた文字にくっつく特殊な文字
初代、第二世代、歴代ポケスタで文字が違う面倒なやつ
229 E5 ぼビぞ [F2h]c c 1AからcplでE5に。
後ろに置いた文字にくっつく特殊な文字
GBAで金銀のバグポケを見た時によく見るやつ
230 E6 ぼバぞ [73h] c 19からcplでE6に。
第二世代ではメールで入力可能。
231 E7 ぼまダ c c [18h] CFからrrcaでE7に。キャリーフラグが立つ点に注意。
第二世代ではメールで入力可能。
232 E8 ぼむダ [74h] c [17h] D1からrrcaでE8に。キャリーフラグが立つ点に注意。
初代、第二世代、歴代ポケスタで文字が違う面倒なやつ
233 E9 ぼもダ ォc c [16h] D3からrrcaでE9に。キャリーフラグが立つ点に注意。
第二世代では普通に入力可能。
234 EA ぼゆダ [75h] c [15h] D5からrrcaでEAに。キャリーフラグが立つ点に注意。
第二世代では普通に入力可能。
235 EB ぼらダ [F5h] c [14h] D7からrrcaでEBに。キャリーフラグが立つ点に注意。
第二世代では普通に入力可能。
236 EC 白カーソル ぼドぞ [76h] c 選択時に反転しているやつ
237 ED 黒カーソル ぼデぞ c c  
238 EE ぼヅぞ [77h] をc ページ送りを求めるときに出てきているやつ
239 EF ぼヂぞ c c  
240 F0 ぼダぞ [78h] c バイナリエディタでおなじみ
241 F1 × ぼゾぞ c c ポケスタ金銀では入力できたような
242 F2 . ぼゼぞ [79h] [E5h]c ポケスタ金銀でニックネームに使っているやつがいる。
なのに初代ポケスタでは空白に変換される。
243 F3 ぼズぞ c c 第二世代ではメールで入力可能。
244 F4 ぼジぞ [7Ah] ァc 第二世代では普通に入力可能。
245 F5 ぼザそ c ェc  
246 F6 ぼゴぞ [7Bh] [EDh]c ここから数字(第二世代ではメールで入力可能)
247 F7 ぼゲぞ [EFh]c  
248 F8 ぼグぞ [7Ch] [F1h]c  
249 F9 ぼギぞ c c  
250 FA ぼガぞ [7Dh] [F5h]c  
251 FB ョよガc c c [04h] 00からsub a,05でFBに。キャリーフラグが立つ点に注意。
でもセレビィを作りたいときは「5」を直接入力しそう…
252 FC ぼ空べグ [7Eh] c [03h] 7EからrlcaでFCに。多分3文字じゃ無理。
253 FD ョべべべ c c [02h] 00からdec a ×3でFDに。多分3文字じゃ無理。
「ョぞひタ」(xor a→cpl→res 1,a)なんてのも。
254 FE ョべべ 空白 7c [01h] rrcaはもはやinc aでいいような気がする。
255 FF ョべ c c [00h] 00からdec aでFFに。「ョぞ」(xor a→cpl)でもできる。
第二世代でも「ぼ9」(ld a,FF)よりもっぱらこっちのイメージ。

タグ:

+ タグ編集
  • タグ:
最終更新:2023年10月08日 11:53