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:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年06月14日

動画再生_説明(2)

  続きです。


6.PC-6001mk2/PC-6601 の特長

  今回、動画再生を作成する時に使用した、PC-6001mk2/PC-6601 の特長です。


○ページ切り替え
  P6系は、画面のページとして、複数のページを持つことが出来ます。そのため、Page2 を表示させたままで、その裏で Page3 に描画して、描画が完了したら Page3 を表示する、という事ができます。

  この手法を使うと、描画している最中のちらつきが抑えられます。


○メモリ管理
  PC-6001mk2/PC-6601 では、4000H 単位でどのメモリから読み出すか、どのメモリに書き込むかを設定できます。読み出しと書き込みを別にする事も出来ます。

  今回はVRAM にデータをひたすら書き込む処理がありますが、この際、外部メモリ(外付けメモリ)から読み出して、内部メモリ(VRAM)に書き込む、という設定にしています。


○バスリクエストオフ
  バスリクエストをオフにすると、画面の描画が止まります。正確に言うと、直前に入力したデータを表示し続けます。

  これをうまく使うと、画面の一部を使わない場合、その部分をバスリクエストオフにする事によって、その間にCPUを働かせる事ができます。



7.実装

・PCM 音声出力のためには、一定のタイミングでPSG にデータを出力する必要がある。
・画面描画は、VRAM に高速で書き込むしかない。
・両方とも、CPU からしかコントロールできない。

  このため、外部から出来ることは、CPU が走るプログラムを操作するしかありません。


  で、今回行った実装方法です。

1)描画する範囲を160×150 にする。
  PC-6001mk2/PC-6601 は、16色使えるのは 160×200 のモードです。この場合、画面の縦横比は4:3です。今回扱う動画は、ほとんどが16:9でしたので、 描画範囲を160×150 にしました。

  160×150 にする事によって、描画するデータが減る、画面の一部をバスリクエストオフに出来る、という2つのメリットがあります。


2)CPU から出力される信号(M1、RD、WR、IORQ、MREQ など)を監視する。
  信号の変化が止まっている時は、バスリクエストが出ていてCPU が止まっている事を示しています。そのため、画面描画をしているタイミングを検出する事ができます。


3)外部メモリの空間をアドレスフリーで使う。
  これは、VRAM に出来るだけ高速にデータを格納するために行っています。

  外部メモリ空間にメモリを配置しません。外部メモリを読み出した場合、アドレスを無視して、単に算出したデータ(プログラム)を返すようにします。さらに、メモリ管理で、書き込みを内部メモリ(VRAM)、読み出しを外部メモリに設定します。

  上記の設定にした場合、CALL 文を実行すると、PC の値が内部メモリ(VRAM)に書き込まれます。1回のCALL 文で2バイト書き込めて、1バイト当たり 8.5 クロックとなって、高速で書き込む事ができます(多分、最速です)。


4)2)で検出した画面描画のタイミングを考慮しながら、プログラムをスケジューリングする。
  これにより、PSG に一定の間隔でデータを出力する事ができます。さらに、1フレームの描画速度も管理する事ができるので、一石二鳥です。


  以下が実際にスケジューリングした結果、CPU に出力されるプログラムです。アドレスは無視しているので、このタイミングの通りにCPU に出力されます。

スケジューリング



  出力されるプログラム(データ)は、以下の通りです。

 ・画面描画:CD XX XX  (CALL XXXX )
 ・PCM出力:3E XX D3 A1  (LD A,XX / OUT (0A1H),A )
 ・バスリクエストON/OFF:3E 02(03) D3 93 (LD A,02H / OUT (93H),A )
 ・ページ切り替え:3E F4(F6) D3 B1 (LD A,0F4H / OUT (0B1H),A )

  ページ切り替えは、1フレームの描画が終わった時のみです。


  また、PCM出力は、15KHz サンプリングの1ch 使用時のものです。8KHz サンプリングの 2ch 使用の場合は、1ライン毎に(1)〜(4)を順番に繰り返して出力します。

 (1) 11 XX XX (LD DE,XXXX )
 (2) 7C ED 51 D3 A0 ED 59 (LD A,H / OUT (C),D / OUT (0A0H),A / OUT (C),E )
 (3) 11 XX XX (LD DE,XXXX )
 (4) 7D ED 59 D3 A0 ED 51 (LD A,L / OUT (C),E / OUT (0A0H),A / OUT (C),D )


  これを実行する前に、レジスタの初期設定をしています。

  LD C,0A1H
  LD HL,0908H


  本当は、1ラインで2ch 分の出力が出来ればいいんですが、14MHzで176clkしかない、1ラインの隙間に出力しているので、2ラインに分けています。



  具体的なデータを出して説明しましたが、実際にやっている事は、7)実装の項目に書いている、スケジューリングをして、そのタイミングでプログラムを出力しているだけなんですね。そのため、システムとしては割りと単純になっています。

  どっちかというと、SDカードからデータを読み出す事の方が、よっぽど複雑な事をしています。


posted by えすび at 08:59| Comment(4) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年06月08日

動画再生_説明(1)

  リクエストがあったので、動画再生カートリッジの動作説明です。実はやってる事は簡単な事が多いので、多少細かく書いていこうかと思います。既に書いたものありますが、その辺りはご容赦を。


1.前提条件

 ・本体の改造はしない。
 ・画像、音声は、P6側から出力する。
 ・外付けのハードウエアは、とりあえずどんな物でも可能とする。

  この条件がないと、本当に何でもアリになってしまいますので。

  後、前提条件ではないんですが、
 ・ターゲットは、PC-6001mk2/PC-6601 にする。

  初代機ではグラフィック能力が貧弱すぎる。
  SR は、実は中身をよく知らない。

  という理由です。


2.何が難しいのか?

  PC-6001mk2 を触った事がある人なら、体感的にすごく遅いマシンである事がわかります。『中の人がサボってるんじゃないか』という意見がありましたが、実際にサボってます(描画期間)。

  実は一番難しいのは、ごまかしが効く画像表示よりも、ごまかしが効かない音声出力(PCM音声出力)です。PCM音声出力は、タイミングを計って出力する必要があるため、結構シビアです。


