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関連
 SD6031/SD6031WIF用ファームウエア(ver1.12)
 SD6031Air用ファーム変更(3)
 イメージファイル選択プログラムver2.0
 SD6031コマンド一覧(1)
 SD6031コマンド一覧(2)

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

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



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

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

2019年07月30日

SD6031ファームウエアリリース(ver1.12)

  SD6031/SD6031WIF用のファームウエア(ver1.12)をリリースします。
 注)SD6031Airには使用できません。

SD6031_ver112.zip


 ・Ver1.11→Ver1.12変更点
  一部のd88ファイルが正常に認識されないのを改修。



  ある程度のテストしかしていないので、何か問題がありましたら連絡頂けると幸いです、


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

2019年07月29日

SD6031ファームウエアリリース(ver1.11)

  SD6031/SD6031WIF用のファームウエア(ver1.11)をリリースします。
 注)SD6031Airには使用できません。

 SD6031_ver111.zip


 ・Ver1.00→Ver1.10変更点(Ver1.10未公開)
  FlashAir(W-02/W-03/W-04)対応。
  D88 を入れ替えた時に、正常に読み込まない可能性があるのを修正。

 ・Ver1.10→Ver1.11変更点
  (FlashAir)拡張子を表示するようにした。



 注)FlashAirを使用して、P6の起動時のファイルを選択するためには、SD6031/SD6031WIF を改造する必要があります(1箇所パターンカット)。

  起動時のファイルを選ばなくていいのであれば、改造の必要はありません。



  FDアクセスには、ChaNさん作のぷちFatFSとサンプル用プログラムを使用しています。
  Web用のhtml、Javaスクリプトは、西田さんが SD6031Air用に開発されたものをベースに改造しています。
  フォントファイルに、Hashiさん作のP6mk2フォントを使用しています。

  それぞれの作者さんに感謝です。



  ある程度のテストしかしていないので、何か問題がありましたら連絡頂けると幸いです、
posted by えすび at 01:07| Comment(9) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

2019年07月21日

SD6031ファームウエアコマンド一覧(2)

  SD6031/SD6031WIFで扱う事が出来るコマンド一覧です(その2)。


  本来のドライブ(PC-6031/PC-80S31等)のコマンドは 0x00〜0x7f で、SD6031/SD6031WIF で新たに追加したコマンドは0x80〜0xfe になります。

従来からのコマンドは以下の通りです。

1)書き込みコマンド群

○コマンド0x01:write data
 P6→SD6031 0x01 セクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ

○コマンド0x11:high speed write data
 P6→SD6031 0x11 セクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ

○コマンド0x83:expand write data
 P6→SD6031 0x83 セクタ数 ドライブ番号 トラック番号上位 下位 セクタ番号 書き込みデータ…書き込みデータ

○コマンド0x84:expand high speed write data
 P6→SD6031 0x84 セクタ数 ドライブ番号 トラック番号上位 下位 セクタ番号 書き込みデータ…書き込みデータ

○コマンド0x86:double high speed write data
 P6→SD6031 0x86 セクタ数 ドライブ番号 トラック番号 セクタ番号 書き込みデータ…書き込みデータ

○コマンド0x87:expand double high speed write data
 P6→SD6031 0x87 セクタ数 ドライブ番号 トラック番号上位 下位 セクタ番号 書き込みデータ…書き込みデータ

  書き込みコマンドが複数存在するのは、

 ・一度に書き込むバイト数が、1バイト/2バイト/4バイト
 ・トラック番号の指定の仕方が、8ビット/16ビット

  の3通り×2通り=6通りの指定の方法があるためです。


  やる事は全て同じで、指定したセクタに対して、データを書き込みます。
  1セクタは256バイトですので、一度に256×セクタ数分のデータを書き込みます。

  複数のセクタにまたがって書き込む事は可能ですが、トラックはまたげません。


  またドライブ番号を 0x81 にした場合、EEPROMに書き込みが出来ます。
  この際、256バイト単位(=セクタ単位)でしか書き込みが出来ません。

  トラック番号がアドレス×256相当になります。セクタ番号は無視します。

 例:
 P6→SD6031 0x01 0x01 0x81 0x00 0x01 data...

  0x01(書き込みコマンド) 0x01(セクタ数) 0x81(ドライブ番号)
  0x00(トラック番号) 0x01(セクタ番号)

  の順なので、AVR内EEPROMのアドレス0x0000〜0x01FFに対して
 書き込みを行います。


○コマンド0x05:FORMAT
 P6→SD6031 0x05 ドライブ番号

  指定のドライブをフォーマットします。具体的には、データの部分を 0xFF で埋めます。このコマンドは通常の1D/1DD(2D)フォーマットのイメージファイルのみに使用してください。
  拡張子は、D88、DSK、P31 のみ有効です。それ以外はエラーを返します。



