6502

レジスタ

名前サイズ説明
A 8bit アキュムレータ
X 8bit インデックスX
Y 8bit インデックスY
S 8bit スタックポインタ※1
P 8bit ステータス
PC 16bit プログラムカウンタ
※1スタック領域 0x0100 - 0x01ff のポインタ

1. ステータスレジスタ

76543210
NV1BDIZC
Nネガティブフラグ
1演算結果の最上位ビットが1
0上記以外
Vオーバーフローフラグ
1演算結果が符号ありの最大範囲(-128 - 127)を超えた
0上記以外
11固定
Bブレークモードフラグ
1BRK命令実行
0上記以外
Dデシマルモードフラグ※1
1加算・減算をBCDで行う
0上記以外
I割り込み禁止フラグ
1割り込み禁止
0割り込み許可
Zゼロフラグ
1演算結果、またはロード時の値が0
0上記以外
Cキャリーフラグ
1加算命令実行時:演算結果が255を超えた(キャリーあり)
減算命令実行時:演算結果が0を下回らない(ボローなし)
0上記以外

※1 RP2A03はBCDモードが存在しないため、Dフラグを無視する(セット・クリアは可能)



命令一覧表

記号の説明

1. サイズ欄

Bオペランドサイズが8ビット

2. ニーモニック欄