3.画面描画の概要


画面出力1

  普通(?)のパソコンの場合、画面周りのハードウエアはこんな感じになっていると思います(最近のはよく分かりません...)。


画面出力2

  実際に描画する際には、CPU→VRAMにデータを書き込み、


画面出力3

  VRAMのデータをCRTコントローラが読み出して、画面に出力します。

  外部から指示して、パソコンに画面描画をさせる場合、以下の3つのようなやり方が考えられます。
  1)CRTコントローラが、外部にアクセスできるモードを持っている場合

画面出力4


  2)VRAM の出力を何らかの方法で、外部から入力できる(だませる)場合

画面出力5


  3)愚直にCPUからVRAMにデータを書き込む場合(工夫なし)

画面出力6


  PC-6001初代機の場合は、2)の手法が採れます。拡張ROM/RAMカートリッジにVRAMを載せる構成のため、VRAM自体が外部になります。そのため、VRAMのデータを自由に操る事ができるためです。

  PC-6001mk2/PC-6601 は、回路図を見た限りでは、残念ながら3)の手法しか採れません。

  つまり、

  ・外部から、CPU に対して描画データを出力する。
  ・CPU が、読み込んだデータをVRAM に書き込む。
  ・CRTC がVRAMの値を読み込んで、画面に出力する。

  という、一連の作業が必要になります。

  この場合、一連の作業がどれくらい速く出来るかで、どれくらいのフレームレートになるかが決まります。

  具体的な描画手順は後ほど。


4.音声出力の概要

  PC-6001mk2/PC-6601 には、音声出力の方法は2つあります。PSG と 音声合成です。BEEP出力はありません(PSG が似たような音を出している)。

  BEEP音でメロディを奏でるわけではないので、PSG を使うとだいぶラクですが単にメロディを奏でるだけだと寂しい。音声合成は未だに解析できていないので、既存の音声を歌わせるだけになるので、ちょっと...

  という事で、今回は PSG を使って、PCM 出力にしています。

  PSG(AY-3-8910)を使った PCM 出力は、MSXなどでも行われているので、特に目新しいものではありません。

  原理ですが、音量をかなり速い周波数(サンプリング周波数)で上下させるものです。例えば、8KHz のサンプリング周波数のPCM出力をする場合には、8KHz の周期でAY-3-8910にアクセスします。

  CPU の動作周波数が4MHz なので、8KHz は余裕...ではないんですね、P6 の場合。

  バスリクエストというものがあって、CPU がお休みする時があるんですね。


5.バスリクエストの話

  バスリクエストとは、正確には『CPU が外部回路からアドレスバス/データバスを解放せよ』という要求(リクエスト)です。

  CPU は、外部回路からバスの解放要求(バスリクエスト)があると、割と即座にバスを解放します(バスアックノリッジを返します)。バスを解放している間は、CPU は動作を完全に停止しています。

  PC-6001/mk2/66 は、画面描画の際に、CRTコントローラからバスリクエストを受けて、バスを解放します。


画面出力2

  この時は、CPU がVRAMにデータを書き込んでいるだけで、バスはCPUがコントロールしています。


画面出力3

  この時に、CPU はバスをCRTコントローラに明け渡しています。CRTコントローラは、バスを使ってVRAM からデータを読み出します。

  CRTコントローラがバスを占有するタイミングは画面に描画する時で、モードで決まっています。

  mk2の画面モード(MODE=5)の場合は、SCREEN1〜4で同じで、以下のようなタイミングの時です。

バスリクエスト1


  画面描画は、一番上のline を左から右へ、次のline を左から右へ、・・・、一番下のline を左から右へ、と進みます。1本のline にかかる時間は、14MHz で912clk で、そのlineを262本出力して、1画面(1フレーム)となります。

  1フレーム出力する時間は、912 clk × (1 / 14.31818 MHz )× 262 = 16.668 ms です。1秒間に大体60フレーム出力します(垂直同期周波数が60Hzのため)。


バスリクエスト2

  上の図をちょっと描き直したものです。原点が違うだけで内容は同じです。図の大きさは数字の通りになっていないのですが、ぱっと見ても CPU 停止時間が多いのが分かると思います。

  さらに、CPU停止時間が一定周期で発生するため、そのCPU停止時間を避けてPSGにデータを送らないと、PCM 出力が出来ません。

  結局、横1ライン毎にPSGにデータを出力すると、PCM のサンプリングレートを一番高く出来ます。最高サンプリング周波数は、約15.7KHz です(でも、実際は15.7KHz は厳しい)。



  ちなみに、OUT &H93,2 というコマンドで、バスリクエストをオフに出来ます(戻すのは、OUT &H93,3)。

  ただし、バスリクエストをオフにした場合は、画面描画が砂嵐になるか、真っ黒になります(本当はいろいろとありますが省略)。

  前の画面データを保持する、とかだったら使い道があるんですが、画面の出力が実質止まってしまうため、動画再生の時には、バスリクエストをオフにする事はできません。

  結局、バスリクエストはそのままで、それを避けながら使うしかありません。


  続きます。

posted by えすび at 19:03| Comment(13) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年06月01日

動画再生リリース(1-2)

 動画再生カートリッジ用のデータの作成方法です。


 一連の流れは以下の通りです。

1)再生したい動画を、パソコン上で再生する。
2)1)を『カハマルカの瞳』でキャプチャする(画像、音声とも)。
3)2)のデータの内、画像データを『カハマルカの瞳』で bmp に落とす。
4)3)の bmp を『 ViX 』で変換(トリミング、リサイズ、色の調整、減色)する。
5)4)の画像データを『bmp2bin/bmp2bin_43』で、P6 で直接読めるようなバイナリデータに変換する。
6)5)の画像データを、コマ数分連結する。画像データはこれで作成完了。
7)2)のデータの内、音声データを適当な音量に変換する。
8)7)のデータを『wav2bin』で、動画再生カートリッジで使う形式に変換する。
9)6)と8)のデータから、動画再生用のデータを作成する。


 順に説明します。

1)再生したい動画を、パソコン上で再生する。

  DVDプレーヤーなどで、適当にパソコン上に動画を再生して下さい。


