せっかくCP/M 68Kが動き始めたのに遅い。原因はSDカードのSPIアクセスにあることはわかっている。 すべて68Kのソフトウエアで行っているため。 そこで少しでも速くならないかとコードを見直した。 spi8rが従来のコードで、spi8r2が変更したコード。要するに絶対アドレッシングをアドレスレジスタ間接に変更しただけ。 少しでも速くするため、bsetやbclrのイミーディエイト指定もデータレジスタの設定を利用した。 spi8r: move.b #$ff,d0 *spi read (write $ff) spi8w: moveq #7,d5 *spi write spiloop:btst d5,d0 beq lout bset.b #MOSI,PDR+1 *MOSI=H bra spiout lout: bclr.b #MOSI,PDR+1 *MOSI=L spiout: bset.b #SCK,PDR+1 *SCK=H btst.b #MISO,PDR+1 *MISO beq lin bset d5,d0 bra spiin lin: bclr d5,d0 spiin: bclr.b #SCK,PDR+1 *SCK=L dbra d5,spiloop rts * 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 これをアクセスするブロックを読み出す部分は以下のとおり readsd: bsr cmd17 tst.b d0 *data packet error bne readsd_err bsr skipff *wait cmpi.b #$fe,d0 *DATA TOKEN bne readsd_err movea.l DMASD,a0 move.w #$1ff,d6 *512byte movea.l #PDR+1,a3 move.w #MOSI,d7 move.w #MISO,d4 move.w #SCK,d3 rd1: bsr spi8r2 move.b d0,(a0)+ dbra d6,rd1 bsr spi8r *CRC SKIP bsr spi8r *CRC SKIP moveq #0,d0 bra csh 高速に読むことが必要な部分だけspi8r2に変更している。 (高速化のためできるだけスタックは使いたくないが、アセンブラで組んでいるためレジスタの遣り繰りを考えるのが面倒) 結果 1分39秒かかっていたCのコンパイルが1分13秒と少しだけ速くなった。 ロジックアナライザで確認すると、spi8rだと約100Kbps spi8r2だと約150Kbps(読むのが0の時と1の時では時間が変わる) フロッピーディスクでは250Kbpsや500Kbpsらしいのでそれより遅い。体感もそんな感じ。 その他 せっかく動いたので、ソフトウエアを探したがCP/M80のように大量にあるわけではない。 それならと、Cで記述されたフリーソフトを探したが、今の時代ANSI規格だし変数名が8文字以内というのがネックになる。 昔は68Kに憧れていたんだけどなぁ ロジックアナライザの結果 CMD17を送出(spi8w)後、読み込み(spi8r)で$FEを待ち、その後spi8r2で高速読み込。 spi8rだと約100Kbps, spi8r2だと約150Kbpsであることがわかる。