2)読み出しコマンド群

○コマンド0x02:read data
 P6→SD6031 0x02 セクタ数 ドライブ番号 トラック番号 セクタ番号

○コマンド0x85:expand read data
 P6→SD6031 0x85 セクタ数 ドライブ番号 トラック番号上位 下位 セクタ番号

○コマンド0x03:send data
 P6→SD6031 0x03
 SD6031→P6 読み出しデータ…読み出しデータ

○コマンド0x12:high speed send data
 P6→SD6031 0x12
 SD6031→P6 読み出しデータ…読み出しデータ

○コマンド0x88:double high speed send data
 P6→SD6031 0x88
 SD6031→P6 読み出しデータ…読み出しデータ

  書き込みコマンドと同じく、読み出しコマンドも指定方法により複数存在します。

  read data系で、ディスクからバッファにデータを読み出し、send data系でそのデータをP6側に転送します。


  また書き込みと同じく、ドライブ番号を 0x81 にした場合、EEPROMから読み出しが出来ます。


 例:
 P6→SD6031 0x02 0x02 0x81 0x00 0x01
 P6→SD6031 0x12
 SD6031→P6 data受信...

  0x02(読み出しコマンド) 0x02(セクタ数) 0x81(ドライブ番号)
  0x00(トラック番号) 0x01(セクタ番号)
  0x12(高速センド)

  の順なので、AVR内EEPROMのアドレス0x0000〜0x01FFの読み出しを行います。読み出しの際は、2バイト転送で行います。



3)ドライブの設定、状態の読み出し

○コマンド0x00:INITIALIZE
 P6→SD6031 0x00

  初期化コマンドです、SD6031/SD6031WIF ではエラーのクリアのみ行っています。


○コマンド0x06:COMMAND STATUS
 P6→SD6031 0x06
 SD6031→P6 STATUS情報(下記)

  STATUS情報は以下の通りです(1バイトのデータ)。
  bit7:常に1
  bit6: read data系を実行した後に1、send data系を実行した後に0
  bit5-1:常に0
  bit0:直前のコマンドがエラー時に1、エラーがなければ0


○コマンド0x07:DRIVE STATUS
 P6→SD6031:0x07
 SD6031→P6:STATUS情報(下記)

  STATUS情報は以下の通りです(1バイトのデータ)。
  bit7:常に0
  bit6:常に0
  bit5:常に1(ドライブ#1使用を示す)
  bit4:常に1(ドライブ#0使用を示す)
  bit3-0-1:常に1


○コマンド0x09:send memory
 P6→SD6031 0x09 開始アドレス上位 下位 終了アドレス上位 下位
 SD6031→P6 メモリ情報・・・メモリ情報

○コマンド0x0b:send memory 2
 P6→SD6031 0x0b アドレス上位 下位 バイト数上位 下位
 SD6031→P6 メモリ情報・・・メモリ情報

  フロッピードライブのROMの内容を読み出す命令です。
  BASIC-ROM から読み出される場合があるため、SD6031/SD6031WIF では、特定のアドレスを読み出した時に特定の値を返すようにしています。


○コマンド0x14:send device status
 P6→SD6031 0x14 ドライブ番号
 SD6031→P6 ST3

  メディアのステータス情報を返します。
  返す内容は以下の通り。

  bit7:常に0
  bit6:ライトプロテクト時1
  bit5:常に0
  bit4:常に0
  bit3:SDカード挿入時1
  bit2:常に0
  bit1-0:ドライブ番号(00 または 01)


○コマンド0x17:set surface mode
 P6→SD6031 0x17 設定情報

  1D/1DD(2D) の設定の変更を行います。
  bit7-2:未使用
  bit1:ドライブ#1の設定(0で1D、1で1DD/2D)
  bit0:ドライブ#0の設定(0で1D、1で1DD/2D)

  リセット直後は、すべてのドライブで1Dモードです。


○コマンド0x18:send surface mode
 P6→SD6031 0x18
 SD6031→P6 設定情報

  コマンド0x17 で設定した情報を読み出すコマンドです。


4)イメージファイル関連

○コマンド0x82:report disk image length
 P6→SD6031 0x82 ドライブ番号
 SD6031→P6 イメージファイル長×4(最上位から送信される)

  現在選択しているイメージファイルの長さを読み出します。メディアとして使用できる部分ではなく、実際のファイル長を読み出します。

  普通のP31フォーマット:0x000a0000
  普通のD88フォーマット:0x000552a0

  を返します。


○コマンド0xFD:get image file
 P6→SD6031 0xFD ドライブ番号
 SD6031→P6 

  0x01、ファイル#1のファイル名1バイト目…8バイト目、
  0x01、ファイル#2のファイル名1バイト目…8バイト目、
   :
  0x01、ファイル#nのファイル名1バイト目…8バイト目、
  0x00


  SDカードに格納されているイメージファイルで、現在指定している拡張子のファイルの一覧を取得します。イメージファイルの数分だけ、0x01+ファイル名(8バイト)の9バイトを順番に送信してきます。最後に0x00が送信されます。返してくるバイト数は、9×ファイル数+1 になります。P6側では、0x00 が受信されるまで読み出す必要があります。
  ファイル名は、拡張子を除いた8文字です。ファイル名が8文字未満の場合は、空白(0x20)で埋められます。


○コマンド0xFE:set image file
 P6→SD6031 0xFE ドライブ番号 ファイル名1バイト目…8バイト目

  指定したドライブ番号のイメージファイルを指定するファイルにします。ファイル名などは、get image file と同じです。


posted by えすび at 22:58| Comment(0) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

SD6031ファームウエアコマンド一覧(1)

  SD6031/SD6031WIFで扱う事が出来るコマンド一覧です(その1)。


  本来のドライブ(PC-6031/PC-80S31等)のコマンドは 0x00〜0x7f で、SD6031/SD6031WIF で新たに追加したコマンドは0x80〜0xfe になります。


今回のver1.00で削除したコマンドは以下の通り。

○コマンド0x80:SET SECTOR DATA(開始/終了セクタ番号のセット)
 P6→SD6031:0x80 ドライブ番号 開始セクタ番号 終了セクタ番号

○コマンド0x81:ASK SECTOR DATA(開始/終了セクタ番号の読み出し)
 P6→SD6031:0x81 ドライブ番号
 SD6031→P6:開始セクタ番号 終了セクタ番号



今回のver1.00から追加されたコマンドは以下の通り。

1)バージョン関連
○コマンド0xf0:read version number
 P6→SD6031 0xF0

 次の send version number を使う前に、実行します。