2)1)を『カハマルカの瞳』でキャプチャする(画像、音声とも)。

 『カハマルカの瞳』は以下のHPにあります。

http://www.paw.hi-ho.ne.jp/milbesos/index.html
(注:ダウンロードの場所が見つけくいです。間違って他のソフトウエアをダウンロードしそうになります...)

  一通り使い方を読んでおいた方がいいでしょう。

  設定は以下のようにします。

 ・起動時のメイン画面
  Target Player(アプリ):起動しているDVDプレーヤーなどを設定すると便利。
  Recording Setting:
   フレームレート:15コマ/秒
    画像データにより 30コマ/秒の方がいい場合があります。
    15コマ/秒が不可の場合は、12コマ/秒、10コマ/秒などを指定します。
   サイズ変更:等倍
   ビット変更:16 bit
   時間:(適当に)

  この状態で、右の TEST のボタンを押すと、設定しているフレームレートで録画が出来るかを判断してくれます。
  コマ数がダメな場合は、コマ数を減らして再度 TEST して下さい。

 ・上メニューバーより
  環境設定−基本設定
   共通タブ:録画用WAVEファイルにチェック。無音AVIファイルは不要のためチェックを外す。
   AVIタブ:MUX(ビデオとオーディオの同期):録音もする、同期(MUX)する、にチェック。
   WAVEタブ:録画後変換:しない
   他は適当に。

  環境設定−オーディオ設定
   チャンネル:Mono
   ビット数[bit]:8
   レート[Hz]:48000


  この状態で「REC」を押すと、録画してみて下さい。

  AVI ファイルと、WAV ファイル が生成されます。
  生成されたファイルを分かり易くて、短いファイル名に変更します。


 ○コツ
  音声は大きな方がいいようです。

  取り込む画面サイズは小さい方が、ファイルサイズが小さくなったり、フレームレートが多く出来るなどのメリットがあります。
 (後で 160×150のサイズにするので、あまり大きくても意味がない)

  パソコンの状態によりますが、音声のフィードバック系がない場合は、外部でラインアウトーラインインを接続するなどの処理が必要になります。

  画像は取りたいデータの3秒前ぐらいから REC して、終わって1、2秒ぐらい後にに REC を終わらせるといいです。
 (後でいらない部分を削除します)

  AVI ファイルは、出来れば分割されていない方がベターです。


3)2)のデータの内、画像データを『カハマルカの瞳』で bmp に落とす。

 『カハマルカの瞳』の上メニューバーより、オプション−静止画抽出 を選びます。

  出てきたパネルで、以下を指定します。

  黒い四角の下のフォルダの絵をクリックし、2)で作成したAVI ファイルを指定。
  保存開始フレーム、保存終了フレームはそのまま。
  15フレームで録画した時は保存間隔を0にします。30フレームで録画した時は、保存間隔を1にします(1つおきにデータが抽出される)。
  連番記述を1000からにします。
  出力をBMP形式にします。

  この設定で出力を押すと、AVIのファイル名のフォルダが作成され、その中に1/15秒ごとのフレームがBMPで出力されます。

  12フレーム、10フレームなどで録画した場合は、そのレートでのデータが出力されます。


4)3)の bmp を『 ViX 』で変換(トリミング、リサイズ、色の調整、減色)する。

 『 ViX 』は以下にあります。

http://www.vector.co.jp/soft/win95/art/se083112.html
脆弱性に問題があり、公開が中止されているようです。
探せばあると思いますが、使用する際は注意して下さい。

  本来は画像ビューワなんですが、ファイルの一括変換なども出来る優れものです。

  まず、3)で作成した bmp がちゃんと出来ているかを確認します。
  作成されたフォルダを選ぶと、画像一覧が出来ているはずです。

  上メニューバーの、表示−並び順−で、名前と昇順、を選択します。
  すると、作成した画像が名前順(動画の順)に並ぶはずです。

  前の方と後ろの方で、不要な部分は削除しておきます。


  次に、画像変換の準備を行います。

  ・変換先のフォルダをあらかじめ作っておきます。

  ・3)で作成された bmp で、必要な部分の座標を調べておきます。
   トリミング(画像の必要な部分を切り出す処理)をする際に座標情報が必要になります。
   Windows 付属のペイントで、作成された bmp を表示させて、マウスを動かすと、下のステータスバーの右側に座標が表示されますので、画像で必要な部分の左上と右下の座標をメモしておきます。

  ・変換用の16色パレット用の画像をダウンロードしておき、適当な所に格納します。

↓16色パレット用画像
color16.bmp

  次に画像変換(トリミング、リサイズ、色の調整、減色)を行います。

  3)で作成した bmp が格納されているフォルダを選択した状態で、上メニューバーの、画像−総合変換 を選びます。
  すると総合変換用のパネルが出ますので、以下のように設定します。

  出力タブ:
   変換対象フォルダは、変換したいものが選ばれている事を確認。
   出力先は、先に作成した変換先のフォルダを選択します。

  フォーマット:
   種類は BMP を選択します。

  リサイズ:
   リサイズを行う、をチェックします。
   大きさは、サイズ指定を指定し、横幅160、縦幅150 を指定します(16:9の画像の場合)。
   4:3 の画像の場合は、横幅160120、縦幅120150 を指定します。
   方法は、3次補間を選択します。
   シャープネスにチェックします。

  トリミング等:
   トリミングを行う、をチェックします。
   切り出す画像サイズは、先に調べた左上と右下のから算出して入力します(右下−左上の結果を入力します)。
   切り出し位置(左上)は、先に調べた左上の座標を入力します。
   他の項目はチェックしません。

  減色:
   減色を行う、をチェックします。16色を選びます。
   誤差拡散の方法は、タイプAを選択します。
   パレット選定の方法は、他の画像からパレットを抽出、を選択します。
   パレット用の画像ファイルは、先にダウンロードした16色パレット用画像を選択します。

  明るさ・カラー:
   明るさ・カラーの変更をチェックします。
   明るさとコントラストを適当な数値を入力します(後述)

  オプション:
   元の名前を使う、を選択しておきます。
   また、変換条件の保存をしておいた方がいいでしょう。


  ここまで設定が終わったら、OK を押すと一括変換を始めます。

  変換が完了したら、変換先のフォルダを見て、ちゃんと見える画像かを確認して下さい。
  (この画像が直接P6に表示されます)


  最初はファイルを1つだけ選択した状態で、一括変換をして確認した方がいいかも知れません。


 ○コツ
  明るさとコントラストの設定によって、16色に出力した後の画像がかなり変わってきます。
  この値のどうするかで、最終の出来が変わってきますので、いろいろと調整してみて下さい。

  コントラストはかなり大きめ(80〜)、明るさは、元の動画が明るい場合は-8〜、暗い動画では8〜、などとした方がよさそうです。
  大抵、元の動画の途中で変更しなくてもいいんですが、明るい、暗いが両方あるものは、別々に変換した方がいいかも知れません。


