
ノスタルジーシリーズその6と言いますか(まだやってる:)WDCが開発した6502の8/16ビット発達型であるw65c816sを用いたSBCのお話。
本チップは1980年代にApple//GS発表時の雑誌の記事で存在は知っていたのですが接する機会も無く、詳細を知ったのは21世紀になっていつもお世話になってるあのサイトでありました↓
当方の理解力欠乏症:)故かなかなかアーキを理解出来なかったので今回はWikipedia(の日本語版)も参考としました(生い立ちとM,Xフラグの説明が解りやすかったので)↓
そして大切なのはWDCが公開しているw65c816sのデータシート↓
https://www.westerndesigncenter.com/wdc/documentation/w65c816s.pdf
まづはこれを通読する事からでしょうか。レトロマイコン故か(40年前に開発されたチップ故)55ページでハード・ISA込みで簡潔に記載されております。但し注意事項としてmotorola脳の当方の印象としては(6502同様に)Motorola流とは異なる印象(ドキュメンテーションとして)で良く言えば簡潔、悪く言えば舌足らずでアプリケーションノートが存在するかもしれませんがこれだけでチップの機能を活かすデザインは当方の能力では難しい印象も(まあ、当方のスキルが足りないだけですが)。
0.w65c816sにつきまして
・ブロック図(WDCデータシートより引用)

は、上記情報、特にWDCのドキュメントを参照(精読した方が良いかもしれない)ですが、唯一のチャートであるバスタイミング(ホントに1つしかない)を引用しておきます↓

確かに68xx系のバスサイクルは基本1つなのでこれで良いのだ〜(棒)は妥当ですが、本チップでは68xx系ではほぼ使用されていなかったPHI2(φ2、Eクロックとも)が’L'のサイクルに拡張された情報(24ビットアドレスのa23-16をd0-7にマルチプレクスする等)が合理的に組み込まれているのでやはり精読が必要です。
用語もmotorolaとは異なるのでEとはEクロックではなく65816の6502 EmulationのEであり、MXとは何かのモードですがMとXがPHI2='L'/'H'でマルチプレクスされています。他にも色々あるのでデータシートにそれらが纏められております(簡潔に)↓

記法は〇〇Bが負論理を示し(RWBなど)、それ以外は正論理で詳細はデータシートを熟読して下さい。くれぐれも6502/65C02と似た様なモノと舐めてると痛い目に会うかもしれません(ご用心)・・・
今回は下記サイトの情報(特に回路図とモード表示LED)を参考にさせて頂きました(感謝を)。
当方は(その8)でR65C02のSBCを製作しているのでw65c816s専用で今回は設計しました(個人的に両用機を開発するスキルが無いので・・・)。
Eピン(Emulation modeの出力ピン)にLEDを接続する発想は案外実用的で6502エミュレーションモード(デフォルト状態)から65816モードに遷移するとEピンが’H'⇒’L'に変化し、都合LEDが点灯するのでモード遷移を可視化できるのはGoodです(改めて感謝を)。
そのリセット時のモードについてレジスタ等の初期状態が記載されています。これも重要な情報ですね↓

ここで重要なのは(全部重要なのですが)MとXのフラグというかモードというかについて言及しておきます。6502はDフラグというBCD演算専用のフラグがあってD=1にするとBCD演算が行えます(おさらい)つまりDAA命令が無くてもBCD演算が行えるという慣れれば便利な機能なのでしょうが、w65c816では8/16ビットの機能拡張にDフラグと同様の手法でM:ACCの8/16ビット切り替え、M=1で8ビット、つまり6502互換モード相当、X:x,yレジスタの8/16ビット切り替え、X=1で8ビット、つまり6502互換の8ビットのx,yレジスタとして使用出来ます。それがPレジスタ(CCRとかProcessor statusとか)の各ビットに割り当てられており、それをセット/リセットする事でM,Xフラグというかモードを独立して設定/解除出来ます(伝わりますでしょうか?)。
互換の為に上図のとおりリセット時はM=1,X=1つまりACCは8ビット、x,yレジスタも8ビットの6502互換モードで起動します。なので65816の機能を使用する為にはM,Xフラグを適時設定する必要があり、専用の命令が用意されています↓

