2040年01月01日

目次

 元々はPC-6001をFPGAで実現しよう、のページだったのですが、P6のハード/ソフト関連全般を扱っています。

 当ブログ内の解析記事、製作記事、改造記事などに関しては、素人によるものです。記事が誤っている可能

性もありますので、使用する際には使用する方の責任でお願いします(当方では責任を持ちません)。


 PC-6001F(FPGA版P6)関連
 Ver.0235-0053
 Ver.0234-0052

 RGBコンバータ関連
 RGBコンバータ(10)(リリース)
 RGBコンバータ(11)(リリース)
 RGBコンバータ(1版の注意事項)

 SD6031/SD6031WIF/SD6031Air関連
 SD6031Air用ファーム変更(3)
 イメージファイル選択プログラムver2.0
 マルチディスク対応
 マルチディスク対応追記
 SD6031コマンド一覧

 88→P6変換ソフト関連
 上海
 ハイドライド3
 ウィザードリィ1/2/3  /  ウィザードリィ4  /  ウィザードリィ5
 PALADIN
 MELT DOWN  /  MELT DOWN(PC-6001mk2/PC-6601用)
 魔法使いの妹子  /  魔法使いの妹子U
 ザナドゥ  /  ザナドゥユーザデータコピー
 ファンタジー  /  ファンタジー2
 マイトアンドマジック
 イシターの復活
 ポッキー
 リトルバンパイア  /  イントルーダー  /  ランス  /  D.P.S.  /  あぶない天狗伝説
 OLION80
 ログイン版ドラゴンスレイヤー
 表参道アドベンチャー

 P6ソフト関連
 CARRYGAME改造
 CARRYGAME でばぐ
 OLION 2トリガ化
 QUEST ディスク起動
 66用ロードランナーの外付けドライブ起動
 66用コロニーオデッセイをmk2などで動かす
 XOR でばぐ
 HEARTMONS でばぐ
 アステロイドチューブ でばぐ
 南青山アドベンチャー カラー化

 その他の記事は、カテゴリーから検索して下さい。

posted by えすび at 00:00| Comment(0) | カテゴリ無し | このブログの読者になる | 更新情報をチェックする

2018年06月21日

ボツゲーム3(PUZZLE BOY)

  P6月間特別企画〜♪(その21)

  過去にゲームボーイから移植して、ボツにしたものを紹介しています。
  その3は PUZZLE BOY です。

pboyp6.zip


  開発を中止している案件なので、基本的にバク改修などの対応は行いません。


  ↓スクリーンショット
180621_01_PUZZLEBOY1.png
180621_01_PUZZLEBOY2.png
180621_01_PUZZLEBOY3.png
180621_01_PUZZLEBOY4.png

  パズルゲームです。それなりに遊べます。
  以下の点に問題があります。

 ・音が鳴らない
 ・一部のキャラが消えない/消える
 ・ちょっと遅い?
 ・ふたりでたいせん、はできません
 ・ひとりでトライアル、をクリア時のスクロール画面が実装されていません(自キャラが空を飛ぶみたいになっている)。


  音が鳴れば、リリースしてもいいかも、という出来ですが...

2018年06月20日

ボツゲーム2(ソロモンズ倶楽部)

  P6月間特別企画〜♪(その20)

  過去にゲームボーイから移植して、ボツにしたものを紹介しています。
  その2はソロモンズ倶楽部です。

solcp6.zip


  開発を中止している案件なので、基本的にバク改修などの対応は行いません。


  ↓スクリーンショット

180620_01_ソロモンズ倶楽部1.png
180620_01_ソロモンズ倶楽部2.png
180620_01_ソロモンズ倶楽部3.png
180620_01_ソロモンズ倶楽部4.png


  画面を見る限り面白そうなんですが...(ゲームボーイ版はよく出来たゲームです)
  以下の点に問題があります。

 ・音が鳴らない
 ・一部のキャラが消えない/消える
 ・遅い、じゃなくてすごく遅い
 ・ゲーム中のメニュー表示がされない


  スピードを上げるには、今のやり方ではダメっぽいですねぇ...

