CD-ROM 高速転送機能の開発断念

ST0 命令の実行結果を EXTBUS から観測できないという理由で断念します.

いままでの経過

  • CD-ROM2 の転送(読み込み)速度を上げただけでも CPU のほうが相対的におそくなるので限界があるというのを以前から知っていました.
  • そこで CD-ROM2 の data port を独自に拡張した上で TAI 命令で高速転送するという方法を思いつき、実際に早く転送できることを確認しました.
  • しかし、TAI 命令実行途中に割り込みを受けつけないので結構な数のソフトで動作がおかしくなることが判明しました.

実装内容

  • BIOS を hack します.
  • address 0x1ff809 を address 0x1ff808 の mirror とします.
  • TAI 命令の引数は定数のため stack 上に命令を生成します.
port_mirror_enable	equ	$1805

tai_start:
;l <- y.x
;l = length >= 0x800 ? 0x800 : length;
	ldx	$f8
	ldy	$f9
	cpy	#$08
	bcc	set_tai
	clx
	ldy	#$08
set_tai:
;push instructions "tai $1808,dest,length; rts;" on the stack
	lda	#$60 ;rts
	pha
	phy	;length
	phx
	lda	$fb ;dest
	pha
	lda	$fa
	pha
	lda	#$18 ;src
	pha
	lda	#$08
	pha
	lda	#$f3 ;tai
	pha
;push return address for rts
rp eval	rts_position-1
	lda	#rp>>8
	pha
	lda	#rp & $ff
	pha
;push return address for generated instructions
	lda	#$21
	pha
	txa
	tsx
 rept 3
	inx
 endm
	phx
	tax
;enable $1809 as $1808 mirror port
	lda	#$ee
	sta	port_mirror_enable
;execute generated instructions
;*note* 6280 doesn't accept any interrupts for extended periods of time when Txx block transfer is executed. Many games display glitches in the scroll registers.
;*1 maxium 17+0x800*6 cpu clocks -> 27.0 scanlines -> 1.7 ms 
	rts
rts_position
;restrore the S
 rept 1+2*3+1
	pla
 endm
;dest += l;
	clc
	txa
	adc	$fa
	sta	$fa
	tya
	adc	$fb
	sta	$fb
;length -= l; -> length += l ^ 0xffff + 1;
	sec
	txa ;C is not changed
	eor	#$ff ;C is not changed
	adc	$f8
	sta	$f8
	tya ;C is not changed
	eor	#$ff
	adc	$f9
	sta	$f9
;length == 0
	ora	$f8
	beq	to_eab5
	jmp	lea79
to_eab5:
	stz	port_mirror_enable
	jmp	leab5

分岐のための割り込みの検出

割り込みがある場合は mirror port を使わないそこそこ早くしたルーチンを使うことにしました. その割り込みの検出は下記としました.

  • CPU の status flag をみる, php; pla で簡単に見れる
    • 現実として CPU へ直接割り込みを止めることはないらしい
  • VDC の割り込み許可フラグを見る
    • VDC 内部レジスタアドレス 5 の data bit 3:0 が該当する
    • ここを見張ればなんとかなるだろう
    • 作ってみたところなぜかうまくいかない

st0/st1/st2 命令

CPU から VDCレジスタを操作する場合は address 0x1fe00x を利用します. 変数の場合は sta >$000x を利用し、定数の場合は st[012] #xx を利用すると便利です.

  • st[axy] や block 転送命令で >$000x を指定する場合は MPR を経由して address 0x1fe00x が出力されて、 CE7 も L になります.
  • st[012] の場合は MPR を経由しないらしく、有効な address bus は bit1:0, CE7# は L になります. VDC に配線されない address bus は不定です!
    • CE7# は 6280 (CPU) から 6270 (VDC) を操作する専用の線です.

実際の波形です. 実行は sta >$0003; st0 #2 です.
f:id:na6ko:20190512110435p:plain

これは Ki さんの計測結果からもわかります.
https://kikb.web.fc2.com/HuC6280_CPU/HuC6280_CpuLog_IMM/OPC_03_ST0_IMM_2byte_4cycle.txt

今後

mirror port 周りの実装はすべて削除いたします. そこそこ早くしたルーチンは使えますので物理的な未改造ではこれが限界です.