2018年06月13日

SR画面周り(4)

  P6月間企画(その13)

  SRモードでの画面周りについて、の続きです。

  今回は、横320ドットのグラフィックモードについて、その2です。


○グラフィックモード320×200/320x204ドット

4)ビットマップモード
 前にも書きましたが、『Y座標をポート0xCE、X座標をアドレスで指定』する事で、指定のXY座標の位置にドットを描きます。
 指定したアドレスに対してデータを書き込めばドットを描き、読み出せばそのドットの色が分かるというものです。

 1ドット=4ビットなので、以下のようになります。

 書き込み時:
  bit7-4:何でもよい
  bit3-0:HGRB

 読み出し時:
  bit7-4:不定
  bit3-0:HGRB


 例1:X,Y = 0,0 に、赤のドットを描く

ld a,0x00 ; Y座標
out (0xCE),a
ld a,0x02 ; 赤
ld (0x0000),a ; X座標


 例2:X,Y = 1,1 と X,Y = 2,1 のドットの色が同じかどうかを調べる

ld a,0x01 ; Y座標
out (0xce),a
ld a,(0x0001) ; X,Y = 1,1 を読み出す
and $0f ; 不定部分を削除
ld b,a
ld a,(0x0002) ; X,Y = 2,1 を読み出す
and $0f ; 不定部分を削除
cp b ; 比較


 例2のように、読み出した値を比較するなどをする場合は、不定部分をマスクする必要があります。


 この説明だけだと、直接アドレスモードよりもビットマップモードの方が単純だと考えそうなのですが...いろいろと疑問点が出てきますよね?

・Y座標の設定を204以上にした場合はどうなる?
・X座標の設定を320以上にした場合はどうなる?
・ポート0xC8のビット3でイネーブル/ディセーブルの切換だけど、ビット4のビットマップページ指定との関係は?
・メモリ割り当てと同時に使うとどうなる?
・そもそもビットマップモードとは?

 などなど。

 この答えは次回に(^^;)/
 
posted by えすび at 21:00| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする

2018年06月12日

SR画面周り(3)

  P6月間企画(その12)

  SRモードでの画面周りについて、続きです。

  今回は、横320ドットのグラフィックモードについて、その1です。


○グラフィックモード320×200/320x204ドット

1)縦ドット数について
 横320ドットの場合、縦は200ドットか204ドットになります。ポート0xC1のbit0で切り替えます。

 縦200ドットの場合は、『下4ドットが表示されない状態』です。

 スクロールした場合は、
  スクロールY座標が 0の場合:Y座標が0-203の内、0-199が表示される
  スクロールY座標が10の場合:Y座標が0-203の内、10-203,0-5が表示される
 となります。

2)ビットマップモード、直接アクセスモードについて
 ポート0xC8のbit3を0にすると、ビットマップモードがイネーブル(有効)になります。
 ポート0xC8のbit3を1にすると、ビットマップモードがディセーブル(無効)になります。

 呼び名が長いので、私は『ビットマップモード』『直接アクセスモード』と呼んでいます。
 (ビットアクセスモード、と言っているかも...)


 大雑把に言うと...

・ビットマップモード:
 Y座標をポート0xCE、X座標をアドレスで指定する。
 4ビット単位でVRAMに読み書きする。

・直接アクセスモード:
 VRAMのアドレスを直接指定する。
 8ビット単位でVRAMに読み書きする。


 直接アクセスモードは、VRAMアドレスが変な事以外は、ビットマップモードより理解しやすいと思います。


3)VRAMアドレス(直接アクセスモード)
 アドレシングがヘン&バグのために、すごくわかりにくいです...

 横320ドットの場合、1ドット=4ビットで、1バイトに2ドット収容されます。
 ビット順は、b7-4=HGRB / b3-0=HGRB です。

 VRAMアドレスは、ページ#0が0x0000〜0x7FFF、ページ#1が0x8000〜0xFFFFです(割り当ての変更がない場合)。
 以下、ページ#0についてで、X座標0〜319、Y座標0〜203とします。

○Xが256未満の場合
 X,Y = 0,0 は、0x1A00 の下位4ビット
 X,Y = 1,0 は、0x1A00 の上位4ビット
 X,Y = 2,0 は、0x1A01 の下位4ビット
 X,Y = 3,0 は、0x1A01 の上位4ビット
 X,Y = 0,1 は、0x1A02 の下位4ビット
 X,Y = 1,1 は、0x1A02 の上位4ビット
 X,Y = 2,1 は、0x1A03 の下位4ビット
 X,Y = 3,1 は、0x1A03 の上位4ビット

 X,Y = 4,0 は、0x1A000x1A04 の下位4ビット
 X,Y = 5,0 は、0x1A000x1A04 の上位4ビット
 X,Y = 6,0 は、0x1A010x1A05 の下位4ビット
 X,Y = 7,0 は、0x1A010x1A05 の上位4ビット
 X,Y = 4,1 は、0x1A020x1A06 の下位4ビット
 X,Y = 5,1 は、0x1A020x1A06 の上位4ビット
 X,Y = 6,1 は、0x1A030x1A07 の下位4ビット
 X,Y = 7,1 は、0x1A030x1A07 の上位4ビット
  :
 X,Y = 252,0 は、0x1AFC の下位4ビット
 X,Y = 253,0 は、0x1AFC の上位4ビット
 X,Y = 254,0 は、0x1AFD の下位4ビット
 X,Y = 255,0 は、0x1AFD の上位4ビット
 X,Y = 252,1 は、0x1AFE の下位4ビット
 X,Y = 253,1 は、0x1AFE の上位4ビット
 X,Y = 254,1 は、0x1AFF の下位4ビット
 X,Y = 255,1 は、0x1AFF の上位4ビット


 X,Y = 0,2 は、0x1B00 の下位4ビット
 X,Y = 1,2 は、0x1B00 の上位4ビット
 X,Y = 2,2 は、0x1B01 の下位4ビット
 X,Y = 3,2 は、0x1B01 の上位4ビット
 X,Y = 0,3 は、0x1B02 の下位4ビット
 X,Y = 1,3 は、0x1B02 の上位4ビット
 X,Y = 2,3 は、0x1B03 の下位4ビット
 X,Y = 3,3 は、0x1B03 の上位4ビット
  :
 X,Y = 252,2 は、0x1BFC の下位4ビット
 X,Y = 253,2 は、0x1BFC の上位4ビット
 X,Y = 254,2 は、0x1BFD の下位4ビット
 X,Y = 255,2 は、0x1BFD の上位4ビット
 X,Y = 252,3 は、0x1BFE の下位4ビット
 X,Y = 253,3 は、0x1BFE の上位4ビット
 X,Y = 254,3 は、0x1BFF の下位4ビット
 X,Y = 255,3 は、0x1BFF の上位4ビット

 以下同様で
  :
  :
 X,Y = 252,202 は、0x7FFC の下位4ビット
 X,Y = 253,202 は、0x7FFC の上位4ビット
 X,Y = 254,202 は、0x7FFD の下位4ビット
 X,Y = 255,202 は、0x7FFD の上位4ビット
 X,Y = 252,203 は、0x7FFE の下位4ビット
 X,Y = 253,203 は、0x7FFE の上位4ビット
 X,Y = 254,203 は、0x7FFF の下位4ビット
 X,Y = 255,203 は、0x7FFF の上位4ビット

 つまり、8ドット単位で
 X,Y = x+0,y+0 は、0x1A00 + 0x0100*(y/2) + x の下位4ビット
 X,Y = x+1,y+0 は、0x1A00 + 0x0100*(y/2) + x の上位4ビット
 X,Y = x+2,y+0 は、0x1A01 + 0x0100*(y/2) + x の下位4ビット
 X,Y = x+3,y+0 は、0x1A01 + 0x0100*(y/2) + x の上位4ビット
 X,Y = x+0,y+1 は、0x1A02 + 0x0100*(y/2) + x の下位4ビット
 X,Y = x+1,y+1 は、0x1A02 + 0x0100*(y/2) + x の上位4ビット
 X,Y = x+2,y+1 は、0x1A03 + 0x0100*(y/2) + x の下位4ビット
 X,Y = x+3,y+1 は、0x1A03 + 0x0100*(y/2) + x の上位4ビット
  (x は4の倍数。y は2の倍数)

 となります。


