ST0 命令の実行結果を EXTBUS から観測できないという理由で断念します.
いままでの経過
実装内容
- 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 を使わないそこそこ早くしたルーチンを使うことにしました. その割り込みの検出は下記としました.
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 です.
これは Ki さんの計測結果からもわかります.
https://kikb.web.fc2.com/HuC6280_CPU/HuC6280_CpuLog_IMM/OPC_03_ST0_IMM_2byte_4cycle.txt
今後
mirror port 周りの実装はすべて削除いたします. そこそこ早くしたルーチンは使えますので物理的な未改造ではこれが限界です.