
ノスタルジーシリーズ(まだやってます:)その6のアップデートという事でその6−1であります。ベースはその6ですので
基板組立(その6)MC6809EでSBC - aki_iic’s blog
をご参照下さい。アップデートの要点は以下のとおり。
・プロセサはHD63C09E@3Mhzに換装、クロックは8Mhz⇒12Mhzに
・上記に伴いボーレートは38.4k/9.6k ⇒ 57.6k/14.4k に変更(13分周故)
・HD63B21,HD63B50をHD63C09E@3Mhzとインタフェースする回路実験
⇒ ph2 = (eout # qout) & (!nPIA # !nACIA) で実験
・psdのpb7をpsdpb7なるネット名に変更し、piaのpb7との結合(バグ)を修正
後半がいかがわしいですが(その5)、(その7)で6821,6850と非68xx系プロセサをインタフェースしたロジックを反映して実験してみました。故にこれを汎化する意図はございません(実験とみなして頂けると有り難いです)。
0.タイミング検討
・MC6809E bus timing(再掲)

・MC68xx bus timing(再掲)

3Mhzの6809E(HD63C09E)とHD63B21,63B50をインタフェースしようとすると、
・PWEL=166ns,PWEH=166ns(3Mhz)であり、6850,6821の要求する210ns,220nsを満足しない
が問題となり、定石通りに68xx周辺としてインタフェースすると解無しとなります(今更ですが)。なので則を超えつつ鑑みるに(大した事ではございません):
・6850,6821のPWEH = 220ns を満たす為に 63C09EのE と Q の論理和を取る。つまり
PWEH(68xx) = 333ns(tcyc@3Mhz) * 3/4(E # Q) = 250ns > 220ns(68b50のPWEH)を満たす事は出来ますがPWELが83ns < 210ns となり具合が悪い(あたりまえ)。なので
・ph2(68xxへのEクロック)= (E # Q) & (!nPIA # !nACIA) つまりPIAとACIAをアクセスした時だけEとQのORを68b50,68b21に供給する)というインチキ回路を考えてみました。こうするとPWEL >> 210ns(次のCPUアクセスまで)となりMotorola様の技術思想を冒涜:)しますがインタフェース可能かもしれないと考えました。
但し例によって欠点があって周期クロックではなく単なるストローブ信号となるので周期クロック供給を前提とする回路(具体的にはPTM等)は使用出来ないという点ですがこれは別の手段で回避しようかと(姑息ですね:)。
定石を無視すると大抵碌なことにならないので実験として試してみようか(欠点は承知の上で)という次第であります(お恥ずかしいのですが)。

・ch0(赤) : Eクロック、3Mhzなのでtcyc=333ns
・ch1(青):ph2クロック、(eout # qout) & (!nPIA # !nACIA)、PWEH=250ns
・ch2(緑):cpuからのread/write
・ch3(黄):nRAM、ramのchip select
・ch4(茶):nPIA、PIA(63B21)のchip select、本信号がassert時にph2がassert
1.ブロック図

上記グルーロジックはPSDのPLDブロックで吸収します。ISPなので更新も柔軟に対応出来るので手前味噌ですが重宝しております(Obsoluteだけど)。
PSD8XXのエコシステムについての覚え書き(その2) - aki_iic’s blog
2.回路図

eb6809_v1_sch_20260504.pdf - Google ドライブ
3.パターン図(全レイヤ合成)

・3dモデル(部品面)

4.実装ボード(実物)

上図右上からhd63b21(PIA),hd63c09e,1Mbit sram,ae-ft245rn、左上からhd63b50(ACIA)、12Mhz OSC、psd834f2-90jです。CPUとOSC以外はいつもの縛り構成となっています。左端のピンヘッダはロジアナ接続用で右端のrcbusピンヘッダと併用してデバッグ・検証に使用します(テスト・検証準備は大切:)。
20260623 11:49追記:消費電流は 0.053A(53mA)でした(0.265W)。HD63B09E@2Mhzで確か 40mA程度でしたからこんなもんかと思われます。
5.デバッグ環境

ロジアナ写っておりませんがタイミング検証にはLA2016を使用しました(計測器は必要)。
・PIAアクセスタイミング(拡大)

・PIAアクセスタイミング(連続)

dba で$F400〜$F4ffのio領域をダンプした時のタイミングを取得したものです。ph2がPIA(或いはACIA)アクセス時のみ発生しております(邪道ですが・・・)。
6.PLA(抜粋)
module eb6809v1
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
eout PIN 7;
qout PIN 6;
BCK PIN 5;
ph2 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;
csiop node;
fs0 node;
f1 NODE istype 'reg_D';
f2 NODE istype 'reg_D';
q1 NODE istype 'reg_D';
q2 NODE istype 'reg_D';
q0 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
csiop = *1;
fs0 = *2;
! nCF = *3;
! nFT245RD = *4;
FT245WR = *5;
! nRAM = *6;
! nPIA = *7;
! nACIA = *8;
eout = f1;
eout.oe = Vcc;
qout = !f2;
qout.oe = Vcc;
ph2 = (eout # qout) & (!nPIA # !nACIA);
ph2.oe = Vcc;
pb7.oe = _reset;
nRD = !(e & r_w);
nRD.oe = _reset;
nWR = !(e & !r_w);
nWR.oe = _reset;
f1 := !f2;
f1.ck = sysclk;
f1.re = Gnd;
f2 := f1;
f2.ck = sysclk;
f2.re = Gnd;
q1.ck = sysclk;
q2.ck = sysclk;
q0.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 eb6809v1
7.dba
AS V1.42 Beta [Bld 270] - Source File eb6809_t3.asm - Page 1 - 2026年06月21日 14時17分40秒
1/ 0 : cpu 6809
2/ 0 :
3/ 0 : ; 20260304 : hc11f_v1 ⇒ eb6802_v0にバックポート
4/ 0 : ; 20260320 : eb6802_v0 ⇒ eb6809_v0に移植
5/ 0 : ; 20260511 : d3コマンドのmemwルーチンをYレジスタをd5(ループカウンタ)に最適化
6/ 0 : ; 20260621 : eb6809_v1(hd63c09e@3Mhz)対応(メッセージ変えただけ)
7/ 0 :
8/ 0 : =$F800 romtop equ $f800
9/ 0 : =$F400 csiop equ $f400 ; $f400-f43f(256バイト境界)
10/ 0 : =$F000 ramtop equ $f000 ; $f000-f3ff
11/ 0 : =$F3FF rambtm equ ramtop+$3ff
12/ 0 : =$F405 pb7 equ csiop+5 ; psd portb7
13/ 0 : =$F401 pbin equ csiop+1 ; ft245 status
14/ 0 : =$F478 ft245 equ $f478 ; $f478
15/ 0 :
16/F000 : org ramtop
17/F000 :
18/F000 : a0 rmb 2 ; pseduo a0
19/F002 : a1 rmb 2
20/F004 : a2 rmb 2
21/F006 : a3 rmb 2
22/F008 : a4 rmb 2
23/F00A : a5 rmb 2
24/F00C : a6 rmb 2
25/F00E : d0 rmb 2 ; pseduo d0
26/F010 : d1 rmb 2
27/F012 : d2 rmb 2
28/F014 : d3 rmb 2
29/F016 : d4 rmb 2
30/F018 : d5 rmb 2
31/F01A : d6 rmb 2
32/F01C : d7 rmb 2
33/F01E :
34/F800 : org romtop
35/F800 :
36/F800 : =$5 dly_cnt equ 5
37/F800 :
38/F800 : 10 CE F3 FF start lds #rambtm ; sp init
39/F804 :
40/F804 : BD F8 C8 jsr pb7on ; pb7=on
41/F807 : BD F8 D2 jsr dly
42/F80A : BD F8 C2 jsr pb7off
43/F80D :
44/F80D : ; cmd待ち
45/F80D : BD F8 C2 cmd jsr pb7off
46/F810 : BD F8 9F jsr pbin0 ; cmd受信
47/F813 : BD F8 C8 jsr pb7on
48/F816 : C1 D1 cmpb #$d1 ; memory dump?
49/F818 : 26 04 bne cmd1
50/F81A : 8D 3A bsr memc ; cmd exec
51/F81C : 20 EF bra cmd
52/F81E : C1 D2 cmd1 cmpb #$d2 ; go?
53/F820 : 26 04 bne cmd2
54/F822 : 8D 3D bsr go ; go cmd
55/F824 : 20 E7 bra cmd
56/F826 : C1 D3 cmd2 cmpb #$d3 ; memory write?
57/F828 : 26 04 bne cmd0
58/F82A : 8D 0A bsr memw ; memw exec
59/F82C : 20 DF bra cmd
60/F82E : C1 D0 cmd0 cmpb #$d0 ; machine id?
AS V1.42 Beta [Bld 270] - Source File eb6809_t3.asm - Page 2 - 2026年06月21日 14時17分40秒
61/F830 : 26 DB bne cmd
62/F832 : 8D 41 bsr id
63/F834 : 20 D7 bra cmd
64/F836 : ; memory write
65/F836 : 8D 52 memw bsr adrin ; 戻り値はDとする
66/F838 : B7 F0 04 sta a2 ; adrs = a2
67/F83B : F7 F0 05 stb a2+1
68/F83E : 8D 4A bsr adrin
69/F840 : B7 F0 18 sta d5 ; length = d5
70/F843 : F7 F0 19 stb d5+1
71/F846 : BE F0 04 ldx a2
72/F849 : 10 BE F0 18 ldy d5
73/F84D : 8D 50 memw0 bsr pbin0 ; accb
74/F84F : E7 80 stb 0,x+ ; (x)<=accb
75/F851 : 31 3F leay -1,y
76/F853 : 26 F8 bne memw0
77/F855 : 39 memw2 rts
78/F856 : ; memory dump
79/F856 : 8D 32 memc bsr adrin ; adrs = a2
80/F858 : B7 F0 04 sta a2
81/F85B : F7 F0 05 stb a2+1
82/F85E : 8D 4A bsr dump
83/F860 : 39 rts
84/F861 : ; go
85/F861 : 8D 27 go bsr adrin ; adrs = a2
86/F863 : BE F0 04 ldx a2
87/F866 : AD 84 jsr 0,x ; subroutineとして呼び出し
88/F868 : B6 F4 01 go0 lda pbin ; ft245 rxf?
89/F86B : 85 10 bita #$10
90/F86D : 26 F9 bne go0
91/F86F : 86 00 lda #0
92/F871 : B7 F4 78 sta ft245 ; 常に00を返す
93/F874 : 39 rts
94/F875 :
95/F875 : 8E F8 E3 id ldx #tgt_id
96/F878 : C6 1E ldb #30 ; 30文字固定
97/F87A : B6 F4 01 id0 lda pbin
98/F87D : 84 10 anda #$10
99/F87F : 26 F9 bne id0
100/F881 : A6 80 lda 0,x+
101/F883 : B7 F4 78 sta ft245
102/F886 : 5A decb
103/F887 : 26 F1 bne id0
104/F889 : 39 rts
105/F88A :
106/F88A : adrin:
107/F88A : 8D 13 bsr pbin0 ; 上位2バイトは読み飛ばす
108/F88C : 8D 11 bsr pbin0
109/F88E : 8D 0F bsr pbin0 ; 戻り値はaccbに
110/F890 : F7 F0 02 stb a1
111/F893 : 8D 0A bsr pbin0
112/F895 : F7 F0 03 stb a1+1
113/F898 : B6 F0 02 lda a1 ; 戻り値 = a,b
114/F89B : F6 F0 03 ldb a1+1
115/F89E : 39 rts
116/F89F :
117/F89F : B6 F4 01 pbin0 lda pbin
118/F8A2 : 84 20 anda #$20
119/F8A4 : 26 F9 bne pbin0
120/F8A6 : F6 F4 78 ldb ft245 ; 受信データ <- accb
AS V1.42 Beta [Bld 270] - Source File eb6809_t3.asm - Page 3 - 2026年06月21日 14時17分40秒
121/F8A9 : 39 rts
122/F8AA :
123/F8AA : 10 8E 01 00 dump ldy #256 ; == 256
124/F8AE : BE F0 04 ldx a2
125/F8B1 : B6 F4 01 dump0 lda pbin
126/F8B4 : 84 10 anda #$10
127/F8B6 : 26 F9 bne dump0
128/F8B8 : A6 80 lda 0,x+
129/F8BA : B7 F4 78 sta ft245 ; 送信データ
130/F8BD : 31 3F leay -1,y ; 256byteなので
131/F8BF : 26 F0 bne dump0
132/F8C1 : 39 rts
133/F8C2 :
134/F8C2 : 34 02 pb7off pshs a
135/F8C4 : 86 80 lda #$80 ; pb7 led off
136/F8C6 : 20 04 bra pb7set
137/F8C8 : 34 02 pb7on pshs a
138/F8CA : 86 00 lda #0 ; pb7 led on
139/F8CC : B7 F4 05 pb7set sta pb7
140/F8CF : 35 02 puls a
141/F8D1 : 39 rts
142/F8D2 :
143/F8D2 : 34 02 dly pshs a
144/F8D4 : 86 05 lda #dly_cnt
145/F8D6 : 8E 00 00 dly0 ldx #0
146/F8D9 : 30 1F dly1 leax -1,x
147/F8DB : 26 FC bne dly1
148/F8DD : 4A deca
149/F8DE : 26 F6 bne dly0
150/F8E0 : 35 02 puls a
151/F8E2 : 39 rts
152/F8E3 : ; 123456789012345678901234567890
153/F8E3 : 65 62 36 38 30 39 5F 76 31 tgt_id fcc 'eb6809_v1:20260621E00 '
F8EC : 3A 32 30 32 36 30 36 32 31
F8F5 : 45 30 30 20 20 20 20 20 20
F8FE : 20 20 20
154/F901 :
155/FFFE : org $fffe
156/FFFE : F8 00 resvec fdb start ; reset vector
157/10000 :
158/10000 : end
AS V1.42 Beta [Bld 270] - Source File eb6809_t3.asm - Page 4 - 2026年06月21日 14時17分40秒
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 : F88A C |
*ARCHITECTURE : "x86_64-unknown-linux" - |
*CASESENSITIVE : 0 - | CMD : F80D C |
CMD0 : F82E C | CMD1 : F81E C |
CMD2 : F826 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\-12021\-026\-105\-091" - |
DLY : F8D2 C | DLY0 : F8D6 C |
DLY1 : F8D9 C | DLY_CNT : 5 - |
DUMP : F8AA C | DUMP0 : F8B1 C |
*FALSE : 0 - | FT245 : F478 - |
GO : F861 C | GO0 : F868 C |
*HAS64 : 1 - | ID : F875 C |
ID0 : F87A C | *LISTON : 1 - |
*MACEXP : 7 - | MEMC : F856 C |
MEMW : F836 C | MEMW0 : F84D C |
*MEMW2 : F855 C | *MOMCPU : 6809 - |
*MOMCPUNAME : "6809" - | *NESTMAX : 100 - |
*PADDING : 0 - | PB7 : F405 - |
PB7OFF : F8C2 C | PB7ON : F8C8 C |
PB7SET : F8CC C | PBIN : F401 - |
PBIN0 : F89F C | *PLAINBASE : 0 - |
RAMBTM : F3FF - | RAMTOP : F000 - |
*RELAXED : 0 - | *RESVEC : FFFE C |
ROMTOP : F800 - | START : F800 C |
TGT_ID : F8E3 C |
*TIME : "14\-026\-103\-12617\-027\-120\-12240\-025\-089\-110" - |
*TRUE : 1 - | *VERSION : 142F - |65 symbols
31 unused symbolsAS V1.42 Beta [Bld 270] - Source File eb6809_t3.asm - Page 5 - 2026年06月21日 14時17分40秒
Code Pages:
----------STANDARD (0 changed characters)
1 code page
0.02 seconds assembly time
160 lines source file
2 passes
0 errors
0 warnings
・dba(起動時)

コードはv0と同じで識別情報を変更しただけです。
・dba(ramtest)

・dba(io領域)

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

測定条件は56KBのバイナリをdbaでロードする時間を測定したものです。
・56KB/0.785289sec = 71.31KB/sec , 23.77KB/Mhz
となりました。これはz80@8Mhzにかなり近いスコア(CPI換算では妥当だろうか)。
・順位(転送速度):
6309@3Mhz > z80@8Mhz > 65816@2Mhz > 6809@2Mhz > 9995@3Mhz(0w) > 6502@2Mhz > 6802@2Mhz
・順位(Mhz辺りの転送速度):
65816 > 6809 > 6502 > 9995(0w) > 6802 > z80
名称 ebz80_v0 eb6809_v1 eb65816_v0 eb6809_v0 eb9995_v0 eb6502_v0 eb6802_v0 CPU z80 6309 65816 6809 9995(0wait) 6502 6802 クロック(Mhz) 8 3 2 2 3 2 2 転送速度(KB/s) 71.01 71.31 54.3 47.65 42.94 30.48 27.5 速度/Mhz 8.87625 23.77 27.15 23.825 14.3133333333333 15.24 13.75 順位(転送速度) 2 1 3 4 5 6 7 順位(速度/Mhz) 7 3 1 2 5 4 6
9.まとめ
・eb6809_v1 を組立・動作確認・タイミング測定を行いました
・6850,6821インタフェース回路はTP書いて検証しようと考えています(loopback testレベルですが)
・レトロマイコンはクロックリニアなので予測可能なベンチスコアですが:)80系と68系(6800系ですね、68000ではなく)のCPIに関する技術思想が垣間見える(今更ですな、40年前から知れた事を・・・)印象。
・前のトピック:
*1:address >= ^hF400) & (address <= ^hF43F
*2:address >= ^hF800) & (address <= ^hFFFF
*3:address >= ^hF4A0) & (address <= ^hF4AF
*4:address >= ^hF478) & (address <= ^hF47F) & (e & r_w
*5:address >= ^hF478) & (address <= ^hF47F) & (e & !r_w
*6:address >= ^h0000) & (address <= ^hF3FF
*7:address >= ^hF480) & (address <= ^hF48F
*8:address >= ^hF490) & (address <= ^hF49F