上記はasl-1.42の例ですがM=1,X=0に設定した例です。ちなみに本機ではこのM=1,X=0ですなわち、ACCは8ビット(6502互換)、x,yは16ビット(65816拡張)で使用する事にしました。理由は8ビットIO構成なので(縛り故:)16ビット前提のM=0では不都合が生じる為です。
なのでイメージ的には6502のx、yが16ビットレジスタになって面倒で複雑で遅くなる間接アドレッシングを使用せずに16ビットアドレス空間(24ビットでない点に注意)のアクセスが可能となります。
#正直、本ボード製作の目的はほぼこれです(反芻:)。
あと、M,Xの状態で同じ命令でも動きが異なるのでasl-1.42では上図の如く、
assume m:0 or 1 ,x:0 or 1
で各モードを想定します。本機では m=1,x=0 を想定するので
assume m:1,x:0
となります。これはプログラマが整合が取れていれば変更可能なのでアセンブラのディレクティブと実際のコード(モード)が整合が取れている必要があります(割込みルーチン等では注意が必要ですね。gemini3(flash)さんが教えてくれました。スーパーファミコンではノウハウなのだそうで(伝聞))。
当方はそんな面倒な事を管理する能力無いのでM=1,X=0固定で使います。
1.ブロック図

いつもの縛りなので(その4)〜(その8)を参照願います(特にその8)。w65c816はオークションで入手したチップですが14Mhz迄行けるのでちょっと勿体ないのですが縛りの2Mhzで動作させています(8Mhzの4分周)。
尚、メモリマップは(その8)のeb6502_v0と互換です(0x000000〜0x00ffffに於いて)。
2.回路図

見づらいとのご指摘を頂いたので(見当違いかもしれませんが)ダークモードで引用してみます。ジジイなのでダークモードがデフォルト化しておりまして:)。
3.パターン図(全レイヤ合成)

4.PLA
module eb816v0
a0 PIN 30; "Address line
a1 PIN 31; "Address line
a2 PIN 32; "Address line
a3 PIN 33; "Address line
a4 PIN 34; "Address line
a5 PIN 35; "Address line
a6 PIN 36; "Address line
a7 PIN 37; "Address line
a8 PIN 39; "Address line
a9 PIN 40; "Address line
a10 PIN 41; "Address line
a11 PIN 42; "Address line
a12 PIN 43; "Address line
a13 PIN 44; "Address line
a14 PIN 45; "Address line
a15 PIN 46; "Address line
r_w PIN 47;
sysclk PIN 49;
e PIN 50;
_reset PIN 48;
d0 PIN 29; "Data bus line
d1 PIN 28; "Data bus line
d2 PIN 27; "Data bus line
d3 PIN 25; "Data bus line
d4 PIN 24; "Data bus line
d5 PIN 23; "Data bus line
d6 PIN 22; "Data bus line
d7 PIN 21; "Data bus line
a16 PIN 7 istype 'reg';
ma16 PIN 6;
BCK PIN 5;
ph2in PIN 4;
nFT245TXE PIN 3; "MCU I/O
nFT245RXF PIN 2; "MCU I/O
nCF PIN 52;
pb7 PIN 51; "MCU I/O
tms PIN 20; "TMS
tck PIN 19; "TCK
nFT245RD PIN 18;
FT245WR PIN 17;
nRAM PIN 14;
tdi PIN 13; "TDI
tdo PIN 12; "TDO
nPIA PIN 11;
nACIA PIN 10;
nRD PIN 9;
nWR PIN 8;
rs0 node;
csiop node;
fs0 node;
f1 NODE istype 'reg_D';
f2 NODE istype 'reg_D';
q0 NODE istype 'reg_D';
q1 NODE istype 'reg_D';
q2 NODE istype 'reg_D';
q3 NODE istype 'reg_D';X = .x.;
address = [a15..a0];
Vcc = 1;
Gnd = 0;
// Begin user preserved declarations (not affected by iterations of DA usage) ===================
count = [q3, q2, q1, q0];
// End user preserved declarations (not affected by iterations of DA usage) ===================
equations
rs0 = *1;
csiop = *2;
fs0 = *3;
! nCF = *4;
! nFT245RD = *5;
FT245WR = *6;
! nRAM = *7
# *8;
! nPIA = *9;
! nACIA = *10;
a16.ld = ph2in;
ma16 = a16;
ma16.oe = _reset;
ph2in = f2;
ph2in.oe = Vcc;
pb7.oe = _reset;
nRD = !(ph2in & r_w);
nRD.oe = _reset;
nWR = !(ph2in & !r_w) ;
nWR.oe = _reset;
f1 := !f2;
f1.ck = sysclk;
f1.re = Gnd;
f2 := f1;
f2.ck = sysclk;
f2.re = Gnd;
q0.ck = sysclk;
q1.ck = sysclk;
q2.ck = sysclk;
q3.ck = sysclk;
// Begin user preserved equations (not affected by iterations of DA usage) ===================WHEN (count == 12) THEN
count := 0;
ELSE
count := count + 1;BCK = (count == 12);
// End user preserved equations (not affected by iterations of DA usage) ===================
end eb816v0
5.実装ボード(実物)