○X座標が256以上の場合
 256未満の場合と同じ8ドット単位ですが...

 X,Y = 256,0 は、0x0000 の下位4ビット
 X,Y = 257,0 は、0x0000 の上位4ビット
 X,Y = 258,0 は、0x0001 の下位4ビット
 X,Y = 259,0 は、0x0001 の上位4ビット
 X,Y = 256,1 は、0x0002 の下位4ビット
 X,Y = 257,1 は、0x0002 の上位4ビット
 X,Y = 258,1 は、0x0003 の下位4ビット
 X,Y = 259,1 は、0x0003 の上位4ビット
  :
 X,Y = 316,0 は、0x003C の下位4ビット
 X,Y = 317,0 は、0x003C の上位4ビット
 X,Y = 318,0 は、0x003D の下位4ビット
 X,Y = 319,0 は、0x003D の上位4ビット
 X,Y = 316,1 は、0x003E の下位4ビット
 X,Y = 317,1 は、0x003E の上位4ビット
 X,Y = 318,1 は、0x003F の下位4ビット
 X,Y = 319,1 は、0x003F の上位4ビット

 X,Y = 256,2 は、0x0100 の下位4ビット
 X,Y = 257,2 は、0x0100 の上位4ビット
 X,Y = 258,2 は、0x0101 の下位4ビット
 X,Y = 259,2 は、0x0101 の上位4ビット
 X,Y = 256,3 は、0x0102 の下位4ビット
 X,Y = 257,3 は、0x0102 の上位4ビット
 X,Y = 258,3 は、0x0103 の下位4ビット
 X,Y = 259,3 は、0x0103 の上位4ビット
  :
 X,Y = 316,2 は、0x013C の下位4ビット
 X,Y = 317,2 は、0x013C の上位4ビット
 X,Y = 318,2 は、0x013D の下位4ビット
 X,Y = 319,2 は、0x013D の上位4ビット
 X,Y = 316,3 は、0x013E の下位4ビット
 X,Y = 317,3 は、0x013E の上位4ビット
 X,Y = 318,3 は、0x013F の下位4ビット
 X,Y = 319,3 は、0x013F の上位4ビット

 X,Y = 256,4 は、0x0040 の下位4ビット
 X,Y = 257,4 は、0x0040 の上位4ビット
 X,Y = 258,4 は、0x0041 の下位4ビット
 X,Y = 259,4 は、0x0041 の上位4ビット
 X,Y = 256,5 は、0x0042 の下位4ビット
 X,Y = 257,5 は、0x0042 の上位4ビット
 X,Y = 258,5 は、0x0043 の下位4ビット
 X,Y = 259,5 は、0x0043 の上位4ビット
  :
 X,Y = 316,4 は、0x007C の下位4ビット
 X,Y = 317,4 は、0x007C の上位4ビット
 X,Y = 318,4 は、0x007D の下位4ビット
 X,Y = 319,4 は、0x007D の上位4ビット
 X,Y = 316,5 は、0x007E の下位4ビット
 X,Y = 317,5 は、0x007E の上位4ビット
 X,Y = 318,5 は、0x007F の下位4ビット
 X,Y = 319,5 は、0x007F の上位4ビット

 とわかりにくくなっています。

 長くなりますが8ビット単位の先頭だけを書き出すと、

 X,Y = 256, 0 は、0x0000 の下位4ビット
 X,Y = 256, 2 は、0x0100 の下位4ビット
 X,Y = 256, 4 は、0x0040 の下位4ビット
 X,Y = 256, 6 は、0x0140 の下位4ビット
 X,Y = 256, 8 は、0x0080 の下位4ビット
 X,Y = 256, 10 は、0x0180 の下位4ビット
 X,Y = 256, 12 は、0x00C0 の下位4ビット
 X,Y = 256, 14 は、0x01C0 の下位4ビット

 X,Y = 256, 16 は、0x0200 の下位4ビット
 X,Y = 256, 18 は、0x0300 の下位4ビット
 X,Y = 256, 20 は、0x0240 の下位4ビット
 X,Y = 256, 22 は、0x0340 の下位4ビット
 X,Y = 256, 24 は、0x0280 の下位4ビット
 X,Y = 256, 26 は、0x0380 の下位4ビット
 X,Y = 256, 28 は、0x02C0 の下位4ビット
 X,Y = 256, 30 は、0x03C0 の下位4ビット

 X,Y = 256, 32 は、0x0400 の下位4ビット
 X,Y = 256, 34 は、0x0500 の下位4ビット
 X,Y = 256, 36 は、0x0440 の下位4ビット
 X,Y = 256, 38 は、0x0540 の下位4ビット
 X,Y = 256, 40 は、0x0480 の下位4ビット
 X,Y = 256, 42 は、0x0580 の下位4ビット
 X,Y = 256, 44 は、0x04C0 の下位4ビット
 X,Y = 256, 46 は、0x05C0 の下位4ビット

 X,Y = 256, 48 は、0x0600 の下位4ビット
 X,Y = 256, 50 は、0x0700 の下位4ビット
 X,Y = 256, 52 は、0x0640 の下位4ビット
 X,Y = 256, 54 は、0x0740 の下位4ビット
 X,Y = 256, 56 は、0x0680 の下位4ビット
 X,Y = 256, 58 は、0x0780 の下位4ビット
 X,Y = 256, 60 は、0x06C0 の下位4ビット
 X,Y = 256, 62 は、0x07C0 の下位4ビット

 X,Y = 256, 64 は、0x0800 の下位4ビット
 X,Y = 256, 66 は、0x0900 の下位4ビット
 X,Y = 256, 68 は、0x0840 の下位4ビット
 X,Y = 256, 70 は、0x0940 の下位4ビット
 X,Y = 256, 72 は、0x0880 の下位4ビット
 X,Y = 256, 74 は、0x0980 の下位4ビット
 X,Y = 256, 76 は、0x08C0 の下位4ビット
 X,Y = 256, 78 は、0x09C0 の下位4ビット

 X,Y = 256, 80 は、0x0A00 の下位4ビット
 X,Y = 256, 82 は、0x0B00 の下位4ビット
 X,Y = 256, 84 は、0x0A40 の下位4ビット
 X,Y = 256, 86 は、0x0B40 の下位4ビット
 X,Y = 256, 88 は、0x0A80 の下位4ビット
 X,Y = 256, 90 は、0x0B80 の下位4ビット
 X,Y = 256, 92 は、0x0AC0 の下位4ビット
 X,Y = 256, 94 は、0x0BC0 の下位4ビット

 X,Y = 256, 96 は、0x0C00 の下位4ビット
 X,Y = 256, 98 は、0x0D00 の下位4ビット
 X,Y = 256,100 は、0x0C40 の下位4ビット
 X,Y = 256,102 は、0x0D40 の下位4ビット
 X,Y = 256,104 は、0x0C80 の下位4ビット
 X,Y = 256,106 は、0x0D80 の下位4ビット
 X,Y = 256,108 は、0x0CC0 の下位4ビット
 X,Y = 256,110 は、0x0DC0 の下位4ビット

 X,Y = 256,112 は、0x0E00 の下位4ビット
 X,Y = 256,114 は、0x0F00 の下位4ビット
 X,Y = 256,116 は、0x0E40 の下位4ビット
 X,Y = 256,118 は、0x0F40 の下位4ビット
 X,Y = 256,120 は、0x0E80 の下位4ビット
 X,Y = 256,122 は、0x0F80 の下位4ビット
 X,Y = 256,124 は、0x0EC0 の下位4ビット
 X,Y = 256,126 は、0x0FC0 の下位4ビット

 X,Y = 256,128 は、0x1000 の下位4ビット
 X,Y = 256,130 は、0x1100 の下位4ビット
 X,Y = 256,132 は、0x1040 の下位4ビット
 X,Y = 256,133 は、0x1140 の下位4ビット
 X,Y = 256,136 は、0x1080 の下位4ビット
 X,Y = 256,138 は、0x1180 の下位4ビット
 X,Y = 256,140 は、0x10C0 の下位4ビット
 X,Y = 256,142 は、0x11C0 の下位4ビット

 X,Y = 256,144 は、0x1200 の下位4ビット
 X,Y = 256,146 は、0x1300 の下位4ビット
 X,Y = 256,148 は、0x1240 の下位4ビット
 X,Y = 256,150 は、0x1340 の下位4ビット
 X,Y = 256,152 は、0x1280 の下位4ビット
 X,Y = 256,154 は、0x1380 の下位4ビット
 X,Y = 256,156 は、0x12C0 の下位4ビット
 X,Y = 256,158 は、0x13C0 の下位4ビット

 X,Y = 256,160 は、0x1400 の下位4ビット
 X,Y = 256,162 は、0x1500 の下位4ビット
 X,Y = 256,164 は、0x1440 の下位4ビット
 X,Y = 256,166 は、0x1540 の下位4ビット
 X,Y = 256,168 は、0x1480 の下位4ビット
 X,Y = 256,170 は、0x1580 の下位4ビット
 X,Y = 256,172 は、0x14C0 の下位4ビット
 X,Y = 256,174 は、0x15C0 の下位4ビット

 X,Y = 256,176 は、0x1600 の下位4ビット
 X,Y = 256,178 は、0x1700 の下位4ビット
 X,Y = 256,180 は、0x1640 の下位4ビット
 X,Y = 256,182 は、0x1740 の下位4ビット
 X,Y = 256,184 は、0x1680 の下位4ビット
 X,Y = 256,186 は、0x1780 の下位4ビット
 X,Y = 256,188 は、0x16C0 の下位4ビット
 X,Y = 256,190 は、0x17C0 の下位4ビット

 X,Y = 256,192 は、0x1800 の下位4ビット
 X,Y = 256,194 は、0x1900 の下位4ビット
 X,Y = 256,196 は、0x1840 の下位4ビット
 X,Y = 256,198 は、0x1940 の下位4ビット
 X,Y = 256,200 は、0x1880 の下位4ビット
 X,Y = 256,202 は、0x1980 の下位4ビット

 0x18C0〜0x18FF、0x19C0〜0x19FFは未使用です。


 ややこしくなりますが、8ドット単位で
 X,Y = x+0,y+0 は、0x0000 + 0x0040*(y/2) + x の下位4ビット
 X,Y = x+1,y+0 は、0x0000 + 0x0040*(y/2) + x の上位4ビット
 X,Y = x+2,y+0 は、0x0001 + 0x0040*(y/2) + x の下位4ビット
 X,Y = x+3,y+0 は、0x0001 + 0x0040*(y/2) + x の上位4ビット
 X,Y = x+0,y+1 は、0x0002 + 0x0040*(y/2) + x の下位4ビット
 X,Y = x+1,y+1 は、0x0002 + 0x0040*(y/2) + x の上位4ビット
 X,Y = x+2,y+1 は、0x0003 + 0x0040*(y/2) + x の下位4ビット
 X,Y = x+3,y+1 は、0x0003 + 0x0040*(y/2) + x の上位4ビット
  (x は4の倍数。y は2の倍数)

 ここで、y と Y の関係が以下のようになります(括弧内は、ビット番号)。

 Y(0)=y(0) (=0)
 Y(1)=y(3)
 Y(2)=y(1)
 Y(3)=y(2)
 Y(4)=y(4)
 Y(5)=y(5)
 Y(6)=y(6)
 Y(7)=y(7)


 本来だと、0x0000、0x0040、0x0080、…、となるはずの所が、ビットが入れ替わっているんですね。
 多分バグだと思いますが...

 これのせいで、直接アクセスモードでのプログラムが煩雑になってしまいます。