5)4)の画像データを『bmp2bin/bmp2bin_43』で、P6 で直接読めるようなバイナリデータに変換する。

  自製ツールの『bmp2bin/bmp2bin_43』で、〜.bmp を 〜.bin に変換します。

↓bmp2bin/bmp2bin_43
bmp2bin.zip

  bmp2bin/bmp2bin_43 は、コマンドラインのツールです。bmp2bin は、16:9 用、bmp2bin_43 は 4:3 用です。

  コマンドラインで、 bmp2bin ファイル名  とします。ファイル名は、bmp は外して下さい。
  例えば、ichigo_1000.bmp を変換する場合は、 bmp2bin ichigo_1000  とすると、ichigo_1000.bin が作成されます。

  このファイルは、mode=5、screen=3 の画像データそのものです(0x0000〜0x3FFFのデータ)。


  bmp2bin で作成したファイルの確認は、以下のように行います。

  ・PC-6001VW を PC-6001mk2 で起動する。
  ・MODE=5、PAGE=3 を選択する。
  ・SCREEN 3,3,3 を入力する。
  ・bmp2bin で作成した、〜.bin を、PC-6001VW にドラッグする。
   すると「ファイル形式を選択してください」となるので、[Yes}=Binary を選択し、アドレスを 0x0000 として、OK を押す。
  ・PAGE キー(Page Up)を2回押すと、ページ3に画像が表示されている。


6)5)の画像データを、コマ数分連結する。画像データはこれで作成完了。

  5)のやり方で、動画のコマ数分、〜.bin を作成します。

  その後、その〜.bin をコマ数分連結します。

  面倒なので、バッチファイルなどを作成した方がいいかと思います。

  最終的に1つにしたファイルのみを使用します。

  最終的なファイルの名前は、8+3文字以内にして下さい。


7)2)のデータの内、音声データを適当な音量に変換する。

 いろいろとソフトウエアがありますが、私は『 SoundEngine Free 』を使っています。

http://soundengine.jp/
(注:ダウンロードの場所が見つけくいです。間違って他のソフトウエアをダウンロードしそうになります...)


 『 SoundEngine Free 』を使った場合の説明をします。

 ・まず『 SoundEngine Free 』を立ち上げます。
 ・次に、2)で作成された音声データをドラッグします。
 ・すると画面に波形が表示されます。また、上部真ん中辺りに、周波数、ビット、チャンネルが表示されていますが、それぞれ 周波数=48000、ビット=8、チャンネル=1、になっている事を確認します。
  (違う場合は、『カハマルカの瞳』の設定が間違っていますので、チェックしてください)
 ・上部の虫眼鏡マークの「縮小」を押して、波形全体が表示されるようにします。

 ・波形のピークが、大体 -1〜0dB ぐらいになるように、音量を調整します。
  上メニューバーの、音量−ボリューム(音量調整)を選択肢、音量の数値を0.0dB から適当に変更します(例えば5dBなど)。
  調整して、ピークが -1〜0dB ぐらいになっていない場合は、「元に戻す」で元に戻して、再度音量の数値を変更していきます。

 ・音量の調整が終了したら、別名でセーブしておきます。


8)7)のデータを『wav2bin』で、動画再生カートリッジで使う形式に変換する。

  自製ツールの『wav2bin』で、〜.wav を 〜.bin に変換します。

↓wav2bin
wav2bin.zip

  wav2bin は、コマンドラインのツールです。

  コマンドラインで、 wav2bin ファイル名 オフセット とします。ファイル名は、wav は外して下さい。
  例えば、ichigo_p.bmp を変換する場合は、 wav2bin ichigo_p 1000 とすると、ichigo_p.bin が作成されます。

  オフセットは、wavファイルの先頭から何バイト空読みするかを指定する数値です。
  画像データに合わせた音声データなので、先頭に余計な音声データが入っているので、それを削除するために指定します。

  オフセットの数値は、以下の通りにして算出します。

 ・フレームレートが15フレームの場合:1フレーム当たり:3200
 ・フレームレートが12フレームの場合:1フレーム当たり:4000
 ・フレームレートが10フレームの場合:1フレーム当たり:4800

  フレームレートが30で、2フレームおきに抽出した場合は、フレームレートが15フレームと同じになります。

  画像データは、1000から順番に連番で抽出しています。
  例えば、1000〜1033 までを削除した場合、つまり1034が一番最初のフレームの場合は、

  (34 + 0.5)×3200 = 110400 を指定します(フレームレートが15の場合)。

  変換したファイルの名前は、8+3文字以内にして下さい。


9)6)と8)のデータから、動画再生用のデータを作成する。

  制御用のファイルを作成します。制御用ファイルの拡張子は、〜.p6m にして下さい。

  実際の〜.p6m はこんな感じです(テキストファイルです)。


ichigo15.bin
4
ichigo_p.bin
2
いちごましまろ OP


それぞれの行は、改行で区切られます。
1行目:画像データのファイル名
2行目:フレームレート。1/60秒の何倍かを示します。フレームレートが15の場合は4、フレームレートが12の場合は5になります。
3行目:音声データのファイル名
4行目:音声サンプリングレート。1か2を入れます。通常は2を指定して下さい。1の場合はサンプリングレートが 15KHz で再生しますが、PSG の1chしか使わないので音質が悪いです。
5行目:タイトル表示をした時の文字列。SJIS で入力した場合、平仮名、片仮名などは変換します。漢字は変換しません。



  動画再生カートリッジを起動した時に、ファイル一覧が表示されますが、複数のp6m ファイルがある場合は、p6m のファイル名でソーティングして表示します。