ご覧の通り改造入ってます。piaのpb7とpsdのpb7を分離すべくpsdpb7にネット名を変更し、probeコネクタにもpsdpb7ピンを割り当てたのですが肝心のled pb7のネット名をpb7のままにしていた(はずかし)。幸い部品実装後もパタンカット出来たので(L2でカットしてます)黄色いジャンパはpsdpb7とledのpb7を接続した物です。この手の修正ミスはERCでは検出困難なので回路チェック(特に変更部分)を入念に行うべきでした(反省点)。
識別の為に今回は基板色を紫にしてみたのですが(6502系のボードは紫が多い様なのでそれに跋扈したといいますか・・・)目視でのパタン見るには緑の方が良いというか・・・人様の猿真似しても当方の価値?に変化がある訳でも無く・・・とか言いながらあと何色使ってなかったっけと妄想(おバカですな:)。
消費電流は0.040A(40mA)程度で都合0.20W程度なので2Mhzの68xx系としてはそんなもんでしょうか。eb6502_v0(R65C02@2Mhz)より増えてますがそれはCPU構成を鑑みて当然の範囲かと。
5.デバッグ環境

今回は色々あってデバッグに往生したのでロジアナ(LA2016)を接続してISP試行錯誤で迷走しましたが、原因はpsdabelの記述でe ではなくて phi2in (eは外部からのクロック入力、phi2はpsd内部で生成するφ2というかEクロックへの出力)で記載しないと正常(期待する)回路が合成されない様で中途半端に動作する(だが不安定)で究明に手こずりました(教訓)。修正後のタイミングは下記のとおり↓