posted by えすび at 21:00| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする

2018年06月11日

SR画面周り(2)

  P6月間企画(その11)

  SRモードでの画面周りについて、記載します。

  SRモードですので、ポート0xC8のbit0=0の時のみの記述になります。
  非SRモード(ポート0xC8のbit0=1)や、初代/mk2/66の画面周りに関しては、また別の機会に。

 注)SRモードの画面周りのI/Oポートは、SR-BASICを使う際にはBASIC側で管理されています。具体的には、VSYNC割り込みで、ワークエリアに設定した値でI/Oポートの内容を設定され直されます。
  そのため、直接I/Oポートを叩いて画面モードの変更などをする場合は、割り込み禁止にするか、ワークエリアの方に値を設定するなどが必要になります。
  テスト的に試すのであれば、割り込み禁止→設定変更→無限ループ、などの方法を採るのがいいかと思います。


  SRモードの画面種類は、大きく3つに分かれます。BASICのSCREENコマンドの第一パラメータと同じです。

 ・キャラクタモード
 ・横320ドットのグラフィックモード
 ・横640ドットのグラフィックモード

  それぞれのモードを個別に記載していきます。



○キャラクタモード
 ポート0xC1のbit2を1にするとキャラクタモードになります。
 画面は、横80列x縦25行、80x20、40x25、40x20 が設定できます。

 ポート0xC1:bit1:横文字数(0:80文字/1:40文字)
 ポート0xC8:bit2:縦行数設定(0:25行/1:20行)

 ポート0xC1、0xC8は、他のデータも設定するので、誤って設定しないように注意が必要です。

 どのページを表示させるかは、ポート0xC9で設定します。
 例えば、0xf000〜を表示させる場合は、0x0fを設定します。

 また、ポート0xC1、0xC8で画面制御を変更した場合は、関係がなくてもポート0xC9〜0xCCを設定する必要があります(関係のないポートは、0x00で構わない)。
 設定しない場合、正常動作しない場合があります。


 キャラクタ画面に文字を表示するには、VRAMにデータを書き込むだけです。
 1文字で2バイト使用します。1バイト目がキャラクタデータ、2バイト目がアトリビュートデータです。

 例えば、ポート0xC9に0x0Fを設定している場合、0xF000〜が表示されるVRAMになります。
 横方向0〜39/0〜79桁、縦方向0〜19/0〜24行とすると、

40x20
 F000/F001 F002/F003 ... F04C/F04D F04E/F04F
 F050/F051 F052/F053 ... F09C/F09D F09E/F09F
  :                  :
  :                  :
 F5A0/F5A1 F5A2/F5A3 ... F5EC/F5ED F5EE/F5EF
 F5F0/F5F1 F5F2/F5F3 ... F63C/F63D F63E/F63F

40x25
 F000/F001 F002/F003 ... F04C/F04D F04E/F04F
 F050/F051 F052/F053 ... F09C/F09D F09E/F09F
  :                  :
  :                  :
 F730/F731 F732/F733 ... F77C/F77D F77E/F77F
 F780/F781 F782/F783 ... F7CC/F7CD F7CE/F7CF

80x20
 F000/F001 F002/F003 ... F09C/F09D F09E/F09F
 F0A0/F0A1 F0A2/F0A3 ... F13C/F13D F13E/F13F
  :                  :
  :                  :
 FB40/FB41 FB42/FB43 ... FBDC/FBDD FBDE/FBDF
 FBE0/FBE1 FBE2/FBE3 ... FC7C/FC7D FC7E/FC7F

80x25
 F000/F001 F002/F003 ... F09C/F09D F09E/F09F
 F0A0/F0A1 F0A2/F0A3 ... F13C/F13D F13E/F13F
  :                  :
  :                  :
 FE60/FE61 FE62/FE63 ... FEFC/FEFD FEFE/FEFF
 FF00/FF01 FF02/FF03 ... FF9C/FF9D FF9E/FF9F

 となります。


 データ1バイト目は、キャラクタコード(いわゆるアスキーコード)、2バイト目がアトリビュートです。

 アトリビュートは、

 bit7 :グラフィックフラグ(0:ノーマル、1:セミグラフィック)
 bit6-4:背景色BGR
 bit3-0:文字色HBGR

 背景色のHは、ポート0xC0のbit1(CSS2)で与えられます。
 ポート0xC0の他のビット(CSS1、CSS3)は、キャラクタモードでは無効です。


○注意点:
1)セミグラフィックは、縦行数によって違います。
  40x20、80x20の場合、別のキャラセット(mk2/66で使用されている人間とかがあるキャラセット)が選ばれます。
  40x25の場合、80x100のセミグラフィックになります。
  80x25の場合、160x100のセミグラフィックになります(PC-8001相当)。

  セミグラフィックと言っても、単にそういうキャラセットを読み出すだけですが...

  PC-8001相当の160x100のセミグラフィックですが、ビットアサインが違います。

P6SR:
  b7 b6
  b5 b4
  b3 b2
  b1 b0

80:
  b0 b4
  b1 b5
  b2 b6
  b3 b7

  また、ハードウエアのバグがあります
  セミグラフィック使用時(40x25/80x25表示で、グラフィックフラグ=1時)に、画面右の方のキャラクタが、なぜかずれて表示されます。
  同じ場所でグラフィックフラグ=0 にしても、通常キャラクタはずれないのが不思議...


2)背景色、文字色の並びがグラフィックと違います。
  キャラクタモード :HBGR
  グラフィックモード:HGRB

  理由は不明...バグかな?

  ちなみに、H はハーフトーン、の意味だったと思います。


posted by えすび at 21:00| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする

2018年06月10日

SR画面周り(1)

  P6月間企画...そろそろつらい(その10)

  SRの画面周りについて、まとめてみました。
  参考文献などが入手困難のために、情報が少ない部分でもあると思います。

  とりあえず、I/Oポートを列挙しています。それぞれの詳細は後ほど。
  また、今回はSRの画面周りの紹介をしたいので、それ以外は省略しています。

  参考文献
  Mr.PCテクニカルコレクション 秀和システムトレーディング
  PC-6001mkII 解析マニュアルI 秀和システムトレーディング

  参考文献の内容を参考に、間違っている部分などは修正したつもりです。


ポート0x40〜0x4F:パレット設定
色番号13〜16に任意の色を割り当てる。

○ポート0x40:色番号16(HGRB=1111)のパレット色設定
○ポート0x41:色番号15(HGRB=1110)のパレット色設定
○ポート0x42:色番号14(HGRB=1101)のパレット色設定
○ポート0x43:色番号13(HGRB=1100)のパレット色設定