posted by えすび at 13:29| Comment(0) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年05月31日

動画再生リリース(1)

  動画再生カートリッジの回路などをリリースします。
  DE0nano 用です。

ROM_130531.zip

src_130531.zip



  ただ、肝心のデータの作成方法に関しては、まだ記載していません。

  追ってアップしたいと思います。

posted by えすび at 18:35| Comment(3) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年05月23日

動画再生(13)

  5/25 のP6 オフに参加します。


  その際、動画再生カートリッジを持っていきます。

  一応(?)、20本以上のアニメのOP/ED の動画を作りました。完全にシュミの領域ですね(^^;


  さらに、26日のゲームレジェンドで展示も行う予定です。


  多分、大丈夫だとは思うんですが、もしかすると不測の事態で中止になるかも知れません。

  個人的に一番心配しているのは、ちゃんと動かした実機がウチの2台(PC-6001mk2 と PC-6601)だけだという事です。

  相性などはないはずなんですが、何せ古い機種ですのでいろいろと問題が発生する可能性はあります。


  ちゃんと動いてくれるといいなー。



  (5/24〜5/27まで東京に行ったきりなので、コメントを返すのが遅れると思います)


posted by えすび at 18:04| Comment(0) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年05月15日

動画再生(12)

  動画再生カートリッジつくろうブログ。


  せっかくなので、DE0nano だけではなくて、DE0 でも動くようにしているんですが...
  何だかよく分からない所で引っ掛かってます。

  基本的な機能は余り変わらないので、端子名などを変更するような VHDL のトップ階層を作って、上からかぶせるという手法を取っています。

  差分だけをその階層が吸収するので、バグの発生などが少なくなるはずです。


  ...なんですが、不可解な動作に悩まされています。

  クロック系で50MHzを分周して、2Hz を生成している箇所があるんですが、この挙動がヘン。
  DE0単体ではちゃんと動くんですが、P6 と接続すると、2Hz がベタLになってしまう(50MHz クロックは止まらない)。


  DE0nano ではちゃんと動作しているので、分周回路自体は問題がないはずで、どうも他の問題のようです。
  例えば、間違って出力同士を繋いでいるとか、入力がオープンだとか、電源周りとか...


  ただ、その原因が見つからないんですよねぇ...


posted by えすび at 23:45| Comment(0) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年05月04日

動画再生(11)

  動画再生カートリッジつくろうブログ。


  ファイル選択などをBASICで行おうと思いましたが、結構面倒です。

  一応、P6から見ると、『動画再生カートリッジ』はその名の通り、拡張ROM/RAMカートリッジに見えています。

  制御用プログラムをBASICで組んだ場合、CMT や フロッピーから読み込むのはさすがにダサいので、拡張ROMの部分からBASICを起動したいのですが...いろいろな手順を踏む必要があります。


○拡張ROMからBASICプログラムを転送して、起動させる手順

1)BASICプログラムを転送させるための転送プログラムをメインRAM上に置く
2)BASICのモード、ページを選択する
3)転送プログラムを起動して、BASICプログラムをメインRAM上に置く
4)メインRAM上に置いたデータをプログラムとして認識させる
5)プログラムを走らせる

これらを全部自動で行う必要があります。

以下、mk2/66の場合です。P6初代機でも大体同じ手順になります。


1)BASICプログラムを転送させるための転送プログラムをメインRAM上に置く

 N60m-BASIC が起動するときに、拡張ROMカートリッジの特定の場所を読み込んで、処理を変更します。

 0x4000 = 0x41、0x4001 = 0x42 の場合、0x4002、0x4003のアドレスをCALLする。その後、N60-BASICを起動する。
 0x4000 = 0x43、0x4001 = 0x44 の場合、0x4002、0x4003のアドレスをCALLする。その後、N60m-BASICを起動する。
 0x6000 = 0x42、0x6001 = 0x42 の場合、0x6002、0x6003のアドレスをCALLする。その後、N60-BASICを起動する。
 0x6000 = 0x43、0x6001 = 0x44 の場合、0x6002、0x6003のアドレスをCALLする。その後、N60m-BASICを起動する。


 今回、モード5を使いますので、0x4000=0x43、0x4002=0x44、を使います。


2)BASICのモード、ページを選択する

 BASICのモードは、0xFF4E に『モード - 1 』を書き込みます。モード5の場合は、4を書き込みます。

 ページ数は直接ワークエリアに書き込む事は出来ないので、キー入力したようにします。

 この後の3)転送プログラムを起動する、5)プログラムを走らせる、に関しても、キー入力したようにしますので、同時に行うのが簡単です。

 キー入力したようにするには、ファンクションキーを押した状態にします。

 具体的には、0xFA32に、入力文字数を、0xFB8D、0xFB8E、に、入力内容があるアドレスを書き込みます。これにより、入力できる状態になった時に、設定した内容が入力されます。



3)転送プログラムを起動して、BASICプログラムをメインRAM上に置く

 転送プログラムを起動するのは、2)で実現済みです。転送プログラム自体は、単純なブロック転送のみです。

 なぜ、1)で転送プログラムだけを転送していて、BASICプログラムは転送しないか?

 答えは、起動時にデータが消される場所があるためです。

 データが消されるのは、0x8000〜0x83FF、0xA000〜0xA3FF、0xC000〜0xC3FF、0xE000〜0xE3FF、です。VRAMに相当する部分ですね。

 それ以外にも、スタックエリア付近(〜0xF9FF)や、0xE500〜0xE5FF、0xF500〜0xF5FF、付近もデータが変更されている場合があります。


4)メインRAM上に置いたデータをプログラムとして認識させる

 まず、プログラムの最後を認識させます。0xFF56、0xFF57、にプログラムの最後+1を書き込みます。
 その後、0x04C4 をコールすると、BASIC のリンクポインタが修正されます。


5)プログラムを走らせる

 これも、2)で実現済みです。


