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