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年07月01日

動作速度算出(4)のおまけ

  ↑の記事のおまけ。

  SRで、バスリクエストOFFにして、速くなるかを確認してみました。

test3p6sr.zip


  test3p6 から、BASICの75行を足しただけです。

  やっぱりSRは速いです。

  SRのWAIT関連もちゃんと調べないとなぁ...
posted by えすび at 23:14| Comment(0) | P6解析:CPU周り | このブログの読者になる | 更新情報をチェックする

動作速度算出(4)

  P6月間特別企画...居残り

  処理時間を求める、の続きです。

5.スクロールの速度を上げる
  処理時間を求める事と直接は関係ないですが...

  画面スクロールの処理速度は、

  メモリ読み出し→メモリ書き込み→ポインタを進める

  が一連の流れで、この部分をどれだけ高速に出来るかになります。


  最初のLDIRバージョンでは、1バイト当たり、23クロック
  次のLDIバージョンでは、1バイト当たり、18クロック

  です。


  今のままでは、結構限界に近い速度です。

  私が思いついたのは以下の2つです。


 1)M1サイクル時のWAIT挿入を止める

  通常では本体改造をしない限り、M1サイクルのWAIT挿入を止める事ができません。

  ですが、外部RAM(拡張RAMパック)に関しては、M1サイクルのWAITを挿入しても動くようです。

  新しいRAMだけでなく、当時のPC-6006などで試しても問題なく動作しました。

  これで、1バイト当たり、16クロックです。

180701_01_TESTasm3.png



 2)PUSH-POPを使い、さらに力技にする

  PUSH/POP命令はメモリアクセスに関しては最速です。
  ただ、自由に書き込み/読みだし位置(SP)を操れないので、その辺りで悩んだ結果、力技にしました(^^;)

  1)のM1サイクルWAIT挿入なしとも併せて、1バイト当たり、12.5クロックになっています。

180701_01_TESTasm4.png



  ↓これまでのを合わせたプログラムです。ちょっと読みにくいプログラムになってしまいましたが。

test3p6.zip


  0:(23clk/1byte)LDIR
  1:(18clk/1byte)LDI
  2:(16clk/1byte)M1時、WAIT挿入なし
  3:(12.5clk/1byte)PUSH-POP

  で、0〜3を繰り返し実行します。

  途中でSTOPキーを押した時は、PAGEキーを押すと元に戻ります。
  80行でFOR-NEXTしていますので、適当に修正してみて下さい。


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

2018年06月30日

動作速度算出(3)

  P6月間特別企画(その30)

  処理時間を求める、の続きです。


 4.実際に処理時間を求めてみる

  まず各命令のサイクル数を横に書いてみます。

180630_01_TESTasm1.png


  ループ/分岐/サブルーチンコールがあるので、それを考慮してサイクル数を算出します。


 ・10〜24行目まで、DJNZでループするので、96回繰り返しになる。
  CALL先以外の合計サイクル数 = 132
  → 132x96 = 12672

 ・25行目のDJNZは、95回ジャンプ、1回スルー
  → 14x95+9 = 1339

 ・34行目のLDIRは、31回ジャンプ、1回スルー
  → 23x31+18 = 731

 ・37行目のLDIRは、6111回ジャンプ、1回スルー
  → 23x6111+18 = 140571

 ・42行目のLDIRは、31回ジャンプ、1回スルー
  → 23x31+18 = 731

 ・31行から44行までのサイクル数の合計
  → 142122

 ・1行目〜27行目までのサイクル数の合計
  → 13+12672+1339+16+142122*96*2 = 27301464


  MODE2なので、平均クロックは 1.96MHz

  処理時間は、27301464 * 1 / 1.96MHz = 13.929s


  128x192のSCREEN3の画面を1ドットずつスクロールさせるだけなんですが、1画面分スクロールするのに大体14秒かかります。

  サイクル数の計算は結構面倒なのですが、大抵は繰り返し数が多い所だけの概算で事足ります。



  ちょっと遅いので、速くなる工夫をしてみます。

  38行の LDIR の部分が少ないサイクル数で動かすと速くなるので、こんな感じ↓に変更してみます。
 (CPY_LDIRの中身のみを変更)