○コマンド0xf1:send version number
 P6→SD6031 0xF1
 SD6031→P6 バージョン番号1バイト目 2バイト目 3バイト目 機種コード1バイト目 2バイト目

  現在のバージョン番号、機種コードを返します。
  SD6031/SD6031WIF ver1.00 では、アスキーコードの "100SD" が返ってきます。

  このコマンドに先立って、前の read version number を実行する必要があります。実行していない場合はエラーになり、値を返しません。


 バージョンの読み出し手順は以下の通りです。

 コマンド 0xf1 を送信する
  ↓
 コマンド 0x06 を送信する
  ↓
 データを受信し、エラービットを確認する
  ↓
 エラーなしの場合、ver1.00 以前のバージョン。
  ↓
 コマンド 0xf0 を送信する
  ↓
 コマンド 0xf1 を送信する
  ↓
 データを受信する(5バイト)


2)イメージファイル関連

○コマンド0xf2:set file extention
 P6→SD6031 0xF2 ドライブ番号 拡張子1バイト目 2バイト目 3バイト目

  拡張子は3バイト固定で、アスキーコードで与えます。
  リセット直後は、"P31" です。

○コマンド0xf3:send file extention
 P6→SD6031 0xF3 ドライブ番号
 SD6031→P6 拡張子1バイト目 2バイト目 3バイト目

  今の拡張子を返します。


  SD6031は、設定した拡張子のファイルのみを扱います。

  拡張子を変更した時は、SDカードを新たに挿した場合と同様に扱います。
  つまり、拡張子を D88 に変更した場合は、INIT.D88 がある場合は、INIT.D88 を設定し、ない場合は 〜.D88 の中で一番新しいファイルを設定します。


  以下の拡張子を設定した場合は、特殊な動きをします。

  P31:ファイルを P31 フォーマットとして扱います(今までと同じ動きです)。

  D88:ファイルを D88 フォーマットとして扱います。
   次の条件を満たすもののみ正常に動作します。
   トラック 1D:#0〜#39(もしくは#0〜#34)/1DD:#0〜#79 が順番に抜けなく格納されている。
   セクタ#1〜#16が順番に抜けなく格納されている。
   1セクタ=256バイト。

   途中のセクタが抜けているとかセクタサイズが違うものは、正常に動作しません。


  DSK:ファイルを DSK フォーマットとして扱います。
    いわゆるディスクのベタファイルです。
    ファイルサイズが0x28000バイトの時、1D フォーマットとして扱います。
    (ドライブとディスクが食い違う時、トラック番号の調整が入ります)


  その他の拡張子の場合(例えば BIN)は、1セクタ=256バイト、1トラック=16セクタ、とした、ディスクのベタファイルとして扱います。HDDモード対応ですので、トラック数の最大は 65535 になります。