BASIC起動

  ↑
 実際に組んでみたプログラムです。

 前提として、BASICプログラムが、拡張ROMの0x4100〜0x68FF(転送後、0x8800〜0xAFFF)に格納されていて、プログラムの最後が、0x68FE、0x68FF(転送後、0xAFFE、0xAFFF)に格納されているものとしています。


posted by えすび at 10:28| Comment(0) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年04月20日

動画再生(10)

  動画再生カートリッジつくろうブログ。


  メインの部分は完成しました。画像はいろいろな理由でアップできませんが...


  今の所、モードとして、

 1)フレームレート15FPS/サンプリグレート7860Hz(PSG2ポート使用)
 2)フレームレート15FPS/サンプリグレート15720Hz(PSG1ポート使用)


 の2つです。1)のモードは処理がほんの少し足らなかったため、画面サイズを160×148にしています(通常は160×150)。


 3)フレームレート20FPS/PCM再生なし
 4)画像再生なし/PCM再生のみ(PSG2ポート使用)

 というモードも作ろうかなーとは思っています。


  いくつか実際に動かしてみましたが、PCM音声の方はほとんど気にならないんですが、画像の方はいろいろと気になる事があります。

  P6の再生の問題ではなくて、動画データの問題です。



  15色の160×150で再現している事自体がかなりの無理があるんですが、元の動画を知らないとわからないようになる事があります。



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

2013年04月12日