2018年06月19日

ボツゲーム1(パズニック)

  P6月間特別企画〜♪(その19)

  今日から、過去にゲームボーイから移植して、ボツにしたものを紹介します。

  その1はパズニックです。

pzncp6.zip


  開発を中止している案件なので、基本的にバク改修などの対応は行いません。


  ↓スクリーンショット

180619_01_パズニック1.png
180619_01_パズニック2.png
180619_01_パズニック3.png


  画面がちょっと地味ですが、一応ちゃんと遊べます。周りの色がどぎついのは、デバッグ用のためです。

  ただし、以下の点に問題があります。

 ・音が鳴らない
 ・一部のキャラが消えない/消える
 ・遅い



  ゲームボーイからの移植は結構試したんですが、今の所全滅です。
 ・音を鳴らす事のハードルが結構高い
 ・スクロールを実現するのが難しい
 ・セル表示/背景表示を実現するのに、CPUパワーをかなり使う
 ・VSYNC単位で動作しているため、予期せぬバグが発生する事がある


  ゲームによっては、移植しても遊べそうなものもあるんですが、音を鳴らすハードルをまだクリアできていません。


2018年06月18日

動画再生基板

  P6月間企画(その18)

 注意)今の所、動画再生基板は、PC-6001mk2/PC-6601でのみ動作します。初代機、PC-6001mk2SR、PC-6601SRでは動作しません。関連記事は、右メニューのカテゴリー別アーカイブの、『HW:動画再生』を見て下さい。


  私がだーいぶ前に作った、動画再生カートリッジの基板を、ばくてんさんが作成したとの事なので、早速入手しました。
  (無理言って、生基板を頂きました。)

  早速部品を実行して動かしてみました。多分、頒布される基板と、部品は微妙に違うと思います。

  特に、DE0-nano を挿しているコネクタの高さがちょっと低いために、表面に実装するコイルとコンデンサを裏側に回す必要がありました。
  また、DC供給のコネクタも手持ちの部品を改造して使っています。

  ↓出来上がりはこんな感じです。

  基板表面
180618_01_動画再生基板表.jpg

  基板裏面
180618_01_動画再生基板裏.jpg

  DE0-nanoを装着した所
180618_01_動画再生基板表2.jpg

  基板横のDC供給コネクタ(リード線を圧着して使うコネクタを改造しています)
180618_01_動画再生基板DCコネクタ.jpg

  DE0-nanoの下のSDカードコネクタ(ぎりぎりです)
180618_01_動画再生基板SDカード.jpg

  PC-6001mk2に実装した所(カートリッジ箱がさっそく役に立っています)
180618_01_動画再生基板装着.jpg


  動作時のスクリーンショット
180618_01_動画再生1.jpg
180618_01_動画再生2.jpg


  このスクリーンショットだと、動画かどうか分からないですね...


posted by えすび at 21:00| Comment(3) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2018年06月17日

SR画面周り(8)

  P6月間企画(その17)

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

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


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

4)ビットマップモード

 『Y座標をポート0xCE、X座標をアドレスで指定』する事で、指定のXY座標の位置にドットを描く』のは、横320ドットの場合ですが、この回路をそのまま横640ドットの場合にも使っているために、分かりにくい動作になっています。

 VRAMアドレスを示す時に4バイト単位で見ましたが、その4バイト単位で同じ回路を使って、横320ドットと横640ドットの表示がされているようです。


180617_01_ビットマップアクセス320.png

 横320ドットの場合、上図の1ドット単位でアクセスが出来るように、ビットマップモード用変換回路が動作します。
 X座標とY座標を個別に指定し、図内の太線四角枠が一度に指定するドットになります。横320ドットの場合は、一度に指定するドットは1ドットです。


 同じ回路を使うため、横640ドットのビットマップモードで、一度に指定するドットは下図のようになります。

