せっかくCP/M 68Kが動き始めたのに遅い。原因はSDカードのSPIアクセスにあることはわかっている。 すべて68Kのソフトウエアで行っているため。 そこで少しでも速くならないかと、さらにコードを見直した。 従来は読み込みと書き込みを一つのサブルーチンで行っている。spiの仕様的にはそうなのかもしれないが、 読みながら次のコマンドを書き込むなどは今回のプログラムでは行っていない。 なのに同時にすることで余計に時間がかかっている。 * spi8r2: move.b #$ff,d0 *spi read (write $ff) spi8w2: moveq #7,d5 *spi write spiloop2: btst d5,d0 beq lout2 bset.b d7,(a3) *MOSI=H bra spiout2 lout2: bclr.b d7,(a3) *MOSI=L spiout2:bset.b d3,(a3) *SCK=H btst.b d4,(a3) *MISO beq lin2 bset d5,d0 bra spiin2 lin2: bclr d5,d0 spiin2: bclr.b d3,(a3) *SCK=L dbra d5,spiloop2 rts そこで読み込みと書き込みを分離した。 * spi8r2: move.b #$ff,d0 *spi read (write $ff) moveq #7,d5 bset.b d7,(a3) *MOSI=H spiloop2r: bset.b d3,(a3) *SCK=H btst.b d4,(a3) *MISO beq lin2 bset d5,d0 bra spiin2 lin2: bclr d5,d0 spiin2: bclr.b d3,(a3) *SCK=L dbra d5,spiloop2r rts * spi8w2: moveq #7,d5 *spi write spiloop2w: btst d5,d0 beq lout2 bset.b d7,(a3) *MOSI=H bra spiout2 lout2: bclr.b d7,(a3) *MOSI=L spiout2:bset.b d3,(a3) *SCK=H bclr.b d3,(a3) *SCK=L dbra d5,spiloop2w rts * 結果 1分13秒かかっていたCのコンパイルが52秒と少し速くなった。 ロジックアナライザで確認すると、以前約150Kbps(読むのが0の時と1の時では時間が変わる)だったものが、 266Kbps程度となった。 ロジックアナライザの結果