「点火系ECU解析結果1」

 ROMライタで読み出したデータを逆アセンブラにかけたら、いよいよプログラムを読む段階・・・まずは点火系のECUから。

 点火系のECU(MED602)はROMの容量が8KBなので、最近のコンピュータ事情からすると、

 「たった8KB!?」

 と思われる方もいるかもしれないけれど、8KBというのはプログラムを読むには、イヤになるくらい広い空間・・・(-_-;)

 16進ダンプしたものを印刷して、ざっと眺めてみると・・・先頭から1c40hからのデータがあきらかに点火時期マップくさい。

001c40 fe fe f0 dc b4 8c 78 70 60 58 50 48 40 38 30 28 ...ワエ.xp`XPH@80(
001c50 94 89 80 79 70 68 60 57 4f 47 3e 37 2e 2e 2e 2e ...yph`WOG>7....
001c60 52 52 53 53 53 54 54 54 5d 61 66 68 69 6a 6a 6a RRSSSTTT]afhijjj
001c70 52 52 53 53 53 54 54 54 5d 65 6e 70 81 82 82 82 RRSSSTTT]enp....
001c80 52 52 53 53 53 60 5c 6c 6d 6d 76 78 89 8a 8a 8a RRSSS`\lmmvx....
001c90 52 52 53 5b 5b 64 68 74 7d 7d 86 88 91 92 92 92 RRS[[dht}}......
001ca0 52 5a 5b 63 67 6c 74 74 7d 85 86 88 91 92 92 92 RZ[cgltt}.......
001cb0 52 62 63 63 6b 74 7c 7c 85 8d 8e 90 91 9a 9a 9a Rbcckt||........
001cc0 52 62 6b 73 73 7c 84 84 85 8d 92 98 99 9e 9e 9e Rbkss|..........
001cd0 32 72 73 73 73 84 84 8c 8d 8d 96 98 99 a2 a2 a2 2rsss........「「「
001ce0 32 72 73 7b 7b 8c 8c 94 95 95 9e a0 a1 aa aa aa 2rs{{......?。ェェェ
001cf0 32 72 7b 7b 83 8c 94 9c a5 a5 a6 a8 a9 b2 b2 b2 2r{{....・・ヲィゥイイイ
001d00 32 6a 73 7b 7b 84 94 9c a5 a5 a6 a8 b1 ba ba ba 2js{{...・・ヲィアコココ
001d10 32 62 6b 73 7b 7c 8c 94 a5 ad ae b8 b9 c2 c2 c2 2bks{|..・ュョクケツツツ
001d20 32 52 63 63 6b 74 84 8c 9d 9d ae c0 c1 c2 c2 c2 2Rcckt....ョタチツツツ
001d30 32 52 5b 5b 63 6c 7c 84 8d 95 a6 b8 c1 c2 c2 c2 2R[[cl|...ヲクチツツツ
001d40 32 52 5b 5b 63 6c 7c 84 8d 95 a6 b8 c1 c2 c2 c2 2R[[cl|...ヲクチツツツ
001d50 32 52 5b 5b 63 6c 7c 84 8d 95 a6 b8 c1 c2 c2 c2 2R[[cl|...ヲクチツツツ

 どうやら、これを見る限り、1c40hから1c5Fhまでは何らかの係数で、1c60hからの16x16のマップに見える・・・だた、縦軸、横軸のどちらが回転数でどちらが吸気量なのかわからない・・・
 マセの場合、エアフロメーターは無く、吸気量は負圧センサから判断していると思うので、厳密には「吸気量」ではなくて、「吸気圧」かな・・・?

 やはりプログラムを読むしかないらしい・・・

 まず、このデータがどのアドレス空間から始まっているかを調べる必要がある。

 8KBなので、0000h〜1FFFhまであり、MC6803U4が使用できるアドレス空間は、0000h〜FFFFhまでの64KBなので、どこから始まっているかを特定できないと、逆アセンブルもできない。
#できるけど、絶対アドレスジャンプとかが合わなくなる・・・

 スペックシートを見ると、68xx系のCPUはリセットがかかったとき、FFFEhからの2バイトに書いてあるアドレスにジャンプしてプログラムをスタートさせるのが「キマリ」のようなので、その部分には、必ずなんらかのメモリチップがマップされているはず。

 このことから考えて、ROMはE000h〜FFFFhにマップされていると想像でき、実際ROMデータの最後の2バイトも「E0h」「00h」だった。

 で、最初はとりあえず、E000hからプログラムを地道に読み始めたのだけれど・・・

 「うぅ〜、まだまだ先は長いなぁ・・・・(-_-;)」

 と、途中で断念。(^_^;)

 どうせ、マップのアドレスはわかっているのだから、そのアドレスにアクセスしている部分から解析することにした。

 なんらかの係数がFC40hから始まっているので、そのアドレスにアクセスしているらしき部分をさがしてみると・・・ありました。

E2C3 : 86 0F	" "	ldaa	#$0F
E2C5 : 97 7E	" ~"	staa	X007E
E2C7 : CE FC 50	" P"	ldx	#$FC50
E2CA			LE2CA:
E2CA : 96 7F	" "	ldaa	X007F
E2CC : A0 00	" "	suba	$00,x
E2CE : 24 0B	"$ "	bcc	LE2DB
E2D0 : 96 7E	" ~"	ldaa	X007E
E2D2 : 4A	"J"	deca
E2D3 : 2B 06	"+ "	bmi	LE2DB
E2D5 : 7A 00 7E	"z ~"	dec	X007E
E2D8 : 08	" "	inx
E2D9 : 20 EF	" "	bra	LE2CA
;
E2DB			LE2DB:
E2DB : 86 0F	" "	ldaa	#$0F
E2DD : 97 81	" "	staa	X0081
E2DF : CE FC 40	" @"	ldx	#$FC40
E2E2			LE2E2:
E2E2 : A6 00	" "	ldaa	$00,x
E2E4 : 97 82	" "	staa	X0082
E2E6 : 96 62	" b"	ldaa	X0062
E2E8 : 90 82	" "	suba	X0082
E2EA : 97 84	" "	staa	X0084
E2EC : 24 1C	"$ "	bcc	LE30A
E2EE : 96 81	" "	ldaa	X0081
E2F0 : 4A	"J"	deca
E2F1 : 2B 0A	"+ "	bmi	LE2FD
E2F3 : 7A 00 81	"z "	dec	X0081
E2F6 : 96 82	" "	ldaa	X0082
E2F8 : 97 83	" "	staa	X0083
E2FA : 08	" "	inx
E2FB : 20 E5	" "	bra	LE2E2
;
E2FD			LE2FD:
E2FD : D6 7E	" ~"	ldab	X007E
E2FF : 53	"S"	comb
E300 : 58	"X"	aslb
E301 : 58	"X"	aslb
E302 : 58	"X"	aslb
E303 : 58	"X"	aslb
E304 : CE FC 60	" `"	ldx	#$FC60
E307 : 3A	":"	abx
E308 : 20 13	" "	bra	LE31D
;
E30A			LE30A:
E30A : D6 7E	" ~"	ldab	X007E
E30C : 53	"S"	comb
E30D : 58	"X"	aslb
E30E : 58	"X"	aslb
E30F : 58	"X"	aslb
E310 : 58	"X"	aslb
E311 : DB 81	" "	addb	X0081
E313 : CE FC 60	" `"	ldx	#$FC60
E316 : 3A	":"	abx
E317 : 96 81	" "	ldaa	X0081
E319 : 81 0F	"  "	cmpa	#$0F
E31B : 26 05	"& "	bne	LE322
E31D			LE31D:
E31D : A6 00	" "	ldaa	$00,x
E31F : 7E E3 71	"~ q"	jmp	LE371 

 これを読むと、E2C3h〜E2DAhまででFC50hから16バイトの値と比較し、E2DBh〜E2FChまででFC40hから16バイトの値と比較している。
 さらに、E30Ah〜E312hを見ると、FC50hから16バイトが縦軸、FC40hから16バイトが横軸に対応していることがわかる。

 で、「なんらかの係数」と思われるFC40hからの値を「じ」っと眺めていると・・・