180630_01_TESTasm2.png


  LDIR → LDI×32 に展開しています。
  この変更で、通常は1バイト当たり、23クロック掛かっていたのが、18 + 0.34 クロックで済みます。
  LDIの個数を多くすると、+0.34クロックの部分を減らす事が出来ます。


  二つのプログラムを連続するものを作りました↓
  目に見えて速度が違うと思います。

test2p6.zip


  mk2以降で test2_p6.d88 をセットして起動させて下さい。
  画像データは、前回と同じ、Hashiさんの所のデータを使用させて頂きました。感謝です>Hashiさん


  さらに速度を上げるには...いろいろ考えましたが、まだ出来そうですが........

  続きます(^^;)


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

2018年06月29日

動作速度算出(2)

  P6月間特別企画(その29)

  処理時間を求める、の続きです。


 3.各命令の実行時間とM1サイクル
  それぞれの命令に掛かる時間は、命令ごとによって違います。Z80 のドキュメントを参考にします。

  Z80 USER MANUAL で検索すると、Zilog社のpdfファイルが見つかると思います。

http://www.zilog.com/appnotes_download.php?FromPage=DirectLink&dn=UM0080&ft=User%20Manual&f=YUhSMGNEb3ZMM2QzZHk1NmFXeHZaeTVqYjIwdlpHOWpjeTk2T0RBdlZVMHdNRGd3TG5Ca1pnPT0=

  それぞれの命令の説明の、T states(ステート数)というのが、その命令を実行するのに掛かるクロック数です。
  一番短いクロックは、4クロック(LD A,B や NOP など)です。

  T states(ステート数)は、それぞれの命令について全部明記されているので、それを合計していけば全体の処理クロック数になる...といいのですが、P6の場合、さらに M1サイクルを考慮する必要があります。なぜ M1サイクルを考慮する必要があるかというと、P6では M1サイクルに 1WAIT 挿入されるからです。


  Z80が命令を処理する際、

  オペコードを読み込む(M1サイクル)
  メモリから読み出す (M2サイクル)
  メモリに書き込む  (M3サイクル)

  の順序で処理が行われます。

  M2、M3サイクルは、命令によっては存在しないのですが、M1サイクルは全ての命令に存在します。
  ややこしい事に、命令によってはM1サイクルが1命令内で2つあるものがあります。

  オペコードで表した時に、0xCB、0xED、0xDD、0xFD で始まる命令は、M1サイクルが2つあります。

  0xCB:ビット演算系
  0xED:Z80で拡張された命令
  0xDD:IX系
  0xFD:IX系


  『M1サイクルに 1WAIT 挿入』というのは、M1サイクル時にメモリから読み出す際に、1クロック分の待ち時間を挿入するという意味です。WAIT(待ち時間)の挿入というのは、CPUに対してメモリ動作が遅いために取られている処置です。

  WAITが挿入されるのは以下の通りです。

 ○初代機:
  M1サイクルで、1WAIT
  ROM領域(0x0000〜0x7FFF)へのメモリリード/ライトで、1WAIT

 ○mk2/66:
  ポート0xF3:bit7-5の設定に従う。

  ポート0xF3:bit7:M1 サイクルでのWAIT (0:OFF 1:ON)
  ポート0xF3:bit6:ROMブロックでのWAIT (0:OFF 1:ON)
  ポート0xF3:bit5:RAMブロックでのWAIT (0:OFF 1:ON)
 (bit4-0は割り込み関連の設定)

  デフォルトは 0xC2 で、M1サイクルとROM領域のみ、1WAIT挿入されます(初代機と同じ)。


  WAIT挿入を無くせればCPUの動作が速くなるのですが、やっかいな事に普通ではこのWAIT挿入を無くす事が出来ません。

  詳しくはこちらを参照して下さい→http://sbeach.seesaa.net/article/387861448.html


  結局、通常はM1サイクルが1or2あるものとして計算する事になります。


  例えば、

  LD A,B :ステート数が4なので、4+1クロック
  ADC HL,HL:ステート数が15で 0xED から始まるので、15+2クロック

  という感じで計算できます。


  まだ続きます。


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

2018年06月28日

動作速度算出(1)

  P6月間特別企画(その28)

 問題です。

