-
Notifications
You must be signed in to change notification settings - Fork 1
/
ndefs.h
132 lines (116 loc) · 2.81 KB
/
ndefs.h
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef NES_H
#define NES_H
#define SECTION_FAST //.section emu.fast, "awx"
#define SECTION_SLOW //.section emu.slow, "awx"
#define SECTION_HEAD //.section emu.head, "awx"
#define ALIGN .align 4
/*
* 6502 のレジスタ
*
* A は常に 24 ビットシフトしておく
* P は2つに分ける。
* NZはほとんどの命令が変更するので,NZの元になる値を保存
* 残りは他の場所に置く
*
* S は24ビットシフトしておく
* これで余って下のビットに P の残りを置く(VBDI)
* さらに余ってるところには割り込みに関するフラグを置く
*
* PC はROM内のアドレスに変換しておく
* この場合は境界チェックをしたほうがいいのだが,簡単ではない
* 本当の PC を得るためには現在のバンクの先頭アドレスを引けばよい
*/
#define REG_A r4
#define REG_X r5
#define REG_Y r6
#define REG_PC r7
#define REG_S r8
#define REG_NZ r9
#define REG_P_REST REG_S
#if 0
/*
* REG_P で使うフラグ
*/
#define ARM_N_FLAG 0x80000000
#define ARM_Z_FLAG 0x40000000
#define ARM_C_FLAG 0x20000000
#define ARM_V_FLAG 0x10000000
#endif
/*
* REG_P_REST には各種フラグを置く
*
* 0
* FEDCBA98 76543210
* |||||||| |||||||+---C キャリーまたはボローなし
* |||||||| ||||||+---NMIの発生
* |||||||| |||||+---I 割り込み許可
* |||||||| ||||+---D 十進モード
* |||||||| |||+---B
* |||||||| ||+---IRQの発生
* |||||||| |+---V オーバーフロー
* |||||||| +---$2005/$2006 トグルフラグ
* ||||||||
* |||||||+---$2000[2] 32インクリメント
* ||||||+---$2000[3] スプライトアドレス選択
* |||||+---$2000[4] バックグラウンドアドレス選択
* ||||+---$2000[5] スプライトサイズ
* |||+---未使用
* ||+---$2000[7] NMI許可
* |+---$2001[3] バックグラウンドを描画
* +---$2001[4] スプライトを描画
*
* 1
* FEDCBA9876543210
* |||||||||||||||+---$2002[4] VRAMに書き込み可?
* ||||||||||||||+---$2002[5] スプライトが多すぎ
* |||||||||||||+---$2002[6] スプライトヒット(実装できるのか?)
* ||||||||||||+---$2002[7] VBL
* |||||||||||+---DMC割り込み発生
* ||||||||||+---VRAMを持っている
* ||||||||++---未使用
* ++++++++---S スタックポインタ
*
*/
/*
* REG_P_REST で使うフラグ。基本的にPと同じ位置にある
*/
#define P_REST_V_FLAG 0x40
#define P_REST_B_FLAG 0x10
#define P_REST_D_FLAG 0x08
#define P_REST_I_FLAG 0x04
#define P_REST_C_FLAG 0x01
#define P_REST_FLAGS 0x5D
/*
* 割り込みが発生するとセットされる
*/
#define P_REST_INT_PENDING 0x20
#define P_REST_NMI_PENDING 0x02
#define ASSERT_NMI orr REG_P_REST, REG_P_REST, #P_REST_NMI_PENDING
#define ASSERT_INT orr REG_P_REST, REG_P_REST, #P_REST_INT_PENDING
/*
* 6502 の本当のフラグ
*/
#define P_N_FLAG 0x80
#define P_V_FLAG 0x40
#define P_R_FLAG 0x20
#define P_B_FLAG 0x10
#define P_D_FLAG 0x08
#define P_I_FLAG 0x04
#define P_Z_FLAG 0x02
#define P_C_FLAG 0x01
#define NMI_VECTOR 6
#define RESET_VECTOR 4
#define IRQ_VECTOR 2
/*
* 生成されたアドレス
*/
#define REG_ADDR r10
/*
* 残りサイクル
*/
#define REG_CYCLE r11
/*
* 命令のジャンプテーブル
*/
#define REG_OP_TABLE r12
#endif