180617_01_ビットマップアクセス640.png


 図内の太線四角枠が一度に指定するドットになります。横640ドットの場合は、一度に指定するドットは、B/Rプレーンのいずれかの4ドットです。
 つまり、2回指定しないと4ドットの色を全部決める事はできませんし、1ドット単位で設定する事はできません。

 さらに、枠内の(0,0)などは指定する時のXY座標です。Y座標は実際のY座標と一致するのですが、X座標は一致しません。

 実際の座標(x,y)、指定座標(X,Y) とすると、以下の通りになります。

 X,Y = 0,0 の時、x = 4〜 7, y = 0 のプレーンB
 X,Y = 1,0 の時、x = 0〜 3, y = 0 のプレーンB
 X,Y = 2,0 の時、x = 4〜 7, y = 0 のプレーンR
 X,Y = 3,0 の時、x = 0〜 3, y = 0 のプレーンR
 X,Y = 0,1 の時、x = 4〜 7, y = 1 のプレーンB
 X,Y = 1,1 の時、x = 0〜 3, y = 1 のプレーンB
 X,Y = 2,1 の時、x = 4〜 7, y = 1 のプレーンR
 X,Y = 3,1 の時、x = 0〜 3, y = 1 のプレーンR

 X,Y = 4,0 の時、x = 12〜15, y = 0 のプレーンB
 X,Y = 5,0 の時、x = 8〜11, y = 0 のプレーンB
 X,Y = 6,0 の時、x = 12〜15, y = 0 のプレーンR
 X,Y = 7,0 の時、x = 8〜11, y = 0 のプレーンR
 X,Y = 4,1 の時、x = 12〜15, y = 1 のプレーンB
 X,Y = 5,1 の時、x = 8〜11, y = 1 のプレーンB
 X,Y = 6,1 の時、x = 12〜15, y = 1 のプレーンR
 X,Y = 7,1 の時、x = 8〜11, y = 1 のプレーンR
  :
 以下同様です。

 一般化すると、

 指定座標(X,Y) (ただし、X=4*n n=0,1,2,…,159)の時

 X+0,Y の時、x = X*2+4 〜X*2+7, y = Y のプレーンB
 X+1,Y の時、x = X*2+0 〜X*2+3, y = Y のプレーンB
 X+2,Y の時、x = X*2+4 〜X*2+7, y = Y のプレーンR
 X+3,Y の時、x = X*2+0 〜X*2+3, y = Y のプレーンR

 となります。

 横640ドットなのですが、実際にX座標に指定する値は、0〜319という事になります。


5)ビットマップモードで
・Y座標の設定を204以上にした場合はどうなる?
・X座標の設定を320以上にした場合はどうなる?

 横320ドットと同じです。


6)ビットマップモードで
・ポート0xC8のビット3でイネーブル/ディセーブルの切換だけど、ビット4のビットマップページ指定との関係は?
・メモリ割り当てと同時に使うとどうなる?
・そもそもビットマップモードとは?

 横320ドットと同じです。


7)それぞれのモードの利点

 基本的に横320ドットと同じなのですが、ビットマップモードの利点である『ドット単位で扱える』事がなくなっており、さらに、直接アクセスモードの方が分かりやすくなっています。

 あくまでも横320ドットが基本で、横640ドットは付け足しのような印象です。


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

2018年06月16日

SR画面周り(7)

  P6月間企画(その16)

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

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


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

1)縦ドット数について
2)ビットマップモード、直接アクセスモードについて

 横320ドットと同じです。