言い忘れましたが8MhzのOSCが使い切っていた様で代替で10Mhz OSCで測定したのでPHI2は10/4=2.5Mhzとなっております(すみません)。
尚、上図ではeb6502_v0のdbaでテストしているのでEM ledは消灯しております(フラットケーブルに隠れて見えない:)。
6.dba
20260615 15:31 すみません、65816でなくて80c188のdba貼ってしまいました(恥ずかし)、65816のdbaを貼り直します(ホントすみません)。
AS V1.42 Beta [Bld 270] - Source File eb65816_t3.asm - Page 1 - 2026年06月14日 09時56分31秒
1/ 0 : CPU 65816 ; W65C816モードの指定
2/ 0 :
3/ 0 : ; cpu 6502
4/ 0 : ; 20260304 : hc11f_v1 ⇒ eb6802_v0にバックポート
5/ 0 : ; 20260412 : eb6802_v0 ⇒ eb6502_v0に移植
6/ 0 : ; 20260419 : goコマンドは jsr ABS しか6502はサポートしないのでram上に展開する。
7/ 0 : ; 20260511 : d3コマンドバグ修正
8/ 0 : ; 20260605 : eb6502_v0 ⇒ eb65816_v0に移植
9/ 0 : ; 20260614 : eb65816_v0 で M=1,X=0 で65816モード対応
10/ 0 : :
11/ 0 : =$F800 romtop equ $f800
12/ 0 : =$F400 csiop equ $f400 ; $f400-f43f(256バイト境界)
13/ 0 : =$F000 ramtop equ $f000 ; $f000-f3ff
14/ 0 : =$F3FF rambtm equ ramtop+$3ff
15/ 0 : =$F405 pb7 equ csiop+5 ; psd portb7
16/ 0 : =$F401 pbin equ csiop+1 ; ft245 status
17/ 0 : =$F478 ft245 equ $f478 ; $f478
18/ 0 :
19/ 0 : org 0 ; zero page
20/ 0 :
21/ 0 : p0 rmb 2 ; zero page addressing用
22/ 2 : p1 rmb 2
23/ 4 : p2 rmb 2
24/ 6 : p3 rmb 2
25/ 8 : p4 rmb 2
26/ A : p5 rmb 2
27/ C : p6 rmb 2
28/ E : p7 rmb 2
29/ 10 :
30/ F000 : org ramtop
31/ F000 :
32/ F000 : a0 rmb 2 ; pseduo a0
33/ F002 : a1 rmb 2
34/ F004 : a2 rmb 2
35/ F006 : a3 rmb 2
36/ F008 : a4 rmb 2
37/ F00A : a5 rmb 2
38/ F00C : a6 rmb 2
39/ F00E : d0 rmb 2 ; pseduo d0
40/ F010 : d1 rmb 2
41/ F012 : d2 rmb 2
42/ F014 : d3 rmb 2
43/ F016 : d4 rmb 2
44/ F018 : d5 rmb 2
45/ F01A : d6 rmb 2
46/ F01C : d7 rmb 2
47/ F01E : y rmb 2 ; pseduo Y reg
48/ F020 : w rmb 2
49/ F022 : g rmb 4 ; jsr adrL,adrH ; rts
50/ F026 :
51/ F800 : org romtop
52/ F800 : =$5 dly_cnt equ 5
53/ F800 : assume m:1,x:0 ; ACC:8bit,X,Y:16bitモードで使用
54/ F800 : start:
55/ F800 : ; (リセット処理、ネイティブモード移行処理など)
56/ F800 : 18 CLC
57/ F801 : FB XCE ; ネイティブモードへ
58/ F802 : ; ハードウェアのフラグ操作
59/ F802 : E2 20 SEP #$20 ; M=1 (A=8bit)
60/ F804 : C2 10 REP #$10 ; X=0 (X/Y=16bit)
AS V1.42 Beta [Bld 270] - Source File eb65816_t3.asm - Page 2 - 2026年06月14日 09時56分31秒
61/ F806 :
62/ F806 : 20 EE F8 jsr pb7on ; pb7=on
63/ F809 : 20 F6 F8 jsr dly
64/ F80C : 20 E8 F8 jsr pb7off
65/ F80F :
66/ F80F : ;echo jsr pbin0
67/ F80F : ; sta pb7
68/ F80F : ; jmp echo
69/ F80F :
70/ F80F : ; cmd待ち
71/ F80F : 20 E8 F8 cmd jsr pb7off
72/ F812 : 20 C2 F8 jsr pbin0 ; cmd受信
73/ F815 : 20 EE F8 jsr pb7on
74/ F818 : C9 D1 cmp #$d1 ; memory dump?
75/ F81A : D0 06 bne cmd1
76/ F81C : 20 68 F8 jsr memc ; cmd exec
77/ F81F : 4C 0F F8 jmp cmd
78/ F822 : C9 D2 cmd1 cmp #$d2 ; go?
79/ F824 : D0 06 bne cmd2
80/ F826 : 20 6F F8 jsr go ; go cmd
81/ F829 : 4C 0F F8 jmp cmd
82/ F82C : C9 D3 cmd2 cmp #$d3 ; memory write?
83/ F82E : D0 06 bne cmd0
84/ F830 : 20 40 F8 jsr memw ; memw exec
85/ F833 : 4C 0F F8 jmp cmd
86/ F836 : C9 D0 cmd0 cmp #$d0 ; machine id?
87/ F838 : D0 D5 bne cmd
88/ F83A : 20 96 F8 jsr id
89/ F83D : 4C 0F F8 jmp cmd
90/ F840 : ; memory write
91/ F840 : 20 B1 F8 memw jsr adrin ; 戻り値はpとする
92/ F843 : A5 02 lda p1
93/ F845 : 85 04 sta p2
94/ F847 : A5 03 lda p1+1
95/ F849 : 85 05 sta p2+1 ; p1をp2にコピー
96/ F84B : 20 B1 F8 jsr adrin
97/ F84E : A5 02 lda p1
98/ F850 : 8D 18 F0 sta d5 ; length = d5
99/ F853 : A5 03 lda p1+1
100/ F855 : 8D 19 F0 sta d5+1
101/ F858 : A4 04 ldy p2
102/ F85A : AE 18 F0 ldx d5
103/ F85D : 20 C2 F8 memw0 jsr pbin0 ; accb
104/ F860 : 99 00 00 sta 0,y ; (y) <- acc
105/ F863 : C8 iny
106/ F864 : CA dex
107/ F865 : D0 F6 bne memw0
108/ F867 : 60 memw2 rts
109/ F868 :
110/ F868 : ; memory dump
111/ F868 : 20 B1 F8 memc jsr adrin ; adrs = p1
112/ F86B : 20 CD F8 jsr dump
113/ F86E : 60 rts
114/ F86F : ; go
115/ F86F : 20 B1 F8 go jsr adrin ; adrs = p1
116/ F872 : A9 20 lda #$20 ; jsr命令をg[]のramに書く
117/ F874 : 8D 22 F0 sta g
118/ F877 : A5 02 lda p1
119/ F879 : 8D 23 F0 sta g+1 ; adrL
120/ F87C : A5 03 lda p1+1
AS V1.42 Beta [Bld 270] - Source File eb65816_t3.asm - Page 3 - 2026年06月14日 09時56分31秒
121/ F87E : 8D 24 F0 sta g+2 ; adrH
122/ F881 : A9 60 lda #$60 ; rts命令をram上のg[3]に書く
123/ F883 : 8D 25 F0 sta g+3
124/ F886 : 20 22 F0 jsr g ; subroutineとして呼び出し
125/ F889 : AD 01 F4 go0 lda pbin ; ft245 rxf?
126/ F88C : 29 10 and #$10
127/ F88E : D0 F9 bne go0
128/ F890 : A9 00 lda #0
129/ F892 : 8D 78 F4 sta ft245 ; 常に00を返す
130/ F895 : 60 rts
131/ F896 :
132/ F896 : id:
133/ F896 : A9 1E lda #30 ; 30文字固定
134/ F898 : 8D 1E F0 sta y
135/ F89B : A2 1E F9 ldx #tgt_id ; 文字列オフセット x=0
136/ F89E : AD 01 F4 id0 lda pbin
137/ F8A1 : 29 10 and #$10
138/ F8A3 : D0 F9 bne id0
139/ F8A5 : B5 00 lda 0,x
140/ F8A7 : 8D 78 F4 sta ft245
141/ F8AA : E8 inx
142/ F8AB : CE 1E F0 dec y
143/ F8AE : D0 EE bne id0
144/ F8B0 : 60 rts
145/ F8B1 :
146/ F8B1 : adrin:
147/ F8B1 : 20 C2 F8 jsr pbin0 ; 上位2バイトは読み飛ばす
148/ F8B4 : 20 C2 F8 jsr pbin0
149/ F8B7 : 20 C2 F8 jsr pbin0 ; 戻り値はaccbに
150/ F8BA : 85 03 sta p1+1 ; ゼロページ、little endianなので
151/ F8BC : 20 C2 F8 jsr pbin0
152/ F8BF : 85 02 sta p1 ; レジスタ返しが出来ないのでゼロページポインタ p1が戻り値(little endian)
153/ F8C1 : 60 rts
154/ F8C2 :
155/ F8C2 : AD 01 F4 pbin0 lda pbin
156/ F8C5 : 29 20 and #$20
157/ F8C7 : D0 F9 bne pbin0
158/ F8C9 : AD 78 F4 lda ft245 ; 受信データ <- acc
159/ F8CC : 60 rts
160/ F8CD :
161/ F8CD : A9 00 dump lda #0 ; == 256
162/ F8CF : 8D 1E F0 sta y
163/ F8D2 : A4 02 ldy p1
164/ F8D4 : AD 01 F4 dump0 lda pbin
165/ F8D7 : 29 10 and #$10
166/ F8D9 : D0 F9 bne dump0
167/ F8DB : B9 00 00 lda 0,y
168/ F8DE : 8D 78 F4 sta ft245 ; 送信データ
169/ F8E1 : C8 iny
170/ F8E2 : CE 1E F0 dec y ; 256byteなので
171/ F8E5 : D0 ED bne dump0
172/ F8E7 : 60 rts
173/ F8E8 :
174/ F8E8 : 48 pb7off pha
175/ F8E9 : A9 80 lda #$80 ; pb7 led off
176/ F8EB : 4C F1 F8 jmp pb7set
177/ F8EE : 48 pb7on pha
178/ F8EF : A9 00 lda #0 ; pb7 led on
179/ F8F1 : 8D 05 F4 pb7set sta pb7
180/ F8F4 : 68 pla
AS V1.42 Beta [Bld 270] - Source File eb65816_t3.asm - Page 4 - 2026年06月14日 09時56分31秒
181/ F8F5 : 60 rts
182/ F8F6 :
183/ F8F6 : 48 dly pha
184/ F8F7 : A2 05 00 ldx #dly_cnt
185/ F8FA : A9 00 dly0 lda #0
186/ F8FC : 8D 20 F0 sta w
187/ F8FF : 8D 21 F0 sta w+1
188/ F902 : AD 21 F0 lda w+1
189/ F905 : D0 03 bne dly1
190/ F907 : CE 20 F0 dec w
191/ F90A : CE 21 F0 dly1 dec w+1
192/ F90D : D0 FB bne dly1
193/ F90F : AD 20 F0 lda w
194/ F912 : F0 05 beq dly2
195/ F914 : CE 20 F0 dec w
196/ F917 : D0 F1 bne dly1
197/ F919 : CA dly2 dex
198/ F91A : D0 DE bne dly0
199/ F91C : 68 pla
200/ F91D : 60 rts
201/ F91E :
202/ F91E : ; 123456789012345678901234567890
203/ F91E : 65 62 36 35 38 31 36 5F tgt_id fcc 'eb65816_v0:20260614E01 '
F926 : 76 30 3A 32 30 32 36 30
F92E : 36 31 34 45 30 31 20 20
F936 : 20 20 20 20 20 20
204/ F93C :
205/ FFFC : org $fffc
206/ FFFC : 00 F8 resvec fdb start ; reset vector
207/ FFFE :
208/ FFFE : end
AS V1.42 Beta [Bld 270] - Source File eb65816_t3.asm - Page 5 - 2026年06月14日 09時56分31秒
Symbol Table (* = unused):
--------------------------*A0 : F000 C | *A1 : F002 C |
*A2 : F004 C | *A3 : F006 C |
*A4 : F008 C | *A5 : F00A C |
*A6 : F00C C | ADRIN : F8B1 C |
*ARCHITECTURE : "x86_64-unknown-linux" - |
*CASESENSITIVE : 0 - | CMD : F80F C |
CMD0 : F836 C | CMD1 : F822 C |
CMD2 : F82C C | *CONSTPI : 3.141592653589793 - |
CSIOP : F400 - | *D0 : F00E C |
*D1 : F010 C | *D2 : F012 C |
*D3 : F014 C | *D4 : F016 C |
D5 : F018 C | *D6 : F01A C |
*D7 : F01C C |
*DATE : "2026\-027\-071\-07606\-026\-100\-12014\-026\-105\-091" - |
DLY : F8F6 C | DLY0 : F8FA C |
DLY1 : F90A C | DLY2 : F919 C |
DLY_CNT : 5 - | DUMP : F8CD C |
DUMP0 : F8D4 C | *FALSE : 0 - |
FT245 : F478 - | G : F022 C |
GO : F86F C | GO0 : F889 C |
*HAS64 : 1 - | ID : F896 C |
ID0 : F89E C | *LISTON : 1 - |
*MACEXP : 7 - | MEMC : F868 C |
MEMW : F840 C | MEMW0 : F85D C |
*MEMW2 : F867 C | *MOMCPU : 65816 - |
*MOMCPUNAME : "65816" - | *NESTMAX : 100 - |
*P0 : 0 C | P1 : 2 C |
P2 : 4 C | *P3 : 6 C |
*P4 : 8 C | *P5 : A C |
*P6 : C C | *P7 : E C |
PB7 : F405 - | PB7OFF : F8E8 C |
PB7ON : F8EE C | PB7SET : F8F1 C |
PBIN : F401 - | PBIN0 : F8C2 C |
*RAMBTM : F3FF - | RAMTOP : F000 - |
*RELAXED : 0 - | *RESVEC : FFFC C |
ROMTOP : F800 - | START : F800 C |
TGT_ID : F91E C |
*TIME : "09\-026\-103\-12656\-027\-120\-12231\-025\-089\-110" - |
*TRUE : 1 - | *VERSION : 142F - |
W : F020 C | Y : F01E C |75 symbols
38 unused symbolsAS V1.42 Beta [Bld 270] - Source File eb65816_t3.asm - Page 6 - 2026年06月14日 09時56分31秒
Code Pages:
----------STANDARD (0 changed characters)
1 code page
0.02 seconds assembly time
210 lines source file
2 passes
0 errors
0 warnings
上記は6502コードで動作確認後、65816モード(M=1,X=0)用に修正したものです(つまり65816専用)。
修正箇所は8ビットレジスタ(x,y)で不足した16ビットアドレシング、16ビットカウンタを16ビットのx、yに置換して最適化したつもりです。これに伴いEM led(65816モードで点灯)が点灯する様になりました↓