00fc40 fe fe f0 dc b4 8c 78 70 60 58 50 48 40 38 30 28 ...ワエ.xp`XPH@80(

 「・・・!?(☆ピカッ)」

 頭の電球、光りました。(^_^;)

 ROMチューンの解説をしているサイトを見て、国産車のパターンを見てみると、回転数にあたる部分は1bitが50回転に相当するというような単位になっているらしい・・・
 それを、このFC40hからの値に当てはめてみると・・・

fe(12700) fe(12700) f0(12000) dc(11000) b4(9000) 8c(7000) 78(6000) 70(5600)
60(4800) 58(4400) 50(4000) 48(3600) 40(3200) 38(2800) 30(2400) 28(2000)

 なんとなく「らしい」んだけれど、マセのレブリミットは6300rpm・・・これだと、通常ではマップの半分しか使わないことになってしまう・・・では、1bitあたり25回転だとすると・・・

fe(6350) fe(6350) f0(6000) dc(5500) b4(4500) 8c(3500) 78(3000) 70(2800)
60(2400) 58(2200) 50(2000) 48(1800) 40(1600) 38(1400) 30(1200) 28(1000)

 おぉぉぉ、なんか「それらしく」なってきた。(^_^;)
 特に、一番上が6350rpmになるあたり、レブリミットが6300rpmであることを考えると、かなりこれが「正解」なんじゃないかと思う・・・

 というわけで、現時点での推測では、点火時期マップはFC60hからで、横軸がエンジン回転数、縦軸が吸気量で、回転数の軸は、FC40hからの16バイトの値に対応している。
 ただし、FC40hからの値は逆に読む。
 例えば、エンジン回転数が1500rpmだったとしたら、1400と1600の間だから、対応するマップの位置は、マップアドレスの下1桁が「3」となる。(FC63hとかFC73hとか)

 マップトレーサとかあれば検証できるんだけどなぁ・・・(^_^;)
#そのうち簡易的な物を作るとしよう。