・SR以降のみに存在。
・SRモード以外でも動作可。
・書き込みのみ。

・書き込むデータは次の通り。
 bit7-4:don't care
 bit3:Hの反転
 bit2:Gの反転
 bit1:Rの反転
 bit0:Bの反転

 例えば、白色(HGRB=1111)を設定する場合は、0x00を書き込みます。


ポート0x60〜0x6F:リード/ライト割り当て設定(SRモード用)
CPUから読み出す/CPUから書き込むメモリを8K単位で任意に割り当てる。

○ポート0x60:CPUアドレス:0x0000〜0x1FFFの読み出し設定
○ポート0x61:CPUアドレス:0x2000〜0x3FFFの読み出し設定
○ポート0x62:CPUアドレス:0x4000〜0x5FFFの読み出し設定
○ポート0x63:CPUアドレス:0x6000〜0x7FFFの読み出し設定
○ポート0x64:CPUアドレス:0x8000〜0x9FFFの読み出し設定
○ポート0x65:CPUアドレス:0xA000〜0xBFFFの読み出し設定
○ポート0x66:CPUアドレス:0xC000〜0xDFFFの読み出し設定
○ポート0x67:CPUアドレス:0xE000〜0xFFFFの読み出し設定

○ポート0x68:CPUアドレス:0x0000〜0x1FFFの書き込み設定
○ポート0x69:CPUアドレス:0x2000〜0x3FFFの書き込み設定
○ポート0x6A:CPUアドレス:0x4000〜0x5FFFの書き込み設定
○ポート0x6B:CPUアドレス:0x6000〜0x7FFFの書き込み設定
○ポート0x6C:CPUアドレス:0x8000〜0x9FFFの書き込み設定
○ポート0x6D:CPUアドレス:0xA000〜0xBFFFの書き込み設定
○ポート0x6E:CPUアドレス:0xC000〜0xDFFFの書き込み設定
○ポート0x6F:CPUアドレス:0xE000〜0xFFFFの書き込み設定

・SR以降のみに存在。
・SRモードのみ動作可(非SRモード時は、ポート0xF0〜0xF2を使用する)。
・書き込みのみ。

・書き込むデータは次の通り。

 bit7-4:割り当てるメモリの種別
 bit7-4=0000:内部RAM(VRAM)
 bit7-4=0010:外部RAM(拡張RAM)
 bit7-4=1011:外部ROM1(拡張ROM(nCS2):通常、0x6000〜0x7FFFに割り当てる)
 bit7-4=1100:外部ROM2(拡張ROM(nCS3):通常、0x4000〜0x5FFFに割り当てる)
 bit7-4=1101:CGROM
 bit7-4=1110:SYSTEMROM2(音声合成/漢字)
 bit7-4=1111:SYSTEMROM1(BASIC-ROM)
 それ以外は未使用

 bit3-1:割り当てるメモリの先頭アドレス(アドレスバスA15-13に出力する値)
 bit0:常に"0"

注)通常は8K毎に割り当てが出来ますが、内部RAM(VRAM)とCGROMには、制限があります。
  (基板接続間違いのようです)

  内部RAM(VRAM)、CGROMの0x0000〜0x1FFFは、0x0000〜0x1FFF、0x4000〜0x5FFF、0x8000〜0x9FFF、0xC000〜0xDFFFにしか割り当てられない。
  内部RAM(VRAM)、CGROMの0x2000〜0x3FFFは、0x2000〜0x3FFF、0x6000〜0x7FFF、0xA000〜0xBFFF、0xE000〜0xEFFFにしか割り当てられない。

  同様に、
  内部RAM(VRAM)の0x4000〜0x5FFF、0x8000〜0x9FFF、0xC000〜0xDFFFは、0x0000〜0x1FFF、0x4000〜0x5FFF、0x8000〜0x9FFF、0xC000〜0xDFFFにしか割り当てられない。
  内部RAM(VRAM)の0x6000〜0x7FFF、0xA000〜0xBFFF、0xE000〜0xEFFFは、0x2000〜0x3FFF、0x6000〜0x7FFF、0xA000〜0xBFFF、0xE000〜0xEFFFにしか割り当てられない。



ポート0x80〜0x8F:RS-232C(8251)アクセス
●今回は省略

ポート0x90〜0x9F:8255/サブCPUアクセス
●今回は省略

 画面関連は以下の通り。
 ポート0x93に0x02を書き込み→画面OFF(画面モードによっては砂嵐)
 ポート0x93に0x03を書き込み→画面ON

ポート0xA0〜0xAF:YM-2203(SRのみ)/AY-3-8910(非SRのみ)アクセス
●今回は省略

 画面関連は以下の通り(mk2以降のみ存在)。
 ジョイスティックポートに、垂直同期、水平同期の信号が接続されています。
 OPN(PSG)のアドレス0x0eを読み出すと、垂直同期(bit7)、水平同期(bit6)が読み出せます。
 ただし、水平同期はパルス幅が短すぎるため、まともに読み取れません。

ポート0xB0〜0xBF:割り込み、CMT、FDD制御、表示VRAM(非SRモード)
●今回は省略

ポート0xC0:プリンタ、RS-232Cチェック、色の組み合わせ設定
○ポート0xC0(読み出し)
 bit1:プリンタBUSY(0:BUSY/1:READY)
 bit0:RS-232Cキャリア検出
○ポート0xC0(書き込み)
 bit7-3:don't care
 bit2:CSS3
 bit1:CSS2
 bit0:CSS1

・読み出しは全機種に存在。
・書き込みはmk2以降に存在。


ポート0xC1〜0xCF:CRTモードなど(SRモード用)

○ポート0xC1(CRTモード設定)
 bit7-4:don't care
 bit3:横ドット数(0:640ドット/1:320ドット)
 bit2:グラフィックモード(0:グラフィック/1:キャラクタ)
 bit1:横文字数(0:80文字/1:40文字)
 bit0:縦ドット数(0:204ドット/1:200ドット)

・SRモードのみ動作可。
・書き込みのみ。


○ポート0xC8(CRTコントローラ設定)
 bit7-5:don't care
 bit4:グラフィック表示ページ ビットマップページ指定(0:ページ0(0x0000〜0x7FFF)/1:ページ1(0x8000〜0xFFFF))
 bit3:ビットマップモード(0:イネーブル/1:ディセーブル(直接アクセスモード))
 bit2:縦行数設定(0:25行/1:20行)
 bit1:バスリクエスト(0:ON/1:OFF)
 bit0:CRTコントローラモード設定(0:SRモード/1:非SRモード)

・bit0、1は、全モードで動作可。bit2〜4は、SRモードのみ動作可。
・書き込みのみ。


○ポート0xC9(CRTコントローラ設定)
 bit7-4:don't care
 bit3-0:表示ページ(グラフィックモードの時は、bit3のみ有効)

・SRモードのみ動作可。
・書き込みのみ。

 テキスト表示の場合、開始アドレスの上位4ビットをbit3-0に設定する。
 例えば、0xF000〜を表示する場合は、0x0Fを書き込む。
 グラフィック表示の場合は、ページ0を表示する場合は、0x00、ページ1を表示する場合は0x08を書き込む。

注)ポート0xC1、0xC8で画面制御を変更した場合は、関係がなくてもポート0xC9〜0xCCを設定する(0x00でよい)。
  設定しない場合、正常動作しない場合がある(詳細不明)。


ポート0xCA、0xCB(スクロール設定)
○ポート0xCA
 bit7-0:X座標下位8ビット

○ポート0xCB
 bit7-1:'0'を設定する
 bit0:X座標上位1ビット

○ポート0xCC
 bit7-0:Y座標

・SRモードのみ動作可。
・書き込みのみ。

 ポート0xCA、0xCBにX、Y座標を設定すると、画面左上に(X,Y)が来るように画面がスクロールする。
 (移動距離を設定するわけではない)

注)ポート0xC1、0xC8で画面制御を変更した場合は、関係がなくてもポート0xC9〜0xCCを設定する(0x00でよい)。
  設定しない場合、正常動作しない場合がある(詳細不明)。


ポート0xCE、0xCF(ビットマップアクセスY座標指定)
ビットマップがイネーブル時のY座標を指定する
○ポート0xCE
 bit7-0:Y座標

○ポート0xCF
 bit7-0:'0'を設定する

・SRモードのみ動作可。
・書き込みのみ。

 アクセスした時のメモリアドレスがX座標になる。そのため普通は、アドレス0x0000〜0x013Fに読み書きする事で、VRAMにアクセスする事になる(詳細は別途)。
 ポート0xCFは、画面モードを変更した後に、0x00を書けば問題なく、アクセスの度に設定する必要はない。



ポート0xC1〜0xCF:CRTモードなど(非SRモード用)
●今回は省略

ポート0xD0〜0xDF:内蔵FDD/外付けFDDアクセス
●今回は省略

