本発明の実施例について以下の順序で説明する。本実施例では、パチンコ機としての構成例を示すが、遊技機は、回胴式遊技機としてもよい。
A.遊技機の構成:
B.制御用ハードウェア構成:
C.表示制御処理:
D.非分割表示制御処理:
E1.分割表示制御処理:
E2.分割表示制御処理の変形例:
F.分割移行処理:
G.非分割移行処理:
A.遊技機の構成:
図1は実施例としてのパチンコ機1の正面図である。パチンコ機1は、中央に遊技領域6を備えた遊技盤4が取り付けられている。遊技者は、ハンドル8を操作して遊技領域6内に遊技球を打ち込み、入賞口に入賞させる遊技を行うことができる。入賞口の一つである始動入賞口9に遊技球が入賞すると、パチンコ機1は抽選を行い、その結果に応じて「大当り」か否かが決まる。大当り発生時には、大入賞口10が所定期間開放するなどの大当り遊技が行われる。
上述の抽選の結果は、4つのランプで構成された特別図柄表示装置41に表示される。遊技領域6の中央には、LCD16が備えられており、遊技中に種々の演出画面(装飾図柄と呼ぶこともある)が表示される。始動入賞口9への入賞時、大当りの発生時などにも、それぞれ遊技の状態に応じた演出画面が表示される。装飾図柄は、遊技の状況に応じて種々変化する。抽選結果を表示する過程で、大当りが発生する可能性が高いリーチ状態になると、スピード感あふれる画面が表示され、遊技者をハラハラドキドキさせることによって興趣を高めるようになっている。また、リーチ以前の状態や、遊技が行われていない時のデモ画面では、種々のスプライトを組み合わせて画面自体にも楽しめる要素を多分に含んだ画面が表示される。装飾図柄には、このように主としてスピード感が重視される画像(以下、「高速画像」という)と、主として画質が重視される画像(以下、「高画質画像」という)とが含まれる。以下の実施例は、スピード感および画質のいずれを重視すべきか微妙なものも含めて、高速画像、高画質画像のいずれかに分類したとして説明する。本実施例では、この分類に応じて2つの表示モードを使い分けるからである。装飾図柄を3通り以上に分類し、3つ以上の表示モードを使い分けるようにしてもよい。
B.制御用ハードウェア構成:
図2はパチンコ機1の制御用ハードウェア構成を示すブロック図である。パチンコ機1は、メイン制御基板3、払出制御基板25、サブ制御基板35、装飾図柄制御基板30などの各制御基板の分散処理によって制御される。メイン制御基板3、払出制御基板25、サブ制御基板35は、それぞれ内部にCPU、RAM、ROMなどを備えたマイクロコンピュータとして構成されており、ROMに記録されたプログラムに従って種々の制御処理を実現する。
実施例のパチンコ機1では、種々の不正を防止するため、メイン制御基板3への外部からの入力が制限されている。メイン制御基板3とサブ制御基板35とは単方向のパラレル電気信号で接続されており、メイン制御基板3と払出制御基板25とは、制御処理の必要上、双方向シリアル電気信号で接続されている。払出制御基板25、サブ制御基板35は、それぞれメイン制御基板3からのコマンドに応じて動作する。装飾図柄制御基板30は、サブ制御基板35からのコマンドに応じて動作する。パチンコ機1には、メイン制御基板3が直接に制御する機構もある。図中には、メイン制御基板3が制御する装置の一例として、大入賞口10を駆動するための大入賞口ソレノイド18、および特別図柄表示装置41を例示した。メイン制御基板3は、この他にも、普通図柄表示装置、特別図柄保留ランプ、普通図柄保留ランプ、大当り種類表示ランプ、状態表示ランプなどの表示を制御することができる。また、メイン制御基板3には、遊技中の動作を制御するため、種々のセンサからの検出信号が入力される。図中には一例として入賞検出器15aからの入力を例示した。入賞検出器15aとは、始動入賞口9への入賞を検出するためのセンサである。メイン制御基板3は、入賞検出器15aからの信号に応じて、先に説明した抽選を行い、大当り遊技を実行することができる。メイン制御基板3には、他にも種々の入力がなされているが、ここでは説明を省略する。
遊技時におけるその他の制御は、払出制御基板25、サブ制御基板35を介して行われる。払出制御基板25は、遊技中の遊技球の発射および払い出しを次の手順で制御する。遊技球の発射は、直接的には発射制御基板47によって制御される。即ち、遊技者が、発射ハンドル8を操作すると、発射制御基板47は操作に応じて発射モータ49を制御し、遊技球を発射する。遊技球の発射は、タッチ検出部48によって、発射ハンドル8に遊技者が触れていることが検出されている状況下でのみ行われる。払出制御基板25は、発射制御基板47に対して、発射可否の制御信号を送出することで、間接的に球の発射を制御する。
遊技中に入賞した旨のコマンドをメイン制御基板3から受信すると、払出制御基板25は、賞球払出装置21内の払出モータ20を制御し、払出球検出器22によって球数をカウントしながら規定数の球を払い出す。払出モータ20の動作は、モータ駆動センサ24によって監視されており、球ガミ、球切れなどの異常が検出された場合、払出制御基板25は、表示部4aにエラーコードを表示する。エラー表示された時には、係員が異常を除去した後、操作スイッチ4bを操作することで復旧させることができる。
サブ制御基板35は、遊技中における音声、表示、ランプ点灯などの演出を制御する。これらの演出は、通常時、入賞時、大当たり時、エラー時、不正行為その他の異常が生じた時の警報など、遊技中のステータスに応じて変化する。メイン制御基板3から、各ステータスに応じた演出用のコマンドが送信されると、サブ制御基板35は、各コマンドに対応したプログラムを起動して、メイン制御基板3から指示された演出を実現する。
本実施例では、図示する通り、サブ制御基板35はスピーカ29を直接制御する。LCD16は、装飾図柄制御基板30を介して制御する。装飾図柄制御基板30の回路構成は後述する。サブ制御基板35の制御対象となるランプには、遊技盤面に設けられたパネル装飾ランプ12と、枠に設けられた枠装飾ランプ31がある。サブ制御基板35は、ランプ中継基板32、34を介して、パネル装飾ランプ12および枠装飾ランプ31と接続されており、各ランプを個別に点滅させることができる。
図3は装飾図柄制御基板30の回路構成を示す説明図である。装飾図柄制御基板30は、サブ制御基板35から受けた表示コマンドに応じて、LCD16に画面を表示するための駆動データを出力する。駆動データは、LCD16にマトリックス状に備えられたR,G,Bの各画素の表示階調値を示すデータである。本実施例のLCD16は左右方向に800画素、上下方向に600画素を有している。駆動データは、主走査として、LCD16の左から右に順次、画素ごとに出力される。一ラスタ分の出力が完了すると、副走査として直下のラスタに移行し、同様に左から右に向けて順次、画素ごとに駆動データが出力される。以下では、左右方向を主走査方向と呼び、上下方向を副走査方向と呼ぶこともある。
装飾図柄制御基板30には、表示コマンドに応じた駆動データを生成する機能を実現するために図示する種々の回路が用意されている。装飾図柄制御基板30には、まず、駆動データの生成を制御するためのマイクロコンピュータとしてCPU381、RAM382、ROM383が備えられている。ROM383には、駆動データを生成するための表示プログラム、表示コマンドに対し表示すべき画面、表示の時間、表示の順序を規定するスケジューラ、各画面の構成を規定する画面データが記憶されている。画面データの内容については後述するが、この段階では、LCD16の画素に対応したデータとはなっていない。CPU381は、ROM383を参照して、表示コマンドに応じた画面データを抽出し、VDP(Video Display Processor)385に出力する。
キャラROM386は、スプライトデータ、即ち画面に表示されるスプライトをビットマップで表したデータを格納している。VDP385は、CPU381から受け取った画面データに基づいて、表示すべきスプライトデータをキャラROM386から抽出し、表示データ、即ち表示すべき画像をビットマップ展開したデータを生成して、スケーラ390に出力する。以下、ビットマップ展開するための記憶領域を「キャンバス」と呼ぶ。
VDP385には、CPU381からの画面データを受け取り保持しておくためのレジスタとして、スプライトレジスタ385sおよびVDPレジスタ385vを備えている。スプライトレジスタ385sは、画面データのうち、スプライトの配置や重ね合わせの順序などを示す描画コマンドを受け取るためのレジスタであり、ダブルバッファとして構成されている。つまり、第1バッファ、第2バッファという二つの等しい容量のバッファが備えられている。従って、VDP385は、CPU381から出力された描画コマンドが第1バッファに書き込まれている間、第2バッファに保持されている描画コマンドを読み出して表示データの生成処理を実行することができる。VDPレジスタ385vは、表示データを生成する際の条件設定を指定するコマンド(以下、「条件設定コマンド」と呼ぶ)を記憶するためのレジスタである。条件設定コマンドには、例えば、描画コマンドが複数のレイヤから構成されている場合に、各レイヤの重ね合わせ順序、表示/非表示の設定などが含まれる。条件設定コマンドは比較的低容量であり、書き込みの所要時間が短いことから、VDPレジスタ385vはダブルバッファとはなっていない。
スケーラ390は、VDP385からの表示データをフレームメモリ397に格納する。また、フレームメモリ397から表示データを読み出し、LCD16に出力する。図示する通り、本実施例では、フレームメモリ397の内部は397[0]〜397[5]の6つのフィールドに分かれている。4つのフィールド397[0]〜397[3]は800×300画素分を単位とするメモリ領域(以下、「SVGAフィールド」と呼ぶこともある)である。フィールド397[4]、397[5]は640×480画素分を単位とするメモリ領域(以下、「VGAフィールド」と呼ぶこともある)である。このようにサイズの異なる2種類のフィールドが用意されている意義について説明する。
本実施例では、VDP385は2つの表示モードでLCD16の表示データを生成する。一つは、表示データを、640×480画素のVGAサイズで生成するモードである。このモードでは、VGAサイズの表示データをスケーラ390で800×300画素に拡大してLCD16に出力する。以下、この表示モードを非分割モードと称する。非分割モードは、VGAサイズの画像を拡大してLCD16に表示するため、1フレーム分の表示データを速やかに準備することができる反面、画質が比較的低いという特徴がある。本実施例では、高速画像の表示に非分割モードを用いる。
2つ目のモードは、LCD16の表示データを2回に分けて生成する表示モードである。本実施例では、図中に示すようにLCD16の表示領域を中央でそれぞれ800×300ドットの分割領域に分割する。以下、上側の領域を上画像、下側の領域を下画像と呼ぶものとする。VDP385はまず上画像の表示データを生成し、フレームメモリ397に格納し、次に下画像の表示データを生成して、フレームメモリ397に格納する。スケーラ390は、上画像と下画像の両方の表示データが格納された時点で、両者をLCD16に順次、出力する。こうすることで、VDP385が800×600ドットの表示データを一度に生成するだけの能力を有しない場合でも、解像度を低下させることなく画面を表示させることが可能となるのである。スケーラ390は、本来、LCD16への出力過程で、VDP385によって生成された表示データの画素数を増減しLCD16の画素数に適合させたり、いわゆるインターレース形式で生成された表示データをノンインタレース形式に形式変換したりするための素子であり、フレームメモリ397の内部を4つのフィールドに分けて管理する機能も、本来は画素数の増減や形式変換を実現するために用意されている機能である。本実施例では、この機能を以下で説明する通り流用することで、分割して生成された表示データを結合して1画面分の表示データを生成する機能を実現する。以下、このモードを分割モードと称する。分割モードは、高解像度で表示データを生成可能であるため、本実施例では、高画質データの表示に用いる。
フレームメモリ397に設けられた各フィールド397[0]〜397[3]には、分割モードにおいてVDP385によって1回に生成される表示データを格納することができる。フィールド397[0]、397[2]はそれぞれ上画像の表示データを格納し、フィールド397[1]、397[3]はそれぞれ下画像の表示データを格納する。従って、フィールド397[0]、397[1]には併せて1フレーム分のデータが格納され、フィールド397[2]、397[3]にも併せて1フレーム分のデータが格納される。つまり、フレームメモリ397は、フィールド397[0]〜397[3]を用いて分割モードにおける2フレーム分の表示データを格納することができる。
フィールド397[4]、397[5]は640×480画素の画像データ、即ち非分割モードで生成される表示データを格納可能である。つまり、フレームメモリ397は、フィールド397[4]、397[5]を用いて、非分割モードにおける2フレーム分の表示データを格納することができる。このように、本実施例では、分割モード、非分割モードでそれぞれフレームメモリ397内に個別に用意されたフィールドを用いている。こうすることにより、表示モードを切り換える過程を含めて、表示データの簡易かつ安定的に管理することが可能となる。もっとも、このように表示モードによってフィールドを使い分けることは必然的な構成ではなく、双方のモードで共通のフィールドに表示データを格納する構成としてもよい。また、本実施例では、それぞれの表示モードで2フレーム分の表示データを格納可能としたが、1フレーム分のデータのみを格納可能としてもよいし、3フレーム以上のデータを格納可能としてもよい。
フレームメモリ397の各フィールド397[0]〜397[5]に表示データを誤り無く格納するため、本実施例では、CPU381がVDP385に描画コマンドを出力する際に、フィールド信号を生成し、スケーラ390に出力する。フィールド信号は、非分割モードにおいてはフレームの切り換えを表す信号となり、分割モードにおいては、上画像/下画像のいずれの描画コマンドを示す信号ともなる。スケーラ390は、この信号に応じて内部的に制御信号IFLDを生成し、フィールド397[0]〜397[5]のうち、VDP385からの表示データを格納すべきフィールドを特定する。
VDP385からスケーラ390には、表示データと併せて同期信号VSYNCが出力される。非分割モードでは、同期信号VSYNCは1フレーム分の表示データが生成される度に出力され、分割モードでは上画像、下画像が生成される度に出力される。本実施例では、非分割モードのデータは32msec周期で生成し、分割モードにおける上画像、下画像の生成は、16msec周期で行うものとした。この同期信号VSYNCは、信号停止回路389を介してスケーラ390に出力される。信号停止回路389は、CPU381が出力する制御信号VENに応じて、同期信号VSYNCの伝達/停止を切り換え可能な回路である。本実施例では、東芝社製のTC7SZ125AFE(商標)なる素子を用いた。この素子は、A端子、Y端子、G端子を有しており、G端子がロウの時のみA端子の入力信号をY端子から出力する機能を有している。この素子を用いる場合には、A端子をVDP385、Y端子をスケーラ390、G端子をCPU381に接続すればよい。本実施例では、同期信号VSYNCの伝達/停止の切り換えは、後述する通り、表示モードの移行時期に行う。本実施例では、このようにハードウェア的に伝達/停止を切り換えたが、この切り換えはVDP385からの同期信号VSYNCの出力/停止をソフトウェア的に切り換える方法で実現してもよい。
スケーラ390は、LCD16に16msecのフレームレートで同期信号および駆動データを出力し、LCD16の画像を更新する。同期信号は、スケーラ390自身が生成する。先に説明した通り、本実施例では、1フレーム分の表示データは32msec周期でしか更新されない。非分割モードでは表示データの生成は32msecで行われ、分割モードでは、上画像、下画像の両方の表示データをそろえるためには、16msecの処理を2回行う必要があるからである。従って、本実施例では、スケーラ390は、既に生成済みの表示データを、フレームメモリ397から16msecで読み出し、LCD16に出力する処理を2回繰り返すことにより、同一画像を16msecで2回表示しつつ、表示内容を32msecで更新しながらLCD16への表示を行う。
本実施例のLCD16は800×600画素を備えている。従って、分割モードでは、スケーラ390は上画像/下画像の表示データをそのまま駆動データとして出力すればよい。非分割モードでは、表示データが600×480画素で生成されているため、スケーラ390は、この表示データを1.25倍に拡大して、800×600画素相当の駆動データを生成し、LCD16に出力する。このようにスケーラ390はVDP385によって生成された表示データを加工してLCD16に出力してもよい。例えば、スケーラ390は、上画面/下画面に分割して生成された表示データを結合する過程で上画面/下画面の画素数の増減を行っても良いし、結合した後、LCD16に出力する段階で画素数の増減を行っても良い。分割モードでは、原理的には無制限に高解像度の画面を表示することも可能となるが、現実には、高解像度の画面に対応した膨大なキャラクタデータを用意する必要が生じ、キャラROM386の容量が膨大になってしまうという弊害や、キャラROM386へのアクセス回数の増加、スプライトを描画する際の処理負荷の増大などに伴う制約が生じるのが通常である。上述の通り、画面の分割と、スケーラ390本来の機能である画素数の増減とを組み合わせて適用することにより、これらの弊害を抑えながら、高解像度での画面表示を実現することが可能となる。
C.表示制御処理:
図4は表示制御処理のフローチャートである。CPU381がVDP385に対して描画コマンド等を出力し、表示データを生成させるために実行する処理である。この処理は、16msec周期の割込処理として実行される。この処理を開始すると、CPU381は、処理を実行するための準備として、多重割込みを許可し(ステップS1)、ノイズキャンセル・判定処理を行う(ステップS2)。そして、割込端子の端子レベルを確認し(ステップS3)、端子レベルが異常の場合には、ノイズ等の影響による異常なトリガに基づいて表示制御処理が開始されたものと判断し、そのまま処理を終了する。端子レベルが正常の場合には、以下に示す処理によって、描画コマンド、条件設定コマンドの出力を行う。
端子レベルが正常の場合には、CPU381は現在の表示モードが非分割モード/分割モードのいずれであるかを読み込み(ステップS4)、サブ制御基板35からのコマンドに基づいて次に非分割モード/分割モードのいずれの表示モードを採るべきかを設定する(ステップS5)。そして、両者の比較に基づいて表示制御モードを判断する(ステップS6)。表示制御モードは、表示モードに関する制御処理の分類である。非分割モード、分割モードという2つの表示モードの他、非分割モードから分割モードへの移行モード、分割モードから非分割モードへの移行モードが含まれる。CPU381は、現在の表示モードおよび次に採るべき表示モードに応じて、以下の通り4通りの表示制御モードに対応する制御処理を実行する。
(現在)非分割モード→(次)非分割モードの場合、非分割表示制御処理(ステップS100);
(現在)分割モード→(次)分割モードの場合、分割表示制御処理(ステップS200);
(現在)非分割モード→(次)分割モードの場合、分割移行処理(ステップS300);
(現在)分割モード→(次)非分割モードの場合、非分割移行処理(ステップS400);
以下では、各表示制御モードにおける処理内容について順に説明する。
なお、本実施例では、表示制御処理において上述の表示制御モードを設定し、それぞれ対応する処理に振り分ける制御方法を説明した。各表示制御モードを使い分ける方法は、図4に例示した方法に限らない。本実施例も含め、上述の4つの表示制御モードは、非分割表示制御処理(ステップS100)、分割移行処理(ステップS300)、分割表示制御処理(ステップS200)、非分割移行処理(ステップS400)の順にシーケンシャルに行われるのが通常である。従って、それぞれの表示制御モードを繰り返し実行する過程で、次の表示制御モードに移行するか否かの判定を組み込むようにしてもよい。例えば、非分割表示制御処理(ステップS100)の中に、分割移行処理に移行するか否かの判断処理を組み込めばよい。こうすることにより、上述の処理(図4)よりも簡易な処理で表示制御モードの使い分けができる利点がある。ただし、上述の処理(図4)には、表示制御モードを柔軟に切り換え可能という利点がある。例えば、分割モードとして更に、3分割の表示モードが増えた場合など、表示モード間の移行態様が多様になった場合でも、上述の処理はステップS6の分岐条件を修正することにより、比較的容易に対応できる利点がある。
D.非分割表示制御処理:
図5は非分割表示処理における表示データの生成例を示す説明図である。図の右下に示す画像(640×480ドット)(以下、「VGA画像」という)を表示する手順を示した。図の左側には、VDP385内での処理概要を示し、図の右側にはフレームメモリ397に格納されるデータ内容を示した。図の左側に示すように、VDP385内では、描画データをビットマップ展開するためのキャンバスCV01が用意されている。回路上では、キャンバスCV01内の全画素に対応するメモリ領域が用意されることになる。キャンバスCV01のサイズは、VGA画像(640×480ドット)よりも大きく、LCD16の表示領域(800×600ドット)よりも小さく縦方向は512ドットとなっている。以下、説明の便宜上、キャンバスCV01の左上を原点として左から右に向かう主走査方向をx方向、上から下に向かう副走査方向をy方向と呼ぶこともある。
本実施例では、キャンバスCV01に対応する物理的なメモリが用意されている場合を例にとって説明するが、キャンバスCV01は仮想的なものでもよい。例えば、キャンバスCV01上への描画をラスタ単位で行う場合には、1ラスタ分の描画データをビットマップ展開するためのラインメモリ、およびキャンバスCV01のどのラスタを展開しているのかを管理するためのレジスタを用意しておけば足りる。VDP385が描画可能なキャンバスCV01のサイズは、このレジスタの上限値で決定されることになる。本実施例は、このレジスタの上限値が512に制限されている場合に相当すると言うこともできる。
キャンバスCV01内には、VGA画像相当の表示エリアVAが定義される。VDP385は、キャンバスCV01上に画像をビットマップ展開した後、表示エリアVA内の画像を切り出し、表示データとしてスケーラ390に出力する。本実施例において、キャンバスCV01を表示エリアVAよりも大きいサイズとしたのは、スプライトが表示エリアVAから一部はみ出す状態で配置された場合でも比較的簡易な処理でビットマップ展開可能とするためである。このような状態でスプライトが配置されている場合の処理方法としては、キャラROMから取得したスプライトデータのうち、表示エリアVA内に存在する部分のみを切り出してビットマップ展開する方法も可能ではある。しかし、この方法では、描画時の処理負荷が非常に高くなる。これに対し、キャンバスCV01を表示エリアVAよりも大きくしておけば、スプライトが表示エリアVAからはみ出す場合でも、上述の切り出しを行うまでなく、ビットマップ展開できるため、処理の簡素化を図ることができるのである。こうした効果を重視しない場合は、キャンバスCV01と表示エリアVAとを同じ形状とすることも可能である。
CPU381から上画像の描画データを受け取り、VDP385が画像を描画すると、キャンバスCV02の状態が得られる。VDP385は、キャンバスCV02から、表示エリアVA内の画像を切り出し、スケーラ390を介して(図示を省略)、表示データとして出力する。この表示データは、フレームメモリ397のVGA画像用のフィールド397[4]に格納される。この結果、フレームメモリ397内には、状態FM01で示す内容の表示データが格納されることになる。この表示データを出力すれば、LCD16には右下に示した画像を表示させることができる。ただし、本実施例では、スケーラ390は、この表示データをLCD16の800×600画素相当のサイズとなるよう1.25倍に拡大して出力する。
図6は非分割モードにおけるVDP385への画面データ出力の様子を示すタイミングチャートである。図5で説明した手順でVGA画像の表示データがフレームメモリに格納され、LCD16に出力される様子を示した。VDP385のスプライトレジスタ385sには、32msec周期で繰り返し描画コマンドが書き込まれる。図中では、LCD16に表示されるフレームに対応して「VGA1」、「VGA2」のように示した。
図3で説明した通り、スプライトレジスタ385sはダブルバッファとなっている。第1バッファへの「VGA1」の描画コマンドの書き込みが完了すると、この描画コマンドは、DMA信号に同期して、第2バッファにDMA転送され、VDP385によるビットマップ展開が開始される。この結果、図中に示すように、「VGA1」の書き込みが完了し、DMA信号が出力された後で、VDP出力として「VGA1出力」
が得られる。VGA2以降の描画コマンドおよび表示データの出力も同様のタイミングで繰り返される。また、VDP出力と併せてVDP385からは同期信号VSYNCが出力される。
CPU381からVDP385には、描画コマンドの他、描画条件を指定する条件設定コマンドも出力される。このコマンドはVDPレジスタに格納される。また、CPU381は、VDP385に描画コマンドを出力する際に、フィールド信号を出力する。フィールド信号は、図示する通り、フレームごとにON/OFFが切り替わる信号である。スケーラ390は、フィールド信号に連動する形でデータ読み書きをする対象となるフィールドを指定する制御信号IFLDを内部的に生成する。分割表示モードでも使用できるよう制御信号IFLDは上位桁をIFLD1、下位桁をIFLD0とする2ビットの信号として設定されている。
下位桁IFLD0のON・OFFは、フィールド信号を受けて変化する。ただし、CPU381からVDP385への描画コマンド書き込みと、VDP385からの表示データ出力のタイミングのずれに応じて、フィールド信号および制御信号IFLD0の出力タイミングにはずれが生じる。下位桁IFLD0のON・OFFが変化すると、1周期ごとに上位桁IFLD1のON・OFFが変化する。つまり、制御信号IFLDは、フィールド信号の変化に連動して、2ビットで「00H」〜「03H」の4値を表す信号となっている。制御信号の下位桁IFLD0のOFF/ONは、それぞれフレームメモリ397のフィールド397[4]〜397[5]に対応する。
例えば、VDP385から「VGA1出力」がなされている時点では、制御信号IFLDは、「10H」を表しているから、書き込みメモリはフィールド397[4]となる。「VGA2出力」がなされている時点では、書き込みメモリはフィールド397[5]となる。この時点では、フィールド397[4]にはVGA1の表示データが格納されているため、VDP385はフィールド397[4]からデータを読み出し、LCD16に出力する。読み出しメモリは、制御信号IFLD0を反転させた信号で指定すればよい。「VGA2出力」がなされている時点では、制御信号IFLD0はONとなっているから、その反転信号はOFFである。従って、下位桁が「0」となるフィールド、つまりフィールド397[4]が読み出しメモリとなる。VGA1出力が完了すると、下位桁IFLD0がOFFとなるから、読み出しメモリはフィールド397[5]に切り替わる。
以上で示した手順により、VDP385はCPU381から描画コマンドを受け取り、表示データを生成してフレームメモリ397に書き込む。フレームメモリ397の書き込みメモリは、32msec周期で切り替わる。スケーラ390は、また、フレームメモリ397から、格納済みの表示データを読み出し、LCD16に駆動データとして出力する。図示する通り、LCD16への出力は、同一の読み出しメモリから2回ずつ繰り返して行われる。つまり、LCD16には16msec周期で同じ駆動データが出力され、同じ画面が表示される。画面内容は、32msec周期で切り替わることになる。本実施例では、遊技中に表示される画面のスケジュール管理を容易にするため、分割モードと非分割モードの両者で、LCD16の画面内容が更新される周期を32msecで統一した。こうすることにより、VDP385に過度の処理負荷をかけることを回避できる利点もある。もっとも、非分割モードにおけるLCD16の画面更新周期は、分割モードと必ずしも合わせる必要はない。例えば、VDP385が処理可能であれば、非分割モードでは図6に示した描画コマンドの出力、表示データの出力等を16msec周期で実行し、LCD16の画面内容を16msecで更新してもよい。こうすることにより、非分割モードは、高速画像を滑らかに表示することが可能となる。
図7は非分割表示制御処理のフローチャートである。表示制御処理(図4)のステップS100に相当する処理である。CPU381がVDP385に対して描画コマンド等を出力し、非分割モードで表示データを生成させるための処理である。この処理は、32msec周期の割込処理として実行される。16msecの割込処理として構成し、2回の割込に対して1回の割合で処理全体をスキップするようにしてもよい。
この処理を開始すると、CPU381は、VDP385を初期化する(ステップS102)。この処理には、VDP385が表示データの生成に使用する種々のレジスタ等の値の初期化が含まれるが、CPU381からの描画コマンド等を保持しておくべきスプライトレジスタおよびVDPレジスタの初期化は含まれない。スプライトレジスタ等の初期化は、別途実行することになる。
次に、CPU381はVDP385のスプライトレジスタを初期化する(ステップS104)。また、VDPレジスタに条件設定コマンドを設定する(ステップS106)。これは、表示データ生成時に使用される種々の設定をVDPレジスタに書き込む処理である。これらの初期化およびVDPレジスタ設定が完了すると、CPU381は、次にサブ制御基板35から受信した表示コマンドの内容を解析し(ステップS108)、LCD16に表示すべき画面データを特定する。そして、この画面データに基づいてVGA画像の描画コマンドをVDP385に出力する(ステップS110)。
CPU381は、描画コマンド出力の後、スプライトの最適化を行う(ステップS112)。これは、次の手順で、VDP385に定義された表示エリア(図5のVA参照)から全体が外れるようなスプライトについては、描画コマンドから省略する処理である。先に説明した描画コマンド出力時には、CPU381は、スプライトが表示エリアに含まれるか否かを判定することなく、画面データで特定された全てのスプライトを描画対象としてVDP385のスプライトレジスタに書き込む。各スプライトについては、描画位置の指定の他、表示/非表示を切り換えるためのフラグが設けられており、この段階では、このフラグは全て「表示」に設定されている。CPU381は、スプライトの最適化では、それぞれのスプライトレジスタについて、書き込んだスプライトレジスタのサイズ、位置に基づいて、表示エリアから全体が外れるか否かを判定する。全体が外れるスプライトに対しては、CPU381は、上述のフラグを切り換え「非表示」に設定する。
スプライト最適化は、上述の通り、全体が表示エリアから外れるスプライトをキャンバス上に描画するという無駄な処理を回避するためである。描画コマンドを出力する際に、一つ一つのスプライトについて表示エリアから外れるか否かの判定を行う方法を採ることも可能ではあるが、本実施例では、描画コマンドの出力と、スプライト最適化に分けることにより、同種の処理を集約することができ、処理効率を向上させている。もっとも、スプライト最適化は、VDP385の処理効率を向上させるための処理であるため、省略することも可能である。CPU381は、以上の処理が完了すると、フィールド信号(図6参照)を切り換えて(ステップS114)、非分割表示制御処理を終了する。
E1.分割表示制御処理:
図8は分割モードにおける表示データの生成例を示す説明図である。図の右下に示す画像(800×600ドット)を表示する手順を示した。図の左側には、VDP385内での処理概要を示し、図の右側にはフレームメモリ397に格納されるデータ内容を示した。図の左側に示すように、VDP385内では、描画データをビットマップ展開するためのキャンバスCV1が用意されている。回路上では、キャンバスCV1内の全画素に対応するメモリ領域が用意されることになる。キャンバスCV1のサイズは、上画像/下画像(800×300ドット)よりも大きく、LCD16の表示領域(800×600ドット)よりも小さく、縦方向に512ドットとなっている。
キャンバスCV1内には、表示エリアVAが定義されている。これは上画像/下画像と同一形状の領域である。VDP385は、キャンバスCV1上に画像をビットマップ展開した後、表示エリアVA内の画像を切り出し、表示データとしてスケーラ390に出力する。
CPU381から上画像の描画データを受け取り、VDP385が画像を描画すると、キャンバスCV2の状態が得られる。VDP385は、キャンバスCV2から、表示エリアVA内の画像を切り出し、スケーラ390を介して(図示を省略)、表示データとして出力する。この表示データは、フレームメモリ397の上画像用のフィールド397[0]に格納される。この結果、フレームメモリ397内には、状態FM1で示す内容の表示データが格納されることになる。
次に、CPU381から下画像の描画データを受け取り、VDP385が画像を描画すると、キャンバスCV3の状態が得られる。本実施例では、表示エリアVAの位置は固定したまま、画像の位置を−y方向に300ドット分ずらして描画する。この移動を実現するためには、描画コマンドで指定されるy座標値から300を引けばよい。画像の位置をずらして描画した状態で、表示エリアVA内の画像を切り出せば、下画像の表示データが得られることになる。この表示データは、フレームメモリ397の下画像用のフィールド397[1]に格納される。この結果、フレームメモリ397内には、状態FM2で示す通り、画像全体を表す表示データが格納されることになる。この表示データを出力すれば、LCD16には右下に示した画像を表示させることができる。
図9は分割モードにおいてVDP385への画面データ出力の様子を示すタイミングチャートである。図8で説明した手順で、上画像、下画像の表示データがフレームメモリに格納され、LCD16に出力される様子を示した。VDP385のスプライトレジスタ385sには、上画像、下画像の順で繰り返し描画コマンドが書き込まれる。図中では、LCD16に表示されるフレーム1に対応した上画像、下画像をそれぞれ「上1」、「下1」のように略称で示した。フレーム2、フレーム3に対応する上画像、下画像も同様である。
図3で説明した通り、スプライトレジスタ385sはダブルバッファとなっている。第1バッファへの「上1」の描画コマンドの書き込みが完了すると、この描画コマンドは、DMA信号に同期して、第2バッファにDMA転送され、VDP385によるビットマップ展開が開始される。この結果、図中に示すように、「上1」の書き込みが完了し、DMA信号が出力された後で、VDP出力として「上1出力」、即ち「上1」に対応した表示データの出力が得られる。「下1」以降の描画コマンドおよび表示データの出力も同様のタイミングで繰り返される。また、VDP出力と併せてVDP385からは同期信号VSYNCが出力される。
CPU381からVDP385には、描画コマンドの他、描画条件を指定する条件設定コマンドも出力される。このコマンドはVDPレジスタに格納される。本実施例では、CPU381からVDP385への上画像の描画コマンドの出力が完了した時点で、条件設定コマンドを出力するものとした。従って、図示するように、例えば、「上1書き込み」後のDMA信号に同期して、VDPレジスタ更新、つまりVDPレジスタへの条件設定コマンドの出力が行われる。この条件設定コマンドは、「上1出力」および「下1出力」のVDP出力に共通して用いられる。従って、「下1書き込み」後のVDPレジスタの更新は省略することができる。
CPU381は、VDP385に描画コマンドを出力する際に、上画像/下画像を特定するフィールド信号を出力する。フィールド信号は、図示する通り、上画像に対してON、下画像に対してOFFとなる信号である。スケーラ390は、フィールド信号に連動する形でデータ読み書きをする対象となるフィールドを指定する制御信号IFLDを内部的に生成する。制御信号IFLDは2ビットの信号であり、図中では上位桁をIFLD1、下位桁をIFLD0で表した。
下位桁IFLD0のON・OFFは、フィールド信号を受けて変化する。例えば、「上1書き込み」時にCPU381からフィールド信号としてONが出力されると、VDP385は「上1出力」時に制御信号IFLD0としてONを出力する。CPU381からVDP385への描画コマンド書き込みと、VDP385からの表示データ出力のタイミングのずれに応じて、フィールド信号および制御信号IFLD0の出力タイミングにはずれが生じる。下位桁IFLD0のON・OFFが変化すると、1周期ごとに上位桁IFLD1のON・OFFが変化する。つまり、制御信号IFLDは、フィールド信号の変化に連動して、2ビットで「00H」〜「03H」の4値を表す信号となっている。制御信号IFLDで表される4値は、それぞれフレームメモリ397のフィールド397[0]〜397[3]に対応している。
例えば、VDP385から「上1出力」がなされている時点では、制御信号IFLDは、「10H」を表しているから、書き込みメモリはフィールド397[2]となる。「下1出力」がなされている時点では、書き込みメモリはフィールド397[3]となる。つまり、フレーム1の上画像、下画像の表示データは、フィールド397[2]、397[3]に書き込まれることになる(図3参照)。この時点では、フィールド397[0]、397[1]にはフレーム1よりも前に書き込み済みの表示データが格納されているため、VDP385はフィールド397[0]、397[1]からデータを読み出し、LCD16に出力する。読み出しメモリは、制御信号IFLD1を反転させた信号で指定すればよい。上述の時点では、制御信号IFLD1はONとなっているから、その反転信号はOFFである。従って、上位桁が「0」となるフィールド、つまり「00H」、「01H」に対応するフィールド397[0]、397[1]が読み出しメモリとなる。下1出力が完了すると、上位桁IFLD1がOFFとなるから、読み出しメモリは「10H」、「11H」に対応するフィールド397[2]、397[3]に切り替わる。また、下位桁IFLD0に応じて、フィールド397[0]、397[1]が書き込みメモリとなる。
以上で示した手順により、VDP385はCPU381から描画コマンドを受け取り、表示データを生成してフレームメモリ397に書き込む。フレームメモリ397の書き込みメモリは、16msec周期で切り替わる。スケーラ390は、また、フレームメモリ397から、格納済みの表示データを読み出し、LCD16に駆動データとして出力する。図示する通り、LCD16への出力は、同一の読み出しメモリから2回ずつ繰り返して行われる。つまり、LCD16には16msec周期で同じ駆動データが出力され、同じ画面が表示される。画面内容は、32msec周期で切り替わることになる。
図10は分割モードにおける表示制御処理のフローチャートである。CPU381がVDP385に対して描画コマンド等を出力し、表示データを生成させるために実行する処理である。この処理は、16msec周期の割込処理として実行される。
先に説明した通り、本実施例では、表示制御処理を実行する度に、上画像、下画像を順次、切り換えて描画コマンドを出力することになる。上画像、下画像のいずれを処理対象とすべきかは、上下フラグによって管理される。上下フラグは、上画像を処理対象とすべき時には値1となり、下画像を処理対象とすべき時には値0となるフラグである。
CPU381は上下フラグが値0の場合には(ステップS202)、以下に示す通り、上画像に対する処理を実行する。まず、CPU381はVDP385を初期化する(ステップS204)。この処理には、VDP385が表示データの生成に使用する種々のレジスタ等の値の初期化が含まれるが、CPU381からの描画コマンド等を保持しておくべきスプライトレジスタおよびVDPレジスタの初期化は含まれない。スプライトレジスタ等の初期化は、別途実行することになる。
CPU381は次に上半分表示処理を実行する(ステップS210)。上半分表示処理の内容は後で詳述し、ここでは概要のみを説明する。この処理は、新たなフレームの上画像の描画コマンドをVDP385に出力する処理ではない。新たな上画像の描画コマンド出力に先立って、直前のフレームの下画像の描画コマンドの座標を修正する処理である。この下画像の描画コマンドは既にVDP385のスプライトレジスタに蓄積されているデータであり、本来、上画像に対する処理では不要のデータである。しかし、スプライトレジスタの初期化を行っても、そのままスプライトレジスタに残っている場合がある。初期化では、レジスタに全て「0」や「Null」を入力するとは限らず、描画コマンドを残したまま、単にその描画コマンドの設定を「無効」、「非表示」などにする簡易な方法が採られることもあるからである。この場合には、設定の誤り等によって、従前のフレームのスプライトが再度、表示対象となる可能性がないとは言えない。そこで、本実施例では、仮にこのような事態が生じたとしても、上画像の表示データに極端な違和感を与えることを回避するための処理として、上半分表示処理を実行している。この処理では、例えば、図8のキャンバスCV3に示された画像の位置は、キャンバスCV2に示した上画像の描画時の位置に戻される。次のフレームは、従前のフレームと近似した画像となることが多いため、このように位置を修正しておくことにより、例え従前の描画コマンドが表示データに影響を与えたとしても、違和感を十分に抑制することが可能となる。上半分表示処理は必須の処理ではないため、省略することも可能である。
上半分表示処理が完了すると、CPU381はVDP385のスプライトレジスタを初期化する(ステップS220)。この時点で、併せてVDPレジスタの初期化も行う。初期化が完了すると、CPU381は、次にサブ制御基板35から受信した表示コマンドの内容を解析し(ステップS222)、LCD16に表示すべき画面データを特定する。そして、この画面データに基づいて上画像の描画コマンドをVDP385に出力する(ステップS224)。先に図8で説明した通り、本実施例では、上画像、下画像のいずれを処理するかに関わらず、LCD16に表示すべき画面全体の描画コマンドをVDP385に出力している。上画像、下画像の生成時で異なるのは、描画コマンドの座標値のみである。本実施例では、描画コマンドは、上画像生成時を基準として用意しておくものとした。従って、ステップS224の処理では、CPU381は描画コマンドの座標値を修正するまでなく、そのままVDP385に出力すれば足りる。
CPU381は、描画コマンド出力と並行して、スプライトの最適化を行う(ステップS226)。
CPU381は、以上の処理が完了すると、下画像が次の処理対象となることを示すため、フィールド信号(図9参照)をOFFとする(ステップS228)。また、上下フラグを値1だけ増加させる(ステップS250)。上下フラグは1ビットのフラグであるため、この処理によって上下フラグの値は1となり、次の処理では下画像が処理対象と判断されることになる。
ステップS13において、上下フラグが値1の場合には、CPUは以下の手順で下画像に対する処理を実行する。まず、CPUはVDP385を初期化し(ステップS230)、VDPレジスタに条件設定コマンドを設定する(ステップS232)。これは、図9に示したVDPレジスタの更新に相当する処理であり、上画像、下画像に共通して表示データ生成時に使用される種々の設定を行う処理である。VDP385は、この処理を受けて、スプライトレジスタに設定済みの描画コマンドに基づき、上画像の表示データを生成してフレームメモリ397に出力する。
CPU381は、次に下半分表示処理を実行する(ステップS234)。この処理は、先に概要を説明した上半分表示処理(ステップS210)と同様、描画コマンドの座標値を修正する処理である。この処理によって、例えば、上画像の描画時には、図8中のキャンバスCV2の状態で配置される描画コマンドは、キャンバスCV3の状態に移動されることになる。本実施例では、上画像、下画像はy方向に300ドットのサイズとなっているから、下半分処理では、描画コマンドのy座標をそれぞれ300ずつ減じればよい。
CPU381は、下半分表示処理が完了すると、スプライトの最適化を行い(ステップS236)、フィールド信号をONとし(ステップS238)、上下フラグを値1だけ増加させる(ステップS250)。上下フラグは1ビットのフラグであるから、この演算によって値0となる。この結果、フィールド信号、上下フラグともに、次の処理対象が上画像であることを示す状態となる。この後、VDP385内では、下画像の描画コマンドが読み込まれ、表示データが生成される。条件設定コマンドはステップS51でVDPレジスタに設定された内容がそのまま使用される。本実施例では、上画像の描画コマンドが設定された後、その表示データの生成を開始する前の時点で、条件設定コマンドを設定することにより、下画像に対する一連の処理内で、条件設定コマンドを上画像、下画像に流用することができる。
図11は上半分表示処理のフローチャートである。表示制御処理(図10)のステップS210に相当する処理である。この処理は、先に説明した通り、VDP385のスプライトレジスタに格納されている描画コマンドのy座標を300増加させる。本実施例では、スプライトごとに、その配置、表示/非表示の設定することで描画コマンドが構成されていることから、スプライト単位で順次、その座標を修正する手法を採った。以下では、それぞれのスプライトに対して、一義的な識別番号として「スプライトNo.」が付されているものとして説明する。
まず、CPU381は全スプライトを順番に処理するための初期設定として、処理対象となるべき「スプライトNo.」を0に設定する(ステップS211)。そして、処理対象となるスプライトの設定データを読み込む(ステップS212)。図中に設定データの内容を例示した。識別番号としての「スプライトNo.」、キャラROM内の「データ格納場所」を表すアドレス、スプライトを配置すべきキャンバス上の配置座標(XPOS,YPOS)、およびスプライトの表示/非表示を切り換えるためのフラグが含まれる。この他のデータを含めても差し支えない。
CPU381は、処理対象のスプライトが、表示/非表示フラグによって「表示」設定されている場合には(ステップS213)、配置座標の修正を施す(ステップS214)。つまり、y座標(YPOS)を値300だけ増大させる。図中にこの処理の意味を示した。図の左側に示す通り、表示エリアVAおよび画像が配置されているとする。この状態で画像のy座標を値300だけ増大させると、右側に示すように画像の位置が表示エリアVAに対して相対的に下側にずれる。表示エリアVAは縦方向に300ドットであるから、左側の画像で表示エリアVAから上側にはみ出していた部分が表示エリア内に入る。つまり、左側の下画像に対応する上画像が表示エリアVA内に現れることになる。CPU381は、表示/非表示フラグが非表示設定となっている場合には(ステップS213)、上述した配置座標の修正を施す必要はないと判断し、ステップS214をスキップする。
以上の処理を、CPU381は「スプライトNo.」が所定の上限値Nlimに至るまで(ステップS215)、「スプライトNo.」を順次、値1ずつ増加させながら(ステップS216)、繰り返し実行する。上限値Nlimは、画面データで用いられる全スプライトに付された「スプライトNo.」の最大値とすることができる。遊技状態によって、一部のスプライトしか用いないことが決まっている場合には、その中の「スプライトNo.」の最大値としてもよい。
以上で説明した実施例によれば、800ドット×600ドットというLCD16用の表示データを上画像、下画像の2回に分けて生成することができる。この結果、VDP385の処理能力がLCD16の画素数に見合うほどに高くはない場合であっても、解像度を活かした高い画質で画像を表示することが可能となる。
E2.分割表示制御処理の変形例:
実施例では、図8で説明した通り、上画像、下画像の表示データを生成する際に、表示エリアVAに対する位置を相対的に移動させながら、画面全体の描画コマンドをVDP385に出力する例を示した。分割モードにおけるVDP385への描画コマンドの出力は、この態様に依らず、種々の態様を採ることができる。例えば、描画コマンドの座標値は固定としたまま表示エリアの位置を移動させてもよい。また、上画像用、下画像用に個別に描画コマンドを用意してもよい。以下では、これらの2つの態様について、それぞれ第1変形例、第2変形例として説明する。
図12は第1変形例としての表示制御処理のフローチャートである。図10に代わる処理であり、上画像、下画像の生成時に、描画コマンドの座標値は固定としたまま表示エリアの位置を移動させる態様に相当する。この処理では、図10と同様、CPU381は、上下フラグの値に応じて、以下に示す通り、上画像、下画像を対象とするそれぞれの処理を実行する。
上下フラグが値0の場合(ステップS202)、即ち上画像の処理を行う場合には、CPU381はVDPの初期化を行った後(ステップS204)、表示エリアVAの位置を設定する(ステップS204A)。表示エリアVAは、描画コマンドで描かれる全体画像のうち上画像を切り出すことができる位置に設定される(図8のキャンバスCV2参照)。そして、CPU381は、スプライトレジスタを初期化し(ステップS220)、コマンド解析処理を実行し(ステップS222)、画像全体の描画コマンドをVDP385に出力する(ステップS224)。そして、スプライトを最適化し(ステップS226)、次の処理対象が下画像となることを示すため、フィールド信号をOFFにするとともに(ステップS228)、上下フラグの値を1だけ増加させて(ステップS250)、表示制御処理を終了する。
上下フラグが値1の場合(ステップS202)、即ち下画像の処理を行う場合には、CPU381はVDPレジスタに条件設定コマンドの設定を行う(ステップS230)。この設定を受けて、VDP385は上画像の描画コマンドおよび表示エリアVAの設定に基づき、上画像の表示データを生成、出力する。その後、CPU381は、表示エリアVAを下方に300ドット移動させる(ステップS234A)。図中に移動の様子を示した。左側に示すように、上画像を切り出し可能な状態で配置されていた表示エリアVAは、この処理によって、右側に示すように下画像を切り出し可能な状態に移動される。実施例(図10)と異なり描画コマンドの座標の修正は行わないため、画像の位置は固定されたままである。CPU381は、スプライトの最適化を行い(ステップS236)、フィールド信号をONした後(ステップS238)、上下フラグを値1だけ増加させて(ステップS250)、表示制御処理を終了する。VDP385は、これに応じて、下画像の表示データを生成する。
第1変形例によれば、描画コマンドの座標値を修正する必要がなく、上画像、下画像それぞれの生成に要する処理負荷を軽減することができる利点がある。
図13は第2変形例としての表示制御処理のフローチャートである。図10に代わる処理であり、上画像用、下画像用に個別に描画コマンドを用意する態様に相当する。この処理では、図10と同様、CPU381は、上下フラグの値に応じて、以下に示す通り、上画像、下画像を対象とするそれぞれの処理を実行する。
上下フラグが値0の場合(ステップS202)、即ち上画像の処理を行う場合には、CPU381はVDP初期化(ステップS204)、スプライトレジスタの初期化を行った後(ステップS220)、コマンド解析処理を実行してLCD16に表示すべき画像の画面データを特定した後(ステップS222)、上半分の描画コマンドを出力する(ステップS224A)。変形例では、コマンド解析処理によって特定される画面データには、上画像用の画面データ、下画像用の画面データが個別に用意されているものとした。例えば、上画像用には図中に示すハッチング部分に対応する描画コマンドが含まれている。図の例では、この画面にはスプライトSP1、SP2が含まれるが、上画像で必要とされるのは、スプライトSP1のみである。従って、画面データはスプライトSP2を省略した状態のデータとすることができる。CPU381は、実施例と同様、スプライトの最適化(ステップS226)、フィールド信号OFF(ステップS228)、上下フラグのインクリメント(ステップS250)の各処理を実行して、表示制御処理を終了する。第2変形例では、上画像用に最適化された画面データを用意することができるため、スプライトの最適化(ステップS226)は省略することも可能である。
上下フラグが値1の場合(ステップS202)、即ち下画像の処理を行う場合には、CPU381はVDPレジスタに条件設定コマンドを設定し(ステップS232)、スプライトレジスタを初期化して(ステップS233)、下半分の描画コマンドを出力する(ステップS234A)。下画像用の画面データには図中に示すハッチング部分に対応する描画コマンド、即ちスプライトSP1、SP2の双方に対する描画コマンドが含まれることになる。描画コマンドのy座標値は、表示エリアVAによって下画像を切り出すことができるように設定された値となっている。従って、CPU381は座標値の修正や表示エリアVAの位置修正などを施すまでなく、単に用意された描画コマンドをVDP385に出力すれば足りる。CPU381は、次に、実施例と同様、スプライトの最適化(ステップS236)、フィールド信号ON(ステップS238)、上下フラグのインクリメント(ステップS250)の各処理を実行して、表示制御処理を終了する。スプライトの最適化(ステップS236)は省略することも可能である。
第2変形例によれば、上画像、下画像のそれぞれについて描画コマンドを出力する際に、座標修正や表示エリアの移動などの処理が不要となるため、処理負荷を軽減することができる利点がある。
上述の実施例および変形例では、分割モードにおいてLCD16の画面を上下2つに分割して表示データを生成する場合を例示した。画面の分割は、かかる態様に依らず、種々の態様を採ることができる。例えば、上下方向に3以上の領域に分割してもよい。また、上画像、下画像を更に左右方向に分割してもよい。
F.分割移行処理:
図14は分割移行処理におけるVDP385への画面データ出力の様子を示すタイミングチャートである。分割移行処理とは、非分割モードから分割モードへの切り換えを行う処理である。最上段には、定常処理としてサブ制御基板35が実行するスケジューラ更新のタイミングを示した。スケジューラ更新とは、サブ制御基板35が遊技状態に応じてLCD16にシーケンシャルに表示すべき画面を順次、更新していく処理であり、サブ制御基板35から装飾図柄制御基板30に表示コマンドを出力する処理に対応する。本実施例では、非分割モード、分割モードともに、32msecでスケジューラ更新が行われる。
非分割モードで描画コマンドの出力が行われているものとして説明を行う。図中の例は、VDP385のスプライトレジスタにVGA2出力がなされた状態を示している。この時点では、VDP385からは、従前の描画コマンドに対応するVGA1の表示データが出力されている。このVGA1出力は、VDP385から出力される同期信号VSYNCをトリガとして、フレームメモリ397のフィールド397[4](以下、「VGA用エリア0」と呼ぶこともある)に書き込まれる。
次に、サブ制御基板35がスケジュール更新を行い、分割モードへの移行が指示されたとする。この移行指示は、例えば、サブ制御基板35が「移行コマンド」を出力する態様をとってもよいし、サブ制御基板35が指定する装飾図柄が、高速画像から高画質画像に切り替わった時点でCPU381が自律的に移行指示がなされたものと判断するという態様をとってもよい。これらの態様で移行指示がなされると、CPU381は、VDPレジスタに対して「上下設定」、即ち分割モードで処理するための設定を行う。また、スプライトレジスタには、「上1」画像の描画データ書き込みを行う。ただし、この間、VDP385は従前に書き込まれたVGA2に対応する表示データを出力している。
CPU381は、上述の処理と並行して、スケーラ390に対して上下用、即ち分割モード用の書き込みアドレスを設定する。本実施例では、図3に示した通り、非分割モードと分割モードでは個別に用意されたフィールドが用いられる。書き込みアドレスの設定は、表示データの格納先を、非分割モードで使用されているフィールド397[4]、397[5]から、分割モードで使用されるフィールド397[0]〜397[3]に切り換える処理である。
書き込みアドレスの変更は、VDP385からのVGA2出力と並行して行われるため、この変更を直ちに反映させると、フレームメモリ397に表示データを格納すべきフィールドが、VDP385からのデータ出力中に変化することになり、表示データの格納が不安定となるおそれがある。また、VDP385から出力される表示データは、非分割モードの描画データに対応したVGA2出力であるから、データ容量的にも分割モード用のフィールドに適合しない。本実施例では、これらの不整合によって表示データの格納が不安定となる事態を回避するため、書き込みアドレスの変更時には、表示データをフレームメモリに書き込むことを禁止している。フレームメモリ397への表示データの格納は、VDP385からの同期信号VSYNCをトリガとして行われるから、書き込みアドレス変更時には、図中に破線Aで示すように、VSYNCの出力を停止するのである。本実施例では、CPU381がVENにハイを出力することにより、信号停止回路389の機能によってVDP385からのVSYNCの出力を停止する。この方法に代えて、CPU381がVDP385に制御信号を出力することで、ソフトウェア的に同期信号VSYNCの出力を停止させてもよい。同期信号VSYNCの出力が停止される結果、図中に示す通り、VDP385から表示データが出力されてはいるものの、この表示データは、書き込みメモリには格納されなくなる。
この時点では、書き込みアドレスの変更は行われているものの、フレームメモリ397からの読み出しアドレスの変更は行われていない。従って、スケーラ390は、従前の非分割モードで設定された読み出しアドレスに従い、フィールド397[5](「VGA用エリア1」と呼ぶこともある)から表示データを読み出し、LCD16に出力する。LCD16には、非分割モード時の画像が表示され続けることになる。
書き込みアドレスの変更が完了すると、次の16msecの処理では、CPU381はスプライトレジスタに「下1」の書き込みを行う。また、分割モードでの処理に従い、下1書き込みと並行してVDPレジスタの設定を行う。VDP385からは、既に設定済みの「上1」画像に対応した表示データが出力される。この時点では、書き込みアドレスの変更が完了しているため、この表示データは、フィールド397[0](「エリア0上」と呼ぶこともある)に格納される。この時点でも、読み出しアドレスは未変更であるから、スケーラ390は、VGA用エリア1から表示データを読み出しLCD16に出力する。
「下1」画像の書き込みが完了すると、以後は、分割モードに従って、安定的に描画コマンドの書き込み、および表示データの出力が行われるようになる。CPU381は、この時点で、フィールド397[0]〜397[3]からのデータ読み出しが行われるよう、スケーラ390の読み出しアドレスを分割モード用に変更する。書き込みアドレスは変更済みであるから、フィールド397[0](エリア0上)、397[1](エリア0下)には、「上1」「下1」画像の表示データが格納されている。読み出しアドレスの変更中は、非分割モードに従って、フィールド397[4](VGA用エリア0)からの表示データ読み出しが行われる。なお、VGA用エリア0には、VGA用エリア1よりも以前に生成された表示データが格納されているため、この時点では、一瞬とはいえ、厳密にはLCD16の表示は過去の表示内容に逆戻りしていることになる。従って、遊技者にちらつきなどの違和感を与えないようにするため、非分割モードから分割モードへの切り換え前には、黒画面などの同一画面を2フレーム以上継続する期間を設けておくことが好ましい。
読み出しアドレスの変更が完了した後は、フィールド397[3](エリア1上)、397[1](エリア1下)へのデータ書き込みが行われるとともに、フィールド397[0]、397[1]からの表示データの読み出しが行われるようになり、分割モードへの移行が完了する。以上で説明したように、分割モードへの移行は、16msecでの割込処理を一つのフェーズとして考えると、書き込みアドレスの変更(フェーズ1)、分割モードでの「上1」「下1」画像の描画コマンド出力およびフィールド397[0](エリア0上)への表示データの格納開始(フェーズ2)、読み出しアドレスの変更(フェーズ3)という3つのフェーズで行われる。
図15および図16は分割移行処理のフローチャートである。CPU381が実行する処理であり、図14のタイミングチャートで示した処理に相当する処理である。CPU381は、まず信号停止回路389を制御して、VDP385からのVSYNCの出力をディセーブルする(ステップS302)。次に、VDP385を上下表示出力に設定し、分割モードで処理すべきことを指示する(ステップS304)。そして、次に処理すべき画像が上画像であることを示すため、上下フラグに値0を初期値として設定し(ステップS306)、上表示用座標補正処理を実行する(ステップS308)。上表示用座標補正処理とは、分割モードにおける上半分表示処理(図11参照)と同じく、描画コマンドの座標値を補正する処理である。ここでは、非分割モードで指定されている描画データの座標値を補正することになるため、「上半分表示処理」との名称を避けたが、処理内容は同等である。
上表示用座標補正処理が完了すると、CPU381は、「上1」画像に対応する描画コマンドを出力し(ステップS310)、スプライトの最適化を行う(ステップS312)。この時点で、サブ制御基板35からのコマンドを解析して、分割モードでの表示内容に従った描画コマンドを出力してもよいが、本実施例では、非分割モードで指定済みの描画コマンドを流用するものとした。分割移行処理を行う時点では、暗転など改めてコマンド解析をする必要性に乏しい画像が使われることが多いからであり、コマンド解析を行ったとしても分割移行中は表示データの出力、格納が不安定なため、有効活用されない可能性があるからである。
CPU381は、VDP385からの表示データがフレームメモリ397の分割モード用のフィールド397[0]〜397[3]に格納されるよう、スケーラ390の書き込みアドレスを設定し(ステップS314)、信号停止回路389を制御して、VSYNCをイネーブルする(ステップS316)。この処理によって、VDP385から次に出力される同期信号VSYNCはスケーラ390に伝達されるようになり、表示データがフレームメモリ397に格納されるようになる。以上が、図14で説明したフェーズ1の処理に対応する。
次に、CPU381は、下画像の処理に移行すべく、フィールド信号をOFFとし(図16のステップS320)、上下フラグに値1を設定する(ステップS322)。そして、下表示用座標補正処理を行い(ステップS324)、描画コマンドを出力して(ステップS326)、スプライトの最適化を行う(ステップS328)。下表示用座標補正処理は、上表示用座標補正処理(ステップS308)と同様、描画コマンドの座標値を下画像用に300減じる処理である。以上が、図14で説明したフェーズ2の処理に対応する。本実施例では、この時点でも、サブ制御基板35からのコマンド解析は省略した。
次に、CPU381は、再び上画像の処理に移行すべき、フィールド信号をONとし(ステップS330)、上下フラグに0を設定する(ステップS332)。そして、上表示座標補正処理を行う(ステップS334)。この時点では、書き込みアドレスの変更も完了しており、分割モードでの表示データを安定的にフレームメモリ397に格納可能となっている。従って、CPU381は、スプライトレジスタを初期化して(ステップS336)、サブ制御基板35からのコマンドを解析し(ステップS338)、これに応じた描画コマンド出力(ステップS340)、スプライトの最適化を行う(ステップS342)。
その後、CPU381は、フレームメモリ397の分割モード用のフィールド397[0]〜397[3]から表示データが読み出されるよう、スケーラ390の読み出しアドレスを設定し(ステップS344)、分割移行処理を終了する。以上の処理が図14のフェーズ3に相当する。この処理が完了した後は、分割モードで表示データの格納、読み出しが可能な状態となる。
G.非分割移行処理:
図17は非分割移行処理におけるVDP385への画面データ出力の様子を示すタイミングチャートである。非分割移行処理とは、分割モードから非分割モードに表示モードを切り換える処理である。最上段には、サブ制御基板35でのスケジューラ更新のタイミングを示した。後述する通り、本実施例では、移行期間の途中で、スケジューラの更新を行わない期間が存在する。これは、移行期間において表示データの生成、格納が不安定となることによって、LCD16に表示される画面にちらつきが生じることを回避するために行われる処理であり、意図的に同一画面を継続的に表示させる処理である。
分割モードが実行されている途中にサブ制御基板35がスケジュール更新を行い、非分割モードへの移行が指示されたとする。この移行指示は、例えば、サブ制御基板35が「移行コマンド」を出力する態様をとってもよいし、サブ制御基板35が指定する装飾図柄が、高画質画像から高速画像に切り替わった時点でCPU381が、自律的に移行指示がなされたものと判断するという態様をとってもよい。これらの態様で移行指示がなされると、CPU381は、VGA1書き込みを行った後、VDPレジスタに対して「VGA設定」、即ち非分割モードで処理するための設定を行う。ただし、この間、VDP385は従前に分割モードで書き込まれた「下2」画像に対応する表示データを出力している。
次に、CPU381は非分割モードに従って表示データを格納するよう、フレームメモリ397の書き込みアドレスをVGA用、即ち非分割モード用に設定する。また、スプライトレジスタには、VGA2の書き込みを行う。VDP385は、従前に書き込まれたVGA1画像に対応する表示データを出力している。ただし、VDPレジスタに「VGA設定」を行った直後なので、VGA1の表示データの出力動作は不安定となっているおそれがある。本実施例では、このような不安定な状態で出力された表示データが表示に弊害を与えることを回避するため、この時点での表示データのフレームメモリ397への格納を禁止する。図中の破線Bに示すように、CPU381は信号停止回路389を制御して、VDP385からの同期信号VSYNCをディセーブルするのである。こうすることにより、VDP385から出力されるVGA1出力の表示データはフレームメモリ397に格納されずに破棄される。
書き込みアドレスの変更が完了した後は、VDP385から出力されるVGA2画像の表示データは、非分割モードに従って、フィールド397[4](VGA用エリア0)に格納されるようになる。この時点では、読み出しアドレスは変更されていないため、スケーラ390は分割モードに従って、フィールド397[2]、397[3]の表示データをLCD16に出力する。
サブ制御基板35は、VGA2書き込みがなされた後は、スケジューラの更新を省略する。この結果、スプライトレジスタへの新たな描画コマンドの書き込みも省略される。従って、VDP385からは書き込み済みの「VGA2」画像の描画コマンドに従って、VGA2出力が引き続き出力される。こうして出力されたVGA2の表示データは、非分割モードに従って、フィールド397[5](VGA用エリア1)に格納される。この結果、非分割モード用のフィールド397[4]、397[5]の双方に、VGA2画像の表示データが格納されることになる。
フィールド397[5](VGA用エリア1)へのVGA2の表示データの書き込みが行われている間、並行して、スプライトレジスタには新たにVGA3画像の書き込みが行われる。また、CPU381は、非分割モードで表示データの読み出しが行われるように、スケーラ390に対してVGA拡大出力設定を行う。つまり、フレームメモリ397の読み出しアドレスを、非分割モード用に変更し、読み出し時の拡大倍率を1.25倍に設定する。非分割モードで生成される表示データのサイズと、LD16の画素数との関係によっては、拡大倍率の設定は省略してもよい。読み出しアドレスの変更が完了すると、スケーラ390は、非分割モードに従って、フィールド397[4](VGA用エリア0)の表示データを読み出し、LCD16への出力を開始する。これにより、以後、非分割モードによる表示データの生成、出力が可能となる。
以上で説明した通り、非分割モードへの移行は、非分割モードでの画面更新周期である32msecを一つのフェーズとして考えると、書き込みアドレスの変更(フェーズ1)、非分割モードでの描画コマンド出力およびフィールド397[4](VGA用エリア0)への表示データの格納開始(フェーズ2)、読み出しアドレスの変更(フェーズ3)という3つのフェーズで行われる。
図18は非分割移行処理のフローチャートである。CPU381が実行する処理であり、図17のタイミングチャートで示した処理に相当する処理である。CPU381は、信号停止回路389を制御して、VSYNCをディセーブルにする(ステップS402)。そして、VDP385を非分割表示出力、即ち非分割モードに設定する(ステップS404)。その後、図17にVGA2書き込みとして示した通り、描画コマンドを出力し(ステップS406)、スプライトの最適化を行う(ステップS408)。また、この処理と並行して、非分割モードで表示データの格納が行われるように、スケーラの書き込みアドレスを設定し(ステップS410)、VSYNCをイネーブルする(ステップS412)。以上の処理が図17で説明したフェーズ1に対応する処理であり、この処理によって、以後の表示データは、非分割モード用のフィールド397[4]、397[5]に格納されるようになる。
次に、CPU381は表示データを格納するフィールドを切り換えるべくフィールド信号をOFFとする(ステップS420)。これは図17のフェーズ2に対応する処理である。本実施例では、先に説明した通り、非分割移行処理の移行期間において、サブ制御基板35がスケジューラの更新を省略するため、フェーズ2ではCPU381は、他の処理を行うことなく時間経過を待つことになる。この間、VDP385からは、図17に示した通り、従前に書き込まれた描画コマンドVGA2に従って、VGA2出力が行われている。もっとも、スケジューラの更新の省略は非分割移行処理に必須のものではなく、移行期間においてもスケジュールの更新を行っても良い。この場合、フェーズ2では、CPU381はサブ制御基板35からの表示コマンドに従って、スプライトレジスタへの書き込みを行えばよい。
次に、CPU381は表示データを格納するフィールドを切り換えるべくフィールド信号をONとする(ステップS430)。そして、描画コマンドの出力(ステップS432)、スプライト最適化(ステップS434)を行う。また、非分割モードで表示データの読み出しが行われるよう、スケーラ390の読み出しアドレスを設定して、非分割移行処理を終了する(ステップS436)。以上が図17で示したフェーズ3の処理に相当する。この処理が完了した後は、非分割モードで表示データの格納、読み出しが可能な状態となる。
以上で説明した実施例の遊技機では、LCD16への表示データを、非分割モード、分割モードの2通りで生成することができ、これらの表示モードを遊戯中に切り換えることができる。分割モードには、LCD16の解像度を活かし、高画質な画像を提供することができる。非分割モードは、画像の解像度が比較的低いため、描画に用いるスプライトデータのデータ量を抑制することができる利点がある。従って、遊技中に表示されるべき画面内容に応じて、双方の表示モードを使い分けることにより、それぞれ画面内容の特徴を活かした表示を実現することができ、遊技の興趣を高めることができる。
また、本実施例の遊技機では、書き込みアドレスの変更(フェーズ1)、移行後の表示モードでの表示データの格納開始(フェーズ2)、読み出しアドレスの変更(フェーズ3)という3フェーズで表示モードの切り換えを行うことにより、切り換え時に、LCD16への表示画面がちらつくなどの弊害を抑制することができる。こうした弊害をより確実に抑制するため、切り換え前後で暗転などの同一画面を数フレーム継続して表示させることが更に好ましい。移行期間において、VDP385からの同期信号VSYNCを停止し、フレームメモリ397に不安定な表示データの書き込みが行われるのを回避することも、ちらつき等の弊害防止に効果的である。
以上、本発明の種々の実施例について説明したが、本発明はこれらの実施例に限定されず、その趣旨を逸脱しない範囲で種々の構成を採ることができることはいうまでもない。実施例では、LCD16を表示装置として用いる場合を例示したが、本発明は他の種類の表示装置を用いる場合にも適用可能である。