○コマンド0xfc:send image file
 P6→SD6031 0xFE ドライブ番号
 SD6031→P6 ファイル名1バイト目…ファイル名8バイト目

  現在指定されているイメージファイル名を返します。ファイル名などは、set image file と同じです。



3)EEPROM関連

○コマンド0xe0:receive EEPROM memory
 P6→SD6031 0xE0 EEPROM番号 アドレス上位 下位 サイズ上位 下位 データ、・・・


○コマンド0xe1:send EEPROM memory
 P6→SD6031 0xE0 EEPROM番号 アドレス上位 下位 サイズ上位 下位
 SD6031→P6 データ、・・・


  EEPROM番号は、0x81=AVR内EEPROMです。
  アドレスは 0x0000〜0x01FF が有効で、1バイトごとに書き込み/読み出しが可能です。


  EEPROMに対する読み書きは、ドライブ番号を 0x81 に指定する事により、通常のフロッピーへの読み書きのコマンドを使う事も可能です(後述)。


posted by えすび at 22:57| Comment(0) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

2019年07月20日

SD6031ファームウエアリリース(ver1.00)

  SD6031/SD6031WIF用のファームウエア(ver1.00)をリリースします。
 注)SD6031Airには使用できません。

  sd6031_ver100.zip

  イメージセレクタ.zip

  以前のバージョンと比べての主な変更点です。

 ○ドライブ数は2ドライブのみ対応。

 ○FAT12/16/32対応。このため、4M〜64Mバイトの SDHCが使用できます。
  (セクタサイズ=512バイトのものに限る。通常は512バイトのようです)

  ChaNさんのぷちFatFSモジュールを使用させて頂いています。
  http://elm-chan.org/fsw.html

 ○AVR内部のEEPROMに対して、読み書きすることができます。

 ○ファイルの拡張子を、〜.P31以外に、〜.D88、〜.DSK などが使用できます。
  〜.D88 を指定した場合は、通常のd88フォーマットのものに対して読み書きが可能です。
  ただし以下の制限があります。

  トラック 1D:#0〜#39(もしくは#0〜#34)/1DD:#0〜#79 が順番に抜けなく格納されている。
  セクタ#1〜#16が順番に抜けなく格納されている。
  1セクタ=256バイトのみ対応。

  〜.DSK や他の拡張子(例えば、〜.bin)を指定した場合は、ベタファイルとして扱います。

  拡張子の切り替えは、コマンドで行います。


  とりあえず、上にアップしたイメージセレクタ.zip 内の boot_d88.P31 と INIT.d88 を SDカードの D1 の下に格納します。
  同じSDカードの D1、D2 カードに、使用する 〜.d88 を格納すると、〜.P31 の時と同じように扱えるはずです。



  ある程度のテストしかしていないので、何かありましたら連絡頂けると幸いです、


  追加したコマンドなどに関しては、後ほどまとめてアップします。


posted by えすび at 19:24| Comment(0) | HW:SD6031 | このブログの読者になる | 更新情報をチェックする

2019年04月13日

ウルティマIVについて(1)

  ウルティマIV for P6

  聖者への道がやっと終わりました。
  実機でP6SR+SD6031WIFの環境で、最初からエンディングまで終わらせました。

  P6版では、以下のような問題(?)があります。


 ・移動が遅い
  特に、海や川などがあったりエネルギーフィールドを表示している場合、遅くなります。
  ゲームするのに、ぎりぎりかも知れません(^^;)

  海の上を漂っている時、どれくらい進んだか全然わからなくなったりします...


 ・ディスクアクセスが多い時がある
  88版の問題そのままなんですが、モンスターが5種類以上同時に出た場合、ディスクを読みっぱなしになります。
  移植の際に気付いたんですが、5種類以上は出ないと思ってたのでそのままにしておきました。

  アビイスの深い階で6種類とかあるんですよね...

  実機+SD6031だと、アクセスが多くてもタイムラグが少ないため、ほとんど分かりません。

ウルティマIV(ver1リリース)

  ウルティマIV for P6


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


ul4p6.zip

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

  エミュレータでは、PC-6001VW ver4.00(2018/07/21)、PC-6001VW ver310f、PC-6001V ver1.25 で動作を確認しています。

2019年02月10日