ポート0xE0〜0xEF:音声合成LSIアクセス
●今回は省略

ポート0xF0〜0xF2:メモリ割り当て(非SRモード用)
●今回は省略

ポート0xF3〜0xFB:割り込み制御
●今回は省略

ポート0xFC〜0xFF:拡張漢字ROMパックアクセス
●今回は省略

posted by えすび at 21:00| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする

2018年06月09日

FD版ベルーガライター(ver1リリース)

  P6月間企画(その9)

  戦士のカートリッジmk2(新ベルーガカートリッジ)のFD版ライターをリリースします。

belugawriter.zip


  説明などは、同梱のドキュメントを参照して下さい。



 !!!!!!!!!注意事項!!!!!!!!!

 すべての作業に関して、自己責任で行って下さい。万一、ここの記載が誤っていても、当方では責任は負いません。
 カートリッジ内のROMにデータを書き込む際、途中で電源を切ったり、リセットをしたりしないで下さい。
 最悪、書き込まれているデータ(ベルーガプログラムを含む)が消去される場合があります。
 通常使用時は、JP1をショートしないで下さい。最悪、暴走などでFLASH-ROMの内容が消去される可能性があります。
 ベルーガが書き込まれている領域(セクタ#0、#1)は選択できません。間違って消去などしないためです。

 このプログラムでは、MegaFlashWriterとは違い、セクタ単位で書き込みます。
 ブロック単位で書き込めないので注意して下さい。

 また、どこにデータが書き込まれているのかを表示していません。
 そのため、前のデータを誤って消去/上書きをする事がありますので、十分注意して下さい。

 !!!!!!!!!!!!!!!!!!!!!!
posted by えすび at 21:00| Comment(0) | SW:ツール | このブログの読者になる | 更新情報をチェックする

2018年06月08日

上海(ver1リリース)

  P6月間企画(その8)

  上海 for P6

  88版→P6SRへの変換ツールをリリースします。

shangp6.zip


  説明などは、同梱のドキュメントを参照して下さい。

  エミュレータでは、PC-6001VW ver310f、PC-6001V ver1.25 で動作を確認しています。



・マウスについて
  同梱のドキュメントにも記載がありますが、このゲームではマウスが使用できます。


  使用できるマウスは、PC-8801/MSX/FM-TOWNS用バスマウスです。
  ただ、入手が少し困難だと思います。


  PS/2マウスからの変換回路を自作したい場合は以下の記事を参考にして下さい。
  http://sbeach.seesaa.net/article/387861474.html

  ただ、PS/2マウスの種類によっては、動作しない場合があります。


  また、USBマウスからの変換回路の同人ハードを販売しているようです。
  http://www.wig.nu/w341/

  BOOTHサイトで通販もしているようです。


・ゲームについて
  元のPC-8801版では、一部隠し機能があったようですが、あまり意味のない機能のようなので削除しています。


  また、

 ○画面左中央付近に黒いスジが出る
 ○右のメニュー画面の下側に、緑の四角が出る

  というバグがあるかも知れません。

  オフ会で動かしていた時に、いつの間にか出ていました...


  発生条件が分からないので、もし発見したら教えて下さい。


・移植について
  違和感がないかと思いますが、88版では 640x200x8色 のものを、640x200x4色で動かしています。
  88版と並べてみると、一目瞭然なんですけどね(^^;)

  マウスルーチンは、ほとんど88版をそのまま使用しています。タイミング的にも問題ないようでした。

  簡単な移植かと思っていたんですが、8色→4色に落としたために、描画系でイロイロと手を入れる羽目になりました。


2018年06月07日

P6のフロッピー関連まとめ(4)

  P6月間企画...そろそろ息切れ?(その7)


4.P6でよく使用されている内部フォーマットについて

 P6の場合、内蔵/外付ドライブや、外付ドライブの種類の違いなどがあるため、特殊なフォーマットが使われる事があまりありません。

 よく使われているフォーマットは以下の通りです(P6の説明書に書かれているものです)。

 1D:
  トラック#0〜#39(片面使用で、シリンダ番号#0〜#39を使用)
  1トラック=セクタ#1〜#16の16セクタ
  1セクタ=256バイト

  BASICでは、トラック#0〜#34しか扱えないようです。


 1DD:
  トラック#0〜#79(片面使用で、シリンダ番号#0〜#79を使用)
  1トラック=セクタ#1〜#16の16セクタ
  1セクタ=256バイト


 2D:
  トラック#0〜#79(両面使用で、シリンダ番号#0〜#39を使用)
  1トラック=セクタ#1〜#16の16セクタ
  1セクタ=256バイト



 前述の通り、トラック#0セクタ#1は起動時に読み込まれて、その内容が実行されます。

 また、BASICでは、以下のような割り当てがされています。

 1D:
  トラック#18セクタ# 1〜#12:ディレクトリ(ファイル名などが格納されている)
  トラック#18セクタ#13 :ID(属性)
  トラック#18セクタ#14〜#16:FAT(クラスタの使用状態が格納されている)

 1DD/2D:
  トラック#37セクタ# 1〜#12:ディレクトリ
  トラック#37セクタ#13 :ID
  トラック#37セクタ#14〜#16:FAT

 それ以外の部分はユーザ領域として、ファイル本体が格納されます。


 他のページでも説明されているので、そちらも参考にして下さい。
http://p6ers.net/hashi/floppy.html
http://www.geocities.jp/submarine600/ (←ここの『落ちつく』の記事の一部)



5.P6でよく使用されている拡張子とデータ構造について

 P6のフロッピーデータをWindows上で扱う時のフォーマットの話です。

○ベタフォーマット(〜.dsk):
 いわゆるベタファイルです。

 トラック#0セクタ#1〜16
 トラック#1セクタ#1〜16
  :
 トラック#79セクタ#1〜16 (1Dの場合、トラック#39)

 の順で、各セクタのデータ部分のみを連結したものです。

 そのため、ファイルサイズは、

 1D:256x16x40 = 163840バイト(0x28000バイト)
 1DD/2D:256x16x80 = 327680バイト(0x50000バイト)

 になります。


○P31フォーマット(〜.P31):
 SD6031/SD6031WIFで使用されているフォーマットです。
 SDカードにアクセスする際に、簡単にアクセスできるように、1セクタ=512バイトにしています。
 0x00で埋めている部分は使用してませんので、実際には何でも構いません。

 1DD/2D:
  それぞれの1セクタ256バイトの後に、0x00を256バイト続けます。

  トラック#0セクタ#1(256バイト)
  0x00 ×256バイト
  トラック#0セクタ#2(256バイト)
  0x00 ×256バイト
  :
  トラック#79セクタ#16(256バイト)
  0x00 ×256バイト


 1D:
  それぞれの1セクタ256バイトの後に、0x00を256バイト続けます。
  さらに1トラックの後に、0x00を4096バイト続けます。
  (1DD/2Dで奇数トラックに当たる部分をベタ0x00にしています)

  トラック#0セクタ#1(256バイト)
  0x00 ×256バイト
  トラック#0セクタ#2(256バイト)
  0x00 ×256バイト
  :
  トラック#0セクタ#16(256バイト)
  0x00 ×256バイト
  0x00 ×4096バイト
  トラック#1セクタ#1(256バイト)
  0x00 ×256バイト
  :
  トラック#1セクタ#16(256バイト)
  0x00 ×256バイト
  0x00 ×4096バイト
  :
  トラック#39セクタ#16(256バイト)
  0x00 ×256バイト
  0x00 ×4096バイト


 ファイルサイズは、1D、1DD/2Dとも、655360バイト(0xa0000バイト)になります。



○D88フォーマット(〜.d88):
 業界(?)標準のフォーマットです。
 元々、PC-8801用エミュレータのフォーマットのようです。
 トラック数、セクタ数が固定ではないものを対応するために、ヘッダにそれぞれのトラック先頭の場所が書かれています。さらに、それぞれのセクタ先頭に、そのトラック内のセクタ数やCHRN(シリンダ番号、ヘッダ番号、セクタ番号、セクタ長)が書かれています。

 標準的に使用されているため、実フロッピーとのやり取りなどのツールもあります。


 詳しくは、他のページで説明されているので、そちらを参考にして下さい。
http://papicom.net/p6v/tech.html
http://www.geocities.jp/submarine600/ (←ここの『落ちつく』の記事の一部)



○それぞれの変換ツール

 D88、P31相互変換
http://tulip-house.ddo.jp/digital/SD6031/index.html

 D88、DSK相互変換
http://p6ers.net/bernie/develop/d88todsk.html

 D88作成
http://www.geocities.jp/submarine600/ (←ここの『R&D』の『PC-6000 シリーズ用 D88 ディスクイメージ書き込みツール』)

 また、拙作のPC-8801から変換するソフトの中に、d88todsk、d88todsk1dd、などがありますが、これはD88ファイルの任意のトラック、セクタからデータを抜き出すソフトです。


posted by えすび at 21:00| Comment(0) | P6解析:FDC周り | このブログの読者になる | 更新情報をチェックする

2018年06月06日

P6のフロッピー関連まとめ(3)

  P6月間企画(その6)


3.オート起動にまつわる事その2

 BASICのプログラムをオート起動で動かしたい時に使う方法です。

 前述の通り、フロッピーからオート起動をした場合、BASICのモードは選べるんですが、それ以降のページ指定や、コマンドなどは設定できません。

 その代わり、ファンクションキーフラグを使う方法で、人間がキーボードから入力する事を代用できます。


 ファンクションキーポインタ:0xfb8d〜0xfb8e(モード1〜5)/ 0xe8ce〜0xe8cf(モード6)
 ファンクションキーフラグ :0xfa32(モード1〜5) / 0xe6d3(モード6)


 ファンクションキーフラグに文字数を設定すると、ファンクションキーポインタからの文字列をキー入力したと解釈され、自動的にキー入力が行われます。

 設定できる文字数は0xffまでで、文字列は 0x00 でも終了と見なされます。



○モード1〜5でオート起動するプログラム例(トラック#0セクタ#1)

org 0xf900

START:
db "SYS"

ld a,(FUNCCNT)
ld (0xfa32),a
ld hl,FUNCBUF
ld (0xfb8d),hl
ld a,$04 ; モード5で起動
ld (0xff4e),a
ret

FUNCCNT:
db FUNCBUF_end - FUNCBUF
FUNCBUF:
db "0",$0d ; Files
db "3",$0d ; Pages
db "run ",$22,"TETRIS.BAS",$22,$0d

FUNCBUF_end:


 MODE=5、Files=0、Pages=3で起動後、TETRIS.BAS をロードして、RUNします。



○モード6でオート起動するプログラム例(トラック#0セクタ#1)


org 0xc000

START:
db "IPL"

ld a,(FUNCCNT)
ld (0xe6d3),a ; ファンクションキーフラグをセット
ld hl,FUNCBUF
ld (0xe8ce),hl ; ファンクションキーポインタをセット

xor a ; Zflag=1:メニューを出さずにモード6にする
ld a,0x02 ; Files=2に設定
ret


FUNCCNT:
db FUNCBUF_end - FUNCBUF
FUNCBUF:
db "run ",$22,"PBOYP6.BAS",$22,$0d

FUNCBUF_end:


 モード6で起動後、PBOYP6.BAS をロードして、RUNします。



 この方法の唯一の欠点は、途中にSTOPキーを押すと止まる、事です(^^;)


posted by えすび at 22:27| Comment(0) | P6解析:FDC周り | このブログの読者になる | 更新情報をチェックする

2018年06月05日

P6のフロッピー関連まとめ(2)

  P6月間企画?(その5)


2.オート起動
  トラック#0セクタ#1の内容でオート起動が出来るのですが、これまた機種によって動作が変わります。


 ・PC-6001+拡張BASIC
  オート起動できません。
  mk2のBASIC-ROMを使用してオート起動を可能にするパッチが、西田ラジオさんで公開されています。
  http://tulip-house.ddo.jp/digital/SD6031WIF/index.html
  これにより、mk2相当になります。

 ・PC-6001mk2/PC-6601
  "SYS"のオート起動が出来ます。

 ・PC-6001mk2SR/PC-6601SR
  "SYS"、"RXR"、"IPL"のオート起動が出来ます。


  オート起動は、トラック#0セクタ#1の内容を読み込んで、そこに書かれている内容を実行します。

1)トラック#0セクタ#1の最初の3バイトが、"SYS"、"RXR"の場合

 モード5(mk2/66モード)で起動。0xf900〜にトラック#0セクタ#1の内容を読み込み、call 0xf903 が実行されます。
 起動プログラムから ret した場合は、そのままBASIC選択画面になりますが、0xff4e に、モード−1の値を書き込むと、そのBASICを選択した事に出来ます。
 例えば 0xff4e に 0x01 を書き込むと MODE=2 を選択した事になり、How Many Pages ? の画面になります。

  "SYS"と"RXR"の違いは、"SYS"が1Dフォーマット、"RXR"が1DD/2Dフォーマットになります("RXR"は、SRのみ)。


2)トラック#0セクタ#1の最初の3バイトが、"IPL"の場合

 モード6(SRモード)で起動。0xc000〜にトラック#0セクタ#1の内容を読み込み、call 0xc003 が実行されます。
 起動プログラムから ret した場合は、Zflag=0ならそのままBASIC選択画面になります
 Zflag=1なら、選択画面にならずにSR-BASICが起動します。また、AregがFilesの値になります。


3)mk2/66で、トラック#0セクタ#1の最初の3バイトが、"SYS"以外の場合

 1Dフォーマットで、通常のBASIC選択画面が表示されます。