# 8/16/32ビットの即値データ
#8 ゼロページアドレス(0x00-0xff)
#8,X ゼロページアドレス(0x00-0xff + X)
#8,Y ゼロページアドレス(0x00-0xff + Y)
#16 絶対アドレス(0x0000-0xffff)
#16,X 絶対アドレス(0x0000-0xffff + X)※1
#16,Y 絶対アドレス(0x0000-0xffff + Y)※1
(#8,X)間接アドレス(ゼロページ(0x00-0xff + X)の指すアドレス)
(#8),Y間接アドレス(ゼロページ(0x00-0xff)の指すアドレス + Y)※1
$ その命令が置かれている先頭アドレス
※1命令により、ページ(256バイト)をまたぐアドレスを指定した場合、+1ステート

3. フラグ欄(NVRBDIZC)

-変化なし
*命令の実行により変化
00にクリア
11をセット

4. ステート欄

1ステート1クロック
(+1) 1ページをまたぐ時に+1ステート

命令

(1) 転送
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
LDA B LDA # A ← # *-----*-2 2
B LDA #8 A ← (#8) *-----*-2 3
B LDA #8,X A ← (#8+X) *-----*-2 4
B LDA #16 A ← (#16) *-----*-3 4
B LDA #16,X A ← (#16+X) *-----*-3 4(+1)
B LDA #16,Y A ← (#16+Y) *-----*-3 4(+1)
B LDA (#8,X) A ← ((#8+X)) *-----*-2 6
B LDA (#8),Y A ← ((#8)+Y) *-----*-2 5(+1)
LDX B LDX # X ← # *-----*-2 2
B LDX #8 X ← (#8) *-----*-2 3
B LDX #8,Y X ← (#8+Y) *-----*-2 4
B LDX #16 X ← (#16) *-----*-3 4
B LDX #16,Y X ← (#16+Y) *-----*-3 4(+1)
LDY B LDY # Y ← # *-----*-2 2
B LDY #8 Y ← (#8) *-----*-2 3
B LDY #8,X Y ← (#8+X) *-----*-2 4
B LDY #16 Y ← (#16) *-----*-3 4
B LDY #16,X Y ← (#16+X) *-----*-3 4(+1)
STA B STA #8 (#8) ← A --------2 3
B STA #8,X (#8+X) ← A --------2 4
B STA #16 (#16) ← A --------3 4
B STA #16,X (#16+X) ← A --------3 5
B STA #16,Y (#16+Y) ← A --------3 5
B STA (#8,X) ((#8+X)) ← A --------2 6
B STA (#8),Y ((#8)+Y) ← A --------2 6
STX B STX #8 (#8) ← X --------2 3
B STX #8,Y (#8+Y) ← X --------2 4
B STX #16 (#16) ← X --------3 4
STY B STY #8 (#8) ← Y --------2 3
B STY #8,X (#8+X) ← Y --------2 4
B STY #16 (#16) ← Y --------3 4
TAX B TAX X ← A *-----*-1 2
TXA B TXA A ← X *-----*-1 2
TAY B TAY Y ← A *-----*-1 2
TYA B TYA A ← Y *-----*-1 2
TSX B TSX X ← S *-----*-1 2
TXS B TXS S ← X *-----*-1 2
PHA B PHA (SP) ← A
SP ← SP - 1
--------1 3
PHP B PHP (SP) ← P
SP ← SP - 1
--------1 3
PLA B PLA SP ← SP + 1
A ← (SP)
*-----*-1 4
PLP B PLP SP ← SP + 1
P ← (SP)
********1 4

(2) 算術演算
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
ADC B ADC # A ← A + # + C **----**2 2
B ADC #8 A ← A + (#8) + C **----**2 3
B ADC #8,X A ← A + (#8+X) + C **----**2 4
B ADC #16 A ← A + (#16) + C **----**3 4
B ADC #16,X A ← A + (#16+X) + C **----**3 4(+1)
B ADC #16,Y A ← A + (#16+Y) + C **----**3 4(+1)
B ADC (#8,X) A ← A + ((#8+X)) + C **----**2 6
B ADC (#8),Y A ← A + ((#8)+Y) + C **----**2 5(+1)
SBC B SBC # A ← A - # - (1-C) **----**2 2
B SBC #8 A ← A - (#8) - (1-C) **----**2 3
B SBC #8,X A ← A - (#8+X) - (1-C) **----**2 4
B SBC #16 A ← A - (#16) - (1-C) **----**3 4
B SBC #16,X A ← A - (#16+X) - (1-C) **----**3 4(+1)
B SBC #16,Y A ← A - (#16+Y) - (1-C) **----**3 4(+1)
B SBC (#8,X) A ← A - ((#8+X)) - (1-C) **----**2 6
B SBC (#8),Y A ← A - ((#8)+Y) - (1-C) **----**2 5(+1)
CMP B CMP # A - # *-----**2 2
B CMP #8 A - (#8) *-----**2 3
B CMP #8,X A - (#8+X) *-----**2 4
B CMP #16 A - (#16) *-----**3 4
B CMP #16,X A - (#16+X) *-----**3 4(+1)
B CMP #16,Y A - (#16+Y) *-----**3 4(+1)
B CMP (#8,X) A - ((#8+X)) *-----**2 6
B CMP (#8),Y A - ((#8)+Y) *-----**2 5(+1)
CPX B CPX # X - # *-----**2 2
B CPX #8 X - (#8) *-----**2 3
B CPX #16 X - (#16) *-----**3 4
CPY B CPY # Y - # *-----**2 2
B CPY #8 Y - (#8) *-----**2 3
B CPY #16 Y - (#16) *-----**3 4
INC B INC #8 (#8) ← (#8) + 1 *-----*-2 5
B INC #8,X (#8+X) ← (#8+X) + 1 *-----*-2 6
B INC #16 (#16) ← (#16) + 1 *-----*-3 6
B INC #16,X (#16+X) ← (#16+X) + 1 *-----*-3 7
INX B INX X ← X + 1 *-----*-1 2
INY B INY Y ← Y + 1 *-----*-1 2
DEC B DEC #8 (#8) ← (#8) - 1 *-----*-2 5
B DEC #8,X (#8+X) ← (#8+X) - 1 *-----*-2 6
B DEC #16 (#16) ← (#16) -+ 1 *-----*-3 6
B DEC #16,X (#16+X) ← (#16+X) - 1 *-----*-3 7
DEX B DEX X ← X - 1 *-----*-1 2
DEY B DEY Y ← Y - 1 *-----*-1 2

(3) 論理演算
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
AND B AND # A ← A and # *-----*-2 2
B AND #8 A ← A and (#8) *-----*-2 3
B AND #8,X A ← A and (#8+X) *-----*-2 4
B AND #16 A ← A and (#16) *-----*-3 4
B AND #16,X A ← A and (#16+X) *-----*-3 4(+1)
B AND #16,Y A ← A and (#16+Y) *-----*-3 4(+1)
B AND (#8,X) A ← A and ((#8+X)) *-----*-2 6
B AND (#8),Y A ← A and ((#8)+Y) *-----*-2 5(+1)
ORA B ORA # A ← A or # *-----*-2 2
B ORA #8 A ← A or (#8) *-----*-2 3
B ORA #8,X A ← A or (#8+X) *-----*-2 4
B ORA #16 A ← A or (#16) *-----*-3 4
B ORA #16,X A ← A or (#16+X) *-----*-3 4(+1)
B ORA #16,Y A ← A or (#16+Y) *-----*-3 4(+1)
B ORA (#8,X) A ← A or ((#8+X)) *-----*-2 6
B ORA (#8),Y A ← A or ((#8)+Y) *-----*-2 5(+1)
EOR B EOR # A ← A or # *-----*-2 2
B EOR #8 A ← A xor (#8) *-----*-2 3
B EOR #8,X A ← A xor (#8+X) *-----*-2 4
B EOR #16 A ← A xor (#16) *-----*-3 4
B EOR #16,X A ← A xor (#16+X) *-----*-3 4(+1)
B EOR #16,Y A ← A xor (#16+Y) *-----*-3 4(+1)
B EOR (#8,X) A ← A xor ((#8+X)) *-----*-2 6
B EOR (#8),Y A ← A xor ((#8)+Y) *-----*-2 5(+1)
AAX B AAX #8 (#8) ← X and A *-----*-2 3
B AAX #8,Y (#8,Y) ← X and A *-----*-2 4
B AAX #16 (#16) ← X and A *-----*-3 4
B AAX (#8,X) ((#8+X)) ← X and A *-----*-2 6
SXA B SXA #16,Y (#16,X) ← Y and [#16,X/256+1] --------3 5
SYA B SYA #16,X (#16,Y) ← X and [#16,Y/256+1] --------3 5

(4) ジャンプ・コール・リターン
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
JMP - JMP #16 PC ← #16 --------3 3
- JMP (#16) PC ← (#16) --------3 5
BEQ - BEQ $+2+d if Z=1 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BNE - BNE $+2+d if Z=0 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BCS - BCS $+2+d if C=1 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BCC - BCC $+2+d if C=0 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BMI - BMI $+2+d if M=1 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BPL - BPL $+2+d if M=0 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BVS - BVS $+2+d if V=1 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
BVC - BVC $+2+d if V=0 then PC ← $+2+d --------2 3(+1) [True]
2    [False]
JSR - JSR #16 PUSH $+2
PC ← #16
--------3 6
RTS - RTS PC ← POP + 1 --------1 6
RTI - RTI PSR ← POP
PC ← POP
********1 6
BRK - BRK PUSH $+1
PUSH PSR
PSR ← PSR or B
PC ← (0xfffe)
---1----1 7

(5) ローテイト・シフト
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
ASL B ASL A asl *-----**1 2
B ASL #8 *-----**2 5
B ASL #8,X *-----**2 6
B ASL #16 *-----**3 6
B ASL #16,X *-----**3 7
LSR B LSR A lsr *-----**1 2
B LSR #8 *-----**2 5
B LSR #8,X *-----**2 6
B LSR #16 *-----**3 6
B LSR #16,X *-----**3 7
ROL B ROL A rol *-----**1 2
B ROL #8 *-----**2 5
B ROL #8,X *-----**2 6
B ROL #16 *-----**3 6
B ROL #16,X *-----**3 7
ROR B ROR A ror *-----**1 2
B ROR #8 *-----**2 5
B ROR #8,X *-----**2 6
B ROR #16 *-----**3 6
B ROR #16,X *-----**3 7
RLA B RLA #8 *-----**2 5
B RLA #8,X *-----**2 6
B RLA #16 *-----**3 6
B RLA #16,X *-----**3 7
B RLA #16,Y *-----**3 7
B RLA (#8,X) *-----**2 8
B RLA (#8),Y *-----**2 8
SLO B SLO #8 **----**2 5
B SLO #8,X **----**2 6
B SLO #16 **----**3 6
B SLO #16,X **----**3 7
B SLO #16,Y **----**3 7
B SLO (#8,X) **----**2 8
B SLO (#8),Y **----**2 8

(6) ビット操作
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
BIT B BIT #8 if [A and (#8)]=0 then Z ← 1
else Z ← 0
**----*-2 3
B BIT #16 if [A and (#16)]=0 then Z ← 1
else Z ← 0
**----*-3 4
SEC - SEC C ← 1 -------11 2
CLC - CLC C ← 0 -------01 2
SEI - SEI I ← 1 -----1--1 2
CLI - CLI I ← 0 -----0--1 2
SED - SED D ← 1 ----1---1 2
CLD - CLD D ← 0 ----0---1 2
SEV - SEV V ← 1 -1------1 2
CLV - CLV V ← 0 -0------1 2

(7) 特殊演算・CPU制御
命令群サイズニーモニック機能 NVRBDIZC命令長ステート補足
NOP - NOP 何もしない --------1 2
DOP - DOP # 何もしない --------2 2
- DOP #8 --------2 3
- DOP #8,X --------2 4
TOP - TOP #16 何もしない --------3 4
- TOP #16,X --------3 4(+1)
KIL B KILL --------1 -
AAC B AAC # *-----**2 2
ARR B ARR # **----**2 2
ASR B ASR # *-----**2 2
ATX B ATX # *-----*-2 2
AXA B AXA #16,Y --------3 5
B AXA (#8),Y --------2 6
AXS B AXS # *-----**2 2
LAR B LAR #16,Y *-----*-3 4
XAA B XAA # --------2 2
XAS B XAS #16,Y --------3 5
DCP B DCP #8 -------*2 5
B DCP #8,X -------*2 6
B DCP #16 -------*3 6
B DCP #16,X -------*3 7
B DCP #16,Y -------*3 7
B DCP (#8,X) -------*2 8
B DCP (#8),Y -------*2 8
ISC B ISC #8 **----**2 5
B ISC #8,X **----**2 6
B ISC #16 **----**3 6
B ISC #16,X (#16,X) ← (#16,X) + 1
A ← A - (#16,X) - (1-C)
**----**3 7
B ISC #16,Y **----**3 7
B ISC (#8,X) **----**2 8
B ISC (#8),Y **----**2 8
LAX B LAX #8 A ← X ← (#8) *-----*-2 3
B LAX #8,Y A ← X ← (#8+Y) *-----*-2 4
B LAX #16 A ← X ← (#16) *-----*-3 4
B LAX #16,Y A ← X ← (#16+Y)< *-----*-3 4 (+1)
B LAX (#8,X) A ← X ← ((#8+X)) *-----*-2 6
B LAX (#8),Y A ← X ← ((#8)+Y) *-----*-2 5 (+1)
RRA B RRA #8 **----**2 5
B RRA #8,X **----**2 6
B RRA #16 **----**3 6
B RRA #16,X **----**3 7
B RRA #16,Y **----**3 7
B RRA (#8,X) **----**2 8
B RRA (#8),Y **----**2 8
SRE B SRE #8 *-----**2 5
B SRE #8,X *-----**2 6
B SRE #16 *-----**3 6
B SRE #16,X *-----**3 7
B SRE #16,Y *-----**3 7
B SRE (#8,X) *-----**2 8
B SRE (#8),Y *-----**2 8


命令コードマップ

色の説明

1. 文字・背景色

実装済み
未実装
未定義命令
未定義命令・未定義

命令コード

H/L 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 BRK ORA
(#8,X)
KIL SLO
(#8,X)
DOP
#8
ORA
#8
ASL
#8
SLO
#8
PHP ORA
#
ASL
A
AAC
#
TOP
#16
ORA
#16
ASL
#16
SLO
#16
1 BPL
$+2+d
ORA
(#8),Y
KIL SLO
(#8),Y
DOP
#8,X
ORA
#8,X
ASL
#8,X
SLO
#8,X
CLC ORA
#16,Y
NOP SLO
#16,Y
TOP
#16,X
ORA
#16,X
ASL
#16,X
SLO
#16,X
2 JSR
#16
AND
(#8,X)
KIL RLA
(#8,X)
BIT
#8
AND
#8
ROL
#8
RLA
#8
PLP AND
#
ROL
A
AAC
#
BIT
#16
AND
#16
ROL
#16
RLA
#16
3 BMI
$+2+d
AND
(#8),Y
KIL RLA
(#8),Y
DOP
#8,X
AND
#8,X
ROL
#8,X
RLA
#8,X
SEC AND
#16,Y
NOP RLA
#16,Y
TOP
#16,X
AND
#16,X
ROL
#16,X
RLA
#16,X
4 RTI EOR
(#8,X)
KIL SRE
(#8,X)
DCP
#8
EOR
#8
LSR
#8
SRE
#8
PHA EOR
#
LSR
A
ASR
#
JMP
#16
EOR
#16
LSR
#16
SRE
#16
5 BVC
$+2+d
EOR
(#8),Y
KIL SRE
(#8),Y
DOP
#8,X
EOR
#8,X
LSR
#8,X
SRE
#8,X
CLI EOR
#16,Y
NOP SRE
#16,Y
TOP
#16,X
EOR
#16,X
LSR
#16,X
SRE
#16,X
6 RTS ADC
(#8,X)
KIL RRA
(#8,X)
DOP
#8
ADC
#8
ROR
#8
RRA
#8
PLA ADC
#
ROR
A
ARR
#
JMP
(#16)
ADC
#16
ROR
#16
RRA
#16
7 BVS
$+2+d
ADC
(#8),Y
KIL RRA
(#8),Y
DOP
#8,X
ADC
#8,X
ROR
#8,X
RRA
#8,X
SEI ADC
#16,Y
NOP RRA
#16,Y
TOP
#16,X
ADC
#16,X
ROR
#16,X
RRA
#16,X
8 DOP
#
STA
(#8,X)
DOP
#
AAX
(#8,X)
STY
#8
STA
#8
STX
#8
AAX
#8
DEY DOP
#
TXA XAA
#
STY
#16
STA
#16
STX
#16
AAX
#16
9 BCC
$+2+d
STA
(#8),Y
KIL AXA
(#8),Y
STY
#8,X
STA
#8,X
STX
#8,Y
AAX
#8,Y
TYA STA
#16,Y
TXS XAS
#16,Y
SYA
#16,X
STA
#16,X
SXA
#16,X
AXA
#16,Y
A LDY
#
LDA
(#8,X)
LDX
#
LAX
(#8,X)
LDY
#8
LDA
#8
LDX
#8
LAX
#8
TAY LDA
#
TAX ATX
#
LDY
#16
LDA
#16
LDX
#16
LAX
#16
B BCS
$+2+d
LDA
(#8),Y
KIL LAX
(#8),Y
LDY
#8,X
LDA
#8,X
LDX
#8,Y
LAX
#8,Y
CLV LDA
#16,Y
TSX LAR
#16,Y
LDY
#16,X
LDA
#16,X
LDX
#16,Y
LAX
#16,Y
C CPY
#
CMP
(#8,X)
DOP
#
DCP
(#8,X)
CPY
#8
CMP
#8
DEC
#
DCP
#8
INY CMP
#
DEX AXS
#
CPY
#16
CMP
#16
DEC
#16
DCP
#16
D BNE
$+2+d
CMP
(#8),Y
KIL DCP
(#8),Y
DOP
#8,X
CMP
#8,X
DEC
#8,X
DCP
#8,X
CLD CMP
#16,Y
NOP DCP
#16,Y
TOP
#16,X
CMP
#16,X
DEC
#16,X
DCP
#16,X
E CPX
#
SBC
(#8,X)
DOP
#
ISC
(#8,X)
CPX
#8
SBC
#8
INC
#8
ISC
#8
INX SBC
#
NOP SBC
#
CPX
#16
SBC
#16
INC
#16
ISC
#16
F BEQ
$+2+d
SBC
(#8),Y
KIL ISC
(#8),Y
DOP
#8,X
SBC
#8,X
INC
#8,X
ISC
#8,X
SED SBC
#16,Y
NOP ISC
#16,Y
TOP
#16,X
SBC
#16,X
INC
#16,X
ISC
#16,X


アセンブラ仕様

HVC-001モジュールに、NESASMと互換性(一部疑似命令が未対応)のあるアセンブラを内蔵しています。
ソースファイル(ASM)を読み込むことで、デバッガからソースレベルのデバッグが可能になります。

以下の機能をサポートします。




アドレッシングモードの指定方法

ゼロページアドレス<
絶対アドレス
間接アドレス

疑似命令

疑似命令 引数説明
.EQU =と同じ
.INESPRG バンク数 プログラムROMのバンク数
.INESCHR バンク数 キャラクターROMのバンク数
.INESMIR フラグ ミラーフラグ
.INESMAP 番号 マッパー番号
.INESF6 ファイルヘッダーの6バイト目を指定
.FILE .nesファイルを出力する
.NOFILE .nesファイルを出力しない
.BANK バンク番号,[バンク跨ぎフラグ] 開始バンク番号
.ORG アドレス 開始アドレス
.ALIGN 2-256 アラインメントを揃える
.MACRO マクロ定義
.ENDM マクロ定義終了
.FUNC 関数内容
.FAIL
.ZP ゼロページセクション
.BSS BSSセクション
.CODE コードセクション
.DATA データセクション
.DB 定義データの配列 1バイトデータを定義
.DW 定義データの配列 2バイトデータを定義
.BYTE .DBと同じ
.WORD .DWと同じ
.DS 確保数 指定バイト数の領域を確保
.RSSET
.RS 確保数
.INCBIN "ファイル名" バイナリファイルをインクルード
.INCLUDE "ファイル名" 別ソースファイルをインクルード
.INCBMP"ファイル名", [8/16]ビットマップファイルをCHRへ変換して読み込む。
引数を指定しない、または8を指定した時は8x8、引数に16を指定した時は8x16
.IF 条件式
.IFDEF シンボル名
.IFNDEF シンボル名
.ELSE
.ELIF 条件式
.ENDIF
※1赤字の疑似命令は、NESASMには存在しない

定義済みシンボル名

シンボル名 説明
__VDMOD_VER__バージョン
ARG_NONE
ARG_REG
ARG_IMMEDIATE
ARG_ABSOLUTE
ARG_INDIRECT
ARG_STRING
ARG_LABEL

関数

関数名 引数 説明
HIGH() 値の上位8ビットを取得
LOW() 値の下位8ビットを取得
BANK() シンボル指定シンボルのあるバンク番号を取得
PAGE() シンボル指定シンボルのあるページ番号を取得
DEFINED()シンボルシンボルが定義されている時は1、未定義時は0を返す

特殊ラベル

名前 説明
@@ファイル内でのみ有効なローカルラベル
@B1つ前のローカルラベル
@F1つ先のローカルラベル
$ 命令のあるアドレス

例)

        JMP     @F                      ; 下にある @@ 行へジャンプ

        :

@@:     LDA     #0

        :

        JMP     @B                      ; 上にある @@ 行へジャンプ

        :

        JMP     $                       ; この命令を繰り返し
      

現在サポートしていない疑似命令

疑似命令 補足
.LIST
.NOLIST
.MLIST
.NOMLIST
.DEFCHR
.INCCHR .INCBMPをサポートしたのでサポートしない

例).ZP/.BSSで宣言したラベルを、デバッガ上のローカルへ表示する方法

.ZP/.BSSセクションで定義したラベル名の後に、':'を付けていないものが対象となります。

        .ZP                     ; ゼロページ
A       .DS     1
B       .DS     2
C:      .DS     1               ; ラベルの後に':'が付いているので表示されない

        .BSS                    ; RAM
D       .DS     1
E:      .DS     1               ; ラベルの後に':'が付いているので表示されない
F       .DS     1

例)バックアップを有効にする

        .IFDEF	__VDMOD_VER__           ; NESASM からアセンブルした時は無視するよう、IF/ENDIFで囲む
                .INESF6 %00000010       ; バックアップ有効
        .ENDIF



vdmgrによるデバッグ方法

デバッガ起動

vdmgrを起動した後、メニューから「設定」‐「詳細設定...」を選択して、詳細設定ダイアログを起動する。
詳細設定ダイアログのシステムに「HVC-001」、左側リストの「デバッガ」を選択した後、デバッガ起動をチェックする。
asl

「OK」ボタンを押下しデバッガを起動する。
asl


デバッガ画面説明

asl

  1. アセンブリ言語のソースファイル(.asm)開いた時に、ソースファイル名の一覧が表示されます。
    ファイル名をダブルクリックすることで、ソースファイルの内容が③へ表示され、⑤にファイル名が追加されます。
  2. CPUのレジスタが表示されます。
    レジスタの内容を変更するには、レジスタの値を選択後、値をシングルクリック、またはF2を押下する。
    値には8進数(0から始まる値)、10進数、16進数(0xから始まる値)が使用できます。
    $8000、$A000、$C000、$E000は読み込み専用で、このアドレスに割り当てられているバンク番号が表示されます。
  3. 逆アセンブルが選択されている時は逆アセンブルの内容、ソースファイルが選択されている時はソースファイルの内容が表示されます。
    左行のうすい灰色をクリックすることでブレークポイントの設定・解除ができます。
  4. 逆アセンブルを③へ表示します。
    右クリックすると、選択したアドレスに対応するデバッグ情報がある時のみソースファイルへの移動が可能です。
    Ctrl+G、またはメニューの「編集」‐「ジャンプ」を選択すると、指定アドレスへジャンプします。
  5. タブに書かれたファイルを③へ表示します。
    タブを閉じるには、一番右にある×ボタンを押下します。
    Ctrl+G、またはメニューの「編集」‐「ジャンプ」を選択すると、ソースファイルの指定行へジャンプします。
  6. ログが選択されている時は、ログが表示されます。
  7. ⑥へログを表示します。
    ROM読み込み時の情報や、アセンブリ言語のソースファイルを読み込んだ時にエラーが発生した時は、ここへエラー内容と行番号が表示されます。
    右クリックのメニューからログのクリアが可能です。
  8. ⑦へメモリー内容を表示します。 CPUやPPUのメモリー内容を表示と、メモリ内容の編集をすることが可能です。
    PPUメモリの編集は、NT/SPR/CHR/PALウィンドウの内容へリアルタイムに更新されます。
    左上にあるアドレスを指定することで、指定アドレスへジャンプします。
    右上にあるタブを選択することで、CPUとPPUのメモリを切り替えできます。
  9. ブレークポイント表示が選択されている時は、ブレークポイントが表示されます。
    ローカルが選択されている時は、アセンブリ言語のソースファイルで指定された変数の一覧が表示されます。
  10. 設定中のブレークポイント一覧を⑨へ表示します。
    ブレークポイント行をダブルクリックすることで、そのアドレス・行を③へ表示します。
    左のアイコンをクリックすると、ブレークポイントの有効・無効の切り替え、DELETEキーで削除ができます。
  11. アセンブリ言語のソースファイルを読み込んだ時に、ラベルの指定がされている変数を表示します。
    編集は②と同じシングルクリック、またはF2で行います。

表示ウィンドウ設定

メニューの「設定」‐「ウィンドウ」‐「1 HVC-001」を選択しチェックを入れ、ウィンドウを表示する。
メニューの「設定」‐「表示」‐「開発用」を選択しチェックを入れ、走査線やテレビに表示されない領域の表示を行う。


表示ウィンドウ画面説明

asl

  1. 表示領域。
    この領域がテレビに表示される。
  2. 水平ブランキング期間。
    この期間はテレビに表示されないため、ラスタースクロールや画像データの書き換えを行う時はこの期間内で行うことでちらつきが発生しない、またはちらつきを低減できる。
    ただし、CPUやROMからこの領域を正確に判断できない(HSyncが取得できない)ことや、垂直ブランキング期間以外はPPUのレジスタへのアクセスが制限される。
  3. 走査線+描画位置。
    緑の線で表示する。
  4. 垂直ブランキング期間。
    基本は、この期間内にPPUへのアクセスを終了する必要がある。
    ※最終行からPPUの処理が始まるので、正確には最終行を除く垂直ブランキング期間内
  5. VSyncのフラグ設定位置。
    緑色の点で設定され、CPUからみた垂直ブランキング期間はここから始まる。
    設定されるのでは、①から1行した。

PPU ネームテーブル・スプライト・キャラクターデータ・パレット確認ウィンドウ画面説明

asl
  1. ネームテーブル1の内容表示。
  2. ネームテーブル2の内容表示。
  3. ネームテーブル3の内容表示。
  4. ネームテーブル4の内容表示。
  5. スプライトの内容表示。
    左から順に0,1,2...と並ぶ。
    8x8表示時は上側へ8dot表示し、16x16表示時は16dot表示する。
  6. パターンデータ 0x0000-0x0fffの内容表示。
    パターンデータの表示に使用するパレットは、左クリックで切り替え可能。
  7. パターンデータ 0x1000-0x1fffの内容表示。
    パターンデータの表示に使用するパレットは、左クリックで切り替え可能。
  8. パレットデータの内容表示。

実行方法(アセンブリ言語のソースファイルのアセンブル方法)

テキストエディタで作成したソースファイルをvdmgrへドラッグアンドドロップ、またはメニューの「開く」からソースファイルを選択することでアセンブルを行います。
一度上記操作を行えば(たとえエラーが発生したとしても)、以降Ctrl+R、またはメニューの「再読み込み」を選択することで再読み込みが行えます。
通常は、初めの一度のみドラッグアンドドロップし、それ以降Ctrl+Rで再読み込みを行うことで開発を行います。

動作確認は、Downloadにある20210705_vrc7reg.zip、20141009_asmtest.zip、20170503_darius.zip(画像データの使用許可の返事を頂けていないので自分で取得する必要がありますが)で確認できます。
20210705_vrc7reg.zipは、圧縮ファイルを展開後、main.asmをドラッグアンドドロップ。
20141009_asmtest.zipは、圧縮ファイルを展開後、kybtest.asm、またはaputest.asmをドラッグアンドドロップ。

手持ちの古いチューナーからVGA出力ができたため、旧ファミコンで動作させた画面を録画しました。
20170503_darius.zipをアセンブル後、生成された.nesファイルをMMC5のROMへ書きこんだものが以下になります
(手持ちの安物USB HDMIキャプチャで60fps可能と書いている人を見かけたので60fpsで録画してみましたがカクつきます)