ワンダラー(2)

  ワンダラー(2)

  ログインの記事には、ディスクでは動かないように書いていますが、スタックを適切に設定するとディスクからでも起動します。

  MODE:5 FILES:0 PAGE:2 として、CLEAR100,&H8EFF としてから、0x9000〜にデータを読み込んで、EXEC &H9000 とすれば普通に起動します。

  いろいろと面倒なので、オートで起動するディスクイメージを作りました。
  ↓
wanderer_1d.zip


  起動のディスクイメージだけなので、ゲームプログラムをディスク上にセーブする必要があります。

  以下に手順の一例を記載します(テープに保存されているのが前提です)。


1)上記の wanderer.d88 をセットして、mk2などで起動する。
2)すると ??FF Error で止まる(ファイルがないので当然)。
3)テープ版をセットし、CLOAD を実行して、ローダのみを読み込む。
4)LIST 20 として、
 20 EXEC&H8F7C:END
と変更する。

5)RUN として、ローダを実行する。テープからマシン語が読み出される。
6)ロードが完了したら
 BSAVE "WANDERER",&H9000,&H6300
として、マシン語をセーブする。


 マシン語モニタでセーブしている場合は、3)〜5)を以下のようにします。

3)〜5)MON としてマシン語モニタを起動し、R-0 でテープからマシン語を読み出す。

ワンダラー(1)

  P6mk2用ゲーム「ワンダラー」について(1)

  P6NOTE No.10 の記事でもオススメゲームとして、ちょっと触れたゲームです。
  重複する部分もありますが、いろいろ調べた事を記載しました。

・掲載誌
  Login 1987年1月号P344-347(本文)、P403-409(ダンプリスト)
  ログインソフトウエアコンテスト'86の3位のようです。

・動作環境
  mk2以降で動作します。オールマシン語で0x9000〜0xF2FFです。

・ゲーム概要
  ドルアーガの塔っぽい(?)全80面のアクションパズルゲームです。
  モンスターやアイテムの出方が毎回決まっており、また、床とエレベータの使い方によってはクリアできなくなるので、ちゃんと攻略する必要があります。


○ダンプリストから入力する
  本誌の通りに入力してもいいのですが、Windows上で、スキャナ+OCRを使って
 入力する方法の一例を以下に紹介しておきます(P6NOTE 連動企画?)。

1)OCRex を使用して、スキャナのマシン語データをテキストに変換する。
  Burnout!内 http://p6ers.net/bernie/develop/ocrex.html
  この際、アドレス、チェックサムも併せて取り込むようにします。

2)チェックサムのチェックをする。
  ↓を使って下さい。
sumlogin.zip

 使い方は、
・リストの最後に、FFFF を入れる。
・コマンドラインから、
  sumlogin < 検査するファイル名
 とすると、画面に結果が表示されます。データが少なかったり最後がFFFF以外の場合は無限ループに入りますので、途中で CTRL+C で止めて下さい。

 結果をファイルに落とす場合は、
  sumlogin < 検査するファイル名 > 結果ファイル名
 とします。

3)チェック後、いらないチェックサムの部分を削除し、BINtoHEX for WIN32 でバイナリファイルに変換する。
  Burnout!内 http://p6ers.net/bernie/develop/ocrex.html
  変換時、PiOモニタ形式のテープイメージを出力する、にチェックを入れます。

4)マシン語ローダと、3)で作ったファイルを結合する。
  マシン語ローダは↓を使って下さい。
wanderer_loader.zip

  結合したものを、MODE5、PAGE2で起動して、CLOAD、RUN、でゲームが立ち上がります。

2018年12月30日

アドベンチャー(ver1.1リリース)

  アドベンチャー(Colossal Cave Adventure) for P6


  P6版の Ver1.1 をリリースします。

日本語版:adv_p6.zip
日本語版ソース:adv_p6_src.zip
英語版:adve_p6.zip
英語版ソース:adve_p6_src.zip


 ・Ver1.0 → ver1.1 変更点
  メモリ不足により、途中でゲームが止まる問題を修正。
  DEL が効かない問題を修正。
  スクロール速度を少し遅くした(日本語版のみ)。


  日本語版:mk2以上+1ドライブ+拡張カートリッジ(64K以上)が必要です。
  英語語版:mk2以上+1ドライブが必要です。

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

  エミュレータでは、PC-6001VW ver4.00(2018/10/27)、PC-6001V ver1.25 で動作を確認しています。

アドベンチャーについての問題

 アドベンチャー(Colossal Cave Adventure) for P6 について

 致命的な問題が発見されました。
 修正にちょっと時間が掛かりそうです。

2018年12月29日

AXFLAME入手

  AXFLAME(アックスフレイム)を入手しました。

181229_01_axflame.jpg