4)mk2SR/66SRで、トラック#0セクタ#1の最初の3バイトが、"SYS"、"RXR"、"IPL"以外の場合

 接続されているドライブのフォーマットで、通常のBASIC選択画面が表示されます。

 つまり...
 mk2SRで、外付ドライブが1DD/2Dの場合は、1DD/2Dフォーマットで起動します。
 mk2SRで、外付ドライブが1Dの場合は、1Dフォーマットで起動します。
 66SRで、内蔵ドライブが有効になっている場合は、1DDフォーマットで起動します。
 66SRで、内蔵ドライブ無効、外付ドライブが1DD/2Dの場合は、1DD/2Dフォーマットで起動します。
 66SRで、内蔵ドライブ無効、外付ドライブが1Dの場合は、1Dフォーマットで起動します。

 ややこしい...

 要するに通常は1DD/2Dで、外付ドライブが1Dの場合のみ、1Dフォーマットで起動という事です。




3.オート起動にまつわる事

1)拡張ROMが先に確認される

 拡張ROMとオート起動のフロッピーを同時に使った場合、拡張ROMが優先されます。
 拡張ROMでBASICに返ってくるものは、その後にオート起動のフロッピーが確認されます。

 これを利用しているのが、戦士のカートリッジ(旧、mk2)です。


2)オート起動は、内蔵が先に確認される

 66/SRの場合、内蔵と外付の両方にドライブが付けられますが、このときに内蔵ドライブを先にチェックします。内蔵ドライブが有効になっている場合は、ディスクの内容や有無に関わらず、内蔵ドライブ#1のみがオート起動の対象になります。
 66/SRで外付ドライブから起動させたい場合は、本体後ろのドライブ数を0に合わせると、内蔵ドライブが無効になります。
 mk2/SRと、66/SRで内蔵ドライブを無効にした場合は、外付ドライブ#1がオート起動の対象になります。


3)どのドライブから起動されたかを知る

 どのドライブが使用可能なのかは、以下のワークを読み出すと分かります(66/mk2SR/66SR)。

 モード5(SYS/RXR):0xfe74
 モード6(IPL) :0xed5a

 bit7-0=外付#2、外付#1、内蔵#2、内蔵#1、"0"、"0"、"0"、"0"
 ドライブがある場合は、該当ビットが"1"になります。

 2)で記載した通り、内蔵#1が有効の場合は内蔵#1から起動され、内蔵#1が無効の場合は外付#1から起動される事になります。

 そのため、bit4=1なら内蔵#1から、bit4=0なら外付#1から起動されると判断できます。


 mk2の場合、0xfe74には別のデータが書かれていますが、0x22と固定値です。
 ちょうどbit4=0なので、同じルーチンで外付#1から起動と判断できます。

 mk2のドライブ数は、0xfb3b に書かれています(0x00〜0x04)。


 起動されたドライブではなく、どのドライブを読み込んでいるかを知るためには、かなり面倒な手順が必要になります。
 http://sbeach.seesaa.net/article/387861583.html

 が、ここまで必要な事はないでしょう。


4)ディスクの読み出しは、0x4274(モード5)、0x0198(モード6)を使用する

 モード5の場合、0x51f2を使用しているものもありますが、ワークエリアが設定されていません。
 そのために意図しない場所にワークデータが書き込まれる事があります。

 代わりに 0x4274 を使用すると、上記の問題は回避されます。


5)mk2SR/66SR+外付1DD/2Dドライブで、1Dディスクを読み出す
 (1DDドライブで1Dディスクを読み書きする時のトラック幅問題は、今は考えません)

 普通のBASICで作成された1Dディスクを、mk2SR/66SR+外付1DD/2Dドライブで読み出したい場合、普通には読めません。

 上の2、4)の通り、ヘッダに何も書かれていないディスクで起動すると、1DD/2Dフォーマット対応になってしまうからです。モード1〜5にしても、1DD/2Dフォーマットのままです。



 SD6031/SD6031WIFを使っていると、ドライブが1DD/2Dドライブ扱いのため、この問題に引っ掛かります。

 mk2+SD6031の構成で、モード5で作ったデータを、mk2SR+SD6031の構成で、同じモード5でも読めない状態になるんですね。


 回避する方法ですが、『"SYS"のヘッダのディスクで、BASICに戻ってくるもので起動する』が一番簡単です。
 例えば、6601のユーティリティディスクや、拙作のSD6031用のプログラムセレクタなどです。


 自作する場合は、1Dフォーマットをしたディスクに、トラック#0セクタ#1の先頭から4バイトを
 0x53,0x59,0x53,0xc9 として下さい。