○次のプログラムは何をするものでしょう?(MODE=2/4、PAGE=4)


180628_01_TESTasm.png


  答えは...実際に動かしてみて下さい。実際に動く形にしたものが↓です。

testp6.zip

  画像データも必要なので、FDで動作させるようにしました。
  mk2以降で test_p6.d88 をセットして起動させて下さい。

  画像データは、Hashiさんの所のデータを使用させて頂きました。感謝です>Hashiさん


  では、本題です。

○上のプログラムを1度動かした場合、どれくらいの時間が掛かるでしょうか?


  という問題を答えるために、動作速度の計算が出来る必要があります。
  P6で、動作速度について言及しているものを見たことがないような気がして、とりあえずまとめてみる事にしました。


(注意)
 今回は、初代/mk2/66について、になります。
 mk2SR/66SR に関しては、ちゃんと調査できていないので、また後日にまとめる事にします。
 ただ、mk2SR/66SR 上で、MODE=1〜5で動作させる場合は、初期設定時では初代/mk2/66と同等の速度になるように設計されていますので、参考になるかと思います。


  プログラムのある処理がどれだけの時間が掛かるかを算出するためには、

 ・CPUの1クロックが何MHzで動作するか(=1クロックは、何秒か)
 ・処理の合計が何クロックで動くか

  が分かれば、その積で時間が算出できますが、P6特有の事情によりちょっと変わってきます。


 1.CPUクロック
  CPUは、入力されるクロックを基準として動作しています。

  初代機:3.9936MHz
  mk2:3.9936MHz
  66:4.0000MHz

  計算の際は面倒なので全部4MHzで構わないと思います。

  4MHzなので1クロックは 1/4MHz = 250ns になります。



 2.バスリクエスト(nBASREQ)
  初代/mk2/66では、VRAMがメインRAMでもあります。
  そのため両方からのアクセスがぶつからないように、画面描画をする時にCPUを止めています。

  CPUに対して、アクセスしないように要求する信号がバスリクエスト(nBASREQ:負論理入力)で、実際にCPUが止まっているのを示しているのが、バスアックノリッジ(nBASACK:負論理出力)です。


  mk2で実際に波形を表示させたものが↓です(MODE=2)。

180628_01_BASACK1.png

  真ん中やや下(下から5本目)が nBASACK です。"H"の時はCPUが動作、"L"の時は停止します。
  nBASACK を見ると、H の区間がちょっと続いた後、縞模様(=L/Hの繰り返し)があり、また H の区間が続き...となっているのが分かると思います。

  この H の区間は、画面に描画していない区間になります。長く H が続いている区間は、画面の一番下を表示し終わって、次フレームの画面の一番上を表示するまでの間になります。


  縞模様(=L/Hの繰り返し)を拡大したものが↓です(MODE=2)。

180628_01_BASACK2.png

  L の区間、H の区間、…と続きますが、L の区間がちょっと長いです。
  この L の区間の間に、画面描画を行っています。
  

  MODE5の場合は、L と H の割合が変わります↓

180628_01_BASACK3.png


  MODE5の方が、描画するデータが多いため、CPUが止まっている時間が長くなります。

  停止している時間を図示すると、こんな感じです。

180628_01_バスリクエスト.png



  で、CPUが止まっている事を考慮に入れて、平均のクロック速度を算出しておきます。


  MODE1〜4:
  1フレーム時間のクロック数 = 912×262
  1フレーム時間のCPU停止クロック数 = 608×200

  平均クロック速度 = 4MHz × (912×262 - 608×200) / 912×262 = 1.96MHz


  MODE5:
  1フレーム時間のクロック数 = 912×262
  1フレーム時間のCPU停止クロック数 = 736×200

  平均クロック速度 = 4MHz × (912×262 - 736×200) / 912×262 = 1.54MHz


  かなーり画像表示のために、CPU停止を食らっていますね。


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

2018年06月27日

ボツゲーム6(DRUAGA)

  P6月間特別企画(その27)

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

druagap6.zip


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

  実機で動かす場合は、戦士のカートリッジmk2が必要です。
  エミュレータは、PC-6001V ver1.25のみ動作可能です。

  ↓スクリーンショット
180627_01_DRUAGA1.png
180627_01_DRUAGA2.png
180627_01_DRUAGA3.png
180627_01_DRUAGA4.png
180627_01_DRUAGA5.png
180627_01_DRUAGA6.png


  それなりに遊べますが、以下の点に問題があります。

 ・キャラが一部消去されない/消える場合があります。特に画面両端でゴミが大量に出ます。
 ・音が全く鳴りません。なので、4面でベルを取っても無意味...
 ・下画面(スコア、タイム表示の部分)がスクロールされてしまいます。
 ・アイテム画面が正常に表示されません。
 ・遅いです。


  一応、左右にスクロールします。ゴミが出ますが...
  この辺りの実装で挫折しました。


2018年06月26日

P6間通信

  P6月間特別企画(その26)

  TETRISでのP6間通信の話です。

  ゲームボーイのソフトをP6に移植しようと考えたのは、
 ・ソフトが入手しやすい
 ・Z80(に近い)を使っている
 ・グラフィックがP6で実現できる

  の3点でした。

  ゲームボーイのソフトをいろいろ調べてみると、特に初期のソフトは通信ケーブルを使った対戦プレイが出来るようにしているようでした。

  P6でも通信対戦が出来るといいなーと思って、試しにテトリスを移植しました。
  結果的には、別の場所で問題が発生しているようで、まともに通信対戦ができません(;_;)


  アルゴリズム的には大丈夫だと思われるので、その辺りを公開します。

  まず、P6間を繋ぐ、接続ケーブルですが、↓のような簡単な回路図です。

180626_01_接続ケーブル回路図.PNG

  GNDは相互を接続しますが、VCCは接続しないようにして下さい。
  6、7、8 ピンからデータを送信します。1、2、3 ピンからそのデータを受信します。


180626_01_通信フロー.png

  ↑具体的な通信アルゴリズムです。

  8ピンを制御信号に使用しており、通常は L にしておきます。
  この制御信号をL→H、H→Lとさせることで、データの送信完了とデータ受信完了応答を兼ねています。

  元々のゲームボーイの通信方式もそうなのですが、送信側が1バイト送信する間に、同時に受信側からも1バイトデータを受信します。


  今回はゲームボーイのソフトでしたが、P6間で通信対戦ゲームを作る時に使えるかも。

  誰か作ってください(^^;)/


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

2018年06月25日

ボツゲーム5(TETRIS)

  P6月間特別企画(その25)

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

tetrisp6.zip


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


  ↓スクリーンショット
180625_01_TETRIS1.png

180625_01_TETRIS2.png

  それなりに遊べますが、以下の点に問題があります。

 ・キャラが一部消去されない/消える場合があります。
 ・音が全く鳴りません。
 ・ちょっと遅いです。非SRの場合は、だいぶ遅いです。
 ・対戦プレイに対応したのですが、途中でハングアップする事が多く、まともに遊べません。

  書き忘れましたが、P6間通信ケーブルはジョイスティック2に繋いでください。

  対戦プレイ(P6間通信)について、次回に続きます。

2018年06月24日

バックアップ電池の話

  P6月間特別企画(その24)

  レトロパソコンでもかなり悪さをするバックアップ用電池の話です。

  先日、うちの98の中を開けてみたんですが、結構ひどい状態でした。

180624_01_98電池跡.jpg

  下部の白い四角枠に、バックアップ用電池が実装されていました。
  とりあえずニッパーでリード線を切って、電池を除去した時の写真です。

  電池の真下が緑色に変色しているんですが、それ以外にちょっと離れた上の大きなコネクタにまで影響を及ぼしています。
  コネクタが自然に錆びているのではなく、電池の液漏れの影響を受けています(もうちょっと上の方は全く問題ないので)。

  電解コンデンサと違って、液漏れというよりガス漏れっぽいです。


  電池の除去だけでもよかったのですが、ついでなのでスーパーキャパシタに置き換えてみました。

180624_01_スーパーキャパシタ.jpg

  これが置き換えたスーパーキャパシタです。5.5V耐圧の1Fです。
  そのまま置き換えると充電時間が掛かりそうなので、抵抗値を一箇所変更しています。


  さて、本題(?)

  P6シリーズで唯一、PC-6601SRにバックアップ電池が搭載されています。
  ほとんど役に立っていない(^^;)...

  除去だけでもいいと思うのですが、せっかくなのでスーパーキャパシタに置き換えてみました。

  バックアップ電池は、フロントカバーの裏にあります。↓この裏の基板です。

180624_01_66SR電池1.jpg


  基板だけを外したところです。左上の黒いもの(BAT501)が、バックアップ電池です。

180624_01_66SR電池2.jpg


  上の基板の回路図が↓です。

180624_01_buttery.PNG


  回路図の先を描いていませんが、VCCと描いている接続先は、uPD1990(カレンダIC)、uPD80C49HC(サブCPU)などに電源を供給しています。
  詳しくは、↓を参考に。

http://sbeach.seesaa.net/article/387861598.html



  今回変更したのは以下の2箇所
 ・BAT501   → スーパーキャパシタ(5.5V1F)
 ・R501 1.5KΩ → 51Ω

  R501は、充電電池に充電する際に、電流を制限している抵抗です。
  スーパーキャパシタはコンデンサなので、制限抵抗は要らないと思うんですが、コンデンサが空っぽの時に電流がすごく流れそうなので、念の為抵抗を付けています(5Vで51Ωなので、最大で100mA程度)。
  本当は47Ωを付けたかったのですが、手持ちの都合で51Ωです。


  スーパーキャパシタを取り付けた写真です。足の位置が違ったので、リード線などで調整しています。

180624_01_66SR電池3.jpg


  動作チェックなのですが、66SRのBASICのDATA$、TIME$は、なぜかディスクから起動しないと使用できません。
  さらに曜日の設定もできません...と思います(マニュアルがないので...)。


  BASICから日時、曜日を設定するのは面倒なので、TV予約を使うとラクです。

  PC-6601SR WORLDの画面で、F2(TVヨヤク)を押すと、TV予約画面になります。

  TV予約で、現在の日時、曜日や、TV予約が設定できます。


  電源を消して、出来ればコンセントも外して、半日ほど後に確認をして内容が正常なら問題ないかと思います。

  よくわからないのですが、カレンダICの方は1日ほどで止まりますが、サブCPU(TV予約内容)はかなり持ちます(1週間以上)。



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

2018年06月23日

半田付けの話

  P6月間特別企画(その23)

  ネタがなくなったわけではありません(^^;)
  前から書こうと思っていた事ですが...

  半田付けは小学校の頃からしているのですが、最近変わったことがあります。

  それは老眼...

  私は普段近視用のメガネを掛けているんですが、ここ数年ではメガネをしたままだと近くがほとんど見えなくなりました。
  メガネを外せば近くが見えるので、普段の生活は問題ありません。


  で、半田付けの話。


 ===半田付けをする時は、保護メガネをしましょう===

  何かの拍子で、半田などが飛んでくる可能性があります。

  例えば...
 ・半田付け時にフラックスが飛んでくる
 ・配線を外していると、半田が外れて配線が曲がってくる
 ・ボタン電池が破裂する

  など。

  気をつけていてもどうしようもない事がありますので、保護メガネをするようにしましょう。

 「保護メガネ」で検索するといろいろと出てくると思います。500円ぐらいの安いもので十分です。
  出来れば、中に普通のメガネが装着できるものがいいと思います。

  半田付け用、というのはないと思いますので、普通の用途(芝刈り用とか)で問題ありません。
  もし半田が飛んだときに保護メガネが溶けても、普通は目までは飛んで来ないので役目は十分果たすと思います。

  事故が起こる前にぜひ。

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

2018年06月22日

ボツゲーム4(倉庫番)

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

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

sokop6.zip


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


  ↓スクリーンショット
180622_01_倉庫番1.png
180622_01_倉庫番2.png
180622_01_倉庫番3.png


  それなりに遊べますが、以下の点に問題があります。

 ・キャラが一部消去されない/消える場合があります。
 ・音が全く鳴りません。
 ・ちょっと遅いです。
 ・ゲーム中、たまにSTARTを押した状態(GIVE UPした状態)になります。


  不可解な動きをする事があります。VSYNC割り込みが関連してるっぽいんですが...

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(4) | 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解析:画面周り | このブログの読者になる | 更新情報をチェックする