・購入まで
  12/26(水)ぐらいに発売のアナウンスがあって、すぐに通信販売を申し込もうとしました。
  ...売り切れでした。
  スタートダッシュし損ねたと思っていたんですが、店頭販売が週末だと聞いて、何で?と思ったんですが...
  売り切れじゃなくて、単にまだ発売前だったようです。
  12/28(金)の朝に購入可能になったので、すぐに購入を申し込んだら、その日の晩に発送完了となり、本日到着となりました。
  12/29(土)の13:00時点でもまだ購入可能のようです。


・カセットについて
  いろいろ問題(?)というか、ツッコミたくなる点があります。

 ○「読み込みにマイコン専用のカセットテープレコーダー以外をお使いの場合のロード不良に関しては責任を負いかねます。」と書いています。
  マイコン専用のカセットテープレコーダーって、20年以上前の機械なので、メンテをちゃんとしていないと余計に調子が悪そうです(^^;)
  うちでは、普通の(最近の)テープレーコーダーで再生していますが、特に問題ないです。

 ○操作方法に誤字があります(^^;)
  ゲーム中の「キーボード操作」の2つ目は、「ジョイスティック操作」ですね。

 ○カセットのB面に、ラベルが貼っているんだけど、録音がされていません(--;)...
  勘違いでした。ちゃんと両面録音されていました。すみません。

 ○BASIC+マシン語なんですが、マシン語のチェックサムとかがありません。
  専用ローダなので出来れば付けて欲しかったなぁ...バイト数があってたので、多分吸出し間違いはないと思うんですが。


・プログラムについて
  多分普通にディスクに落とせると思います。
  拙作の NandemoP6FD は問題なく使えるはずです。
http://sbeach.seesaa.net/article/459723670.html


・ゲームについて
  まだ全然遊べてません(^^;)

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

2018年12月24日

アドベンチャーについて

 アドベンチャー(Colossal Cave Adventure) for P6 について

 実機で動かすと、DEL が効きません。
 とりあえず、← でも1文字削除できますので、そちらを使用して下さい。

66SRの内蔵ドライブで1Dを使用する場合

 アドベンチャー英語版で、なぜかSRではセーブできない問題が発生しました。

 ディスクアクセスには、BASICのROM内ルーチンを使っていたんですが、それに問題がありました。


 結論は...

○『66SRの内蔵ドライブで』『先頭が "SYS" のディスク(=1Dフォーマット)』に対して『書き込み』が出来ない

 です。


 理由は、多分、例の1D/1DDのトラック幅の問題だと思いますが...


 テスト用のd88ファイルです→test.zip


 mk2/66などでは、書き込み/読み出しが出来ますが、66SRの内蔵ドライブでは、読み出しは出来ても、書き込みは出来ません。

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

アドベンチャー英語版(ver1リリース)

  アドベンチャー(Colossal Cave Adventure) for P6


  P6版をリリースします。

英語版:adve_p6.zip
英語版ソース:adve_p6_src.zip


  mk2以上+1ドライブが必要です。

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

  エミュレータでは、PC-6001VW ver4.00(2018/10/27)、PC-6001VW ver310f、PC-6001V ver1.25 で動作を確認しています。

2018年12月23日

アドベンチャー日本語版(ver1リリース)

  アドベンチャー(Colossal Cave Adventure) for P6


  P6版をリリースします。

日本語版:adv_p6.zip
日本語版ソース:adv_p6_src.zip


  mk2以上+1ドライブ+拡張カートリッジ(64K以上)が必要です。

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

  エミュレータでは、PC-6001VW ver4.00(2018/10/27)、PC-6001VW ver310f、PC-6001V ver1.25 で動作を確認しています。


  英語版は拡張カートリッジが不要なのですが、バグが見つかったので修正後にアップします。

2018年12月02日

画面切り替えと垂直同期検出の件(画面がちらつく問題)

 P6でキャラ描画時にちらつく問題の続きです。

 ロジアナで確認しました。
 結論ですが、いろいろと間違いが発見されました。

○mk2
★ページ切り替え(ポート0xb0)に設定した値は、垂直同期がH→Lのタイミングで反映される。
★PSGのIOA7には、垂直同期が出力されている。
 1フレーム262ラインの内、3ラインが"L"、259ラインが"H"が出力されている。

○mk2SR
★ページ切り替え(ポート0xb0)に設定した値は、即時に反映される。
★OPNのIOA7には、帰線期間が出力されている(帰線期間は"H"、描画期間は"L")。
 1フレーム262ラインの内、192ラインが"L"、70ラインが"H"(MODE2)
 1フレーム262ラインの内、200ラインが"L"、62ラインが"H"(MODE5)


 調査していませんが、66/66SRも、mk2/mk2SRと同等だと思います。
 (カスタムLSIなどが同じなので)

 特に、SRのOPNから読み出せるのが、垂直同期ではなく、帰線期間だったというのは、ちょっとびっくりです。
 (確かにちゃんと調査してませんでしたが...)