posted by えすび at 20:38| Comment(0) | P6解析:FDC周り | このブログの読者になる | 更新情報をチェックする

2018年06月04日

P6のフロッピー関連まとめ(1)

  P6月間なので...(その4)

  何度かフロッピー関連に関して書いたんですが、いろいろと分かりにくいのと欲しい情報がまとまっていないようなので、再度まとめる事に挑戦してみます。既出なものが多数あると思いますがご容赦を。


1.P6のBASICで認識できる、フロッピーディスク、フロッピードライブの種類
  機種によってドライブが内蔵されていたり、1DD/2Dが扱えるようになっていたりと、かなりごちゃごちゃになっています。


 ・PC-6001+拡張BASIC
  外付1Dドライブ(ex:PC-6031)+1Dディスク
  外付ドライブ1〜4まで認識します。オート起動はできません。


 ・PC-6001mk2
  外付1Dドライブ(ex:PC-6031)+1Dディスク
  外付ドライブ1〜4まで認識します。オート起動が可能です。


 ・PC-6601
  内蔵1Dドライブ+1Dディスク
  外付1Dドライブ(ex:PC-6031)+1Dディスク
  内蔵ドライブ1〜2、外付ドライブ1〜2まで認識します。


 ・PC-6001mk2SR
  外付1DDドライブ(ex:PC-6031SR)+1DDディスク
  外付2D ドライブ(ex:PC-80S31) +2D ディスク
  外付1D ドライブ(ex:PC-6031) +1Dディスク
  外付ドライブ1〜2まで認識します。

  シリーズで唯一ドライブが2つしか認識しません。
  mk2SRのBASIC-ROMはP6SRと同じために、内蔵ドライブがない分だけ少なくなっています。


 ・PC-6601SR
  外付1DDドライブ(ex:PC-6031SR)+1DDディスク
  外付2D ドライブ(ex:PC-80S31) +2D ディスク
  外付1D ドライブ(ex:PC-6031) +1Dディスク
  内蔵1DDドライブ+1DDディスク
  内蔵ドライブ1〜2、外付ドライブ1〜2まで認識します。


  PC-6601/SRで外付ドライブを使用するためには、追加のハードが必要です。
http://sbeach.seesaa.net/article/387861528.html

  8255+αの簡単な回路ですが正式リリースはされていません(普通は要らないですし)。
  その割に、BASICではちゃんと対応しているというナゾ。


  初代/mk2/66は 1D しか扱えませんが、mk2SR/66SRは、1D 以外に、1DD/2D が扱えます。

  P6から見て、1DD と 2D の区別はありません。
  外付ドライブに対して、両面指定のコマンドを出力した時の動作が、
  PC-80S31 :1D/2D のディスクの両面を使う(=2D)
  PC-6031SR:シリンダ数を80シリンダ使う(=1DD)
  となるためです。


  1Dしか扱えない初代/mk2/66に、外付1DDドライブ(ex:PC-6031SR)や外付2Dドライブ(ex:PC-80S31)をつけた場合は、外付1Dドライブとして動作します。

  ですのでBASICでは、初代/mk2/66は、1Dしか扱う事ができません。
  しかし、自分でプログラムを書けばこの限りではありません。例えば、移植Wizシリーズは全て1DD/2Dでも動作します。


  ちなみにSD6031やSD6031WIFは、PC-80S31/PC-6031SR相当です。SDカード上では、データをトラック番号で扱っているため、1DD/2Dの区別はありません。

posted by えすび at 21:03| Comment(0) | P6解析:FDC周り | このブログの読者になる | 更新情報をチェックする

2018年06月03日

ベルーガのバージョンについて

  P6月間なので?...(その3)

  ツイッターを見てちょっと気付いたんですが...P6版ベルーガに複数バージョンがあったんですね。

  私が把握しているのでは、以下のようです。


1)初代ベルーガ(西田ラジオ製のカートリッジ)
http://tulip-house.ddo.jp/digital/BELUGA/index.html

  カートリッジは木製、プリント基板自作版のようです。
  松島さんの要求の元に、西田さんが回路を作成しています。


2)テープ版ベルーガ
http://p6ers.net/hashi/p6dojin.html
(FantasyWood物語の下の方)

  HashiさんのHPで、過去に通販していました。イベントでも販売していたようです。
  特攻空母ベルーガmkII のタイトルになっていますが、mk2以降で動作する、という意味のようです。


3)FD版ベルーガ
  多分、一般には出回っていないものです。SRの判定などの起動ルーチンの問題があって、それの修正をする必要があるためです。私はオフ会で購入しました。


4)初代ベルーガクローン(ばくてんさん製カートリッジ)
http://bakutendo.blog87.fc2.com/blog-entry-290.html

  ばくてんが作成した、初代ベルーガカートリッジクローンに、ベルーガのプログラムを書き込んだものになります。回路的には初代のものと同様ですが、SHIFTキーを押しながら起動するとPC-6006相当になるというものです。
  現在は頒布を終了していると思います。


5)新ベルーガ(戦士カートリッジmk2)
http://p6ers.net/hashi/p6dojin.html
(上から4番目の方)

http://p6ers.net/beluga/
(カートリッジの説明)

  HashiさんのHPで紹介されているものです。基本的にイベントで販売しています。
  ROMが512K、RAMが128K搭載されており、他のプログラムを作成する時にも役立ちます。


6)Win用ベルーガ
http://p6ers.net/hashi/beluga1.html

  松島さん作成のWindows上で動作する、8ビット風4色ベルーガです。
  エミュレータではないと思いますが...


  タイトル画面に至るまでには、それぞれの起動用プログラムが走るため、演出などがいろいろ違います。

1)初代ベルーガ:不明(多分何もなし)
2)テープ版ベルーガ:1枚絵表示+BGM
3)FD版ベルーガ:TinyProjectロゴ+ランダムで4枚中1枚絵表示
4)初代ベルーガクローン:1枚絵+MEGA SYSTEM600表示
5)新ベルーガ:TinyProjectロゴ2枚中1枚+ランダムで4枚中1枚絵表示
6)Win版ベルーガ:FOUR COLOR SYSTEM、ローレゾ25周年記念ゲームの表示

4)は間違っているかも(どのデータを頒布していたかよく知らないので)。



  で...ツイッターで気になったんですが。

  タイトル画面がバージョンによって微妙に違う(!)

  2)テープ版ベルーガ
180603_01_ベルーガCMT.png

  3)FD版ベルーガ
180603_01_ベルーガFD.png

  4)初代ベルーガクローン
180603_01_ベルーガROM.png

  5)新ベルーガ
180603_01_ベルーガ新ROM.png

  6)Win版ベルーガ
180603_01_ベルーガwin.png


  エミュレータで全部表示させました。
  P6Vか、P6VWかとか、初代機かmk2以降かの違いはありますが、基本的に2)、4)、5)は同じもののはずです。
  3)FD版と、6)WIN版ですが、タイトルがびみょーに違います。

  違う理由は、分かるような分からないような...
  私は、新ベルーガカートリッジしか関わっていないので、最近の事しか知らないのでした。

posted by えすび at 01:26| Comment(2) | SW:その他 | このブログの読者になる | 更新情報をチェックする

2018年06月02日

カートリッジ箱

  P6月間なので...(その2)

  P6で、カートリッジ端子に使うものがあります。

  正式発売されているもの(PC-6006やROMカートリッジなど)や、新ベルーガカートリッジ(戦士のカートリッジmk2)などは、そのまま挿して使って特に問題ないですが、同人ハードであるSD6031WIFや戦士のカートリッジなどは、プラスティックのケースに入っておらず、基板だけをそのまま挿して使う事になっていると思います。


  その際、

 ・コネクタに挿すのが難しい
 ・接触不良で動作しない事がある(基板が重さで下に下がってしまうため)

  という問題があります。


  ベルーガカートリッジのように、自分でアクリルを細工したりするのはかなりハードルが高いですし、ちょうどいい長さのビスを探したりするのが案外面倒だったりします。


  そこで...このアイテム、カートリッジ箱〜♪
  ↓

180602_01_カートリッジ箱表.jpg

180602_01_カートリッジ箱裏.jpg


  見た目ショボイですが、ちゃんと機能しますヨ。
  ↓

180602_01_カートリッジ箱使用例1.jpg

180602_01_カートリッジ箱使用例2.jpg

