aki_iic’s blog

己の欲せざる処人に施す事無かれ、狂人の真似するは即ち狂人なり

基板組立(その9)W65C816SでSBC

eb65816_v0 w65c816sでSBC

 ノスタルジーシリーズその6と言いますか(まだやってる:)WDCが開発した6502の8/16ビット発達型であるw65c816sを用いたSBCのお話。

 本チップは1980年代にApple//GS発表時の雑誌の記事で存在は知っていたのですが接する機会も無く、詳細を知ったのは21世紀になっていつもお世話になってるあのサイトでありました↓

www.st.rim.or.jp

 当方の理解力欠乏症:)故かなかなかアーキを理解出来なかったので今回はWikipedia(の日本語版)も参考としました(生い立ちとM,Xフラグの説明が解りやすかったので)↓

65816 (コンピュータ) - Wikipedia

 そして大切なのはWDCが公開しているw65c816sのデータシート↓

https://www.westerndesigncenter.com/wdc/documentation/w65c816s.pdf

 まづはこれを通読する事からでしょうか。レトロマイコン故か(40年前に開発されたチップ故)55ページでハード・ISA込みで簡潔に記載されております。但し注意事項としてmotorola脳の当方の印象としては(6502同様に)Motorola流とは異なる印象(ドキュメンテーションとして)で良く言えば簡潔、悪く言えば舌足らずでアプリケーションノートが存在するかもしれませんがこれだけでチップの機能を活かすデザインは当方の能力では難しい印象も(まあ、当方のスキルが足りないだけですが)。

 

0.w65c816sにつきまして

・ブロック図(WDCデータシートより引用)

w65c816s block diagram (WDC datasheet)

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

w65c816s bus timing (WDC datasheet)

 確かに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'でマルチプレクスされています。他にも色々あるのでデータシートにそれらが纏められております(簡潔に)↓

w65c816 pin function (WDC datasheet)

 記法は〇〇Bが負論理を示し(RWBなど)、それ以外は正論理で詳細はデータシートを熟読して下さい。くれぐれも6502/65C02と似た様なモノと舐めてると痛い目に会うかもしれません(ご用心)・・・

 今回は下記サイトの情報(特に回路図とモード表示LED)を参考にさせて頂きました(感謝を)。

flexonsbd.blogspot.com

 当方は(その8)でR65C02のSBCを製作しているのでw65c816s専用で今回は設計しました(個人的に両用機を開発するスキルが無いので・・・)。

Eピン(Emulation modeの出力ピン)にLEDを接続する発想は案外実用的で6502エミュレーションモード(デフォルト状態)から65816モードに遷移するとEピンが’H'⇒’L'に変化し、都合LEDが点灯するのでモード遷移を可視化できるのはGoodです(改めて感謝を)。

 そのリセット時のモードについてレジスタ等の初期状態が記載されています。これも重要な情報ですね↓

w65c816 reset value (WDC datasheet)

 ここで重要なのは(全部重要なのですが)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フラグを適時設定する必要があり、専用の命令が用意されています↓

w65c816sでの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.ブロック図

eb65816_v0 block diagram

 いつもの縛りなので(その4)〜(その8)を参照願います(特にその8)。w65c816はオークションで入手したチップですが14Mhz迄行けるのでちょっと勿体ないのですが縛りの2Mhzで動作させています(8Mhzの4分周)。

 尚、メモリマップは(その8)のeb6502_v0と互換です(0x000000〜0x00ffffに於いて)。

 

2.回路図

eb65816_v0 回路図(ダークモード)

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

 

3.パターン図(全レイヤ合成)

eb65816_v0 パターン図(全レイヤ合成)

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.実装ボード(実物)

eb65816_v0 部品面

eb65816_v0 半田面

 ご覧の通り改造入ってます。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.デバッグ環境

eb65816_v0 デバッグ中

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

eb65816_v0 タイミング検証:eではなくphi2in(教訓)

 言い忘れましたが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 symbols

  AS 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モードで点灯)が点灯する様になりました↓

eb65816_v0 動作確認中:65816モードで青LEd点灯:)

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

・dba(起動時)

eb65816_v0 dba 起動時

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

・dba(ramtest)

eb65816_v0 dba ramtest

・dba (ioarea)

eb65816_v0 dba ioarea

7.性能測定(オレオレベンチマーク:)

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

eb65816_v0 56KBロード時間測定(825ms@2.5Mhz)

 測定値は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世紀ですが)。

 

・前のトピック:

aki-iic.hatenablog.com

・次のトピック:

aki-iic.hatenablog.com

*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