以下、調査内容の詳細です。

こんなプログラムで調査してみました。


10 REM mode2/5,page4
20 FOR J=2 TO 4
30 SCREEN3,J,J:CLS:LINE(0,0)-(319,199),J,BF
40 NEXT
1000 GOSUB 9000
1010 EXEC &HDF00
9000 AD=&HDF00
9010 READA$:IF A$="**" THEN RETURN
9020 POKEAD,VAL("&H"+A$):AD=AD+1:GOTO 9010
10100 DATAf3,31,00,df,21,e8,03,cd,2a,df,3e,00,d3,91,3e,f0
10110 DATAd3,b0,3e,ff,d3,91,21,e8,03,cd,2a,df,3e,00,d3,91
10120 DATA3e,f6,d3,b0,3e,ff,d3,91,18,da,3e,78,3d,20,fd,2b
10130 DATA7c,b5,20,f6,c9
10140 DATA**


マシン語の内容は以下の通りです。


org $df00

di
ld sp,$df00
MAINLOOP;
ld hl,1000
call W_TIME

ld a,$00
out ($91),a ; プリンタポートへ出力(デバッグ用)

ld a,$f0 ; $c000〜を表示(MODE 1-4時)SCREEN,3
; $8000〜を表示(MODE 5時)SCREEN,2
out ($b0),a

ld a,$ff
out ($91),a ; プリンタポートへ出力(デバッグ用)

ld hl,1000
call W_TIME

ld a,$00
out ($91),a ; プリンタポートへ出力(デバッグ用)

ld a,$f6 ; $a000〜を表示(MODE 1-4時)SCREEN,4
; $4000〜を表示(MODE 5時)SCREEN,3
out ($b0),a

ld a,$ff
out ($91),a ; プリンタポートへ出力(デバッグ用)

jr MAINLOOP

;
; 時間待ち(大体 2ms × HL)
;
W_TIME:
.lp1: ld a,$78
.lp2: dec a
jr nz,.lp2

dec hl
ld a,h
or l
jr nz,.lp1
ret



 プログラムは単純に違うページに違う色を付けて、ページを切り替えているだけのものです。

 ロジアナで確認したものが以下の通りです。
 信号は上から、
 トリガ(プリンタポート)
 PSG/OPNのIOA7(PSG/OPNから読み出せる値)
 VSYNC(バッファ後、外部に出力されているもの)
 HSYNC(バッファ後、外部に出力されているもの)
 R(バッファ後、外部に出力されているもの)
 G(バッファ後、外部に出力されているもの)
 B(バッファ後、外部に出力されているもの)
 H(バッファ後、外部に出力されているもの)
 です。

181202_01_mk2_mode2_1.png
 mk2 MODE2

181202_01_mk2_mode5_1.png
 mk2 MODE5


 mk2の場合、描画範囲では、MODE2/MODE5とも、すぐには画面が切り替えられずに、次のフレームで切り替わっています。

181202_01_mk2sr_mode2_1.png
 mk2SR MODE2

181202_01_mk2sr_mode5_1.png
 mk2SR MODE5


 mk2SRの場合、描画範囲では、MODE2/MODE5とも、すぐに画面が切り替わっています。
 さらに、IOA7が描画範囲では"L"になっているのが分かると思います。


 さらに、VSYNCの前後で、画面を切り替えた時に、どこで反映されるかを確認しました。

181202_01_mk2_mode2_2.png
 mk2 MODE2 VSYNC後

181202_01_mk2_mode5_2.png
 mk2 MODE5 VSYNC後

 VSYNCの後に画面切り替えを指示した場合、その次のフレームで画面が切り替わっています。


181202_01_mk2_mode2_3.png
 mk2 MODE2 VSYNC前

181202_01_mk2_mode2_3.png
 mk2 MODE5 VSYNC前


 VSYNCの前に画面切り替えを指示した場合、VSYNCを跨いだ次のフレームで画面が切り替わっています。
posted by えすび at 22:56| Comment(0) | P6解析:画面周り | このブログの読者になる | 更新情報をチェックする

2018年12月01日

ROMアニメ再生

  唐突ですが、戦士カートリッジmk2を使ったアニメ再生ソフトを作成しました。


○何が出来るか?
128x120ドットの画像を 1/ 5 秒おきに再生します。50枚 (10秒分)再生可能です。
64x 60ドットの画像を 1/15 秒おきに再生します。200枚(13.3秒分)再生可能です。
音声は再生しません。