動画再生(9)

  動画再生カートリッジの話の続き。


  動画再生カートリッジつくろうブログになっていそうですが(^^;


  画像はアップしませんが、12FPS、20FPSでの動画再生(音声はなし)をとりあえず組んでみました。なかなかいい感じで動きました。12FPSと20FPSを比べると、結構違いが目立つような感じです。


  で、PCM音声を組み込もうとしたんですが...落とし穴が(>_<)


  AY-3-8910 の2ポートを使って再生した場合の1回の音声発声ルーチンは、51クロックかかるんですが、これが問題です。

  前に書いた通り、P6の場合、画面描画中はCPUを停止しているため、その期間は音を出せなくなり、画面の1行を表示するたびに、1音を出す、となります。


  問題は、画面描画中の1行と、次の1行までの間の時間です。

  14MHzクロックで176クロックあるんですが、これをCPUクロックの4MHzに直すと、49クロックです。

  1音出すのに51クロックかかるので、49クロックでは足らずに、2行で1音が精一杯です。


  方針は次の2つ。

 ・2ポート使って、2行おきに1音出す(サンプリングレート7860Hz相当)
 ・1ポート使って、1行おきに1音出す(サンプリングレート15720Hz相当)


  AY-3-8910 を1ポートだけ使ってのPCM音声出力は、一応試してみました。

  一応ちゃんとは聞こえるんですが、小さい音などが完全に無音になるなど、分解能がモロに出てしまうような感じです。



  PCM音声の改良もあるため、動画再生回路も含めて、回路を全面的に見直しています。



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

2013年04月04日

動画再生(8)

  PCM音声再生の話。


>> 設定チャネルをAとBの2つにする → PCMのサンプリングレートが落ちる事に相当

  じゃなかったです。

  ビットレートが落ちるのではなく、サンプリングデータの解像度が落ちるでした。


  現在3チャンネル使っているPCM音声再生を2チャンネルにして試しました。
  どうもサンプリングデータの解像度が落ちるのはそんなに問題にならないようです。

  2チャンネルだけで再生した場合でも6ビット程度の解像度が出ており、データの取り方ではかなりいい音になります。


  2チャンネルで再生した場合の1回の音声発声ルーチンは、

LD C,0A0H
LD B,08H
LD D,09H
↑あらかじめ設定しておく


LD A,XX :7
OUT (0A1H),A :11+1
OUT (C),D (or B):12+1
LD A,XX :7
OUT (0A1H),A :11+1

  と51クロックです。



  どっちかというとサンプリング周波数の方が問題のようです。

  サンプリング周波数を落とすと、当たり前ですが高音が汚くなります。
  8000Hz程度ならまだマシで、それ以下はうーんという感じです。


  さらに...

  動画再生をしながら、というか画面を表示しながらのPCM音声再生は、周波数が限定される事を忘れていました。

  P6の場合、画面描画中はCPUを停止しているため、その期間は音を出せなくなります。

  そのため、画面の1行を表示するたびに、1音を出す、というのが最高の周波数になります。


  算出すると、画面262行を1/60秒で描画しているので、60 × 262 = 15720Hz が最高のサンプリング周波数になります。
  2行ごとの場合は、7860Hz、3行ごとの場合は、5240Hz です。


====

  今の所の検討結果をまとめると、
 ・描画は、320×150(160×150)ドット。
 ・描画していない区間は、CRTKILL でCPUクロックを稼ぐ。
 ・PCM音声再生は2チャンネルで再生する。

  この場合...

 ・PCM音声 なし  :20FPS(垂直同期3回で1枚描画)
 ・PCM音声 15720Hz :12FPS(垂直同期5回で1枚描画)
 ・PCM音声 7860Hz :15FPS(垂直同期4回で1枚描画)
 ・PCM音声 5240Hz :15FPS(垂直同期4回で1枚描画)

  となります。

  2画面切り替えを行うため、垂直同期のn回分で1枚描画にする必要があります。
 (mk2以降の画面切り替えは、垂直同期のタイミングで行われるため)


  後はどれくらいで妥協するか...ですね。

posted by えすび at 22:24| Comment(2) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年04月03日

動画再生(7)

  しょうもない計算間違いをしていました...


  mk2の場合、解像度は320×200ですが、これは4:3のテレビ出力に対応しています。
  ハイビジョンの場合、16:9なので、320×175だと計算していましたが...

  320×150の間違いでした...

  320×200が、4:3=16:12なので、16:9は、縦ドット200×9/12=150ですね。

  なので、描画すべきバイト数は12000バイトになります。



  さらに、『バスリクエストOFF(2)』で書いた通り、描画しない期間はバスリクエストOFFにするという手段が取れます。描画区間の1/4なので結構影響が大きいです。

  で、描画ラインで150ラインで算出すると、平均CPUクロック周波数は2.12MHz となり、1秒間に 20.8 フレーム描画できるようになります。


  描画がこのくらいの速度なら、PCM音声の方にだいぶ余裕が出来ます。


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

2013年04月01日

動画再生(6)

  動画再生の続き。


  PCM音声出力について、とりあえず1回の出力を短くする努力をしてみました。

  1回のPCM音声出力は、AY-3-8910 のチャネルA/B/Cの音量設定する事で実現しています。
  具体的には、以下のようなプログラムになります。


LD A,08H :7
OUT (0A0H),A :11+1  ←AY-3-8910 に設定するポートをR8に設定する
LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR8にチャネルAの音量を設定する
LD A,09H :7
OUT (0A0H),A :11+1  ←AY-3-8910 に設定するポートをR9に設定する
LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR9にチャネルBの音量を設定する
LD A,0AH :7
OUT (0A0H),A :11+1  ←AY-3-8910 に設定するポートをR10に設定する
LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR10にチャネルCの音量を設定する

  合計:114クロック


  これを1秒間に11025回する事になります(11025Hzの場合)。
  本来は、さらに全部の命令に 1WAIT 掛かりますが、これは縮める事が出来るとしています。ポート0xA0/A1に対する 1WAIT は減らす事ができません。

  いろいろと考えて、今の所最短なのは、以下の通り。

LD C,0A0H
LD B,08H
LD D,09H
LD E,0AH
OUT (C),B
↑あらかじめ設定しておく。


LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR8にチャネルAの音量を設定する
OUT (C),D :12+1  ←AY-3-8910 に設定するポートをR9に設定する
LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR9にチャネルBの音量を設定する
OUT (C),E :12+1  ←AY-3-8910 に設定するポートをR10に設定する
LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR10にチャネルCの音量を設定する

 :

LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR10にチャネルCの音量を設定する
OUT (C),D :12+1  ←AY-3-8910 に設定するポートをR9に設定する
LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR9にチャネルBの音量を設定する
OUT (C),B :12+1  ←AY-3-8910 に設定するポートをR8に設定する
LD A,XX :7
OUT (0A1H),A :11+1  ←AY-3-8910 のR8にチャネルAの音量を設定する

  合計:83クロック


  最初は、チャネルA、B、Cの順で設定し、次はチャネルC、B、Cの順で設定する。
  というのを交互に行うと、どのレジスタを変更するかを設定するのを1回分浮かせる事ができます。


  もう少し速くしたいのですが、これが限界っぽいです。


  後は、

  設定チャネルをAとBの2つにする → PCMのサンプリングレートが落ちる事に相当
  サンプリングレートを落とす

  ぐらいしかなく、両方とも音質に関わるので、悩ましい所です。


posted by えすび at 18:11| Comment(0) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2013年03月26日

動画再生(5)

  去年の12月からの妄想の続き。


  以前の計算で画面描画をCALL文のみで実現した場合、1バイト当たり8.5クロックで、11fps程度で描画が可能の計算結果が出ました。ハイビジョン対応の16:9にした場合、画面の上下が切れる(描画しなくていい)ので、12fps程度まで描画できます。


  で、もうちょっと考えると、致命的な問題が...


  それはPCM音声出力です。8bit/11.025KHzサンプリングのPCM音声出力をするとした場合...1秒間に11025回、PCM音声出力をする必要があります。

12fpsの場合なら、その1/12の919回のPCM音声出力が必要になります。

  画面の上下を切った場合、1フレーム14000バイトの出力に対して、919回のPCM出力は大した事がないと思っていたら...


  画面描画:14000バイト×8.5=119,000クロック
  PCM音声出力:919回×99=90,981クロック

  画面描画と同じくらい、PCM音声出力に時間がかかる事が判明...


  PCM音声出力のサンプリングレートを落とすのもテなんですが、音質が悪くなるのが問題です。


  うーん。


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

2012年12月05日

動画再生(4)

  妄想の続き。


7)プログラムをCALLのみ

  LD (SP待避),SP
  LD SP,VRAM最終アドレス+1

  JP 画面データ#-1,-2

  CALL 画面データ#-3,-4 ; 17
  CALL 画面データ#-5,-6 ; 17

    :
    : ×0x2000回実行
    :


  No WAIT として、

  1バイト当たり8.5クロック。
  1ページ描画(16Kバイト書き込み)には 90.7ms 。
  1秒のフレーム数は、11.0 枚。


  上のプログラムが不思議な感じだと思いますが...

  CALL はPC をスタックに待避して、新しいアドレスに飛ぶ命令です。
  言い換えると、

 ・現在のレジスタ(PC)の2バイトの値をメモリに書き込む。
 ・メモリのポインタを2減算する。
 ・新しい値をレジスタ(PC)に読み込む。

  を1命令で実行します。


  通常のプログラムではPC が無茶苦茶になるので、データに依存して飛び先が変わるプログラムは使えません。

  そこで、外部RAMのエリアの64Kバイト領域すべてを外部回路に割り当てます。

  通常のメモリは、
   アドレス入力→そのアドレスに格納されているデータを出力
  
  となるところを、外部回路では
   アドレス入力→特定のデータを出力

  にすると、PC と関係なくプログラムを動かす事が出来ます。



  さすがにこれが限界っぽいです。11fps なら見られるかな?


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

2012年12月04日

動画再生(3)

 『動画再生カートリッジ』の妄想の話。

  初代P6 では、外部からVRAMデータを流し込む事が可能なので、かなりの事が出来そう。音声に関しても、外部で同期を取ればいいので、実現は出来そうです。

  ただ、初代P6 のグラフィック能力での画像再生はイマイチっぽいので、出来ればmk2以降で再生するのがいいかと思います。


  ですので、CPUでVRAMに書き込む方法で、どの程度のグラフィックが描けるかを考えてみました。

0)前提条件
 ・本体の改造はしない。
 ・グラフィックは、MODE5 の320×200×2色か、160×200×4色。つまり16Kバイト分の書き込みが必要。
 ・当然、バスリクエストはOFFにしない。CPUの実質のクロックは、4MHz ×(62×912+200×176) / (262×912) = 1.536MHz
 ・外付けのハードウエアは、とりあえずどんな物でも可能とする。



