石原 博の覚書

電子工作に関する日々の覚書を記載します

CP/M 68K高速化

2024-01-14 11:44:00 | 日記
せっかく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であることがわかる。