180602_01_カートリッジ箱使用例3.jpg


  ↑こんな感じで使います。


  基板により横幅が違うので、合うものを使用して下さい。

  SD6031WIFやそのクローン(ばくてんさん作)は、幅が80mmです。
  PC-6006(ROMRAMカートリッジ)の中の基板や新ベルーガカートリッジ(小さい基板)などは、幅が73mmです。


カートリッジ箱73mm_A4.pdf

カートリッジ箱73mm_B5.pdf

カートリッジ箱80mm_A5.pdf

カートリッジ箱80mm_B5.pdf


  印刷の際、100%になるように注意して下さい。
  0.5mm程度の厚さの厚紙を使用します。

  破線を山折、一点鎖線を谷折します。それぞれの折り目は、出来るだけ90度になるように折ります。

  中央部分の2本の点線に、折った部分が来るはずですので、その部分でくっつけます。

  くっつける際、糊付けでもいいのですが、ホッチキスが一番手軽です。
  ホッチキスを使う場合は、外側から留めるようにします(外に針先が出ると、使用時に外れてくる可能性あり)。


・使用法
 1)P6の電源を切ります。
 2)カートリッジ箱をカートリッジ部分に置くまで挿し込みます。
 3)溝部分に基板を入れて、そのまま本体に基板を挿します。寸法が間違ってなければ、普通に挿さるはずです。

  小さい基板を挿す場合は、必ず抜くための紐などを付けておきましょう。
  また、カートリッジ箱の抜き差しでは、P6の電源は切れないので注意して下さい。


posted by えすび at 13:31| Comment(2) | P6実機:製作・修理・改造など | このブログの読者になる | 更新情報をチェックする

2018年06月01日

NandemoP6FD(ver1リリース)

  P6月間なので...(その1)

  NandemoP6FD(Ver1.0) をリリースします。

nandemop6fd.zip


○これは何をするもの?

 PC-6001用(初代用)のテープイメージファイルをそのままフロッピーから起動させるように変換するツールです。

 Tiny野郎さんが公開されている、「なんでもメガROM」のFD版だと思ってください。
 コマンドなども同じものが使えるようにしています。

 詳細はドキュメントを参照して下さい。



 市販ソフトではディスク化できない事がありますが、PiOとかLoginとかから自分で打ち込んだソフトでは威力を発揮します。

 メモリでディスク化が難しいソフト(例えば、Quest)などもディスク化できますよ〜


 突貫で作ったので、バグがあれば知らせて下さい。

 似たようなものを他の誰かが作ってそうですが(^^;)...
posted by えすび at 22:04| Comment(0) | SW:ツール | このブログの読者になる | 更新情報をチェックする

2018年04月29日

ハイドライド3(4)(ver1.1リリース)

  ハイドライド3 for P6


  88版→P6SRへの変換ツール(ver1.1)をリリースします。


hyd3p6.zip

 ・ver1.0→ver1.1変更点
  武器のグラフィックが正常に表示されない問題を修正。
  ゲーム自体に影響はありませんが、見た目は大事という事で修正しました。

  ver1.0からのユーザデータの引き継ぎ方は、ドキュメントを参照して下さい。


  エミュレータでは、PC-6001VW ver310f、PC-6001V ver1.25 で動作を確認しています。

2018年04月27日

ハイドライド3(3)

  ハイドライド3 for P6

  追記です。ドキュメントにも一部書いている事ですが、P6版固有の事について。


 ○銀製の剣、ニベアんクリームが出現するようにしました。
 ○光の剣の出現条件をちょっと変えました。
 ○エンディング後の銀行でのミュージックテストで、オープニング、エンディングの曲を追加しました。
 ○洞窟の面で、浮遊霊、悪霊の見え方が、ヘンです。ライト範囲外なのに見えたり、ライト範囲内なのに見えなかったりします。
 ○洞窟の面は、キャラクタ移動がちょっと遅い(重い)です。88版ではテキスト画面を重ね合わせている所を、P6ではグラフィック画面で合成しているためです。
 ○フェードインもちょっと遅いです。
 ○グラフィック画面がちょっと汚いのは、機械的に変換しているためです。新しくドット打ちをすれば綺麗なんでしょうが。
 ○小さい英数字は、88版では飾り文字だったのですが、P6では4x10ドットで実現する必要があったため、新しく作成しています。飾り文字にはできませんでした。
 ○ドライブ#1にBディスク、ドライブ#2にAディスクを入れて起動すると...

2018年04月26日

ハイドライド3(2)(ver1リリース)

  ハイドライド3 for P6


  88版→P6SRへの変換ツールをリリースします。


hyd3p6.zip

  説明などは、同梱のドキュメントを参照して下さい。

  エミュレータでは、PC-6001VW ver310f、PC-6001V ver1.25 で動作を確認しています。

2018年04月14日

ハイドライド3(1)

  ハイドライド3 for P6

  やっとプログラムが終わって、実機でテストしてみたら...
  エンディングのパレットの色がおかしい結果に。

  エミュレータではおかしくなかったのですが、どうもポート0x44〜0x47の挙動が違うような感じです(詳細不明)。ポート0x44〜0x47は、ポート0x40〜0x43(パレット)のイメージだと思っていたのですが、ナゼか微妙に挙動が違います。

  面倒なので(そして意味もないので)、ポート0x44〜0x47を使わずに、0x40〜0x43を使う事にしました。

  実機である程度まで動かせたらリリースする予定です。


  ↓の機能もこっそり入れるつもりですが、PC88版では「3」の文字が乱れるんですね。P6SRでは修正しようかどうしようか迷っています。

180414_01_ハイドライド3(8).png
180414_01_ハイドライド3(9).png

2018年04月08日

P6SRの2画面切換(3)

  P6SRのグラフィック2画面切換について。

  参考プログラムを作りました。

  拡張RAMなしで動作します。エミュレータでは動作がちょっとヘンです。


sc2demo2.zip


  拡張RAMありで、ビットマップモードのものを作ろうかとも思ったのですが、面倒だったので止めました(^^;)


  内容は、画面の一部分を1/2/3/4ビット、ローテートするだけのものです。

  一応、動作説明です。

1)初期設定
2)表示ページ#0にする
3)表示ページ#0のデータをページ#1にコピーする
4)ページ#1のデータをローテートする
5)表示ページ#1にする
6)表示ページ#1のデータをページ#0にコピーする
7)ページ#0のデータをローテートする
8)2)に戻る

  表示ページと違う側に書き込みをしているので、ちらつきなどが抑えられています。

posted by えすび at 17:00| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする

2018年04月06日

次回予告(2)

  次回作ですが、オープニング、エンディングの移植も大体終わりました。

  こーんな感じです。

180406_01_ハイドライド3(7).png

  ちゃんと88版と同じようにスクロールします。


  横に1ドットスクロールするのですが、この際、初めて RRD/RLD 命令を使いました(^^;)...


P6SRの2画面切換(2)

  P6SRのグラフィック2画面切換について。

  調査した所、以下の通りでした(以下、グラフィック画面のみの話です)。


  表示切替は、ポート0xC9に、0x00/0x08 を出力します。
  0x00を出力した場合は、0x0000〜0x7FFFのVRAMの内容が表示されます。
  0x08を出力した場合は、0x0000〜0x7FFF0x8000-0xFFFFのVRAMの内容が表示されます。
  (グラフィックの場合は、bit3のみ意味を持ちます) 


  ポート0xC8のbit4-3は、以下の通りですが、画面表示には関係ありません。
  bit4:グラフィック表示ページ(0:ページ0(0x0000〜0x7FFF)/1:ページ1(0x8000〜0xFFFF))
  bit3:ビットマップモード(0:イネーブル/1:ディセーブル(直接アクセスモード))


  ポート0xC8のbit4-3は、CPUからVRAMにアクセスする際に有効となるビットで、画面表示には関係がないんですね。この辺りが、今のエミュレータでは正確に対応できていません。



  上記のことですが、画面周りのポートはBASICで管理されているので、BASICから確認するのはちょっと面倒です。例えば、以下のようにします。

 1)コマンドラインから、SCREEN 2,2,2:LINE(0,0)-(319,199),16 とします。BASICでいうページ2に斜め線が1本引かれます。

 2)MON で、マシン語モニタに入って、0xA000〜から以下の設定をします(SA000 space で入力できます)。

A000:F3 3E FB D3 C3 3E 08 D3 C9 18 FE

 3)B でBASICで戻った後、EXEC &HA000 でさっきと違うグラフィックページが表示されるはずです。

  ちなみに表示されているのは、0x8000〜0xFFFFのページです。
  実行後は、BASICに戻ってこないので、リセットして下さい(0xA000〜の内容は残っています)。

  0xA007 の 08 を 00 にすると、0x0000〜0x7FFFのページが表示されます。



続きを読む
posted by えすび at 22:58| Comment(8) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする