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コマンド一覧

 他機種→P6変換ソフト関連
 アドベンチャー(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年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解析:画面周り | このブログの読者になる | 更新情報をチェックする

2018年11月23日

エフォームンの境界を修正する

  システムソフトのエフォームンの境界の件。

  メイン画面はSCREEN4、スコア部分はSCREEN3 で表示されているんですが、mk2以降の場合、メイン画面とスコア部分の境界がヘンな表示になります。

181123_01_eformn1.png

  ↑
  こんな感じに、メイン画面の右端がSCREEN3になっています。
  これはエミュレータの画面ですが、実機でも同じような画面になります。


  また、初代機の場合は、左端がSCREEN3になっているようです。

181123_01_eformn2.png

  ↑
  これもエミュレータ画面ですが、実機でも大体同じです。


  上記はPCマガジンのダンプリストを入力したもので、市販のものが同じかどうか分かりません。


  この問題は、アトリビュートの設定が誤っているだけなので、修正するプログラムを作成しました。



10 CLEAR 50,&H8800
20 FORI=&HF878TO&HF8D1:READA$:POKEI,VAL("&H"+A$):NEXT
30 EXEC&HF87C
31 IFPEEK(&H9B5D)<>&H2FTHENPRINT"PATCH ERROR":END
32 POKE&H9B5D,&H31
33 IFPEEK(&H9B5E)<>&H30THENPRINT"PATCH ERROR":END
34 POKE&H9B5E,&H80
35 IFPEEK(&H9B94)<>&HF8THENPRINT"PATCH ERROR":END
36 POKE&H9B94,&H4A
37 EXEC&HF520:END
40 DATA 1A,C3,06,1B,CD,9A,25,06,05,CD,70,1A,FE,AF,20,F7
50 DATA 10,F7,21,32,F8,06,06,CD,70,1A,77,23,10,F9,CD,06
60 DATA 1B,AF,32,38,F8,21,76,25,CD,CF,30,21,36,F8,CD,CF
70 DATA 30,CD,9A,25,2A,32,F8,ED,4B,34,F8,1E,00,CD,70,1A
80 DATA 57,83,5F,72,23,0B,78,B1,20,F3,CD,70,1A,BB,CA,AA
90 DATA 1A,CD,06,1B,21,85,03,C3,CF,30



  メインはマシン語のみなので、マシン語ローダに修正プログラムを追加しています。
  マシン語ローダは、I/Oモニタ形式のものを読み込むようになっているので、必要に応じて修正して下さい。

  31〜36行が、今回追加しているパッチプログラムです。31〜34行が初代機用、35〜36行がmk2以降用です。

  修正した結果は↓です。


181123_01_eformn3.png
  mk2以降の実行結果


181123_01_eformn4.png
  初代機の実行結果(P6VW)

  P6VWでは、ナゼかボーダー色が違ってしまいます。実機動作と異なる結果になります。



181123_01_eformn5.png
  初代機の実行結果(P6V)

  P6Vでは、こうなります。これは実機で動かした時と同じ結果です。



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)が必要になりそうです。