2014年12月29日の日記を表示中

2014年12月29日 (月)

基板

ザ・キングオブドラゴンズの電池レス化を進めてみました。このタイトル、いやらしいことに(?)Cボードの掛け算機能を使って結果が17bit幅以上になる演算を行っていたりする上に、その結果をアドレスの計算に使っている箇所があったりします。Cボードの乗算器は、乗数・被乗数を2Byteずつ書き込んで、乗算結果を上位2Byteと下位2Byteで分けて読み出すインタフェースとなっているんですが、オリジナルでは乗算結果の上位と下位の読み出しアドレスが連続して並んでいるため、上位のアドレスからmove.lで4Byte読み出すと、演算結果を一気にレジスタに読み出すことができます。これに対し、電池レス化してしまうと、上位と下位の並びが逆になってしまうため、move.lで一気に読み出せなくなってしまいます。オリジナルのコードでは、ここでmove.lで4Byteを一気読みして利用しているため、単純にアドレスを書き換えるだけでは同等の処理は実現できません。命令数が増えてよいのであれば、2Byteずつ読んで混ぜたり、上下逆に読んだ後、レジスタをROLして16bit回すなど、やりようは色々あるかと思いますが、move.l 1個分を置き換えようと思うと、6Byteしかスペースがないため、前述のような凝ったことはまったくできません。ここが一番の悩みどころでした。

結局、2箇所あるこんな感じの場所のうち、一方はよく見たら掛け算の乗数・被乗数の一方が0x400とキリの良い固定値だったので、Cボードの乗算器を最初から使わずに、レジスタの値を合計10bit左シフトする処理に書き換えて対処しました。全然違う命令に置き換えるのは甚だ不本意ですが、とりあえずこれで起動からデモまでは動くことを確認。

もう一方は、乗数・被乗数の一方が固定値ながらも0xE10という中途半端な値なため、簡単なシフト演算には置き換えられません。ただ、見た感じ、ROMの実行開始アドレスをいじっていない限り、ここには飛んでこない雰囲気なので、ここは何もする必要がない感じもします。さて、次は実機でやって叩いてみますかね。

2014年12月29日の日記を表示中

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2014年12月
  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      

<<先月分

翌月分>>

最近の10件のコメント

過去ログ