3)VRAMアドレス(直接アクセスモード)

 横640ドットの場合、1ドット=2ビットで、1バイトに4ドット収容されます。

 ビット順は、
 1バイト目:b7-0 = B7 B6 B5 B4 B3 B2 B1 B0
 2バイト目:b7-0 = R7 R6 R5 R4 R3 R2 R1 R0
 です。

 HとRは、ポート0xC0で指定され、bit1:CSS2 =H、bit0:CSS1 =G、になります(CSS3=0時)。

 ですが...CSS3=0、CSS2=1、CSS1=1、で使うべきです。

 この組み合わせの場合、HGRB=1100、1101、1110、1111、の4色が出力されますが、これは全てパレットで変換できる色に当たります。そのため、16色中任意の4色を出力できる設定になります。


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


 X,Y = 0,0 は、0x1A00、0x1A01 のbit7
 X,Y = 1,0 は、0x1A00、0x1A01 のbit6
 X,Y = 2,0 は、0x1A00、0x1A01 のbit5
 X,Y = 3,0 は、0x1A00、0x1A01 のbit4
 X,Y = 4,0 は、0x1A00、0x1A01 のbit3
 X,Y = 5,0 は、0x1A00、0x1A01 のbit2
 X,Y = 6,0 は、0x1A00、0x1A01 のbit1
 X,Y = 7,0 は、0x1A00、0x1A01 のbit0
 X,Y = 0,1 は、0x1A02、0x1A03 のbit7
 X,Y = 1,1 は、0x1A02、0x1A03 のbit6
 X,Y = 2,1 は、0x1A02、0x1A03 のbit5
 X,Y = 3,1 は、0x1A02、0x1A03 のbit4
 X,Y = 4,1 は、0x1A02、0x1A03 のbit3
 X,Y = 5,1 は、0x1A02、0x1A03 のbit2
 X,Y = 6,1 は、0x1A02、0x1A03 のbit1
 X,Y = 7,1 は、0x1A02、0x1A03 のbit0

 X,Y = 0,2 は、0x1A04、0x1A05 のbit7
 X,Y = 1,2 は、0x1A04、0x1A05 のbit6
 X,Y = 2,2 は、0x1A04、0x1A05 のbit5
 X,Y = 3,2 は、0x1A04、0x1A05 のbit4
 X,Y = 4,2 は、0x1A04、0x1A05 のbit3
 X,Y = 5,2 は、0x1A04、0x1A05 のbit2
 X,Y = 6,2 は、0x1A04、0x1A05 のbit1
 X,Y = 7,2 は、0x1A04、0x1A05 のbit0
 X,Y = 0,3 は、0x1A06、0x1A07 のbit7
 X,Y = 1,3 は、0x1A06、0x1A07 のbit6
 X,Y = 2,3 は、0x1A06、0x1A07 のbit5
 X,Y = 3,3 は、0x1A06、0x1A07 のbit4
 X,Y = 4,3 は、0x1A06、0x1A07 のbit3
 X,Y = 5,3 は、0x1A06、0x1A07 のbit2
 X,Y = 6,3 は、0x1A06、0x1A07 のbit1
 X,Y = 7,3 は、0x1A06、0x1A07 のbit0
  :

 以下省略しますが、4バイト単位(横320ドット時8ドット単位、横640ドット時16ドット単位)で見ると、アドレシングは横320ドットと同じになります。


 つまり

 横640ドット:X = 8*m, Y = 2*n
 横320ドット:x = 4*m, Y = 2*n

 が同じアドレスになります。


 例えば、

 横640ドット X,Y = 0,0
 横320ドット x,y = 0,0

 横640ドット X,Y = 0,202
 横320ドット x,y = 0,202

 横640ドット X,Y = 624,0
 横320ドット x,y = 312,0

 横640ドット X,Y = 624,202
 横320ドット x,y = 312,202

 などです。


 4バイト単位に関して、それぞれのモードを図示すると、以下のようになります。


180616_01_VRAM640.png

 横640ドットの場合は、VRAMメモリの状態がそのままXY座標になるので理解しやすいのですが...


180616_01_VRAM320.png

 横320ドットの場合は、VRAMメモリの状態とXY座標が入れ替わったりするので、直感的に理解しにくいです。

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

2018年06月15日

SR画面周り(6)

  P6月間企画(その15)

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

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


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

7)それぞれのモードの利点

○一度にアクセスするビット数が多い(直接アクセスモード)
 画面の描画をする際に、1命令で1ドット描く(ビットマップモード)か、2ドット描く(直接アクセスモード)の違いです。単純に2倍の速さが可能になります。