リセットするとPB7⇒EM(青LED)が点灯し、PB7消灯後、EM(青LED)点灯とモード遷移が良くわかります。
・dba(起動時)

マップは同じなので$F800からのコードが65816用に変わっています。M=1,X=0で使うと決めたのでリセット後速やかに65816モードに遷移します。
・dba(ramtest)

・dba (ioarea)

7.性能測定(オレオレベンチマーク:)
折角65186用にコード修正したので例のオレオレベンチマークで性能測定してみました↓

測定値は2.5Mhz動作時のものなので2Mhz動作に換算する必要があります。
・56KB/0.825*(8/10)=54.3KB/秒 となり、
・eb65816_v0 w65c816s@2Mhz 56KB/0.825sec * (8/10) 54.3KB/sec 27.15KB/Mhzであり、
・eb6502_v0 r65c02@2Mhz 56KB/1.837sec 30.48KB/sec 15.24KB/Mhz
と比較すると約1.78倍の性能向上となります。
・順位(転送速度):
z80@8Mhz > 65816@2Mhz 6809@2Mhz > 9995@3Mhz(0w) > 6502@2Mhz > 6802@2Mhz > 9995@3Mhz(1w)
・順位(Mhz辺りの転送速度):
65816 > 6809 > 6502 > 9995(0w) > 6802 > 9995(1w) > z80
となりました。無論、自己満足の世界なのですがきつねうどんとたぬきそばを比べる様なもので意味がある訳でも(特に64ビット@数Ghzの21世紀では)ありませんがまあ、道楽としてご容赦の程:)
8.まとめ
・eb65816_v0 を組立て、動作確認を行いました(dbaまで)。
・65816のM=1,X=0で動作する様、dbaを更新しました(65816専用)。
・オレオレベンチマーク:)では16ビットアドレシングに16ビットのx、yを使用する事で性能改善が認められました。
・65816は使い方によっては6502の欠点を解消したチップではあるのでレトロマイコンとしてはCPIに優れる点は評価してあげても良いと思われます(21世紀ですが)。
・前のトピック:
・次のトピック:
*1:address >= ^hF000) & (address <= ^hF3FF) & (!ma16
*2:address >= ^hF400) & (address <= ^hF43F) & (!ma16
*3:address >= ^hF800) & (address <= ^hFFFF) & (!ma16
*4:address >= ^hF4A0) & (address <= ^hF4AF) & (!ma16
*5:address >= ^hF478) & (address <= ^hF478) & (ph2in & r_w & !ma16
*6:address >= ^hF478) & (address <= ^hF478) & (ph2in & !r_w & !ma16
*7:address >= ^h0000) & (address <= ^hEFFF) & (!ma16
*8:address >= ^h0000) & (address <= ^hFFFF) & (ma16
*9:address >= ^hF480) & (address <= ^hF48F) & (!ma16
*10:address >= ^hF490) & (address <= ^hF49F) & (!ma16