命令表
- 作者: 村瀬康治
- 出版社/メーカー: アスキー
- 発売日: 1983/01
- メディア: 単行本
- 購入: 13人 クリック: 51回
- この商品を含むブログ (13件) を見る
今までのところ、APPENDIXに記載されている、命令の1バイト目を解析するプログラムを作成しました。
以下、プログラムが生成した命令表。
HEX | 命令 | 引数1 | 引数2 |
---|---|---|---|
00 | NOP | ||
01 | LD | BC | M16 |
02 | LD | (BC) | A |
03 | INC | BC | |
04 | INC | B | |
05 | DEC | B | |
06 | LD | B | M8 |
07 | ERROR | ||
08 | E | R | R |
09 | ADD | HL | BC |
0A | LD | A | (BC) |
0B | DEC | BC | |
0C | INC | C | |
0D | DEC | C | |
0E | LD | C | M8 |
0F | ERROR | ||
10 | NOP | ||
11 | LD | DE | M16 |
12 | LD | (DE) | A |
13 | INC | DE | |
14 | INC | D | |
15 | DEC | D | |
16 | LD | D | M8 |
17 | ERROR | ||
18 | E | R | R |
19 | ADD | HL | DE |
1A | LD | A | (DE) |
1B | DEC | DE | |
1C | INC | E | |
1D | DEC | E | |
1E | LD | E | M8 |
1F | ERROR | ||
20 | NOP | ||
21 | LD | HL | M16 |
22 | LD | (M16) | HL |
23 | INC | HL | |
24 | INC | H | |
25 | DEC | H | |
26 | LD | H | M8 |
27 | ERROR | ||
28 | E | R | R |
29 | ADD | HL | HL |
2A | LD | HL | (M16) |
2B | DEC | HL | |
2C | INC | L | |
2D | DEC | L | |
2E | LD | L | M8 |
2F | CPL | ||
30 | NOP | ||
31 | LD | SP | M16 |
32 | LD | (M16) | A |
33 | INC | SP | |
34 | INC | (HL) | |
35 | DEC | (HL) | |
36 | LD | (HL) | M8 |
37 | SCF | ||
38 | E | R | R |
39 | ADD | HL | SP |
3A | LD | A | (M16) |
3B | DEC | SP | |
3C | INC | A | |
3D | DEC | A | |
3E | LD | A | M8 |
3F | CCF | ||
40 | LD | B | B |
41 | LD | B | C |
42 | LD | B | D |
43 | LD | B | E |
44 | LD | B | H |
45 | LD | B | L |
46 | LD | B | (HL) |
47 | LD | B | A |
48 | LD | C | B |
49 | LD | C | C |
4A | LD | C | D |
4B | LD | C | E |
4C | LD | C | H |
4D | LD | C | L |
4E | LD | C | (HL) |
4F | LD | C | A |
50 | LD | D | B |
51 | LD | D | C |
52 | LD | D | D |
53 | LD | D | E |
54 | LD | D | H |
55 | LD | D | L |
56 | LD | D | (HL) |
57 | LD | D | A |
58 | LD | E | B |
59 | LD | E | C |
5A | LD | E | D |
5B | LD | E | E |
5C | LD | E | H |
5D | LD | E | L |
5E | LD | E | (HL) |
5F | LD | E | A |
60 | LD | H | B |
61 | LD | H | C |
62 | LD | H | D |
63 | LD | H | E |
64 | LD | H | H |
65 | LD | H | L |
66 | LD | H | (HL) |
67 | LD | H | A |
68 | LD | L | B |
69 | LD | L | C |
6A | LD | L | D |
6B | LD | L | E |
6C | LD | L | H |
6D | LD | L | L |
6E | LD | L | (HL) |
6F | LD | L | A |
70 | LD | (HL) | B |
71 | LD | (HL) | C |
72 | LD | (HL) | D |
73 | LD | (HL) | E |
74 | LD | (HL) | H |
75 | LD | (HL) | L |
76 | HALT | ||
77 | LD | (HL) | A |
78 | LD | A | B |
79 | LD | A | C |
7A | LD | A | D |
7B | LD | A | E |
7C | LD | A | H |
7D | LD | A | L |
7E | LD | A | (HL) |
7F | LD | A | A |
80 | ADD | A | B |
81 | ADD | A | C |
82 | ADD | A | D |
83 | ADD | A | E |
84 | ADD | A | H |
85 | ADD | A | L |
86 | ADD | A | (HL) |
87 | ADD | A | A |
88 | ADC | A | B |
89 | ADC | A | C |
8A | ADC | A | D |
8B | ADC | A | E |
8C | ADC | A | H |
8D | ADC | A | L |
8E | ADC | A | (HL) |
8F | ADC | A | A |
90 | SUB | B | |
91 | SUB | C | |
92 | SUB | D | |
93 | SUB | E | |
94 | SUB | H | |
95 | SUB | L | |
96 | SUB | (HL) | |
97 | SUB | A | |
98 | SBC | A | B |
99 | SBC | A | C |
9A | SBC | A | D |
9B | SBC | A | E |
9C | SBC | A | H |
9D | SBC | A | L |
9E | SBC | A | (HL) |
9F | SBC | A | A |
A0 | AND | B | |
A1 | AND | C | |
A2 | AND | D | |
A3 | AND | E | |
A4 | AND | H | |
A5 | AND | L | |
A6 | AND | (HL) | |
A7 | AND | A | |
A8 | XOR | B | |
A9 | XOR | C | |
AA | XOR | D | |
AB | XOR | E | |
AC | XOR | H | |
AD | XOR | L | |
AE | XOR | (HL) | |
AF | XOR | A | |
B0 | OR | B | |
B1 | OR | C | |
B2 | OR | D | |
B3 | OR | E | |
B4 | OR | H | |
B5 | OR | L | |
B6 | OR | (HL) | |
B7 | OR | A | |
B8 | CP | B | |
B9 | CP | C | |
BA | CP | D | |
BB | CP | E | |
BC | CP | H | |
BD | CP | L | |
BE | CP | (HL) | |
BF | CP | A | |
C0 | RET | NZ | |
C1 | POP | BC | |
C2 | JP | NZ | M16 |
C3 | JP | M16 | |
C4 | CALL | NZ | M16 |
C5 | PUSH | BC | |
C6 | ADD | A | M8 |
C7 | JP | M16 | |
C8 | RET | Z | |
C9 | RET | ||
CA | JP | Z | M16 |
CB | NE_RS | ||
CC | CALL | Z | M16 |
CD | CALL | M16 | |
CE | ADC | A | M8 |
CF | NE_RS | ||
D0 | RET | NC | |
D1 | POP | DE | |
D2 | JP | NC | M16 |
D3 | OUT | (M8) | A |
D4 | CALL | NC | M16 |
D5 | PUSH | DE | |
D6 | SUB | M8 | |
D7 | OUT | (M8) | A |
D8 | RET | C | |
D9 | E | R | R |
DA | JP | C | M16 |
DB | IN | A | (M8) |
DC | CALL | C | M16 |
DD | CALL | M16 | |
DE | SBC | A | M8 |
DF | IN | A | (M8) |
E0 | RET | NZ | |
E1 | POP | HL | |
E2 | JP | NZ | M16 |
E3 | EX | (SP) | HL |
E4 | CALL | NZ | M16 |
E5 | PUSH | HL | |
E6 | AND | M8 | |
E7 | EX | ERROR | HL |
E8 | RET | Z | |
E9 | JP | (HL) | |
EA | JP | Z | M16 |
EB | EX | DE | HL |
EC | CALL | Z | M16 |
ED | NE_ED | ||
EE | XOR | M8 | |
EF | EX | ERROR | HL |
F0 | RET | NC | |
F1 | POP | AF | |
F2 | JP | NC | M16 |
F3 | DI | ||
F4 | CALL | NC | M16 |
F5 | PUSH | AF | |
F6 | OR | M8 | |
F7 | DI | ||
F8 | RET | C | |
F9 | LD | SP | HL |
FA | JP | C | M16 |
FB | EI | ||
FC | CALL | C | M16 |
FD | NE_ED | ||
FE | CP | M8 | |
FF | EI |
- 引数のM8とM16は、次の命令の内容から、それぞれ8bitデータと16ビットデータを取得するの意。
- 命令のNE_〜は、次の命令も引き続き処理の判断に必要となる(2バイト命令)
- 本の命令表に乗っていないコードに対する結果は未定義。
この表を生成したコードは以下です。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>ParseInst</title> </head> <body> <?php #$hex_ins = $_GET["instruction"]; #echo "\$hex_ins:$hex_ins<br>"; #$num_ins = hexdec( $hex_ins ); #echo "\$num_ins:$num_ins<br>"; #$parsed = parse_inst( $num_ins ); #echo "\$parsed:$parsed<br>"; echo "<table border=1>"; echo "<tr>"; echo "<th>HEX</th>"; echo "<th>命令</th>"; echo "<th>引数1</th>"; echo "<th>引数2</th>"; echo "</tr>"; for ( $i = 0; $i < 256; ++$i ) { echo "<tr>"; $tmp = "00" . strtoupper( dechex( $i ) ); echo "<td>" . substr( $tmp, strlen( $tmp ) - 2 ) . "</td>"; $inst = parse_inst( $i ); echo "<td>" . $inst[0] . "</td>"; echo "<td>" . $inst[1] . "</td>"; echo "<td>" . $inst[2] . "</td>"; echo "</tr>"; } echo "</table>"; function parse_inst( $target ) { try { if ( ( ( $target | 0x30 ) == 0x30 ) && ( ( $target & 0x00 ) == 0x00 ) ) return parse_nop( $target ); if ( ( ( $target | 0x31 ) == 0x31 ) && ( ( $target & 0x01 ) == 0x01 ) ) return parse_ld_16_data( $target ); if ( ( ( $target | 0x39 ) == 0x39 ) && ( ( $target & 0x09 ) == 0x09 ) ) return parse_add_hl_16( $target ); if ( ( ( $target | 0x3A ) == 0x3A ) && ( ( $target & 0x02 ) == 0x02 ) ) return parse_ld_8_addr( $target ); if ( ( ( $target | 0x3B ) == 0x3B ) && ( ( $target & 0x03 ) == 0x03 ) ) return parse_incdec_16( $target ); if ( ( ( $target | 0x3D ) == 0x3D ) && ( ( $target & 0x04 ) == 0x04 ) ) return parse_incdec_8( $target ); if ( ( ( $target | 0x3E ) == 0x3E ) && ( ( $target & 0x06 ) == 0x06 ) ) return parse_ld_8_data( $target ); if ( ( ( $target | 0x76 ) == 0x76 ) && ( ( $target & 0x76 ) == 0x76 ) ) return parse_halt( $target ); if ( ( ( $target | 0x7F ) == 0x7F ) && ( ( $target & 0x40 ) == 0x40 ) ) return parse_ld_8_8( $target ); if ( ( ( $target | 0xBF ) == 0xBF ) && ( ( $target & 0x80 ) == 0x80 ) ) return parse_arilog_8( $target ); if ( ( ( $target | 0xF8 ) == 0xF8 ) && ( ( $target & 0xC0 ) == 0xC0 ) ) return parse_ret_flg( $target ); if ( ( ( $target | 0xE9 ) == 0xE9 ) && ( ( $target & 0xE9 ) == 0xE9 ) ) return parse_jp_hl( $target ); if ( ( ( $target | 0xC9 ) == 0xC9 ) && ( ( $target & 0xC9 ) == 0xC9 ) ) return parse_ret( $target ); if ( ( ( $target | 0xF1 ) == 0xF1 ) && ( ( $target & 0xC1 ) == 0xC1 ) ) return parse_pop_16( $target ); if ( ( ( $target | 0xF9 ) == 0xF9 ) && ( ( $target & 0xF9 ) == 0xF9 ) ) return parse_ld_sp_hl( $target ); if ( ( ( $target | 0xFA ) == 0xFA ) && ( ( $target & 0xC2 ) == 0xC2 ) ) return parse_jp_flg_data( $target ); if ( ( ( $target | 0xC7 ) == 0xC7 ) && ( ( $target & 0xC3 ) == 0xC3 ) ) return parse_jp_data( $target ); if ( ( ( $target | 0xCF ) == 0xCF ) && ( ( $target & 0xCB ) == 0xCB ) ) return parse_rotshf_8( $target ); if ( ( ( $target | 0xDF ) == 0xDF ) && ( ( $target & 0xD3 ) == 0xD3 ) ) return parse_inout( $target ); if ( ( ( $target | 0xFF ) == 0xFF ) && ( ( $target & 0xF3 ) == 0xF3 ) ) return parse_eidi( $target ); if ( ( ( $target | 0xEF ) == 0xEF ) && ( ( $target & 0xE3 ) == 0xE3 ) ) return parse_ex( $target ); if ( ( ( $target | 0xFC ) == 0xFC ) && ( ( $target & 0xC4 ) == 0xC4 ) ) return parse_call_flg_data( $target ); if ( ( ( $target | 0xDD ) == 0xDD ) && ( ( $target & 0xCD ) == 0xCD ) ) return parse_call_data( $target ); if ( ( ( $target | 0xF5 ) == 0xF5 ) && ( ( $target & 0xC5 ) == 0xC5 ) ) return parse_push_16( $target ); if ( ( ( $target | 0xFD ) == 0xFD ) && ( ( $target & 0xED ) == 0xED ) ) return parse_ed_2byte( $target ); if ( ( ( $target | 0xFE ) == 0xFE ) && ( ( $target & 0xC6 ) == 0xC6 ) ) return parse_arilog_data( $target ); if ( ( ( $target | 0x3F ) == 0x3F ) && ( ( $target & 0x07 ) == 0x07 ) ) return parse_acu( $target ); } catch ( ErrorException $e ) { return "ERROR"; } return "ERROR"; } #START PARSE_INST function parse_nop( $target ) { return array( "NOP", "", "" ); } function parse_ld_16_data( $target ) { return array( "LD", af_to_sp( decide_reg16_1( $target ) ), "M16" ); } function parse_add_hl_16( $target ) { return array( "ADD", "HL", af_to_sp( decide_reg16_1( $target ) ) ); } function parse_ld_8_addr( $target ) { return decide_ld_8_addr( $target, af_to_addr( ref_addr(decide_reg16_1( $target )) ) ); } function parse_incdec_16( $target ) { return array( decide_incdec_16( $target ), af_to_sp( decide_reg16_1( $target ) ), "" ); } function parse_incdec_8( $target ) { return array( decide_incdec_8( $target ), decide_reg8_1( $target ), "" ); } function parse_ld_8_data( $target ) { return array( "LD", decide_reg8_1( $target ), "M8" ); } function parse_halt( $target ) { return array( "HALT", "", "" ); } function parse_ld_8_8( $target ) { return array( "LD", decide_reg8_1( $target ), decide_reg8_2( $target ) ); } function parse_arilog_8( $target ) { return decide_arilog_8( $target, decide_reg8_2( $target ) ); } function parse_ret_flg( $target ) { return array( "RET", decide_flg( $target ), "" ); } function parse_jp_hl( $target ) { return array( "JP", ref_addr("HL"), "" ); } function parse_ret( $target ) { return array( "RET", "", "" ); } function parse_pop_16( $target ) { return array( "POP", decide_reg16_1( $target ), "" ); } function parse_ld_sp_hl( $target ) { return array( "LD", "SP", "HL" ); } function parse_jp_flg_data( $target ) { return array( "JP", decide_flg( $target ), "M16" ); } function parse_jp_data( $target ) { return array( "JP", "M16", "" ); } function parse_rotshf_8( $target ) { return array( "NE_RS", "", "" ); } function parse_inout( $target ) { return decide_inout( $target, "A", ref_addr("M8") ); } function parse_eidi( $target ) { return decide_eidi( $target ); } function parse_ex( $target ) { return decide_ex( $target ); } function parse_call_flg_data( $target ) { return array( "CALL", decide_flg( $target ), "M16" ); } function parse_call_data( $target ) { return array( "CALL", "M16", "" ); } function parse_push_16( $target ) { return array( "PUSH", decide_reg16_1( $target ), "" ); } function parse_ed_2byte( $target ) { return array( "NE_ED", "", "" ); } function parse_arilog_data( $target ) { return decide_arilog_data( $target ); } function parse_acu( $target ) { return array( decide_acu( $target ), "", "" ); } #END_PARSE_INST function decide_reg16_1( $target ) { return decide_reg16( slice( $target, 2, 2 ) ); } function decide_reg8_1( $target ) { return decide_reg8( slice( $target, 2, 3 ) ); } function decide_reg8_2( $target ) { return decide_reg8( slice( $target, 5, 3 ) ); } #START DECIDE_INST function decide_incdec_16( $target ) { return decide_incdec( slice( $target, 4, 1 ) ); } function decide_incdec_8( $target ) { return decide_incdec( slice( $target, 7, 1 ) ); } function decide_incdec( $target ) { if ( $target == 0x0 ) return "INC"; if ( $target == 0x1 ) return "DEC"; return "ERROR"; } function decide_arilog_8( $target, $reg ) { return decide_arilog( slice( $target, 2, 3 ), $reg ); } function decide_arilog_data( $target ) { return decide_arilog( slice( $target, 2, 3 ), "M8" ); } function decide_arilog( $target, $reg ) { if ( $target == 0x0 ) return array( "ADD", "A", $reg ); if ( $target == 0x1 ) return array( "ADC", "A", $reg ); if ( $target == 0x2 ) return array( "SUB", $reg ); if ( $target == 0x3 ) return array( "SBC", "A", $reg ); if ( $target == 0x4 ) return array( "AND", $reg ); if ( $target == 0x5 ) return array( "XOR", $reg ); if ( $target == 0x6 ) return array( "OR", $reg ); if ( $target == 0x7 ) return array( "CP", $reg ); return "ERROR"; } function decide_inout( $target, $arg1, $arg2 ) { $slice = slice( $target, 4, 1 ); if ( $slice == 0x0 ) return array( "OUT", $arg2, $arg1 ); if ( $slice == 0x1 ) return array( "IN", $arg1, $arg2 ); return "ERROR"; } function decide_eidi( $target ) { $slice = slice( $target, 4, 1 ); if ( $slice == 0x0 ) return array( "DI" ); if ( $slice == 0x1 ) return array( "EI" ); return "ERROR"; } function decide_ld_8_addr( $target, $arg ) { $args_dir = slice( $target, 4, 1 ); $slice = slice( $target, 2, 2 ); if ( $slice == 0x0 ) return args_dir( $args_dir, "LD", "A", $arg ); if ( $slice == 0x1 ) return args_dir( $args_dir, "LD", "A", $arg ); if ( $slice == 0x3 ) return args_dir( $args_dir, "LD", "A", ref_addr("M16") ); if ( $slice == 0x2 ) return args_dir( $args_dir, "LD", "HL", ref_addr("M16") ); return "ERROR"; } function decide_acu( $target ) { $slice = slice( $target, 2, 3 ); if ( $slice == 0x5 ) return "CPL"; if ( $slice == 0x7 ) return "CCF"; if ( $slice == 0x6 ) return "SCF"; return "ERROR"; } #@not used function decide_rotshf() { $slice = slice( $target, 7, 1 ); if ( $slice == 0x0 ) return "RLC"; if ( $slice == 0x1 ) return "RRC"; if ( $slice == 0x2 ) return "RL"; if ( $slice == 0x3 ) return "RR"; if ( $slice == 0x4 ) return "SLA"; if ( $slice == 0x5 ) return "SRA"; if ( $slice == 0x7 ) return "SRL"; return "ERROR"; } #END DECIDE_INST function decide_reg16( $target ) { if ( $target == 0x3 ) return "AF"; if ( $target == 0x0 ) return "BC"; if ( $target == 0x1 ) return "DE"; if ( $target == 0x2 ) return "HL"; return "ERROR"; } function decide_reg8( $target ) { if ( $target == 0x7 ) return "A"; if ( $target == 0x0 ) return "B"; if ( $target == 0x1 ) return "C"; if ( $target == 0x2 ) return "D"; if ( $target == 0x3 ) return "E"; if ( $target == 0x4 ) return "H"; if ( $target == 0x5 ) return "L"; if ( $target == 0x6 ) return "(HL)"; return "ERROR"; } function decide_ex( $target ) { return array( "EX", decide_ex_reg( slice( $target, 4, 2 ) ), "HL" ); } function decide_ex_reg( $target ) { if ( $target == 0x2 ) return "DE"; if ( $target == 0x0 ) return "(SP)"; return "ERROR"; } function decide_flg( $target ) { $slice = slice( $target, 3, 2 ); if ( $slice == 0x3 ) return "C"; if ( $slice == 0x2 ) return "NC"; if ( $slice == 0x1 ) return "Z"; if ( $slice == 0x0 ) return "NZ"; return "ERROR"; } #START AF_CONVERTER function af_to_sp( $target ) { return $target == "AF" ? "SP" : $target; } function af_to_addr( $target ) { return $target == "AF" ? "M16" : $target; } #END AF_CONVERTER function args_dir( $target, $inst, $arg1, $arg2 ) { if ( $target == 0x0 ) return array( $inst, $arg2, $arg1 ); if ( $target == 0x1 ) return array( $inst, $arg1, $arg2 ); return "ERROR"; } function ref_addr( $target ) { return "($target)"; } function slice( $target, $start, $length ) { $mask = 0; for ( $i = 0; $i < $length; ++$i ) { $mask <<= 1; $mask |= 1; } return ( $target >> 8 - $start - $length ) & $mask; } ?> </body> </html>