○ドット単位で扱える(ビットマップモード)
 背景絵+キャラクタなどの重ね合わせ処理などが容易に出来るのがビットマップモードです。
 (多分、これがビットマップモードの本来の目的だと思われます)
 直接アクセスモードの場合は、一度VRAMの内容を読み出して、ANDを取ってORを取る、という処理が必要になります。

○アドレス計算がし易い(ビットマップモード)
 XY座標で指定できるビットマップモードに比べて、アドレスが不連続かつ難解な直接アクセスモードでは、目的の場所を算出するのも大変だったりします。

○アドレス空間が狭い(ビットマップモード)
 X座標は、通常0〜319の範囲で指定します。

 そのため、CPUから見たアドレス空間としては、せいぜい0〜511(0x0000〜0x01FF)だけをVRAMアドレスとして割り当てればいい事になります。
 一方、直接アクセスモードでは、0x0000〜0x7FFFのアドレス空間を消費してします。

 さらに、リード/ライト割り当て設定を使えば、もっと便利なものになります。


 例えば、通常のSR-BASICの状態は

リード:
 0x0000〜0x7FFF:BASIC-ROM
 0x8000〜0x9FFF:RAM(0x8000〜0x9FFF)
 0xA000〜0xBFFF:RAM(0xA000〜0xBFFF)
 0xC000〜0xDFFF:RAM(0xC000〜0xDFFF)
 0xE000〜0xFFFF:RAM(0xE000〜0xFFFF)

ライト:
 0x0000〜0x7FFF:RAM(0x0000〜0x7FFF)
 0x8000〜0x9FFF:RAM(0x8000〜0x9FFF)
 0xA000〜0xBFFF:RAM(0xA000〜0xBFFF)
 0xC000〜0xDFFF:RAM(0xC000〜0xDFFF)
 0xE000〜0xFFFF:RAM(0xE000〜0xFFFF)

 ですが、


リード:
 0xC000〜0xDFFF:RAM(0x0000〜0x1FFFを割り当てる)

ライト:
 0xC000〜0xDFFF:RAM(0x0000〜0x1FFFを割り当てる)


 とすると、BASIC-ROMは見えた状態で、VRAMにアクセスする事が出来ます。これにより、割り込み禁止をせずに、画面描画が可能になります。
 あ、当然、0xC000〜0xDFFFに本来あるRAMには、このままではアクセスできませんよ。


 利点が多いビットマップモードですが、速度を上げるために直接アクセスモードを使う事も多々あります。88版のソフトからの移植では、片方だけでなく両方のモードを使う事がほとんどです。


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

2018年06月14日

SR画面周り(5)

  P6月間企画(その14)

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

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


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

5)ビットマップモードで
・Y座標の設定を204以上にした場合はどうなる?
・X座標の設定を320以上にした場合はどうなる?

 実機でプログラムを組んでみて、調査しました。
 VRAMを全面0x00クリアした後に、XY座標を指定して描画し、VRAMのどこにセットされるかを見ています。

bitmap.zip


 結果をまとめると以下の通りです。

 X座標:
  下位10ビットのみ演算対象
  0x0000〜0x013F(=319)の時は、そのまま
  0x0140〜0x027F(=639)の時は、0x0140(=320)を引いた値で算出
  0x0280〜0x03FF の時は、演算結果が信用できない

  下位10ビットのみ演算対象のため、0x0400〜0x7FFFは上記0x0000〜0x03FFのイメージが出力されます。


 Y座標:
  下位9ビットのみ演算対象
  0x0000〜0x00CB(=203)の時は、そのまま
  0x00CC〜0x0197(=407) の時は、0x00CC(=204)を引いた値で算出
  0x0198〜0x01FF の時は、演算結果が信用できない

  下位9ビットのみ演算対象のため、0x0200〜0x7FFFは上記0x0000〜0x01FFのイメージが出力されます。


  通常は、範囲外を超えた設定を行わないと思います。しかし、この範囲外を超えた設定の時に、X座標は320、Y座標は204を引かれる処理は、プログラムで有効に使う事ができます。


  例えば、8x8のキャラクタ描画ルーチンを作る場合...