○動作環境
実機
 本体:PC-6001mk2、PC-6601、PC-6001mk2SR、PC-6601SR のいずれか
 拡張RAM:戦士のカートリッジmk2(新ベルーガカートリッジ)

エミュレータ
 PC-6001V ver 1.25
 PC-6001VW ver4.00 (2018/10/27)


 詳しい事は同梱のドキュメントを参照して下さい。


128x120ドットの画像を 1/ 5 秒おきに再生
181201_02_romanime_128x120_f5.zip

64x 60ドットの画像を 1/15 秒おきに再生
181201_02_romanime_64x60_f15.zip


 1/15秒おきは、動画再生カートリッジと同じ再生速度です。画面小さいですが(^^;)

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

画面がちらつく問題

  P6でキャラ描画時にちらつく問題ですが、何となく理由がわかりました。
 (うちのプログラムの問題ではないので、同じ理由かどうかわかりませんが)


  ちらつきを避けるために2画面を使って以下のようなプログラムをしたとします。
  mk2以降は、垂直同期が検出できるために、それも使った場合です。


VSYNC=H→Lになるまで待つ
 ↓
画面1を表示する
画面2内で、キャラを消し、新しいキャラクタを描く
 ↓
VSYNC=H→Lになるまで待つ
 ↓
画面2を表示する
画面1内で、キャラを消し、新しいキャラクタを描く
 ↓
最初に戻る



 実際にプログラムに落とすと以下のような感じです(実際に作ったものを修正しています)。



di
; レジスタ0x07(ミキサ)の上位2ビットを設定する(B:出力、A:入力)
ld a,$07
out ($a0),a
ld a,$bf
out ($a1),a

; レジスタ0x0eから読み出す設定にする
ld a,$0e
out ($a0),a

call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ
call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ
call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ(*1)

MAINLOOP:

ld a,$f6 ; $4000〜を表示(画面2を表示)
out ($b0),a

ld de,$0000 ; $0000に描画する(画面1に描画)
call DRAWPAGE

call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ
call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ
call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ(*1)

ld a,$f4 ; $0000〜を表示(画面1を表示)
out ($b0),a ;

ld de,$4000 ; $4000に描画する(画面2に描画)
call DRAWPAGE

call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ
call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ
call WAIT_VSYNC ; 垂直同期がH→Lになるまで待つ(*1)

jp MAINLOOP


;
; 垂直同期がH→Lになるまで待つ
;
WAITVSYNC:
.lp1:
in a,($a2)
rlca
jr nc,.lp1 ; 垂直同期がHになるまで待つ
.lp2:
in a,($a2)
rlca
jr c,.lp2 ; 垂直同期がLになるまで待つ
ret




 DRAWPAGE は、データのブロック転送で、数フレーム分の時間が掛かります。

 これを実際に動かしてみると、描画画面上部の方がちらついて表示されます。
 よーく見てみると、画面が切り換わっていない感じでした。

 エミュレータではちらつきが出ません。また、SR以降でも問題なく表示されます。


 予想なのですが、理由は以下のようです。

 ポート0xb0に出力して表示ページを変更しています。
 これが即時に変更されるのではなく、垂直同期がH→Lになった時に変更されているようです。

 プログラムでは、垂直同期がH→Lを検出して表示ページを変更しているので、結局1フレーム後に表示ページが変更されてしまっているようです。

 ロジアナを使ってちゃんと確認しないといけないんですが...そのうちに(^^;)


 上記プログラムの(*1)の部分を、下記のように、『垂直同期がH→Lのちょっと前』のタイミングを検出する事で、ちらつきがなくなりました。

 他のプログラムで同様の事をする場合、どのようにするのがベストかは考える必要があります。


 (*1)の call WAIT_VSYNC を、call WAIT_flrame として、以下のように変更。



;
; 描画範囲分待つ
; VSYNC が H→L から、大体描画範囲が終わるぐらいまで待つ
;
; VSYNC:H→L(ライン#0)
; 描画範囲:ライン#33〜#232
;
; ライン# 0〜# 32:912clk@14.32MHz
; ライン#33〜#232:176clk@14.32MHz
;
; 合計:33x912+200x176 = 65296clk@14.32MHz = 18239clk@4MHz
;
WAIT_flame:
push af
push bc

ld bc,345
.lp1:
push bc ; 11+1 / 12
pop bc ; 10+1 / 23
dec bc ; 6+1 / 30
ld a,b ; 4+1 / 35
or c ; 4+1 / 40
jr nz,.lp1 ; 12+1 / 53

pop bc
pop af
ret





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