1)単純なメモリ間のブロック転送方法
  外付けハードから画面データを読み込み(メモリマップドI/O)、そのデータをVRAMに書き込む。

  LD HL,画面データアドレス
  LD DE,VRAMアドレス
  LD BC,0x4000
  LDIR  ; 21+2

  1バイト当たり23クロック。
  1ページ描画(16Kバイト書き込み)には 245ms 。
  1秒のフレーム数は、4.08 枚。

  プログラムを外付けにすれば、No WAIT に出来る。その場合は、

  1バイト当たり21クロック。
  1ページ描画(16Kバイト書き込み)には 224ms 。
  1秒のフレーム数は、4.46 枚。



2)単純なI/O→メモリ間の転送方法

  外付けハードから画面データを読み込み(通常のI/O)、そのデータをVRAMに書き込む。

  LD HL,VRAMアドレス
  LD C,読み込みポート
  LD B,0x00
  LD E,0x40
LOOP:
  INIR     ; 21+2 / 16+2
  DEC E     ; 4+1
  JP NZ,LOOP  ; 10+1

  1バイト当たり23クロック。ただし、256バイト置きに 11クロック増える。
  1ページ描画、フレーム数は、1)とほぼ同様。



3)1)、2)のループを止める転送方法

  1)の場合だと、

  LD HL,画面データアドレス
  LD DE,VRAMアドレス
  LDI  ; 16+2
  LDI  ; 16+2

    :
    : ×0x4000回実行
    :

  1バイト当たり18クロック。
  1ページ描画(16Kバイト書き込み)には 192ms 。
  1秒のフレーム数は、5.21 枚。

  No WAIT 時は、

  1バイト当たり16クロック。
  1ページ描画(16Kバイト書き込み)には 171ms 。
  1秒のフレーム数は、5.86 枚。



4)画面データをプログラムに直書きする

  LD HL,VRAMアドレス

  LD (HL),画面データ#0  ; 10+1
  INC L          ; 4+1
  LD (HL),画面データ#1  ; 10+1
  INC L          ; 4+1

    :
    : ×0x4000回実行
    :

  INC L は、256回ごとに、INC HL とする。この際、クロック数は、6+1

  1バイト当たり16クロック。ただし、256バイト置きに 2クロック増える。
  1ページ描画(16Kバイト書き込み)には 171ms 。
  1秒のフレーム数は、5.86 枚。

  No WAIT 時は、

  1バイト当たり14クロック。
  1ページ描画(16Kバイト書き込み)には 149ms 。
  1秒のフレーム数は、6.69 枚。



5)直書きその2

  LD HL,画面データ#0,1  ; 10+1
  LD (VRAMアドレス+0),HL ; 16+1
  LD HL,画面データ#2,3  ; 10+1
  LD (VRAMアドレス+2),HL ; 16+1

    :
    : ×0x2000回実行
    :

  1バイト当たり14クロック。
  1ページ描画(16Kバイト書き込み)には 149ms 。
  1秒のフレーム数は、6.70 枚。

  No WAIT 時は、

  1バイト当たり13クロック。
  1ページ描画(16Kバイト書き込み)には 139ms 。
  1秒のフレーム数は、7.21 枚。



6)プログラム直書き+PUSH

  LD (SP待避),SP
  LD SP,VRAM最終アドレス+1

  LD HL,画面データ#-1,-2 ; 10+1
  PUSH HL         ; 11+1

    :
    : ×0x2000回実行
    :

  1バイト当たり11.5クロック。
  1ページ描画(16Kバイト書き込み)には 123ms 。
  1秒のフレーム数は、8.15 枚。

  No WAIT 時は、

  1バイト当たり10.5クロック。
  1ページ描画(16Kバイト書き込み)には 112ms 。
  1秒のフレーム数は、8.93 枚。


 6)が限界っぽいです。描画サイズを小さくすると、もうちょっとフレーム数を稼げます。

 ハードを作るのは気が向いたら、ですね...



posted by えすび at 20:53| Comment(2) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする

2012年08月05日

動画再生(2)

 >>『動画再生カートリッジ』なるモノを作ると、かなりの事が出来そうです。

 既にHashiさんトコの掲示板で書きましたが、VRAM に外部から直接データが書き込めれば、内部のCPU は関係なく動画が再生できます。

 で、回路を調べた結果です。


・初代機:拡張カートリッジに割り当てられているVRAM に外部からデータを書き込む事が可能。
・mk2以降:外部からVRAMに書き込みは不可。

 mk2以降で拡張RAMカートリッジ(64Kの方)を挿した場合、64K のRAM空間が出来ますが、これをVRAM にする事は出来ないようです。

 ポート0xF0、0xF1 でメモリの読み書きの切り替えが出来ますが、これはあくまでも対CPUの回路で、VRAM は固定したアドレスから読み出しを行いません。


 さらに、mk2以降では、VRAM へアクセス時にCAS を外部に出力しません(外部のRAMをVRAMにしないので当たり前であるが)。
 そのため、外部で画面描画範囲を把握するのも、ちょっと面倒です。


 回路をちょっと変更するだけで、外部の拡張RAMカートリッジをVRAMに出来るんですが...もったいないです。



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

2012年07月20日

動画再生(1)

 音声合成回路を作るモチベーションが下がってるので、今更ながらニコニコ動画を見てみました。


 ユーザ登録をして、『初音ミクの10倍高い機械〜』、を視聴してみる。
 音声合成だけで結構な事をしていますよねー。すごいなー。

 最後にプログラム付きなので、FPGAの回路が出来た時の試験用にしよう。


 で、他にmarknさんの動画も視聴してみましたが、すごいですね...
 SDカードからデータを読み出しているとはいえ、後はP6のハードだけなんですから...


 S/W の技術では他の人に追いつかないので、H/W を使って動画を再生できないかなーと考えてみましたが...



 どうも意外と簡単に出来そうな感じです。
 『動画再生カートリッジ』なるモノを作ると、かなりの事が出来そうです。

 ただ、問題は...見ても単にP6やmk2の解像度で動画が再生されるだけで、面白くないかも...




posted by えすび at 23:37| Comment(0) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする