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 / ファンタジー3
 マイトアンドマジック
 イシターの復活
 ポッキー
 リトルバンパイア / イントルーダー / ランス / D.P.S. / あぶない天狗伝説
 OLION80
 ログイン版ドラゴンスレイヤー
 表参道アドベンチャー

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

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

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

2018年11月10日

画面がちらつく事について

  P6でキャラ描画時にちらつく問題ですが...

  普通はキャラ描画時には、

 キャラを消す(背景を描く)
 ↓
 新しいキャラクタを描く

  を1画面内で行うため、描画タイミングによっては、キャラが消えている瞬間と、キャラが描画されている瞬間の両方が表示されるために、キャラがちらつくという現象が発生すると思います。

  P6の場合、この現象を抑えるために2画面を使用している事が多いです。

 画面1を表示する
 ↓
 画面2内で、キャラを消し、新しいキャラクタを描く
 ↓
 画面2を表示する
 ↓
 画面1内で、キャラを消し、新しいキャラクタを描く
 ↓
 画面1を表示する(最初に戻る)


  この時、画面1→画面2に表示を切り替えるのを、垂直帰線期間で切り替えるのがベストですが、描画中でもそこまで画面がちらつく事はありません。

  と思うのですが、どうでしょうか?


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

2018年11月09日

同期信号検出について

  P6の垂直同期信号検出についてまとめました。
  いろいろ飛び交っているようなので(^^;)

1.初代機

  垂直同期は普通では検出不可です。
  ブログの前の記事では、サブCPUを使って無理やり検出してますが、実際にプログラムで使用するのにはちょっと難しいです。


2.mk2/66

  垂直同期、水平同期は、PSGのジョイスティックポートから読み出す事が出来ます。
  MODE1〜5のどのモードでも読み出せます。


; ジョイスティックポートにアクセスする
;

: レジスタ0x07(ミキサ)の上位2ビットを設定する(B:出力、A:入力)
; BASICではA、Bとも入力になっているため変更が必要
ld a,$07
out ($a0),a
ld a,$bf
out ($a1),a

; レジスタ0x0fに0xc0を出力(ジョイスティック1、8ピンに"L"を出力)
ld a,$0f
out ($a0),a
ld a,$c0
out ($a1),a

; レジスタ0x0eからジョイスティックポートを読み出す
ld a,$0e
out ($a0),a
in a,($a2)


  この状態で、Aregには、

  Areg[7-0]:垂直同期 水平同期 TRG2 TRG1 右 左 下 上

  が返ってきます。


  ただし...

  検出できる垂直同期は、垂直帰線期間の始まりとかではなく、どちらかというと単なるタイミング信号です。

  具体的には、画面走査線のカウンタ値で示すと以下の通りです。


  画面走査線カウンタ(0〜261)

   0〜 2:垂直同期="L"
   3〜261:垂直同期="H"
  37〜228:画面描画範囲


  帰線期間のちょうど真ん中辺りのタイミングのため、ちょっと使いづらいです。

  また、水平同期に関してはパルス幅が14MHzで64クロックしかなく、CPUからまともに検出する事が難しいです。


3.mk2SR/66SR

  mk2/66と同じ手順で垂直同期、水平同期は、PSGのジョイスティックポートから読み出す事が出来ます。
  MODE1〜6のどのモードでも読み出せます。

  さらに垂直同期をトリガにした割り込みが使用できます。

  ただし、あくまでも垂直同期で、垂直帰線期間の始まりとかではありません。


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

RGBコンバータ使用時の注意

  今更ですが、RGBコンバータについての注意です。

  端子形状から他の機種でも使用できそうですが、P6以外の使用はしないで下さい。

  PC-8001mk2、PC-98、FM-7などで使用した場合、最悪は壊れる可能性があります。
 (1ピンに+12Vが出力されているため)

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

2018年11月08日

キー入力について

  P6のキー入力についてまとめておきます。


1.キー入力は、全てサブCPUが管理している。
  メインCPUからは、8255を通して通信を行ってデータを取得する事になります。
  また、サブCPUとの通信は、通常は割り込みを使用します。

  割り込みを使用しない方法も無くはないのですが、SR以降の挙動が変わるんじゃなかと思います。

  以降、割り込みを使っているという前提で記載します。


2.キー入力の種類は4種類ある。

 1)通常キー入力(割り込みベクタ0x02)
  キー入力があった時点にサブCPUから割り込みが発生し、値を返してきます。
  逆に、キー入力がないと、全く割り込みが発生しません。
  そのため、キーが押下された事はわかりますが、キーを離した事はわかりません。

  キーをずっと押下している場合は、サブCPU側でキーリピートの処理を行って、その都度割り込みが発生します。
  キーリピートの間隔などの変更などもできず、何故か機種によって間隔も違うようです。

  また、SHIFT/CTRL/GRPH/かな入力、ひらがな<->カタカナ切換(SHIFT+PAGE)もサブCPUの方で行っており、返ってくる値もそのコードになります。

  ややこしいんですが、CAPSを押した時の処理はサブCPUで行っておらず、CAPSは普通の特殊キーの一つになっています。


 2)特殊キー入力(割り込みベクタ0x14)
  これに該当するキーは以下の通りです。右に返ってくる値を併記します。

  グラフィックキー(GRPH+1〜9など):グラフィックコード(0x01〜0x1f)
  ファンクションキー(F1〜F5):0xf0〜0xf4
  SHIFT +F1〜F5       :0xf5〜0xf9
  STOP            :0xfa
  CAPSキー          :0xfb
  SHIFT+PAGE         :0xfc
  MODEキー          :0xfd
  かなキー          :0xfe


  動作としては、1)通常キー入力と同じです。
  押された時に、値を返してきて、ずっと押下している場合は、キーリピートされて、その都度割り込みが発生します。


 3)ゲームキー入力(割り込みベクタ0x16)
  1)2)とは違い、メインCPUからゲームキー調査のコマンドを発行します(サブCPUに対して0x06を出力)。
  しばらくすると、サブCPUから割り込みが発生して、ゲームキーの状態を返してきます。

  返ってくる値は以下の通り。

  bit7-0:[SPC] ["L"] [←] [→] [↓] [↑] [STOP] [SHIFT] の押下状態(押している時"1"、離している時"0")


  このゲームキー入力を使う事で、キーが押されているか、押されていないかがリアルタイムに分かります。
  逆にここで検出できる SPACE/カーソル/STOP/SHIFT 以外は、リアルタイムで押下されているかどうかがわかりません。


 4)CMT入出力時のSTOPキー入力(割り込みベクタ0x0e/0x10)
  押された時点でサブCPUから割り込みが発生します。値は返してきません。


3.サブCPUとの通信について

  BASICのROM内通信を使うのが一番手っ取り早いんですが、自前で全部作ると以下のようになります。
  (下記は、拙作Meltdown for p6mk2から、一部抜き出して変更したもの)



;
; 割り込み関連
;
org $8400

INT_TABLE:
dw INTDT0 ; 0x00
dw INTKEYIN ; 0x02(通常キー入力)
dw INTDT0 ; 0x04(RS-232C)
dw INTTIMER ; 0x06(TIMER)
dw INTDT1 ; 0x08(CMT READ)
dw INTDT0 ; 0x0A
dw INTDT0 ; 0x0C
dw INTDT0 ; 0x0E(CMT使用時STOP入力)
dw INTDT0 ; 0x10(CMT使用時STOP入力)
dw INTDT0 ; 0x12(CMT ERROR)
dw INTKEYIN2 ; 0x14(特殊キー入力)
dw INTGAMEKEY ; 0x16(ゲームキー入力)


;
; サブCPUから1バイトデータを受信する
;
; RET:Areg=受信データ
;
GETSUBCPU:
ld a,$0c
out ($93),a
.wait:
in a,($92)
and $20
jr z,.wait
ld a,$0d
out ($93),a
in a,($90)
ret

;
; サブCPUへ1バイトデータを送信する
;
; Areg=送信データ
;
SETSUBCPU:
push af
ld a,$08
out ($93),a
.wait:
in a,($92)
and $80
jr z,.wait
ld a,$09
out ($93),a
pop af
out ($90),a
ret

;
; 割り込み終端(データ1バイト受信+何もしない)
;
INTDT1:
push af
call GETSUBCPU
pop af
;
; 割り込み終端(何もしない)
;
INTDT0:
ei
ret

;
; キー入力割り込み
; 通常キーは、ASCIIコード
;
INTKEYIN:
push af
call GETSUBCPU
ld (KEYDATA),a
pop af
ei
ret

;
; キー入力割り込み
; GRAPH+キーの場合は、そのASCIIコード
; ファンクションキーの場合は、0xf0〜0xf9
; STOPキーの場合は、0xfa
; CAPSキーの場合は、0xfb
; MODEキーの場合は、0xfd
;
INTKEYIN2:
push af
call GETSUBCPU
ld (KEYDATA2),a
pop af
ei
ret

;
; タイマ割り込み
;
INTTIMER:
push af

ld a,(TIMERCNT)
inc a
and $03
ld (TIMERCNT),a
jr nz,.next1

ld a,$06
call SETSUBCPU ; ゲームキー呼び出し

.next1:
pop hl←不要でした
	pop	af
ei
ret

;
; ゲームキー割り込み
;
INTGAMEKEY:
push af
push bc

call GETSUBCPU

;
; サブCPUからのゲームキーをJOYSTICKの並びに変更する
; SPC "0" 左右下上 STOP SFT
; ↓
; "0" STOP SFT SPC 右左下上

ld b,a
xor a
bit 2,b
jr z,.lp1
or $01
.lp1: bit 3,b
jr z,.lp2
or $02
.lp2: bit 5,b
jr z,.lp3
or $04
.lp3: bit 4,b
jr z,.lp4
or $08
.lp4: bit 7,b
jr z,.lp5
or $10
.lp5: bit 0,b
jr z,.lp6
or $20
.lp6: bit 1,b
jr z,.lp7
or $40
.lp7:
ld b,a

;
; ジョイスティックポートにアクセスする
;
ld a,$0f
out ($a0),a
ld a,$c0
out ($a1),a
ld a,$0e
out ($a0),a
in a,($a2)
cpl
and $3f
;
; Areg:"0" "0" TRG2 TRG1 右左下上

or b
ld (GAMEDATA),a

pop bc
pop af
ei
ret



posted by えすび at 23:54| Comment(0) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする

2018年10月27日

開発途中案件(3)

  例の(?) Colossal Cave Adventure ですが、だいぶ動作するようになりました。


181027_01_Colossal1.jpg
181027_01_Colossal2.jpg

  英語版の方はほぼ完成。日本語版の方は、表示などは動作していますが、入力部分にちょっと手間取っています。

  英語版  mk2以降+1ドライブ
  日本語版 mk2以降+外部64KRAM+1ドライブ

  で動作します。


  これを終わらせてから、SUPER大戦略/Master of MONSTER/大戦略2の方に取り掛かろうかと思っています。

  その前に、他に仕上げたいものもありますが...

2018年10月16日

開発途中案件(2)

  その5のプログラムですが、たなむさんのブログで紹介されていた Colossal Cave Adventure をいうゲームです。

https://tms9918.hatenablog.com/entry/2012/10/15/034427


  日本語パッチ版を作られている方がいて、それを利用させて頂こうと思っています。

http://ver0.sakura.ne.jp/pc/index.html#advent


  とりあえず、元の英語版を、SDCCでコンパイルして、P6上で動作するようにはなりました。
  思ったより、SDCC がすんなり動きました(手間が多いですが)。

  このままでも十分遊べるんですが、入力した文字が消せないとか、セーブできないなどの問題があります。
 (それ以前に英語ですが)


  元のソースを余り理解していないのですが、うまく行けば英語版は拡張メモリなし、日本語版は、64K拡張だけで済みそうです。

  うまく行かなければ、英語版:64K拡張、日本語版128K拡張(戦士カートリッジmk2)が必要になりそうです。

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

2018年10月15日

開発途中案件

  今年の6月にボツ案件(開発中止案件)を紹介しましたが、今度は開発途中案件を紹介します。

  そのうち、完成させてアップするつもりではいます。

  何のゲームかわかります?


181015_01_その1.jpg
  その1(完成度90%)
  88版からの移植。
  二年ほど前に作って途中のもの。
  面クリアするとパスワードが表示されるが、この処理がちょっと面倒だったのでそのまま(^^;)


181015_01_その2−1.jpg
181015_01_その2−2.jpg
  その2(完成度85%)
  88版からの移植。
  プログラムは完成。
  キャラクタの手直しをする必要があるのと、動かせる環境が今のままでは特殊なため、どうするか考え中...


181015_01_その3−1.jpg
181015_01_その3−2.jpg
  その3(完成度85%)
  88版からの移植。
  その2と同じ状況。プログラムがその2のものと同じ部分が多いので、すぐに着手してみたけど、やはり動作環境が。


181015_01_その4−1.jpg
181015_01_その4−2.jpg
  その4(完成度80%)
  88版からの移植。
  プログラムはエンディング以外は完成。
  同じくプログラムがその2のものと同じ部分が多い。動作環境がぁ...


181015_01_その5−1.jpg
181015_01_その5−2.jpg

  その5(完成度30%)
  C言語で書かれているものをSDCCを使ってP6で動かしています。
  やっと元のプログラムと同じように動いたけど、まだ挙動不審。

  目標は日本語パッチ版を動かす事なので、まだまだ先が長そう。


2018年08月02日

ファンタジー3(ver1リリース)

  ファンタジー3 for P6


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


ph3p6.zip

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

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

2018年08月01日

8251の件

  だーいぶ前に、RS232Cボードを作成記事を書きました。

  しかし、8251 の入手が難しかったです。
 (当時はオークションで入手しました)


  最近、こんな所で売っているのを発見しました。

  ↓
https://store.shopping.yahoo.co.jp/orangepico/


  ここで、UPD8251AFC が売られているようです(1個540円)。

  参考まで。



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

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