================================

ld hl,PATTERN ; パターン先頭
ld de,XADD ; X座標先頭
ld (.xpt+1),XADD

ld c,YADD ; Y座標先頭
ld b,8
.lp1:
push bc
ld a,c
out (0xCE),a

.xpt: ld de,0x0000
ldi
ldi
ldi
ldi
ldi
ldi
ldi
ldi

pop bc
inc c
djnz .lp1

================================

  こんな感じだと思います。

  通常の320x204で表示する場合は、X=0〜311、Y=0〜195 を指定すれば、画面全体にキャラクタを表示する事ができます。しかし、スクロールなどをしている場合は、X=311→X=0や、Y=203→Y=0のラインをまたぐようなキャラクタを描画する必要がありますよね?

  この場合に、上のようなプログラムで、X=0〜319、Y=0〜203を指定するだけで、場合分けをせずに描画が可能になります。これは、上のプログラム実行の途中に、X座標が320以上、Y座標が204以上になっても、X座標は320、Y座標は204を引かれる処理が行われているからです。


 注意)X座標が320以上、Y座標が204以上 は、エミュレータでは同じ動作をするかどうかはわかりません。



6)ビットマップモードで
・ポート0xC8のビット3でイネーブル/ディセーブルの切換だけど、ビット4のビットマップページ指定との関係は?
・メモリ割り当てと同時に使うとどうなる?
・そもそもビットマップモードとは?


 まず、VRAMとは、から。

 SRモードでのVRAMとは、0x0000〜0x7FFF(ページ0)、0x8000〜0xFFFF(ページ1)のアドレスを持っており、設定されているメモリの内容を画面に描くものです。

 ここで挙げている、0x0000〜0x7FFF、0x8000〜0xFFFF、というアドレスですが、SRの場合は直接CPUアドレスと繋がっていません。初代/mk2/66の場合は、直接CPUアドレスと繋がっているので、ややこしくないんですが...

 ビットマップモードの正体は、『ポート0xCE、0xCFの値(=Y座標)と、与えられたアドレス(=X座標)から、VRAMアドレスを算出する変換回路』です。

 直接アクセスモードの時は、この変換回路を使わずに、与えられたアドレス=VRAMアドレスになります。


 さらに、CPUから与えられるアドレスは、ポート0x60〜0x6Fのリード/ライト割り当て設定により変換されます。

 図に描くとこんな感じです。

180614_01_ビットマップモード.png


 CPUから与えられたアドレスは、まずリード/ライト割り当て設定で変換され、その後にビットマップモードで変換されます。直接アクセスモードの時は、リード/ライト割り当て設定のみで変換されます。


 また、ポート0xC8は、

 bit4:ビットマップページ指定(0:ページ0(0x0000〜0x7FFF)/1:ページ1(0x8000〜0xFFFF))
 bit3:ビットマップモード(0:イネーブル/1:ディセーブル(直接アクセスモード))

 なのですが、

 bit4=0、bit3=0 の時、ページ0(0x0000〜0x7FFF)にアクセスする時に、ビットマップモードで変換される
 bit4=1、bit3=0 の時、ページ1(0x8000〜0xFFFF)にアクセスする時に、ビットマップモードで変換される
 bit4=0、bit3=1 の時、直接アクセスモードなので、変換されない
 bit4=1、bit3=1 の時、直接アクセスモードなので、変換されない

 です。

 このビットマップモードの変換回路は1つしかないため、bit4を変更すると変換の対象も変更されます。

 bit4=0、bit3=0 を設定した後に、bit4=1、bit3=0 を設定すると、ページ0、ページ1ともビットマップモードになりそうなんですが、変換回路が一つしかないため、後に設定したページ1のみがビットマップモードになります。


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

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:その他 | このブログの読者になる | 更新情報をチェックする